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
+
+
+ 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?
wt (!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;