Advertisement
Guest User

Untitled

a guest
Dec 23rd, 2018
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 14.44 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, Winapi.RichEdit, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.StdCtrls, Vcl.ExtCtrls,
  8.   Vcl.ToolWin, Vcl.ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  9.   IdTCPClient, AES256, MessageConfig, VCL.Themes, VCL.Styles, System.ImageList,
  10.   Vcl.ImgList, Unit2, VFrames, VSample, dmCD_u, EASendMailObjLib_TLB;
  11.  
  12. type
  13.   TForm1 = class(TForm)
  14.     IdTCPClient1: TIdTCPClient;
  15.     GridPanel1: TGridPanel;
  16.     GridPanel3: TGridPanel;
  17.     Send: TButton;
  18.     MyWebcam: TPageControl;
  19.     TabSheet7: TTabSheet;
  20.     GridPanel2: TGridPanel;
  21.     PaintBox1: TPaintBox;
  22.     Communication: TPageControl;
  23.     TabSheet1: TTabSheet;
  24.     ChatBoundaries: TMemo;
  25.     RichEdit1: TRichEdit;
  26.     TabSheet2: TTabSheet;
  27.     PageControl1: TPageControl;
  28.     TabSheet4: TTabSheet;
  29.     p: TTabSheet;
  30.     TabSheet6: TTabSheet;
  31.     ToolBar6: TToolBar;
  32.     Button15: TButton;
  33.     ToolBar7: TToolBar;
  34.     Button16: TButton;
  35.     ToolBar8: TToolBar;
  36.     Button17: TButton;
  37.     ToolBar5: TToolBar;
  38.     Button14: TButton;
  39.     ToolBar11: TToolBar;
  40.     Button21: TButton;
  41.     ToolBar1: TToolBar;
  42.     Button20: TButton;
  43.     ToolBar12: TToolBar;
  44.     Button19: TButton;
  45.     GridPanel5: TGridPanel;
  46.     ToolBar9: TToolBar;
  47.     Button2: TButton;
  48.     ToolBar14: TToolBar;
  49.     Button3: TButton;
  50.     ToolBar19: TToolBar;
  51.     Button7: TButton;
  52.     ToolBar22: TToolBar;
  53.     EmojiSelect: TButton;
  54.     ToolBar23: TToolBar;
  55.     Button10: TButton;
  56.     ToolBar13: TToolBar;
  57.     Label1: TLabel;
  58.     ToolBar21: TToolBar;
  59.     CheckBox1: TCheckBox;
  60.     ToolBar25: TToolBar;
  61.     EnableCamera: TCheckBox;
  62.     Button22: TButton;
  63.     UserInterface: TPageControl;
  64.     TabSheet9: TTabSheet;
  65.     TabSheet11: TTabSheet;
  66.     Panel3: TPanel;
  67.     TabSheet12: TTabSheet;
  68.     TabSheet13: TTabSheet;
  69.     ToolBar10: TToolBar;
  70.     Button18: TButton;
  71.     RoomList: TPageControl;
  72.     Label2: TLabel;
  73.     Controller: TPanel;
  74.     InputEdit: TEdit;
  75.     MainMenu1: TMainMenu;
  76.     Menu: TMenuItem;
  77.     N1: TMenuItem;
  78.     Disconnect1: TMenuItem;
  79.     N2: TMenuItem;
  80.     Exit1: TMenuItem;
  81.     VisiImages: TImageList;
  82.     FontColorSelect: TComboBox;
  83.     FontSizeSelect: TComboBox;
  84.     Label3: TLabel;
  85.     Label4: TLabel;
  86.     Label5: TLabel;
  87.     Label6: TLabel;
  88.     SelectThemeChange: TComboBox;
  89.     FontStyleSelect: TComboBox;
  90.     PrimaryTabs: TImageList;
  91.     ProfileTabs: TImageList;
  92.     GridPanel4: TGridPanel;
  93.     GridPanel7: TGridPanel;
  94.     Label7: TLabel;
  95.     Label8: TLabel;
  96.     InputUsername: TEdit;
  97.     InputPassword: TEdit;
  98.     Remember: TCheckBox;
  99.     RegisterBtn: TButton;
  100.     LoginBtn: TButton;
  101.     PasswordReset: TButton;
  102.     Label9: TLabel;
  103.     GridPanel8: TGridPanel;
  104.     GridPanel9: TGridPanel;
  105.     Label11: TLabel;
  106.     Cancel: TButton;
  107.     Label10: TLabel;
  108.     Label33: TLabel;
  109.     EmailInput: TEdit;
  110.     ComfirmPassInput: TEdit;
  111.     Label13: TLabel;
  112.     PasswordInput: TEdit;
  113.     UsernameInput: TEdit;
  114.     Label14: TLabel;
  115.     RegisterAct: TButton;
  116.     RecoveryEdit: TEdit;
  117.     RecoverySend: TButton;
  118.     Label12: TLabel;
  119.     VerifyInput: TEdit;
  120.     VerifyBtn: TButton;
  121.     VerifyLabel: TLabel;
  122.     destructor FormDestroy(Sender : TObject);
  123.     procedure FormCreate(Sender : TObject);
  124.     procedure Exit1Click(Sender: TObject);
  125.     procedure DeliverMessage;
  126.     procedure InputEditOnEnter(Sender: TObject; var Key: Char);
  127.     procedure SendClick(Sender: TObject);
  128.     procedure InputEditOnChangeScroll(Sender : TObject);
  129.     procedure SelectThemeChangeClick(Sender: TObject);
  130.     procedure Disconnect1Click(Sender: TObject);
  131.     procedure EmojiSelectClick(Sender: TObject);
  132.     procedure FontSizeSelectOnChange(Sender : TObject);
  133.     procedure FontColorSelectOnChange(Sender : TObject);
  134.     procedure FontStyleSelectOnChange(Sender : TObject);
  135.     procedure EnableCameraOnChange(Sender: TObject);
  136.     procedure CancelClick(Sender: TObject);
  137.     procedure RegisterActClick(Sender: TObject);
  138.     procedure RegisterBtnClick(Sender: TObject);
  139.     procedure LoginBtnClick(Sender: TObject);
  140.     procedure PasswordResetClick(Sender: TObject);
  141.     procedure RecoverySendClick(Sender: TObject);
  142.     procedure VerifyBtnClick(Sender: TObject);
  143.     procedure Button18Click(Sender: TObject);
  144.   private
  145.     { Private declarations }
  146.   public
  147.     { Public declarations }
  148.   end;
  149.   TRichEditStyleHookFix = class(TScrollingStyleHook)
  150.   strict private
  151.     procedure EMSetBkgndColor(var Message: TMessage); message EM_SETBKGNDCOLOR;
  152.   end;
  153.  
  154. var
  155.   Form1: TForm1;
  156.   I : Integer;
  157.   MessageStr : String;
  158.   TSocketThread : Cardinal;
  159.   FontSize : Integer;
  160.   FontStyle : TFontStyles;
  161.   FontColor : TColor;
  162.   SmileyForm : TForm;
  163.  
  164.   Cam:TVideoImage;
  165.   CamList:TStringList;
  166.   reslist:TStringList;
  167.  
  168. implementation
  169.  
  170. {$R *.dfm}
  171.  
  172. procedure TForm1.FormCreate(Sender : TObject);
  173. begin
  174.   {Set Style Hook}
  175.   TStyleManager.Engine.RegisterStyleHook(TRichEdit, TRichEditStyleHookFix);
  176.   {Set Defaults}
  177.   FontSize := 8;
  178.   FontStyle := [];
  179.   FontColor := clLime;
  180. end;
  181.  
  182. { Connection }
  183. Procedure SocketThread;
  184. begin
  185.   Form1.IdTcpClient1.Host := ServerIP;
  186.   Form1.IdTcpClient1.Port := ServerPort;
  187.   try
  188.   Form1.IDTcpClient1.Connect;
  189.  
  190.   if Form1.IdTCPClient1.connected then
  191.   begin
  192.     Form1.RichEdit1.Lines.Add('Connected To Server.');
  193.     Form1.GridPanel4.Enabled := False;
  194.     Form1.GridPanel4.Visible := False;
  195.     Form1.GridPanel1.Enabled := True;
  196.     Form1.GridPanel1.Visible := True;
  197.     Form1.Disconnect1.Enabled := True;
  198.   end;
  199.   while Form1.IdTcpClient1.Connected do
  200.     begin
  201.       MessageStr := Form1.IdtcpClient1.Socket.ReadLn();
  202.       //Insert Smileys.
  203.       if MessageStr <> '' then Form1.RichEdit1.Lines.Add(DecryptAES_256(ChatPassword,MessageStr));
  204.       MessageStr := '';
  205.       Sleep(1);
  206.     end;
  207.   Except
  208.     ShowMessage('Invalid username/password provided.');
  209.   end;
  210. end;
  211.  
  212. procedure TForm1.FontSizeSelectOnChange(Sender: TObject);
  213. begin
  214.   FontSize := StrToInt(FontSizeSelect.Items[FontSizeSelect.ItemIndex]);
  215. end;
  216. procedure TForm1.FontColorSelectOnChange(Sender: TObject);
  217. begin
  218.   FontColor := StringToColor('cl' + FontColorSelect.Items[FontColorSelect.ItemIndex])
  219. end;
  220. procedure TForm1.FontStyleSelectOnChange(Sender : TObject);
  221. begin
  222.   case Form1.FontStyleSelect.ItemIndex of
  223.     0 : FontStyle := [];
  224.     1 : FontStyle := [fsItalic];
  225.     2 : FontStyle := [fsBold];
  226.     3 : FontStyle := [fsUnderline]
  227.   end
  228. end;
  229.  
  230. {Open Emoji Selection}
  231. procedure TForm1.EmojiSelectClick(Sender: TObject);
  232. begin
  233.   if Unit2.Form2.Visible = False then begin {EmojiForm Position needs adjusting, tweek later}
  234.     if Unit2.Form2.Left <> GridPanel5.Left + Unit2.Form2.Width then
  235.       Unit2.Form2.Left := GridPanel5.Left + Unit2.Form2.Width;
  236.  
  237.     if Unit2.Form2.Top <> Communication.Height - (Unit2.Form2.Height div 2) then
  238.       Unit2.Form2.Top := Communication.Height - (Unit2.Form2.Height div 2);
  239.  
  240.     Unit2.Form2.Visible := True
  241.   end else
  242.     Unit2.Form2.Visible := False;
  243. end;
  244.  
  245. procedure TForm1.RecoverySendClick(Sender: TObject);
  246. begin
  247.   RecoveryEdit.Visible := False;
  248.   RecoverySend.Visible := False;
  249.   RecoveryEdit.Enabled := False;
  250.   RecoverySend.Enabled := False;
  251.   ShowMessage('An email has been delivered to reset your password.');
  252. end;
  253.  
  254. procedure TForm1.Button18Click(Sender: TObject);
  255. begin
  256.     IDTcpClient1.Disconnect;
  257.     GridPanel1.Enabled := False;
  258.     GridPanel1.Visible := False;
  259.     GridPanel4.Enabled := True;
  260.     GridPanel4.Visible := True;
  261.     Disconnect1.Enabled := False;
  262. end;
  263.  
  264. procedure TForm1.CancelClick(Sender: TObject);
  265. begin
  266.   GridPanel8.Visible := False;
  267.   GridPanel8.Enabled := False;
  268.   GridPanel4.Enabled := True;
  269.   GridPanel4.Visible := True;
  270. end;
  271.  
  272. procedure RegisterActClick(Sender: TObject);
  273. begin
  274.   ShowMessage('Verifying Information');
  275.   {Data Module Input}
  276. end;
  277.  
  278. procedure TForm1.Disconnect1Click(Sender: TObject);
  279. begin
  280.   if Form1.IdTcpClient1.Connected then IDTcpClient1.Disconnect;
  281.   GridPanel1.Enabled := False;
  282.   GridPanel1.Visible := False;
  283.   GridPanel4.Enabled := True;
  284.   GridPanel4.Visible := True;
  285.   Disconnect1.Enabled := False;
  286. end;
  287.  
  288. {On application close, disconnect user from the chat.}
  289. procedure TForm1.Exit1Click(Sender: TObject);
  290. begin
  291.   if Form1.IdTcpClient1.Connected then IDTcpClient1.Disconnect;
  292.   Exit;
  293. end;
  294. destructor TForm1.FormDestroy(Sender : TObject);
  295. begin
  296.   if Form1.IdTcpClient1.Connected then IDTcpClient1.Disconnect;
  297.   Cam.Free;
  298.   CamList.Free;
  299.   reslist.Free;
  300. end;
  301.  
  302. procedure TForm1.DeliverMessage;
  303. begin
  304.   if Form1.IdTcpClient1.Connected then begin
  305.     Form1.RichEdit1.SelAttributes.Size := FontSize;
  306.     Form1.RichEdit1.SelAttributes.Style := FontStyle;
  307.     Form1.RichEdit1.SelAttributes.Color := FontColor;
  308.     if InputEdit.Text <> '' then begin {No sending blank messages.}
  309.       IdTcpClient1.Socket.WriteLn(EncryptAES_256(ChatPassword,General_Message_All + Delim + InputEdit.Text));
  310.       InputEdit.Text := '';
  311.     end;
  312.   end;
  313. end;
  314.  
  315. {Enter Message}
  316. procedure TForm1.InputEditOnEnter(Sender: TObject; var Key: Char);
  317. begin
  318.   if ord(Key) = VK_RETURN then
  319.   begin
  320.     Key := #0; // prevent beeping
  321.       Form1.DeliverMessage;
  322.   end;
  323. end;
  324.  
  325. procedure TForm1.LoginBtnClick(Sender: TObject);
  326. begin
  327.   CreateThread(nil, 0, @SocketThread, nil, 0, TSocketThread);
  328. end;
  329.  
  330. procedure TForm1.PasswordResetClick(Sender: TObject);
  331. begin
  332.   if RecoveryEdit.Enabled = False then begin
  333.     RecoveryEdit.Enabled := True;
  334.     RecoverySend.Enabled := True;
  335.     RecoveryEdit.Visible := True;
  336.     RecoverySend.Visible := True;
  337.     ShowMessage('Enter your registered email address to receive a recovery password.');
  338.   end;
  339. end;
  340.  
  341. {On Activation, send email to user with random verification key to input and activate account.}
  342. procedure TForm1.RegisterActClick(Sender: TObject);
  343. var
  344.   CharList : Array of Char;
  345.   RandomLength, Index, RandomIndex : Integer;
  346.   KeyGenerated : String;
  347.   oSmtp : TMail;
  348. begin
  349.   CharList :=
  350.   [
  351.       '0', '1', '2', '3', '4', '5',
  352.       '6', '7', '8', '9', 'A', 'B',
  353.       'C', 'D', 'E', 'F', 'G', 'H',
  354.       'I', 'J', 'K', 'L', 'M', 'N',
  355.       'O', 'P', 'Q', 'R', 'S', 'T',
  356.       'U', 'V', 'W', 'X', 'Y', 'Z'
  357.   ];
  358.     with dmCD do begin
  359.         if UserDataTable.Active = False then begin
  360.             UserDataTable.Active := True;
  361.       if UserDataTable.Locate('Username', UsernameInput.Text, []) = False then
  362.         if UserDataTable.Locate('UserEmail', EmailInput.Text, []) = False then begin
  363.           {Generate unique key}
  364.           RandomLength := 8 + Random(7);
  365.           for Index := 1 to RandomLength do
  366.           begin
  367.             RandomIndex := 0 + Random(35);
  368.             KeyGenerated := KeyGenerated + CharList[RandomIndex];
  369.           end;
  370.           //
  371.           UserDataTable.Append;
  372.           UserDataTable['UserIP'] := KeyGenerated;
  373.           UserDataTable['Username'] := UsernameInput.Text;
  374.           UserDataTable['UserEmail'] := EmailInput.Text;
  375.           UserDataTable['Verified'] := False;         //Comparison: on ActivateBtnClick, Locate IP(Key).
  376.           UserDataTable.Post;                         //If ActivateInput.Text = IP(Key) found,
  377.           UserDataTable.Active := False;              //Verified := True.
  378.                                                       //Login : If Verified := True, connect.
  379.                                                       //On Connect : if IP <> Context(ClientIP) then IP := Context;
  380.                                                       //Auto updates the IP for each login, and kills 2 birds with 1 stone.
  381.           //On ActivateInput.Enabled, Fire the email event from the server.
  382.           if VerifyInput.Enabled = False then
  383.             VerifyLabel.Enabled := True;
  384.           VerifyInput.Enabled := True;
  385.           VerifyBtn.Enabled := True;
  386.  
  387.           oSmtp := TMail.Create(Application);
  388.           oSmtp.LicenseCode := 'TryIt';
  389.           oSmtp.FromAddr := 'GlobalChattertainment@gmail.com';
  390.           oSmtp.AddRecipientEx(EmailInput.Text, 0);
  391.           oSmtp.Subject := 'simple email from Delphi project';
  392.           oSmtp.BodyText := 'Activation Key : ' + KeyGenerated + '. Do not reply.';
  393.           oSmtp.ServerAddr := 'smtp.gmail.com';
  394.           oSmtp.UserName := 'GlobalChattertainment@gmail.com';
  395.           oSmtp.Password := 'TempPw!';
  396.           oSmtp.SSL_init();
  397.           if oSmtp.SendMail() = 0 Then
  398.             ShowMessage('An email with your activation key has been sent. Your account will become active after verification.')
  399.           else
  400.             ShowMessage( 'failed to send email with the following error: ' + oSmtp.GetLastErrDescription());
  401.               end else
  402.                     ShowMessage('That email is already in use. Try another one.')
  403.           else
  404.               ShowMessage('That username is already taken. Please choose another.');
  405.     end;
  406.     end;
  407. end;
  408.  
  409. procedure TForm1.RegisterBtnClick(Sender: TObject);
  410. begin
  411.   GridPanel4.Visible := False;
  412.   GridPanel4.Enabled := False;
  413.   GridPanel8.Enabled := True;
  414.   GridPanel8.Visible := True;
  415. end;
  416.  
  417. procedure TForm1.SendClick(Sender: TObject); begin
  418.   Form1.DeliverMessage;
  419. end;
  420.  
  421. procedure TForm1.VerifyBtnClick(Sender: TObject);
  422. begin
  423.   if dmCD.UserDataTable.Active = False then
  424.     dmCD.UserDataTable.Active := True;
  425.  
  426.   if dmCD.UserDataTable.Locate('UserIP', VerifyInput.Text, []) then
  427.     dmCD.UserDataTable[dmCD.UserDataTable['UserIP']].Verified := True;
  428. end;
  429.  
  430. {Auto Scroll to last entry of chat}
  431. procedure TForm1.InputEditOnChangeScroll(Sender : TObject);
  432. begin
  433.   SendMessage(RichEdit1.Handle, WM_VSCROLL, SB_BOTTOM, 0);
  434. end;
  435.  
  436. {Change Theme}
  437. procedure TForm1.SelectThemeChangeClick(Sender: TObject);
  438. begin
  439.    TStyleManager.TrySetStyle(SelectThemeChange.Items[SelectThemeChange.ItemIndex]);
  440. end;
  441.  
  442. {Enable font color change with Themes enabled}
  443. procedure TRichEditStyleHookFix.EMSetBkgndColor(var Message: TMessage);
  444. begin
  445.   Message.LParam := ColorToRGB(StyleServices.GetStyleColor(scEdit));
  446.   Handled := False;
  447. end;
  448.  
  449. procedure TForm1.EnableCameraOnChange(Sender: TObject);
  450. begin
  451.  
  452.    Camlist := TStringList.Create ;
  453.    ResList :=TStringList.Create;
  454.  
  455.    Cam := TVideoImage.Create;
  456.    Cam.GetListOfDevices(camlist);
  457.  
  458.    Cam.SetDisplayCanvas(PaintBox1.Canvas);
  459.  
  460.    Cam.VideoStart(camlist.Strings[0]);
  461.    // important
  462.  
  463.    Cam.GetListOfSupportedVideoSizes(ResList);
  464.    Form1.RichEdit1.Lines.Add(ResList.Strings[0]);
  465.    Cam.SetResolutionByIndex(0);
  466.  
  467.    //specify your resolution by index using listbox index
  468.    //this will not only lists resolutions but also other features available , so be careful when selecting the index
  469. end;
  470.  
  471. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement