456 lines
12 KiB
ObjectPascal
456 lines
12 KiB
ObjectPascal
unit uGeneral;
|
|
|
|
interface
|
|
|
|
uses
|
|
System.SysUtils, System.Types, System.UITypes, System.Classes,
|
|
System.Variants,
|
|
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl,
|
|
FMX.Controls.Presentation, FMX.StdCtrls, System.ImageList, FMX.ImgList,
|
|
FMX.Styles,
|
|
fSettings, fAI, fNotify, fAutoActions, fChatOBS, FMX.ListBox, fLog, uRecords,
|
|
System.IOUtils, fCommands, uDataBase, FMX.Edit, FMX.Colors, FMX.SpinBox,
|
|
windows;
|
|
|
|
type
|
|
TForm1 = class(TForm)
|
|
V: TTabControl;
|
|
TabItem1: TTabItem;
|
|
TabItem2: TTabItem;
|
|
TabItem3: TTabItem;
|
|
TabItem4: TTabItem;
|
|
fSettings: TfrSettings;
|
|
ImageList1: TImageList;
|
|
TabItem5: TTabItem;
|
|
Panel1: TPanel;
|
|
btnConnecting: TButton;
|
|
Label2: TLabel;
|
|
Label3: TLabel;
|
|
Label5: TLabel;
|
|
Label6: TLabel;
|
|
Label7: TLabel;
|
|
Label8: TLabel;
|
|
aiConnecting: TAniIndicator;
|
|
Label9: TLabel;
|
|
Label10: TLabel;
|
|
Label11: TLabel;
|
|
Label12: TLabel;
|
|
frAI1: TfrAI;
|
|
TabItem6: TTabItem;
|
|
TabItem7: TTabItem;
|
|
TabItem8: TTabItem;
|
|
TabItem9: TTabItem;
|
|
frNotify1: TfrNotify;
|
|
Label1: TLabel;
|
|
Label4: TLabel;
|
|
Label13: TLabel;
|
|
Label14: TLabel;
|
|
frAutoActions1: TfrAutoActions;
|
|
frChatOBS1: TfrChatOBS;
|
|
frLog1: TfrLog;
|
|
cbTheme: TComboBox;
|
|
Label15: TLabel;
|
|
frCommands1: TfrCommands;
|
|
procedure Label14DblClick(Sender: TObject);
|
|
procedure Label13DblClick(Sender: TObject);
|
|
procedure Label4DblClick(Sender: TObject);
|
|
procedure cbThemeChange(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
procedure ReadDB();
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
myConst: TConst;
|
|
db: TSettingsDatabase;
|
|
appconst: TBotAppCfg;
|
|
|
|
implementation
|
|
|
|
{$R *.fmx}
|
|
|
|
procedure TForm1.cbThemeChange(Sender: TObject);
|
|
begin
|
|
cbTheme.ItemIndex := cbTheme.Items.IndexOf(cbTheme.text);
|
|
if cbTheme.ItemIndex <> -1 then
|
|
TStyleManager.SetStyleFromFile(myConst.stlPath + cbTheme.text);
|
|
// db.WriteSetting('cbTheme', inttostr(cbTheme.ItemIndex));
|
|
end;
|
|
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
var
|
|
Path: string;
|
|
SearchRec: TSearchRec;
|
|
|
|
function GetPathToTestExe: string; // âåðíåò ïàïêó romaming
|
|
begin
|
|
Result := GetEnvironmentVariable('APPDATA');
|
|
if Result <> '' then
|
|
Result := IncludeTrailingPathDelimiter(Result);
|
|
end;
|
|
|
|
begin
|
|
|
|
myConst.GeneralPath := ExtractFilePath(ParamStr(0));
|
|
myConst.AppDataPath := GetPathToTestExe + 'TTW_Bot\';
|
|
|
|
if not DirectoryExists(myConst.AppDataPath) then
|
|
CreateDir(myConst.AppDataPath);
|
|
|
|
myConst.DBPath := myConst.AppDataPath + 'settings.db';
|
|
|
|
if not DirectoryExists(myConst.AppDataPath + 'fonts') then
|
|
CreateDir(myConst.AppDataPath + 'fonts');
|
|
myConst.fontsPath := myConst.AppDataPath + 'fonts\';
|
|
|
|
if not DirectoryExists(myConst.AppDataPath + 'imgs') then
|
|
CreateDir(myConst.AppDataPath + 'imgs');
|
|
myConst.imgsPath := myConst.AppDataPath + 'imgs\';
|
|
|
|
if not DirectoryExists(myConst.AppDataPath + 'sounds') then
|
|
CreateDir(myConst.AppDataPath + 'sounds');
|
|
myConst.soundsPath := myConst.AppDataPath + 'sounds\';
|
|
|
|
if not DirectoryExists(myConst.AppDataPath + 'stl') then
|
|
CreateDir(myConst.AppDataPath + 'stl');
|
|
myConst.stlPath := myConst.AppDataPath + 'stl\';
|
|
|
|
if not DirectoryExists(myConst.AppDataPath + 'ytSongs') then
|
|
CreateDir(myConst.AppDataPath + 'ytSongs');
|
|
myConst.ytSongsPath := myConst.AppDataPath + 'ytSongs\';
|
|
|
|
myConst.PublicPlay := myConst.GeneralPath + 'PublicPlay.exe';
|
|
myConst.SilentPlay := myConst.GeneralPath + 'SilentPlayer.exe';
|
|
myConst.ytPlay := myConst.GeneralPath + 'Player.exe';
|
|
myConst.cfg1 := myConst.GeneralPath + 'botapp.cfg';
|
|
|
|
db := TSettingsDatabase.Create(myConst.DBPath);
|
|
|
|
ReadDB;
|
|
|
|
for Path in TDirectory.GetFiles(myConst.stlPath) do
|
|
cbTheme.Items.Add(ExtractFileName(Path));
|
|
cbTheme.ItemIndex := strtoint(db.ReadSetting('cbTheme', '-1'));
|
|
|
|
end;
|
|
|
|
procedure TForm1.Label13DblClick(Sender: TObject);
|
|
begin
|
|
// https://www.twitch.tv/kuznecogr
|
|
end;
|
|
|
|
procedure TForm1.Label14DblClick(Sender: TObject);
|
|
begin
|
|
// https://www.flaticon.com/ru/authors/karacis
|
|
|
|
end;
|
|
|
|
procedure TForm1.Label4DblClick(Sender: TObject);
|
|
begin
|
|
// https://www.twitch.tv/incadence
|
|
end;
|
|
|
|
procedure TForm1.ReadDB;
|
|
var
|
|
I: Integer;
|
|
c: TComponent;
|
|
sl: TStringList;
|
|
|
|
SavedColor: TAlphaColor;
|
|
|
|
ColorStr: string;
|
|
|
|
function XorDecryptToStrings(const InputFile, Key: string): TStrings;
|
|
var
|
|
InStream: TFileStream;
|
|
MemStream: TMemoryStream;
|
|
KeyBytes: TBytes;
|
|
KeyLen, KeyIndex: Integer;
|
|
B: Byte;
|
|
begin
|
|
// Ïðåîáðàçóåì êëþ÷ â áàéòû ñ èñïîëüçîâàíèåì ANSI êîäèðîâêè
|
|
KeyBytes := TEncoding.ANSI.GetBytes(Key);
|
|
KeyLen := Length(KeyBytes);
|
|
if KeyLen = 0 then
|
|
raise Exception.Create('Êëþ÷ íå ìîæåò áûòü ïóñòûì');
|
|
|
|
InStream := TFileStream.Create(InputFile, fmOpenRead);
|
|
try
|
|
MemStream := TMemoryStream.Create;
|
|
try
|
|
KeyIndex := 0;
|
|
// Ðàñøèôðîâûâàåì äàííûå è çàïèñûâàåì â ïîòîê â ïàìÿòè
|
|
while InStream.Position < InStream.Size do
|
|
begin
|
|
InStream.ReadBuffer(B, 1);
|
|
B := B xor KeyBytes[KeyIndex];
|
|
MemStream.WriteBuffer(B, 1);
|
|
KeyIndex := (KeyIndex + 1) mod KeyLen;
|
|
end;
|
|
// Ïðåîáðàçóåì äàííûå èç ïîòîêà â TStrings
|
|
MemStream.Position := 0; // Ñáðàñûâàåì ïîçèöèþ äëÿ ÷òåíèÿ
|
|
Result := TStringList.Create;
|
|
try
|
|
// Èñïîëüçóåì ANSI êîäèðîâêó äëÿ ïðåîáðàçîâàíèÿ áàéòîâ â ñòðîêó
|
|
Result.LoadFromStream(MemStream, TEncoding.ANSI);
|
|
except
|
|
//  ñëó÷àå îøèáêè îñâîáîæäàåì ðåñóðñû è ïðîáðàñûâàåì èñêëþ÷åíèå
|
|
Result.Free;
|
|
raise;
|
|
end;
|
|
finally
|
|
MemStream.Free;
|
|
end;
|
|
finally
|
|
InStream.Free;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
for I := 0 to fSettings.ComponentCount - 1 do
|
|
begin
|
|
c := fSettings.components[I];
|
|
if c is TEdit then
|
|
begin
|
|
TEdit(c).text := db.ReadSetting(TEdit(c).Name);
|
|
end;
|
|
if c is TCheckBox then
|
|
begin
|
|
TCheckBox(c).IsChecked := (db.ReadSetting(TCheckBox(c).Name) = 'True');
|
|
end;
|
|
end;
|
|
db.FChannel := fSettings.edtChannel.text;
|
|
|
|
db.LoadGridFromTable('sgRandomInt', frCommands1.sgRandomInt);
|
|
db.LoadGridFromTable('sgCommands', frCommands1.sgCommands);
|
|
db.LoadGridFromTable('sgSAFiles', frCommands1.sgSAFiles);
|
|
db.LoadGridFromTable('sgTFiles', frCommands1.sgTFiles);
|
|
db.LoadGridFromTable('sgAIGen', frCommands1.sgAIGen);
|
|
|
|
db.getGroupName(frCommands1.lbRandomGroup.Items);
|
|
|
|
if FileExists(myConst.cfg1) then
|
|
begin
|
|
|
|
sl := TStringList.Create;
|
|
|
|
try
|
|
sl.Assign(XorDecryptToStrings(myConst.cfg1, 'fgvasrgEFAXFAFAS'));
|
|
for I := 0 to sl.Count - 1 do
|
|
begin
|
|
var
|
|
eqPos := Pos('=', sl[I]);
|
|
if eqPos > 0 then
|
|
begin
|
|
var
|
|
Key := Trim(Copy(sl[I], 1, eqPos - 1));
|
|
var
|
|
Value := Trim(Copy(sl[I], eqPos + 1, MaxInt));
|
|
|
|
// Ðàñïðåäåëÿåì çíà÷åíèÿ ïî ïåðåìåííûì
|
|
if Key = 'k1' then
|
|
begin
|
|
appconst.TTV_ClientID := Value;
|
|
end
|
|
else if Key = 'k2' then
|
|
begin
|
|
appconst.AI_GigaChat_AC := Value;
|
|
end
|
|
else if Key = 'k3' then
|
|
begin
|
|
appconst.AI_GigaChat_ClientID := Value;
|
|
end
|
|
else if Key = 'k4' then
|
|
begin
|
|
appconst.AI_ChatGPT_Token := Value;
|
|
end
|
|
else if Key = 'k5' then
|
|
begin
|
|
appconst.AI_DeepSeec_Token := Value;
|
|
end
|
|
else if Key = 'k6' then
|
|
begin
|
|
appconst.DA_ClientID := Value;
|
|
end
|
|
else if Key = 'k7' then
|
|
begin
|
|
appconst.DA_Sicret := Value;
|
|
end
|
|
else if Key = 'k8' then
|
|
begin
|
|
appconst.DA_URL := Value;
|
|
end
|
|
end;
|
|
end;
|
|
if appconst.TTV_ClientID <> '' then
|
|
begin
|
|
fSettings.btnGetClientID.Visible := True;
|
|
end;
|
|
if ((appconst.AI_GigaChat_AC <> '') and (appconst.AI_GigaChat_ClientID <>
|
|
'')) or (appconst.AI_ChatGPT_Token <> '') or
|
|
(appconst.AI_DeepSeec_Token <> '') then
|
|
begin
|
|
frAI1.btnGetAIDef.Visible := True;
|
|
end;
|
|
if ((appconst.DA_ClientID <> '') and (appconst.DA_Sicret <> '') and
|
|
(appconst.DA_URL <> '')) then
|
|
begin
|
|
fSettings.btnGetDADef.Visible := True;
|
|
end;
|
|
|
|
finally
|
|
sl.Free;
|
|
end;
|
|
end;
|
|
|
|
for I := 0 to frChatOBS1.ComponentCount - 1 do
|
|
begin
|
|
c := frChatOBS1.components[I];
|
|
if c is TComboBox then
|
|
begin
|
|
TComboBox(c).ItemIndex :=
|
|
strtoint(db.ReadSetting(TComboBox(c).Name, '0'));
|
|
end;
|
|
if c is TColorComboBox then
|
|
begin
|
|
TColorComboBox(c).ItemIndex :=
|
|
strtoint(db.ReadSetting(TComboBox(c).Name, '147'));
|
|
end;
|
|
if c is TSpinBox then
|
|
begin
|
|
if TSpinBox(c).Name = 'sbWebServerPort' then
|
|
TSpinBox(c).text := db.ReadSetting(TSpinBox(c).Name, '8080');
|
|
TSpinBox(c).text := db.ReadSetting(TSpinBox(c).Name, '1');
|
|
end;
|
|
if c is TCheckBox then
|
|
begin
|
|
TCheckBox(c).IsChecked := db.ReadSetting(TCheckBox(c).Name, '0') = '1';
|
|
end;
|
|
end;
|
|
ColorStr := db.ReadSetting('cpStyleBlockColor', 'FF000000');
|
|
if TryStrToUInt('$' + ColorStr, Cardinal(SavedColor)) then
|
|
frChatOBS1.cpStyleBlockColor.Color := SavedColor
|
|
else
|
|
frChatOBS1.cpStyleBlockColor.Color := TAlphaColorRec.Black;
|
|
|
|
if not DirectoryExists(myConst.fontsPath) then
|
|
CreateDirectory(PChar(myConst.fontsPath), 0);
|
|
var
|
|
n := 1;
|
|
var
|
|
cDir := myConst.fontsPath; // Èñêàòü â ïàïêå ñ ïðîãðàììîé
|
|
var
|
|
FileName := '*.*'; // Èùåì âñå ôàéëû
|
|
ChDir(cDir); // âîéòè â êàòàëîã
|
|
var
|
|
SearchRec: TSearchRec;
|
|
if FindFirst(FileName, faArchive, SearchRec) = 0 then
|
|
repeat
|
|
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
|
|
begin
|
|
frChatOBS1.cbFontStyleDefault.Items.Add(SearchRec.Name);
|
|
Inc(n);
|
|
end;
|
|
until FindNext(SearchRec) <> 0;
|
|
ChDir('..');
|
|
|
|
for I := 0 to frNotify1.ComponentCount - 1 do
|
|
begin
|
|
c := frNotify1.components[I];
|
|
if c is TEdit then
|
|
begin
|
|
TEdit(c).text := db.ReadSetting(TEdit(c).Name);
|
|
end;
|
|
if c is TCheckBox then
|
|
begin
|
|
TCheckBox(c).IsChecked := (db.ReadSetting(TCheckBox(c).Name) = 'True');
|
|
end;
|
|
if c is TSwitch then
|
|
begin
|
|
TSwitch(c).IsChecked := (db.ReadSetting(TSwitch(c).Name) = 'True');
|
|
end;
|
|
if c is TTrackBar then
|
|
begin
|
|
TTrackBar(c).Value := strtoint(db.ReadSetting(TTrackBar(c).Name, '100'));
|
|
end;
|
|
end;
|
|
var
|
|
ii: Integer;
|
|
for I := 0 to frAI1.ComponentCount - 1 do
|
|
begin
|
|
c := frAI1.components[I];
|
|
if c is TEdit then
|
|
begin
|
|
TEdit(c).text := db.ReadSetting(TEdit(c).Name);
|
|
end;
|
|
if c is TCheckBox then
|
|
begin
|
|
TCheckBox(c).IsChecked := db.ReadSetting(TCheckBox(c).Name) = '1';
|
|
end;
|
|
|
|
end;
|
|
ii := strtoint(db.ReadSetting('aiIndex', '0'));
|
|
|
|
case ii of
|
|
0:
|
|
begin
|
|
frAI1.rbGC.IsChecked := True;
|
|
frAI1.Label45.text := 'ClientID';
|
|
frAI1.Label47.text := 'Autorization Code';
|
|
frAI1.Label1.Visible := false;
|
|
frAI1.edtAIP2.Visible := True;
|
|
frAI1.edtAIP2.Password := True;
|
|
frAI1.edtAIP3.Visible := false;
|
|
frAI1.cbOllama.IsChecked := false;
|
|
frAI1.cbOllama.Visible := false;
|
|
end;
|
|
1:
|
|
begin
|
|
frAI1.rbDS.IsChecked := True;
|
|
frAI1.Label45.text := 'API Token';
|
|
frAI1.Label47.text := '';
|
|
frAI1.Label1.Visible := false;
|
|
frAI1.edtAIP2.Visible := false;
|
|
frAI1.edtAIP2.Password := false;
|
|
frAI1.edtAIP3.Visible := false;
|
|
frAI1.cbOllama.IsChecked := false;
|
|
frAI1.cbOllama.Visible := false;
|
|
end;
|
|
2:
|
|
begin
|
|
frAI1.rbCG.IsChecked := True;
|
|
frAI1.Label45.text := 'API Token';
|
|
frAI1.Label47.text := '';
|
|
frAI1.Label1.Visible := false;
|
|
frAI1.edtAIP2.Visible := false;
|
|
frAI1.edtAIP2.Password := false;
|
|
frAI1.edtAIP3.Visible := false;
|
|
frAI1.cbOllama.IsChecked := false;
|
|
frAI1.cbOllama.Visible := false;
|
|
end;
|
|
3:
|
|
begin
|
|
frAI1.RBCustom.IsChecked := True;
|
|
frAI1.Label45.text := 'API Token';
|
|
frAI1.Label47.text := 'URL';
|
|
frAI1.Label1.Visible := True;
|
|
frAI1.edtAIP2.Visible := True;
|
|
frAI1.edtAIP2.Password := false;
|
|
frAI1.edtAIP3.Visible := True;
|
|
frAI1.cbOllama.IsChecked := db.ReadSetting(frAI1.cbOllama.Name) = '1';
|
|
frAI1.cbOllama.Visible := True;
|
|
end;
|
|
end;
|
|
|
|
db.LoadGridFromTable('sgTimers', frAutoActions1.sgTimers);
|
|
db.LoadGridFromTable('sgCounter', frAutoActions1.sgCounter);
|
|
db.LoadGridFromTable('sgBanWords', frAutoActions1.sgBanWords);
|
|
|
|
end;
|
|
|
|
end.
|