исправил оповещения, теперь работают четко

This commit is contained in:
PC1\PTyTb
2025-08-16 22:42:29 +03:00
parent 2386d14b86
commit fd1c6b6bb8
17 changed files with 968 additions and 928 deletions
+2 -5
View File
@@ -93,7 +93,6 @@ function TTTW_API.createCustomReward(title: string; cost: string;
var var
RequestData: TStringStream; RequestData: TStringStream;
s, s1, json: string; s, s1, json: string;
i: integer;
cr: TCustomRevards; cr: TCustomRevards;
JSONData: TJSONObject; JSONData: TJSONObject;
JSONArray: TJSONArray; JSONArray: TJSONArray;
@@ -1041,9 +1040,9 @@ var
EmoteObj: TJSONObject; EmoteObj: TJSONObject;
ImagesObj: TJSONObject; ImagesObj: TJSONObject;
Emote: TEmotes; Emote: TEmotes;
I, J: Integer; I: Integer;
chosenFormat, chosenTheme, chosenScale: string; chosenFormat, chosenTheme, chosenScale: string;
foundAnimated, foundNonStatic, foundDark: Boolean; foundAnimated, foundDark: Boolean;
scaleVal, maxScale: Double; scaleVal, maxScale: Double;
s: string; s: string;
begin begin
@@ -1076,7 +1075,6 @@ begin
// Âûáîð ôîðìàòà (format) // Âûáîð ôîðìàòà (format)
foundAnimated := False; foundAnimated := False;
foundNonStatic := False;
chosenFormat := 'static'; // çíà÷åíèå ïî óìîë÷àíèþ chosenFormat := 'static'; // çíà÷åíèå ïî óìîë÷àíèþ
// Ïðîâåðêà íàëè÷èÿ "animated" // Ïðîâåðêà íàëè÷èÿ "animated"
@@ -1094,7 +1092,6 @@ begin
if s <> 'static' then if s <> 'static' then
begin begin
chosenFormat := s; chosenFormat := s;
foundNonStatic := True;
Break; Break;
end; end;
+2 -1
View File
@@ -47,7 +47,8 @@ uses
uWebServerKandinsky in 'utils\uWebServerKandinsky.pas', uWebServerKandinsky in 'utils\uWebServerKandinsky.pas',
uWebServerEvents in 'utils\uWebServerEvents.pas', uWebServerEvents in 'utils\uWebServerEvents.pas',
fEvents in 'frames\fEvents.pas' {frEvents: TFrame}, 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} {$R *.res}
+36 -2
View File
@@ -306,9 +306,12 @@
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_MajorVer>10</VerInfo_MajorVer> <VerInfo_MajorVer>10</VerInfo_MajorVer>
<VerInfo_MinorVer>1</VerInfo_MinorVer> <VerInfo_MinorVer>1</VerInfo_MinorVer>
<VerInfo_Release>1</VerInfo_Release> <VerInfo_Release>2</VerInfo_Release>
<VerInfo_Locale>1049</VerInfo_Locale> <VerInfo_Locale>1049</VerInfo_Locale>
<VerInfo_Keys>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=</VerInfo_Keys> <VerInfo_Keys>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=</VerInfo_Keys>
<Icon_MainIcon>TTW_Bot_app_Icon2.ico</Icon_MainIcon>
<UWP_DelphiLogo44>..\ttw_fmx_v9\fawico_44_2.png</UWP_DelphiLogo44>
<UWP_DelphiLogo150>..\ttw_fmx_v9\fawico_150_2.png</UWP_DelphiLogo150>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''"> <PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
@@ -438,6 +441,11 @@
<DesignClass>TFrame</DesignClass> <DesignClass>TFrame</DesignClass>
</DCCReference> </DCCReference>
<DCCReference Include="utils\uKeyEvent.pas"/> <DCCReference Include="utils\uKeyEvent.pas"/>
<DCCReference Include="frames\fRevards.pas">
<Form>frRevards</Form>
<FormType>fmx</FormType>
<DesignClass>TFrame</DesignClass>
</DCCReference>
<None Include=".gitignore"/> <None Include=".gitignore"/>
<BuildConfiguration Include="Base"> <BuildConfiguration Include="Base">
<Key>Base</Key> <Key>Base</Key>
@@ -487,6 +495,13 @@
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>
<DeployFile LocalName="..\ttw_fmx_v9\fawico_150_2.png" Configuration="Release" Class="UWP_DelphiLogo150">
<Platform Name="Win32">
<RemoteDir>Assets\</RemoteDir>
<RemoteName>Logo150x150.png</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="..\ttw_fmx_v9\fawico_44_2.png" Configuration="Debug" Class="UWP_DelphiLogo44"> <DeployFile LocalName="..\ttw_fmx_v9\fawico_44_2.png" Configuration="Debug" Class="UWP_DelphiLogo44">
<Platform Name="Win32"> <Platform Name="Win32">
<RemoteDir>Assets\</RemoteDir> <RemoteDir>Assets\</RemoteDir>
@@ -494,18 +509,37 @@
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>
<DeployFile LocalName="..\ttw_fmx_v9\fawico_44_2.png" Configuration="Release" Class="UWP_DelphiLogo44">
<Platform Name="Win32">
<RemoteDir>Assets\</RemoteDir>
<RemoteName>Logo44x44.png</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName=".gitignore" Configuration="Debug" Class="ProjectFile"> <DeployFile LocalName=".gitignore" Configuration="Debug" Class="ProjectFile">
<Platform Name="Win32"> <Platform Name="Win32">
<RemoteDir>.\</RemoteDir> <RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>
<DeployFile LocalName=".gitignore" Configuration="Release" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="Win32\Debug\TTW_Bot_app.exe" Configuration="Debug" Class="ProjectOutput"> <DeployFile LocalName="Win32\Debug\TTW_Bot_app.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32"> <Platform Name="Win32">
<RemoteName>TTW_Bot_app.exe</RemoteName> <RemoteName>TTW_Bot_app.exe</RemoteName>
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </DeployFile>
<DeployFile LocalName="Win32\Release\TTW_Bot_app.exe" Configuration="Release" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>TTW_Bot_app.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployClass Name="AdditionalDebugSymbols"> <DeployClass Name="AdditionalDebugSymbols">
<Platform Name="iOSSimulator"> <Platform Name="iOSSimulator">
<Operation>1</Operation> <Operation>1</Operation>
Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

