Files
ttw_fmx_v10/frames/fOBS.pas
T

1036 lines
30 KiB
ObjectPascal

unit fOBS;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, uCustomEmoties,
System.Variants, uWebServerChat, uWebServerEvents, fColorSettings,
fFontSettings, uCreateGame,
System.Generics.Collections, uWebServerKandinsky, uWebServerGames,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.ScrollBox, FMX.Edit, FMX.Colors,
FMX.ListBox, FMX.EditBox, FMX.SpinBox, FMX.Controls.Presentation, uRecords,
System.Generics.Defaults, System.Character;
type
TChatWebServers = record
port: integer;
MaxMsg: integer;
TimeMsg: integer;
Freez: boolean;
StyleBorderColor: string;
StyleBlockColor: string;
StyleBlockBorderSize: integer;
StyleBlockPadding: integer;
FontStyleDefault: string;
FontColor: string;
BColor: string;
FontSize: integer;
WebServerChat: TTTW_Chat;
end;
type
TEventWebServers = record
port: integer;
typeEvent: integer;
se: TStyleEvent;
WebServerChat: TTTW_Events;
end;
type
TGameWebServers = record
port: integer;
game: string;
WebServerGame: TGameWebServer;
commands: tstringlist;
end;
type
TKandinskyWebServers = record
port: integer;
WebServerKandinsky: TKandinsky_Web;
end;
type
TfrOBS = class(TFrame)
sgWebChats: TStringGrid;
btnCreateOBSChat: TButton;
btnDeleteeChat: TButton;
Label1: TLabel;
IntegerColumn1: TIntegerColumn;
StringColumn1: TStringColumn;
StringColumn2: TStringColumn;
btnCreateOBSNotify: TButton;
btnCreateOBSKandinsky: TButton;
btnCreateOBSGame: TButton;
procedure btnDeleteeChatClick(Sender: TObject);
procedure btnCreateOBSKandinskyClick(Sender: TObject);
procedure btnCreateOBSChatClick(Sender: TObject);
procedure btnCreateOBSNotifyClick(Sender: TObject);
procedure sgWebChatsCellDblClick(const Column: TColumn; const Row: integer);
procedure btnCreateOBSGameClick(Sender: TObject);
private
{ Private declarations }
function checkBttv(aMsg: string): string;
function ReplaceEmotesInMessage(const MessageText,
EmotesString: string): string;
function FindEmoteByID(const ID: string): TEmotes;
function GetBadgesHTML(Badges: string): string;
public
{ Public declarations }
listChats: TArray<TOBSChat>;
listNotify: TArray<TOBSNotify>;
listKandinsky: TArray<TOBSKandinsky>;
listGames: TArray<TOBSGames>;
BTTV: TBTTV;
m7tv: t7tv;
ChatBadges: Tlist<TChatBadge>;
ChatEmotes: Tlist<TEmotes>;
ChatWebServers: Tlist<TChatWebServers>;
EventWebServers: Tlist<TEventWebServers>;
KandinskyWebServers: Tlist<TKandinskyWebServers>;
GameWebServers: Tlist<TGameWebServers>;
procedure MsgToWebServer(const aRecord: TTwitchChatMessage);
procedure toEventWebServer(aEvent: TFollowEvent); overload; // follow
procedure toEventWebServer(aEvent: TSubEvent); overload; // sub
procedure toEventWebServer(aEvent: TRaidEvent); overload; // raid
procedure toEventWebServer(aEvent: TGiftEvent); overload; // gift
procedure toEventWebServer(aNick, aSum, aText: string); overload; // donate
procedure CreateWebEvents(eventsSettings: TOBSNotify);
procedure CreateWebChat(chatSettings: TOBSChat);
procedure UpdateGridFromArray;
procedure AddChat(newRecord: TOBSChat);
procedure EdtChat(newRecord: TOBSChat; oldPort: integer);
procedure DelChat(aPort: integer);
procedure AddNotify(newRecord: TOBSNotify);
procedure EdtNotify(newRecord: TOBSNotify; oldPort: integer);
procedure DelNotify(aPort: integer);
procedure AddKandinsky(newRecord: TOBSKandinsky);
procedure DelKandinsky(aPort: integer);
procedure CreateWebKandinsky(aRecord: TOBSKandinsky);
procedure addGame(aGame: string; aPort: integer);
procedure delGame(aPort: integer);
procedure CreateWebGame(aGame: string; aPort: integer);
end;
implementation
{$R *.fmx}
uses uGeneral, uCreateChat, uCreateNotify;
{ TfrOBS }
function TfrOBS.checkBttv(aMsg: string): string;
var
Words: tstringlist;
i: integer;
CurrentWord, Url: string;
begin
Words := tstringlist.Create;
try
// Ðàçáèâàåì ñòðîêó íà ñëîâà ïî ïðîáåëàì
Words.Delimiter := ' ';
Words.StrictDelimiter := True; // Èãíîðèðîâàòü ïîâòîðÿþùèåñÿ ïðîáåëû
Words.DelimitedText := aMsg;
// Îáðàáîòêà ñëîâ
for i := 0 to Words.Count - 1 do
begin
CurrentWord := Words[i];
Url := BTTV.generateURL(CurrentWord);
if Url = '' then
Url := m7tv.generateURL(CurrentWord);
if Url <> '' then
Words[i] := Format('<img src="%s" width="18" height="18">', [Url]);
end;
// Ñîáèðàåì ðåçóëüòàò
result := Words.text;
finally
Words.Free;
end;
end;
function TfrOBS.GetBadgesHTML(Badges: string): string;
var
BadgeList: TArray<string>;
CodeParts: TArray<string>;
CurrentCode, SetId, VersionId: string;
Badge: TChatBadge;
Version: TBadgeVersion;
Found: boolean;
begin
// Ðàçáèâàåì ñòðîêó íà îòäåëüíûå áåéäæ-êîäû
BadgeList := Badges.Split([',']);
for CurrentCode in BadgeList do
begin
// Ðàçäåëÿåì SetId è VersionId
CodeParts := CurrentCode.Split(['/']);
if Length(CodeParts) <> 2 then
Continue;
SetId := CodeParts[0];
VersionId := CodeParts[1];
Found := false;
// Èùåì ñîîòâåòñòâóþùèé áåéäæ
for Badge in ChatBadges do
begin
if Badge.SetId = SetId then
begin
// Èùåì íóæíóþ âåðñèþ
for Version in Badge.Versions do
begin
if Version.ID = VersionId then
begin
// Ôîðìèðóåì HTML-òåã
result := result +
Format(' <img src="%s" width=18 height=18 alt="%s" title="%s">',
[Version.ImageUrl1x, Version.Title, Version.Description]);
Found := True;
Break;
end;
end;
if Found then
Break;
end;
end;
// Åñëè íå íàøëè - äîáàâëÿåì çàãëóøêó
if not Found then
result := result + ' <img src="placeholder.png" width=18 height=18>';
end;
end;
procedure TfrOBS.MsgToWebServer(const aRecord: TTwitchChatMessage);
var
s: string;
ms: TStyleChat;
i: integer;
begin
s := checkBttv(aRecord.Message);
if aRecord.Emotes <> '' then
s := ReplaceEmotesInMessage(s, aRecord.Emotes);
ms.Nick := GetBadgesHTML(aRecord.Badges) + '<span class="nick" style="color:'
+ aRecord.Color + '">' + aRecord.DisplayName + '</span>';
ms.Context := '<span class="text">' + s + '</span>';
for i := 0 to ChatWebServers.Count - 1 do
begin
ms.FontColor := ChatWebServers[i].FontColor;
ms.FontSize := ChatWebServers[i].FontSize;
ms.FontFamily := '''' + ChatWebServers[i].FontStyleDefault + ''';';
ms.FontFamily := StringReplace(ms.FontFamily, '.ttf', '', [rfReplaceAll]);
ms.BlockColor := ChatWebServers[i].StyleBlockColor;
ms.BlockPadding := ChatWebServers[i].StyleBlockPadding;
ms.MaxMsgCount := ChatWebServers[i].MaxMsg;
ms.TimeMsg := ChatWebServers[i].TimeMsg;
ms.BorderSize := ChatWebServers[i].StyleBlockBorderSize;
ms.BorderColor := ChatWebServers[i].StyleBorderColor;
ms.BColor := ChatWebServers[i].BColor;
ChatWebServers[i].WebServerChat.AddMessage(ms);
end;
end;
function TfrOBS.ReplaceEmotesInMessage(const MessageText,
EmotesString: string): string;
var
ProcessedEmotes: TDictionary<string, string>;
Parts: tstringlist;
i, ColonPos: integer;
EmoteID: string;
Emote: TEmotes;
ResultText: string;
begin
result := MessageText;
if EmotesString.Trim = '' then
Exit;
// Èñïîëüçóåì ñëîâàðü äëÿ îòñëåæèâàíèÿ óæå îáðàáîòàííûõ ýìîäçè
ProcessedEmotes := TDictionary<string, string>.Create;
Parts := tstringlist.Create;
try
// Ðàçäåëÿåì îáùóþ ñòðîêó ñìàéëîâ ïî '/'
Parts.StrictDelimiter := True;
Parts.Delimiter := '/';
Parts.DelimitedText := EmotesString;
ResultText := MessageText;
// Îáðàáàòûâàåì êàæäóþ ÷àñòü
for i := 0 to Parts.Count - 1 do
begin
ColonPos := Pos(':', Parts[i]);
if ColonPos = 0 then
Continue;
// Èçâëåêàåì ID ñìàéëà
EmoteID := Copy(Parts[i], 1, ColonPos - 1);
// Ïðîïóñêàåì åñëè óæå îáðàáàòûâàëè ýòîò ýìîäçè
if ProcessedEmotes.ContainsKey(EmoteID) then
Continue;
// Ïîëó÷àåì äàííûå ñìàéëà
Emote := FindEmoteByID(EmoteID);
if Emote.ID = '' then
Continue;
var
imgUrl: string;
if Emote.topImage <> '' then
imgUrl := Emote.topImage
else if Emote.images.Url4x <> '' then
imgUrl := Emote.images.Url4x
else
Continue; // Ïðîïóñêàåì åñëè íåò URL
// Çàìåíÿåì âñå âõîæäåíèÿ èìåíè ýìîäçè
ResultText := StringReplace(ResultText, Emote.name,
Format('<img src="%s" width="18" height="18">', [imgUrl]),
[rfReplaceAll]);
// Ïîìå÷àåì ýìîäçè êàê îáðàáîòàííûé
ProcessedEmotes.Add(EmoteID, '');
end;
result := ResultText;
finally
ProcessedEmotes.Free;
Parts.Free;
end;
end;
procedure TfrOBS.AddChat(newRecord: TOBSChat);
begin
SetLength(listChats, Length(listChats) + 1);
listChats[High(listChats)] := newRecord;
UpdateGridFromArray;
db.SaveRecordArray<TOBSChat>('listChats', listChats);
CreateWebChat(newRecord);
end;
procedure TfrOBS.addGame(aGame: string; aPort: integer);
begin
SetLength(listGames, Length(listGames) + 1);
listGames[High(listGames)].port := aPort;
listGames[High(listGames)].game := aGame;
UpdateGridFromArray;
db.SaveRecordArray<TOBSGames>('listGames', listGames);
CreateWebGame(aGame, aPort);
end;
procedure TfrOBS.AddKandinsky(newRecord: TOBSKandinsky);
begin
SetLength(listKandinsky, Length(listKandinsky) + 1);
listKandinsky[High(listKandinsky)] := newRecord;
UpdateGridFromArray;
db.SaveRecordArray<TOBSKandinsky>('listKandinsky', listKandinsky);
CreateWebKandinsky(newRecord);
end;
procedure TfrOBS.AddNotify(newRecord: TOBSNotify);
begin
SetLength(listNotify, Length(listNotify) + 1);
listNotify[High(listNotify)] := newRecord;
UpdateGridFromArray;
db.SaveRecordArray<TOBSNotify>('listNotify', listNotify);
CreateWebEvents(newRecord);
end;
procedure TfrOBS.btnCreateOBSChatClick(Sender: TObject);
var
dport, i: integer;
begin
dport := 8080;
for i := 0 to sgWebChats.RowCount - 1 do
begin
if strtoint(sgWebChats.Cells[0, i]) >= dport then
dport := strtoint(sgWebChats.Cells[0, i]) + 1;
end;
fCreateChat.sbWebServerPort.Value := dport;
fCreateChat.isEdit := false;
fCreateChat.Show;
end;
procedure TfrOBS.btnCreateOBSGameClick(Sender: TObject);
var
dport, i: integer;
begin
dport := 8080;
for i := 0 to sgWebChats.RowCount - 1 do
begin
if strtoint(sgWebChats.Cells[0, i]) >= dport then
dport := strtoint(sgWebChats.Cells[0, i]) + 1;
end;
fCreateGame.sbWebServerPort.Value := dport;
fCreateGame.Show;
end;
procedure TfrOBS.btnCreateOBSKandinskyClick(Sender: TObject);
var
dport: integer;
i: integer;
rk: TOBSKandinsky;
begin
dport := 8080;
for i := 0 to sgWebChats.RowCount - 1 do
begin
if strtoint(sgWebChats.Cells[0, i]) >= dport then
dport := strtoint(sgWebChats.Cells[0, i]) + 1;
end;
rk.port := dport;
AddKandinsky(rk);
end;
procedure TfrOBS.btnCreateOBSNotifyClick(Sender: TObject);
var
dport, i: integer;
begin
dport := 8080;
for i := 0 to sgWebChats.RowCount - 1 do
begin
if strtoint(sgWebChats.Cells[0, i]) >= dport then
dport := strtoint(sgWebChats.Cells[0, i]) + 1;
end;
fCreateNotify.sbWebServerPort.Value := dport;
fCreateNotify.isEdit := false;
fCreateNotify.Show;
end;
procedure TfrOBS.btnDeleteeChatClick(Sender: TObject);
begin
if sgWebChats.Cells[1, sgWebChats.Row] = '×àò' then
begin
DelChat(strtoint(sgWebChats.Cells[0, sgWebChats.Row]));
end;
if sgWebChats.Cells[1, sgWebChats.Row] = 'Kandinsky' then
begin
DelKandinsky(strtoint(sgWebChats.Cells[0, sgWebChats.Row]));
end;
if sgWebChats.Cells[1, sgWebChats.Row] = 'Îïîâåùåíèå' then
begin
DelNotify(strtoint(sgWebChats.Cells[0, sgWebChats.Row]));
end;
if sgWebChats.Cells[1, sgWebChats.Row] = 'Èãðà' then
begin
delGame(strtoint(sgWebChats.Cells[0, sgWebChats.Row]));
end;
end;
procedure TfrOBS.CreateWebChat(chatSettings: TOBSChat);
var
ChatWebServer: TChatWebServers;
fonts: tstringlist;
f: TfrColorSettings;
t: TfrFontSettings;
procedure LoadFontList(const mySL: tstringlist);
var
SearchRec: TSearchRec;
begin
if not DirectoryExists(myConst.fontsPath) then
CreateDir(myConst.fontsPath);
if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*',
faArchive, SearchRec) = 0 then
try
repeat
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
begin
mySL.Add(SearchRec.name);
end;
until FindNext(SearchRec) <> 0;
finally
System.SysUtils.FindClose(SearchRec);
end;
end;
begin
fonts := tstringlist.Create;
f := TfrColorSettings.Create(self);
t := TfrFontSettings.Create(self);
try
LoadFontList(fonts);
ChatWebServer.WebServerChat := TTTW_Chat.Create(fonts, chatSettings.port,
f.ccbBColor.Items[chatSettings.ColorBackground]);
ChatWebServer.port := chatSettings.port;
ChatWebServer.MaxMsg := chatSettings.MaxCountMess;
ChatWebServer.TimeMsg := chatSettings.TimeMess;
ChatWebServer.Freez := chatSettings.Freez = 1;
ChatWebServer.StyleBorderColor := f.ccbStyleBorderColor.Items
[chatSettings.ColorBorder];
ChatWebServer.StyleBlockColor := chatSettings.ColorBlock;
ChatWebServer.StyleBlockBorderSize := chatSettings.SolidBorder;
ChatWebServer.StyleBlockPadding := chatSettings.Paddings;
ChatWebServer.FontStyleDefault := t.cbFontStyleDefault.Items
[chatSettings.StyleFont];
ChatWebServer.FontColor := t.ccbFontColor.Items[chatSettings.ColorFont];
ChatWebServer.BColor := f.ccbBColor.Items[chatSettings.ColorBorder];;
ChatWebServer.FontSize := chatSettings.SizeFont;
ChatWebServers.Add(ChatWebServer);
ChatWebServers[ChatWebServers.Count - 1].WebServerChat.ActiveServer(True);
ChatWebServers[ChatWebServers.Count - 1].WebServerChat.SetDeleteMode
(not ChatWebServer.Freez, ChatWebServer.MaxMsg);
finally
fonts.Free;
f.Free;
t.Free;
end;
end;
procedure TfrOBS.CreateWebEvents(eventsSettings: TOBSNotify);
var
EventWebServer: TEventWebServers;
fonts: tstringlist;
f: TfrColorSettings;
t: TfrFontSettings;
procedure LoadFontList(const mySL: tstringlist);
var
SearchRec: TSearchRec;
begin
if not DirectoryExists(myConst.fontsPath) then
CreateDir(myConst.fontsPath);
if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*',
faArchive, SearchRec) = 0 then
try
repeat
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
begin
mySL.Add(SearchRec.name);
end;
until FindNext(SearchRec) <> 0;
finally
System.SysUtils.FindClose(SearchRec);
end;
end;
function GetColorFromColorPanel(aColor: TAlphaColor): string;
var
Color: TAlphaColor;
r, G, B: Byte;
A: Real;
FS: TFormatSettings;
begin
Color := aColor;
r := TAlphaColorRec(Color).r;
G := TAlphaColorRec(Color).G;
B := TAlphaColorRec(Color).B;
A := TAlphaColorRec(Color).A / 255;
// Ïðåîáðàçóåì àëüôà-êàíàë â äèàïàçîí 0..1
// Óñòàíàâëèâàåì òî÷êó â êà÷åñòâå äåñÿòè÷íîãî ðàçäåëèòåëÿ
FS := TFormatSettings.Create;
FS.DecimalSeparator := '.';
result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS);
end;
function GetColorFromCCB(aColor: TAlphaColor): string;
var
Color: TAlphaColor;
r, G, B: Byte;
begin
Color := aColor;
r := TAlphaColorRec(Color).r;
G := TAlphaColorRec(Color).G;
B := TAlphaColorRec(Color).B;
result := Format('#%.2X%.2X%.2X', [r, G, B]);
end;
begin
fonts := tstringlist.Create;
f := TfrColorSettings.Create(self);
t := TfrFontSettings.Create(self);
try
LoadFontList(fonts);
EventWebServer.WebServerChat := TTTW_Events.Create(fonts,
eventsSettings.port);
EventWebServer.port := eventsSettings.port;
EventWebServer.typeEvent := eventsSettings.typeEvent;
EventWebServer.se.Title := eventsSettings.HeaderText;
EventWebServer.se.Context := eventsSettings.MessText;
EventWebServer.se.Url := eventsSettings.Picture;
EventWebServer.se.SoundURL := eventsSettings.Sound;
EventWebServer.se.Timestamp := now;
EventWebServer.se.TimeMsg := eventsSettings.TimeMess;
EventWebServer.se.FontTitle.Font := eventsSettings.HeaderStyleFont;
EventWebServer.se.FontTitle.Size := eventsSettings.HeaderSizeFont;
EventWebServer.se.FontTitle.Color := eventsSettings.HeaderColorFont;
EventWebServer.se.FontContext.Font := eventsSettings.MessStyleFont;
EventWebServer.se.FontContext.Size := eventsSettings.MessSizeFont;
EventWebServer.se.FontContext.Color := eventsSettings.MessColorFont;
EventWebServer.se.BorderColor := eventsSettings.ColorBorder;
EventWebServer.se.BorderSize := eventsSettings.SolidBorder;
EventWebServer.se.BlockColor := eventsSettings.ColorBlock;
EventWebServers.Add(EventWebServer);
EventWebServers[EventWebServers.Count - 1].WebServerChat.ActiveServer(True);
finally
fonts.Free;
f.Free;
t.Free;
end;
end;
procedure TfrOBS.CreateWebGame(aGame: string; aPort: integer);
var
GameWebServer: TGameWebServers;
commands: TArray<string>;
Cmd: string;
begin
GameWebServer.port := aPort;
GameWebServer.WebServerGame := TGameWebServer.Create
(myConst.GeneralPath, aPort);
GameWebServers.Add(GameWebServer);
GameWebServers[GameWebServers.Count - 1].WebServerGame.Start;
GameWebServers[GameWebServers.Count - 1].WebServerGame.SetGame(aGame);
commands := GameWebServers[GameWebServers.Count - 1]
.WebServerGame.GetControlCommands;
for Cmd in commands do
GameWebServers[GameWebServers.Count - 1].commands.Add(Cmd);
end;
procedure TfrOBS.CreateWebKandinsky(aRecord: TOBSKandinsky);
var
KandinskyWebServer: TKandinskyWebServers;
begin
KandinskyWebServer.port := aRecord.port;
KandinskyWebServer.WebServerKandinsky :=
TKandinsky_Web.Create(TTW_Bot.frAI1.edtKandiKey.text,
TTW_Bot.frAI1.edtKandiSecret.text, aRecord.port);
KandinskyWebServers.Add(KandinskyWebServer);
KandinskyWebServers[KandinskyWebServers.Count - 1]
.WebServerKandinsky.ActiveServer(True);
end;
procedure TfrOBS.DelChat(aPort: integer);
var
i, j: integer;
begin
// Èùåì â îáðàòíîì ïîðÿäêå äëÿ áåçîïàñíîãî óäàëåíèÿ
for i := High(listChats) downto 0 do
begin
if listChats[i].port = aPort then
begin
// Ñäâèãàåì ýëåìåíòû ìàññèâà
for j := i to High(listChats) - 1 do
listChats[j] := listChats[j + 1];
// Óìåíüøàåì ðàçìåð ìàññèâà
SetLength(listChats, Length(listChats) - 1);
// Âûõîäèì ïîñëå ïåðâîãî íàéäåííîãî ñîâïàäåíèÿ (ïðåäïîëàãàåì óíèêàëüíîñòü ïîðòîâ)
Break;
end;
end;
ChatWebServers[i].WebServerChat.ActiveServer(false);
ChatWebServers[i].WebServerChat.Destroy;
ChatWebServers.Delete(i);
db.SaveRecordArray<TOBSChat>('listChats', listChats);
UpdateGridFromArray;
end;
procedure TfrOBS.delGame(aPort: integer);
var
i, j: integer;
begin
// Èùåì â îáðàòíîì ïîðÿäêå äëÿ áåçîïàñíîãî óäàëåíèÿ
for i := High(listGames) downto 0 do
begin
if listGames[i].port = aPort then
begin
// Ñäâèãàåì ýëåìåíòû ìàññèâà
for j := i to High(listGames) - 1 do
listGames[j] := listGames[j + 1];
// Óìåíüøàåì ðàçìåð ìàññèâà
SetLength(listGames, Length(listGames) - 1);
// Âûõîäèì ïîñëå ïåðâîãî íàéäåííîãî ñîâïàäåíèÿ (ïðåäïîëàãàåì óíèêàëüíîñòü ïîðòîâ)
Break;
end;
end;
GameWebServers[i].WebServerGame.Stop;
GameWebServers[i].WebServerGame.Destroy;
GameWebServers.Delete(i);
UpdateGridFromArray;
db.SaveRecordArray<TOBSGames>('listGames', listGames);
end;
procedure TfrOBS.DelKandinsky(aPort: integer);
var
i, j: integer;
begin
// Èùåì â îáðàòíîì ïîðÿäêå äëÿ áåçîïàñíîãî óäàëåíèÿ
for i := High(listKandinsky) downto 0 do
begin
if listKandinsky[i].port = aPort then
begin
// Ñäâèãàåì ýëåìåíòû ìàññèâà
for j := i to High(listKandinsky) - 1 do
listKandinsky[j] := listKandinsky[j + 1];
// Óìåíüøàåì ðàçìåð ìàññèâà
SetLength(listKandinsky, Length(listKandinsky) - 1);
// Âûõîäèì ïîñëå ïåðâîãî íàéäåííîãî ñîâïàäåíèÿ (ïðåäïîëàãàåì óíèêàëüíîñòü ïîðòîâ)
Break;
end;
end;
KandinskyWebServers[i].WebServerKandinsky.ActiveServer(false);
KandinskyWebServers[i].WebServerKandinsky.Destroy;
KandinskyWebServers.Delete(i);
UpdateGridFromArray;
db.SaveRecordArray<TOBSKandinsky>('listKandinsky', listKandinsky);
end;
procedure TfrOBS.DelNotify(aPort: integer);
var
i, j: integer;
begin
// Èùåì â îáðàòíîì ïîðÿäêå äëÿ áåçîïàñíîãî óäàëåíèÿ
for i := High(listNotify) downto 0 do
begin
if listNotify[i].port = aPort then
begin
// Ñäâèãàåì ýëåìåíòû ìàññèâà
for j := i to High(listNotify) - 1 do
listNotify[j] := listNotify[j + 1];
// Óìåíüøàåì ðàçìåð ìàññèâà
SetLength(listNotify, Length(listNotify) - 1);
// Âûõîäèì ïîñëå ïåðâîãî íàéäåííîãî ñîâïàäåíèÿ (ïðåäïîëàãàåì óíèêàëüíîñòü ïîðòîâ)
Break;
end;
end;
EventWebServers[i].WebServerChat.ActiveServer(false);
EventWebServers[i].WebServerChat.Destroy;
EventWebServers.Delete(i);
UpdateGridFromArray;
db.SaveRecordArray<TOBSNotify>('listNotify', listNotify);
end;
procedure TfrOBS.EdtChat(newRecord: TOBSChat; oldPort: integer);
var
i, j: integer;
chatWeb: TChatWebServers; // Âðåìåííàÿ ïåðåìåííàÿ äëÿ çàïèñè
f: TfrColorSettings;
t: TfrFontSettings;
begin
f := TfrColorSettings.Create(self);
t := TfrFontSettings.Create(self);
try
// Îáíîâëÿåì çàïèñü â listChats
for i := 0 to High(listChats) do
if listChats[i].port = oldPort then
begin
listChats[i] := newRecord;
Break;
end;
// Îáíîâëÿåì ñîîòâåòñòâóþùèé ñåðâåð â ChatWebServers
for j := 0 to ChatWebServers.Count - 1 do
begin
// 1. Èçâëåêàåì çàïèñü âî âðåìåííóþ ïåðåìåííóþ
chatWeb := ChatWebServers[j];
if chatWeb.port = oldPort then
begin
// 2. Ìîäèôèöèðóåì ïîëÿ çàïèñè
chatWeb.MaxMsg := newRecord.MaxCountMess;
chatWeb.TimeMsg := newRecord.TimeMess;
chatWeb.Freez := newRecord.Freez = 1;
chatWeb.StyleBorderColor := f.ccbStyleBorderColor.Items
[newRecord.ColorBorder];
chatWeb.StyleBlockColor := newRecord.ColorBlock;
chatWeb.StyleBlockBorderSize := newRecord.SolidBorder;
chatWeb.StyleBlockPadding := newRecord.Paddings;
chatWeb.FontStyleDefault := t.cbFontStyleDefault.Items
[newRecord.StyleFont];
chatWeb.FontColor := t.ccbFontColor.Items[newRecord.ColorFont];
chatWeb.FontSize := newRecord.SizeFont;
chatWeb.BColor := f.ccbBColor.Items[newRecord.ColorBackground];
chatWeb.WebServerChat.changeBackground
(f.ccbBColor.Items[newRecord.ColorBackground]);
chatWeb.WebServerChat.SetDeleteMode(not chatWeb.Freez, chatWeb.MaxMsg);
// 4. Âîçâðàùàåì ìîäèôèöèðîâàííóþ çàïèñü â ñïèñîê
ChatWebServers[j] := chatWeb;
Break;
end;
end;
UpdateGridFromArray;
db.SaveRecordArray<TOBSChat>('listChats', listChats);
finally
f.Free;
t.Free;
end;
end;
procedure TfrOBS.EdtNotify(newRecord: TOBSNotify; oldPort: integer);
var
i, mi: integer;
ws: TEventWebServers;
begin
for i := 0 to EventWebServers.Count - 1 do
if EventWebServers[i].port = oldPort then
begin
ws := EventWebServers[i];
mi := i;
end;
for i := 0 to High(listNotify) do
if listNotify[i].port = oldPort then
begin
listNotify[i] := newRecord;
ws.port := listNotify[i].port;
ws.typeEvent := listNotify[i].typeEvent;
ws.se.Title := listNotify[i].HeaderText;
ws.se.Context := listNotify[i].MessText;
ws.se.Url := listNotify[i].Picture;
ws.se.SoundURL := listNotify[i].Sound;
ws.se.TimeMsg := listNotify[i].TimeMess;
ws.se.FontTitle.Font := listNotify[i].HeaderStyleFont;
ws.se.FontTitle.Font := listNotify[i].HeaderStyleFont;
ws.se.FontTitle.Size := listNotify[i].HeaderSizeFont;
ws.se.FontTitle.Color := listNotify[i].HeaderColorFont;
ws.se.FontContext.Font := listNotify[i].MessStyleFont;
ws.se.FontContext.Size := listNotify[i].MessSizeFont;
ws.se.FontContext.Color := listNotify[i].MessColorFont;
ws.se.BorderColor := listNotify[i].ColorBorder;
ws.se.BorderSize := listNotify[i].SolidBorder;
ws.se.BlockColor := listNotify[i].ColorBlock;
EventWebServers[mi] := ws;
UpdateGridFromArray;
db.SaveRecordArray<TOBSNotify>('listNotify', listNotify);
Break;
end;
end;
function TfrOBS.FindEmoteByID(const ID: string): TEmotes;
var
i: integer;
begin
result.ID := '';
if not Assigned(ChatEmotes) then
Exit;
for i := 0 to ChatEmotes.Count - 1 do
if ChatEmotes[i].ID = ID then
begin
result := ChatEmotes[i];
Break;
end;
end;
procedure TfrOBS.sgWebChatsCellDblClick(const Column: TColumn;
const Row: integer);
var
myChatRec: TOBSChat;
myNotifyRec: TOBSNotify;
i: integer;
begin
if sgWebChats.Cells[1, Row] = 'Îïîâåùåíèå' then
begin
for i := 0 to High(listNotify) do
if listNotify[i].port = (strtoint(sgWebChats.Cells[0, Row])) then
begin
myNotifyRec := listNotify[i];
Break;
end;
fCreateNotify.isEdit := True;
fCreateNotify.setRecord(myNotifyRec);
fCreateNotify.Show;
end;
if sgWebChats.Cells[1, Row] = '×àò' then
begin
for i := 0 to High(listChats) do
if listChats[i].port = (strtoint(sgWebChats.Cells[0, Row])) then
begin
myChatRec := listChats[i];
Break;
end;
fCreateChat.isEdit := True;
fCreateChat.setRecord(myChatRec);
fCreateChat.Show;
end;
end;
{
0 Îòñëåæèâàíèå
1 Ïîäïèñêà
2 Ïîäàðî÷íàÿ ïîäïèñêà
3 Ðåéä
4 Äîíàò
5 Ñâîå
}
procedure TfrOBS.toEventWebServer(aEvent: TFollowEvent);
var
i: integer;
ws: TEventWebServers;
begin
TTW_Bot.toLog('fOBS', 'toEventWebServer', 'Ïîëó÷åíî ñîáûòèå Follow', 0);
for i := 0 to EventWebServers.Count - 1 do
begin
if EventWebServers[i].typeEvent = 0 then
begin
ws := EventWebServers[i];
ws.se.Title := StringReplace(ws.se.Title, '[NICK]',
aEvent.event.user_name, [rfReplaceAll]);
ws.se.Timestamp := now;
ws.se.RequireInteraction := True;
TTW_Bot.toLog('fOBS', 'toEventWebServer.BlockColor', ws.se.BlockColor, 3);
EventWebServers[i].WebServerChat.AddMessage(ws.se);
end;
end;
TTW_Bot.frEvents1.OnTTVEvent(aEvent.event.user_name);
end;
procedure TfrOBS.toEventWebServer(aEvent: TSubEvent);
var
i: integer;
ws: TEventWebServers;
begin
for i := 0 to EventWebServers.Count - 1 do
begin
if EventWebServers[i].typeEvent <> 1 then
Continue;
ws := EventWebServers[i];
ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aEvent.event.user_name,
[rfReplaceAll]);
EventWebServers[i] := ws;
EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
end;
TTW_Bot.frEvents1.OnTTVEvent(aEvent.event.user_name);
end;
procedure TfrOBS.toEventWebServer(aEvent: TRaidEvent);
var
i: integer;
ws: TEventWebServers;
begin
for i := 0 to EventWebServers.Count - 1 do
begin
if EventWebServers[i].typeEvent <> 3 then
Continue;
ws := EventWebServers[i];
ws.se.Title := StringReplace(ws.se.Title, '[NICK]',
aEvent.event.from_broadcaster_user_name, [rfReplaceAll]);
ws.se.Context := StringReplace(ws.se.Context, '[SUM]',
inttostr(aEvent.event.viewers), [rfReplaceAll]);
EventWebServers[i] := ws;
EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
end;
TTW_Bot.frEvents1.OnTTVEvent(aEvent.event.from_broadcaster_user_name);
end;
procedure TfrOBS.toEventWebServer(aEvent: TGiftEvent);
var
i: integer;
ws: TEventWebServers;
begin
for i := 0 to EventWebServers.Count - 1 do
begin
if EventWebServers[i].typeEvent <> 2 then
Continue;
ws := EventWebServers[i];
ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aEvent.event.user_name,
[rfReplaceAll]);
EventWebServers[i] := ws;
EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
end;
TTW_Bot.frEvents1.OnTTVEvent(aEvent.event.user_name);
end;
procedure TfrOBS.toEventWebServer(aNick, aSum, aText: string);
var
i: integer;
ws: TEventWebServers;
begin
for i := 0 to EventWebServers.Count - 1 do
begin
if EventWebServers[i].typeEvent <> 4 then
Continue;
ws := EventWebServers[i];
ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aNick, [rfReplaceAll]);
ws.se.Context := StringReplace(ws.se.Context, '[SUM]', aSum,
[rfReplaceAll]);
EventWebServers[i] := ws;
EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
end;
end;
procedure TfrOBS.UpdateGridFromArray;
var
i, rowIndex: integer;
begin
sgWebChats.BeginUpdate;
try
sgWebChats.RowCount := 0; // Ñáðàñûâàåì ñòðîêè
rowIndex := 0; // Îòäåëüíûé ñ÷åò÷èê äëÿ ñòðîê ñåòêè
// listChats
for i := 0 to High(listChats) do
begin
sgWebChats.RowCount := rowIndex + 1;
sgWebChats.Cells[0, rowIndex] := inttostr(listChats[i].port);
sgWebChats.Cells[1, rowIndex] := '×àò';
sgWebChats.Cells[2, rowIndex] := 'http://127.0.0.1:' +
inttostr(listChats[i].port);
Inc(rowIndex); // Óâåëè÷èâàåì ñ÷åò÷èê ñòðîê
end;
// listNotify
for i := 0 to High(listNotify) do
begin
sgWebChats.RowCount := rowIndex + 1;
sgWebChats.Cells[0, rowIndex] := inttostr(listNotify[i].port);
sgWebChats.Cells[1, rowIndex] := 'Îïîâåùåíèå';
sgWebChats.Cells[2, rowIndex] := 'http://127.0.0.1:' +
inttostr(listNotify[i].port);
Inc(rowIndex); // Óâåëè÷èâàåì ñ÷åò÷èê ñòðîê
end;
// listKandinsky
for i := 0 to High(listKandinsky) do
begin
sgWebChats.RowCount := rowIndex + 1;
sgWebChats.Cells[0, rowIndex] := inttostr(listKandinsky[i].port);
sgWebChats.Cells[1, rowIndex] := 'Kandinsky';
sgWebChats.Cells[2, rowIndex] := 'http://127.0.0.1:' +
inttostr(listKandinsky[i].port);
Inc(rowIndex); // Óâåëè÷èâàåì ñ÷åò÷èê ñòðîê
end;
for i := 0 to High(listGames) do
begin
sgWebChats.RowCount := rowIndex + 1;
sgWebChats.Cells[0, rowIndex] := inttostr(listGames[i].port);
sgWebChats.Cells[1, rowIndex] := 'Èãðà';
sgWebChats.Cells[2, rowIndex] := 'http://127.0.0.1:' +
inttostr(listGames[i].port);
Inc(rowIndex); // Óâåëè÷èâàåì ñ÷åò÷èê ñòðîê
end;
finally
sgWebChats.EndUpdate;
end;
end;
end.