SUser.pas
01.01.2007
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Author: Alexander Vaga EMail: primary: icq2000cc@hobi.ru secondary: alexander_vaga@hotmail.com Web: http://icq2000cc.hobi.ru Creation: May, 2002 Legal issues: Copyright (C) 2002 by Alexander Vaga Kyiv, Ukraine This software is provided 'as-is', without any express or implied warranty. In no event will the author be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} unit SUser; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Menus, Animate, ExtCtrls, Grids, AppEvnts, Typess,Packet,Main,UInfo; type TSearchUser = class(TForm) GroupBox1: TGroupBox; SearchBtn: TButton; StopSearchBtn: TButton; SearchPage: TPageControl; EMAIL: TTabSheet; DETAILS: TTabSheet; ICQn: TTabSheet; Label1: TLabel; GroupBox2: TGroupBox; Label2: TLabel; EMAILed: TEdit; GroupBox3: TGroupBox; Label3: TLabel; Label4: TLabel; Label5: TLabel; NICKed: TEdit; FIRSTed: TEdit; LASTed: TEdit; GroupBox4: TGroupBox; Label6: TLabel; UINed: TEdit; Label7: TLabel; FoundUsers: TStringGrid; FoundLabel: TLabel; FoundPopupMenu: TPopupMenu; AddToCList: TMenuItem; Panel1: TPanel; SUAnime: TAnimatedImage; Info: TMenuItem; ApplicationEvents1: TApplicationEvents; procedure SearchBtnClick(Sender: TObject); procedure StopSearchBtnClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure META_Search_User(NN,FN,LN : string); procedure META_Search_UIN(sUIN : string); procedure META_Search_Mail(Mail : string); procedure FormCreate(Sender: TObject); procedure AddToCListClick(Sender: TObject); procedure InfoClick(Sender: TObject); procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); private { Private declarations } public Failure : boolean; Cookie : word; { Public declarations } end; implementation {$R *.DFM} type TFoundList = array[0..50] of TListRecord; var FoundList : TFoundList; FoundNum : integer; procedure TSearchUser.SearchBtnClick(Sender: TObject); var i : integer; begin FoundLabel.Caption := 'OFF-line mode is now!'; if (not OL) or (not isLogged) then exit; FoundLabel.Caption := 'Found: ?'; EndOfSearch := true; Failure := false; FoundNum := 0; FoundLabel.Caption := 'Found: '+s(FoundNum)+' user(s)'; FoundUsers.RowCount := 2; case SearchPage.ActivePageIndex of 0: META_Search_Mail(EMAILed.Text); 1: META_Search_User(NICKed.Text,FIRSTed.Text,LASTed.Text); 2: META_Search_UIN(UINed.Text); end; SearchBtn.Enabled := false; SUAnime.Active := true; while not EndOfSearch do Application.ProcessMessages; SUAnime.Active := false; SearchBtn.Enabled := true; FoundLabel.Caption := 'Found: '+s(FoundNum)+' user(s)'; if FoundNum > 0 then begin for i:=0 to FoundNum-1 do begin with FoundUsers,FoundList[i] do begin case STATUS of 0: Cells[0,i+1] := 'O'; 1: Cells[0,i+1] := '+'; 2: Cells[0,i+1] := '?'; else Cells[0,i+1] := '.'; end; Cells[1,i+1] := s(UIN); Cells[2,i+1] := NICK; Cells[3,i+1] := FIRST; Cells[4,i+1] := LAST; Cells[5,i+1] := PRI_E_MAIL; case AUTH of 0: Cells[6,i+1] := 'Author.'; 1: Cells[6,i+1] := 'Always'; else Cells[6,i+1] := 'Mode: '+s(AUTH); end; if i=FoundNum-1 then break; RowCount := RowCount + 1; end; end; end else begin Foundusers.RowCount := 2; FoundUsers.Cells[0,1] := ''; FoundUsers.Cells[1,1] := ''; FoundUsers.Cells[2,1] := ''; FoundUsers.Cells[3,1] := ''; FoundUsers.Cells[4,1] := ''; FoundUsers.Cells[5,1] := ''; FoundUsers.Cells[6,1] := ''; EndOfSearch := true; end; if Failure then FoundLabel.Caption := '!!! Failure !!!'; end; procedure TSearchUser.StopSearchBtnClick(Sender: TObject); begin EndOfSearch := true; SearchBtn.Enabled := true; end; procedure TSearchUser.FormClose(Sender: TObject; var Action: TCloseAction); begin EndOfSearch := true; Destroy; end; procedure TSearchUser.META_Search_User(NN,FN,LN : string); var p,a : PPack; begin if (NN='')and(FN='')and(LN='') then exit; EndOfSearch := false; a := PacketNew; PacketGoto(a,2); // a[0..1] = len PacketAppend32(a,main.UIN); PacketAppend16(a,swap($D007)); Cookie := random($FF) shl 8; PacketAppend16(a,swap(Cookie)); PacketAppend16(a,swap($1505)); PacketAppendString(a,FN); PacketAppendString(a,LN); PacketAppendString(a,NN); PacketBegin(a); PacketAppend16(a,a.length-2); P:=CreatePacket(2,SEQ); SNACAppend(p,$15,$2); TLVAppend(p,1,a.length,@a.data); PacketDelete(a); Form1.PacketSend(p); M(Form1.Memo,'>Search Detail: Nick:'+NN+' First:'+FN+' Last:'+LN+' '+ 'Cookie:$'+inttohex(Cookie,4)); end; procedure TSearchUser.META_Search_UIN(sUIN : string); var p,a : PPack; i : integer; begin if (sUIN='')then exit; for i:=1 to length(sUIN) do if (sUIN[i]<'0')or(sUIN[i]>'9') then exit; EndOfSearch := false; a := PacketNew; PacketGoto(a,2); // a[0..1] = len PacketAppend32(a,main.UIN); PacketAppend16(a,swap($D007)); Cookie := random($FF) shl 8; PacketAppend16(a,swap(Cookie)); PacketAppend16(a,swap($1F05)); try PacketAppend32(a,strtoint(sUIN)); except PacketAppend32(a,10000000); end; PacketBegin(a); PacketAppend16(a,a.length-2); P:=CreatePacket(2,SEQ); SNACAppend(p,$15,$2); TLVAppend(p,1,a.length,@a.data); PacketDelete(a); Form1.PacketSend(p); M(Form1.Memo,'>Search UIN: '+sUIN+' '+ 'Cookie:$'+inttohex(Cookie,4)); end; procedure TSearchUser.META_Search_Mail(Mail : string); var p,a : PPack; begin if (Mail='')or(pos('@',Mail)=0) then exit; EndOfSearch := false; a := PacketNew; PacketGoto(a,2);// a[0..1] = len PacketAppend32(a,main.UIN); PacketAppend16(a,swap($D007)); Cookie := random($FF) shl 8; PacketAppend16(a,swap(Cookie)); PacketAppend16(a,swap($2905)); PacketAppendString(a,Mail); PacketBegin(a); PacketAppend16(a,a.length-2); P:=CreatePacket(2,SEQ); SNACAppend(p,$15,$2); TLVAppend(p,1,a.length,@a.data); PacketDelete(a); Form1.PacketSend(p); M(Form1.Memo,'>Search E-Mail: '+Mail+' '+ 'Cookie:$'+inttohex(Cookie,4)); end; procedure TSearchUser.FormCreate(Sender: TObject); begin with FoundUsers do begin Cells[0,0] := 'St'; Cells[1,0] := 'UIN'; Cells[2,0] := 'Nick Name'; Cells[3,0] := 'First Name'; Cells[4,0] := 'Last Name'; Cells[5,0] := 'E-Mail'; Cells[6,0] := 'Authorization'; end; end; procedure TSearchUser.AddToCListClick(Sender: TObject); var Y : integer; node : TTreeNode; tmp : PPack; begin Y := FoundUsers.Selection.Top; if FoundNum = 0 then exit; // copy to Contact List ContactList[CLNum] := FoundList[Y-1]; if ContactList[CLNum].NICK = '' then ContactList[CLNum].NICK := s(ContactList[CLNum].UIN) ; ContactList[CLNum].EXTRA.ICON_INDEX := simply_icq; ContactList[CLNum].EXTRA.MES_IS := false; // add to TTreeView node := Form1.CL.Items.AddObject(nil,ContactList[CLNum].NICK,@ContactList[CLNum]); node.ImageIndex := ContactList[CLNum].EXTRA.ICON_INDEX; node.SelectedIndex := ContactList[CLNum].EXTRA.ICON_INDEX; inc(CLNum); Form1.CL.AlphaSort; Form1.WriteToContactList(ContactList[CLNum-1]); // Add to Contact List tmp := CreatePacket(2,SEQ); SNACAppend(tmp,$3,$4); PacketAppendB_String(tmp,s(ContactList[CLNum-1].UIN)); Form1.PacketSend(tmp); M(Form1.Memo,'>Add To Contact List: ' +s(ContactList[CLNum-1].UIN)); // ... a useru ob etom ne obiazatelno znat :^) end; procedure TSearchUser.InfoClick(Sender: TObject); var TUI : TUserInfo; Y : integer; begin Y := FoundUsers.Selection.Top; if FoundNum = 0 then exit; Application.CreateForm(TUserInfo,TUI); TUI.AutoRetrieve := true; TUI.Caption := 'Info: '+s(FoundList[Y-1].UIN)+' ( '+FoundList[Y-1].NICK+' )'; TUI.UIRecord := FoundList[Y-1]; TUI.Show; end; procedure TSearchUser.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); var PBuff : PSearchRec; i : integer; IsAlways : boolean; begin if Msg.message = msg_SInfo then begin if (Msg.wParam = Cookie)then begin Handled := false; PBuff := PSearchRec(Msg.lParam); if FoundNum = 50 then exit; IsAlways := false; for i:=0 to FoundNum-1 do if FoundUsers.Cells[1,i+1] = s(PBuff^.uin) then begin IsAlways := true; break; end; if not IsAlways then with PBuff^ do begin if uin <> 999999999 then begin FoundList[FoundNum].UIN := uin; FoundList[FoundNum].NICK := nick; FoundList[FoundNum].FIRST := first; FoundList[FoundNum].LAST := last; FoundList[FoundNum].PRI_E_MAIL := email; FoundList[FoundNum].AUTH := auth; FoundList[FoundNum].STATUS := status; inc(FoundNum); end else Failure := true; end; Dispose(PBuff); end; end; end; end.