+5
View File
@@ -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(
+7 -6
View File
@@ -146,7 +146,7 @@ object fCreateNotify: TfCreateNotify
Position.X = 8.000000000000000000 Position.X = 8.000000000000000000
Position.Y = 135.000000000000000000 Position.Y = 135.000000000000000000
Text = #1057#1086#1073#1099#1090#1080#1077 Text = #1057#1086#1073#1099#1090#1080#1077
TabOrder = 37 TabOrder = 38
end end
object cbEventsType: TComboBox object cbEventsType: TComboBox
Items.Strings = ( Items.Strings = (
@@ -154,13 +154,14 @@ object fCreateNotify: TfCreateNotify
#1055#1086#1076#1087#1080#1089#1082#1072 #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 #1055#1086#1076#1072#1088#1086#1095#1085#1072#1103' '#1087#1086#1076#1087#1080#1089#1082#1072
#1056#1077#1081#1076 #1056#1077#1081#1076
#1044#1086#1085#1072#1090) #1044#1086#1085#1072#1090
#1057#1074#1086#1077)
Position.X = 8.000000000000000000 Position.X = 8.000000000000000000
Position.Y = 160.000000000000000000 Position.Y = 160.000000000000000000
Size.Width = 192.000000000000000000 Size.Width = 192.000000000000000000
Size.Height = 22.000000000000000000 Size.Height = 22.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
TabOrder = 38 TabOrder = 39
OnChange = cbEventsTypeChange OnChange = cbEventsTypeChange
end end
object Label3: TLabel object Label3: TLabel
@@ -168,11 +169,11 @@ object fCreateNotify: TfCreateNotify
Position.Y = 190.000000000000000000 Position.Y = 190.000000000000000000
Text = #1059#1089#1083#1086#1074#1080#1077' '#1089#1091#1084#1084#1099 Text = #1059#1089#1083#1086#1074#1080#1077' '#1089#1091#1084#1084#1099
Visible = False Visible = False
TabOrder = 39 TabOrder = 40
end end
object edtIF: TEdit object edtIF: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap] Touch.InteractiveGestures = [LongTap, DoubleTap]
TabOrder = 40 TabOrder = 41
Position.X = 8.000000000000000000 Position.X = 8.000000000000000000
Position.Y = 215.000000000000000000 Position.Y = 215.000000000000000000
Size.Width = 192.000000000000000000 Size.Width = 192.000000000000000000
@@ -215,7 +216,7 @@ object fCreateNotify: TfCreateNotify
object edtESTitle: TEdit object edtESTitle: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap] Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Top 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 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.X = 10.000000000000000000
Position.Y = 20.000000000000000000 Position.Y = 20.000000000000000000
+93 -25
View File
@@ -4,7 +4,7 @@ interface
uses uses
System.SysUtils, System.Types, System.UITypes, System.Classes, 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, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, fFontSettings,
fColorSettings, FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation, fColorSettings, FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation,
FMX.ListBox, FMX.EditBox, FMX.SpinBox, FMX.Colors, uRecords; FMX.ListBox, FMX.EditBox, FMX.SpinBox, FMX.Colors, uRecords;
@@ -44,6 +44,9 @@ type
{ Private declarations } { Private declarations }
function GetColorFromColorPanel(aColor: TAlphaColor): string; function GetColorFromColorPanel(aColor: TAlphaColor): string;
function GetColorFromCCB(aColor: TAlphaColor): string; function GetColorFromCCB(aColor: TAlphaColor): string;
function GetColorFromRGBA(const s: string): TAlphaColor;
function GetColorFromHex(const s: string): TAlphaColor;
public public
{ Public declarations } { Public declarations }
isEdit: boolean; isEdit: boolean;
@@ -60,6 +63,33 @@ uses uGeneral;
{$R *.fmx} {$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; function TfCreateNotify.GetColorFromColorPanel(aColor: TAlphaColor): string;
var var
Color: TAlphaColor; Color: TAlphaColor;
@@ -80,6 +110,47 @@ begin
result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS); result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS);
end; 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); procedure TfCreateNotify.setRecord(aRec: TOBSNotify);
var var
SavedColor: TAlphaColor; SavedColor: TAlphaColor;
@@ -97,19 +168,21 @@ begin
fCreateNotify.frColorSettings1.sbStyleBlockBorderSize.Value := SolidBorder; fCreateNotify.frColorSettings1.sbStyleBlockBorderSize.Value := SolidBorder;
fCreateNotify.frColorSettings1.sbStyleBlockPadding.Value := Paddings; fCreateNotify.frColorSettings1.sbStyleBlockPadding.Value := Paddings;
fCreateNotify.frColorSettings1.ccbStyleBorderColor.ItemIndex := ColorBorder; fCreateNotify.frColorSettings1.ccbStyleBorderColor.Color := GetColorFromHex(ColorBorder);
fCreateNotify.frColorSettings1.ccbBColor.ItemIndex := ColorBackground; fCreateNotify.frColorSettings1.ccbBColor.Color := GetColorFromHex(ColorBackground);
fCreateNotify.frColorSettings1.cpStyleBlockColor.Color:=GetColorFromRGBA(ColorBlock);
fCreateNotify.edtESTitle.Text := HeaderText; fCreateNotify.edtESTitle.Text := HeaderText;
fCreateNotify.frFontSettings2.ccbFontColor.ItemIndex := HeaderColorFont; fCreateNotify.frFontSettings2.ccbFontColor.Color := GetColorFromHex(HeaderColorFont);
fCreateNotify.frFontSettings2.sbFontSize.Value := HeaderSizeFont; fCreateNotify.frFontSettings2.sbFontSize.Value := HeaderSizeFont;
fCreateNotify.frFontSettings2.cbFontStyleDefault.ItemIndex := fCreateNotify.frFontSettings2.cbFontStyleDefault.ItemIndex :=
HeaderStyleFont; fCreateNotify.frFontSettings2.cbFontStyleDefault.Items.IndexOf(HeaderStyleFont);
fCreateNotify.edtESMessage.Text := MessText; fCreateNotify.edtESMessage.Text := MessText;
fCreateNotify.frFontSettings3.ccbFontColor.ItemIndex := MessColorFont; fCreateNotify.frFontSettings3.ccbFontColor.Color := GetColorFromHex(MessColorFont);
fCreateNotify.frFontSettings3.sbFontSize.Value := MessSizeFont; 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.sbTimeMsg.Value := TimeMess;
fCreateNotify.cbEventsType.ItemIndex := TypeEvent; fCreateNotify.cbEventsType.ItemIndex := TypeEvent;
@@ -132,18 +205,18 @@ begin
(frColorSettings1.cpStyleBlockColor.Color); (frColorSettings1.cpStyleBlockColor.Color);
SolidBorder := round(frColorSettings1.sbStyleBlockBorderSize.Value); SolidBorder := round(frColorSettings1.sbStyleBlockBorderSize.Value);
Paddings := round(frColorSettings1.sbStyleBlockPadding.Value); Paddings := round(frColorSettings1.sbStyleBlockPadding.Value);
ColorBorder := frColorSettings1.ccbStyleBorderColor.ItemIndex; ColorBorder := GetColorFromCCB(frColorSettings1.ccbStyleBorderColor.Color);
ColorBackground := frColorSettings1.ccbBColor.ItemIndex; ColorBackground := GetColorFromCCB(frColorSettings1.ccbBColor.Color);
HeaderText := edtESTitle.Text; HeaderText := edtESTitle.Text;
HeaderColorFont := frFontSettings2.ccbFontColor.ItemIndex; HeaderColorFont := GetColorFromCCB(frFontSettings2.ccbFontColor.Color);
HeaderSizeFont := round(frFontSettings2.sbFontSize.Value); HeaderSizeFont := round(frFontSettings2.sbFontSize.Value);
HeaderStyleFont := frFontSettings2.cbFontStyleDefault.ItemIndex; HeaderStyleFont := frFontSettings2.cbFontStyleDefault.Text;
MessText := edtESMessage.Text; MessText := edtESMessage.Text;
MessColorFont := frFontSettings3.ccbFontColor.ItemIndex; MessColorFont := GetColorFromCCB(frFontSettings3.ccbFontColor.color);
MessSizeFont := round(frFontSettings3.sbFontSize.Value); MessSizeFont := round(frFontSettings3.sbFontSize.Value);
MessStyleFont := frFontSettings3.cbFontStyleDefault.ItemIndex; MessStyleFont := frFontSettings3.cbFontStyleDefault.Text;
TimeMess := round(sbTimeMsg.Value); TimeMess := round(sbTimeMsg.Value);
TypeEvent := cbEventsType.ItemIndex; 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); procedure TfCreateNotify.btnESTestClick(Sender: TObject);
var var
se: TStyleEvent; se: TStyleEvent;
i: Integer; i: Integer;
ws:TEventWebServers;
begin begin
se.Title := edtESTitle.Text; se.Title := edtESTitle.Text;
@@ -195,8 +259,12 @@ begin
se.RequireInteraction := True; se.RequireInteraction := True;
for i := 0 to TTW_Bot.frOBS1.EventWebServers.Count - 1 do for i := 0 to TTW_Bot.frOBS1.EventWebServers.Count - 1 do
begin 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; end;
ws.WebServerChat.addMessage(se);
end; end;
procedure TfCreateNotify.cbEventsTypeChange(Sender: TObject); procedure TfCreateNotify.cbEventsTypeChange(Sender: TObject);
+101 -45
View File
@@ -3,7 +3,7 @@ object TTW_Bot: TTTW_Bot
Top = 0 Top = 0
Caption = 'TTW_Bot' Caption = 'TTW_Bot'
ClientHeight = 886 ClientHeight = 886
ClientWidth = 970 ClientWidth = 1003
Position = Designed Position = Designed
FormFactor.Width = 320 FormFactor.Width = 320
FormFactor.Height = 480 FormFactor.Height = 480
@@ -15,30 +15,30 @@ object TTW_Bot: TTTW_Bot
object V: TTabControl object V: TTabControl
Align = Client Align = Client
Images = ImageList1 Images = ImageList1
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 744.000000000000000000 Size.Height = 744.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
TabIndex = 5 TabIndex = 3
TabOrder = 0 TabOrder = 0
TabPosition = PlatformDefault TabPosition = PlatformDefault
Sizes = ( Sizes = (
970s 1003s
718s 718s
970s 1003s
718s 718s
970s 1003s
718s 718s
970s 1003s
718s 718s
970s 1003s
718s 718s
970s 1003s
718s 718s
970s 1003s
718s 718s
970s 1003s
718s 718s
970s 1003s
718s) 718s)
object TabItem1: TTabItem object TabItem1: TTabItem
CustomIcon = < CustomIcon = <
@@ -57,7 +57,7 @@ object TTW_Bot: TTTW_Bot
ExplicitSize.cy = 26.000000000000000000 ExplicitSize.cy = 26.000000000000000000
inline frSettings1: TfrSettings inline frSettings1: TfrSettings
Align = Client Align = Client
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 718.000000000000000000 Size.Height = 718.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
inherited GroupBox3: TGroupBox inherited GroupBox3: TGroupBox
@@ -92,35 +92,35 @@ object TTW_Bot: TTTW_Bot
TabOrder = 34 TabOrder = 34
end end
inherited Label63: TLabel inherited Label63: TLabel
TabOrder = 30 TabOrder = 29
end end
inherited edtDAClientID: TEdit inherited edtDAClientID: TEdit
TabOrder = 32
end
inherited Label64: TLabel
TabOrder = 31 TabOrder = 31
end end
inherited edtDAClientSecret: TEdit inherited Label64: TLabel
TabOrder = 33 TabOrder = 30
end
inherited Label65: TLabel
TabOrder = 32
end end
inherited edtDARedirectURL: TEdit inherited edtDARedirectURL: TEdit
TabOrder = 40 TabOrder = 37
end end
inherited edtDACode: TEdit inherited edtDACode: TEdit
TabOrder = 36 TabOrder = 35
end end
inherited Label66: TLabel inherited Label66: TLabel
TabOrder = 37 TabOrder = 36
end end
inherited btnDAStart: TButton inherited btnDAStart: TButton
Images = ImageList1 Images = ImageList1
ImageIndex = 18 ImageIndex = 18
TabOrder = 39 TabOrder = 38
OnClick = frSettings1btnDAStartClick OnClick = frSettings1btnDAStartClick
end end
inherited btnGetDADef: TButton inherited btnGetDADef: TButton
Images = ImageList1 Images = ImageList1
TabOrder = 43 TabOrder = 40
end end
end end
inherited btnOpenRomaning: TButton inherited btnOpenRomaning: TButton
@@ -168,7 +168,7 @@ object TTW_Bot: TTTW_Bot
ExplicitSize.cy = 26.000000000000000000 ExplicitSize.cy = 26.000000000000000000
inline frAI1: TfrAI inline frAI1: TfrAI
Align = Client Align = Client
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 718.000000000000000000 Size.Height = 718.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
inherited btnGetAIDef: TButton inherited btnGetAIDef: TButton
@@ -201,7 +201,7 @@ object TTW_Bot: TTTW_Bot
ExplicitSize.cy = 26.000000000000000000 ExplicitSize.cy = 26.000000000000000000
inline frCommands1: TfrCommands inline frCommands1: TfrCommands
Align = Client Align = Client
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 718.000000000000000000 Size.Height = 718.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
inherited sgCommands: TStringGrid inherited sgCommands: TStringGrid
@@ -269,6 +269,15 @@ object TTW_Bot: TTTW_Bot
Images = ImageList1 Images = ImageList1
ImageIndex = 12 ImageIndex = 12
end 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
end end
inherited GroupBox9: TGroupBox inherited GroupBox9: TGroupBox
@@ -423,7 +432,7 @@ object TTW_Bot: TTTW_Bot
item item
end> end>
TextSettings.Trimming = None TextSettings.Trimming = None
IsSelected = False IsSelected = True
ImageIndex = 20 ImageIndex = 20
Size.Width = 79.000000000000000000 Size.Width = 79.000000000000000000
Size.Height = 26.000000000000000000 Size.Height = 26.000000000000000000
@@ -466,7 +475,8 @@ object TTW_Bot: TTTW_Bot
Padding.Top = 20.000000000000000000 Padding.Top = 20.000000000000000000
Padding.Right = 10.000000000000000000 Padding.Right = 10.000000000000000000
Padding.Bottom = 10.000000000000000000 Padding.Bottom = 10.000000000000000000
Position.Y = 249.000000000000000000 Position.X = 1.000000000000000000
Position.Y = 342.000000000000000000
Size.Width = 841.000000000000000000 Size.Width = 841.000000000000000000
Size.Height = 368.000000000000000000 Size.Height = 368.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
@@ -509,6 +519,52 @@ object TTW_Bot: TTTW_Bot
end end
end 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 end
object TabItem4: TTabItem object TabItem4: TTabItem
CustomIcon = < CustomIcon = <
@@ -527,13 +583,13 @@ object TTW_Bot: TTTW_Bot
ExplicitSize.cy = 26.000000000000000000 ExplicitSize.cy = 26.000000000000000000
inline frOBS1: TfrOBS inline frOBS1: TfrOBS
Align = Top Align = Top
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 345.000000000000000000 Size.Height = 345.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
inherited sgWebChats: TStringGrid inherited sgWebChats: TStringGrid
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 282.000000000000000000 Size.Height = 282.000000000000000000
Viewport.Width = 970.000000000000000000 Viewport.Width = 1003.000000000000000000
Viewport.Height = 282.000000000000000000 Viewport.Height = 282.000000000000000000
inherited StringColumn2: TStringColumn inherited StringColumn2: TStringColumn
Size.Width = 200.000000000000000000 Size.Width = 200.000000000000000000
@@ -550,7 +606,7 @@ object TTW_Bot: TTTW_Bot
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
Images = ImageList1 Images = ImageList1
ImageIndex = 4 ImageIndex = 4
Position.X = 882.000000000000000000 Position.X = 915.000000000000000000
TabOrder = 3 TabOrder = 3
OnClick = frOBS1btnDeleteeChatClick OnClick = frOBS1btnDeleteeChatClick
end end
@@ -566,7 +622,7 @@ object TTW_Bot: TTTW_Bot
Images = ImageList1 Images = ImageList1
ImageIndex = 5 ImageIndex = 5
Position.X = 264.000000000000000000 Position.X = 264.000000000000000000
TabOrder = 8 TabOrder = 11
end end
object btnCreateChat: TButton object btnCreateChat: TButton
Images = ImageList1 Images = ImageList1
@@ -603,7 +659,7 @@ object TTW_Bot: TTTW_Bot
item item
end> end>
TextSettings.Trimming = None TextSettings.Trimming = None
IsSelected = True IsSelected = False
ImageIndex = 24 ImageIndex = 24
Size.Width = 110.000000000000000000 Size.Width = 110.000000000000000000
Size.Height = 26.000000000000000000 Size.Height = 26.000000000000000000
@@ -615,7 +671,7 @@ object TTW_Bot: TTTW_Bot
ExplicitSize.cy = 26.000000000000000000 ExplicitSize.cy = 26.000000000000000000
inline frNotify1: TfrNotify inline frNotify1: TfrNotify
Align = Client Align = Client
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 718.000000000000000000 Size.Height = 718.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
inherited btnNotifyOpen: TButton inherited btnNotifyOpen: TButton
@@ -697,7 +753,7 @@ object TTW_Bot: TTTW_Bot
ExplicitSize.cy = 26.000000000000000000 ExplicitSize.cy = 26.000000000000000000
inline frAutoActions1: TfrAutoActions inline frAutoActions1: TfrAutoActions
Align = Client Align = Client
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 718.000000000000000000 Size.Height = 718.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
inherited GroupBox20: TGroupBox inherited GroupBox20: TGroupBox
@@ -850,20 +906,20 @@ object TTW_Bot: TTTW_Bot
ExplicitSize.cy = 26.000000000000000000 ExplicitSize.cy = 26.000000000000000000
inline frLog1: TfrLog inline frLog1: TfrLog
Align = Client Align = Client
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 718.000000000000000000 Size.Height = 718.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
inherited Panel1: TPanel inherited Panel1: TPanel
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
inherited btnClear: TButton inherited btnClear: TButton
Images = ImageList1 Images = ImageList1
ImageIndex = 4 ImageIndex = 4
end end
end end
inherited sgLog: TStringGrid inherited sgLog: TStringGrid
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 685.000000000000000000 Size.Height = 685.000000000000000000
Viewport.Width = 970.000000000000000000 Viewport.Width = 1003.000000000000000000
Viewport.Height = 685.000000000000000000 Viewport.Height = 685.000000000000000000
inherited StringColumn2: TStringColumn inherited StringColumn2: TStringColumn
Size.Width = 170.000000000000000000 Size.Width = 170.000000000000000000
@@ -881,7 +937,7 @@ object TTW_Bot: TTTW_Bot
object Panel1: TPanel object Panel1: TPanel
Align = Bottom Align = Bottom
Position.Y = 744.000000000000000000 Position.Y = 744.000000000000000000
Size.Width = 970.000000000000000000 Size.Width = 1003.000000000000000000
Size.Height = 142.000000000000000000 Size.Height = 142.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
TabOrder = 10 TabOrder = 10
@@ -1004,7 +1060,7 @@ object TTW_Bot: TTTW_Bot
end end
object Label1: TLabel object Label1: TLabel
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
Position.X = 821.000000000000000000 Position.X = 854.000000000000000000
Position.Y = 8.000000000000000000 Position.Y = 8.000000000000000000
Text = #1054#1090#1076#1077#1083#1100#1085#1086#1077' '#1089#1087#1072#1089#1080#1073#1086':' Text = #1054#1090#1076#1077#1083#1100#1085#1086#1077' '#1089#1087#1072#1089#1080#1073#1086':'
TabOrder = 12 TabOrder = 12
@@ -1041,7 +1097,7 @@ object TTW_Bot: TTTW_Bot
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
Images = ImageList1 Images = ImageList1
ImageIndex = 11 ImageIndex = 11
Position.X = 821.000000000000000000 Position.X = 854.000000000000000000
Position.Y = 33.000000000000000000 Position.Y = 33.000000000000000000
Size.Width = 141.000000000000000000 Size.Width = 141.000000000000000000
Size.Height = 22.000000000000000000 Size.Height = 22.000000000000000000
@@ -1054,7 +1110,7 @@ object TTW_Bot: TTTW_Bot
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
Images = ImageList1 Images = ImageList1
ImageIndex = 11 ImageIndex = 11
Position.X = 821.000000000000000000 Position.X = 854.000000000000000000
Position.Y = 63.000000000000000000 Position.Y = 63.000000000000000000
Size.Width = 141.000000000000000000 Size.Width = 141.000000000000000000
Size.Height = 22.000000000000000000 Size.Height = 22.000000000000000000
@@ -1067,7 +1123,7 @@ object TTW_Bot: TTTW_Bot
Anchors = [akTop, akRight] Anchors = [akTop, akRight]
Images = ImageList1 Images = ImageList1
ImageIndex = 11 ImageIndex = 11
Position.X = 821.000000000000000000 Position.X = 854.000000000000000000
Position.Y = 93.000000000000000000 Position.Y = 93.000000000000000000
Size.Width = 141.000000000000000000 Size.Width = 141.000000000000000000
Size.Height = 22.000000000000000000 Size.Height = 22.000000000000000000
+53 -29
View File
@@ -26,7 +26,8 @@ uses
System.Generics.Collections, utts, uGigaChat, uChatAPI, uMyTimer, uRecords, System.Generics.Collections, utts, uGigaChat, uChatAPI, uMyTimer, uRecords,
System.IOUtils, fCommands, uDataBase, FMX.Edit, FMX.Colors, FMX.SpinBox, System.IOUtils, fCommands, uDataBase, FMX.Edit, FMX.Colors, FMX.SpinBox,
windows, System.Skia, FMX.Skia, uCreateChat, uCreateNotify, fOBS, fTTS, 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 type
TTTW_Bot = class(TForm) TTTW_Bot = class(TForm)
@@ -73,6 +74,9 @@ type
frPlayerWeb1: TfrPlayerWeb; frPlayerWeb1: TfrPlayerWeb;
frEvents1: TfrEvents; frEvents1: TfrEvents;
GroupBox2: TGroupBox; GroupBox2: TGroupBox;
cbHelloTTS: TCheckBox;
GroupBox3: TGroupBox;
frRevards1: TfrRevards;
procedure cbThemeChange(Sender: TObject); procedure cbThemeChange(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton1Click(Sender: TObject);
@@ -117,6 +121,7 @@ type
procedure ESError(aMsg: string); procedure ESError(aMsg: string);
procedure ESStatus(Sender: TObject; const ConnectionEvent: String; procedure ESStatus(Sender: TObject; const ConnectionEvent: String;
StatusCode: Integer; const Description: String); StatusCode: Integer; const Description: String);
procedure ESOnSubOk(s: string);
public public
{ Public declarations } { Public declarations }
procedure toLog(aModule, aMethod, aMessage: string; aCode: Integer); procedure toLog(aModule, aMethod, aMessage: string; aCode: Integer);
@@ -217,7 +222,7 @@ begin
on E: Exception do on E: Exception do
begin begin
toLog('uGeneral', 'ConnectProcedure.ttw_API.Init', E.Message, 2); toLog('uGeneral', 'ConnectProcedure.ttw_API.Init', E.Message, 2);
raise;
end; end;
end; end;
@@ -226,7 +231,14 @@ begin
rid := ttw_API.getRoomAndBot; rid := ttw_API.getRoomAndBot;
if rid = '' then if rid = '' then
raise Exception.Create('Не удалось получить Room ID'); raise Exception.Create('Не удалось получить Room ID');
try
frRevards1.LoadCustomRevards;
except
on E: Exception do
begin
toLog('uGeneral', 'ConnectProcedure.LoadCustomRevards', E.Message, 2);
end;
end;
// Загрузка эмодзи и бейджей // Загрузка эмодзи и бейджей
try try
frOBS1.ChatBadges.Clear; frOBS1.ChatBadges.Clear;
@@ -246,7 +258,7 @@ begin
on E: Exception do on E: Exception do
begin begin
toLog('uGeneral', 'ConnectProcedure.Emotes', E.Message, 2); toLog('uGeneral', 'ConnectProcedure.Emotes', E.Message, 2);
raise;
end; end;
end; end;
@@ -265,7 +277,7 @@ begin
ttw_ES.OnGetCustomReward := frEvents1.ESOnGetCustomReward; ttw_ES.OnGetCustomReward := frEvents1.ESOnGetCustomReward;
ttw_ES.OnStatus := ESStatus; ttw_ES.OnStatus := ESStatus;
// ttw_ES.OnRAW := fRewards.ESOnRAW; // ttw_ES.OnRAW := fRewards.ESOnRAW;
// ttw_ES.OnSubOk := fRewards.ESOnSubOk; ttw_ES.OnSubOk := ESOnSubOk;
ttw_ES.OnFollow := frOBS1.toEventWebServer; ttw_ES.OnFollow := frOBS1.toEventWebServer;
ttw_ES.OnSub := frOBS1.toEventWebServer; ttw_ES.OnSub := frOBS1.toEventWebServer;
ttw_ES.OnGift := frOBS1.toEventWebServer; ttw_ES.OnGift := frOBS1.toEventWebServer;
@@ -276,7 +288,7 @@ begin
on E: Exception do on E: Exception do
begin begin
toLog('uGeneral', 'ConnectProcedure.ttw_ES', E.Message, 2); toLog('uGeneral', 'ConnectProcedure.ttw_ES', E.Message, 2);
raise;
end; end;
end; end;
@@ -290,8 +302,7 @@ begin
end; end;
procedure TTTW_Bot.DisconnectProcedure; procedure TTTW_Bot.DisconnectProcedure;
var
I: Integer;
begin begin
try try
toLog('DisconnectProcedure', 'Start', 'Начало процедуры отключения', 3); toLog('DisconnectProcedure', 'Start', 'Начало процедуры отключения', 3);
@@ -340,6 +351,11 @@ begin
toLog('uGeneral', 'ESError', aMsg, 2); toLog('uGeneral', 'ESError', aMsg, 2);
end; end;
procedure TTTW_Bot.ESOnSubOk(s: string);
begin
toLog('uGeneral', 'ESOnSubOk', s, 0);
end;
procedure TTTW_Bot.ESStatus(Sender: TObject; const ConnectionEvent: String; procedure TTTW_Bot.ESStatus(Sender: TObject; const ConnectionEvent: String;
StatusCode: Integer; const Description: String); StatusCode: Integer; const Description: String);
begin begin
@@ -373,9 +389,7 @@ begin
end; end;
procedure TTTW_Bot.btnConnectingClick(Sender: TObject); procedure TTTW_Bot.btnConnectingClick(Sender: TObject);
var
rid, tb, ts: string;
I: Integer;
begin begin
if not ValidateInput then if not ValidateInput then
exit; exit;
@@ -489,17 +503,6 @@ begin
ttw_API := TTTW_API.Create(Self); 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; end;
procedure TTTW_Bot.OnTTWStatus(ASender: TObject; const AStatus: TIdStatus; procedure TTTW_Bot.OnTTWStatus(ASender: TObject; const AStatus: TIdStatus;
@@ -514,7 +517,8 @@ begin
frOBS1.ChatEmotes.Free; frOBS1.ChatEmotes.Free;
frOBS1.ChatWebServers.Free; frOBS1.ChatWebServers.Free;
frOBS1.EventWebServers.Free; frOBS1.EventWebServers.Free;
frEvents1.CustomRewards.Free; frOBS1.KandinskyWebServers.Free;
frRevards1.CustomRewards.Free;
kePoints.Free; kePoints.Free;
DisconnectProcedure; DisconnectProcedure;
if Assigned(ttw_IRS) then if Assigned(ttw_IRS) then
@@ -726,6 +730,10 @@ begin
exit; exit;
end; end;
if (TTW_Bot.cbHelloTTS.IsChecked) and (aRecord.FirstMsg = 1) then
toSpeech('приветствую, ' + IfThen(aRecord.DisplayName <> '',
aRecord.DisplayName, aRecord.Username));
firstWord := ExtractFirstWord(processedText); firstWord := ExtractFirstWord(processedText);
if IsCommand(firstWord) then if IsCommand(firstWord) then
begin begin
@@ -1050,6 +1058,7 @@ procedure TTTW_Bot.ReadDB;
end; end;
frSettings1.Init; frSettings1.Init;
end; end;
// Загрузка гридов автоматических действий // Загрузка гридов автоматических действий
@@ -1084,9 +1093,20 @@ procedure TTTW_Bot.ReadDB;
frOBS1.EventWebServers := TList<TEventWebServers>.Create; frOBS1.EventWebServers := TList<TEventWebServers>.Create;
for I := 0 to High(frOBS1.listNotify) do for I := 0 to High(frOBS1.listNotify) do
begin begin
frOBS1.CreateWebEvents(frOBS1.listNotify[I]); frOBS1.CreateWebEvents(frOBS1.listNotify[I]);
end; end;
db.LoadRecordArray<TOBSKandinsky>('listKandinsky', frOBS1.listKandinsky); db.LoadRecordArray<TOBSKandinsky>('listKandinsky', frOBS1.listKandinsky);
frOBS1.KandinskyWebServers := TList<TKandinskyWebServers>.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; frOBS1.UpdateGridFromArray;
end; end;
@@ -1095,11 +1115,11 @@ procedure TTTW_Bot.ReadDB;
begin begin
db.LoadRecordArray<TEventGlobal>('ListEvents', frEvents1.ListEvents); db.LoadRecordArray<TEventGlobal>('ListEvents', frEvents1.ListEvents);
frEvents1.UpdateGrid; frEvents1.UpdateGrid;
frRevards1.CustomRewards := TList<TCustomRevards>.Create;
frEvents1.CustomRewards := Tlist<TCustomRevards>.Create; frEvents1.CustomRewardEvents := TList<TCustomRewardEvent>.Create;
// frEvents1.LoadCustomRevards(); kePoints := TKE.Create(frEvents1.edtParams, frEvents1.cbKey1,
frEvents1.CustomRewardEvents := Tlist<TCustomRewardEvent>.Create; frEvents1.cbKey2, frEvents1.cbKey3);
kePoints:=TKE.Create(frEvents1.edtParams, frEvents1.cbKey1,frEvents1.cbKey2,frEvents1.cbKey3);
frTTS1.btnUpdateVoicesClick(Self); frTTS1.btnUpdateVoicesClick(Self);
frTTS1.cbVoices.ItemIndex := strtoint(db.ReadSetting('cbVoices', '0')); frTTS1.cbVoices.ItemIndex := strtoint(db.ReadSetting('cbVoices', '0'));
frTTS1.cbOutput.ItemIndex := strtoint(db.ReadSetting('cbOutput', '0')); frTTS1.cbOutput.ItemIndex := strtoint(db.ReadSetting('cbOutput', '0'));
@@ -1107,6 +1127,7 @@ procedure TTTW_Bot.ReadDB;
end; end;
begin begin
LoadAISettings;
LoadSkills; LoadSkills;
LoadSettingsComponents; LoadSettingsComponents;
LoadGridsData; LoadGridsData;
@@ -1114,7 +1135,7 @@ LoadSkills;
LoadEncryptedConfig; LoadEncryptedConfig;
LoadNotifySettings; LoadNotifySettings;
LoadAISettings;
LoadOBSGrids; LoadOBSGrids;
LoadAutoActionsGrids; LoadAutoActionsGrids;
end; end;
@@ -1558,11 +1579,14 @@ function TTTW_Bot.ResponsParserAIPic(inMess, aCommandText,
aNick: string): string; aNick: string): string;
var var
res: string; res: string;
I: Integer;
begin begin
res := inMess; res := inMess;
if ContainsText(res, '[Kandinsky]') then if ContainsText(res, '[Kandinsky]') then
begin 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]); res := StringReplace(res, '[Kandinsky]', '', [rfReplaceAll]);
end; end;
Result := res; Result := res;
+116 -203
View File
@@ -7,7 +7,8 @@ uses
System.Variants, System.Generics.Collections, ShellAPI, uSoundManager, System.Variants, System.Generics.Collections, ShellAPI, uSoundManager,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, 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.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 type
TfrEvents = class(TFrame) TfrEvents = class(TFrame)
@@ -42,16 +43,13 @@ type
procedure MenuItem1Click(Sender: TObject); procedure MenuItem1Click(Sender: TObject);
procedure cbActionsChange(Sender: TObject); procedure cbActionsChange(Sender: TObject);
private private
{ Private declarations } procedure toLog(aCode: integer; aMethod, aMess: string);
procedure toLog(aCode: integer; aMethod: string; aMess: string); procedure ExecuteAction(const aAction: integer; const aParam, aUserInput, aUserName, aUserLogin: string);
public public
{ Public declarations }
ListEvents: TArray<TEventGlobal>; ListEvents: TArray<TEventGlobal>;
CustomRewards: Tlist<TCustomRevards>; CustomRewardEvents: TList<TCustomRewardEvent>;
CustomRewardEvents: Tlist<TCustomRewardEvent>;
procedure UpdateGrid; procedure UpdateGrid;
procedure LoadCustomRevards();
procedure ESOnGetCustomReward(CustomReward: TCustomRewardEvent); procedure ESOnGetCustomReward(CustomReward: TCustomRewardEvent);
procedure OnDonate(aNick, aMessage, aSum: string); procedure OnDonate(aNick, aMessage, aSum: string);
end; end;
@@ -62,36 +60,40 @@ implementation
uses uGeneral; uses uGeneral;
{ --- UI --- }
procedure TfrEvents.btnAddClick(Sender: TObject); procedure TfrEvents.btnAddClick(Sender: TObject);
var var
NewRec: TEventGlobal; NewRec: TEventGlobal;
begin begin
if (cbEventList.Text = '') or (cbActions.Text = '') then if (cbEventList.ItemIndex < 0) or (cbActions.ItemIndex < 0) then
exit; Exit;
NewRec.Event := cbEventList.ItemIndex; NewRec.Event := cbEventList.ItemIndex;
NewRec.Action := cbActions.ItemIndex; NewRec.Action := cbActions.ItemIndex;
NewRec.Param := edtParams.Text; NewRec.Param := edtParams.Text;
if edtIF.Visible then if edtIF.Visible then
NewRec.Condition := edtIF.Text; NewRec.Condition := edtIF.Text
if cbRevards.Visible then else if cbRevards.Visible then
NewRec.Condition := cbRevards.Text; NewRec.Condition := cbRevards.Text;
SetLength(ListEvents, Length(ListEvents) + 1); ListEvents := ListEvents + [NewRec];
ListEvents[High(ListEvents)] := NewRec;
DB.SaveRecordArray<TEventGlobal>('ListEvents', ListEvents); DB.SaveRecordArray<TEventGlobal>('ListEvents', ListEvents);
UpdateGrid; UpdateGrid;
end; end;
procedure TfrEvents.btnDeleteClick(Sender: TObject); procedure TfrEvents.btnDeleteClick(Sender: TObject);
var var
i, RowIndex: integer; RowIndex: integer;
begin begin
RowIndex := sgEvents.Row; RowIndex := sgEvents.Row;
if (RowIndex < 0) or (RowIndex > High(ListEvents)) then if (RowIndex < 0) or (RowIndex > High(ListEvents)) then
exit; Exit;
for i := RowIndex to High(ListEvents) - 1 do
ListEvents[i] := ListEvents[i + 1]; Delete(ListEvents, RowIndex, 1);
SetLength(ListEvents, Length(ListEvents) - 1);
DB.SaveRecordArray<TEventGlobal>('ListEvents', ListEvents); DB.SaveRecordArray<TEventGlobal>('ListEvents', ListEvents);
UpdateGrid; UpdateGrid;
end; end;
@@ -106,82 +108,77 @@ begin
edtIF.Visible := cbEventList.ItemIndex = 0; edtIF.Visible := cbEventList.ItemIndex = 0;
cbRevards.Visible := cbEventList.ItemIndex = 1; cbRevards.Visible := cbEventList.ItemIndex = 1;
Label2.Visible := cbEventList.ItemIndex <= 1; Label2.Visible := cbEventList.ItemIndex <= 1;
end; 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 var
i, i2: integer;
req, s: string;
hr: TCustomRewardEvent;
sm: TSongMachine; sm: TSongMachine;
myAction: integer; f: TfrColorSettings;
t: TfrFontSettings;
i, j: Integer;
notify: TOBSNotify;
se: TStyleEvent;
begin begin
sm := TSongMachine.Create; sm := TSongMachine.Create;
try try
toLog(3, 'ESOnGetCustomReward', 'Íà÷àëî îáðàáîòêè íàãðàäû: ' + case aAction of
CustomReward.Event.revard.Title); 0: begin // Íàæàòü êíîïêó
s := '[' + CustomReward.Event.user_name + toLog(0, 'ExecuteAction', 'Ñèìóëÿöèÿ íàæàòèÿ: ' + aParam);
'] êóïèë çà áàëëû êàíàëà íàãðàäó "' + kePoints.SimulateKeyPress(aParam, 500);
CustomReward.Event.revard.Title + '" '; end;
if CustomReward.Event.user_input <> '' then 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 begin
toLog(0, 'ESOnGetCustomReward', 'Ïîëüçîâàòåëüñêèé ââîä: ' + notify := TTW_Bot.frOBS1.listNotify[i];
CustomReward.Event.user_input); se.Title := StringReplace(notify.HeaderText, '[NICK]', aUserName, [rfReplaceAll]);
s := s + ' è ïåðåäàë ñòðîêó ' + CustomReward.Event.user_input se.Context := notify.MessText;
end; 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 for j := 0 to TTW_Bot.frOBS1.EventWebServers.Count - 1 do
begin TTW_Bot.frOBS1.EventWebServers[j].WebServerChat.AddMessage(se);
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; end;
1: finally
begin // âîñïðîèçâåäåíèå çâóêà f.Free;
toLog(0, 'ESOnGetCustomReward', 'Âîñïðîèçâåäåíèå çâóêà: ' + t.Free;
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; end;
4: toLog(0, 'ExecuteAction', 'Íàïèñàòü â ÷àò: ' + aUserInput);
5: begin // Çàïóñê ôàéëà
toLog(0, 'ExecuteAction', 'Çàïóñê ôàéëà: ' + aParam);
ShellExecute(0, 'open', PWideChar(aParam), nil, nil, 0);
end; end;
end; end;
finally finally
@@ -189,83 +186,46 @@ begin
end; end;
end; end;
procedure TfrEvents.LoadCustomRevards(); procedure TfrEvents.ESOnGetCustomReward(CustomReward: TCustomRewardEvent);
var var
cr: TCustomRevards; ev: TEventGlobal;
begin begin
CustomRewards.Clear; toLog(3, 'ESOnGetCustomReward', 'Íà÷àëî îáðàáîòêè íàãðàäû: ' + CustomReward.Event.revard.Title);
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;
procedure TfrEvents.MenuItem1Click(Sender: TObject); for ev in ListEvents do
begin if (ev.Event = 1) and (ev.Condition = CustomReward.Event.revard.Title) then
if OpenDialog1.Execute then ExecuteAction(ev.Action, ev.Param, CustomReward.Event.user_input, CustomReward.Event.user_name, CustomReward.Event.user_login);
TEdit(PopupMenu1.PopupComponent).Text := OpenDialog1.FileName;
end; end;
procedure TfrEvents.OnDonate(aNick, aMessage, aSum: string); procedure TfrEvents.OnDonate(aNick, aMessage, aSum: string);
var var
i, i2: integer; i, aSumInt, BestRow, BestPriority, BestValue,
req, s: string; CurrentPriority, CurrentValue, MinVal, MaxVal: integer;
hr: TCustomRewardEvent;
sm: TSongMachine;
myAction: integer;
j: integer;
aSumInt: integer;
BestRow: integer;
BestPriority: integer;
BestValue: integer;
Condition: string; Condition: string;
CurrentPriority: integer; Parts: TStringList;
CurrentValue: integer;
MinVal, MaxVal: integer;
Parts: tstringlist;
se: TStyleEvent;
notify: TEventGlobal;
begin begin
aSumInt := StrToIntDef(aSum, 0); aSumInt := StrToIntDef(aSum, 0);
BestRow := -1; BestRow := -1;
BestPriority := -1; BestPriority := -1;
BestValue := 0; BestValue := 0;
for i := 0 to high(ListEvents) do for i := 0 to High(ListEvents) do
begin
if ListEvents[i].Event = 0 then
begin begin
if ListEvents[i].Event <> 0 then
Continue;
Condition := ListEvents[i].Condition; Condition := ListEvents[i].Condition;
CurrentPriority := -1; CurrentPriority := -1;
CurrentValue := 0; CurrentValue := 0;
// Ïðîâåðêà íà òî÷íîå çíà÷åíèå if TryStrToInt(Condition, CurrentValue) then
if Pos('-', Condition) = 0 then
begin begin
if Pos('>', Condition) = 0 then
begin
if Pos('<', Condition) = 0 then
begin
// Òî÷íîå çíà÷åíèå
CurrentValue := StrToIntDef(Condition, -1);
if aSumInt = CurrentValue then if aSumInt = CurrentValue then
CurrentPriority := 4; CurrentPriority := 4;
end; end
end; else if Pos('-', Condition) > 0 then
end;
if CurrentPriority = -1 then
begin begin
if Pos('-', Condition) > 0 then Parts := TStringList.Create;
begin
// Äèàïàçîí
Parts := tstringlist.Create;
try try
Parts.Delimiter := '-'; Parts.Delimiter := '-';
Parts.StrictDelimiter := True; Parts.StrictDelimiter := True;
@@ -277,94 +237,43 @@ begin
if (aSumInt >= MinVal) and (aSumInt <= MaxVal) then if (aSumInt >= MinVal) and (aSumInt <= MaxVal) then
begin begin
CurrentPriority := 3; CurrentPriority := 3;
CurrentValue := MinVal; // Ïðèîðèòåò ïî MinVal CurrentValue := MinVal;
end; end;
end; end;
finally finally
Parts.Free; Parts.Free;
end; end;
end end
else if Pos('>', Condition) > 0 then else if (Condition.StartsWith('>')) then
begin begin
// Óñëîâèå ">X" CurrentValue := StrToIntDef(Copy(Condition, 2), 0);
CurrentValue :=
StrToIntDef(Trim(StringReplace(Condition, '>', '',
[rfReplaceAll])), 0);
if aSumInt >= CurrentValue then if aSumInt >= CurrentValue then
CurrentPriority := 2; CurrentPriority := 2;
end end
else if Pos('<', Condition) > 0 then else if (Condition.StartsWith('<')) then
begin begin
// Óñëîâèå "<X" CurrentValue := StrToIntDef(Copy(Condition, 2), 0);
CurrentValue :=
StrToIntDef(Trim(StringReplace(Condition, '<', '',
[rfReplaceAll])), 0);
if aSumInt <= CurrentValue then if aSumInt <= CurrentValue then
CurrentPriority := 1; CurrentPriority := 1;
end; end;
end;
if CurrentPriority <> -1 then if (CurrentPriority <> -1) and
begin ((CurrentPriority > BestPriority) or
// Îïðåäåëåíèå íàèëó÷øåãî óñëîâèÿ ((CurrentPriority = BestPriority) and
if (CurrentPriority > BestPriority) or (CurrentPriority = BestPriority) (((CurrentPriority in [2,3]) and (CurrentValue > BestValue)) or
and ((CurrentPriority = 3) and (CurrentValue > BestValue) or ((CurrentPriority = 1) and (CurrentValue < BestValue))))) then
(CurrentPriority = 2) and (CurrentValue > BestValue) or
(CurrentPriority = 1) and (CurrentValue < BestValue)) then
begin begin
BestPriority := CurrentPriority; BestPriority := CurrentPriority;
BestValue := CurrentValue; BestValue := CurrentValue;
BestRow := i; 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;
end; end;
finally if BestRow <> -1 then
sm.Free; ExecuteAction(ListEvents[BestRow].Action, ListEvents[BestRow].Param, aMessage, aNick, aNick);
end;
end; end;
procedure TfrEvents.toLog(aCode: integer; aMethod, aMess: string);
begin
TTW_Bot.toLog('fEvents', aMethod, aMess, aCode);
end;
procedure TfrEvents.UpdateGrid; procedure TfrEvents.UpdateGrid;
var var
@@ -372,11 +281,9 @@ var
begin begin
sgEvents.BeginUpdate; sgEvents.BeginUpdate;
try try
sgEvents.RowCount := 0; // Ñáðàñûâàåì ñòðîêè (îñòàâëÿåì òîëüêî çàãîëîâêè) sgEvents.RowCount := Length(ListEvents);
for i := 0 to High(ListEvents) do for i := 0 to High(ListEvents) do
begin begin
sgEvents.RowCount := i + 1;
sgEvents.Cells[0, i] := cbEventList.Items[ListEvents[i].Event]; sgEvents.Cells[0, i] := cbEventList.Items[ListEvents[i].Event];
sgEvents.Cells[1, i] := ListEvents[i].Condition; sgEvents.Cells[1, i] := ListEvents[i].Condition;
sgEvents.Cells[2, i] := cbActions.Items[ListEvents[i].Action]; sgEvents.Cells[2, i] := cbActions.Items[ListEvents[i].Action];
@@ -387,4 +294,10 @@ begin
end; end;
end; end;
procedure TfrEvents.toLog(aCode: integer; aMethod, aMess: string);
begin
TTW_Bot.toLog('fEvents', aMethod, aMess, aCode);
end;
end. end.
+2 -2
View File
@@ -14,8 +14,8 @@ object frOBS: TfrOBS
RowCount = 0 RowCount = 0
Options = [ColumnResize, ColumnMove, ColLines, RowLines, Tabs, Header, HeaderClick, AutoDisplacement] Options = [ColumnResize, ColumnMove, ColLines, RowLines, Tabs, Header, HeaderClick, AutoDisplacement]
OnCellDblClick = sgWebChatsCellDblClick OnCellDblClick = sgWebChatsCellDblClick
Viewport.Width = 685.000000000000000000 Viewport.Width = 689.000000000000000000
Viewport.Height = 164.000000000000000000 Viewport.Height = 189.000000000000000000
object IntegerColumn1: TIntegerColumn object IntegerColumn1: TIntegerColumn
Header = #1055#1086#1088#1090 Header = #1055#1086#1088#1090
HeaderSettings.TextSettings.WordWrap = False HeaderSettings.TextSettings.WordWrap = False
+156 -333
View File
@@ -5,11 +5,12 @@ interface
uses uses
System.SysUtils, System.Types, System.UITypes, System.Classes, uCustomEmoties, System.SysUtils, System.Types, System.UITypes, System.Classes, uCustomEmoties,
System.Variants, uWebServerChat, uWebServerEvents, fColorSettings, 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, 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, System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.ScrollBox, FMX.Edit, FMX.Colors,
FMX.ListBox, FMX.EditBox, FMX.SpinBox, FMX.Controls.Presentation, uRecords, FMX.ListBox, FMX.EditBox, FMX.SpinBox, FMX.Controls.Presentation, uRecords,
System.Generics.Defaults, fFontSettings, System.Character; System.Generics.Defaults, System.Character;
type type
TChatWebServers = record TChatWebServers = record
@@ -31,10 +32,17 @@ type
type type
TEventWebServers = record TEventWebServers = record
port: integer; port: integer;
typeEvent: integer;
se: TStyleEvent; se: TStyleEvent;
WebServerChat: TTTW_Events; WebServerChat: TTTW_Events;
end; end;
type
TKandinskyWebServers = record
port: integer;
WebServerKandinsky: TKandinsky_Web;
end;
type type
TfrOBS = class(TFrame) TfrOBS = class(TFrame)
sgWebChats: TStringGrid; sgWebChats: TStringGrid;
@@ -71,11 +79,12 @@ type
ChatEmotes: Tlist<TEmotes>; ChatEmotes: Tlist<TEmotes>;
ChatWebServers: Tlist<TChatWebServers>; ChatWebServers: Tlist<TChatWebServers>;
EventWebServers: Tlist<TEventWebServers>; EventWebServers: Tlist<TEventWebServers>;
KandinskyWebServers: Tlist<TKandinskyWebServers>;
procedure MsgToWebServer(const aRecord: TTwitchChatMessage); procedure MsgToWebServer(const aRecord: TTwitchChatMessage);
procedure toEventWebServer(CustomReward: TFollowEvent); overload; // follow procedure toEventWebServer(aEvent: TFollowEvent); overload; // follow
procedure toEventWebServer(CustomReward: TSubEvent); overload; // sub procedure toEventWebServer(aEvent: TSubEvent); overload; // sub
procedure toEventWebServer(CustomReward: TRaidEvent); overload; // raid procedure toEventWebServer(aEvent: TRaidEvent); overload; // raid
procedure toEventWebServer(CustomReward: TGiftEvent); overload; // gift procedure toEventWebServer(aEvent: TGiftEvent); overload; // gift
procedure toEventWebServer(aNick, aSum, aText: string); overload; // donate procedure toEventWebServer(aNick, aSum, aText: string); overload; // donate
procedure CreateWebEvents(eventsSettings: TOBSNotify); procedure CreateWebEvents(eventsSettings: TOBSNotify);
@@ -91,7 +100,7 @@ type
procedure AddKandinsky(newRecord: TOBSKandinsky); procedure AddKandinsky(newRecord: TOBSKandinsky);
procedure DelKandinsky(aPort: integer); procedure DelKandinsky(aPort: integer);
procedure CreateWebKandinsky(aRecord: TOBSKandinsky);
end; end;
implementation implementation
@@ -290,6 +299,7 @@ begin
SetLength(listChats, Length(listChats) + 1); SetLength(listChats, Length(listChats) + 1);
listChats[High(listChats)] := newRecord; listChats[High(listChats)] := newRecord;
UpdateGridFromArray; UpdateGridFromArray;
db.SaveRecordArray<TOBSChat>('listChats', listChats); db.SaveRecordArray<TOBSChat>('listChats', listChats);
CreateWebChat(newRecord); CreateWebChat(newRecord);
end; end;
@@ -300,6 +310,7 @@ begin
listKandinsky[High(listKandinsky)] := newRecord; listKandinsky[High(listKandinsky)] := newRecord;
UpdateGridFromArray; UpdateGridFromArray;
db.SaveRecordArray<TOBSKandinsky>('listKandinsky', listKandinsky); db.SaveRecordArray<TOBSKandinsky>('listKandinsky', listKandinsky);
CreateWebKandinsky(newRecord);
end; end;
procedure TfrOBS.AddNotify(newRecord: TOBSNotify); procedure TfrOBS.AddNotify(newRecord: TOBSNotify);
@@ -383,12 +394,10 @@ var
procedure LoadFontList(const mySL: tstringlist); procedure LoadFontList(const mySL: tstringlist);
var var
SearchRec: TSearchRec; SearchRec: TSearchRec;
n: integer;
begin begin
if not DirectoryExists(myConst.fontsPath) then if not DirectoryExists(myConst.fontsPath) then
CreateDir(myConst.fontsPath); CreateDir(myConst.fontsPath);
n := 1;
if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*', if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*',
faArchive, SearchRec) = 0 then faArchive, SearchRec) = 0 then
try try
@@ -396,7 +405,6 @@ var
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
begin begin
mySL.Add(SearchRec.name); mySL.Add(SearchRec.name);
Inc(n);
end; end;
until FindNext(SearchRec) <> 0; until FindNext(SearchRec) <> 0;
finally finally
@@ -448,12 +456,9 @@ var
procedure LoadFontList(const mySL: tstringlist); procedure LoadFontList(const mySL: tstringlist);
var var
SearchRec: TSearchRec; SearchRec: TSearchRec;
n: integer;
begin begin
if not DirectoryExists(myConst.fontsPath) then if not DirectoryExists(myConst.fontsPath) then
CreateDir(myConst.fontsPath); CreateDir(myConst.fontsPath);
n := 1;
if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*', if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*',
faArchive, SearchRec) = 0 then faArchive, SearchRec) = 0 then
try try
@@ -461,7 +466,6 @@ var
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
begin begin
mySL.Add(SearchRec.name); mySL.Add(SearchRec.name);
Inc(n);
end; end;
until FindNext(SearchRec) <> 0; until FindNext(SearchRec) <> 0;
finally finally
@@ -480,7 +484,8 @@ begin
r := TAlphaColorRec(Color).r; r := TAlphaColorRec(Color).r;
G := TAlphaColorRec(Color).G; G := TAlphaColorRec(Color).G;
B := TAlphaColorRec(Color).B; B := TAlphaColorRec(Color).B;
A := TAlphaColorRec(Color).A / 255; // Ïðåîáðàçóåì àëüôà-êàíàë â äèàïàçîí 0..1 A := TAlphaColorRec(Color).A / 255;
// Ïðåîáðàçóåì àëüôà-êàíàë â äèàïàçîí 0..1
// Óñòàíàâëèâàåì òî÷êó â êà÷åñòâå äåñÿòè÷íîãî ðàçäåëèòåëÿ // Óñòàíàâëèâàåì òî÷êó â êà÷åñòâå äåñÿòè÷íîãî ðàçäåëèòåëÿ
FS := TFormatSettings.Create; FS := TFormatSettings.Create;
@@ -489,31 +494,43 @@ begin
result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS); result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS);
end; 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 begin
fonts := tstringlist.Create; fonts := tstringlist.Create;
f := TfrColorSettings.Create(self); f := TfrColorSettings.Create(self);
t := TfrFontSettings.Create(self); t := TfrFontSettings.Create(self);
try try
LoadFontList(fonts); LoadFontList(fonts);
EventWebServer.WebServerChat := TTTW_Events.Create(fonts,eventsSettings.port); EventWebServer.WebServerChat := TTTW_Events.Create(fonts,
eventsSettings.port);
EventWebServer.port := eventsSettings.port; EventWebServer.port := eventsSettings.port;
EventWebServer.typeEvent := eventsSettings.typeEvent;
EventWebServer.se.title := eventsSettings.HeaderText; EventWebServer.se.Title := eventsSettings.HeaderText;
EventWebServer.se.Context := eventsSettings.MessText; EventWebServer.se.Context := eventsSettings.MessText;
EventWebServer.se.Url := eventsSettings.Picture; EventWebServer.se.Url := eventsSettings.Picture;
EventWebServer.se.SoundURL := eventsSettings.Sound; EventWebServer.se.SoundURL := eventsSettings.Sound;
EventWebServer.se.Timestamp := now; EventWebServer.se.Timestamp := now;
EventWebServer.se.TimeMsg := eventsSettings.TimeMess; EventWebServer.se.TimeMsg := eventsSettings.TimeMess;
EventWebServer.se.FontTitle.Font:= t.cbFontStyleDefault.Items[eventsSettings.HeaderStyleFont]; EventWebServer.se.FontTitle.Font := eventsSettings.HeaderStyleFont;
EventWebServer.se.FontTitle.Size := eventsSettings.HeaderSizeFont; EventWebServer.se.FontTitle.Size := eventsSettings.HeaderSizeFont;
EventWebServer.se.FontTitle.Color:=t.ccbFontColor.Items[eventsSettings.HeaderColorFont]; EventWebServer.se.FontTitle.Color := eventsSettings.HeaderColorFont;
EventWebServer.se.FontContext.Font:= t.cbFontStyleDefault.Items[eventsSettings.MessStyleFont]; EventWebServer.se.FontContext.Font := eventsSettings.MessStyleFont;
EventWebServer.se.FontContext.Size := eventsSettings.MessSizeFont; EventWebServer.se.FontContext.Size := eventsSettings.MessSizeFont;
EventWebServer.se.FontContext.Color:=t.ccbFontColor.Items[eventsSettings.MessColorFont]; EventWebServer.se.FontContext.Color :=eventsSettings.MessColorFont;
EventWebServer.se.BorderColor:=f.ccbStyleBorderColor.Items[eventsSettings.ColorBorder]; EventWebServer.se.BorderColor := eventsSettings.ColorBorder;
EventWebServer.se.BorderSize := eventsSettings.SolidBorder; EventWebServer.se.BorderSize := eventsSettings.SolidBorder;
EventWebServer.se.BlockColor:=GetColorFromColorPanel(f.cpStyleBlockColor.Color); EventWebServer.se.BlockColor := eventsSettings.ColorBlock;
EventWebServers.Add(EventWebServer); EventWebServers.Add(EventWebServer);
EventWebServers[EventWebServers.Count - 1].WebServerChat.ActiveServer(True); EventWebServers[EventWebServers.Count - 1].WebServerChat.ActiveServer(True);
finally finally
@@ -523,6 +540,20 @@ begin
end; end;
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); procedure TfrOBS.DelChat(aPort: integer);
var var
i, j: integer; i, j: integer;
@@ -566,6 +597,9 @@ begin
Break; Break;
end; end;
end; end;
KandinskyWebServers[i].WebServerKandinsky.ActiveServer(false);
KandinskyWebServers[i].WebServerKandinsky.Destroy;
KandinskyWebServers.Delete(i);
UpdateGridFromArray; UpdateGridFromArray;
db.SaveRecordArray<TOBSKandinsky>('listKandinsky', listKandinsky); db.SaveRecordArray<TOBSKandinsky>('listKandinsky', listKandinsky);
end; end;
@@ -588,7 +622,9 @@ begin
Break; Break;
end; end;
end; end;
EventWebServers[i].WebServerChat.ActiveServer(false);
EventWebServers[i].WebServerChat.Destroy;
EventWebServers.Delete(i);
UpdateGridFromArray; UpdateGridFromArray;
db.SaveRecordArray<TOBSNotify>('listNotify', listNotify); db.SaveRecordArray<TOBSNotify>('listNotify', listNotify);
end; end;
@@ -654,12 +690,36 @@ end;
procedure TfrOBS.EdtNotify(newRecord: TOBSNotify; oldPort: integer); procedure TfrOBS.EdtNotify(newRecord: TOBSNotify; oldPort: integer);
var var
i: integer; i,mi: integer; ws:TEventWebServers;
begin 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 for i := 0 to High(listNotify) do
if listNotify[i].port = oldPort then if listNotify[i].port = oldPort then
begin begin
listNotify[i] := newRecord; 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; UpdateGridFromArray;
db.SaveRecordArray<TOBSNotify>('listNotify', listNotify); db.SaveRecordArray<TOBSNotify>('listNotify', listNotify);
Break; Break;
@@ -716,342 +776,105 @@ begin
end; end;
end; end;
procedure TfrOBS.toEventWebServer(CustomReward: TFollowEvent); {
0 Îòñëåæèâàíèå
1 Ïîäïèñêà
2 Ïîäàðî÷íàÿ ïîäïèñêà
3 Ðåéä
4 Äîíàò
5 Ñâîå
}
procedure TfrOBS.toEventWebServer(aEvent: TFollowEvent);
var var
se: TStyleEvent; i: integer;
i, j: integer; ws: TEventWebServers;
f: TfrColorSettings;
t: TfrFontSettings;
notify: TOBSNotify;
begin begin
f := TfrColorSettings.Create(self); TTW_Bot.toLog('fOBS', 'toEventWebServer', 'Ïîëó÷åíî ñîáûòèå Follow', 0);
t := TfrFontSettings.Create(self); for i := 0 to EventWebServers.Count - 1 do
try
for i := 0 to high(listNotify) do
begin begin
if listNotify[i].TypeEvent = 0 then if EventWebServers[i].typeEvent = 0 then
begin begin
notify := listNotify[i]; ws := EventWebServers[i];
se.Title := notify.HeaderText; ws.se.Title := StringReplace(ws.se.Title, '[NICK]',
se.Title := StringReplace(se.Title, '[NICK]', aEvent.event.user_name, [rfReplaceAll]);
CustomReward.event.user_name, [rfReplaceAll]); ws.se.Timestamp:=now;
se.Context := notify.MessText; ws.se.RequireInteraction := True;
se.Url := notify.Picture; TTW_Bot.toLog('fOBS', 'toEventWebServer.BlockColor', ws.se.BlockColor, 3);
se.SoundURL := notify.Sound; EventWebServers[i].WebServerChat.AddMessage(ws.se);
se.Timestamp := Now; end;
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; end;
end; procedure TfrOBS.toEventWebServer(aEvent: TSubEvent);
finally
f.Free;
t.Free;
end;
end;
procedure TfrOBS.toEventWebServer(CustomReward: TSubEvent);
var var
se: TStyleEvent; i: integer;
i, j: integer; ws: TEventWebServers;
f: TfrColorSettings;
t: TfrFontSettings;
notify: TOBSNotify;
begin begin
f := TfrColorSettings.Create(self); for i := 0 to EventWebServers.Count - 1 do
t := TfrFontSettings.Create(self);
try
for i := 0 to high(listNotify) do
begin begin
if listNotify[i].TypeEvent = 1 then if EventWebServers[i].typeEvent <> 1 then
begin Continue;
notify := listNotify[i]; ws := EventWebServers[i];
se.Title := notify.HeaderText; ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aEvent.event.user_name,
se.Title := StringReplace(se.Title, '[NICK]', [rfReplaceAll]);
CustomReward.event.user_name, [rfReplaceAll]); EventWebServers[i] := ws;
se.Context := notify.MessText; EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
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; end;
end; procedure TfrOBS.toEventWebServer(aEvent: TRaidEvent);
finally
f.Free;
t.Free;
end;
end;
procedure TfrOBS.toEventWebServer(CustomReward: TRaidEvent);
var var
se: TStyleEvent; i: integer;
i, j: integer; ws: TEventWebServers;
f: TfrColorSettings;
t: TfrFontSettings;
notify: TOBSNotify;
begin begin
f := TfrColorSettings.Create(self); for i := 0 to EventWebServers.Count - 1 do
t := TfrFontSettings.Create(self);
try
for i := 0 to high(listNotify) do
begin begin
if listNotify[i].TypeEvent = 3 then if EventWebServers[i].typeEvent <> 3 then
begin Continue;
notify := listNotify[i]; ws := EventWebServers[i];
se.Title := notify.HeaderText; ws.se.Title := StringReplace(ws.se.Title, '[NICK]',
se.Title := StringReplace(se.Title, '[NICK]', aEvent.event.from_broadcaster_user_name, [rfReplaceAll]);
CustomReward.event.from_broadcaster_user_name, [rfReplaceAll]); ws.se.Context := StringReplace(ws.se.Context, '[SUM]',
se.Context := notify.MessText; inttostr(aEvent.event.viewers), [rfReplaceAll]);
se.Context := StringReplace(se.Context, '[SUM]', EventWebServers[i] := ws;
inttostr(CustomReward.event.viewers), [rfReplaceAll]); EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
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; end;
end; procedure TfrOBS.toEventWebServer(aEvent: TGiftEvent);
finally
f.Free;
t.Free;
end;
end;
procedure TfrOBS.toEventWebServer(CustomReward: TGiftEvent);
var var
se: TStyleEvent; i: integer;
i, j: integer; ws: TEventWebServers;
f: TfrColorSettings;
t: TfrFontSettings;
notify: TOBSNotify;
begin begin
f := TfrColorSettings.Create(self); for i := 0 to EventWebServers.Count - 1 do
t := TfrFontSettings.Create(self);
try
for i := 0 to high(listNotify) do
begin begin
if listNotify[i].TypeEvent = 2 then if EventWebServers[i].typeEvent <> 2 then
begin Continue;
notify := listNotify[i]; ws := EventWebServers[i];
se.Title := notify.HeaderText; ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aEvent.event.user_name,
se.Title := StringReplace(se.Title, '[NICK]', [rfReplaceAll]);
CustomReward.event.user_name, [rfReplaceAll]); EventWebServers[i] := ws;
se.Context := notify.MessText; EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
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; end;
end;
finally
f.Free;
t.Free;
end;
end;
procedure TfrOBS.toEventWebServer(aNick, aSum, aText: string); procedure TfrOBS.toEventWebServer(aNick, aSum, aText: string);
var var
i, j: integer; i: integer;
aSumInt: integer; ws: TEventWebServers;
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;
begin begin
aSumInt := StrToIntDef(aSum, 0); for i := 0 to EventWebServers.Count - 1 do
BestRow := -1;
BestPriority := -1;
BestValue := 0;
for i := 0 to high(listNotify) do
begin begin
if listNotify[i].TypeEvent = 4 then if EventWebServers[i].typeEvent <> 4 then
begin
Condition := Trim(listNotify[i].TypeEdit);
if Condition = '' then
Continue; Continue;
ws := EventWebServers[i];
CurrentPriority := -1; ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aNick, [rfReplaceAll]);
CurrentValue := 0; ws.se.Context := StringReplace(ws.se.Context, '[SUM]', aSum,
[rfReplaceAll]);
// Ïðîâåðêà íà òî÷íîå çíà÷åíèå EventWebServers[i] := ws;
if Pos('-', Condition) = 0 then EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
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
// Óñëîâèå "<X"
CurrentValue :=
StrToIntDef(Trim(StringReplace(Condition, '<', '',
[rfReplaceAll])), 0);
if aSumInt <= CurrentValue then
CurrentPriority := 1;
end;
end;
if CurrentPriority <> -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;
end; end;
end; end;
+109
View File
@@ -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
+66
View File
@@ -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<TCustomRevards>;
listRevards:tarray<TReward>;
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.
+45 -46
View File
@@ -10,42 +10,11 @@ TEventGlobal = record
Param: string; Param: string;
end; 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;
end;
type type
TBanWord = record TBanWord = record
regexp: string; regexp: string;
end; end;
type
TListTimer = record
Enable: integer;
interval: integer;
o: integer;
mess: string;
end;
type
TOBSKandinsky = record
port: integer;
end;
type type
TOBSNotify = record TOBSNotify = record
Picture: string; Picture: string;
@@ -54,18 +23,18 @@ type
ColorBlock: string; ColorBlock: string;
SolidBorder: integer; SolidBorder: integer;
Paddings: integer; Paddings: integer;
ColorBorder: integer; ColorBorder: string;
ColorBackground: integer; ColorBackground: string;
HeaderText: string; HeaderText: string;
HeaderColorFont: integer; HeaderColorFont: string;
HeaderSizeFont: integer; HeaderSizeFont: integer;
HeaderStyleFont: integer; HeaderStyleFont: string;
MessText: string; MessText: string;
MessColorFont: integer; MessColorFont: string;
MessSizeFont: integer; MessSizeFont: integer;
MessStyleFont: integer; MessStyleFont: string;
TimeMess: integer; TimeMess: integer;
TypeEvent: integer; TypeEvent: integer;
@@ -90,6 +59,33 @@ type
StyleFont: integer; StyleFont: integer;
end; 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 type
TRandomCounters = record TRandomCounters = record
rndName: string; rndName: string;
@@ -98,9 +94,12 @@ type
end; end;
type type
TListCommands = record TRLog = record
R1: string; rTime: ttime;
R2: string; rType: string;
rModule: string;
rMethod: string;
rMessage: string;
end; end;
type type
@@ -342,7 +341,7 @@ type
version: string; version: string;
status: string; status: string;
cost: integer; cost: integer;
condition: TCondition; Condition: TCondition;
transport: TTransport; transport: TTransport;
created_at: string; created_at: string;
end; end;
@@ -383,7 +382,7 @@ type
TCustomRewardEvent = record TCustomRewardEvent = record
subscription: TSubscriptionPoints; subscription: TSubscriptionPoints;
event: TEventReward; Event: TEventReward;
end; end;
TMetadata = record TMetadata = record
@@ -455,22 +454,22 @@ type
TFollowEvent = record TFollowEvent = record
subscription: TSubscriptionPoints; subscription: TSubscriptionPoints;
event: TEventFollow; Event: TEventFollow;
end; end;
TSubEvent = record TSubEvent = record
subscription: TSubscriptionPoints; subscription: TSubscriptionPoints;
event: TEventSub; Event: TEventSub;
end; end;
TGiftEvent = record TGiftEvent = record
subscription: TSubscriptionPoints; subscription: TSubscriptionPoints;
event: TEventGift; Event: TEventGift;
end; end;
TRaidEvent = record TRaidEvent = record
subscription: TSubscriptionPoints; subscription: TSubscriptionPoints;
event: TEventRaid; Event: TEventRaid;
end; end;
TBotAppCfg = record TBotAppCfg = record
+57 -113
View File
@@ -17,7 +17,8 @@ type
FCriticalSection: TCriticalSection; FCriticalSection: TCriticalSection;
procedure IdHTTPServer1CommandGet(AContext: TIdContext; procedure IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 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 GenerateHTML: string;
function GenerateJSON: string; function GenerateJSON: string;
procedure CleanupOldMessages; procedure CleanupOldMessages;
@@ -37,7 +38,7 @@ uses ugeneral;
constructor TTTW_Events.Create(FontList: TStrings; aPort: integer); constructor TTTW_Events.Create(FontList: TStrings; aPort: integer);
var var
I: Integer; I: integer;
begin begin
FCriticalSection := TCriticalSection.Create; FCriticalSection := TCriticalSection.Create;
FMessages := TList<TStyleEvent>.Create; FMessages := TList<TStyleEvent>.Create;
@@ -71,27 +72,19 @@ end;
procedure TTTW_Events.CleanupOldMessages; procedure TTTW_Events.CleanupOldMessages;
var var
I: Integer; I: integer;
TimeNow: TDateTime; TimeNow: TDateTime;
begin begin
TimeNow := Now; TimeNow := Now;
FCriticalSection.Enter;
try
for I := FMessages.Count - 1 downto 0 do for I := FMessages.Count - 1 downto 0 do
begin if SecondsBetween(TimeNow, FMessages[I].Timestamp) >= FMessages[I].TimeMsg
if SecondsBetween(TimeNow, FMessages[I].Timestamp) >= FMessages[I].TimeMsg then then
FMessages.Delete(I); FMessages.Delete(I);
end; end;
finally
FCriticalSection.Leave;
end;
end;
function TTTW_Events.GenerateHTML: string; function TTTW_Events.GenerateHTML: string;
var var
I: Integer; I: integer;
s, s1: string; s, s1: string;
begin begin
// Ãåíåðàöèÿ CSS äëÿ øðèôòîâ // Ãåíåðàöèÿ CSS äëÿ øðèôòîâ
@@ -99,126 +92,82 @@ begin
for I := 41 to fFontsList.Count - 1 do for I := 41 to fFontsList.Count - 1 do
begin begin
s1 := StringReplace(fFontsList[I], '.ttf', '', [rfReplaceAll]); 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; end;
Result := '<!DOCTYPE html><html><head>' + Result := '<!DOCTYPE html><html><head>' +
'<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">' + '<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">'
'<meta http-equiv="Pragma" content="no-cache">' + + '<meta http-equiv="Pragma" content="no-cache">' +
'<meta http-equiv="Expires" content="0">' + '<meta http-equiv="Expires" content="0">' + '<title>Twitch Messages</title>'
'<title>Twitch Messages</title>' + + '<style>' + s + '.message { ' + ' will-change: transform, opacity;' +
'<style>' + s + // Îïòèìèçàöèÿ àíèìàöèè
'.message { ' + ' backface-visibility: hidden;' + ' transform: translateZ(0);' +
' will-change: transform, opacity;' + // Îïòèìèçàöèÿ àíèìàöèè ' margin:5px; ' + ' border-radius:5px; ' +
' backface-visibility: hidden;' + ' transition: opacity 1s linear; ' + ' max-width: 600px; ' +
' transform: translateZ(0);' + ' margin-left: auto; ' + ' margin-right: auto; ' + '}' +
' margin:5px; ' + '.nick { margin: 0; padding: 2px; }' + '.text { margin: 0; padding: 5px; }'
' border-radius:5px; ' + + '#audio-warning { ' + ' display: none; ' + ' position: fixed; ' +
' transition: opacity 1s linear; ' + ' top: 10px; ' + ' right: 10px; ' + ' background: #ffcccc; ' +
' max-width: 600px; ' + ' padding: 10px; ' + ' border: 1px solid red; ' + '}' + '</style>' +
' margin-left: auto; ' + '<script>' + 'let lastPlayedTimestamp = 0;' + 'let audioEnabled = false;' +
' margin-right: auto; ' +
'}' +
'.nick { margin: 0; padding: 2px; }' +
'.text { margin: 0; padding: 5px; }' +
'#audio-warning { ' +
' display: none; ' +
' position: fixed; ' +
' top: 10px; ' +
' right: 10px; ' +
' background: #ffcccc; ' +
' padding: 10px; ' +
' border: 1px solid red; ' +
'}' +
'</style>' +
'<script>' +
'let lastPlayedTimestamp = 0;' +
'let audioEnabled = false;' +
'let pendingMessages = [];' + 'let pendingMessages = [];' +
'function enableAudio() {' + 'function enableAudio() {' + ' audioEnabled = true;' +
' audioEnabled = true;' +
' document.getElementById("audio-overlay").style.display = "none";' + ' document.getElementById("audio-overlay").style.display = "none";' +
' processPendingMessages();' + ' processPendingMessages();' + '}' +
'}' +
'function processPendingMessages() {' + 'function processPendingMessages() {' + ' pendingMessages.forEach(msg => {'
' pendingMessages.forEach(msg => {' + + ' playNotificationSound(msg);' + ' });' +
' playNotificationSound(msg);' + ' pendingMessages = [];' + '}' +
' });' +
' pendingMessages = [];' +
'}' +
'function playNotificationSound(msg) {' + 'function playNotificationSound(msg) {' + ' if(!msg.sound) return;' +
' if(!msg.sound) return;' + ' const audio = new Audio(msg.sound);' + ' audio.play()' +
' const audio = new Audio(msg.sound);' + ' .catch(error => console.log("Audio error:", error));' + '}' +
' audio.play()' +
' .catch(error => console.log("Audio error:", error));' +
'}' +
'function fetchMessages() {' + 'function fetchMessages() {' + ' fetch("/messages")' +
' fetch("/messages")' + ' .then(response => response.json())' + ' .then(data => {' +
' .then(response => response.json())' +
' .then(data => {' +
' const container = document.getElementById("messages");' + ' const container = document.getElementById("messages");' +
' container.innerHTML = "";' + ' container.innerHTML = "";' + ' data.forEach(msg => {' +
' data.forEach(msg => {' +
// Ñîõðàíÿåì ñîîáùåíèÿ äî àêòèâàöèè çâóêà // Ñîõðàíÿåì ñîîáùåíèÿ äî àêòèâàöèè çâóêà
' if(msg.sound && msg.timestamp > lastPlayedTimestamp) {' + ' if(msg.sound && msg.timestamp > lastPlayedTimestamp) {' +
' playNotificationSound(msg);' + ' playNotificationSound(msg);' +
' lastPlayedTimestamp = msg.timestamp;' + ' lastPlayedTimestamp = msg.timestamp;' + ' }' +
' }' +
' const div = document.createElement("div");' + ' const div = document.createElement("div");' +
' div.className = "message";' + ' div.className = "message";' +
' div.id = "msg-" + msg.timestamp;' + ' div.id = "msg-" + msg.timestamp;' + ' div.style = `' +
' div.style = `' +
' background-color: ${msg.color};' + ' background-color: ${msg.color};' +
' padding: ${msg.padding}px;' + ' padding: ${msg.padding}px;' +
' border: ${msg.sizeBorder}px solid ${msg.colorBorder};' + ' border: ${msg.sizeBorder}px solid ${msg.colorBorder};' +
' text-align: center;' + ' text-align: center;' + ' `;' +
' `;' +
// Âíóòðåííèé HTML // Âíóòðåííèé HTML
' let content = "";' + ' let content = "";' + ' if(msg.url) {' +
' if(msg.url) {' + ' content += `<img src="${msg.url}" style="max-width: 100%; height: auto;">`;'
' content += `<img src="${msg.url}" style="max-width: 100%; height: auto;">`;' + + ' }' + ' content += `' + ' <p class="nick" style="'
' }' + + ' color: ${msg.titlecolor};' +
' content += `' +
' <p class="nick" style="' +
' color: ${msg.titlecolor};' +
' font-family: ''${msg.titlefamily}'';' + ' font-family: ''${msg.titlefamily}'';' +
' font-size: ${msg.titleSize}px;">' + ' font-size: ${msg.titleSize}px;">' +
' ${msg.nickname}' + ' ${msg.nickname}' + ' </p>' +
' </p>' +
' <p class="text" style="' + ' <p class="text" style="' +
' color: ${msg.contentcolor};' + ' color: ${msg.contentcolor};' +
' font-family: ''${msg.contentfamily}'';' + ' font-family: ''${msg.contentfamily}'';' +
' font-size: ${msg.contentSize}px;">' + ' font-size: ${msg.contentSize}px;">' +
' ${msg.content}' + ' ${msg.content}' + ' </p>' + ' `;' +
' </p>' +
' `;' +
' div.innerHTML = content;' + ' div.innerHTML = content;' +
// Àíèìàöèÿ èñ÷åçíîâåíèÿ // Àíèìàöèÿ èñ÷åçíîâåíèÿ
' setTimeout(() => {' + ' setTimeout(() => {' + ' div.style.opacity = "0";' +
' div.style.opacity = "0";' +
' setTimeout(() => div.remove(), 1000);' + ' setTimeout(() => div.remove(), 1000);' +
' }, (msg.duration - 1) * 1000);' + ' }, (msg.duration - 1) * 1000);' +
' container.appendChild(div);' + ' container.appendChild(div);' + ' });' + ' });' + '}' +
' });' +
' });' +
'}' +
'setInterval(fetchMessages, 500);' + 'setInterval(fetchMessages, 1000);' + 'fetchMessages();' + '</script>' +
'fetchMessages();' +
'</script>' +
'</head>' + '</head>' + '<body>' + ' <div id="messages"></div>' +
'<body>' +
' <div id="messages"></div>' +
'</body></html>'; '</body></html>';
end; end;
@@ -226,42 +175,36 @@ end;
function TTTW_Events.GenerateJSON: string; function TTTW_Events.GenerateJSON: string;
var var
JSONArray: TJSONArray; JSONArray: TJSONArray;
I: Integer; S,S1:STRING; I: Integer;
Msg: TStyleEvent; Msg: TStyleEvent;
begin begin
JSONArray := TJSONArray.Create; JSONArray := TJSONArray.Create;
try try
FCriticalSection.Enter; FCriticalSection.Enter;
try try
CleanupOldMessages;
for I := 0 to FMessages.Count - 1 do for I := 0 to FMessages.Count - 1 do
begin begin
Msg := FMessages[I]; Msg := FMessages[I];
s:=StringReplace(Msg.FontTitle.Font,'.ttf','',[rfReplaceAll]);
s1:=StringReplace(Msg.FontContext.Font,'.ttf','',[rfReplaceAll]);
JSONArray.AddElement(TJSONObject.Create JSONArray.AddElement(
TJSONObject.Create
.AddPair('nickname', Msg.Title) .AddPair('nickname', Msg.Title)
.AddPair('url', Msg.Url) .AddPair('url', Msg.Url)
.AddPair('content', Msg.Context) .AddPair('content', Msg.Context)
.AddPair('timestamp', TJSONNumber.Create(DateTimeToUnix(Msg.Timestamp))) .AddPair('timestamp', TJSONNumber.Create(DateTimeToUnix(Msg.Timestamp)))
.AddPair('sound', Msg.SoundURL) .AddPair('sound', Msg.SoundURL)
.AddPair('duration', Msg.TimeMsg) .AddPair('duration', Msg.TimeMsg)
.AddPair('color', Msg.BlockColor) .AddPair('color', Msg.BlockColor)
.AddPair('colorBorder', Msg.BorderColor) .AddPair('colorBorder', Msg.BorderColor)
.AddPair('sizeBorder', TJSONNumber.Create(Msg.BorderSize)) .AddPair('sizeBorder', TJSONNumber.Create(Msg.BorderSize))
.AddPair('fontSize', TJSONNumber.Create(Msg.FontTitle.size)) .AddPair('fontSize', TJSONNumber.Create(Msg.FontTitle.Size))
.AddPair('titlecolor', Msg.FontTitle.Color) .AddPair('titlecolor', Msg.FontTitle.Color)
.AddPair('titlefamily', s) .AddPair('titlefamily', TPath.GetFileNameWithoutExtension(Msg.FontTitle.Font))
.AddPair('titleSize', TJSONNumber.Create(Msg.FontTitle.Size)) .AddPair('titleSize', TJSONNumber.Create(Msg.FontTitle.Size))
.AddPair('contentcolor', Msg.FontContext.Color) .AddPair('contentcolor', Msg.FontContext.Color)
.AddPair('contentfamily', s1) .AddPair('contentfamily', TPath.GetFileNameWithoutExtension(Msg.FontContext.Font))
.AddPair('contentSize', TJSONNumber.Create(Msg.FontContext.Size)) .AddPair('contentSize', TJSONNumber.Create(Msg.FontContext.Size))
);
); // Ôèêñèðîâàííûé ðàçìåð òåêñòà
end; end;
finally finally
FCriticalSection.Leave; FCriticalSection.Leave;
@@ -271,10 +214,10 @@ begin
finally finally
JSONArray.Free; JSONArray.Free;
end; end;
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 var
FileName: string; FileName: string;
FilePath: string; FilePath: string;
@@ -290,6 +233,7 @@ begin
AResponseInfo.ContentStream := FS; AResponseInfo.ContentStream := FS;
AResponseInfo.ContentType := GetMIMETypeFromFile(FilePath);; AResponseInfo.ContentType := GetMIMETypeFromFile(FilePath);;
AResponseInfo.ResponseNo := 200; AResponseInfo.ResponseNo := 200;
AResponseInfo.FreeContentStream := True;
except except
FS.Free; FS.Free;
AResponseInfo.ResponseNo := 500; AResponseInfo.ResponseNo := 500;
+3 -3
View File
@@ -28,7 +28,7 @@ uses
procedure GenerationError(Sender: TObject; const ErrorMessage: string); procedure GenerationError(Sender: TObject; const ErrorMessage: string);
procedure GenerationUpdate(Sender: TObject; const Message: string); procedure GenerationUpdate(Sender: TObject; const Message: string);
public public
constructor Create(aKey:string; aSecret:string); constructor Create(aKey:string; aSecret:string; aPort:integer);
destructor Destroy; destructor Destroy;
procedure generate(prompt:string; aNick:string); procedure generate(prompt:string; aNick:string);
procedure ActiveServer(aEn: boolean); procedure ActiveServer(aEn: boolean);
@@ -51,10 +51,10 @@ begin
end; end;
end; end;
constructor TKandinsky_Web.Create(aKey:string; aSecret:string); constructor TKandinsky_Web.Create(aKey:string; aSecret:string; aPort:integer);
begin begin
IdHTTPServer1 := TIdHTTPServer.Create; IdHTTPServer1 := TIdHTTPServer.Create;
IdHTTPServer1.DefaultPort := 8087; IdHTTPServer1.DefaultPort := aPort;
IdHTTPServer1.OnCommandGet := IdHTTPServer1CommandGet; IdHTTPServer1.OnCommandGet := IdHTTPServer1CommandGet;
ka:=TFusionBrainAPI.Create(nil,aKey, aSecret); ka:=TFusionBrainAPI.Create(nil,aKey, aSecret);
ka.OnGenerationDone := GenerationDone; ka.OnGenerationDone := GenerationDone;