Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit GCFBot.Main;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VK.UserEvents, VK.Components, VK.GroupEvents, VK.API,
- VK.Entity.Message, VK.Entity.ClientInfo, Vcl.StdCtrls, VK.Types, VK.Entity.User, Vcl.ExtCtrls,
- SpeechLib_TLB;
- type
- TFormMain = class(TForm)
- VK: TVK;
- VkGroupEvents: TVkGroupEvents;
- Memo1: TMemo;
- procedure VkGroupEventsMessageNew(Sender: TObject; GroupId: Integer; Message: TVkMessage;
- ClientInfo: TVkClientInfo; EventId: string);
- procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- procedure VKAuth(Sender: TObject; var Token: string; var TokenExpiry: Int64; var ChangePasswordHash: string);
- procedure VKLogin(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- private
- FCensorWords: TStringList;
- FVoice: TSpVoice;
- function CheckForCensor(Value: string): Boolean;
- function TextToAudioFile(var FN: string; Text: string): Boolean;
- public
- { Public declarations }
- end;
- var
- FormMain: TFormMain;
- implementation
- uses
- ActiveX, VK.Entity.Doc.Save;
- {$R *.dfm}
- function CreateRandomAudioFile: string;
- var
- i: Integer;
- begin
- i := 0;
- repeat
- Inc(i);
- Result := 'audio_text_' + GetTickCount.ToString + '_' + i.ToString + '.wav';
- until not FileExists(Result);
- end;
- function TFormMain.TextToAudioFile(var FN: string; Text: string): Boolean;
- var
- Tokens: ISpeechObjectTokens;
- FS: TSpFileStream;
- AF: TSpAudioFormat;
- begin
- try
- Tokens := FVoice.GetVoices('', '');
- FVoice.Voice := Tokens.Item(1);
- FS := TSpFileStream.Create(nil);
- AF := TSpAudioFormat.Create(nil);
- AF.type_ := SAFT48kHz16BitStereo;
- FS.Format := AF.DefaultInterface;
- FN := CreateRandomAudioFile;
- FS.Open(FN, SSFMCreateForWrite, False);
- FVoice.AudioOutputStream := FS.DefaultInterface;
- FVoice.Speak(Text, SVSFDefault);
- FS.Close;
- FS.Free;
- AF.Free;
- Result := FileExists(FN);
- except
- Result := False;
- end;
- end;
- procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- begin
- CanClose := False;
- Application.Terminate;
- end;
- procedure TFormMain.FormDestroy(Sender: TObject);
- begin
- FCensorWords.Free;
- end;
- procedure TFormMain.FormCreate(Sender: TObject);
- begin
- CoInitialize(nil);
- FVoice := TSpVoice.Create(Self);
- FCensorWords := TStringList.Create;
- FCensorWords.LoadFromFile('censor.txt', TEncoding.UTF8);
- VK.Login;
- end;
- procedure TFormMain.VKAuth(Sender: TObject; var Token: string; var TokenExpiry: Int64; var ChangePasswordHash: string);
- begin
- {$INCLUDE token.inc}
- end;
- function TFormMain.CheckForCensor(Value: string): Boolean;
- var
- i: Integer;
- begin
- Result := False;
- for i := 0 to FCensorWords.Count - 1 do
- if Value.Contains(FCensorWords[i]) then
- Exit(True);
- end;
- procedure TFormMain.VkGroupEventsMessageNew(Sender: TObject; GroupId: Integer; Message: TVkMessage;
- ClientInfo: TVkClientInfo; EventId: string);
- var
- FN, Str: string;
- Doc: TVkDocSaved;
- begin
- Memo1.Lines.Add(Message.Text);
- if (not Message.Text.IsEmpty) then
- begin
- if CheckForCensor(AnsiLowerCase(Message.Text)) then
- VK.Messages.Send(Message.PeerId, 'Давай без мата, ок?');
- if Message.Text.StartsWith('/speak ') then
- begin
- Str := Message.Text.Replace('/speak ', '');
- if TextToAudioFile(FN, Str) then
- begin
- if VK.Docs.SaveAudioMessage(Doc, FN, ExtractFileName(FN), '', Message.PeerId) then
- begin
- VK.Messages.Send(Message.PeerId, '', [Doc.AudioMessage.ToAttachment]);
- Doc.Free;
- end;
- end;
- end;
- end;
- end;
- procedure TFormMain.VKLogin(Sender: TObject);
- begin
- if VkGroupEvents.Start then
- Memo1.Lines.Add('VkGroupEvents.Started');
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment