From f2c012dd28551f713f796e100994b179f30270a1 Mon Sep 17 00:00:00 2001 From: "PC1\\PTyTb" Date: Fri, 8 Aug 2025 01:49:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B9=D0=BC=D0=B5=D1=80=D0=BE=D0=B2=20=D0=B8=20=D1=81?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B5=D1=80=D1=8B?= =?UTF-8?q?=20=D0=B2=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B4=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TTW_Bot_app.dpr | 3 +- TTW_Bot_app.dproj | 1 + fAutoActions.fmx | 5 ++ fAutoActions.pas | 197 +++++++++++++++++++++++++++++++++++++++++++++- fCommands.fmx | 64 ++++++++++----- fSimpleGrid.fmx | 6 +- uCreateChat.pas | 1 + uCreateNotify.pas | 1 + uGeneral.fmx | 79 +++++++++++++------ uGeneral.pas | 49 +++++++----- uMyTimer.pas | 158 +++++++++++++++++++++++++++++++++++++ uRecords.pas | 7 ++ 12 files changed, 500 insertions(+), 71 deletions(-) create mode 100644 uMyTimer.pas 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;