исправил оповещения, теперь работают четко
This commit is contained in:
+153
-240
@@ -7,7 +7,8 @@ uses
|
||||
System.Variants, System.Generics.Collections, ShellAPI, uSoundManager,
|
||||
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
|
||||
FMX.Edit, FMX.ListBox, FMX.Controls.Presentation, System.Rtti, FMX.Grid.Style,
|
||||
FMX.ScrollBox, FMX.Grid, uRecords, uDataBase, FMX.Menus, uKeyEvent;
|
||||
FMX.ScrollBox, FMX.Grid, uRecords, uDataBase, FMX.Menus, uKeyEvent,
|
||||
fColorSettings, fFontSettings;
|
||||
|
||||
type
|
||||
TfrEvents = class(TFrame)
|
||||
@@ -42,16 +43,13 @@ type
|
||||
procedure MenuItem1Click(Sender: TObject);
|
||||
procedure cbActionsChange(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
procedure toLog(aCode: integer; aMethod: string; aMess: string);
|
||||
procedure toLog(aCode: integer; aMethod, aMess: string);
|
||||
procedure ExecuteAction(const aAction: integer; const aParam, aUserInput, aUserName, aUserLogin: string);
|
||||
public
|
||||
{ Public declarations }
|
||||
ListEvents: TArray<TEventGlobal>;
|
||||
CustomRewards: Tlist<TCustomRevards>;
|
||||
CustomRewardEvents: Tlist<TCustomRewardEvent>;
|
||||
CustomRewardEvents: TList<TCustomRewardEvent>;
|
||||
|
||||
procedure UpdateGrid;
|
||||
procedure LoadCustomRevards();
|
||||
procedure ESOnGetCustomReward(CustomReward: TCustomRewardEvent);
|
||||
procedure OnDonate(aNick, aMessage, aSum: string);
|
||||
end;
|
||||
@@ -62,36 +60,40 @@ implementation
|
||||
|
||||
uses uGeneral;
|
||||
|
||||
{ --- UI --- }
|
||||
|
||||
procedure TfrEvents.btnAddClick(Sender: TObject);
|
||||
var
|
||||
NewRec: TEventGlobal;
|
||||
begin
|
||||
if (cbEventList.Text = '') or (cbActions.Text = '') then
|
||||
exit;
|
||||
if (cbEventList.ItemIndex < 0) or (cbActions.ItemIndex < 0) then
|
||||
Exit;
|
||||
|
||||
NewRec.Event := cbEventList.ItemIndex;
|
||||
NewRec.Action := cbActions.ItemIndex;
|
||||
NewRec.Param := edtParams.Text;
|
||||
|
||||
if edtIF.Visible then
|
||||
NewRec.Condition := edtIF.Text;
|
||||
if cbRevards.Visible then
|
||||
NewRec.Condition := edtIF.Text
|
||||
else if cbRevards.Visible then
|
||||
NewRec.Condition := cbRevards.Text;
|
||||
|
||||
SetLength(ListEvents, Length(ListEvents) + 1);
|
||||
ListEvents[High(ListEvents)] := NewRec;
|
||||
ListEvents := ListEvents + [NewRec];
|
||||
|
||||
DB.SaveRecordArray<TEventGlobal>('ListEvents', ListEvents);
|
||||
UpdateGrid;
|
||||
end;
|
||||
|
||||
procedure TfrEvents.btnDeleteClick(Sender: TObject);
|
||||
var
|
||||
i, RowIndex: integer;
|
||||
RowIndex: integer;
|
||||
begin
|
||||
RowIndex := sgEvents.Row;
|
||||
if (RowIndex < 0) or (RowIndex > High(ListEvents)) then
|
||||
exit;
|
||||
for i := RowIndex to High(ListEvents) - 1 do
|
||||
ListEvents[i] := ListEvents[i + 1];
|
||||
SetLength(ListEvents, Length(ListEvents) - 1);
|
||||
Exit;
|
||||
|
||||
Delete(ListEvents, RowIndex, 1);
|
||||
|
||||
DB.SaveRecordArray<TEventGlobal>('ListEvents', ListEvents);
|
||||
UpdateGrid;
|
||||
end;
|
||||
@@ -106,265 +108,172 @@ begin
|
||||
edtIF.Visible := cbEventList.ItemIndex = 0;
|
||||
cbRevards.Visible := cbEventList.ItemIndex = 1;
|
||||
Label2.Visible := cbEventList.ItemIndex <= 1;
|
||||
|
||||
end;
|
||||
|
||||
procedure TfrEvents.ESOnGetCustomReward(CustomReward: TCustomRewardEvent);
|
||||
procedure TfrEvents.MenuItem1Click(Sender: TObject);
|
||||
begin
|
||||
if OpenDialog1.Execute and (PopupMenu1.PopupComponent is TEdit) then
|
||||
TEdit(PopupMenu1.PopupComponent).Text := OpenDialog1.FileName;
|
||||
end;
|
||||
|
||||
{ --- Îáùàÿ ëîãèêà --- }
|
||||
|
||||
procedure TfrEvents.ExecuteAction(const aAction: integer; const aParam, aUserInput, aUserName, aUserLogin: string);
|
||||
var
|
||||
i, i2: integer;
|
||||
req, s: string;
|
||||
hr: TCustomRewardEvent;
|
||||
sm: TSongMachine;
|
||||
myAction: integer;
|
||||
f: TfrColorSettings;
|
||||
t: TfrFontSettings;
|
||||
i, j: Integer;
|
||||
notify: TOBSNotify;
|
||||
se: TStyleEvent;
|
||||
begin
|
||||
sm := TSongMachine.Create;
|
||||
try
|
||||
toLog(3, 'ESOnGetCustomReward', 'Íà÷àëî îáðàáîòêè íàãðàäû: ' +
|
||||
CustomReward.Event.revard.Title);
|
||||
s := '[' + CustomReward.Event.user_name +
|
||||
'] êóïèë çà áàëëû êàíàëà íàãðàäó "' +
|
||||
CustomReward.Event.revard.Title + '" ';
|
||||
if CustomReward.Event.user_input <> '' then
|
||||
begin
|
||||
toLog(0, 'ESOnGetCustomReward', 'Ïîëüçîâàòåëüñêèé ââîä: ' +
|
||||
CustomReward.Event.user_input);
|
||||
s := s + ' è ïåðåäàë ñòðîêó ' + CustomReward.Event.user_input
|
||||
end;
|
||||
case aAction of
|
||||
0: begin // Íàæàòü êíîïêó
|
||||
toLog(0, 'ExecuteAction', 'Ñèìóëÿöèÿ íàæàòèÿ: ' + aParam);
|
||||
kePoints.SimulateKeyPress(aParam, 500);
|
||||
end;
|
||||
1: begin // Âîñïðîèçâåäåíèå çâóêà
|
||||
toLog(0, 'ExecuteAction', 'Âîñïðîèçâåäåíèå çâóêà: ' + aParam);
|
||||
sm.PlayPublic(aParam, '100');
|
||||
end;
|
||||
2: begin // Kandinsky
|
||||
toLog(0, 'ExecuteAction', 'Ãåíåðàöèÿ Kandinsky äëÿ: ' + aUserInput);
|
||||
Kandinsky.generate(aUserInput, aUserLogin);
|
||||
end;
|
||||
3: begin // OBS Notify
|
||||
f := TfrColorSettings.Create(Self);
|
||||
t := TfrFontSettings.Create(Self);
|
||||
try
|
||||
for i := 0 to High(TTW_Bot.frOBS1.listNotify) do
|
||||
if TTW_Bot.frOBS1.listNotify[i].TypeEvent = 5 then
|
||||
begin
|
||||
notify := TTW_Bot.frOBS1.listNotify[i];
|
||||
se.Title := StringReplace(notify.HeaderText, '[NICK]', aUserName, [rfReplaceAll]);
|
||||
se.Context := notify.MessText;
|
||||
se.Url := notify.Picture;
|
||||
se.SoundURL := notify.Sound;
|
||||
se.Timestamp := Now;
|
||||
se.TimeMsg := notify.TimeMess;
|
||||
se.BorderColor := notify.ColorBorder;
|
||||
se.BorderSize := notify.SolidBorder;
|
||||
se.BlockColor := notify.ColorBlock;
|
||||
se.FontTitle.Font := notify.HeaderStyleFont;
|
||||
se.FontTitle.Size := notify.HeaderSizeFont;
|
||||
se.FontTitle.Color := notify.HeaderColorFont;
|
||||
se.FontContext.Font := notify.MessStyleFont;
|
||||
se.FontContext.Size := notify.MessSizeFont;
|
||||
se.FontContext.Color := notify.MessColorFont;
|
||||
se.RequireInteraction := True;
|
||||
|
||||
for i := 0 to high(ListEvents) do
|
||||
begin
|
||||
if ListEvents[i].Event <> 1 then
|
||||
continue;
|
||||
if ListEvents[i].Condition = CustomReward.Event.revard.Title then
|
||||
begin
|
||||
myAction := ListEvents[i].Action;
|
||||
|
||||
{
|
||||
0 Íàæàòü íêîïêó íà êëàâèàòóðå
|
||||
1 Ïðîèãðàòü çâóê
|
||||
2 Kandinsky
|
||||
3 Çàïóñòèòü Web Event
|
||||
4 Íàïèñàòü â ÷àò
|
||||
5 Çàïóñòèòü ïðîãðàììó
|
||||
|
||||
}
|
||||
case myAction of
|
||||
0:
|
||||
begin // íàæàòü êíîïêó
|
||||
toLog(0, 'ESOnGetCustomReward', 'Ñèìóëÿöèÿ íàæàòèÿ: ' +
|
||||
ListEvents[i].Param);
|
||||
kePoints.SimulateKeyPress(ListEvents[i].Param, 500);
|
||||
end;
|
||||
1:
|
||||
begin // âîñïðîèçâåäåíèå çâóêà
|
||||
toLog(0, 'ESOnGetCustomReward', 'Âîñïðîèçâåäåíèå çâóêà: ' +
|
||||
ListEvents[i].Param);
|
||||
sm.PlayPublic(ListEvents[i].Param, '100');
|
||||
end;
|
||||
2:
|
||||
begin // Kandinsky
|
||||
toLog(0, 'ESOnGetCustomReward', 'Ãåíåðàöèÿ Kandinsky äëÿ: ' +
|
||||
CustomReward.Event.user_input);
|
||||
Kandinsky.generate(CustomReward.Event.user_input,
|
||||
CustomReward.Event.user_login);
|
||||
end;
|
||||
4:
|
||||
begin // Íàïèñàòü â ÷àò
|
||||
|
||||
toLog(0, 'ESOnGetCustomReward', 'Íàïèñàòü â ÷àò: ' +
|
||||
CustomReward.Event.user_input);
|
||||
end;
|
||||
5:
|
||||
begin // çàïóñê ôàéëà
|
||||
toLog(0, 'ESOnGetCustomReward', 'Çàïóñê ôàéëà: ' + ListEvents
|
||||
[i].Param);
|
||||
ShellExecute(0, 'open', pwidechar(ListEvents[i].Param),
|
||||
nil, nil, 0);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
for j := 0 to TTW_Bot.frOBS1.EventWebServers.Count - 1 do
|
||||
TTW_Bot.frOBS1.EventWebServers[j].WebServerChat.AddMessage(se);
|
||||
end;
|
||||
finally
|
||||
f.Free;
|
||||
t.Free;
|
||||
end;
|
||||
end;
|
||||
4: toLog(0, 'ExecuteAction', 'Íàïèñàòü â ÷àò: ' + aUserInput);
|
||||
5: begin // Çàïóñê ôàéëà
|
||||
toLog(0, 'ExecuteAction', 'Çàïóñê ôàéëà: ' + aParam);
|
||||
ShellExecute(0, 'open', PWideChar(aParam), nil, nil, 0);
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
sm.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrEvents.LoadCustomRevards();
|
||||
procedure TfrEvents.ESOnGetCustomReward(CustomReward: TCustomRewardEvent);
|
||||
var
|
||||
cr: TCustomRevards;
|
||||
ev: TEventGlobal;
|
||||
begin
|
||||
CustomRewards.Clear;
|
||||
cbRevards.Items.Clear;
|
||||
TTW_Bot.toLog('fEvents', 'LoadCustomRevards', 'Çàïðîñ íàãðàä ñ ñåðâåðà', 3);
|
||||
ttw_API.getCustomReward(CustomRewards);
|
||||
for cr in CustomRewards do
|
||||
begin
|
||||
cbRevards.Items.Add(cr.Title);
|
||||
end;
|
||||
end;
|
||||
toLog(3, 'ESOnGetCustomReward', 'Íà÷àëî îáðàáîòêè íàãðàäû: ' + CustomReward.Event.revard.Title);
|
||||
|
||||
procedure TfrEvents.MenuItem1Click(Sender: TObject);
|
||||
begin
|
||||
if OpenDialog1.Execute then
|
||||
TEdit(PopupMenu1.PopupComponent).Text := OpenDialog1.FileName;
|
||||
for ev in ListEvents do
|
||||
if (ev.Event = 1) and (ev.Condition = CustomReward.Event.revard.Title) then
|
||||
ExecuteAction(ev.Action, ev.Param, CustomReward.Event.user_input, CustomReward.Event.user_name, CustomReward.Event.user_login);
|
||||
end;
|
||||
|
||||
procedure TfrEvents.OnDonate(aNick, aMessage, aSum: string);
|
||||
var
|
||||
i, i2: integer;
|
||||
req, s: string;
|
||||
hr: TCustomRewardEvent;
|
||||
sm: TSongMachine;
|
||||
myAction: integer;
|
||||
|
||||
j: integer;
|
||||
aSumInt: integer;
|
||||
BestRow: integer;
|
||||
BestPriority: integer;
|
||||
BestValue: integer;
|
||||
i, aSumInt, BestRow, BestPriority, BestValue,
|
||||
CurrentPriority, CurrentValue, MinVal, MaxVal: integer;
|
||||
Condition: string;
|
||||
CurrentPriority: integer;
|
||||
CurrentValue: integer;
|
||||
MinVal, MaxVal: integer;
|
||||
Parts: tstringlist;
|
||||
se: TStyleEvent;
|
||||
notify: TEventGlobal;
|
||||
|
||||
Parts: TStringList;
|
||||
begin
|
||||
|
||||
aSumInt := StrToIntDef(aSum, 0);
|
||||
BestRow := -1;
|
||||
BestPriority := -1;
|
||||
BestValue := 0;
|
||||
|
||||
for i := 0 to high(ListEvents) do
|
||||
for i := 0 to High(ListEvents) do
|
||||
begin
|
||||
if ListEvents[i].Event = 0 then
|
||||
if ListEvents[i].Event <> 0 then
|
||||
Continue;
|
||||
|
||||
Condition := ListEvents[i].Condition;
|
||||
CurrentPriority := -1;
|
||||
CurrentValue := 0;
|
||||
|
||||
if TryStrToInt(Condition, CurrentValue) then
|
||||
begin
|
||||
Condition := ListEvents[i].Condition;
|
||||
CurrentPriority := -1;
|
||||
CurrentValue := 0;
|
||||
|
||||
// Ïðîâåðêà íà òî÷íîå çíà÷åíèå
|
||||
if Pos('-', Condition) = 0 then
|
||||
begin
|
||||
if Pos('>', Condition) = 0 then
|
||||
if aSumInt = CurrentValue then
|
||||
CurrentPriority := 4;
|
||||
end
|
||||
else if Pos('-', Condition) > 0 then
|
||||
begin
|
||||
Parts := TStringList.Create;
|
||||
try
|
||||
Parts.Delimiter := '-';
|
||||
Parts.StrictDelimiter := True;
|
||||
Parts.DelimitedText := Condition;
|
||||
if Parts.Count = 2 then
|
||||
begin
|
||||
if Pos('<', Condition) = 0 then
|
||||
MinVal := StrToIntDef(Trim(Parts[0]), 0);
|
||||
MaxVal := StrToIntDef(Trim(Parts[1]), 0);
|
||||
if (aSumInt >= MinVal) and (aSumInt <= MaxVal) then
|
||||
begin
|
||||
// Òî÷íîå çíà÷åíèå
|
||||
CurrentValue := StrToIntDef(Condition, -1);
|
||||
if aSumInt = CurrentValue then
|
||||
CurrentPriority := 4;
|
||||
CurrentPriority := 3;
|
||||
CurrentValue := MinVal;
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
Parts.Free;
|
||||
end;
|
||||
|
||||
if CurrentPriority = -1 then
|
||||
begin
|
||||
if Pos('-', Condition) > 0 then
|
||||
begin
|
||||
// Äèàïàçîí
|
||||
Parts := tstringlist.Create;
|
||||
try
|
||||
Parts.Delimiter := '-';
|
||||
Parts.StrictDelimiter := True;
|
||||
Parts.DelimitedText := Condition;
|
||||
if Parts.Count = 2 then
|
||||
begin
|
||||
MinVal := StrToIntDef(Trim(Parts[0]), 0);
|
||||
MaxVal := StrToIntDef(Trim(Parts[1]), 0);
|
||||
if (aSumInt >= MinVal) and (aSumInt <= MaxVal) then
|
||||
begin
|
||||
CurrentPriority := 3;
|
||||
CurrentValue := MinVal; // Ïðèîðèòåò ïî MinVal
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
Parts.Free;
|
||||
end;
|
||||
end
|
||||
else if Pos('>', Condition) > 0 then
|
||||
begin
|
||||
// Óñëîâèå ">X"
|
||||
CurrentValue :=
|
||||
StrToIntDef(Trim(StringReplace(Condition, '>', '',
|
||||
[rfReplaceAll])), 0);
|
||||
if aSumInt >= CurrentValue then
|
||||
CurrentPriority := 2;
|
||||
end
|
||||
else if Pos('<', Condition) > 0 then
|
||||
begin
|
||||
// Óñëîâèå "<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 := ListEvents[i];
|
||||
end;
|
||||
end;
|
||||
if BestRow = -1 then
|
||||
Break;
|
||||
|
||||
end;
|
||||
end;
|
||||
if BestRow = -1 then
|
||||
exit;
|
||||
sm := TSongMachine.Create;
|
||||
try
|
||||
myAction := ListEvents[i].Action;
|
||||
case myAction of
|
||||
0:
|
||||
begin // íàæàòü êíîïêó
|
||||
toLog(0, 'OnDonate', 'Ñèìóëÿöèÿ íàæàòèÿ: ' + ListEvents[i].Param);
|
||||
kePoints.SimulateKeyPress(ListEvents[i].Param, 500);
|
||||
end;
|
||||
1:
|
||||
begin // âîñïðîèçâåäåíèå çâóêà
|
||||
toLog(0, 'OnDonate', 'Âîñïðîèçâåäåíèå çâóêà: ' + ListEvents[i].Param);
|
||||
sm.PlayPublic(ListEvents[i].Param, '100');
|
||||
end;
|
||||
2:
|
||||
begin // Kandinsky
|
||||
toLog(0, 'OnDonate', 'Ãåíåðàöèÿ Kandinsky äëÿ: ' + aNick);
|
||||
Kandinsky.generate(aMessage, aNick);
|
||||
end;
|
||||
4:
|
||||
begin // Íàïèñàòü â ÷àò
|
||||
|
||||
toLog(0, 'OnDonate', 'Íàïèñàòü â ÷àò: ' + aNick);
|
||||
end;
|
||||
5:
|
||||
begin // çàïóñê ôàéëà
|
||||
toLog(0, 'OnDonate', 'Çàïóñê ôàéëà: ' + ListEvents[i].Param);
|
||||
ShellExecute(0, 'open', pwidechar(ListEvents[i].Param), nil, nil, 0);
|
||||
end;
|
||||
end
|
||||
else if (Condition.StartsWith('>')) then
|
||||
begin
|
||||
CurrentValue := StrToIntDef(Copy(Condition, 2), 0);
|
||||
if aSumInt >= CurrentValue then
|
||||
CurrentPriority := 2;
|
||||
end
|
||||
else if (Condition.StartsWith('<')) then
|
||||
begin
|
||||
CurrentValue := StrToIntDef(Copy(Condition, 2), 0);
|
||||
if aSumInt <= CurrentValue then
|
||||
CurrentPriority := 1;
|
||||
end;
|
||||
|
||||
finally
|
||||
sm.Free;
|
||||
if (CurrentPriority <> -1) and
|
||||
((CurrentPriority > BestPriority) or
|
||||
((CurrentPriority = BestPriority) and
|
||||
(((CurrentPriority in [2,3]) and (CurrentValue > BestValue)) or
|
||||
((CurrentPriority = 1) and (CurrentValue < BestValue))))) then
|
||||
begin
|
||||
BestPriority := CurrentPriority;
|
||||
BestValue := CurrentValue;
|
||||
BestRow := i;
|
||||
end;
|
||||
end;
|
||||
|
||||
if BestRow <> -1 then
|
||||
ExecuteAction(ListEvents[BestRow].Action, ListEvents[BestRow].Param, aMessage, aNick, aNick);
|
||||
end;
|
||||
|
||||
procedure TfrEvents.toLog(aCode: integer; aMethod, aMess: string);
|
||||
begin
|
||||
TTW_Bot.toLog('fEvents', aMethod, aMess, aCode);
|
||||
end;
|
||||
|
||||
|
||||
procedure TfrEvents.UpdateGrid;
|
||||
var
|
||||
@@ -372,11 +281,9 @@ var
|
||||
begin
|
||||
sgEvents.BeginUpdate;
|
||||
try
|
||||
sgEvents.RowCount := 0; // Ñáðàñûâàåì ñòðîêè (îñòàâëÿåì òîëüêî çàãîëîâêè)
|
||||
|
||||
sgEvents.RowCount := Length(ListEvents);
|
||||
for i := 0 to High(ListEvents) do
|
||||
begin
|
||||
sgEvents.RowCount := i + 1;
|
||||
sgEvents.Cells[0, i] := cbEventList.Items[ListEvents[i].Event];
|
||||
sgEvents.Cells[1, i] := ListEvents[i].Condition;
|
||||
sgEvents.Cells[2, i] := cbActions.Items[ListEvents[i].Action];
|
||||
@@ -387,4 +294,10 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrEvents.toLog(aCode: integer; aMethod, aMess: string);
|
||||
begin
|
||||
TTW_Bot.toLog('fEvents', aMethod, aMess, aCode);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
||||
+2
-2
@@ -14,8 +14,8 @@ object frOBS: TfrOBS
|
||||
RowCount = 0
|
||||
Options = [ColumnResize, ColumnMove, ColLines, RowLines, Tabs, Header, HeaderClick, AutoDisplacement]
|
||||
OnCellDblClick = sgWebChatsCellDblClick
|
||||
Viewport.Width = 685.000000000000000000
|
||||
Viewport.Height = 164.000000000000000000
|
||||
Viewport.Width = 689.000000000000000000
|
||||
Viewport.Height = 189.000000000000000000
|
||||
object IntegerColumn1: TIntegerColumn
|
||||
Header = #1055#1086#1088#1090
|
||||
HeaderSettings.TextSettings.WordWrap = False
|
||||
|
||||
+184
-361
@@ -5,11 +5,12 @@ interface
|
||||
uses
|
||||
System.SysUtils, System.Types, System.UITypes, System.Classes, uCustomEmoties,
|
||||
System.Variants, uWebServerChat, uWebServerEvents, fColorSettings,
|
||||
System.Generics.Collections,
|
||||
fFontSettings,
|
||||
System.Generics.Collections, uWebServerKandinsky,
|
||||
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
|
||||
System.Rtti, FMX.Grid.Style, FMX.Grid, FMX.ScrollBox, FMX.Edit, FMX.Colors,
|
||||
FMX.ListBox, FMX.EditBox, FMX.SpinBox, FMX.Controls.Presentation, uRecords,
|
||||
System.Generics.Defaults, fFontSettings, System.Character;
|
||||
System.Generics.Defaults, System.Character;
|
||||
|
||||
type
|
||||
TChatWebServers = record
|
||||
@@ -31,10 +32,17 @@ type
|
||||
type
|
||||
TEventWebServers = record
|
||||
port: integer;
|
||||
typeEvent: integer;
|
||||
se: TStyleEvent;
|
||||
WebServerChat: TTTW_Events;
|
||||
end;
|
||||
|
||||
type
|
||||
TKandinskyWebServers = record
|
||||
port: integer;
|
||||
WebServerKandinsky: TKandinsky_Web;
|
||||
end;
|
||||
|
||||
type
|
||||
TfrOBS = class(TFrame)
|
||||
sgWebChats: TStringGrid;
|
||||
@@ -71,11 +79,12 @@ type
|
||||
ChatEmotes: Tlist<TEmotes>;
|
||||
ChatWebServers: Tlist<TChatWebServers>;
|
||||
EventWebServers: Tlist<TEventWebServers>;
|
||||
KandinskyWebServers: Tlist<TKandinskyWebServers>;
|
||||
procedure MsgToWebServer(const aRecord: TTwitchChatMessage);
|
||||
procedure toEventWebServer(CustomReward: TFollowEvent); overload; // follow
|
||||
procedure toEventWebServer(CustomReward: TSubEvent); overload; // sub
|
||||
procedure toEventWebServer(CustomReward: TRaidEvent); overload; // raid
|
||||
procedure toEventWebServer(CustomReward: TGiftEvent); overload; // gift
|
||||
procedure toEventWebServer(aEvent: TFollowEvent); overload; // follow
|
||||
procedure toEventWebServer(aEvent: TSubEvent); overload; // sub
|
||||
procedure toEventWebServer(aEvent: TRaidEvent); overload; // raid
|
||||
procedure toEventWebServer(aEvent: TGiftEvent); overload; // gift
|
||||
procedure toEventWebServer(aNick, aSum, aText: string); overload; // donate
|
||||
procedure CreateWebEvents(eventsSettings: TOBSNotify);
|
||||
|
||||
@@ -91,7 +100,7 @@ type
|
||||
|
||||
procedure AddKandinsky(newRecord: TOBSKandinsky);
|
||||
procedure DelKandinsky(aPort: integer);
|
||||
|
||||
procedure CreateWebKandinsky(aRecord: TOBSKandinsky);
|
||||
end;
|
||||
|
||||
implementation
|
||||
@@ -290,6 +299,7 @@ begin
|
||||
SetLength(listChats, Length(listChats) + 1);
|
||||
listChats[High(listChats)] := newRecord;
|
||||
UpdateGridFromArray;
|
||||
|
||||
db.SaveRecordArray<TOBSChat>('listChats', listChats);
|
||||
CreateWebChat(newRecord);
|
||||
end;
|
||||
@@ -300,6 +310,7 @@ begin
|
||||
listKandinsky[High(listKandinsky)] := newRecord;
|
||||
UpdateGridFromArray;
|
||||
db.SaveRecordArray<TOBSKandinsky>('listKandinsky', listKandinsky);
|
||||
CreateWebKandinsky(newRecord);
|
||||
end;
|
||||
|
||||
procedure TfrOBS.AddNotify(newRecord: TOBSNotify);
|
||||
@@ -308,7 +319,7 @@ begin
|
||||
listNotify[High(listNotify)] := newRecord;
|
||||
UpdateGridFromArray;
|
||||
db.SaveRecordArray<TOBSNotify>('listNotify', listNotify);
|
||||
CreateWebEvents(newRecord);
|
||||
CreateWebEvents(newRecord);
|
||||
end;
|
||||
|
||||
procedure TfrOBS.btnCreateOBSChatClick(Sender: TObject);
|
||||
@@ -383,12 +394,10 @@ var
|
||||
procedure LoadFontList(const mySL: tstringlist);
|
||||
var
|
||||
SearchRec: TSearchRec;
|
||||
n: integer;
|
||||
begin
|
||||
if not DirectoryExists(myConst.fontsPath) then
|
||||
CreateDir(myConst.fontsPath);
|
||||
|
||||
n := 1;
|
||||
if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*',
|
||||
faArchive, SearchRec) = 0 then
|
||||
try
|
||||
@@ -396,7 +405,6 @@ var
|
||||
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
|
||||
begin
|
||||
mySL.Add(SearchRec.name);
|
||||
Inc(n);
|
||||
end;
|
||||
until FindNext(SearchRec) <> 0;
|
||||
finally
|
||||
@@ -448,12 +456,9 @@ var
|
||||
procedure LoadFontList(const mySL: tstringlist);
|
||||
var
|
||||
SearchRec: TSearchRec;
|
||||
n: integer;
|
||||
begin
|
||||
if not DirectoryExists(myConst.fontsPath) then
|
||||
CreateDir(myConst.fontsPath);
|
||||
|
||||
n := 1;
|
||||
if FindFirst(IncludeTrailingPathDelimiter(myConst.fontsPath) + '*.*',
|
||||
faArchive, SearchRec) = 0 then
|
||||
try
|
||||
@@ -461,7 +466,6 @@ var
|
||||
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
|
||||
begin
|
||||
mySL.Add(SearchRec.name);
|
||||
Inc(n);
|
||||
end;
|
||||
until FindNext(SearchRec) <> 0;
|
||||
finally
|
||||
@@ -470,24 +474,37 @@ var
|
||||
end;
|
||||
|
||||
function GetColorFromColorPanel(aColor: TAlphaColor): string;
|
||||
var
|
||||
Color: TAlphaColor;
|
||||
r, G, B: Byte;
|
||||
A: Real;
|
||||
FS: TFormatSettings;
|
||||
begin
|
||||
Color := aColor;
|
||||
r := TAlphaColorRec(Color).r;
|
||||
G := TAlphaColorRec(Color).G;
|
||||
B := TAlphaColorRec(Color).B;
|
||||
A := TAlphaColorRec(Color).A / 255; // Ïðåîáðàçóåì àëüôà-êàíàë â äèàïàçîí 0..1
|
||||
var
|
||||
Color: TAlphaColor;
|
||||
r, G, B: Byte;
|
||||
A: Real;
|
||||
FS: TFormatSettings;
|
||||
begin
|
||||
Color := aColor;
|
||||
r := TAlphaColorRec(Color).r;
|
||||
G := TAlphaColorRec(Color).G;
|
||||
B := TAlphaColorRec(Color).B;
|
||||
A := TAlphaColorRec(Color).A / 255;
|
||||
// Ïðåîáðàçóåì àëüôà-êàíàë â äèàïàçîí 0..1
|
||||
|
||||
// Óñòàíàâëèâàåì òî÷êó â êà÷åñòâå äåñÿòè÷íîãî ðàçäåëèòåëÿ
|
||||
FS := TFormatSettings.Create;
|
||||
FS.DecimalSeparator := '.';
|
||||
// Óñòàíàâëèâàåì òî÷êó â êà÷åñòâå äåñÿòè÷íîãî ðàçäåëèòåëÿ
|
||||
FS := TFormatSettings.Create;
|
||||
FS.DecimalSeparator := '.';
|
||||
|
||||
result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS);
|
||||
end;
|
||||
result := Format('rgba(%d, %d, %d, %.2f)', [r, G, B, A], FS);
|
||||
end;
|
||||
|
||||
function GetColorFromCCB(aColor: TAlphaColor): string;
|
||||
var
|
||||
Color: TAlphaColor;
|
||||
r, G, B: Byte;
|
||||
begin
|
||||
Color := aColor;
|
||||
r := TAlphaColorRec(Color).r;
|
||||
G := TAlphaColorRec(Color).G;
|
||||
B := TAlphaColorRec(Color).B;
|
||||
result := Format('#%.2X%.2X%.2X', [r, G, B]);
|
||||
end;
|
||||
|
||||
begin
|
||||
fonts := tstringlist.Create;
|
||||
@@ -495,25 +512,25 @@ begin
|
||||
t := TfrFontSettings.Create(self);
|
||||
try
|
||||
LoadFontList(fonts);
|
||||
EventWebServer.WebServerChat := TTTW_Events.Create(fonts,eventsSettings.port);
|
||||
EventWebServer.WebServerChat := TTTW_Events.Create(fonts,
|
||||
eventsSettings.port);
|
||||
EventWebServer.port := eventsSettings.port;
|
||||
|
||||
EventWebServer.se.title := eventsSettings.HeaderText;
|
||||
EventWebServer.se.Context:=eventsSettings.MessText;
|
||||
EventWebServer.se.Url:=eventsSettings.Picture;
|
||||
EventWebServer.se.SoundURL:=eventsSettings.Sound;
|
||||
EventWebServer.se.Timestamp:=now;
|
||||
EventWebServer.se.TimeMsg:=eventsSettings.TimeMess;
|
||||
EventWebServer.se.FontTitle.Font:= t.cbFontStyleDefault.Items[eventsSettings.HeaderStyleFont];
|
||||
EventWebServer.se.FontTitle.Size:=eventsSettings.HeaderSizeFont;
|
||||
EventWebServer.se.FontTitle.Color:=t.ccbFontColor.Items[eventsSettings.HeaderColorFont];
|
||||
EventWebServer.se.FontContext.Font:= t.cbFontStyleDefault.Items[eventsSettings.MessStyleFont];
|
||||
EventWebServer.se.FontContext.Size:=eventsSettings.MessSizeFont;
|
||||
EventWebServer.se.FontContext.Color:=t.ccbFontColor.Items[eventsSettings.MessColorFont];
|
||||
EventWebServer.se.BorderColor:=f.ccbStyleBorderColor.Items[eventsSettings.ColorBorder];
|
||||
EventWebServer.se.BorderSize:=eventsSettings.SolidBorder;
|
||||
EventWebServer.se.BlockColor:=GetColorFromColorPanel(f.cpStyleBlockColor.Color);
|
||||
|
||||
EventWebServer.typeEvent := eventsSettings.typeEvent;
|
||||
EventWebServer.se.Title := eventsSettings.HeaderText;
|
||||
EventWebServer.se.Context := eventsSettings.MessText;
|
||||
EventWebServer.se.Url := eventsSettings.Picture;
|
||||
EventWebServer.se.SoundURL := eventsSettings.Sound;
|
||||
EventWebServer.se.Timestamp := now;
|
||||
EventWebServer.se.TimeMsg := eventsSettings.TimeMess;
|
||||
EventWebServer.se.FontTitle.Font := eventsSettings.HeaderStyleFont;
|
||||
EventWebServer.se.FontTitle.Size := eventsSettings.HeaderSizeFont;
|
||||
EventWebServer.se.FontTitle.Color := eventsSettings.HeaderColorFont;
|
||||
EventWebServer.se.FontContext.Font := eventsSettings.MessStyleFont;
|
||||
EventWebServer.se.FontContext.Size := eventsSettings.MessSizeFont;
|
||||
EventWebServer.se.FontContext.Color :=eventsSettings.MessColorFont;
|
||||
EventWebServer.se.BorderColor := eventsSettings.ColorBorder;
|
||||
EventWebServer.se.BorderSize := eventsSettings.SolidBorder;
|
||||
EventWebServer.se.BlockColor := eventsSettings.ColorBlock;
|
||||
EventWebServers.Add(EventWebServer);
|
||||
EventWebServers[EventWebServers.Count - 1].WebServerChat.ActiveServer(True);
|
||||
finally
|
||||
@@ -523,6 +540,20 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrOBS.CreateWebKandinsky(aRecord: TOBSKandinsky);
|
||||
var
|
||||
KandinskyWebServer: TKandinskyWebServers;
|
||||
begin
|
||||
KandinskyWebServer.port := aRecord.port;
|
||||
KandinskyWebServer.WebServerKandinsky :=
|
||||
TKandinsky_Web.Create(TTW_Bot.frAI1.edtKandiKey.text,
|
||||
TTW_Bot.frAI1.edtKandiSecret.text, aRecord.port);
|
||||
KandinskyWebServers.Add(KandinskyWebServer);
|
||||
KandinskyWebServers[KandinskyWebServers.Count - 1]
|
||||
.WebServerKandinsky.ActiveServer(True);
|
||||
|
||||
end;
|
||||
|
||||
procedure TfrOBS.DelChat(aPort: integer);
|
||||
var
|
||||
i, j: integer;
|
||||
@@ -566,6 +597,9 @@ begin
|
||||
Break;
|
||||
end;
|
||||
end;
|
||||
KandinskyWebServers[i].WebServerKandinsky.ActiveServer(false);
|
||||
KandinskyWebServers[i].WebServerKandinsky.Destroy;
|
||||
KandinskyWebServers.Delete(i);
|
||||
UpdateGridFromArray;
|
||||
db.SaveRecordArray<TOBSKandinsky>('listKandinsky', listKandinsky);
|
||||
end;
|
||||
@@ -588,7 +622,9 @@ begin
|
||||
Break;
|
||||
end;
|
||||
end;
|
||||
|
||||
EventWebServers[i].WebServerChat.ActiveServer(false);
|
||||
EventWebServers[i].WebServerChat.Destroy;
|
||||
EventWebServers.Delete(i);
|
||||
UpdateGridFromArray;
|
||||
db.SaveRecordArray<TOBSNotify>('listNotify', listNotify);
|
||||
end;
|
||||
@@ -654,12 +690,36 @@ end;
|
||||
|
||||
procedure TfrOBS.EdtNotify(newRecord: TOBSNotify; oldPort: integer);
|
||||
var
|
||||
i: integer;
|
||||
i,mi: integer; ws:TEventWebServers;
|
||||
begin
|
||||
for I := 0 to EventWebServers.Count - 1 do
|
||||
if EventWebServers[i].port = oldPort then
|
||||
begin
|
||||
ws:=EventWebServers[i];
|
||||
mi:=i;
|
||||
end;
|
||||
|
||||
for i := 0 to High(listNotify) do
|
||||
if listNotify[i].port = oldPort then
|
||||
begin
|
||||
listNotify[i] := newRecord;
|
||||
ws.port:=listNotify[i].port;
|
||||
ws.typeEvent:=listNotify[i].TypeEvent;
|
||||
ws.se.title:=listNotify[i].HeaderText;
|
||||
ws.se.Context:=listNotify[i].MessText;
|
||||
ws.se.Url:=listNotify[i].Picture;
|
||||
ws.se.SoundURL:=listNotify[i].Sound;
|
||||
ws.se.TimeMsg:=listNotify[i].TimeMess;
|
||||
ws.se.FontTitle.Font:=listNotify[i].HeaderStyleFont;
|
||||
ws.se.FontTitle.Font := listNotify[i].HeaderStyleFont;
|
||||
ws.se.FontTitle.Size := listNotify[i].HeaderSizeFont;
|
||||
ws.se.FontTitle.Color := listNotify[i].HeaderColorFont;
|
||||
ws.se.FontContext.Font := listNotify[i].MessStyleFont;
|
||||
ws.se.FontContext.Size := listNotify[i].MessSizeFont;
|
||||
ws.se.FontContext.Color := listNotify[i].MessColorFont;
|
||||
ws.se.BorderColor :=listNotify[i].ColorBorder;
|
||||
ws.se.BorderSize := listNotify[i].SolidBorder;
|
||||
ws.se.BlockColor := listNotify[i].ColorBlock;
|
||||
UpdateGridFromArray;
|
||||
db.SaveRecordArray<TOBSNotify>('listNotify', listNotify);
|
||||
Break;
|
||||
@@ -716,342 +776,105 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrOBS.toEventWebServer(CustomReward: TFollowEvent);
|
||||
{
|
||||
0 Îòñëåæèâàíèå
|
||||
1 Ïîäïèñêà
|
||||
2 Ïîäàðî÷íàÿ ïîäïèñêà
|
||||
3 Ðåéä
|
||||
4 Äîíàò
|
||||
5 Ñâîå
|
||||
|
||||
}
|
||||
|
||||
procedure TfrOBS.toEventWebServer(aEvent: TFollowEvent);
|
||||
var
|
||||
se: TStyleEvent;
|
||||
i, j: integer;
|
||||
f: TfrColorSettings;
|
||||
t: TfrFontSettings;
|
||||
notify: TOBSNotify;
|
||||
i: integer;
|
||||
ws: TEventWebServers;
|
||||
begin
|
||||
f := TfrColorSettings.Create(self);
|
||||
t := TfrFontSettings.Create(self);
|
||||
try
|
||||
for i := 0 to high(listNotify) do
|
||||
TTW_Bot.toLog('fOBS', 'toEventWebServer', 'Ïîëó÷åíî ñîáûòèå Follow', 0);
|
||||
for i := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
if EventWebServers[i].typeEvent = 0 then
|
||||
begin
|
||||
if listNotify[i].TypeEvent = 0 then
|
||||
begin
|
||||
notify := listNotify[i];
|
||||
se.Title := notify.HeaderText;
|
||||
se.Title := StringReplace(se.Title, '[NICK]',
|
||||
CustomReward.event.user_name, [rfReplaceAll]);
|
||||
se.Context := notify.MessText;
|
||||
se.Url := notify.Picture;
|
||||
se.SoundURL := notify.Sound;
|
||||
se.Timestamp := Now;
|
||||
se.TimeMsg := notify.TimeMess;
|
||||
se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder];
|
||||
se.BorderSize := notify.SolidBorder;
|
||||
se.BlockColor := notify.ColorBlock;
|
||||
se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont];
|
||||
se.FontTitle.Size := notify.HeaderSizeFont;
|
||||
se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont];
|
||||
se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont];
|
||||
se.FontContext.Size := notify.MessSizeFont;
|
||||
se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont];
|
||||
se.RequireInteraction := True;
|
||||
for j := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
EventWebServers[j].WebServerChat.AddMessage(se);
|
||||
end;
|
||||
end;
|
||||
|
||||
ws := EventWebServers[i];
|
||||
ws.se.Title := StringReplace(ws.se.Title, '[NICK]',
|
||||
aEvent.event.user_name, [rfReplaceAll]);
|
||||
ws.se.Timestamp:=now;
|
||||
ws.se.RequireInteraction := True;
|
||||
TTW_Bot.toLog('fOBS', 'toEventWebServer.BlockColor', ws.se.BlockColor, 3);
|
||||
EventWebServers[i].WebServerChat.AddMessage(ws.se);
|
||||
end;
|
||||
|
||||
finally
|
||||
f.Free;
|
||||
t.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrOBS.toEventWebServer(CustomReward: TSubEvent);
|
||||
procedure TfrOBS.toEventWebServer(aEvent: TSubEvent);
|
||||
var
|
||||
se: TStyleEvent;
|
||||
i, j: integer;
|
||||
f: TfrColorSettings;
|
||||
t: TfrFontSettings;
|
||||
notify: TOBSNotify;
|
||||
i: integer;
|
||||
ws: TEventWebServers;
|
||||
begin
|
||||
f := TfrColorSettings.Create(self);
|
||||
t := TfrFontSettings.Create(self);
|
||||
try
|
||||
for i := 0 to high(listNotify) do
|
||||
begin
|
||||
if listNotify[i].TypeEvent = 1 then
|
||||
begin
|
||||
notify := listNotify[i];
|
||||
se.Title := notify.HeaderText;
|
||||
se.Title := StringReplace(se.Title, '[NICK]',
|
||||
CustomReward.event.user_name, [rfReplaceAll]);
|
||||
se.Context := notify.MessText;
|
||||
|
||||
se.Url := notify.Picture;
|
||||
se.SoundURL := notify.Sound;
|
||||
se.Timestamp := Now;
|
||||
se.TimeMsg := notify.TimeMess;
|
||||
se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder];
|
||||
se.BorderSize := notify.SolidBorder;
|
||||
se.BlockColor := notify.ColorBlock;
|
||||
se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont];
|
||||
se.FontTitle.Size := notify.HeaderSizeFont;
|
||||
se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont];
|
||||
se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont];
|
||||
se.FontContext.Size := notify.MessSizeFont;
|
||||
se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont];
|
||||
se.RequireInteraction := True;
|
||||
for j := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
EventWebServers[j].WebServerChat.AddMessage(se);
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
finally
|
||||
f.Free;
|
||||
t.Free;
|
||||
for i := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
if EventWebServers[i].typeEvent <> 1 then
|
||||
Continue;
|
||||
ws := EventWebServers[i];
|
||||
ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aEvent.event.user_name,
|
||||
[rfReplaceAll]);
|
||||
EventWebServers[i] := ws;
|
||||
EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrOBS.toEventWebServer(CustomReward: TRaidEvent);
|
||||
procedure TfrOBS.toEventWebServer(aEvent: TRaidEvent);
|
||||
var
|
||||
se: TStyleEvent;
|
||||
i, j: integer;
|
||||
f: TfrColorSettings;
|
||||
t: TfrFontSettings;
|
||||
notify: TOBSNotify;
|
||||
i: integer;
|
||||
ws: TEventWebServers;
|
||||
begin
|
||||
f := TfrColorSettings.Create(self);
|
||||
t := TfrFontSettings.Create(self);
|
||||
try
|
||||
for i := 0 to high(listNotify) do
|
||||
begin
|
||||
if listNotify[i].TypeEvent = 3 then
|
||||
begin
|
||||
notify := listNotify[i];
|
||||
se.Title := notify.HeaderText;
|
||||
se.Title := StringReplace(se.Title, '[NICK]',
|
||||
CustomReward.event.from_broadcaster_user_name, [rfReplaceAll]);
|
||||
se.Context := notify.MessText;
|
||||
se.Context := StringReplace(se.Context, '[SUM]',
|
||||
inttostr(CustomReward.event.viewers), [rfReplaceAll]);
|
||||
se.Url := notify.Picture;
|
||||
se.SoundURL := notify.Sound;
|
||||
se.Timestamp := Now;
|
||||
se.TimeMsg := notify.TimeMess;
|
||||
se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder];
|
||||
se.BorderSize := notify.SolidBorder;
|
||||
se.BlockColor := notify.ColorBlock;
|
||||
se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont];
|
||||
se.FontTitle.Size := notify.HeaderSizeFont;
|
||||
se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont];
|
||||
se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont];
|
||||
se.FontContext.Size := notify.MessSizeFont;
|
||||
se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont];
|
||||
se.RequireInteraction := True;
|
||||
for j := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
EventWebServers[j].WebServerChat.AddMessage(se);
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
finally
|
||||
f.Free;
|
||||
t.Free;
|
||||
for i := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
if EventWebServers[i].typeEvent <> 3 then
|
||||
Continue;
|
||||
ws := EventWebServers[i];
|
||||
ws.se.Title := StringReplace(ws.se.Title, '[NICK]',
|
||||
aEvent.event.from_broadcaster_user_name, [rfReplaceAll]);
|
||||
ws.se.Context := StringReplace(ws.se.Context, '[SUM]',
|
||||
inttostr(aEvent.event.viewers), [rfReplaceAll]);
|
||||
EventWebServers[i] := ws;
|
||||
EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrOBS.toEventWebServer(CustomReward: TGiftEvent);
|
||||
procedure TfrOBS.toEventWebServer(aEvent: TGiftEvent);
|
||||
var
|
||||
se: TStyleEvent;
|
||||
i, j: integer;
|
||||
f: TfrColorSettings;
|
||||
t: TfrFontSettings;
|
||||
notify: TOBSNotify;
|
||||
i: integer;
|
||||
ws: TEventWebServers;
|
||||
begin
|
||||
f := TfrColorSettings.Create(self);
|
||||
t := TfrFontSettings.Create(self);
|
||||
try
|
||||
for i := 0 to high(listNotify) do
|
||||
begin
|
||||
if listNotify[i].TypeEvent = 2 then
|
||||
begin
|
||||
notify := listNotify[i];
|
||||
se.Title := notify.HeaderText;
|
||||
se.Title := StringReplace(se.Title, '[NICK]',
|
||||
CustomReward.event.user_name, [rfReplaceAll]);
|
||||
se.Context := notify.MessText;
|
||||
se.Url := notify.Picture;
|
||||
se.SoundURL := notify.Sound;
|
||||
se.Timestamp := Now;
|
||||
se.TimeMsg := notify.TimeMess;
|
||||
se.BorderColor := f.ccbStyleBorderColor.Items[notify.ColorBorder];
|
||||
se.BorderSize := notify.SolidBorder;
|
||||
se.BlockColor := notify.ColorBlock;
|
||||
se.FontTitle.Font := t.cbFontStyleDefault.Items[notify.HeaderStyleFont];
|
||||
se.FontTitle.Size := notify.HeaderSizeFont;
|
||||
se.FontTitle.Color := t.ccbFontColor.Items[notify.HeaderColorFont];
|
||||
se.FontContext.Font := t.cbFontStyleDefault.Items[notify.MessSizeFont];
|
||||
se.FontContext.Size := notify.MessSizeFont;
|
||||
se.FontContext.Color := t.ccbFontColor.Items[notify.MessColorFont];
|
||||
se.RequireInteraction := True;
|
||||
for j := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
EventWebServers[j].WebServerChat.AddMessage(se);
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
finally
|
||||
f.Free;
|
||||
t.Free;
|
||||
for i := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
if EventWebServers[i].typeEvent <> 2 then
|
||||
Continue;
|
||||
ws := EventWebServers[i];
|
||||
ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aEvent.event.user_name,
|
||||
[rfReplaceAll]);
|
||||
EventWebServers[i] := ws;
|
||||
EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
procedure TfrOBS.toEventWebServer(aNick, aSum, aText: string);
|
||||
var
|
||||
i, j: integer;
|
||||
aSumInt: integer;
|
||||
BestRow: integer;
|
||||
BestPriority: integer;
|
||||
BestValue: integer;
|
||||
Condition: string;
|
||||
CurrentPriority: integer;
|
||||
CurrentValue: integer;
|
||||
MinVal, MaxVal: integer;
|
||||
Parts: tstringlist;
|
||||
se: TStyleEvent;
|
||||
notify: TOBSNotify;
|
||||
f: TfrColorSettings;
|
||||
t: TfrFontSettings;
|
||||
i: integer;
|
||||
ws: TEventWebServers;
|
||||
begin
|
||||
aSumInt := StrToIntDef(aSum, 0);
|
||||
BestRow := -1;
|
||||
BestPriority := -1;
|
||||
BestValue := 0;
|
||||
|
||||
for i := 0 to high(listNotify) do
|
||||
for i := 0 to EventWebServers.Count - 1 do
|
||||
begin
|
||||
if listNotify[i].TypeEvent = 4 then
|
||||
begin
|
||||
Condition := Trim(listNotify[i].TypeEdit);
|
||||
|
||||
if Condition = '' then
|
||||
Continue;
|
||||
|
||||
CurrentPriority := -1;
|
||||
CurrentValue := 0;
|
||||
|
||||
// Ïðîâåðêà íà òî÷íîå çíà÷åíèå
|
||||
if Pos('-', Condition) = 0 then
|
||||
begin
|
||||
if Pos('>', Condition) = 0 then
|
||||
begin
|
||||
if Pos('<', Condition) = 0 then
|
||||
begin
|
||||
// Òî÷íîå çíà÷åíèå
|
||||
CurrentValue := StrToIntDef(Condition, -1);
|
||||
if aSumInt = CurrentValue then
|
||||
CurrentPriority := 4;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
if CurrentPriority = -1 then
|
||||
begin
|
||||
if Pos('-', Condition) > 0 then
|
||||
begin
|
||||
// Äèàïàçîí
|
||||
Parts := tstringlist.Create;
|
||||
try
|
||||
Parts.Delimiter := '-';
|
||||
Parts.StrictDelimiter := True;
|
||||
Parts.DelimitedText := Condition;
|
||||
if Parts.Count = 2 then
|
||||
begin
|
||||
MinVal := StrToIntDef(Trim(Parts[0]), 0);
|
||||
MaxVal := StrToIntDef(Trim(Parts[1]), 0);
|
||||
if (aSumInt >= MinVal) and (aSumInt <= MaxVal) then
|
||||
begin
|
||||
CurrentPriority := 3;
|
||||
CurrentValue := MinVal; // Ïðèîðèòåò ïî MinVal
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
Parts.Free;
|
||||
end;
|
||||
end
|
||||
else if Pos('>', Condition) > 0 then
|
||||
begin
|
||||
// Óñëîâèå ">X"
|
||||
CurrentValue :=
|
||||
StrToIntDef(Trim(StringReplace(Condition, '>', '',
|
||||
[rfReplaceAll])), 0);
|
||||
if aSumInt >= CurrentValue then
|
||||
CurrentPriority := 2;
|
||||
end
|
||||
else if Pos('<', Condition) > 0 then
|
||||
begin
|
||||
// Óñëîâèå "<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;
|
||||
if EventWebServers[i].typeEvent <> 4 then
|
||||
Continue;
|
||||
ws := EventWebServers[i];
|
||||
ws.se.Title := StringReplace(ws.se.Title, '[NICK]', aNick, [rfReplaceAll]);
|
||||
ws.se.Context := StringReplace(ws.se.Context, '[SUM]', aSum,
|
||||
[rfReplaceAll]);
|
||||
EventWebServers[i] := ws;
|
||||
EventWebServers[i].WebServerChat.AddMessage(EventWebServers[i].se);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
@@ -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
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user