diff --git a/TTW_Bot_app.dpr b/TTW_Bot_app.dpr
index 3456101..10365f7 100644
--- a/TTW_Bot_app.dpr
+++ b/TTW_Bot_app.dpr
@@ -25,7 +25,8 @@ uses
uQ in 'uQ.pas' {frmQ},
fSimpleGrid in 'fSimpleGrid.pas' {frSimpleGrid: TFrame},
fContruct in 'fContruct.pas' {frContruct: TFrame},
- fGroupsRequest in 'fGroupsRequest.pas' {frGroupsRequest: TFrame};
+ fGroupsRequest in 'fGroupsRequest.pas' {frGroupsRequest: TFrame},
+ uMyTimer in 'uMyTimer.pas';
{$R *.res}
diff --git a/TTW_Bot_app.dproj b/TTW_Bot_app.dproj
index 2ce11de..722e873 100644
--- a/TTW_Bot_app.dproj
+++ b/TTW_Bot_app.dproj
@@ -392,6 +392,7 @@
fmx
TFrame
+
Base
diff --git a/fAutoActions.fmx b/fAutoActions.fmx
index ea06086..acd64f1 100644
--- a/fAutoActions.fmx
+++ b/fAutoActions.fmx
@@ -35,6 +35,7 @@ object frAutoActions: TfrAutoActions
TabOrder = 40
Text = #1044#1086#1073#1072#1074#1080#1090#1100
TextSettings.Trimming = None
+ OnClick = btnAddMessageClick
end
object btnRmMessage: TButton
Position.X = 184.000000000000000000
@@ -42,6 +43,7 @@ object frAutoActions: TfrAutoActions
TabOrder = 41
Text = #1059#1076#1072#1083#1080#1090#1100
TextSettings.Trimming = None
+ OnClick = btnRmMessageClick
end
object btnEditMessage: TButton
Position.X = 96.000000000000000000
@@ -49,6 +51,7 @@ object frAutoActions: TfrAutoActions
TabOrder = 42
Text = #1048#1079#1084#1077#1085#1080#1090#1100
TextSettings.Trimming = None
+ OnClick = btnEditMessageClick
end
object btnNotifyTest: TButton
Position.X = 412.000000000000000000
@@ -59,6 +62,7 @@ object frAutoActions: TfrAutoActions
TabOrder = 43
Text = #1058#1077#1089#1090
TextSettings.Trimming = None
+ OnClick = btnNotifyTestClick
end
object sgTimers: TStringGrid
CanFocus = True
@@ -70,6 +74,7 @@ object frAutoActions: TfrAutoActions
Size.PlatformDefault = False
TabOrder = 44
RowCount = 0
+ OnEditingDone = sgTimersEditingDone
Viewport.Width = 459.000000000000000000
Viewport.Height = 200.000000000000000000
object ccTimerEnable: TCheckColumn
diff --git a/fAutoActions.pas b/fAutoActions.pas
index 7912726..148b95d 100644
--- a/fAutoActions.pas
+++ b/fAutoActions.pas
@@ -3,10 +3,11 @@ unit fAutoActions;
interface
uses
- System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
+ 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, FMX.Edit,
- FMX.Controls.Presentation;
+ System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.ScrollBox, FMX.Edit, StrUtils,
+ FMX.Controls.Presentation, uMyTimer, uRecords, System.Generics.Collections;
type
TfrAutoActions = class(TFrame)
@@ -48,14 +49,204 @@ type
scCounterTrigger: TStringColumn;
icCounterCount: TIntegerColumn;
ccCounterAuto: TCheckColumn;
+ procedure btnAddMessageClick(Sender: TObject);
+ procedure btnEditMessageClick(Sender: TObject);
+ procedure btnRmMessageClick(Sender: TObject);
+ procedure btnNotifyTestClick(Sender: TObject);
+ procedure sgTimersEditingDone(Sender: TObject; const ACol, ARow: Integer);
private
{ Private declarations }
+ procedure OnMyTimerExec(Sender: TObject; const txt: string; o: Boolean);
+
public
{ Public declarations }
+ FTimerList: TObjectList;
+ listTimer: TArray;
+ procedure UpdateGridFromArray;
+ procedure initTimers;
end;
implementation
{$R *.fmx}
+uses uGeneral;
+
+procedure TfrAutoActions.btnAddMessageClick(Sender: TObject);
+var
+ TimerThread: TMyTimerThread;
+ NewRec: TListTimer;
+begin
+ if (edtMessage.text = '') or (edtInterval.text = '') then
+ exit;
+
+ TimerThread := TMyTimerThread.Create(edtInterval.text.ToInteger,
+ edtMessage.text, false);
+ TimerThread.OnTimerExec := OnMyTimerExec;
+ FTimerList.Add(TimerThread);
+
+ NewRec.Enable := 1;
+ NewRec.interval := edtInterval.text.ToInteger;
+ NewRec.o := 0;
+ NewRec.mess := edtMessage.text;
+
+ SetLength(listTimer, Length(listTimer) + 1);
+ listTimer[High(listTimer)] := NewRec;
+
+ UpdateGridFromArray;
+ DB.SaveRecordArray('listTimer', listTimer);
+
+ edtMessage.text := '';
+ edtInterval.text := '10';
+end;
+
+procedure TfrAutoActions.btnEditMessageClick(Sender: TObject);
+var
+ SelectedRow: Integer;
+ NewText: string;
+ NewInterval: Integer;
+ RowIndex: Integer;
+begin
+ SelectedRow := sgTimers.Row;
+ if (edtMessage.text = '') or (edtInterval.text = '') or (SelectedRow <= 0) or
+ (SelectedRow >= sgTimers.RowCount) then
+ exit;
+ NewText := edtMessage.text;
+ NewInterval := StrToIntDef(edtInterval.text, 0);
+
+ RowIndex := sgTimers.Row;
+ if (RowIndex < 0) or (RowIndex > High(listTimer)) then
+ exit;
+ if NewInterval <= 0 then
+ exit;
+
+ // Обновляем настройки таймера
+ FTimerList[SelectedRow].Update(sgTimers.Cells[2, SelectedRow].ToInteger,
+ sgTimers.Cells[1, SelectedRow], (sgTimers.Cells[3, SelectedRow] = 'True'));
+ listTimer[RowIndex].interval := NewInterval;
+ listTimer[RowIndex].mess := NewText;
+ UpdateGridFromArray;
+ DB.SaveRecordArray('listTimer', listTimer);
+
+ edtMessage.text := '';
+ edtInterval.text := '';
+end;
+
+procedure TfrAutoActions.btnNotifyTestClick(Sender: TObject);
+var
+ s: string;
+ B: Boolean;
+begin
+ s := sgTimers.Cells[1, sgTimers.Row];
+ B := sgTimers.Cells[3, sgTimers.Row] = 'True';
+ { if B then
+ ttw_API.sendNotify(s)
+ else
+ ttw_IRS.sendMessage(s); }
+end;
+
+procedure TfrAutoActions.btnRmMessageClick(Sender: TObject);
+var
+ SelectedRow: Integer;
+ i, RowIndex: Integer;
+begin
+ SelectedRow := sgTimers.Row;
+ // Проверяем валидность выбранной строки
+ if (SelectedRow < 0) or (SelectedRow >= sgTimers.RowCount) then
+ exit;
+ // Проверяем наличие таймера в списке
+ if (SelectedRow < FTimerList.Count) then
+ begin
+ // Останавливаем и уничтожаем таймер
+ if Assigned(FTimerList[SelectedRow]) then
+ begin
+ FTimerList[SelectedRow].StopT;
+ FTimerList[SelectedRow].TerminateAndDestroy; // Метод для остановки потока
+ FTimerList.Delete(SelectedRow); // Удаляем из списка с автоуничтожением
+ end;
+ end;
+ // Удаляем строку из сетки
+
+ RowIndex := sgTimers.Row;
+ if (RowIndex < 0) or (RowIndex > High(listTimer)) then
+ exit;
+
+ // Сдвигаем элементы массива
+ for i := RowIndex to High(listTimer) do
+ listTimer[i] := listTimer[i + 1];
+ SetLength(listTimer, Length(listTimer) - 1);
+ UpdateGridFromArray;
+ DB.SaveRecordArray('listTimer', listTimer);
+end;
+
+procedure TfrAutoActions.initTimers;
+var
+ i: Integer;
+ TimerThread: TMyTimerThread;
+begin
+ for i := 0 to High(listTimer) do
+ begin
+ TimerThread := TMyTimerThread.Create(listTimer[i].interval,
+ listTimer[i].mess, listTimer[i].o = 1);
+ TimerThread.OnTimerExec := OnMyTimerExec;
+ FTimerList.Add(TimerThread);
+ end;
+end;
+
+procedure TfrAutoActions.OnMyTimerExec(Sender: TObject; const txt: string;
+ o: Boolean);
+begin
+ { if o then
+ ttw_API.sendNotify(txt)
+ else
+ ttw_IRS.sendMessage(txt); }
+end;
+
+procedure TfrAutoActions.sgTimersEditingDone(Sender: TObject;
+ const ACol, ARow: Integer);
+var
+ NewRec: TListTimer;
+begin
+ NewRec.Enable := strtoint(ifthen(sgTimers.Cells[0, ARow] = 'True', '1', '0'));
+ NewRec.o := strtoint(ifthen(sgTimers.Cells[3, ARow] = 'True', '1', '0'));
+ NewRec.interval := strtoint(sgTimers.Cells[2, ARow]);
+ NewRec.mess := sgTimers.Cells[1, ARow];
+ if ACol = 0 then // Колонка enabled
+ begin
+ if NewRec.Enable = 1 then
+ FTimerList[ARow].StartT
+ else
+ FTimerList[ARow].StopT;
+ end;
+ if ACol = 3 then // Колонка o
+ begin
+ // Обновляем настройки таймера
+ FTimerList[ARow].Update(NewRec.interval, NewRec.mess, (NewRec.o = 1));
+ end;
+ listTimer[ARow] := NewRec;
+ UpdateGridFromArray;
+ DB.SaveRecordArray('listTimer', listTimer);
+end;
+
+procedure TfrAutoActions.UpdateGridFromArray;
+var
+ i: Integer;
+begin
+ sgTimers.BeginUpdate;
+ try
+ sgTimers.RowCount := 0; // Сбрасываем строки (оставляем только заголовки)
+
+ for i := 0 to High(listTimer) do
+ begin
+ sgTimers.RowCount := i + 1;
+ sgTimers.Cells[0, i] := ifthen(listTimer[i].Enable = 1, 'True', 'False');
+ sgTimers.Cells[1, i] := listTimer[i].mess;
+ sgTimers.Cells[2, i] := IntToStr(listTimer[i].interval);
+ sgTimers.Cells[3, i] := ifthen(listTimer[i].o = 1, 'True', 'False');
+ end;
+ finally
+ sgTimers.EndUpdate;
+ end;
+end;
+
end.
diff --git a/fCommands.fmx b/fCommands.fmx
index 2c50142..0e11afd 100644
--- a/fCommands.fmx
+++ b/fCommands.fmx
@@ -14,8 +14,8 @@ object frCommands: TfrCommands
RowCount = 0
Options = [ColumnResize, ColumnMove, ColLines, RowLines, Tabs, Header, HeaderClick, AutoDisplacement]
OnCellClick = sgCommandsCellClick
- Viewport.Width = 536.000000000000000000
- Viewport.Height = 168.000000000000000000
+ Viewport.Width = 540.000000000000000000
+ Viewport.Height = 193.000000000000000000
object scCommand: TStringColumn
Header = #1050#1086#1084#1072#1085#1076#1072
HeaderSettings.TextSettings.WordWrap = False
@@ -45,8 +45,37 @@ object frCommands: TfrCommands
Size.Height = 417.000000000000000000
Size.PlatformDefault = False
inherited mResponse: TMemo
- Viewport.Width = 388.000000000000000000
- Viewport.Height = 157.000000000000000000
+ Viewport.Width = 392.000000000000000000
+ Viewport.Height = 161.000000000000000000
+ end
+ inherited GroupBox7: TGroupBox
+ inherited btnAddUserName: TButton
+ TabOrder = 37
+ end
+ inherited btnGetDateFollow: TButton
+ TabOrder = 38
+ end
+ inherited btnGetAgeAccaunt: TButton
+ TabOrder = 39
+ end
+ inherited btnCounterAddtoText: TButton
+ TabOrder = 40
+ end
+ inherited cbCounterName: TComboBox
+ TabOrder = 41
+ end
+ inherited btnGPT: TButton
+ TabOrder = 42
+ end
+ inherited btnRandomUserName: TButton
+ TabOrder = 43
+ end
+ inherited btnGetChannelStat: TButton
+ TabOrder = 44
+ end
+ inherited btnAIPic: TButton
+ TabOrder = 45
+ end
end
inherited btnAddCommand: TButton
OnClick = frContruct1btnAddCommandClick
@@ -86,16 +115,16 @@ object frCommands: TfrCommands
Viewport.Height = 116.000000000000000000
end
inherited btnRandomAdd: TButton
- TabOrder = 35
+ TabOrder = 34
end
inherited btnRandomDel: TButton
- TabOrder = 36
+ TabOrder = 35
end
inherited btnRmGroup: TButton
- TabOrder = 38
+ TabOrder = 37
end
inherited Label4: TLabel
- TabOrder = 40
+ TabOrder = 39
end
end
end
@@ -178,8 +207,8 @@ object frCommands: TfrCommands
RowCount = 0
Options = [ColumnResize, ColumnMove, ColLines, RowLines, Tabs, Header, HeaderClick, AutoDisplacement]
OnCellDblClick = sgRandomIntCellDblClick
- Viewport.Width = 153.000000000000000000
- Viewport.Height = 119.000000000000000000
+ Viewport.Width = 157.000000000000000000
+ Viewport.Height = 144.000000000000000000
object scRIntName: TStringColumn
Header = #1053#1072#1079#1074#1072#1085#1080#1077
HeaderSettings.TextSettings.WordWrap = False
@@ -217,10 +246,9 @@ object frCommands: TfrCommands
Size.PlatformDefault = False
inherited sg: TStringGrid
Size.Width = 293.000000000000000000
- TabOrder = 43
OnCellDblClick = frsgSoundssgCellDblClick
- Viewport.Width = 289.000000000000000000
- Viewport.Height = 124.000000000000000000
+ Viewport.Width = 293.000000000000000000
+ Viewport.Height = 149.000000000000000000
inherited sgR2: TStringColumn
Size.Width = 170.000000000000000000
end
@@ -253,10 +281,9 @@ object frCommands: TfrCommands
Size.PlatformDefault = False
inherited sg: TStringGrid
Size.Width = 293.000000000000000000
- TabOrder = 43
OnCellDblClick = frsgFilessgCellDblClick
- Viewport.Width = 289.000000000000000000
- Viewport.Height = 124.000000000000000000
+ Viewport.Width = 293.000000000000000000
+ Viewport.Height = 149.000000000000000000
inherited sgR2: TStringColumn
Size.Width = 170.000000000000000000
end
@@ -293,10 +320,9 @@ object frCommands: TfrCommands
Size.PlatformDefault = False
inherited sg: TStringGrid
Size.Width = 293.000000000000000000
- TabOrder = 43
OnCellDblClick = frsgNeirosgCellDblClick
- Viewport.Width = 289.000000000000000000
- Viewport.Height = 124.000000000000000000
+ Viewport.Width = 293.000000000000000000
+ Viewport.Height = 149.000000000000000000
inherited sgR2: TStringColumn
Header = #1047#1072#1087#1088#1086#1089
Size.Width = 170.000000000000000000
diff --git a/fSimpleGrid.fmx b/fSimpleGrid.fmx
index eb6bffb..f8ed4bf 100644
--- a/fSimpleGrid.fmx
+++ b/fSimpleGrid.fmx
@@ -9,12 +9,12 @@ object frSimpleGrid: TfrSimpleGrid
Size.Width = 339.000000000000000000
Size.Height = 149.000000000000000000
Size.PlatformDefault = False
- TabOrder = 44
+ TabOrder = 43
RowCount = 0
Options = [ColumnResize, ColumnMove, ColLines, RowLines, Tabs, Header, HeaderClick, AutoDisplacement]
OnCellClick = sgCellClick
- Viewport.Width = 335.000000000000000000
- Viewport.Height = 124.000000000000000000
+ Viewport.Width = 339.000000000000000000
+ Viewport.Height = 149.000000000000000000
object sgR1: TStringColumn
Header = #1053#1072#1079#1074#1072#1085#1080#1077
HeaderSettings.TextSettings.WordWrap = False
diff --git a/uCreateChat.pas b/uCreateChat.pas
index dc28bf2..5222cda 100644
--- a/uCreateChat.pas
+++ b/uCreateChat.pas
@@ -88,6 +88,7 @@ begin
fCreateChat.sbTimeMsg.Value := aRec.TimeMess;
fCreateChat.sbMaxMsg.Value := aRec.MaxCountMess;
fCreateChat.sbWebServerPort.Value := aRec.port;
+ oldPort := aRec.port;
end;
procedure TfCreateChat.btnCreateWebChatClick(Sender: TObject);
diff --git a/uCreateNotify.pas b/uCreateNotify.pas
index 6077c98..dc48e6f 100644
--- a/uCreateNotify.pas
+++ b/uCreateNotify.pas
@@ -112,6 +112,7 @@ begin
fCreateNotify.cbEventsType.ItemIndex := TypeEvent;
fCreateNotify.edtIF.Text := TypeEdit;
fCreateNotify.sbWebServerPort.Value := port;
+ oldPort:=port;
end;
end;
diff --git a/uGeneral.fmx b/uGeneral.fmx
index 422512b..05a88b5 100644
--- a/uGeneral.fmx
+++ b/uGeneral.fmx
@@ -17,7 +17,7 @@ object TTW_Bot: TTTW_Bot
Size.Width = 970.000000000000000000
Size.Height = 744.000000000000000000
Size.PlatformDefault = False
- TabIndex = 4
+ TabIndex = 7
TabOrder = 0
TabPosition = PlatformDefault
Sizes = (
@@ -283,13 +283,13 @@ object TTW_Bot: TTTW_Bot
Viewport.Height = 116.000000000000000000
end
inherited btnRandomAdd: TButton
- TabOrder = 34
+ TabOrder = 33
end
inherited btnRandomDel: TButton
- TabOrder = 35
+ TabOrder = 34
end
- inherited btnRmGroup: TButton
- TabOrder = 37
+ inherited Label4: TLabel
+ TabOrder = 35
end
inherited Label5: TLabel
TabOrder = 43
@@ -432,7 +432,7 @@ object TTW_Bot: TTTW_Bot
item
end>
TextSettings.Trimming = None
- IsSelected = True
+ IsSelected = False
ImageIndex = 10
Size.Width = 136.000000000000000000
Size.Height = 26.000000000000000000
@@ -450,8 +450,8 @@ object TTW_Bot: TTTW_Bot
inherited sgWebChats: TStringGrid
Size.Width = 970.000000000000000000
Size.Height = 282.000000000000000000
- Viewport.Width = 970.000000000000000000
- Viewport.Height = 282.000000000000000000
+ Viewport.Width = 966.000000000000000000
+ Viewport.Height = 257.000000000000000000
inherited StringColumn2: TStringColumn
Size.Width = 200.000000000000000000
end
@@ -472,7 +472,7 @@ object TTW_Bot: TTTW_Bot
OnClick = frOBS1btnDeleteeChatClick
end
inherited Label1: TLabel
- TabOrder = 8
+ TabOrder = 9
end
inherited btnCreateOBSNotify: TButton
Images = ImageList1
@@ -585,7 +585,7 @@ object TTW_Bot: TTTW_Bot
item
end>
TextSettings.Trimming = None
- IsSelected = False
+ IsSelected = True
ImageIndex = 23
Size.Width = 101.000000000000000000
Size.Height = 26.000000000000000000
@@ -601,25 +601,36 @@ object TTW_Bot: TTTW_Bot
Size.Height = 718.000000000000000000
Size.PlatformDefault = False
inherited GroupBox20: TGroupBox
+ inherited edtMessage: TEdit
+ TabOrder = 38
+ end
+ inherited edtInterval: TEdit
+ TabOrder = 39
+ end
inherited btnAddMessage: TButton
Images = ImageList1
ImageIndex = 0
+ TabOrder = 40
end
inherited btnRmMessage: TButton
Images = ImageList1
ImageIndex = 4
+ TabOrder = 41
end
inherited btnEditMessage: TButton
Images = ImageList1
ImageIndex = 3
+ TabOrder = 42
end
inherited btnNotifyTest: TButton
Images = ImageList1
ImageIndex = 25
+ TabOrder = 43
end
inherited sgTimers: TStringGrid
- Viewport.Width = 463.000000000000000000
- Viewport.Height = 225.000000000000000000
+ TabOrder = 44
+ Viewport.Width = 459.000000000000000000
+ Viewport.Height = 200.000000000000000000
inherited scTimerMessage: TStringColumn
Size.Width = 301.000000000000000000
end
@@ -629,21 +640,28 @@ object TTW_Bot: TTTW_Bot
end
end
inherited GroupBox23: TGroupBox
+ inherited edtBanWords: TEdit
+ TabOrder = 38
+ end
inherited btnBanWordsAdd: TButton
Images = ImageList1
ImageIndex = 0
+ TabOrder = 39
end
inherited btnBanWordsEdt: TButton
Images = ImageList1
ImageIndex = 3
+ TabOrder = 40
end
inherited btnBanWordsDel: TButton
Images = ImageList1
ImageIndex = 4
+ TabOrder = 41
end
inherited sgBanWords: TStringGrid
- Viewport.Width = 297.000000000000000000
- Viewport.Height = 225.000000000000000000
+ TabOrder = 42
+ Viewport.Width = 293.000000000000000000
+ Viewport.Height = 200.000000000000000000
inherited scRegEx: TStringColumn
Size.Width = 265.000000000000000000
end
@@ -654,34 +672,47 @@ object TTW_Bot: TTTW_Bot
Position.X = 217.000000000000000000
Size.Width = 88.000000000000000000
Size.PlatformDefault = False
+ TabOrder = 43
+ end
+ inherited Label6: TLabel
+ TabOrder = 44
end
inherited edtBanWordsCheck: TEdit
+ TabOrder = 45
Size.Width = 201.000000000000000000
end
+ inherited Label7: TLabel
+ TabOrder = 46
+ end
+ inherited lBanWordsCheck: TLabel
+ TabOrder = 47
+ end
end
inherited GroupBox17: TGroupBox
+ inherited edtCounterName: TEdit
+ TabOrder = 42
+ end
inherited edtCounterTrigger: TEdit
- TabOrder = 38
+ TabOrder = 39
end
inherited edtCounterCount: TEdit
- TabOrder = 37
+ TabOrder = 38
end
inherited btnCounterAdd: TButton
Images = ImageList1
ImageIndex = 0
- TabOrder = 39
+ TabOrder = 40
end
inherited btnCounterDelete: TButton
Images = ImageList1
ImageIndex = 4
- TabOrder = 40
end
inherited btnCounterP: TButton
Images = ImageList1
ImageIndex = 0
Position.X = 416.000000000000000000
Size.Width = 22.000000000000000000
- TabOrder = 42
+ TabOrder = 43
Text = ''
end
inherited btnCounterM: TButton
@@ -689,18 +720,18 @@ object TTW_Bot: TTTW_Bot
ImageIndex = 12
Position.X = 449.000000000000000000
Size.Width = 22.000000000000000000
- TabOrder = 43
+ TabOrder = 44
Text = ''
end
inherited btnCounterEdit: TButton
Images = ImageList1
ImageIndex = 3
- TabOrder = 44
+ TabOrder = 45
end
inherited sgCounter: TStringGrid
- TabOrder = 45
- Viewport.Width = 463.000000000000000000
- Viewport.Height = 121.000000000000000000
+ TabOrder = 46
+ Viewport.Width = 459.000000000000000000
+ Viewport.Height = 96.000000000000000000
inherited scCounterTrigger: TStringColumn
Size.Width = 236.000000000000000000
end
diff --git a/uGeneral.pas b/uGeneral.pas
index 3e6489b..5faefbe 100644
--- a/uGeneral.pas
+++ b/uGeneral.pas
@@ -8,7 +8,8 @@ uses
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl,
FMX.Controls.Presentation, FMX.StdCtrls, System.ImageList, FMX.ImgList,
FMX.Styles, ShellAPI, StrUtils,
- fSettings, fAI, fNotify, fAutoActions, FMX.ListBox, fLog, uRecords,
+ fSettings, fAI, fNotify, fAutoActions, FMX.ListBox, fLog, uMyTimer, uRecords,
+ System.Generics.Collections,
System.IOUtils, fCommands, uDataBase, FMX.Edit, FMX.Colors, FMX.SpinBox,
windows, System.Skia, FMX.Skia, uCreateChat, uCreateNotify, fOBS;
@@ -133,6 +134,7 @@ begin
myConst.cfg1 := myConst.GeneralPath + 'botapp.cfg';
db := TSettingsDatabase.Create(myConst.DBPath);
+ frAutoActions1.FTimerList := TObjectList.Create(false);
ReadDB;
frCommands1.frsgSounds.ObjectRecord := frCommands1.listSounds;
frCommands1.frsgSounds.TableName := 'listSounds';
@@ -252,11 +254,6 @@ var
db.LoadRecordArray('listCommands', frCommands1.listCommands);
frCommands1.UpdateGridFromArray;
- db.LoadRecordArray('listChats', frOBS1.listChats);
- db.LoadRecordArray('listNotify', frOBS1.listNotify);
- db.LoadRecordArray('listKandinsky', frOBS1.listKandinsky);
- frOBS1.UpdateGridFromArray;
-
end;
// Загрузка списка групп
@@ -352,11 +349,11 @@ var
frAI1.rbGC.IsChecked := True;
frAI1.Label45.text := 'ClientID';
frAI1.Label47.text := 'Autorization Code';
- frAI1.Label1.Visible := False;
+ frAI1.Label1.Visible := false;
frAI1.edtAIP2.Visible := True;
frAI1.edtAIP2.Password := True;
- frAI1.edtAIP3.Visible := False;
- frAI1.cbOllama.Visible := False;
+ frAI1.edtAIP3.Visible := false;
+ frAI1.cbOllama.Visible := false;
end;
// Настройки DeepSeek
@@ -365,10 +362,10 @@ var
frAI1.rbDS.IsChecked := True;
frAI1.Label45.text := 'API Token';
frAI1.Label47.text := '';
- frAI1.Label1.Visible := False;
- frAI1.edtAIP2.Visible := False;
- frAI1.edtAIP3.Visible := False;
- frAI1.cbOllama.Visible := False;
+ frAI1.Label1.Visible := false;
+ frAI1.edtAIP2.Visible := false;
+ frAI1.edtAIP3.Visible := false;
+ frAI1.cbOllama.Visible := false;
end;
// Настройки ChatGPT
@@ -377,10 +374,10 @@ var
frAI1.rbCG.IsChecked := True;
frAI1.Label45.text := 'API Token';
frAI1.Label47.text := '';
- frAI1.Label1.Visible := False;
- frAI1.edtAIP2.Visible := False;
- frAI1.edtAIP3.Visible := False;
- frAI1.cbOllama.Visible := False;
+ frAI1.Label1.Visible := false;
+ frAI1.edtAIP2.Visible := false;
+ frAI1.edtAIP3.Visible := false;
+ frAI1.cbOllama.Visible := false;
end;
// Настройки кастомного ИИ
@@ -391,7 +388,7 @@ var
frAI1.Label47.text := 'URL';
frAI1.Label1.Visible := True;
frAI1.edtAIP2.Visible := True;
- frAI1.edtAIP2.Password := False;
+ frAI1.edtAIP2.Password := false;
frAI1.edtAIP3.Visible := True;
frAI1.cbOllama.Visible := True;
frAI1.cbOllama.IsChecked := db.ReadSetting(frAI1.cbOllama.Name) = '1';
@@ -425,9 +422,18 @@ var
// Загрузка гридов автоматических действий
procedure LoadAutoActionsGrids;
begin
- db.LoadGridFromTable('sgTimers', frAutoActions1.sgTimers);
- db.LoadGridFromTable('sgCounter', frAutoActions1.sgCounter);
- db.LoadGridFromTable('sgBanWords', frAutoActions1.sgBanWords);
+ db.LoadRecordArray('listTimer', frAutoActions1.listTimer);
+ frAutoActions1.initTimers;
+ frAutoActions1.UpdateGridFromArray;
+ end;
+
+// Загрузка интеграций с ОБС
+ procedure LoadOBSGrids;
+ begin
+ db.LoadRecordArray('listChats', frOBS1.listChats);
+ db.LoadRecordArray('listNotify', frOBS1.listNotify);
+ db.LoadRecordArray('listKandinsky', frOBS1.listKandinsky);
+ frOBS1.UpdateGridFromArray;
end;
begin
@@ -438,6 +444,7 @@ begin
LoadNotifySettings;
LoadAISettings;
+ LoadOBSGrids;
LoadAutoActionsGrids;
end;
diff --git a/uMyTimer.pas b/uMyTimer.pas
new file mode 100644
index 0000000..e7b0f84
--- /dev/null
+++ b/uMyTimer.pas
@@ -0,0 +1,158 @@
+unit uMyTimer;
+
+interface
+
+uses
+ System.Classes, System.SyncObjs, System.SysUtils;
+
+type
+ TTimerExec = procedure(Sender: TObject; const txt: string; o: Boolean) of object;
+
+ TMyTimerThread = class(TThread)
+ private
+ FEvent: TEvent;
+ FCriticalSection: TCriticalSection;
+ FInterval: Integer;
+ FText: string;
+ FFlagO: Boolean;
+ FEnabled: Boolean;
+ FOnTimerExec: TTimerExec;
+ procedure SyncTimerEvent;
+ protected
+ procedure Execute; override;
+ public
+ constructor Create(AIntervalMinutes: Integer; const AText: string; AFlagO: Boolean);
+ destructor Destroy; override;
+ procedure StartT;
+ procedure StopT;
+ procedure TerminateAndDestroy;
+ procedure Update(AIntervalMinutes: Integer; const AText: string; AFlagO: Boolean);
+ property OnTimerExec: TTimerExec read FOnTimerExec write FOnTimerExec;
+ end;
+
+implementation
+
+{ TMyTimerThread }
+
+constructor TMyTimerThread.Create(AIntervalMinutes: Integer; const AText: string; AFlagO: Boolean);
+begin
+ inherited Create(True);
+ FreeOnTerminate := False;
+ FEvent := TEvent.Create(nil, True, False, '');
+ FCriticalSection := TCriticalSection.Create;
+ FInterval := AIntervalMinutes * 60 * 1000;
+ FText := AText;
+ FFlagO := AFlagO;
+ FEnabled := False;
+end;
+
+destructor TMyTimerThread.Destroy;
+begin
+ StopT;
+ Terminate;
+ FEvent.SetEvent;
+ if not Suspended then
+ WaitFor;
+ FreeAndNil(FEvent);
+ FreeAndNil(FCriticalSection);
+ inherited;
+end;
+
+procedure TMyTimerThread.Execute;
+var
+ WaitResult: TWaitResult;
+ LocalInterval: Integer;
+begin
+ while not Terminated do
+ begin
+ FCriticalSection.Enter;
+ try
+ if FEnabled then
+ LocalInterval := FInterval
+ else
+ LocalInterval := INFINITE;
+ finally
+ FCriticalSection.Leave;
+ end;
+
+ WaitResult := FEvent.WaitFor(LocalInterval);
+
+ FCriticalSection.Enter;
+ try
+ if FEnabled and (WaitResult = wrTimeout) then
+ begin
+ if Assigned(FOnTimerExec) then
+ SyncTimerEvent;
+ end;
+ finally
+ FCriticalSection.Leave;
+ end;
+
+ FEvent.ResetEvent;
+ end;
+end;
+
+procedure TMyTimerThread.StartT;
+begin
+ FCriticalSection.Enter;
+ try
+ FEnabled := True;
+ Suspended:=false;
+ finally
+ FCriticalSection.Leave;
+ end;
+ if Suspended then
+ Start;
+ FEvent.SetEvent;
+end;
+
+procedure TMyTimerThread.StopT;
+begin
+ FCriticalSection.Enter;
+
+ try
+ FEnabled := False;
+ Suspended:=true;
+ finally
+ FCriticalSection.Leave;
+ end;
+ FEvent.SetEvent;
+end;
+
+procedure TMyTimerThread.SyncTimerEvent;
+var
+ LText: string;
+ LFlag: Boolean;
+begin
+ FCriticalSection.Enter;
+ try
+ LText := FText;
+ LFlag := FFlagO;
+ finally
+ FCriticalSection.Leave;
+ end;
+ if Assigned(FOnTimerExec) then
+ FOnTimerExec(Self, LText, LFlag);
+end;
+
+procedure TMyTimerThread.TerminateAndDestroy;
+begin
+StopT;
+ Terminate;
+ Free;
+end;
+
+procedure TMyTimerThread.Update(AIntervalMinutes: Integer; const AText: string; AFlagO: Boolean);
+begin
+ FCriticalSection.Enter;
+ try
+ FInterval := AIntervalMinutes * 60 * 1000;
+ FText := AText;
+ FFlagO := AFlagO;
+ finally
+ FCriticalSection.Leave;
+ end;
+ FEvent.SetEvent;
+end;
+
+end.
diff --git a/uRecords.pas b/uRecords.pas
index a67ecb8..95a0c8c 100644
--- a/uRecords.pas
+++ b/uRecords.pas
@@ -2,6 +2,13 @@ unit uRecords;
interface
+type TListTimer = record
+ Enable:integer;
+ interval:integer;
+ o:integer;
+ mess:string;
+end;
+
type
TOBSKandinsky = record
port: integer;