HemulGM

Untitled

Feb 27th, 2020
565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.93 KB | None | 0 0
  1. unit GCFBot.Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VK.UserEvents, VK.Components, VK.GroupEvents, VK.API,
  8.   VK.Entity.Message, VK.Entity.ClientInfo, Vcl.StdCtrls, VK.Types, VK.Entity.User, Vcl.ExtCtrls,
  9.   SpeechLib_TLB;
  10.  
  11. type
  12.   TFormMain = class(TForm)
  13.     VK: TVK;
  14.     VkGroupEvents: TVkGroupEvents;
  15.     Memo1: TMemo;
  16.     procedure VkGroupEventsMessageNew(Sender: TObject; GroupId: Integer; Message: TVkMessage;
  17.       ClientInfo: TVkClientInfo; EventId: string);
  18.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  19.     procedure VKAuth(Sender: TObject; var Token: string; var TokenExpiry: Int64; var ChangePasswordHash: string);
  20.     procedure VKLogin(Sender: TObject);
  21.     procedure FormCreate(Sender: TObject);
  22.     procedure FormDestroy(Sender: TObject);
  23.   private
  24.     FCensorWords: TStringList;
  25.     FVoice: TSpVoice;
  26.     function CheckForCensor(Value: string): Boolean;
  27.     function TextToAudioFile(var FN: string; Text: string): Boolean;
  28.   public
  29.     { Public declarations }
  30.   end;
  31.  
  32. var
  33.   FormMain: TFormMain;
  34.  
  35. implementation
  36.  
  37. uses
  38.   ActiveX, VK.Entity.Doc.Save;
  39.  
  40. {$R *.dfm}
  41.  
  42. function CreateRandomAudioFile: string;
  43. var
  44.   i: Integer;
  45. begin
  46.   i := 0;
  47.   repeat
  48.     Inc(i);
  49.     Result := 'audio_text_' + GetTickCount.ToString + '_' + i.ToString + '.wav';
  50.   until not FileExists(Result);
  51. end;
  52.  
  53. function TFormMain.TextToAudioFile(var FN: string; Text: string): Boolean;
  54. var
  55.   Tokens: ISpeechObjectTokens;
  56.   FS: TSpFileStream;
  57.   AF: TSpAudioFormat;
  58. begin
  59.   try
  60.     Tokens := FVoice.GetVoices('', '');
  61.     FVoice.Voice := Tokens.Item(1);
  62.     FS := TSpFileStream.Create(nil);
  63.     AF := TSpAudioFormat.Create(nil);
  64.     AF.type_ := SAFT48kHz16BitStereo;
  65.     FS.Format := AF.DefaultInterface;
  66.     FN := CreateRandomAudioFile;
  67.     FS.Open(FN, SSFMCreateForWrite, False);
  68.     FVoice.AudioOutputStream := FS.DefaultInterface;
  69.     FVoice.Speak(Text, SVSFDefault);
  70.     FS.Close;
  71.     FS.Free;
  72.     AF.Free;
  73.     Result := FileExists(FN);
  74.   except
  75.     Result := False;
  76.   end;
  77. end;
  78.  
  79. procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  80. begin
  81.   CanClose := False;
  82.   Application.Terminate;
  83. end;
  84.  
  85. procedure TFormMain.FormDestroy(Sender: TObject);
  86. begin
  87.   FCensorWords.Free;
  88. end;
  89.  
  90. procedure TFormMain.FormCreate(Sender: TObject);
  91. begin
  92.   CoInitialize(nil);
  93.   FVoice := TSpVoice.Create(Self);
  94.   FCensorWords := TStringList.Create;
  95.   FCensorWords.LoadFromFile('censor.txt', TEncoding.UTF8);
  96.   VK.Login;
  97. end;
  98.  
  99. procedure TFormMain.VKAuth(Sender: TObject; var Token: string; var TokenExpiry: Int64; var ChangePasswordHash: string);
  100. begin
  101.   {$INCLUDE token.inc}
  102. end;
  103.  
  104. function TFormMain.CheckForCensor(Value: string): Boolean;
  105. var
  106.   i: Integer;
  107. begin
  108.   Result := False;
  109.   for i := 0 to FCensorWords.Count - 1 do
  110.     if Value.Contains(FCensorWords[i]) then
  111.       Exit(True);
  112. end;
  113.  
  114. procedure TFormMain.VkGroupEventsMessageNew(Sender: TObject; GroupId: Integer; Message: TVkMessage;
  115.   ClientInfo: TVkClientInfo; EventId: string);
  116. var
  117.   FN, Str: string;
  118.   Doc: TVkDocSaved;
  119. begin
  120.   Memo1.Lines.Add(Message.Text);
  121.   if (not Message.Text.IsEmpty) then
  122.   begin
  123.     if CheckForCensor(AnsiLowerCase(Message.Text)) then
  124.       VK.Messages.Send(Message.PeerId, 'Давай без мата, ок?');
  125.  
  126.     if Message.Text.StartsWith('/speak ') then
  127.     begin
  128.       Str := Message.Text.Replace('/speak ', '');
  129.       if TextToAudioFile(FN, Str) then
  130.       begin
  131.         if VK.Docs.SaveAudioMessage(Doc, FN, ExtractFileName(FN), '', Message.PeerId) then
  132.         begin
  133.           VK.Messages.Send(Message.PeerId, '', [Doc.AudioMessage.ToAttachment]);
  134.           Doc.Free;
  135.         end;
  136.       end;
  137.     end;
  138.   end;
  139. end;
  140.  
  141. procedure TFormMain.VKLogin(Sender: TObject);
  142. begin
  143.   if VkGroupEvents.Start then
  144.     Memo1.Lines.Add('VkGroupEvents.Started');
  145. end;
  146.  
  147. end.
Advertisement
Add Comment
Please, Sign In to add comment