diff --git a/Services/uTTWAPI.pas b/Services/uTTWAPI.pas index e53660e..bfe7d20 100644 --- a/Services/uTTWAPI.pas +++ b/Services/uTTWAPI.pas @@ -93,7 +93,6 @@ function TTTW_API.createCustomReward(title: string; cost: string; var RequestData: TStringStream; s, s1, json: string; - i: integer; cr: TCustomRevards; JSONData: TJSONObject; JSONArray: TJSONArray; @@ -1041,9 +1040,9 @@ var EmoteObj: TJSONObject; ImagesObj: TJSONObject; Emote: TEmotes; - I, J: Integer; + I: Integer; chosenFormat, chosenTheme, chosenScale: string; - foundAnimated, foundNonStatic, foundDark: Boolean; + foundAnimated, foundDark: Boolean; scaleVal, maxScale: Double; s: string; begin @@ -1076,7 +1075,6 @@ begin // Выбор формата (format) foundAnimated := False; - foundNonStatic := False; chosenFormat := 'static'; // значение по умолчанию // Проверка наличия "animated" @@ -1094,7 +1092,6 @@ begin if s <> 'static' then begin chosenFormat := s; - foundNonStatic := True; Break; end; diff --git a/TTW_Bot_app.dpr b/TTW_Bot_app.dpr index 3eda71b..8f125f7 100644 --- a/TTW_Bot_app.dpr +++ b/TTW_Bot_app.dpr @@ -47,7 +47,8 @@ uses uWebServerKandinsky in 'utils\uWebServerKandinsky.pas', uWebServerEvents in 'utils\uWebServerEvents.pas', fEvents in 'frames\fEvents.pas' {frEvents: TFrame}, - uKeyEvent in 'utils\uKeyEvent.pas'; + uKeyEvent in 'utils\uKeyEvent.pas', + fRevards in 'frames\fRevards.pas' {frRevards: TFrame}; {$R *.res} diff --git a/TTW_Bot_app.dproj b/TTW_Bot_app.dproj index 85d3d0c..53a8597 100644 --- a/TTW_Bot_app.dproj +++ b/TTW_Bot_app.dproj @@ -306,9 +306,12 @@ true 10 1 - 1 + 2 1049 - CompanyName=PTyTb;FileDescription=$(MSBuildProjectName);FileVersion=10.1.1.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=ru.ptytb.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + CompanyName=PTyTb;FileDescription=$(MSBuildProjectName);FileVersion=10.1.2.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=ru.ptytb.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + TTW_Bot_app_Icon2.ico + ..\ttw_fmx_v9\fawico_44_2.png + ..\ttw_fmx_v9\fawico_150_2.png PerMonitorV2 @@ -438,6 +441,11 @@ TFrame + +
frRevards
+ fmx + TFrame +
Base @@ -487,6 +495,13 @@ true + + + Assets\ + Logo150x150.png + true + + Assets\ @@ -494,18 +509,37 @@ true + + + Assets\ + Logo44x44.png + true + + .\ true + + + .\ + true + + TTW_Bot_app.exe true + + + TTW_Bot_app.exe + true + + 1 diff --git a/TTW_Bot_app_Icon2.ico b/TTW_Bot_app_Icon2.ico new file mode 100644 index 0000000..dca514b Binary files /dev/null and b/TTW_Bot_app_Icon2.ico differ diff --git a/Win32/Release/botapp.cfg b/Win32/Release/botapp.cfg new file mode 100644 index 0000000..36df4ce --- /dev/null +++ b/Win32/Release/botapp.cfg @@ -0,0 +1,5 @@ + QKPG@VrKK3q|#/<6# #?2r?3t&)_< +6s  q ,*< m.~|0256{|I *55w" KK8WZFD +-!2->1-7)WDB2,/7p-t+$kmSN? w t (!8+uv5( +4*,(3,+V)20B= +*u8+", (3&2ucR*"'>3&s ( s +W*!(B=&x{LR-r{s`SXKJ| q;kup%1K_FS_s%t<%%$ugRR \ No newline at end of file diff --git a/forms/uCreateNotify.fmx b/forms/uCreateNotify.fmx index 81b5965..f3a2011 100644 --- a/forms/uCreateNotify.fmx +++ b/forms/uCreateNotify.fmx @@ -146,7 +146,7 @@ object fCreateNotify: TfCreateNotify Position.X = 8.000000000000000000 Position.Y = 135.000000000000000000 Text = #1057#1086#1073#1099#1090#1080#1077 - TabOrder = 37 + TabOrder = 38 end object cbEventsType: TComboBox Items.Strings = ( @@ -154,13 +154,14 @@ object fCreateNotify: TfCreateNotify #1055#1086#1076#1087#1080#1089#1082#1072 #1055#1086#1076#1072#1088#1086#1095#1085#1072#1103' '#1087#1086#1076#1087#1080#1089#1082#1072 #1056#1077#1081#1076 - #1044#1086#1085#1072#1090) + #1044#1086#1085#1072#1090 + #1057#1074#1086#1077) Position.X = 8.000000000000000000 Position.Y = 160.000000000000000000 Size.Width = 192.000000000000000000 Size.Height = 22.000000000000000000 Size.PlatformDefault = False - TabOrder = 38 + TabOrder = 39 OnChange = cbEventsTypeChange end object Label3: TLabel @@ -168,11 +169,11 @@ object fCreateNotify: TfCreateNotify Position.Y = 190.000000000000000000 Text = #1059#1089#1083#1086#1074#1080#1077' '#1089#1091#1084#1084#1099 Visible = False - TabOrder = 39 + TabOrder = 40 end object edtIF: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] - TabOrder = 40 + TabOrder = 41 Position.X = 8.000000000000000000 Position.Y = 215.000000000000000000 Size.Width = 192.000000000000000000 @@ -215,7 +216,7 @@ object fCreateNotify: TfCreateNotify object edtESTitle: TEdit Touch.InteractiveGestures = [LongTap, DoubleTap] Align = Top - TabOrder = 37 + TabOrder = 38 Text = '[NICK] '#1085#1072#1095#1072#1083' '#1086#1090#1089#1083#1077#1078#1080#1074#1072#1090#1100' '#1074#1072#1089 Position.X = 10.000000000000000000 Position.Y = 20.000000000000000000 diff --git a/forms/uCreateNotify.pas b/forms/uCreateNotify.pas index 43cf9b6..8cbd4e9 100644 --- a/forms/uCreateNotify.pas +++ b/forms/uCreateNotify.pas @@ -4,7 +4,7 @@ interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, - System.Variants, fOBS, + System.Variants, fOBS, System.RegularExpressions, Math, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, fFontSettings, fColorSettings, FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation, FMX.ListBox, FMX.EditBox, FMX.SpinBox, FMX.Colors, uRecords; @@ -44,6 +44,9 @@ type { Private declarations } function GetColorFromColorPanel(aColor: TAlphaColor): string; function GetColorFromCCB(aColor: TAlphaColor): string; + + function GetColorFromRGBA(const s: string): TAlphaColor; + function GetColorFromHex(const s: string): TAlphaColor; public { Public declarations } isEdit: boolean; @@ -60,6 +63,33 @@ uses uGeneral; {$R *.fmx} + function TfCreateNotify.GetColorFromRGBA(const s: string): TAlphaColor; +var + Match: TMatch; + r, g, b: Integer; + a: Double; + Rec: TAlphaColorRec; +begin + Match := TRegEx.Match(s, 'rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)'); + if Match.Success then + begin + r := StrToInt(Match.Groups[1].Value); + g := StrToInt(Match.Groups[2].Value); + b := StrToInt(Match.Groups[3].Value); + a := StrToFloat(Match.Groups[4].Value, TFormatSettings.Invariant); + + // Заполняем структуру вручную + Rec.R := Byte(r); + Rec.G := Byte(g); + Rec.B := Byte(b); + Rec.A := Round(a * 255); + + Result := Rec.Color; + end + else + raise Exception.CreateFmt('Неверный формат rgba: %s', [s]); +end; + function TfCreateNotify.GetColorFromColorPanel(aColor: TAlphaColor): string; var Color: TAlphaColor; @@ -80,6 +110,47 @@ begin result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS); end; +function TfCreateNotify.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; + +function TfCreateNotify.GetColorFromHex(const s: string): TAlphaColor; +var + Hex: string; + r, g, b: Integer; + Rec: TAlphaColorRec; +begin + // Убираем возможный символ # + Hex := s.Trim; + if Hex.StartsWith('#') then + Hex := Hex.Substring(1); + + // Ожидаем ровно 6 символов (RRGGBB) + if Length(Hex) <> 6 then + raise Exception.CreateFmt('Неверный HEX цвет: %s', [s]); + + // Парсим компоненты + r := StrToInt('$' + Copy(Hex, 1, 2)); + g := StrToInt('$' + Copy(Hex, 3, 2)); + b := StrToInt('$' + Copy(Hex, 5, 2)); + + // Заполняем структуру + Rec.R := Byte(r); + Rec.G := Byte(g); + Rec.B := Byte(b); + Rec.A := 255; // полная непрозрачность + + Result := Rec.Color; +end; + procedure TfCreateNotify.setRecord(aRec: TOBSNotify); var SavedColor: TAlphaColor; @@ -97,19 +168,21 @@ begin fCreateNotify.frColorSettings1.sbStyleBlockBorderSize.Value := SolidBorder; fCreateNotify.frColorSettings1.sbStyleBlockPadding.Value := Paddings; - fCreateNotify.frColorSettings1.ccbStyleBorderColor.ItemIndex := ColorBorder; - fCreateNotify.frColorSettings1.ccbBColor.ItemIndex := ColorBackground; + fCreateNotify.frColorSettings1.ccbStyleBorderColor.Color := GetColorFromHex(ColorBorder); + fCreateNotify.frColorSettings1.ccbBColor.Color := GetColorFromHex(ColorBackground); + fCreateNotify.frColorSettings1.cpStyleBlockColor.Color:=GetColorFromRGBA(ColorBlock); fCreateNotify.edtESTitle.Text := HeaderText; - fCreateNotify.frFontSettings2.ccbFontColor.ItemIndex := HeaderColorFont; + fCreateNotify.frFontSettings2.ccbFontColor.Color := GetColorFromHex(HeaderColorFont); fCreateNotify.frFontSettings2.sbFontSize.Value := HeaderSizeFont; fCreateNotify.frFontSettings2.cbFontStyleDefault.ItemIndex := - HeaderStyleFont; + fCreateNotify.frFontSettings2.cbFontStyleDefault.Items.IndexOf(HeaderStyleFont); fCreateNotify.edtESMessage.Text := MessText; - fCreateNotify.frFontSettings3.ccbFontColor.ItemIndex := MessColorFont; + fCreateNotify.frFontSettings3.ccbFontColor.Color := GetColorFromHex(MessColorFont); fCreateNotify.frFontSettings3.sbFontSize.Value := MessSizeFont; - fCreateNotify.frFontSettings3.cbFontStyleDefault.ItemIndex := MessStyleFont; + fCreateNotify.frFontSettings3.cbFontStyleDefault.ItemIndex := + fCreateNotify.frFontSettings3.cbFontStyleDefault.Items.IndexOf(MessStyleFont); fCreateNotify.sbTimeMsg.Value := TimeMess; fCreateNotify.cbEventsType.ItemIndex := TypeEvent; @@ -132,18 +205,18 @@ begin (frColorSettings1.cpStyleBlockColor.Color); SolidBorder := round(frColorSettings1.sbStyleBlockBorderSize.Value); Paddings := round(frColorSettings1.sbStyleBlockPadding.Value); - ColorBorder := frColorSettings1.ccbStyleBorderColor.ItemIndex; - ColorBackground := frColorSettings1.ccbBColor.ItemIndex; + ColorBorder := GetColorFromCCB(frColorSettings1.ccbStyleBorderColor.Color); + ColorBackground := GetColorFromCCB(frColorSettings1.ccbBColor.Color); HeaderText := edtESTitle.Text; - HeaderColorFont := frFontSettings2.ccbFontColor.ItemIndex; + HeaderColorFont := GetColorFromCCB(frFontSettings2.ccbFontColor.Color); HeaderSizeFont := round(frFontSettings2.sbFontSize.Value); - HeaderStyleFont := frFontSettings2.cbFontStyleDefault.ItemIndex; + HeaderStyleFont := frFontSettings2.cbFontStyleDefault.Text; MessText := edtESMessage.Text; - MessColorFont := frFontSettings3.ccbFontColor.ItemIndex; + MessColorFont := GetColorFromCCB(frFontSettings3.ccbFontColor.color); MessSizeFont := round(frFontSettings3.sbFontSize.Value); - MessStyleFont := frFontSettings3.cbFontStyleDefault.ItemIndex; + MessStyleFont := frFontSettings3.cbFontStyleDefault.Text; TimeMess := round(sbTimeMsg.Value); TypeEvent := cbEventsType.ItemIndex; @@ -159,22 +232,13 @@ end; -function TfCreateNotify.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; + procedure TfCreateNotify.btnESTestClick(Sender: TObject); var se: TStyleEvent; i: Integer; + ws:TEventWebServers; begin se.Title := edtESTitle.Text; @@ -195,8 +259,12 @@ begin se.RequireInteraction := True; for i := 0 to TTW_Bot.frOBS1.EventWebServers.Count - 1 do begin - TTW_Bot.frOBS1.EventWebServers[i].WebServerChat.AddMessage(se); + if TTW_Bot.frOBS1.EventWebServers[i].port = oldPort then + ws:=TTW_Bot.frOBS1.EventWebServers[i]; + + end; + ws.WebServerChat.addMessage(se); end; procedure TfCreateNotify.cbEventsTypeChange(Sender: TObject); diff --git a/forms/uGeneral.fmx b/forms/uGeneral.fmx index 8155f97..49e3274 100644 --- a/forms/uGeneral.fmx +++ b/forms/uGeneral.fmx @@ -3,7 +3,7 @@ object TTW_Bot: TTTW_Bot Top = 0 Caption = 'TTW_Bot' ClientHeight = 886 - ClientWidth = 970 + ClientWidth = 1003 Position = Designed FormFactor.Width = 320 FormFactor.Height = 480 @@ -15,30 +15,30 @@ object TTW_Bot: TTTW_Bot object V: TTabControl Align = Client Images = ImageList1 - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 744.000000000000000000 Size.PlatformDefault = False - TabIndex = 5 + TabIndex = 3 TabOrder = 0 TabPosition = PlatformDefault Sizes = ( - 970s + 1003s 718s - 970s + 1003s 718s - 970s + 1003s 718s - 970s + 1003s 718s - 970s + 1003s 718s - 970s + 1003s 718s - 970s + 1003s 718s - 970s + 1003s 718s - 970s + 1003s 718s) object TabItem1: TTabItem CustomIcon = < @@ -57,7 +57,7 @@ object TTW_Bot: TTTW_Bot ExplicitSize.cy = 26.000000000000000000 inline frSettings1: TfrSettings Align = Client - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 718.000000000000000000 Size.PlatformDefault = False inherited GroupBox3: TGroupBox @@ -92,35 +92,35 @@ object TTW_Bot: TTTW_Bot TabOrder = 34 end inherited Label63: TLabel - TabOrder = 30 + TabOrder = 29 end inherited edtDAClientID: TEdit - TabOrder = 32 - end - inherited Label64: TLabel TabOrder = 31 end - inherited edtDAClientSecret: TEdit - TabOrder = 33 + inherited Label64: TLabel + TabOrder = 30 + end + inherited Label65: TLabel + TabOrder = 32 end inherited edtDARedirectURL: TEdit - TabOrder = 40 + TabOrder = 37 end inherited edtDACode: TEdit - TabOrder = 36 + TabOrder = 35 end inherited Label66: TLabel - TabOrder = 37 + TabOrder = 36 end inherited btnDAStart: TButton Images = ImageList1 ImageIndex = 18 - TabOrder = 39 + TabOrder = 38 OnClick = frSettings1btnDAStartClick end inherited btnGetDADef: TButton Images = ImageList1 - TabOrder = 43 + TabOrder = 40 end end inherited btnOpenRomaning: TButton @@ -168,7 +168,7 @@ object TTW_Bot: TTTW_Bot ExplicitSize.cy = 26.000000000000000000 inline frAI1: TfrAI Align = Client - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 718.000000000000000000 Size.PlatformDefault = False inherited btnGetAIDef: TButton @@ -201,7 +201,7 @@ object TTW_Bot: TTTW_Bot ExplicitSize.cy = 26.000000000000000000 inline frCommands1: TfrCommands Align = Client - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 718.000000000000000000 Size.PlatformDefault = False inherited sgCommands: TStringGrid @@ -269,6 +269,15 @@ object TTW_Bot: TTTW_Bot Images = ImageList1 ImageIndex = 12 end + object cbHelloTTS: TCheckBox + Position.X = 240.000000000000000000 + Position.Y = 35.000000000000000000 + Size.Width = 152.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + TabOrder = 48 + Text = #1055#1088#1080#1074#1077#1090#1089#1090#1074#1086#1074#1072#1090#1100' '#1085#1086#1074#1099#1093 + end end end inherited GroupBox9: TGroupBox @@ -423,7 +432,7 @@ object TTW_Bot: TTTW_Bot item end> TextSettings.Trimming = None - IsSelected = False + IsSelected = True ImageIndex = 20 Size.Width = 79.000000000000000000 Size.Height = 26.000000000000000000 @@ -466,7 +475,8 @@ object TTW_Bot: TTTW_Bot Padding.Top = 20.000000000000000000 Padding.Right = 10.000000000000000000 Padding.Bottom = 10.000000000000000000 - Position.Y = 249.000000000000000000 + Position.X = 1.000000000000000000 + Position.Y = 342.000000000000000000 Size.Width = 841.000000000000000000 Size.Height = 368.000000000000000000 Size.PlatformDefault = False @@ -509,6 +519,52 @@ object TTW_Bot: TTTW_Bot end end end + object GroupBox3: TGroupBox + Padding.Left = 10.000000000000000000 + Padding.Top = 20.000000000000000000 + Padding.Right = 10.000000000000000000 + Padding.Bottom = 10.000000000000000000 + Position.X = 337.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 625.000000000000000000 + Size.Height = 326.000000000000000000 + Size.PlatformDefault = False + Text = #1053#1072#1075#1088#1072#1076#1099 + TabOrder = 2 + inline frRevards1: TfrRevards + Align = Client + Size.Width = 605.000000000000000000 + Size.Height = 296.000000000000000000 + Size.PlatformDefault = False + inherited StringGrid1: TStringGrid + Size.Width = 605.000000000000000000 + Size.Height = 153.000000000000000000 + Viewport.Width = 605.000000000000000000 + Viewport.Height = 153.000000000000000000 + inherited StringColumn1: TStringColumn + Size.Width = 241.000000000000000000 + end + inherited StringColumn2: TStringColumn + Size.Width = 140.000000000000000000 + end + end + inherited Label34: TLabel + TabOrder = 2 + end + inherited nbCustomRevardCost: TNumberBox + TabOrder = 5 + end + inherited Label35: TLabel + TabOrder = 3 + end + inherited Label2: TLabel + TabOrder = 9 + end + inherited btnDelCustomRewards: TButton + TabOrder = 16 + end + end + end end object TabItem4: TTabItem CustomIcon = < @@ -527,13 +583,13 @@ object TTW_Bot: TTTW_Bot ExplicitSize.cy = 26.000000000000000000 inline frOBS1: TfrOBS Align = Top - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 345.000000000000000000 Size.PlatformDefault = False inherited sgWebChats: TStringGrid - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 282.000000000000000000 - Viewport.Width = 970.000000000000000000 + Viewport.Width = 1003.000000000000000000 Viewport.Height = 282.000000000000000000 inherited StringColumn2: TStringColumn Size.Width = 200.000000000000000000 @@ -550,7 +606,7 @@ object TTW_Bot: TTTW_Bot Anchors = [akTop, akRight] Images = ImageList1 ImageIndex = 4 - Position.X = 882.000000000000000000 + Position.X = 915.000000000000000000 TabOrder = 3 OnClick = frOBS1btnDeleteeChatClick end @@ -566,7 +622,7 @@ object TTW_Bot: TTTW_Bot Images = ImageList1 ImageIndex = 5 Position.X = 264.000000000000000000 - TabOrder = 8 + TabOrder = 11 end object btnCreateChat: TButton Images = ImageList1 @@ -603,7 +659,7 @@ object TTW_Bot: TTTW_Bot item end> TextSettings.Trimming = None - IsSelected = True + IsSelected = False ImageIndex = 24 Size.Width = 110.000000000000000000 Size.Height = 26.000000000000000000 @@ -615,7 +671,7 @@ object TTW_Bot: TTTW_Bot ExplicitSize.cy = 26.000000000000000000 inline frNotify1: TfrNotify Align = Client - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 718.000000000000000000 Size.PlatformDefault = False inherited btnNotifyOpen: TButton @@ -697,7 +753,7 @@ object TTW_Bot: TTTW_Bot ExplicitSize.cy = 26.000000000000000000 inline frAutoActions1: TfrAutoActions Align = Client - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 718.000000000000000000 Size.PlatformDefault = False inherited GroupBox20: TGroupBox @@ -850,20 +906,20 @@ object TTW_Bot: TTTW_Bot ExplicitSize.cy = 26.000000000000000000 inline frLog1: TfrLog Align = Client - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 718.000000000000000000 Size.PlatformDefault = False inherited Panel1: TPanel - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 inherited btnClear: TButton Images = ImageList1 ImageIndex = 4 end end inherited sgLog: TStringGrid - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 685.000000000000000000 - Viewport.Width = 970.000000000000000000 + Viewport.Width = 1003.000000000000000000 Viewport.Height = 685.000000000000000000 inherited StringColumn2: TStringColumn Size.Width = 170.000000000000000000 @@ -881,7 +937,7 @@ object TTW_Bot: TTTW_Bot object Panel1: TPanel Align = Bottom Position.Y = 744.000000000000000000 - Size.Width = 970.000000000000000000 + Size.Width = 1003.000000000000000000 Size.Height = 142.000000000000000000 Size.PlatformDefault = False TabOrder = 10 @@ -1004,7 +1060,7 @@ object TTW_Bot: TTTW_Bot end object Label1: TLabel Anchors = [akTop, akRight] - Position.X = 821.000000000000000000 + Position.X = 854.000000000000000000 Position.Y = 8.000000000000000000 Text = #1054#1090#1076#1077#1083#1100#1085#1086#1077' '#1089#1087#1072#1089#1080#1073#1086':' TabOrder = 12 @@ -1041,7 +1097,7 @@ object TTW_Bot: TTTW_Bot Anchors = [akTop, akRight] Images = ImageList1 ImageIndex = 11 - Position.X = 821.000000000000000000 + Position.X = 854.000000000000000000 Position.Y = 33.000000000000000000 Size.Width = 141.000000000000000000 Size.Height = 22.000000000000000000 @@ -1054,7 +1110,7 @@ object TTW_Bot: TTTW_Bot Anchors = [akTop, akRight] Images = ImageList1 ImageIndex = 11 - Position.X = 821.000000000000000000 + Position.X = 854.000000000000000000 Position.Y = 63.000000000000000000 Size.Width = 141.000000000000000000 Size.Height = 22.000000000000000000 @@ -1067,7 +1123,7 @@ object TTW_Bot: TTTW_Bot Anchors = [akTop, akRight] Images = ImageList1 ImageIndex = 11 - Position.X = 821.000000000000000000 + Position.X = 854.000000000000000000 Position.Y = 93.000000000000000000 Size.Width = 141.000000000000000000 Size.Height = 22.000000000000000000 diff --git a/forms/uGeneral.pas b/forms/uGeneral.pas index 6d91565..578a320 100644 --- a/forms/uGeneral.pas +++ b/forms/uGeneral.pas @@ -1,15 +1,15 @@ п»ї{ -получение доната -procedure TfrSettings.HandleWSDonate(aNick, aMessage, aSum: string); + получение доната + procedure TfrSettings.HandleWSDonate(aNick, aMessage, aSum: string); -получение сообщения -procedure TTTW_Bot.ttwIRCOnMessageRecord(aRecord: TTwitchChatMessage); + получение сообщения + procedure TTTW_Bot.ttwIRCOnMessageRecord(aRecord: TTwitchChatMessage); -получение событий -ttw_ES.OnFollow := frOBS1.toEventWebServer; -ttw_ES.OnSub := frOBS1.toEventWebServer; -ttw_ES.OnGift := frOBS1.toEventWebServer; -ttw_ES.OnRaid := frOBS1.toEventWebServer; + получение событий + ttw_ES.OnFollow := frOBS1.toEventWebServer; + ttw_ES.OnSub := frOBS1.toEventWebServer; + ttw_ES.OnGift := frOBS1.toEventWebServer; + ttw_ES.OnRaid := frOBS1.toEventWebServer; } unit uGeneral; @@ -26,7 +26,8 @@ uses System.Generics.Collections, utts, uGigaChat, uChatAPI, uMyTimer, uRecords, System.IOUtils, fCommands, uDataBase, FMX.Edit, FMX.Colors, FMX.SpinBox, windows, System.Skia, FMX.Skia, uCreateChat, uCreateNotify, fOBS, fTTS, - fPlayerWeb, uWebServerKandinsky, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo; + fPlayerWeb, uWebServerKandinsky, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, + fRevards; type TTTW_Bot = class(TForm) @@ -73,6 +74,9 @@ type frPlayerWeb1: TfrPlayerWeb; frEvents1: TfrEvents; GroupBox2: TGroupBox; + cbHelloTTS: TCheckBox; + GroupBox3: TGroupBox; + frRevards1: TfrRevards; procedure cbThemeChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); @@ -117,6 +121,7 @@ type procedure ESError(aMsg: string); procedure ESStatus(Sender: TObject; const ConnectionEvent: String; StatusCode: Integer; const Description: String); + procedure ESOnSubOk(s: string); public { Public declarations } procedure toLog(aModule, aMethod, aMessage: string; aCode: Integer); @@ -134,7 +139,7 @@ var ttw_API: TTTW_API; userlist: TList; Kandinsky: TKandinsky_Web; - kePoints:TKE; + kePoints: TKE; implementation @@ -217,7 +222,7 @@ begin on E: Exception do begin toLog('uGeneral', 'ConnectProcedure.ttw_API.Init', E.Message, 2); - raise; + end; end; @@ -226,7 +231,14 @@ begin rid := ttw_API.getRoomAndBot; if rid = '' then raise Exception.Create('РќРµ удалось получить Room ID'); - + try + frRevards1.LoadCustomRevards; + except + on E: Exception do + begin + toLog('uGeneral', 'ConnectProcedure.LoadCustomRevards', E.Message, 2); + end; + end; // Загрузка СЌРјРѕРґР·Рё Рё бейджей try frOBS1.ChatBadges.Clear; @@ -246,7 +258,7 @@ begin on E: Exception do begin toLog('uGeneral', 'ConnectProcedure.Emotes', E.Message, 2); - raise; + end; end; @@ -262,10 +274,10 @@ begin // Назначение обработчиков событий // ttw_ES.OnMessage := fRewards.ESOnMessage; ttw_ES.OnError := ESError; - ttw_ES.OnGetCustomReward := frEvents1.ESOnGetCustomReward; + ttw_ES.OnGetCustomReward := frEvents1.ESOnGetCustomReward; ttw_ES.OnStatus := ESStatus; // ttw_ES.OnRAW := fRewards.ESOnRAW; - // ttw_ES.OnSubOk := fRewards.ESOnSubOk; + ttw_ES.OnSubOk := ESOnSubOk; ttw_ES.OnFollow := frOBS1.toEventWebServer; ttw_ES.OnSub := frOBS1.toEventWebServer; ttw_ES.OnGift := frOBS1.toEventWebServer; @@ -276,7 +288,7 @@ begin on E: Exception do begin toLog('uGeneral', 'ConnectProcedure.ttw_ES', E.Message, 2); - raise; + end; end; @@ -290,8 +302,7 @@ begin end; procedure TTTW_Bot.DisconnectProcedure; -var - I: Integer; + begin try toLog('DisconnectProcedure', 'Start', 'Начало процедуры отключения', 3); @@ -340,6 +351,11 @@ begin toLog('uGeneral', 'ESError', aMsg, 2); end; +procedure TTTW_Bot.ESOnSubOk(s: string); +begin + toLog('uGeneral', 'ESOnSubOk', s, 0); +end; + procedure TTTW_Bot.ESStatus(Sender: TObject; const ConnectionEvent: String; StatusCode: Integer; const Description: String); begin @@ -373,9 +389,7 @@ begin end; procedure TTTW_Bot.btnConnectingClick(Sender: TObject); -var - rid, tb, ts: string; - I: Integer; + begin if not ValidateInput then exit; @@ -489,17 +503,6 @@ begin ttw_API := TTTW_API.Create(Self); - if (frAI1.edtKandiKey.text <> '') and (frAI1.edtKandiSecret.text <> '') then - begin - try - Kandinsky := TKandinsky_Web.Create(frAI1.edtKandiKey.text, - frAI1.edtKandiSecret.text); - Kandinsky.ActiveServer(true); - toLog('uAI', 'FormCreate', 'Kandinsky Создан', 0); - finally - - end; - end; end; procedure TTTW_Bot.OnTTWStatus(ASender: TObject; const AStatus: TIdStatus; @@ -514,8 +517,9 @@ begin frOBS1.ChatEmotes.Free; frOBS1.ChatWebServers.Free; frOBS1.EventWebServers.Free; - frEvents1.CustomRewards.Free; -kePoints.Free; + frOBS1.KandinskyWebServers.Free; + frRevards1.CustomRewards.Free; + kePoints.Free; DisconnectProcedure; if Assigned(ttw_IRS) then ttw_IRS.Free; @@ -726,6 +730,10 @@ begin exit; end; + if (TTW_Bot.cbHelloTTS.IsChecked) and (aRecord.FirstMsg = 1) then + toSpeech('приветствую, ' + IfThen(aRecord.DisplayName <> '', + aRecord.DisplayName, aRecord.Username)); + firstWord := ExtractFirstWord(processedText); if IsCommand(firstWord) then begin @@ -1050,6 +1058,7 @@ procedure TTTW_Bot.ReadDB; end; frSettings1.Init; + end; // Загрузка РіСЂРёРґРѕРІ автоматических действий @@ -1084,9 +1093,20 @@ procedure TTTW_Bot.ReadDB; frOBS1.EventWebServers := TList.Create; for I := 0 to High(frOBS1.listNotify) do begin + frOBS1.CreateWebEvents(frOBS1.listNotify[I]); end; db.LoadRecordArray('listKandinsky', frOBS1.listKandinsky); + frOBS1.KandinskyWebServers := TList.Create; + if (frAI1.edtKandiKey.text <> '') and (frAI1.edtKandiSecret.text <> '') then + begin + for I := 0 to High(frOBS1.listKandinsky) do + begin + frOBS1.CreateWebKandinsky(frOBS1.listKandinsky[I]); + end; + + end; + frOBS1.UpdateGridFromArray; end; @@ -1095,11 +1115,11 @@ procedure TTTW_Bot.ReadDB; begin db.LoadRecordArray('ListEvents', frEvents1.ListEvents); frEvents1.UpdateGrid; + frRevards1.CustomRewards := TList.Create; - frEvents1.CustomRewards := Tlist.Create; - // frEvents1.LoadCustomRevards(); - frEvents1.CustomRewardEvents := Tlist.Create; - kePoints:=TKE.Create(frEvents1.edtParams, frEvents1.cbKey1,frEvents1.cbKey2,frEvents1.cbKey3); + frEvents1.CustomRewardEvents := TList.Create; + kePoints := TKE.Create(frEvents1.edtParams, frEvents1.cbKey1, + frEvents1.cbKey2, frEvents1.cbKey3); frTTS1.btnUpdateVoicesClick(Self); frTTS1.cbVoices.ItemIndex := strtoint(db.ReadSetting('cbVoices', '0')); frTTS1.cbOutput.ItemIndex := strtoint(db.ReadSetting('cbOutput', '0')); @@ -1107,14 +1127,15 @@ procedure TTTW_Bot.ReadDB; end; begin -LoadSkills; + LoadAISettings; + LoadSkills; LoadSettingsComponents; LoadGridsData; LoadGroupNames; LoadEncryptedConfig; LoadNotifySettings; - LoadAISettings; + LoadOBSGrids; LoadAutoActionsGrids; end; @@ -1558,11 +1579,14 @@ function TTTW_Bot.ResponsParserAIPic(inMess, aCommandText, aNick: string): string; var res: string; + I: Integer; begin res := inMess; if ContainsText(res, '[Kandinsky]') then begin - Kandinsky.generate(aCommandText, aNick); + for I := 0 to frOBS1.KandinskyWebServers.Count - 1 do + frOBS1.KandinskyWebServers[I].WebServerKandinsky.generate + (aCommandText, aNick); res := StringReplace(res, '[Kandinsky]', '', [rfReplaceAll]); end; Result := res; diff --git a/frames/fEvents.pas b/frames/fEvents.pas index 2717867..ce46e1e 100644 --- a/frames/fEvents.pas +++ b/frames/fEvents.pas @@ -7,7 +7,8 @@ uses System.Variants, System.Generics.Collections, ShellAPI, uSoundManager, FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Edit, FMX.ListBox, FMX.Controls.Presentation, System.Rtti, FMX.Grid.Style, - FMX.ScrollBox, FMX.Grid, uRecords, uDataBase, FMX.Menus, uKeyEvent; + FMX.ScrollBox, FMX.Grid, uRecords, uDataBase, FMX.Menus, uKeyEvent, + fColorSettings, fFontSettings; type TfrEvents = class(TFrame) @@ -42,16 +43,13 @@ type procedure MenuItem1Click(Sender: TObject); procedure cbActionsChange(Sender: TObject); private - { Private declarations } - procedure toLog(aCode: integer; aMethod: string; aMess: string); + procedure toLog(aCode: integer; aMethod, aMess: string); + procedure ExecuteAction(const aAction: integer; const aParam, aUserInput, aUserName, aUserLogin: string); public - { Public declarations } ListEvents: TArray; - CustomRewards: Tlist; - CustomRewardEvents: Tlist; + CustomRewardEvents: TList; procedure UpdateGrid; - procedure LoadCustomRevards(); procedure ESOnGetCustomReward(CustomReward: TCustomRewardEvent); procedure OnDonate(aNick, aMessage, aSum: string); end; @@ -62,36 +60,40 @@ implementation uses uGeneral; +{ --- UI --- } + procedure TfrEvents.btnAddClick(Sender: TObject); var NewRec: TEventGlobal; begin - if (cbEventList.Text = '') or (cbActions.Text = '') then - exit; + if (cbEventList.ItemIndex < 0) or (cbActions.ItemIndex < 0) then + Exit; + NewRec.Event := cbEventList.ItemIndex; NewRec.Action := cbActions.ItemIndex; NewRec.Param := edtParams.Text; + if edtIF.Visible then - NewRec.Condition := edtIF.Text; - if cbRevards.Visible then + NewRec.Condition := edtIF.Text + else if cbRevards.Visible then NewRec.Condition := cbRevards.Text; - SetLength(ListEvents, Length(ListEvents) + 1); - ListEvents[High(ListEvents)] := NewRec; + ListEvents := ListEvents + [NewRec]; + DB.SaveRecordArray('ListEvents', ListEvents); UpdateGrid; end; procedure TfrEvents.btnDeleteClick(Sender: TObject); var - i, RowIndex: integer; + RowIndex: integer; begin RowIndex := sgEvents.Row; if (RowIndex < 0) or (RowIndex > High(ListEvents)) then - exit; - for i := RowIndex to High(ListEvents) - 1 do - ListEvents[i] := ListEvents[i + 1]; - SetLength(ListEvents, Length(ListEvents) - 1); + Exit; + + Delete(ListEvents, RowIndex, 1); + DB.SaveRecordArray('ListEvents', ListEvents); UpdateGrid; end; @@ -106,265 +108,172 @@ begin edtIF.Visible := cbEventList.ItemIndex = 0; cbRevards.Visible := cbEventList.ItemIndex = 1; Label2.Visible := cbEventList.ItemIndex <= 1; - end; -procedure TfrEvents.ESOnGetCustomReward(CustomReward: TCustomRewardEvent); +procedure TfrEvents.MenuItem1Click(Sender: TObject); +begin + if OpenDialog1.Execute and (PopupMenu1.PopupComponent is TEdit) then + TEdit(PopupMenu1.PopupComponent).Text := OpenDialog1.FileName; +end; + +{ --- Общая логика --- } + +procedure TfrEvents.ExecuteAction(const aAction: integer; const aParam, aUserInput, aUserName, aUserLogin: string); var - i, i2: integer; - req, s: string; - hr: TCustomRewardEvent; sm: TSongMachine; - myAction: integer; + f: TfrColorSettings; + t: TfrFontSettings; + i, j: Integer; + notify: TOBSNotify; + se: TStyleEvent; begin sm := TSongMachine.Create; try - toLog(3, 'ESOnGetCustomReward', 'Начало обработки награды: ' + - CustomReward.Event.revard.Title); - s := '[' + CustomReward.Event.user_name + - '] купил за баллы канала награду "' + - CustomReward.Event.revard.Title + '" '; - if CustomReward.Event.user_input <> '' then - begin - toLog(0, 'ESOnGetCustomReward', 'Пользовательский ввод: ' + - CustomReward.Event.user_input); - s := s + ' и передал строку ' + CustomReward.Event.user_input - end; + case aAction of + 0: begin // Нажать кнопку + toLog(0, 'ExecuteAction', 'Симуляция нажатия: ' + aParam); + kePoints.SimulateKeyPress(aParam, 500); + end; + 1: begin // Воспроизведение звука + toLog(0, 'ExecuteAction', 'Воспроизведение звука: ' + aParam); + sm.PlayPublic(aParam, '100'); + end; + 2: begin // Kandinsky + toLog(0, 'ExecuteAction', 'Генерация Kandinsky для: ' + aUserInput); + Kandinsky.generate(aUserInput, aUserLogin); + end; + 3: begin // OBS Notify + f := TfrColorSettings.Create(Self); + t := TfrFontSettings.Create(Self); + try + for i := 0 to High(TTW_Bot.frOBS1.listNotify) do + if TTW_Bot.frOBS1.listNotify[i].TypeEvent = 5 then + begin + notify := TTW_Bot.frOBS1.listNotify[i]; + se.Title := StringReplace(notify.HeaderText, '[NICK]', aUserName, [rfReplaceAll]); + se.Context := notify.MessText; + se.Url := notify.Picture; + se.SoundURL := notify.Sound; + se.Timestamp := Now; + se.TimeMsg := notify.TimeMess; + se.BorderColor := notify.ColorBorder; + se.BorderSize := notify.SolidBorder; + se.BlockColor := notify.ColorBlock; + se.FontTitle.Font := notify.HeaderStyleFont; + se.FontTitle.Size := notify.HeaderSizeFont; + se.FontTitle.Color := notify.HeaderColorFont; + se.FontContext.Font := notify.MessStyleFont; + se.FontContext.Size := notify.MessSizeFont; + se.FontContext.Color := notify.MessColorFont; + se.RequireInteraction := True; - for i := 0 to high(ListEvents) do - begin - if ListEvents[i].Event <> 1 then - continue; - if ListEvents[i].Condition = CustomReward.Event.revard.Title then - begin - myAction := ListEvents[i].Action; - - { - 0 Нажать нкопку на клавиатуре - 1 Проиграть звук - 2 Kandinsky - 3 Запустить Web Event - 4 Написать в чат - 5 Запустить программу - - } - case myAction of - 0: - begin // нажать кнопку - toLog(0, 'ESOnGetCustomReward', 'Симуляция нажатия: ' + - ListEvents[i].Param); - kePoints.SimulateKeyPress(ListEvents[i].Param, 500); - end; - 1: - begin // воспроизведение звука - toLog(0, 'ESOnGetCustomReward', 'Воспроизведение звука: ' + - ListEvents[i].Param); - sm.PlayPublic(ListEvents[i].Param, '100'); - end; - 2: - begin // Kandinsky - toLog(0, 'ESOnGetCustomReward', 'Генерация Kandinsky для: ' + - CustomReward.Event.user_input); - Kandinsky.generate(CustomReward.Event.user_input, - CustomReward.Event.user_login); - end; - 4: - begin // Написать в чат - - toLog(0, 'ESOnGetCustomReward', 'Написать в чат: ' + - CustomReward.Event.user_input); - end; - 5: - begin // запуск файла - toLog(0, 'ESOnGetCustomReward', 'Запуск файла: ' + ListEvents - [i].Param); - ShellExecute(0, 'open', pwidechar(ListEvents[i].Param), - nil, nil, 0); - end; - end; - end; + for j := 0 to TTW_Bot.frOBS1.EventWebServers.Count - 1 do + TTW_Bot.frOBS1.EventWebServers[j].WebServerChat.AddMessage(se); + end; + finally + f.Free; + t.Free; + end; + end; + 4: toLog(0, 'ExecuteAction', 'Написать в чат: ' + aUserInput); + 5: begin // Запуск файла + toLog(0, 'ExecuteAction', 'Запуск файла: ' + aParam); + ShellExecute(0, 'open', PWideChar(aParam), nil, nil, 0); + end; end; finally sm.Free; end; end; -procedure TfrEvents.LoadCustomRevards(); +procedure TfrEvents.ESOnGetCustomReward(CustomReward: TCustomRewardEvent); var - cr: TCustomRevards; + ev: TEventGlobal; begin - CustomRewards.Clear; - cbRevards.Items.Clear; - TTW_Bot.toLog('fEvents', 'LoadCustomRevards', 'Запрос наград с сервера', 3); - ttw_API.getCustomReward(CustomRewards); - for cr in CustomRewards do - begin - cbRevards.Items.Add(cr.Title); - end; -end; + toLog(3, 'ESOnGetCustomReward', 'Начало обработки награды: ' + CustomReward.Event.revard.Title); -procedure TfrEvents.MenuItem1Click(Sender: TObject); -begin - if OpenDialog1.Execute then - TEdit(PopupMenu1.PopupComponent).Text := OpenDialog1.FileName; + for ev in ListEvents do + if (ev.Event = 1) and (ev.Condition = CustomReward.Event.revard.Title) then + ExecuteAction(ev.Action, ev.Param, CustomReward.Event.user_input, CustomReward.Event.user_name, CustomReward.Event.user_login); end; procedure TfrEvents.OnDonate(aNick, aMessage, aSum: string); var - i, i2: integer; - req, s: string; - hr: TCustomRewardEvent; - sm: TSongMachine; - myAction: integer; - - j: integer; - aSumInt: integer; - BestRow: integer; - BestPriority: integer; - BestValue: integer; + i, aSumInt, BestRow, BestPriority, BestValue, + CurrentPriority, CurrentValue, MinVal, MaxVal: integer; Condition: string; - CurrentPriority: integer; - CurrentValue: integer; - MinVal, MaxVal: integer; - Parts: tstringlist; - se: TStyleEvent; - notify: TEventGlobal; - + Parts: TStringList; begin - aSumInt := StrToIntDef(aSum, 0); BestRow := -1; BestPriority := -1; BestValue := 0; - for i := 0 to high(ListEvents) do + for i := 0 to High(ListEvents) do begin - if ListEvents[i].Event = 0 then + if ListEvents[i].Event <> 0 then + Continue; + + Condition := ListEvents[i].Condition; + CurrentPriority := -1; + CurrentValue := 0; + + if TryStrToInt(Condition, CurrentValue) then begin - Condition := ListEvents[i].Condition; - CurrentPriority := -1; - CurrentValue := 0; - - // Проверка на точное значение - if Pos('-', Condition) = 0 then - begin - if Pos('>', Condition) = 0 then + if aSumInt = CurrentValue then + CurrentPriority := 4; + end + else if Pos('-', Condition) > 0 then + begin + Parts := TStringList.Create; + try + Parts.Delimiter := '-'; + Parts.StrictDelimiter := True; + Parts.DelimitedText := Condition; + if Parts.Count = 2 then begin - if Pos('<', Condition) = 0 then + MinVal := StrToIntDef(Trim(Parts[0]), 0); + MaxVal := StrToIntDef(Trim(Parts[1]), 0); + if (aSumInt >= MinVal) and (aSumInt <= MaxVal) then begin - // Точное значение - CurrentValue := StrToIntDef(Condition, -1); - if aSumInt = CurrentValue then - CurrentPriority := 4; + CurrentPriority := 3; + CurrentValue := MinVal; end; end; + finally + Parts.Free; end; - - if CurrentPriority = -1 then - begin - if Pos('-', Condition) > 0 then - begin - // Диапазон - Parts := tstringlist.Create; - try - Parts.Delimiter := '-'; - Parts.StrictDelimiter := True; - Parts.DelimitedText := Condition; - if Parts.Count = 2 then - begin - MinVal := StrToIntDef(Trim(Parts[0]), 0); - MaxVal := StrToIntDef(Trim(Parts[1]), 0); - if (aSumInt >= MinVal) and (aSumInt <= MaxVal) then - begin - CurrentPriority := 3; - CurrentValue := MinVal; // Приоритет по MinVal - end; - end; - finally - Parts.Free; - end; - end - else if Pos('>', Condition) > 0 then - begin - // Условие ">X" - CurrentValue := - StrToIntDef(Trim(StringReplace(Condition, '>', '', - [rfReplaceAll])), 0); - if aSumInt >= CurrentValue then - CurrentPriority := 2; - end - else if Pos('<', Condition) > 0 then - begin - // Условие " -1 then - begin - // Определение наилучшего условия - if (CurrentPriority > BestPriority) or (CurrentPriority = BestPriority) - and ((CurrentPriority = 3) and (CurrentValue > BestValue) or - (CurrentPriority = 2) and (CurrentValue > BestValue) or - (CurrentPriority = 1) and (CurrentValue < BestValue)) then - begin - BestPriority := CurrentPriority; - BestValue := CurrentValue; - BestRow := i; - notify := ListEvents[i]; - end; - end; - if BestRow = -1 then - Break; - - end; - end; - if BestRow = -1 then - exit; - sm := TSongMachine.Create; - try - myAction := ListEvents[i].Action; - case myAction of - 0: - begin // нажать кнопку - toLog(0, 'OnDonate', 'Симуляция нажатия: ' + ListEvents[i].Param); - kePoints.SimulateKeyPress(ListEvents[i].Param, 500); - end; - 1: - begin // воспроизведение звука - toLog(0, 'OnDonate', 'Воспроизведение звука: ' + ListEvents[i].Param); - sm.PlayPublic(ListEvents[i].Param, '100'); - end; - 2: - begin // Kandinsky - toLog(0, 'OnDonate', 'Генерация Kandinsky для: ' + aNick); - Kandinsky.generate(aMessage, aNick); - end; - 4: - begin // Написать в чат - - toLog(0, 'OnDonate', 'Написать в чат: ' + aNick); - end; - 5: - begin // запуск файла - toLog(0, 'OnDonate', 'Запуск файла: ' + ListEvents[i].Param); - ShellExecute(0, 'open', pwidechar(ListEvents[i].Param), nil, nil, 0); - end; + end + else if (Condition.StartsWith('>')) then + begin + CurrentValue := StrToIntDef(Copy(Condition, 2), 0); + if aSumInt >= CurrentValue then + CurrentPriority := 2; + end + else if (Condition.StartsWith('<')) then + begin + CurrentValue := StrToIntDef(Copy(Condition, 2), 0); + if aSumInt <= CurrentValue then + CurrentPriority := 1; end; - finally - sm.Free; + if (CurrentPriority <> -1) and + ((CurrentPriority > BestPriority) or + ((CurrentPriority = BestPriority) and + (((CurrentPriority in [2,3]) and (CurrentValue > BestValue)) or + ((CurrentPriority = 1) and (CurrentValue < BestValue))))) then + begin + BestPriority := CurrentPriority; + BestValue := CurrentValue; + BestRow := i; + end; end; + + if BestRow <> -1 then + ExecuteAction(ListEvents[BestRow].Action, ListEvents[BestRow].Param, aMessage, aNick, aNick); end; -procedure TfrEvents.toLog(aCode: integer; aMethod, aMess: string); -begin - TTW_Bot.toLog('fEvents', aMethod, aMess, aCode); -end; + procedure TfrEvents.UpdateGrid; var @@ -372,11 +281,9 @@ var begin sgEvents.BeginUpdate; try - sgEvents.RowCount := 0; // Сбрасываем строки (оставляем только заголовки) - + sgEvents.RowCount := Length(ListEvents); for i := 0 to High(ListEvents) do begin - sgEvents.RowCount := i + 1; sgEvents.Cells[0, i] := cbEventList.Items[ListEvents[i].Event]; sgEvents.Cells[1, i] := ListEvents[i].Condition; sgEvents.Cells[2, i] := cbActions.Items[ListEvents[i].Action]; @@ -387,4 +294,10 @@ begin end; end; +procedure TfrEvents.toLog(aCode: integer; aMethod, aMess: string); +begin + TTW_Bot.toLog('fEvents', aMethod, aMess, aCode); +end; + end. + diff --git a/frames/fOBS.fmx b/frames/fOBS.fmx index 56c193e..f934fdc 100644 --- a/frames/fOBS.fmx +++ b/frames/fOBS.fmx @@ -14,8 +14,8 @@ object frOBS: TfrOBS RowCount = 0 Options = [ColumnResize, ColumnMove, ColLines, RowLines, Tabs, Header, HeaderClick, AutoDisplacement] OnCellDblClick = sgWebChatsCellDblClick - Viewport.Width = 685.000000000000000000 - Viewport.Height = 164.000000000000000000 + Viewport.Width = 689.000000000000000000 + Viewport.Height = 189.000000000000000000 object IntegerColumn1: TIntegerColumn Header = #1055#1086#1088#1090 HeaderSettings.TextSettings.WordWrap = False diff --git a/frames/fOBS.pas b/frames/fOBS.pas index 89c4d87..3939901 100644 --- a/frames/fOBS.pas +++ b/frames/fOBS.pas @@ -5,11 +5,12 @@ interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, uCustomEmoties, System.Variants, uWebServerChat, uWebServerEvents, fColorSettings, - System.Generics.Collections, + fFontSettings, + System.Generics.Collections, uWebServerKandinsky, 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, fFontSettings, System.Character; + System.Generics.Defaults, System.Character; type TChatWebServers = record @@ -31,10 +32,17 @@ type type TEventWebServers = record port: integer; + typeEvent: integer; se: TStyleEvent; WebServerChat: TTTW_Events; end; +type + TKandinskyWebServers = record + port: integer; + WebServerKandinsky: TKandinsky_Web; + end; + type TfrOBS = class(TFrame) sgWebChats: TStringGrid; @@ -71,11 +79,12 @@ type ChatEmotes: Tlist; ChatWebServers: Tlist; EventWebServers: Tlist; + KandinskyWebServers: Tlist; procedure MsgToWebServer(const aRecord: TTwitchChatMessage); - procedure toEventWebServer(CustomReward: TFollowEvent); overload; // follow - procedure toEventWebServer(CustomReward: TSubEvent); overload; // sub - procedure toEventWebServer(CustomReward: TRaidEvent); overload; // raid - procedure toEventWebServer(CustomReward: TGiftEvent); overload; // gift + 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); @@ -91,7 +100,7 @@ type procedure AddKandinsky(newRecord: TOBSKandinsky); procedure DelKandinsky(aPort: integer); - + procedure CreateWebKandinsky(aRecord: TOBSKandinsky); end; implementation @@ -290,6 +299,7 @@ begin SetLength(listChats, Length(listChats) + 1); listChats[High(listChats)] := newRecord; UpdateGridFromArray; + db.SaveRecordArray('listChats', listChats); CreateWebChat(newRecord); end; @@ -300,6 +310,7 @@ begin listKandinsky[High(listKandinsky)] := newRecord; UpdateGridFromArray; db.SaveRecordArray('listKandinsky', listKandinsky); + CreateWebKandinsky(newRecord); end; procedure TfrOBS.AddNotify(newRecord: TOBSNotify); @@ -308,7 +319,7 @@ begin listNotify[High(listNotify)] := newRecord; UpdateGridFromArray; db.SaveRecordArray('listNotify', listNotify); - CreateWebEvents(newRecord); + CreateWebEvents(newRecord); end; procedure TfrOBS.btnCreateOBSChatClick(Sender: TObject); @@ -383,12 +394,10 @@ var procedure LoadFontList(const mySL: tstringlist); var SearchRec: TSearchRec; - n: integer; begin if not DirectoryExists(myConst.fontsPath) then CreateDir(myConst.fontsPath); - n := 1; if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*', faArchive, SearchRec) = 0 then try @@ -396,7 +405,6 @@ var if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then begin mySL.Add(SearchRec.name); - Inc(n); end; until FindNext(SearchRec) <> 0; finally @@ -448,12 +456,9 @@ var procedure LoadFontList(const mySL: tstringlist); var SearchRec: TSearchRec; - n: integer; begin if not DirectoryExists(myConst.fontsPath) then CreateDir(myConst.fontsPath); - - n := 1; if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*', faArchive, SearchRec) = 0 then try @@ -461,7 +466,6 @@ var if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then begin mySL.Add(SearchRec.name); - Inc(n); end; until FindNext(SearchRec) <> 0; finally @@ -470,24 +474,37 @@ var 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 + 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 := '.'; + // Устанавливаем точку в качестве десятичного разделителя + FS := TFormatSettings.Create; + FS.DecimalSeparator := '.'; - result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS); -end; + 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; @@ -495,25 +512,25 @@ begin t := TfrFontSettings.Create(self); try LoadFontList(fonts); - EventWebServer.WebServerChat := TTTW_Events.Create(fonts,eventsSettings.port); + EventWebServer.WebServerChat := TTTW_Events.Create(fonts, + eventsSettings.port); EventWebServer.port := eventsSettings.port; - - 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:= t.cbFontStyleDefault.Items[eventsSettings.HeaderStyleFont]; - EventWebServer.se.FontTitle.Size:=eventsSettings.HeaderSizeFont; - EventWebServer.se.FontTitle.Color:=t.ccbFontColor.Items[eventsSettings.HeaderColorFont]; - EventWebServer.se.FontContext.Font:= t.cbFontStyleDefault.Items[eventsSettings.MessStyleFont]; - EventWebServer.se.FontContext.Size:=eventsSettings.MessSizeFont; - EventWebServer.se.FontContext.Color:=t.ccbFontColor.Items[eventsSettings.MessColorFont]; - EventWebServer.se.BorderColor:=f.ccbStyleBorderColor.Items[eventsSettings.ColorBorder]; - EventWebServer.se.BorderSize:=eventsSettings.SolidBorder; - EventWebServer.se.BlockColor:=GetColorFromColorPanel(f.cpStyleBlockColor.Color); - + 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 @@ -523,6 +540,20 @@ begin end; 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; @@ -566,6 +597,9 @@ begin Break; end; end; + KandinskyWebServers[i].WebServerKandinsky.ActiveServer(false); + KandinskyWebServers[i].WebServerKandinsky.Destroy; + KandinskyWebServers.Delete(i); UpdateGridFromArray; db.SaveRecordArray('listKandinsky', listKandinsky); end; @@ -588,7 +622,9 @@ begin Break; end; end; - + EventWebServers[i].WebServerChat.ActiveServer(false); + EventWebServers[i].WebServerChat.Destroy; + EventWebServers.Delete(i); UpdateGridFromArray; db.SaveRecordArray('listNotify', listNotify); end; @@ -654,12 +690,36 @@ end; procedure TfrOBS.EdtNotify(newRecord: TOBSNotify; oldPort: integer); var - i: integer; + 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; UpdateGridFromArray; db.SaveRecordArray('listNotify', listNotify); Break; @@ -716,342 +776,105 @@ begin end; end; -procedure TfrOBS.toEventWebServer(CustomReward: TFollowEvent); +{ + 0 Отслеживание + 1 Подписка + 2 Подарочная подписка + 3 Рейд + 4 Донат + 5 Свое + +} + +procedure TfrOBS.toEventWebServer(aEvent: TFollowEvent); var - se: TStyleEvent; - i, j: integer; - f: TfrColorSettings; - t: TfrFontSettings; - notify: TOBSNotify; + i: integer; + ws: TEventWebServers; begin - f := TfrColorSettings.Create(self); - t := TfrFontSettings.Create(self); - try - for i := 0 to high(listNotify) do + TTW_Bot.toLog('fOBS', 'toEventWebServer', 'Получено событие Follow', 0); + for i := 0 to EventWebServers.Count - 1 do + begin + if EventWebServers[i].typeEvent = 0 then begin - if listNotify[i].TypeEvent = 0 then - begin - notify := listNotify[i]; - se.Title := notify.HeaderText; - se.Title := StringReplace(se.Title, '[NICK]', - CustomReward.event.user_name, [rfReplaceAll]); - se.Context := notify.MessText; - se.Url := notify.Picture; - se.SoundURL := notify.Sound; - se.Timestamp := Now; - se.TimeMsg := notify.TimeMess; - se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder]; - se.BorderSize := notify.SolidBorder; - se.BlockColor := notify.ColorBlock; - se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont]; - se.FontTitle.Size := notify.HeaderSizeFont; - se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont]; - se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont]; - se.FontContext.Size := notify.MessSizeFont; - se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont]; - se.RequireInteraction := True; - for j := 0 to EventWebServers.Count - 1 do - begin - EventWebServers[j].WebServerChat.AddMessage(se); - end; - end; - + 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; - - finally - f.Free; - t.Free; end; end; -procedure TfrOBS.toEventWebServer(CustomReward: TSubEvent); +procedure TfrOBS.toEventWebServer(aEvent: TSubEvent); var - se: TStyleEvent; - i, j: integer; - f: TfrColorSettings; - t: TfrFontSettings; - notify: TOBSNotify; + i: integer; + ws: TEventWebServers; begin - f := TfrColorSettings.Create(self); - t := TfrFontSettings.Create(self); - try - for i := 0 to high(listNotify) do - begin - if listNotify[i].TypeEvent = 1 then - begin - notify := listNotify[i]; - se.Title := notify.HeaderText; - se.Title := StringReplace(se.Title, '[NICK]', - CustomReward.event.user_name, [rfReplaceAll]); - se.Context := notify.MessText; - - se.Url := notify.Picture; - se.SoundURL := notify.Sound; - se.Timestamp := Now; - se.TimeMsg := notify.TimeMess; - se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder]; - se.BorderSize := notify.SolidBorder; - se.BlockColor := notify.ColorBlock; - se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont]; - se.FontTitle.Size := notify.HeaderSizeFont; - se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont]; - se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont]; - se.FontContext.Size := notify.MessSizeFont; - se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont]; - se.RequireInteraction := True; - for j := 0 to EventWebServers.Count - 1 do - begin - EventWebServers[j].WebServerChat.AddMessage(se); - end; - end; - - end; - - finally - f.Free; - t.Free; + 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; end; -procedure TfrOBS.toEventWebServer(CustomReward: TRaidEvent); +procedure TfrOBS.toEventWebServer(aEvent: TRaidEvent); var - se: TStyleEvent; - i, j: integer; - f: TfrColorSettings; - t: TfrFontSettings; - notify: TOBSNotify; + i: integer; + ws: TEventWebServers; begin - f := TfrColorSettings.Create(self); - t := TfrFontSettings.Create(self); - try - for i := 0 to high(listNotify) do - begin - if listNotify[i].TypeEvent = 3 then - begin - notify := listNotify[i]; - se.Title := notify.HeaderText; - se.Title := StringReplace(se.Title, '[NICK]', - CustomReward.event.from_broadcaster_user_name, [rfReplaceAll]); - se.Context := notify.MessText; - se.Context := StringReplace(se.Context, '[SUM]', - inttostr(CustomReward.event.viewers), [rfReplaceAll]); - se.Url := notify.Picture; - se.SoundURL := notify.Sound; - se.Timestamp := Now; - se.TimeMsg := notify.TimeMess; - se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder]; - se.BorderSize := notify.SolidBorder; - se.BlockColor := notify.ColorBlock; - se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont]; - se.FontTitle.Size := notify.HeaderSizeFont; - se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont]; - se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont]; - se.FontContext.Size := notify.MessSizeFont; - se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont]; - se.RequireInteraction := True; - for j := 0 to EventWebServers.Count - 1 do - begin - EventWebServers[j].WebServerChat.AddMessage(se); - end; - end; - - end; - - finally - f.Free; - t.Free; + 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; end; -procedure TfrOBS.toEventWebServer(CustomReward: TGiftEvent); +procedure TfrOBS.toEventWebServer(aEvent: TGiftEvent); var - se: TStyleEvent; - i, j: integer; - f: TfrColorSettings; - t: TfrFontSettings; - notify: TOBSNotify; + i: integer; + ws: TEventWebServers; begin - f := TfrColorSettings.Create(self); - t := TfrFontSettings.Create(self); - try - for i := 0 to high(listNotify) do - begin - if listNotify[i].TypeEvent = 2 then - begin - notify := listNotify[i]; - se.Title := notify.HeaderText; - se.Title := StringReplace(se.Title, '[NICK]', - CustomReward.event.user_name, [rfReplaceAll]); - se.Context := notify.MessText; - se.Url := notify.Picture; - se.SoundURL := notify.Sound; - se.Timestamp := Now; - se.TimeMsg := notify.TimeMess; - se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder]; - se.BorderSize := notify.SolidBorder; - se.BlockColor := notify.ColorBlock; - se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont]; - se.FontTitle.Size := notify.HeaderSizeFont; - se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont]; - se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont]; - se.FontContext.Size := notify.MessSizeFont; - se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont]; - se.RequireInteraction := True; - for j := 0 to EventWebServers.Count - 1 do - begin - EventWebServers[j].WebServerChat.AddMessage(se); - end; - end; - - end; - - finally - f.Free; - t.Free; + 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; - end; procedure TfrOBS.toEventWebServer(aNick, aSum, aText: string); var - i, j: integer; - aSumInt: integer; - BestRow: integer; - BestPriority: integer; - BestValue: integer; - Condition: string; - CurrentPriority: integer; - CurrentValue: integer; - MinVal, MaxVal: integer; - Parts: tstringlist; - se: TStyleEvent; - notify: TOBSNotify; - f: TfrColorSettings; - t: TfrFontSettings; + i: integer; + ws: TEventWebServers; begin - aSumInt := StrToIntDef(aSum, 0); - BestRow := -1; - BestPriority := -1; - BestValue := 0; - - for i := 0 to high(listNotify) do + for i := 0 to EventWebServers.Count - 1 do begin - if listNotify[i].TypeEvent = 4 then - begin - Condition := Trim(listNotify[i].TypeEdit); - - if Condition = '' then - Continue; - - CurrentPriority := -1; - CurrentValue := 0; - - // Проверка на точное значение - if Pos('-', Condition) = 0 then - begin - if Pos('>', Condition) = 0 then - begin - if Pos('<', Condition) = 0 then - begin - // Точное значение - CurrentValue := StrToIntDef(Condition, -1); - if aSumInt = CurrentValue then - CurrentPriority := 4; - end; - end; - end; - - if CurrentPriority = -1 then - begin - if Pos('-', Condition) > 0 then - begin - // Диапазон - Parts := tstringlist.Create; - try - Parts.Delimiter := '-'; - Parts.StrictDelimiter := True; - Parts.DelimitedText := Condition; - if Parts.Count = 2 then - begin - MinVal := StrToIntDef(Trim(Parts[0]), 0); - MaxVal := StrToIntDef(Trim(Parts[1]), 0); - if (aSumInt >= MinVal) and (aSumInt <= MaxVal) then - begin - CurrentPriority := 3; - CurrentValue := MinVal; // Приоритет по MinVal - end; - end; - finally - Parts.Free; - end; - end - else if Pos('>', Condition) > 0 then - begin - // Условие ">X" - CurrentValue := - StrToIntDef(Trim(StringReplace(Condition, '>', '', - [rfReplaceAll])), 0); - if aSumInt >= CurrentValue then - CurrentPriority := 2; - end - else if Pos('<', Condition) > 0 then - begin - // Условие " -1 then - begin - // Определение наилучшего условия - if (CurrentPriority > BestPriority) or (CurrentPriority = BestPriority) - and ((CurrentPriority = 3) and (CurrentValue > BestValue) or - (CurrentPriority = 2) and (CurrentValue > BestValue) or - (CurrentPriority = 1) and (CurrentValue < BestValue)) then - begin - BestPriority := CurrentPriority; - BestValue := CurrentValue; - BestRow := i; - notify := listNotify[i]; - end; - end; - if BestRow = -1 then - Break; - - f := TfrColorSettings.Create(self); - t := TfrFontSettings.Create(self); - try - se.Title := notify.HeaderText; - se.Title := StringReplace(se.Title, '[NICK]', aNick, [rfReplaceAll]); - se.Title := StringReplace(se.Title, '[SUM]', aSum, [rfReplaceAll]); - se.Context := aText; - se.Url := notify.Picture; - se.SoundURL := notify.Sound; - se.Timestamp := Now; - se.TimeMsg := notify.TimeMess; - se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder]; - se.BorderSize := notify.SolidBorder; - se.BlockColor := notify.ColorBlock; - se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont]; - se.FontTitle.Size := notify.HeaderSizeFont; - se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont]; - se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont]; - se.FontContext.Size := notify.MessSizeFont; - se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont]; - se.RequireInteraction := True; - finally - f.Free; - t.Free; - end; - for j := 0 to EventWebServers.Count - 1 do - begin - EventWebServers[j].WebServerChat.AddMessage(se); - end; - end; + 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; diff --git a/frames/fRevards.fmx b/frames/fRevards.fmx new file mode 100644 index 0000000..9a16d0e --- /dev/null +++ b/frames/fRevards.fmx @@ -0,0 +1,109 @@ +object frRevards: TfrRevards + Size.Width = 613.000000000000000000 + Size.Height = 339.000000000000000000 + Size.PlatformDefault = False + object Label1: TLabel + Position.X = 8.000000000000000000 + Position.Y = 118.000000000000000000 + Text = #1053#1072#1075#1088#1072#1076#1099' '#1073#1086#1090#1072 + TabOrder = 0 + end + object StringGrid1: TStringGrid + Align = Bottom + CanFocus = True + ClipChildren = True + Position.Y = 143.000000000000000000 + Size.Width = 613.000000000000000000 + Size.Height = 196.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Viewport.Width = 613.000000000000000000 + Viewport.Height = 196.000000000000000000 + object StringColumn1: TStringColumn + Header = #1053#1072#1079#1074#1072#1085#1080#1077 + HeaderSettings.TextSettings.WordWrap = False + Size.Width = 241.000000000000000000 + end + object StringColumn2: TStringColumn + Header = #1055#1086#1083#1100#1079#1086#1074#1072#1090#1077#1083#1100#1089#1082#1080#1081' '#1074#1074#1086#1076 + HeaderSettings.TextSettings.WordWrap = False + Size.Width = 140.000000000000000000 + end + object StringColumn3: TStringColumn + Header = #1054#1087#1080#1089#1072#1085#1080#1077 + HeaderSettings.TextSettings.WordWrap = False + end + object StringColumn4: TStringColumn + Header = #1062#1077#1085#1072 + HeaderSettings.TextSettings.WordWrap = False + end + end + object Label34: TLabel + Position.X = 8.000000000000000000 + Position.Y = 8.000000000000000000 + TextSettings.Trimming = None + Text = #1053#1072#1079#1074#1072#1085#1080#1077 + TabOrder = 4 + end + object ceCustomRevardTitle: TComboEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 5 + ItemHeight = 19.000000000000000000 + ItemIndex = -1 + Position.X = 8.000000000000000000 + Position.Y = 33.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + end + object edtCustomRevardPrompt: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 9 + Position.X = 198.000000000000000000 + Position.Y = 33.000000000000000000 + Size.Width = 348.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + end + object nbCustomRevardCost: TNumberBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 7 + Cursor = crIBeam + Max = 1000000.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 88.000000000000000000 + Size.Width = 79.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + end + object Label35: TLabel + Position.X = 8.000000000000000000 + Position.Y = 63.000000000000000000 + Size.Width = 57.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = #1062#1077#1085#1072 + TabOrder = 6 + end + object Label2: TLabel + Position.X = 198.000000000000000000 + Position.Y = 8.000000000000000000 + Text = #1054#1087#1080#1089#1072#1085#1080#1077 + TabOrder = 10 + end + object btnAddCustomRewards: TButton + Position.X = 95.000000000000000000 + Position.Y = 88.000000000000000000 + TabOrder = 16 + Text = #1044#1086#1073#1072#1074#1080#1090#1100 + TextSettings.Trimming = None + end + object btnDelCustomRewards: TButton + Position.X = 183.000000000000000000 + Position.Y = 88.000000000000000000 + TabOrder = 17 + Text = #1059#1076#1072#1083#1080#1090#1100 + TextSettings.Trimming = None + end +end diff --git a/frames/fRevards.pas b/frames/fRevards.pas new file mode 100644 index 0000000..72a88bf --- /dev/null +++ b/frames/fRevards.pas @@ -0,0 +1,66 @@ +unit fRevards; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, + FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, + System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.ScrollBox, uRecords, System.Generics.Collections, + FMX.Controls.Presentation, FMX.EditBox, FMX.NumberBox, FMX.Edit, FMX.ComboEdit; + +type + TfrRevards = class(TFrame) + Label1: TLabel; + StringGrid1: TStringGrid; + StringColumn1: TStringColumn; + StringColumn2: TStringColumn; + StringColumn3: TStringColumn; + StringColumn4: TStringColumn; + Label34: TLabel; + ceCustomRevardTitle: TComboEdit; + edtCustomRevardPrompt: TEdit; + nbCustomRevardCost: TNumberBox; + Label35: TLabel; + Label2: TLabel; + btnDelCustomRewards: TButton; + btnAddCustomRewards: TButton; + private + { Private declarations } + public + { Public declarations } + + CustomRewards: TList; + listRevards:tarray; + procedure LoadCustomRevards; + procedure UpdateGrid; + end; + +implementation + +{$R *.fmx} + +uses ugeneral; + +procedure TfrRevards.LoadCustomRevards; +var + cr: TCustomRevards; +begin + CustomRewards.Clear; + TTW_Bot.frEvents1.cbRevards.Items.Clear; + ceCustomRevardTitle.items.Clear; + TTW_Bot.toLog('fRevards', 'LoadCustomRevards', 'Запрос наград с сервера', 3); + ttw_API.getCustomReward(CustomRewards); + + for cr in CustomRewards do + begin + TTW_Bot.frEvents1.cbRevards.Items.Add(cr.Title); + ceCustomRevardTitle.Items.Add(cr.Title); + end; +end; + +procedure TfrRevards.UpdateGrid; +begin + +end; + +end. diff --git a/utils/uRecords.pas b/utils/uRecords.pas index 6e6b53a..80d79d5 100644 --- a/utils/uRecords.pas +++ b/utils/uRecords.pas @@ -3,29 +3,11 @@ unit uRecords; interface type -TEventGlobal = record - Event:integer; - Condition:string; - Action:integer; - Param:string; -end; - - -type - TRLog = record - rTime: ttime; - rType: string; - rModule: string; - rMethod: string; - rMessage: string; - end; - -type - TCounter = record - counterName: string; - trigger: string; - count: integer; - auto: integer; + TEventGlobal = record + Event: integer; + Condition: string; + Action: integer; + Param: string; end; type @@ -33,19 +15,6 @@ type regexp: string; end; -type - TListTimer = record - Enable: integer; - interval: integer; - o: integer; - mess: string; - end; - -type - TOBSKandinsky = record - port: integer; - end; - type TOBSNotify = record Picture: string; @@ -54,18 +23,18 @@ type ColorBlock: string; SolidBorder: integer; Paddings: integer; - ColorBorder: integer; - ColorBackground: integer; + ColorBorder: string; + ColorBackground: string; HeaderText: string; - HeaderColorFont: integer; + HeaderColorFont: string; HeaderSizeFont: integer; - HeaderStyleFont: integer; + HeaderStyleFont: string; MessText: string; - MessColorFont: integer; + MessColorFont: string; MessSizeFont: integer; - MessStyleFont: integer; + MessStyleFont: string; TimeMess: integer; TypeEvent: integer; @@ -86,10 +55,37 @@ type MaxCountMess: integer; TimeMess: integer; port: integer; - freez:integer; + freez: integer; StyleFont: integer; end; +type + TListCommands = record + R1: string; + R2: string; + end; + +type + TCounter = record + counterName: string; + trigger: string; + count: integer; + auto: integer; + end; + +type + TListTimer = record + Enable: integer; + interval: integer; + o: integer; + mess: string; + end; + +type + TOBSKandinsky = record + port: integer; + end; + type TRandomCounters = record rndName: string; @@ -98,9 +94,12 @@ type end; type - TListCommands = record - R1: string; - R2: string; + TRLog = record + rTime: ttime; + rType: string; + rModule: string; + rMethod: string; + rMessage: string; end; type @@ -270,7 +269,7 @@ type format: TArray; scale: TArray; theme_mode: TArray; - topImage:string; + topImage: string; end; TStyleChat = record @@ -342,7 +341,7 @@ type version: string; status: string; cost: integer; - condition: TCondition; + Condition: TCondition; transport: TTransport; created_at: string; end; @@ -383,7 +382,7 @@ type TCustomRewardEvent = record subscription: TSubscriptionPoints; - event: TEventReward; + Event: TEventReward; end; TMetadata = record @@ -455,22 +454,22 @@ type TFollowEvent = record subscription: TSubscriptionPoints; - event: TEventFollow; + Event: TEventFollow; end; TSubEvent = record subscription: TSubscriptionPoints; - event: TEventSub; + Event: TEventSub; end; TGiftEvent = record subscription: TSubscriptionPoints; - event: TEventGift; + Event: TEventGift; end; TRaidEvent = record subscription: TSubscriptionPoints; - event: TEventRaid; + Event: TEventRaid; end; TBotAppCfg = record diff --git a/utils/uWebServerEvents.pas b/utils/uWebServerEvents.pas index 3cbdbee..604dc90 100644 --- a/utils/uWebServerEvents.pas +++ b/utils/uWebServerEvents.pas @@ -17,13 +17,14 @@ type FCriticalSection: TCriticalSection; procedure IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); - procedure ProcessFileRequest(ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo; const Folder: string); + procedure ProcessFileRequest(ARequestInfo: TIdHTTPRequestInfo; + AResponseInfo: TIdHTTPResponseInfo; const Folder: string); function GenerateHTML: string; function GenerateJSON: string; procedure CleanupOldMessages; public IdHTTPServer1: TIdHTTPServer; - constructor Create(FontList: TStrings; aPort:integer); + constructor Create(FontList: TStrings; aPort: integer); destructor Destroy; override; procedure addMessage(newMsg: TStyleEvent); procedure ActiveServer(aEn: boolean); @@ -35,9 +36,9 @@ uses ugeneral; { TTTW_Events } -constructor TTTW_Events.Create(FontList: TStrings; aPort:integer); +constructor TTTW_Events.Create(FontList: TStrings; aPort: integer); var - I: Integer; + I: integer; begin FCriticalSection := TCriticalSection.Create; FMessages := TList.Create; @@ -71,27 +72,19 @@ end; procedure TTTW_Events.CleanupOldMessages; var - I: Integer; + I: integer; TimeNow: TDateTime; begin TimeNow := Now; - FCriticalSection.Enter; - try - for I := FMessages.Count - 1 downto 0 do - begin - if SecondsBetween(TimeNow, FMessages[I].Timestamp) >= FMessages[I].TimeMsg then - FMessages.Delete(I); - end; - finally - FCriticalSection.Leave; - end; + for I := FMessages.Count - 1 downto 0 do + if SecondsBetween(TimeNow, FMessages[I].Timestamp) >= FMessages[I].TimeMsg + then + FMessages.Delete(I); end; - - function TTTW_Events.GenerateHTML: string; var - I: Integer; + I: integer; s, s1: string; begin // Генерация CSS для шрифтов @@ -99,126 +92,82 @@ begin for I := 41 to fFontsList.Count - 1 do begin s1 := StringReplace(fFontsList[I], '.ttf', '', [rfReplaceAll]); - s := s + Format('@font-face { font-family: ''%s''; src: url(fonts/%s); }', [s1, fFontsList[I]]) + #13#10; + s := s + Format('@font-face { font-family: ''%s''; src: url(fonts/%s); }', + [s1, fFontsList[I]]) + #13#10; end; Result := '' + - '' + - '' + - '' + - 'Twitch Messages' + - '' + - '' + + 'setInterval(fetchMessages, 1000);' + 'fetchMessages();' + '' + - '' + - '' + - '
' + + '' + '' + '
' + ''; end; @@ -226,55 +175,49 @@ end; function TTTW_Events.GenerateJSON: string; var JSONArray: TJSONArray; - I: Integer; S,S1:STRING; + I: Integer; Msg: TStyleEvent; begin JSONArray := TJSONArray.Create; try - FCriticalSection.Enter; - try - CleanupOldMessages; - for I := 0 to FMessages.Count - 1 do - begin - Msg := FMessages[I]; - s:=StringReplace(Msg.FontTitle.Font,'.ttf','',[rfReplaceAll]); - s1:=StringReplace(Msg.FontContext.Font,'.ttf','',[rfReplaceAll]); + FCriticalSection.Enter; + try + for I := 0 to FMessages.Count - 1 do + begin + Msg := FMessages[I]; - JSONArray.AddElement(TJSONObject.Create - .AddPair('nickname', Msg.Title) - .AddPair('url', Msg.Url) - .AddPair('content', Msg.Context) - .AddPair('timestamp', TJSONNumber.Create(DateTimeToUnix(Msg.Timestamp))) - .AddPair('sound', Msg.SoundURL) - .AddPair('duration', Msg.TimeMsg) - - .AddPair('color', Msg.BlockColor) - .AddPair('colorBorder', Msg.BorderColor) - .AddPair('sizeBorder', TJSONNumber.Create(Msg.BorderSize)) - .AddPair('fontSize', TJSONNumber.Create(Msg.FontTitle.size)) - - .AddPair('titlecolor', Msg.FontTitle.Color) - .AddPair('titlefamily', s) - .AddPair('titleSize', TJSONNumber.Create(Msg.FontTitle.Size)) - .AddPair('contentcolor', Msg.FontContext.Color) - .AddPair('contentfamily', s1) - .AddPair('contentSize', TJSONNumber.Create(Msg.FontContext.Size)) - - - ); // Фиксированный размер текста + JSONArray.AddElement( + TJSONObject.Create + .AddPair('nickname', Msg.Title) + .AddPair('url', Msg.Url) + .AddPair('content', Msg.Context) + .AddPair('timestamp', TJSONNumber.Create(DateTimeToUnix(Msg.Timestamp))) + .AddPair('sound', Msg.SoundURL) + .AddPair('duration', Msg.TimeMsg) + .AddPair('color', Msg.BlockColor) + .AddPair('colorBorder', Msg.BorderColor) + .AddPair('sizeBorder', TJSONNumber.Create(Msg.BorderSize)) + .AddPair('fontSize', TJSONNumber.Create(Msg.FontTitle.Size)) + .AddPair('titlecolor', Msg.FontTitle.Color) + .AddPair('titlefamily', TPath.GetFileNameWithoutExtension(Msg.FontTitle.Font)) + .AddPair('titleSize', TJSONNumber.Create(Msg.FontTitle.Size)) + .AddPair('contentcolor', Msg.FontContext.Color) + .AddPair('contentfamily', TPath.GetFileNameWithoutExtension(Msg.FontContext.Font)) + .AddPair('contentSize', TJSONNumber.Create(Msg.FontContext.Size)) + ); + end; + finally + FCriticalSection.Leave; end; - finally - FCriticalSection.Leave; - end; - Result := JSONArray.ToString; + Result := JSONArray.ToString; finally - JSONArray.Free; + JSONArray.Free; end; - end; -procedure TTTW_Events.ProcessFileRequest(ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo; const Folder: string); +procedure TTTW_Events.ProcessFileRequest(ARequestInfo: TIdHTTPRequestInfo; + AResponseInfo: TIdHTTPResponseInfo; const Folder: string); var FileName: string; FilePath: string; @@ -290,6 +233,7 @@ begin AResponseInfo.ContentStream := FS; AResponseInfo.ContentType := GetMIMETypeFromFile(FilePath);; AResponseInfo.ResponseNo := 200; + AResponseInfo.FreeContentStream := True; except FS.Free; AResponseInfo.ResponseNo := 500; diff --git a/utils/uWebServerKandinsky.pas b/utils/uWebServerKandinsky.pas index 0a53778..5807f1f 100644 --- a/utils/uWebServerKandinsky.pas +++ b/utils/uWebServerKandinsky.pas @@ -28,7 +28,7 @@ uses procedure GenerationError(Sender: TObject; const ErrorMessage: string); procedure GenerationUpdate(Sender: TObject; const Message: string); public - constructor Create(aKey:string; aSecret:string); + constructor Create(aKey:string; aSecret:string; aPort:integer); destructor Destroy; procedure generate(prompt:string; aNick:string); procedure ActiveServer(aEn: boolean); @@ -51,10 +51,10 @@ begin end; end; -constructor TKandinsky_Web.Create(aKey:string; aSecret:string); +constructor TKandinsky_Web.Create(aKey:string; aSecret:string; aPort:integer); begin IdHTTPServer1 := TIdHTTPServer.Create; - IdHTTPServer1.DefaultPort := 8087; + IdHTTPServer1.DefaultPort := aPort; IdHTTPServer1.OnCommandGet := IdHTTPServer1CommandGet; ka:=TFusionBrainAPI.Create(nil,aKey, aSecret); ka.OnGenerationDone := GenerationDone;