UsersService.pas 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873
  1. unit UsersService;
  2. interface
  3. uses
  4. StrUtils, SysUtils, Windows, superobject, RealICQClient, Classes, RealICQContacterTreeView,
  5. RealICQContacterListView, ComCtrls, BaseService, AsynResponseUserInfo, RealICQModel,
  6. WideStrings;
  7. type
  8. TUsersService = class(TBaseService)
  9. private
  10. {$REGION '本地用户数据管理'}
  11. FUsers: TStringList;
  12. {$ENDREGION}
  13. {$REGION '根据部门ID获取用户简单信息'}
  14. procedure HandleBranchUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient);
  15. procedure DoGettedUsersByBranchID(AServerID, ABranchID: string; AUsers: TStringList);
  16. {$ENDREGION}
  17. {$REGION '单位用户'}
  18. procedure HandleCompanyUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient);
  19. {$ENDREGION}
  20. {$REGION '群组用户'}
  21. procedure HandleTeamUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient);
  22. {$ENDREGION}
  23. {$region '好友'}
  24. /// <summary>
  25. /// 响应好友简单消息
  26. /// 协议号03
  27. /// </summary>
  28. /// <param name="AJo">{[{simple user}, {simple user}, {simple user}]}</param>
  29. /// <param name="ARealICQClient"></param>
  30. procedure HandleFriends(AJo: ISuperObject; ARealICQClient: TRealICQClient);
  31. /// <summary>
  32. /// 响应好友详细消息
  33. /// 协议号05
  34. /// </summary>
  35. /// <param name="AJo">{"s":"ServerID", "us":[{detail user}, {detail user}, {detail user}]}</param>
  36. /// <param name="ARealICQClient"></param>
  37. procedure HandleDetailFriends(AJo: ISuperObject; ARealICQClient: TRealICQClient);
  38. procedure UpdateOrAddFriends(AUsers: TStringList);
  39. {$ENDREGION}
  40. {$REGION '用户详细信息'}
  41. /// <summary>
  42. /// 响应用户详细信息
  43. /// 协议号00
  44. /// </summary>
  45. /// <param name="AJo">{"s":"ServerID", "us":[{detail user}, {detail user}, {detail user}]}</param>
  46. /// <param name="ARealICQClient"></param>
  47. procedure HandleUserInformations(AJo: ISuperObject; ARealICQClient: TRealICQClient);
  48. procedure DoReceivedUserInformations(AServerID: string; AUsers: TStringList);
  49. {$ENDREGION}
  50. constructor Create;
  51. procedure HandleMessage(ASender: TObject; const AData: TBytes);
  52. //function GetAndSaveUsersByJsons(AJo: ISuperObject; ARealICQClient: TRealICQClient): TStringList;
  53. procedure RequestUserInformation(ALoginName: string; ARealICQClient: TRealICQClient);
  54. /// <summary>
  55. /// 更新内存用户信息并保存到本地数据库
  56. /// </summary>
  57. /// <param name="AJo">{"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]}</param>
  58. /// <param name="ARealICQClient"></param>
  59. function InitAndSaveUsers(AJo: ISuperObject;
  60. ARealICQClient: TRealICQClient; AUpdateType: TUpdateUIType = uutAll): TStringList;
  61. procedure HandleDetailWorkmates(AJo: ISuperObject;
  62. ARealICQClient: TRealICQClient);
  63. function GetUserRemark(ALoginName: string): ISuperObject;
  64. public
  65. destructor Destroy; override;
  66. class function GetUsersService: TUsersService;
  67. procedure Init;
  68. procedure Uninstall;
  69. procedure RequestWorkmatesInfos(ALoginNames: TStrings);
  70. procedure RequestUserInformations(ALoginNames: TStrings; ARealICQClient: TRealICQClient); overload;
  71. procedure RequestUserInformations(ALoginNames: array of string; ARealICQClient: TRealICQClient); overload;
  72. procedure RequestUserStatus(AProtocol: Byte; AUsers: TStringList);
  73. procedure RequestUsersByBranchID(AServerID: string; ABranchIDs: TStrings; ARealICQClient: TRealICQClient);
  74. procedure RequestFriends(ARealICQClient: TRealICQClient);
  75. procedure RequestCompany(ARealICQClient: TRealICQClient);
  76. procedure RequestUserDetailByUserSimple(AProtocol: Byte; AUserSimples: TInterfaceList; ARealICQClient: TRealICQClient);
  77. procedure RequestUserDetailByLoginName(AProtocol: Byte; ALoginName: TInterfaceList; ARealICQClient: TRealICQClient);
  78. function GetOrRequestUser(ALoginName: string; ARealICQClient: TRealICQClient = nil): TRealICQUser;
  79. function GetUser(ALoginName: string): TRealICQUser;
  80. function GetMe: TRealICQUser;
  81. procedure DoOnReceivedUserStatus(ALoginName: string; ALoginState: TRealICQLoginState; ALeaveMessage: string);
  82. /// <summary>
  83. /// 获取用户信息
  84. /// </summary>
  85. /// <param name="ALoginNames">登录名</param>
  86. /// <param name="ARealICQClient"></param>
  87. /// <returns>所有的用户信息</returns>
  88. function GetOrCreateUsers(ALoginNames: TStrings; ARealICQClient: TRealICQClient = nil): TStringList;
  89. function GetWorkmatesAndFriends(): TStringList;
  90. function IsWorkmateOrFriend(ALoginName: string): Boolean;
  91. function RequestAndGetTeamMembers(AMembers: TStrings; ARealICQClient: TRealICQClient): TStringList;
  92. function IsCanSee(ALoginName: string): Boolean;
  93. {$REGION '更新到UI'}
  94. procedure DoGettedCompanyUsers(AUsers: TStringList; ABranch: string);
  95. procedure DoGettedFriends(AUsers: TStringList);
  96. procedure UpdateOrAddUsersToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView; ABranchID: string = '');
  97. procedure UpdateUsersToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView);
  98. procedure UpdateUserStateToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView);
  99. procedure UpdateOrAddUsersToListView(AListView: TRealICQContacterListView; AUsers: TStringList);
  100. procedure UpdateUsersToListView(AListView: TRealICQContacterListView;
  101. AUsers: TStringList);
  102. procedure UpdateUserStateListView(AListView: TRealICQContacterListView; AUsers: TStringList);
  103. procedure UpdateListItem(AListItem: TRealICQContacterListItem;
  104. AUser: TRealICQUser; AShowNavBarNumeric: Boolean = True);
  105. procedure UpdateTreeNode(Employee: TRealICQEmployee;
  106. RealICQUser: TRealICQUser; AShowNavBarNumeric: Boolean = True);
  107. procedure UpdateFriends(AUsers: TStringList);
  108. procedure UpdateTeamsMembers(AUsers: TStringList);
  109. procedure UpdateOrAddFriend(AUser: TRealICQUser);
  110. {$ENDREGION}
  111. {$REGION '本地用户数据管理'}
  112. function InitAndRequestUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient;
  113. ARequestRealTime: Boolean = True; ANeedRequestUsers: TStringList = nil): TStringList;
  114. function GetOrCreateUser(ALoginName: string; ARealICQClient: TRealICQClient): TRealICQUser;
  115. procedure AddMoreUser(AUser: TRealICQUser);
  116. {$ENDREGION}
  117. end;
  118. const
  119. /// <summary>
  120. /// 协议$00
  121. /// <para>request {"s":"ServerID","us":["u1","u2",..,"un"]}</para>
  122. /// <para>response {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]}</para>
  123. /// </summary>
  124. USERINFO_PROLOCOL: byte = $00;
  125. /// <summary>
  126. /// 协议$01
  127. /// <para>request {"s":"ServerID", "bs":[b1, b2, ..., bn]}</para>
  128. /// <para>request {"s":"ServerID","us":["u1","u2",..,"un"]}</para>
  129. /// <para>response {
  130. /// "s":"ServerID",
  131. /// "bs":{
  132. /// "b1":[{simple user}, {simple user}, {simple user}],
  133. /// "b2":[{simple user}, {simple user}, {simple user}]
  134. /// }
  135. /// }</para>
  136. /// </summary>
  137. /// </summary>
  138. BRANCH_USERS_PROLOCOL: byte = $01;
  139. /// <summary>
  140. /// 协议$02
  141. /// <para>request 就一个协议头</para>
  142. /// <para>response
  143. /// {
  144. /// "completed":true,
  145. /// "bs":{
  146. /// "b1":[{simple user}, {simple user}, {simple user}],
  147. /// "b2":[{simple user}, {simple user}, {simple user}]
  148. /// }
  149. /// }</para>
  150. /// </summary>
  151. COMPANY_USERS_PROLOCOL: byte = $02;
  152. /// <summary>
  153. /// 协议$03
  154. /// <para>request 就一个协议头</para>
  155. /// <para>response
  156. /// {
  157. /// [{simple user}, {simple user}, {simple user}]
  158. /// }
  159. /// }</para>
  160. /// </summary>
  161. FRIENDS_PROLOCOL: byte = $03;
  162. /// <summary>
  163. /// 协议$04
  164. /// <para>request {"s":"ServerID", "us":[{simple user}, {simple user}, {simple user}]}</para>
  165. /// <para>response {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]}</para>
  166. /// </summary>
  167. TEAM_USER_PROLOCOL: byte = $04;
  168. /// <summary>
  169. /// 协议$05
  170. /// <para>request {"s":"ServerID", "us":[{simple user}, {simple user}, {simple user}]}</para>
  171. /// <para>response {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]}</para>
  172. /// </summary>
  173. FRIENDS_DETAIL_PROLOCOL: byte = $05;
  174. /// <summary>
  175. /// 协议$06
  176. /// <para>request {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]}</para>
  177. /// <para>response {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]}</para>
  178. /// </summary>
  179. WORKMATES_USERSTATE_PROLOCOL: byte = $06;
  180. /// <summary>
  181. /// 协议$07
  182. /// <para>request {"s":"ServerID","us":["u1","u2",..,"un"]}</para>
  183. /// <para>response {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]}</para>
  184. /// </summary>
  185. WORKMATEINFO_PROLOCOL: byte = $07;
  186. /// <summary>
  187. /// 协议$08
  188. /// <para>request {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]}</para>
  189. /// <para>response {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]}</para>
  190. /// </summary>
  191. TEAMMEMBERS_USERSTATE_PROLOCOL: byte = $08;
  192. /// <summary>
  193. /// 协议$09
  194. /// <para>request {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]}</para>
  195. /// <para>response {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]}</para>
  196. /// </summary>
  197. FRIENDS_USERSTATE_PROLOCOL: byte = $09;
  198. implementation
  199. uses
  200. MainFrm, DataProviderImport, InterfaceDataProvider, LoggerImport, GIFImage,
  201. Messages, TalkingFrm, UserCardDetailView, SMSFrm, TeamOptionsFrm, FriendsService,
  202. WorkmatesService, Forms, AsynRequestUserInfo, TeamsService, UserRemarkService,
  203. LimitCondition, Dialogs, ConditionConfig;
  204. var
  205. AUsersService: TUsersService;
  206. procedure TUsersService.AddMoreUser(AUser: TRealICQUser);
  207. var
  208. AUser1: TRealICQUSer;
  209. begin
  210. if (AUser = nil) or (Auser.LoginName = '') then
  211. Exit;
  212. AUser1 := GetUser(Auser.LoginName);
  213. if AUser1 <> nil then
  214. Exit;
  215. AUser1 := GetOrCreateUser(Auser.LoginName, Mainform.RealICQClient);
  216. AUser1.DisplayName:= AUser.DisplayName;
  217. AUser1.BranchID := AUser.BranchID;
  218. AUser1.LoginState := AUser.LoginState;
  219. AUser1.Tel:=AUser.Tel;
  220. AUser1.Mobile:=AUser.Mobile;
  221. AUser1.Email:=AUser.Email;
  222. AUser1.LeaveMessage :=AUser.LeaveMessage;
  223. end;
  224. constructor TUsersService.Create;
  225. begin
  226. FUsers := TStringList.Create;
  227. end;
  228. destructor TUsersService.Destroy;
  229. begin
  230. FreeStringList(FUsers);
  231. inherited;
  232. end;
  233. procedure TUsersService.DoGettedCompanyUsers(AUsers: TStringList; ABranch: string);
  234. var
  235. ATreeVeiw: TRealICQContacterTreeView;
  236. iLoop: Integer;
  237. begin
  238. ATreeVeiw := GetTreeView(LVMyContacters);
  239. if ATreeVeiw <> nil then
  240. UpdateOrAddUsersToTreeView(AUsers, ATreeVeiw, ABranch);
  241. end;
  242. procedure TUsersService.DoGettedFriends(AUsers: TStringList);
  243. begin
  244. TFriendsService.GetService.AddFriends(AUsers);
  245. UpdateOrAddFriends(AUsers);
  246. TFriendsService.GetService.RequestUserStatus(AUsers);
  247. end;
  248. procedure TUsersService.DoGettedUsersByBranchID(AServerID, ABranchID: string;
  249. AUsers: TStringList);
  250. var
  251. ATreeView: TRealICQContacterTreeView;
  252. begin
  253. if SameText(AServerID, MainForm.RealICQClient.ServerID) then
  254. begin
  255. ATreeView := GetTreeView(LVMyContacters);
  256. if ATreeView <> nil then
  257. begin
  258. UpdateOrAddUsersToTreeView(AUsers, ATreeView, ABranchID);
  259. end;
  260. end;
  261. if SameText(AServerID, MainForm.CurrentServerID) then
  262. begin
  263. ATreeView := GetTreeView(LVMoreUsers);
  264. if ATreeView <> nil then
  265. begin
  266. UpdateOrAddUsersToTreeView(AUsers, ATreeView, ABranchID);
  267. end;
  268. end;
  269. end;
  270. procedure TUsersService.DoOnReceivedUserStatus(ALoginName: string;
  271. ALoginState: TRealICQLoginState; ALeaveMessage: string);
  272. var
  273. AUser: TRealICQUser;
  274. begin
  275. AUser := GetUser(ALoginName);
  276. if AUser = nil then Exit;
  277. if (ALoginState = stMobileOnline) and (AUser.LoginState <> stOffline) then
  278. Exit
  279. else
  280. AUser.LoginState := ALoginState;
  281. AUser.LeaveMessage := ALeaveMessage;
  282. if (AUser.LoginState <> stOffline) and (AUser.LoginState <> stHidden) then
  283. begin
  284. AUser.GettedOffliceAutoResponseSet := False;
  285. AUser.OfflineAutoResponseEnabled := False;
  286. AUser.OfflineAutoResponseText := '';
  287. end;
  288. MainForm.RealICQClientUserInformationReady(nil, AUser);
  289. end;
  290. procedure TUsersService.DoReceivedUserInformations(AServerID: string;
  291. AUsers: TStringList);
  292. var
  293. ATreeView: TRealICQContacterTreeView;
  294. iLoop: Integer;
  295. AUser: TRealICQUser;
  296. begin
  297. if (AUsers = nil) or (AUsers.Count = 0) then
  298. Exit;
  299. if SameText(AServerID, MainForm.RealICQClient.ServerID) then
  300. begin
  301. ATreeView := GetTreeView(LVMyContacters);
  302. if ATreeView <> nil then
  303. UpdateUsersToTreeView(AUsers, ATreeView);
  304. end;
  305. if SameText(AServerID, MainForm.CurrentServerID) then
  306. begin
  307. ATreeView := GetTreeView(LVMoreUsers);
  308. if ATreeView <> nil then
  309. begin
  310. UpdateUsersToTreeView(AUsers, ATreeView);
  311. end;
  312. end;
  313. for iLoop := 0 to AUsers.Count - 1 do
  314. begin
  315. AUser := AUsers.Objects[iLoop] as TRealICQUser;
  316. // UpdateSeeInformationForm(AUser);
  317. UpdateTalkingForm(AUser);
  318. UpdateSMSForm(AUser);
  319. UpdateMemberInfoOfTeamOptionsForm(AUser);
  320. Mainform.UpdateAddrBookInfo(AUser);
  321. if (Length(AUser.HeadImageFile) > 0) and not FileExists(AUser.HeadImageFile) then
  322. MainForm.RealICQClient.SendDownloadHeadImageRequest(AUser.LoginName);
  323. end;
  324. UpdateTeamsMembers(AUsers);
  325. UpdateFriends(AUsers);
  326. end;
  327. function TUsersService.GetMe: TRealICQUser;
  328. begin
  329. Result := MainForm.RealICQClient.Me;
  330. end;
  331. function TUsersService.GetOrCreateUser(ALoginName: string; ARealICQClient: TRealICQClient): TRealICQUser;
  332. var
  333. iIndex: Integer;
  334. AJson: string;
  335. begin
  336. ALoginName := GetLocalUID(ALoginName);
  337. iIndex := FUsers.IndexOf(ALoginName);
  338. if iIndex < 0 then
  339. begin
  340. Result := TRealICQUser.Create(ALoginName, ARealICQClient);
  341. // AJson := Trim(GetUsersHashProvider.Find(ALoginName));
  342. // if AJson <> '' then
  343. // InitUserObject(Result, AJson);
  344. FUsers.AddObject(ALoginName, Result);
  345. Exit;
  346. end;
  347. Result := FUsers.Objects[iIndex] as TRealICQUser;
  348. end;
  349. function TUsersService.IsCanSee(ALoginName: string): Boolean;
  350. var
  351. isMe, isSeeRight: Boolean;
  352. AUser: TRealICQUser;
  353. begin
  354. if not TConditionConfig.GetConfig.UserInfoController then
  355. begin
  356. Result := True;
  357. Exit;
  358. end;
  359. Result := False;
  360. AUser := GetUser(ALoginName);
  361. if AUser = nil then
  362. Exit;
  363. if AnsiSameText(ALoginName, MainForm.RealICQClient.LoginName) then
  364. begin
  365. Result := True;
  366. Exit;
  367. end;
  368. case AUser.Secret of
  369. slOnlyFriendCanSee:
  370. begin
  371. Result := IsWorkmateOrFriend(ALoginName);
  372. Exit;
  373. end;
  374. slAllCanSee:
  375. begin
  376. Result := True;
  377. Exit;
  378. end;
  379. slAllCannotSee:
  380. begin
  381. Exit;
  382. end;
  383. end;
  384. end;
  385. function TUsersService.IsWorkmateOrFriend(ALoginName: string): Boolean;
  386. begin
  387. Result := TFriendsService.GetService.IsFriend(ALoginName) or
  388. TWorkmatesService.GetService.IsWorkmate(ALoginName);
  389. end;
  390. procedure TUsersService.Init;
  391. var
  392. AUsers: TWideStrings;
  393. i, iIndex: Integer;
  394. JO: ISuperObject;
  395. ALoginName: string;
  396. AUser: TRealICQUser;
  397. begin
  398. MainForm.RealICQClient.OnUsersHandleMessages := HandleMessage;
  399. MainForm.RealICQClient.Me := GetOrCreateUser(Mainform.RealICQClient.LoginName, Mainform.RealICQClient);
  400. MainForm.RealICQClient.Me.LoginState := MainForm.RealICQClient.LoginState;
  401. // if Trim(MainForm.RealICQClient.Me.TrueName) = '' then
  402. // MainForm.RealICQClient.Me.TrueName := MainForm.RealICQClient.Me.DisplayName;
  403. // MainForm.RealICQClient.GetUserLoginState()
  404. LoggerImport.LoginName := Mainform.RealICQClient.LoginName;
  405. LoggerImport.Monitor;
  406. MainForm.ShowMeInformation;
  407. AUsers := GetUsersHashProvider.FindAll;
  408. for i := 0 to AUsers.Count - 1 do
  409. begin
  410. JO := SO(AUsers[I]);
  411. AUser := TRealICQUser.Create(ALoginName, MainForm.RealICQClient);
  412. InitUserObject(AUser, JO);
  413. ALoginName := GetLocalUID(JO.S['l']);
  414. FUsers.AddObject(ALoginName, AUser);
  415. end;
  416. end;
  417. function TUsersService.GetUserRemark(ALoginName: string): ISuperObject;
  418. begin
  419. end;
  420. procedure TUsersService.Uninstall;
  421. begin
  422. MainForm.RealICQClient.Me := nil;
  423. MainForm.RealICQClient.OnUsersHandleMessages := nil;
  424. ClearStringList(FUsers);
  425. end;
  426. {$REGION 'Old InitAndRequestUsers'}
  427. //function TUsersService.InitAndRequestUsers(
  428. // AJo: ISuperObject;
  429. // ARealICQClient: TRealICQClient;
  430. // ARequestRealTime: Boolean = True;
  431. // ANeedRequestUsers: TStringList = nil): TStringList;
  432. //var
  433. // AjaUsers: TSuperArray;
  434. // iLoop, jLoop, ALen: Integer;
  435. // ALoginNames: array of WideString;
  436. // ALoginNames2: TStrings;
  437. // AUsers: TKeyValues;
  438. // IsDownloaded: Boolean;
  439. // AUser: TRealICQUser;
  440. //begin
  441. // Result := TStringList.Create();
  442. // AjaUsers := AJo.AsArray;
  443. // if AjaUsers.Length = 0 then
  444. // Exit;
  445. // SetLength(ALoginNames, AjaUsers.Length);
  446. // for iLoop := 0 to AjaUsers.Length - 1 do
  447. // begin
  448. // AjaUsers[iLoop].S['l'] := GetLocalUID(AjaUsers[iLoop].S['l']);
  449. // ALoginNames[iLoop] := WideString(AjaUsers[iLoop].S['l']);
  450. // Result.AddObject(ALoginNames[iLoop], GetOrCreateUser(ALoginNames[iLoop], ARealICQClient));
  451. // end;
  452. //
  453. // AUsers := GetUsersHashProvider.Find(ALoginNames);
  454. // ALoginNames2 := TStringList.Create;
  455. // ALen := Length(AUsers);
  456. // try
  457. // for jLoop := 0 to ALen - 1 do
  458. // AUsers[jLoop][0] := GetLocalUID(AUsers[jLoop][0]);
  459. // for iLoop := 0 to AjaUsers.Length - 1 do
  460. // begin
  461. // AUser := GetOrCreateUser(AjaUsers[iLoop].S['l'], ARealICQClient);
  462. // IsDownloaded := False;
  463. // for jLoop := 0 to ALen - 1 do
  464. // if SameText(AjaUsers[iLoop].S['l'], AUsers[jLoop][0]) then
  465. // begin
  466. // IsDownloaded := True and ARequestRealTime;
  467. // InitUserObject(AUser, AUsers[jLoop][1]);
  468. // if (AjaUsers[iLoop].I['v'] <> StrToIntDef(AUsers[jLoop][2], -1)) then
  469. // ALoginNames2.Add(AUsers[jLoop][0])
  470. // else
  471. // IsDownloaded := True;
  472. // Break;
  473. // end;
  474. // AUser.IsComparedVer := True and ARequestRealTime;
  475. // if not IsDownloaded then
  476. // ALoginNames2.Add(AjaUsers[iLoop].S['l']);
  477. // end;
  478. // if not ARequestRealTime then
  479. // begin
  480. // if ANeedRequestUsers = nil then
  481. // Exit;
  482. // ANeedRequestUsers.Duplicates := dupIgnore;
  483. // ANeedRequestUsers.AddStrings(ALoginNames2);
  484. // end
  485. // else
  486. // if ALoginNames2.Count > 0 then
  487. // RequestUserInformations(ALoginNames2, ARealICQClient);
  488. // except
  489. // on E: Exception do
  490. // begin
  491. // Error(E.Message, 'TUsersService.InitAndRequestUsers');
  492. // FreeAndNil(ALoginNames2);
  493. // end;
  494. // end;
  495. // FreeAndNil(ALoginNames2);
  496. //end;
  497. {$ENDREGION}
  498. function TUsersService.InitAndRequestUsers(
  499. AJo: ISuperObject;
  500. ARealICQClient: TRealICQClient;
  501. ARequestRealTime: Boolean = True;
  502. ANeedRequestUsers: TStringList = nil): TStringList;
  503. var
  504. AjaUsers: TSuperArray;
  505. iLoop, jLoop, ALen: Integer;
  506. ALoginNames2: TStrings;
  507. AUsers: TStringList;
  508. IsDownloaded: Boolean;
  509. AUser: TRealICQUser;
  510. begin
  511. Result := TStringList.Create();
  512. AjaUsers := AJo.AsArray;
  513. if AjaUsers.Length = 0 then
  514. Exit;
  515. try
  516. ALoginNames2 := TStringList.Create;
  517. for iLoop := 0 to AjaUsers.Length - 1 do
  518. begin
  519. AjaUsers[iLoop].S['l'] := GetLocalUID(AjaUsers[iLoop].S['l']);
  520. AUser := GetOrCreateUser(WideString(AjaUsers[iLoop].S['l']), ARealICQClient);
  521. Result.AddObject(AUser.LoginName, AUser);
  522. if (AUser.CurrentExInfoVersion = -1) or (AjaUsers[iLoop].I['v'] <> AUser.CurrentExInfoVersion) then
  523. ALoginNames2.Add(AUser.LoginName);
  524. AUser.IsComparedVer := True;
  525. end;
  526. if ALoginNames2.Count > 0 then
  527. RequestUserInformations(ALoginNames2, ARealICQClient);
  528. except
  529. on E: Exception do
  530. begin
  531. Error(E.Message, 'TUsersService.InitAndRequestUsers');
  532. FreeAndNil(ALoginNames2);
  533. end;
  534. end;
  535. FreeAndNil(ALoginNames2);
  536. end;
  537. function TUsersService.GetOrCreateUsers(ALoginNames: TStrings;
  538. ARealICQClient: TRealICQClient = nil): TStringList;
  539. var
  540. iLoop, jLoop, ALen: Integer;
  541. AUser: TRealICQUser;
  542. AUsers: TKeyValues;
  543. ALoginNameArray: array of WideString;
  544. IsFound: Boolean;
  545. begin
  546. if ARealICQClient = nil then
  547. ARealICQClient := Mainform.RealICQClient;
  548. Result := TStringList.Create;
  549. iLoop := 0;
  550. while iLoop < ALoginNames.Count do
  551. begin
  552. AUser := GetUser(ALoginNames[iLoop]);
  553. if AUser <> nil then
  554. ALoginNames.Delete(iLoop)
  555. else
  556. begin
  557. AUser := GetOrCreateUser(ALoginNames[iLoop], ARealICQClient);
  558. inc(iLoop)
  559. end;
  560. Result.AddObject(AUser.LoginName, AUser);
  561. end;
  562. // if ALoginNames.Count = 0 then
  563. // Exit;
  564. //
  565. // SetLength(ALoginNameArray, ALoginNames.Count);
  566. // for iLoop := 0 to ALoginNames.Count - 1 do
  567. // ALoginNameArray[iLoop] := ALoginNames[iLoop];
  568. // AUsers := GetUsersHashProvider.Find(ALoginNameArray);
  569. //
  570. // ALen := Length(AUsers);
  571. // for iLoop := 0 to ALen - 1 do
  572. // AUsers[iLoop][0] := FullLoginName(ARealICQClient.CenterServerID, ARealICQClient.ServerID, AUsers[iLoop][0]);
  573. //
  574. // for iLoop := 0 to ALoginNames.Count - 1 do
  575. // begin
  576. // AUser := GetOrCreateUser(ALoginNames[iLoop], ARealICQClient);
  577. // for jLoop := 0 to ALen - 1 do
  578. // if SameText(ALoginNames[iLoop], AUsers[jLoop][0]) then
  579. // begin
  580. // InitUserObject(AUser, AUsers[jLoop][1]);
  581. // Break;
  582. // end;
  583. // end;
  584. end;
  585. function TUsersService.GetOrRequestUser(ALoginName: string;
  586. ARealICQClient: TRealICQClient = nil): TRealICQUser;
  587. begin
  588. if ARealICQClient = nil then
  589. ARealICQClient := MainForm.RealICQClient;
  590. Result := GetOrCreateUser(ALoginName, ARealICQClient);
  591. if Result.IsComparedVer then
  592. Exit;
  593. Result.IsComparedVer := True;
  594. RequestUserInformation(ALoginName, ARealICQClient);
  595. end;
  596. function TUsersService.GetUser(ALoginName: string): TRealICQUser;
  597. var
  598. iIndex: Integer;
  599. begin
  600. Result := nil;
  601. ALoginName := GetLocalUID(ALoginName);
  602. iIndex := FUsers.IndexOf(ALoginName);
  603. if iIndex >= 0 then
  604. Result := FUsers.Objects[iIndex] as TRealICQUser;
  605. end;
  606. class function TUsersService.GetUsersService: TUsersService;
  607. begin
  608. if AUsersService = nil then
  609. AUsersService := TUsersService.Create;
  610. Result := AUsersService;
  611. end;
  612. function TUsersService.GetWorkmatesAndFriends: TStringList;
  613. var
  614. AUsers: TStringList;
  615. begin
  616. Result := TFriendsService.GetService.GetFriends;
  617. AUsers := TWorkmatesService.GetService.GetWorkmates;
  618. try
  619. Result.Duplicates := dupIgnore;
  620. Result.AddStrings(AUsers);
  621. finally
  622. FreeAndNil(AUsers);
  623. end;
  624. end;
  625. function TUsersService.RequestAndGetTeamMembers(AMembers: TStrings;
  626. ARealICQClient: TRealICQClient): TStringList;
  627. var
  628. AUserJos: TInterfaceList;
  629. begin
  630. Result := GetOrCreateUsers(AMembers, ARealICQClient);
  631. AUserJos := GetSimpleUserJsons(Result);
  632. try
  633. RequestUserDetailByUserSimple(TEAM_USER_PROLOCOL, AUserJos, ARealICQClient);
  634. except
  635. on E: Exception do
  636. Error(E.Message, 'TUsersService.RequestAndGetTeamMembers');
  637. end;
  638. end;
  639. procedure TUsersService.RequestCompany(ARealICQClient: TRealICQClient);
  640. begin
  641. PacketAndSend(COMPANY_USERS_PROLOCOL, nil, ARealICQClient);
  642. end;
  643. procedure TUsersService.RequestFriends(ARealICQClient: TRealICQClient);
  644. begin
  645. PacketAndSend(FRIENDS_PROLOCOL, nil, ARealICQClient);
  646. end;
  647. //$D4 + len + $00 + jsonLen + ["user1", "user2", ... , "usern"]
  648. procedure TUsersService.RequestUserInformations(ALoginNames: TStrings;
  649. ARealICQClient: TRealICQClient);
  650. var
  651. AJos: TInterfaceList;
  652. begin
  653. try
  654. AJos := GetLoginNamesJsons(ALoginNames);
  655. RequestUserDetailByLoginName(USERINFO_PROLOCOL, AJos, ARealICQClient);
  656. except
  657. on E: Exception do
  658. begin
  659. Error(E.Message, 'TUsersService.RequestUserInformations');
  660. FreeAndNil(AJos);
  661. end;
  662. end;
  663. end;
  664. procedure TUsersService.RequestWorkmatesInfos(ALoginNames: TStrings);
  665. var
  666. AJos: TInterfaceList;
  667. begin
  668. try
  669. AJos := GetLoginNamesJsons(ALoginNames);
  670. RequestUserDetailByLoginName(WORKMATEINFO_PROLOCOL, AJos, MainForm.RealICQClient);
  671. except
  672. on E: Exception do
  673. begin
  674. Error(E.Message, 'TUsersService.RequestWorkmatesInfos');
  675. end;
  676. end;
  677. end;
  678. procedure TUsersService.RequestUserInformation(ALoginName: string;
  679. ARealICQClient: TRealICQClient);
  680. var
  681. ArrTmp: array[0..0] of string;
  682. begin
  683. if ALoginName = '' then
  684. Exit;
  685. ArrTmp[0] := ALoginName;
  686. RequestUserInformations(ArrTmp, ARealICQClient);
  687. end;
  688. procedure TUsersService.RequestUsersByBranchID(AServerID: string; ABranchIDs: TStrings;
  689. ARealICQClient: TRealICQClient);
  690. var
  691. iLoop, Alen: Integer;
  692. SendBuffer: TBytes;
  693. AJo: ISuperObject;
  694. begin
  695. try
  696. if (ABranchIDs = nil) or (ABranchIDs.Count = 0) then
  697. Exit;
  698. AJo := SO();
  699. AJo.S['s'] := AServerID;
  700. for iLoop := 0 to ABranchIDs.Count - 1 do
  701. AJo.A['bs'].S[iLoop] := ABranchIDs[iLoop];
  702. PacketAndSend(BRANCH_USERS_PROLOCOL, AJo, ARealICQClient);
  703. except
  704. on E: Exception do
  705. Error(E.Message, 'TUsersService.RequestUsersByBranchID');
  706. end;
  707. end;
  708. procedure TUsersService.RequestUserStatus(AProtocol: Byte; AUsers: TStringList);
  709. var
  710. AUserJos: TInterfaceList;
  711. ALen: Integer;
  712. AJoData, AJoData2: ISuperObject;
  713. AUserArray, AUserArray2: TSuperArray;
  714. begin
  715. AUserJos := GetUserStatusJsons(AUsers);
  716. try
  717. while AUserJos.Count > 0 do
  718. begin
  719. AJoData := AUserJos[0] as ISuperObject;
  720. AUserJos.Delete(0);
  721. if not PacketAndSend(AProtocol, AJoData, Mainform.RealICQClient) then
  722. begin
  723. AJoData2 := SO();
  724. AJoData2.S['s'] := AJoData.S['s'];
  725. AJoData2.N['us'] := SO('[]');
  726. AUserArray := AJoData.A['us'];
  727. AUserArray2 := AJoData2.A['us'];
  728. ALen := AUserArray.Length div 2;
  729. while AUserArray.Length > ALen do
  730. begin
  731. AUserArray2.Add(AUserArray.O[0]);
  732. AUserArray.Delete(0);
  733. end;
  734. AUserJos.Add(AJoData2);
  735. AUserJos.Add(AJoData);
  736. end;
  737. end;
  738. except
  739. on E: Exception do
  740. Error(E.Message, 'TUsersService.RequestUserStatus');
  741. end;
  742. end;
  743. procedure TUsersService.UpdateListItem(AListItem: TRealICQContacterListItem; AUser: TRealICQUser; AShowNavBarNumeric: Boolean = True);
  744. var
  745. GIFImage: TGIFImage;
  746. jo: IsuperObject;
  747. ARemarkTel,
  748. ARemarkMobile,
  749. ARemark: string;
  750. iIndex: Integer;
  751. begin
  752. jo := TUserRemarkService.GetService.GetUserRemark(AUser.LoginName);
  753. if jo <> nil then
  754. begin
  755. ARemark := jo.S['Remark'];
  756. ARemarkTel := jo.S['Phone'];
  757. ARemarkMobile := jo.S['Mobile'];
  758. end;
  759. AListItem.HasCamera := AUser.InstalledCamera;
  760. AListItem.Watchword := AUser.Watchword;
  761. AListItem.LeaveMessage := AUser.LeaveMessage;
  762. AListItem.Branch:=AUser.Branch;
  763. iIndex := MainForm.ServerInfoList.IndexOf(GetServerID(AListItem.LoginName));
  764. if iIndex >= 0 then
  765. with MainForm.ServerInfoList.Objects[iIndex] as TServerInfo do
  766. begin
  767. AListItem.ServerName := ServerName;
  768. end;
  769. AListItem.HasTelephone := (Length(Trim(ARemarkTel)) > 0)
  770. or (Length(Trim(AUser.Tel)) > 0)
  771. or (Length(Trim(AUser.Mobile)) > 0);
  772. AListItem.TelephoneHint := '';
  773. if Length(Trim(ARemarkTel)) > 0 then
  774. begin
  775. AListItem.TelephoneHint := AListItem.TelephoneHint + '备注:' + Trim(ARemarkTel);
  776. end;
  777. if Length(Trim(AUser.Tel)) > 0 then
  778. begin
  779. if Length(Trim(AListItem.TelephoneHint)) > 0 then
  780. AListItem.TelephoneHint := AListItem.TelephoneHint + ' ';
  781. AListItem.TelephoneHint := AListItem.TelephoneHint + '电话:' + Trim(AUser.Tel);
  782. end;
  783. if Length(Trim(AUser.Mobile)) > 0 then
  784. begin
  785. if Length(Trim(AListItem.TelephoneHint)) > 0 then
  786. AListItem.TelephoneHint := AListItem.TelephoneHint + ' ';
  787. AListItem.TelephoneHint := AListItem.TelephoneHint + '手机:' + Trim(AUser.Mobile);
  788. end;
  789. AListItem.HasMobilePhone := (Length(Trim(AUser.Mobile)) > 0) or (Length(Trim(ARemarkMobile)) > 0);
  790. AListItem.HasEmail := (Length(Trim(AUser.Email)) > 0);
  791. AListItem.HasSMS := AListItem.HasMobilePhone;
  792. AListItem.HeadImageHint := '单击显示联系人卡片';
  793. if Length(Trim(ARemarkMobile)) > 0 then
  794. AListItem.MobilePhoneHint := Trim(ARemarkMobile)
  795. else
  796. AListItem.MobilePhoneHint := Trim(AUser.Mobile);
  797. AListItem.Mobile:=Trim(AUser.Mobile);
  798. AListItem.Tel := Trim(AUser.Tel);
  799. AListItem.HasMobilePhone := False;
  800. AListItem.MobilePhoneHint :=AListItem.MobilePhoneHint+ '(双击发送手机短信息)';
  801. AListItem.TelephoneHint :=AListItem.TelephoneHint;
  802. AListItem.EmailHint := Trim(AUser.Email) + '(双击发送邮件)';
  803. AListItem.SMSHint := AListItem.MobilePhoneHint;
  804. AListItem.CameraHint := '双击发送视频对话邀请';
  805. AListItem.Company := AUser.Company;
  806. AListItem.HasTelephone := AListItem.HasTelephone and AListItem.ListView.ShowTelButton;
  807. AListItem.HasMobilePhone := AListItem.HasMobilePhone and AListItem.ListView.ShowMobileButton;
  808. AListItem.HasEmail := AListItem.HasEmail and AListItem.ListView.ShowEmailButton;
  809. AListItem.HasSMS := AListItem.HasSMS and AListItem.ListView.ShowSMSButton;
  810. if FileExists(AUser.HeadImageFile) then
  811. begin
  812. try
  813. if (AUser.HeadImageFileType = htGIF) then
  814. begin
  815. GIFImage := TGIFImage.Create;
  816. GIFImage.Animate := False;
  817. try
  818. GIFImage.LoadFromFile(AUser.HeadImageFile);
  819. AListItem.HeadImagePicture.Bitmap.Assign(GIFImage);
  820. finally
  821. GIFImage.Free;
  822. end;
  823. end
  824. else
  825. AListItem.HeadImagePicture.LoadFromFile(AUser.HeadImageFile);
  826. except
  827. AListItem.HeadImagePicture.Graphic := nil;
  828. end;
  829. end
  830. else
  831. AListItem.HeadImagePicture.Graphic := nil;
  832. AListItem.DisplayName := AUser.DisplayName;
  833. AListItem.LoginState := AUser.LoginState;
  834. AListItem.Data := AUser;
  835. end;
  836. procedure TUsersService.UpdateTreeNode(Employee: TRealICQEmployee; RealICQUser: TRealICQUser; AShowNavBarNumeric: Boolean);
  837. var
  838. GIFImage: TGIFImage;
  839. jo: IsuperObject;
  840. ARemarkTel,
  841. ARemarkMobile,
  842. ARemark: string;
  843. begin
  844. jo := TUserRemarkService.GetService.GetUserRemark(RealICQUser.LoginName);
  845. if jo <> nil then
  846. begin
  847. ARemark := jo.S['Remark'];
  848. ARemarkTel := jo.S['Phone'];
  849. ARemarkMobile := jo.S['Mobile'];
  850. end;
  851. Employee.HasCamera := RealICQUser.InstalledCamera;
  852. Employee.Watchword := RealICQUser.Watchword;
  853. Employee.LeaveMessage := RealICQUser.LeaveMessage;
  854. Employee.HasNewSNS := ShowSNS and RealICQUser.HasNewSNSUpdate;
  855. Employee.NewSNSHint := '个人空间最近有更新,点击查看';
  856. Employee.HasTelephone := (Length(Trim(ARemarkTel)) > 0) or (Length(Trim(RealICQUser.Tel)) > 0) or (Length(Trim(RealICQUser.Mobile)) > 0);
  857. Employee.TelephoneHint := '';
  858. if Length(Trim(ARemarkTel)) > 0 then
  859. begin
  860. Employee.TelephoneHint := Employee.TelephoneHint + '备注:' + Trim(ARemarkTel);
  861. end;
  862. if Length(Trim(RealICQUser.Tel)) > 0 then
  863. begin
  864. if Length(Trim(Employee.TelephoneHint)) > 0 then
  865. Employee.TelephoneHint := Employee.TelephoneHint + ' ';
  866. Employee.TelephoneHint := Employee.TelephoneHint + '电话:' + Trim(RealICQUser.Tel);
  867. end;
  868. if Length(Trim(RealICQUser.Mobile)) > 0 then
  869. begin
  870. if Length(Trim( Employee.TelephoneHint)) > 0 then
  871. Employee.TelephoneHint := Employee.TelephoneHint + ' ';
  872. Employee.TelephoneHint := Employee.TelephoneHint + '手机:' + Trim(RealICQUser.Mobile);
  873. end;
  874. Employee.HasMobilePhone := False;
  875. Employee.HasSMS :=(Length(Trim(RealICQUser.Mobile)) > 0);
  876. Employee.Tel := Trim(RealICQUser.Tel);
  877. Employee.Mobile := Trim(RealICQUser.Mobile);
  878. if Length(Trim(ARemarkMobile)) > 0 then
  879. Employee.MobilePhoneHint := Trim(ARemarkMobile)
  880. else
  881. Employee.MobilePhoneHint :=Trim(RealICQUser.Mobile);
  882. Employee.HeadImageHint := '单击显示联系人卡片';
  883. Employee.TelephoneHint := Trim(Employee.TelephoneHint);
  884. Employee.AddFriendHint:='双击添加好友';
  885. Employee.EmailHint := Trim(RealICQUser.Email) + '(双击发送邮件)';
  886. Employee.SMSHint := Employee.MobilePhoneHint + '(双击发送手机短信息)';
  887. Employee.CameraHint := '双击发送视频对话邀请';
  888. if FileExists(RealICQUser.HeadImageFile) then
  889. begin
  890. try
  891. if (RealICQUser.HeadImageFileType = htGIF) then
  892. begin
  893. GIFImage := TGIFImage.Create;
  894. GIFImage.Animate := False;
  895. try
  896. GIFImage.LoadFromFile(RealICQUser.HeadImageFile);
  897. Employee.HeadImagePicture.Bitmap.Assign(GIFImage);
  898. finally
  899. GIFImage.Free;
  900. end;
  901. end
  902. else
  903. Employee.HeadImagePicture.LoadFromFile(RealICQUser.HeadImageFile);
  904. except
  905. Employee.HeadImagePicture.Graphic := nil;
  906. end;
  907. end
  908. else
  909. Employee.HeadImagePicture.Graphic := nil;
  910. Employee.DisplayName := RealICQUser.DisplayName;
  911. Employee.LoginState := RealICQUser.LoginState;
  912. Employee.Data := RealICQUser;
  913. // if AShowNavBarNumeric then Employee.Update;
  914. // if AShowNavBarNumeric then ShowNavBarNumeric;
  915. end;
  916. procedure TUsersService.UpdateUsersToTreeView(AUsers: TStringList;
  917. ATreeView: TRealICQContacterTreeView);
  918. var
  919. iLoop,
  920. ItemIndex: Integer;
  921. RealICQUser: TRealICQUser;
  922. Employee: TRealICQEmployee;
  923. begin
  924. if ATreeView = nil then
  925. Exit;
  926. ATreeView.AdjustPosition :=False;
  927. ATreeView.HideSystemScrollBar;
  928. ATreeView.AutoChangeOnlineNumeric := True;
  929. ATreeView.OnItemOnline := nil;
  930. ATreeView.OnItemOffline := nil;
  931. ATreeView.BeginUpdate;
  932. try
  933. {$region '添加联系人'}
  934. for iLoop := AUsers.Count - 1 downto 0 do
  935. begin
  936. RealICQUser := AUsers.Objects[iLoop] as TRealICQUser;
  937. ItemIndex := ATreeView.EmployeeItems.IndexOf(RealICQUser.LoginName);
  938. if ItemIndex >= 0 then
  939. begin
  940. Employee := ATreeView.EmployeeItems.Objects[ItemIndex] as TRealICQEmployee;
  941. UpdateTreeNode(Employee, RealICQUser, False);
  942. end;
  943. end;
  944. {$endregion}
  945. PostMessage(ATreeView.Handle, WM_SIZE, 0, 0);
  946. finally
  947. ATreeView.EndUpdate;
  948. end;
  949. end;
  950. procedure TUsersService.UpdateTeamsMembers(AUsers: TStringList);
  951. var
  952. iLoop: Integer;
  953. begin
  954. for iLoop := 0 to AUsers.Count - 1 do
  955. TalkingFrm.UpdateTalkingForm(AUsers.Objects[iLoop] as TRealICQUser);
  956. end;
  957. procedure TUsersService.UpdateFriends(AUsers: TStringList);
  958. var
  959. iLoop,iIndex: Integer;
  960. AUser: TRealICQUser;
  961. ATreeView: TRealICQContacterTreeView;
  962. AFriend: TRealICQEmployee;
  963. begin
  964. iIndex:= MainForm.ContacterTreeViews.IndexOf(LvFriends);
  965. ATreeView := MainForm.ContacterTreeViews.Objects[iIndex] as TRealICQContacterTreeView;
  966. ATreeView.BeginUpdate;
  967. try
  968. for iLoop :=AUsers.Count - 1 downto 0 do
  969. begin
  970. AUser := AUsers.Objects[iLoop] as TRealICQUser;
  971. if AnsiSameText(AUser.LoginName, MainForm.RealICQClient.LoginName) then
  972. Continue;
  973. iIndex := ATreeView.EmployeeItems.IndexOf(AUser.LoginName);
  974. if (iIndex) < 0 then
  975. Continue;
  976. AFriend := ATreeView.EmployeeItems.Objects[iIndex] as TRealICQEmployee;
  977. UpdateTreeNode(AFriend, AUser, False);
  978. end;
  979. finally
  980. ATreeView.EndUpdate;
  981. end;
  982. end;
  983. procedure TUsersService.UpdateOrAddFriend(AUser: TRealICQUser);
  984. var
  985. iIndex: Integer;
  986. ATreeView: TRealICQContacterTreeView;
  987. AFriend: TRealICQEmployee;
  988. begin
  989. iIndex:= MainForm.ContacterTreeViews.IndexOf(LvFriends);
  990. ATreeView := MainForm.ContacterTreeViews.Objects[iIndex] as TRealICQContacterTreeView;
  991. ATreeView.BeginUpdate;
  992. try
  993. if AnsiSameText(AUser.LoginName, MainForm.RealICQClient.LoginName) then
  994. Exit;
  995. iIndex := ATreeView.EmployeeItems.IndexOf(AUser.LoginName);
  996. if (iIndex) >= 0 then
  997. AFriend := ATreeView.EmployeeItems.Objects[iIndex] as TRealICQEmployee
  998. else
  999. begin
  1000. AFriend := TRealICQEmployee.Create(AUser.LoginName);
  1001. AFriend.BranchID :=LVFriends;
  1002. ATreeView.AddEmployee(AFriend);
  1003. end;
  1004. UpdateTreeNode(AFriend, AUser, False);
  1005. finally
  1006. ATreeView.EndUpdate;
  1007. end;
  1008. end;
  1009. procedure TUsersService.UpdateOrAddFriends(AUsers: TStringList);
  1010. var
  1011. iLoop,iIndex: Integer;
  1012. AUser: TRealICQUser;
  1013. ATreeView: TRealICQContacterTreeView;
  1014. AFriend: TRealICQEmployee;
  1015. begin
  1016. iIndex:= MainForm.ContacterTreeViews.IndexOf(LvFriends);
  1017. ATreeView := MainForm.ContacterTreeViews.Objects[iIndex] as TRealICQContacterTreeView;
  1018. ATreeView.BeginUpdate;
  1019. try
  1020. for iLoop :=AUsers.Count - 1 downto 0 do
  1021. begin
  1022. AUser := AUsers.Objects[iLoop] as TRealICQUser;
  1023. if AnsiSameText(AUser.LoginName, MainForm.RealICQClient.LoginName) then
  1024. Continue;
  1025. iIndex := ATreeView.EmployeeItems.IndexOf(AUser.LoginName);
  1026. if (iIndex) >= 0 then
  1027. AFriend := ATreeView.EmployeeItems.Objects[iIndex] as TRealICQEmployee
  1028. else
  1029. begin
  1030. AFriend := TRealICQEmployee.Create(AUser.LoginName);
  1031. AFriend.BranchID :=LVFriends;
  1032. ATreeView.AddEmployee(AFriend);
  1033. end;
  1034. UpdateTreeNode(AFriend, AUser, False);
  1035. end;
  1036. finally
  1037. ATreeView.EndUpdate;
  1038. end;
  1039. end;
  1040. procedure TUsersService.UpdateOrAddUsersToListView(AListView: TRealICQContacterListView;
  1041. AUsers: TStringList);
  1042. var
  1043. iLoop,
  1044. ItemIndex: Integer;
  1045. RealICQUser: TRealICQUser;
  1046. Employee: TRealICQContacterListItem;
  1047. begin
  1048. if AListView = nil then
  1049. Exit;
  1050. {$region '添加联系人'}
  1051. for iLoop := AUsers.Count - 1 downto 0 do
  1052. begin
  1053. RealICQUser := AUsers.Objects[iLoop] as TRealICQUser;
  1054. ItemIndex := AListView.Items.IndexOf(RealICQUser.LoginName);
  1055. if ItemIndex >= 0 then
  1056. begin
  1057. Employee := AListView.Items.Objects[ItemIndex] as TRealICQContacterListItem;
  1058. end
  1059. else
  1060. begin
  1061. ItemIndex := AListView.Items.Add(RealICQUser.LoginName);
  1062. Employee := AListView.Items.Objects[ItemIndex] as TRealICQContacterListItem;
  1063. end;
  1064. UpdateListItem(Employee, RealICQUser, False);
  1065. end;
  1066. {$endregion}
  1067. PostMessage(AListView.Handle, WM_SIZE, 0, 0);
  1068. AListView.ReDrawAll;
  1069. end;
  1070. procedure TUsersService.UpdateUserStateListView(
  1071. AListView: TRealICQContacterListView; AUsers: TStringList);
  1072. var
  1073. iLoop,
  1074. ItemIndex: Integer;
  1075. RealICQUser: TRealICQUser;
  1076. Employee: TRealICQContacterListItem;
  1077. begin
  1078. if AListView = nil then
  1079. Exit;
  1080. for iLoop := AUsers.Count - 1 downto 0 do
  1081. begin
  1082. RealICQUser := AUsers.Objects[iLoop] as TRealICQUser;
  1083. ItemIndex := AListView.Items.IndexOf(RealICQUser.LoginName);
  1084. if ItemIndex >= 0 then
  1085. begin
  1086. Employee := AListView.Items.Objects[ItemIndex] as TRealICQContacterListItem;
  1087. Employee.LoginState := RealICQUser.LoginState;
  1088. end;
  1089. end;
  1090. PostMessage(AListView.Handle, WM_SIZE, 0, 0);
  1091. AListView.ReDrawAll;
  1092. end;
  1093. procedure TUsersService.UpdateUserStateToTreeView(AUsers: TStringList;
  1094. ATreeView: TRealICQContacterTreeView);
  1095. var
  1096. iLoop,
  1097. ItemIndex: Integer;
  1098. RealICQUser: TRealICQUser;
  1099. Employee: TRealICQEmployee;
  1100. begin
  1101. if ATreeView = nil then
  1102. Exit;
  1103. ATreeView.AdjustPosition :=False;
  1104. ATreeView.HideSystemScrollBar;
  1105. ATreeView.AutoChangeOnlineNumeric := True;
  1106. ATreeView.OnItemOnline := nil;
  1107. ATreeView.OnItemOffline := nil;
  1108. ATreeView.BeginUpdate;
  1109. try
  1110. {$region '添加联系人'}
  1111. for iLoop := AUsers.Count - 1 downto 0 do
  1112. begin
  1113. RealICQUser := AUsers.Objects[iLoop] as TRealICQUser;
  1114. ItemIndex := ATreeView.EmployeeItems.IndexOf(RealICQUser.LoginName);
  1115. if ItemIndex >= 0 then
  1116. begin
  1117. Employee := ATreeView.EmployeeItems.Objects[ItemIndex] as TRealICQEmployee;
  1118. Employee.LoginState := RealICQUser.LoginState;
  1119. end;
  1120. end;
  1121. {$endregion}
  1122. PostMessage(ATreeView.Handle, WM_SIZE, 0, 0);
  1123. finally
  1124. ATreeView.EndUpdate;
  1125. end;
  1126. end;
  1127. procedure TUsersService.UpdateUsersToListView(AListView: TRealICQContacterListView;
  1128. AUsers: TStringList);
  1129. var
  1130. iLoop,
  1131. ItemIndex: Integer;
  1132. RealICQUser: TRealICQUser;
  1133. Employee: TRealICQContacterListItem;
  1134. begin
  1135. if AListView = nil then
  1136. Exit;
  1137. {$region '添加联系人'}
  1138. for iLoop := AUsers.Count - 1 downto 0 do
  1139. begin
  1140. RealICQUser := AUsers.Objects[iLoop] as TRealICQUser;
  1141. ItemIndex := AListView.Items.IndexOf(RealICQUser.LoginName);
  1142. if ItemIndex >= 0 then
  1143. begin
  1144. Employee := AListView.Items.Objects[ItemIndex] as TRealICQContacterListItem;
  1145. UpdateListItem(Employee, RealICQUser, False);
  1146. end;
  1147. end;
  1148. {$endregion}
  1149. PostMessage(AListView.Handle, WM_SIZE, 0, 0);
  1150. AListView.ReDrawAll;
  1151. end;
  1152. procedure TUsersService.UpdateOrAddUsersToTreeView(AUsers: TStringList;
  1153. ATreeView: TRealICQContacterTreeView;
  1154. ABranchID: string = '');
  1155. var
  1156. iLoop,
  1157. ItemIndex: Integer;
  1158. RealICQUser: TRealICQUser;
  1159. Employee: TRealICQEmployee;
  1160. TmpBranch : TRealICQBranch;
  1161. ParentNode: TTreeNode;
  1162. BranchInfo: TRealICQBranchInfo;
  1163. procedure CalculateEmployeeCount(AParentNode: TTreeNode; IsAddOnline: Boolean);
  1164. begin
  1165. while AParentNode <> nil do
  1166. begin
  1167. TmpBranch := AParentNode.Data;
  1168. if IsAddOnline then
  1169. TmpBranch.OnlineEmployee:=TmpBranch.OnlineEmployee + 1
  1170. else
  1171. TmpBranch.OnlineEmployee:=TmpBranch.OnlineEmployee - 1;
  1172. AParentNode := AParentNode.Parent;
  1173. end
  1174. end;
  1175. begin
  1176. if ATreeView = nil then
  1177. Exit;
  1178. if (ABranchID <> '') and (ATreeView.BranchItems.IndexOf(ABranchID) < 0) then
  1179. Exit;
  1180. ATreeView.AdjustPosition :=False;
  1181. ATreeView.HideSystemScrollBar;
  1182. ATreeView.AutoChangeOnlineNumeric := True;
  1183. ATreeView.OnItemOnline := nil;
  1184. ATreeView.OnItemOffline := nil;
  1185. ATreeView.BeginUpdate;
  1186. try
  1187. {$region '添加联系人'}
  1188. for iLoop := AUsers.Count - 1 downto 0 do
  1189. begin
  1190. RealICQUser := AUsers.Objects[iLoop] as TRealICQUser;
  1191. ItemIndex := ATreeView.EmployeeItems.IndexOf(RealICQUser.LoginName);
  1192. if ItemIndex >= 0 then
  1193. begin
  1194. Employee := ATreeView.EmployeeItems.Objects[ItemIndex] as TRealICQEmployee;
  1195. CalculateEmployeeCount(Employee.Node.Parent,
  1196. ((Employee.LoginState = stOffline) or (Employee.LoginState = stHidden)) and
  1197. ((RealICQUser.LoginState <> stOffline) and (RealICQUser.LoginState <> stHidden)));
  1198. UpdateTreeNode(Employee, RealICQUser, False);
  1199. Continue;
  1200. end;
  1201. Employee := TRealICQEmployee.Create(RealICQUser.LoginName);
  1202. if True then
  1203. if ABranchID <> '' then
  1204. Employee.BranchID := ABranchID
  1205. else
  1206. Employee.BranchID := RealICQUser.BranchID;
  1207. Employee.HasAddFreindButton:=True;
  1208. Employee.HasEmail := False;
  1209. Employee.SeeInfoPermissions:=RealICQUser.SeeInfoPermissions;
  1210. ATreeView.AddEmployee(Employee);
  1211. ParentNode := Employee.Node.Parent;
  1212. // if (RealICQUser.LoginState <> stOffline) and (RealICQUser.LoginState <> stHidden) then
  1213. // CalculateEmployeeCount(Employee.Node.Parent, true);
  1214. UpdateTreeNode(Employee, RealICQUser, False);
  1215. // while ParentNode <> nil do
  1216. // begin
  1217. // TmpBranch :=ParentNode.Data;
  1218. // TmpBranch.EmployeeCount:=TmpBranch.EmployeeCount-1;
  1219. // if (Employee.LoginState <> stOffline) and (Employee.LoginState <> stHidden ) then
  1220. // TmpBranch.OnlineEmployee:=TmpBranch.OnlineEmployee-1;
  1221. // ParentNode := ParentNode.Parent;
  1222. // end;
  1223. // if Assigned(Employee.Node.Parent) then
  1224. // begin
  1225. // UpdateTreeNode(Employee, RealICQUser, False);
  1226. // if (not Assigned(Employee.Node.Parent.Parent))
  1227. // and (Employee.LoginState<>stOffline)
  1228. // and (Employee.LoginState<>stHidden ) then
  1229. // begin
  1230. // TmpBranch:=Employee.Node.Parent.data;
  1231. // TmpBranch.OnlineEmployee:=TmpBranch.OnlineEmployee - 1;
  1232. // TmpBranch.EmployeeCount:=TmpBranch.EmployeeCount - 1;
  1233. // TmpBranch.Update;
  1234. // end;
  1235. // end
  1236. // else
  1237. // begin
  1238. // ATreeView.EmployeeItems.Delete(ATreeView.EmployeeItems.IndexOf(RealICQUser.LoginName));
  1239. // FreeAndNil(Employee);
  1240. // end;
  1241. end;
  1242. {$endregion}
  1243. PostMessage(ATreeView.Handle, WM_SIZE, 0, 0);
  1244. finally
  1245. ATreeView.EndUpdate;
  1246. end;
  1247. end;
  1248. procedure TUsersService.HandleBranchUsers(AJo: ISuperObject;
  1249. ARealICQClient: TRealICQClient);
  1250. var
  1251. joBranchs: ISuperObject;
  1252. item: TSuperAvlEntry;
  1253. AServerID: string;
  1254. AUsers: TStringList;
  1255. begin
  1256. joBranchs := AJo.O['bs'];
  1257. AServerID := AJo.S['s'];
  1258. for item in joBranchs.AsObject do
  1259. begin
  1260. try
  1261. AUsers := InitAndRequestUsers(item.Value, ARealICQClient);
  1262. DoGettedUsersByBranchID(AServerID, item.Name, AUsers);
  1263. finally
  1264. if AUsers <> nil then
  1265. FreeAndNil(AUsers);
  1266. end;
  1267. end;
  1268. end;
  1269. procedure TUsersService.HandleCompanyUsers(AJo: ISuperObject;
  1270. ARealICQClient: TRealICQClient);
  1271. var
  1272. AUsers: TStringList;
  1273. IsCompleted: Boolean;
  1274. AItem: TSuperAvlEntry;
  1275. ABranchs: TSuperTableString;
  1276. AEmployee: TRealICQEmployee;
  1277. ATreeVeiw: TRealICQContacterTreeView;
  1278. Branch: TRealICQBranch;
  1279. ParentNode: TTreeNode;
  1280. // AsynAction: TAsynRequestUserInfo;
  1281. begin
  1282. IsCompleted := AJo.B['completed'];
  1283. ABranchs := AJo.O['bs'].AsObject;
  1284. // AsynAction := TAsynRequestUserInfo.Create;
  1285. for AItem in ABranchs do
  1286. begin
  1287. try
  1288. AUsers := InitAndRequestUsers(AItem.Value, ARealICQClient, False, TWorkmatesService.GetService.WorkmatesNeedUpdate);
  1289. TWorkmatesService.GetService.AddWorkmates(AUsers);
  1290. DoGettedCompanyUsers(AUsers, AItem.Name);
  1291. except
  1292. on E: Exception do
  1293. begin
  1294. Error(E.Message, 'TUsersService.HandleCompanyUsers');
  1295. FreeAndNil(AUsers);
  1296. end;
  1297. end;
  1298. FreeAndNil(AUsers);
  1299. end;
  1300. if IsCompleted then
  1301. begin
  1302. TWorkmatesService.GetService.RequstUserInfos;
  1303. Sleep(100);
  1304. ARealICQClient.SendDeviceChanged;
  1305. Sleep(100);
  1306. ARealICQClient.SendGetBlacklists;
  1307. Sleep(100);
  1308. ARealICQClient.SendGetWebTabs;
  1309. Sleep(100);
  1310. TWorkmatesService.GetService.RequestUserStatus;
  1311. ARealICQClient.LoadPersonalConfigs;
  1312. MainForm.RealICQClientGettedFriendList(nil);
  1313. ATreeVeiw := GetTreeView(LVMyContacters);
  1314. ATreeVeiw.OnHeadImageMouseEnter := Mainform.NodeOnHeadImageMouseEnter;
  1315. ATreeVeiw.OnHeadImageMouseLeave := Mainform.NodeOnHeadImageMouseLeave;
  1316. AEmployee := ATreeVeiw.GetEmployee(ARealICQClient.Me.LoginName);
  1317. ParentNode := AEmployee.Node.Parent;
  1318. while ParentNode <> nil do
  1319. begin
  1320. ParentNode.Expanded := True;
  1321. Branch:=ParentNode.Data;
  1322. Branch.IsGetUserList:=True;
  1323. ParentNode := ParentNode.Parent;
  1324. end;
  1325. ATreeVeiw.MoveScrollBarToTop;
  1326. end;
  1327. // if AsynAction.Users.Count > 0 then
  1328. // AsynAction.Resume
  1329. // else
  1330. // FreeAndNil(AsynAction);
  1331. end;
  1332. procedure TUsersService.HandleDetailWorkmates(AJo: ISuperObject;
  1333. ARealICQClient: TRealICQClient);
  1334. var
  1335. AUsers: TStringList;
  1336. begin
  1337. InitAndSaveUsers(AJo, ARealICQClient, uutCompany);
  1338. end;
  1339. procedure TUsersService.HandleDetailFriends(AJo: ISuperObject;
  1340. ARealICQClient: TRealICQClient);
  1341. var
  1342. AUsers: TStringList;
  1343. begin
  1344. InitAndSaveUsers(AJo, ARealICQClient, uutFriend);
  1345. // AUsers := InitAndSaveUsers(AJo, ARealICQClient);
  1346. // try
  1347. // UpdateFriends(AUsers);
  1348. // finally
  1349. // FreeAndNil(AUsers);
  1350. // end;
  1351. end;
  1352. procedure TUsersService.HandleFriends(AJo: ISuperObject;
  1353. ARealICQClient: TRealICQClient);
  1354. var
  1355. AUserJos: TInterfaceList;
  1356. AUsers: TStringList;
  1357. AFriendsNeedRequest: TStrings;
  1358. begin
  1359. AUsers := InitAndRequestUsers(AJo, ARealICQClient, False);
  1360. try
  1361. AUserJos := GetSimpleUserJsons(Ausers);
  1362. RequestUserDetailByUserSimple(FRIENDS_DETAIL_PROLOCOL, AUserJos, ARealICQClient);
  1363. DoGettedFriends(AUsers);
  1364. finally
  1365. FreeAndNil(AUsers);
  1366. end;
  1367. end;
  1368. procedure TUsersService.HandleMessage(ASender: TObject; const AData: TBytes);
  1369. var
  1370. AProtocol: Byte;
  1371. ALen: SmallInt;
  1372. AJson: string;
  1373. AJo: ISuperObject;
  1374. begin
  1375. AProtocol := AData[0];
  1376. CopyMemory(@ALen, @AData[1], 2);
  1377. SetLength(AJson, ALen);
  1378. CopyMemory(PChar(AJson), @AData[3], ALen);
  1379. if AJson = '' then
  1380. Exit;
  1381. try
  1382. AJo := SO(AJson);
  1383. except
  1384. on E: Exception do
  1385. Error('转化不了:'+AJson, 'TUsersService.HandleMessage');
  1386. end;
  1387. try
  1388. // SUCCESS('协议:'+ IntToHex(AProtocol, 2), 'TUsersService.HandleMessage');
  1389. case AProtocol of
  1390. $00: HandleUserInformations(AJo, ASender as TRealICQClient);
  1391. $01: HandleBranchUsers(AJo, ASender as TRealICQClient);
  1392. $02: HandleCompanyUsers(AJo, ASender as TRealICQClient);
  1393. $03: HandleFriends(AJo, ASender as TRealICQClient);
  1394. $04: HandleTeamUsers(AJo, ASender as TRealICQClient);
  1395. $05: HandleDetailFriends(AJo, ASender as TRealICQClient);
  1396. $06: TWorkmatesService.GetService.HandleUsersStatus(AJo);
  1397. $07: HandleDetailWorkmates(AJo, ASender as TRealICQClient);
  1398. $08: TTeamsService.GetService.HandleTeamMemberssStatus(AJo);
  1399. $09: TFriendsService.GetService.HandeFriendsState(AJo);
  1400. end;
  1401. except
  1402. on E: Exception do
  1403. Error('协议处理错误:'+ E.Message, IntToHex(AProtocol, 2));
  1404. end;
  1405. end;
  1406. procedure TUsersService.HandleTeamUsers(AJo: ISuperObject;
  1407. ARealICQClient: TRealICQClient);
  1408. var
  1409. AUsers: TStringList;
  1410. begin
  1411. InitAndSaveUsers(AJo, ARealICQClient, uutTeam);
  1412. // try
  1413. // UpdateTeamsMembers(AUsers);
  1414. // finally
  1415. // FreeAndNil(AUsers);
  1416. // end;
  1417. end;
  1418. function TUsersService.InitAndSaveUsers(AJo: ISuperObject;
  1419. ARealICQClient: TRealICQClient; AUpdateType: TUpdateUIType = uutAll): TStringList;
  1420. var
  1421. iLoop: Integer;
  1422. joUser: ISuperObject;
  1423. ja: TSuperArray;
  1424. AServerid: string;
  1425. AKeyValues: TKeyValues;
  1426. AUser: TRealICQUser;
  1427. AUSers: TStringList;
  1428. ATreeView: TRealICQContacterTreeView;
  1429. ATime: Cardinal;
  1430. procedure UpdateDataAndUI;
  1431. var
  1432. jLoop: Integer;
  1433. begin
  1434. if (AUsers = nil) or (AUsers.Count = 0) then
  1435. Exit;
  1436. case AUpdateType of
  1437. uutAll: ;
  1438. uutTeam:
  1439. begin
  1440. AUsersService.UpdateTeamsMembers(AUsers);
  1441. Exit;
  1442. end;
  1443. uutFriend:
  1444. begin
  1445. AUsersService.UpdateFriends(AUsers);
  1446. Exit;
  1447. end;
  1448. uutCompany:
  1449. begin
  1450. if SameText(AServerID, MainForm.RealICQClient.ServerID) then
  1451. begin
  1452. ATreeView := AUsersService.GetTreeView(LVMyContacters);
  1453. if ATreeView <> nil then
  1454. AUsersService.UpdateUsersToTreeView(AUsers, ATreeView);
  1455. end;
  1456. Exit;
  1457. end;
  1458. end;
  1459. if SameText(AServerID, MainForm.RealICQClient.ServerID) then
  1460. begin
  1461. ATreeView := GetTreeView(LVMyContacters);
  1462. if ATreeView <> nil then
  1463. UpdateUsersToTreeView(AUsers, ATreeView);
  1464. end;
  1465. if SameText(AServerID, MainForm.CurrentServerID) then
  1466. begin
  1467. ATreeView := GetTreeView(LVMoreUsers);
  1468. if ATreeView <> nil then
  1469. UpdateUsersToTreeView(AUsers, ATreeView);
  1470. end;
  1471. for jLoop := 0 to AUsers.Count - 1 do
  1472. begin
  1473. AUser := AUsers.Objects[jLoop] as TRealICQUser;
  1474. UpdateSeeInformationForm(AUser.LoginName);
  1475. UpdateTalkingForm(AUser);
  1476. UpdateSMSForm(AUser);
  1477. UpdateMemberInfoOfTeamOptionsForm(AUser);
  1478. Mainform.UpdateAddrBookInfo(AUser);
  1479. if (Length(AUser.HeadImageFile) > 0) and not FileExists(AUser.HeadImageFile) then
  1480. MainForm.RealICQClient.SendDownloadHeadImageRequest(AUser.LoginName);
  1481. end;
  1482. UpdateUsersToListView(Mainform.FLVLatests, AUsers);
  1483. UpdateTeamsMembers(AUsers);
  1484. UpdateFriends(AUsers);
  1485. end;
  1486. begin
  1487. if AJo = nil then
  1488. Exit;
  1489. ja := AJo.A['us'];
  1490. AServerid := AJo.S['s'];
  1491. SetLength(AKeyValues, ja.Length);
  1492. AUsers := TStringList.Create;
  1493. for iLoop := 0 to ja.Length - 1 do
  1494. begin
  1495. joUser := ja[iLoop];
  1496. if joUser.S['l'] = '' then
  1497. Continue;
  1498. joUser.S['l'] := TUsersService.FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']);
  1499. AKeyValues[iLoop][0] := joUser.S['l'];
  1500. AKeyValues[iLoop][1] := joUser.AsJSon();
  1501. AKeyValues[iLoop][2] := IntToStr(joUser.I['v']);
  1502. AUser := GetOrCreateUser(joUser.S['l'], MainForm.RealICQClient);
  1503. AUser.IsComparedVer := True;
  1504. InitUserObject(AUser, joUser);
  1505. AUsers.AddObject(AUser.LoginName, AUser);
  1506. end;
  1507. try
  1508. // ATime := GetTickCount;
  1509. GetUsersHashProvider.Insert(AKeyValues);
  1510. // Log(Format('SQLite插入数据耗时:%dms',[GetTickCount - ATime]), '数据库性能监控');
  1511. except
  1512. on E: Exception do
  1513. begin
  1514. Error(E.Message, 'TAsynResponseUserInfo.Execute');
  1515. UpdateDataAndUI;
  1516. FreeAndNil(AUsers);
  1517. end;
  1518. end;
  1519. // ATime := GetTickCount;
  1520. UpdateDataAndUI;
  1521. // Log(Format('UI更新耗时:%dms',[GetTickCount - ATime]), 'UI性能监控');
  1522. FreeAndNil(AUsers);
  1523. end;
  1524. //var
  1525. // iLoop: Integer;
  1526. // joUser: ISuperObject;
  1527. // ja: TSuperArray;
  1528. // AUser: TRealICQUser;
  1529. // AKeyValues: TKeyValues;
  1530. // AServerid: string;
  1531. // AsynAction: TAsynResponseUserInfo;
  1532. //begin
  1533. // ja := AJo.A['us'];
  1534. // AServerid := AJo.S['s'];
  1535. // if ja.Length > 5 then
  1536. // begin
  1537. // AsynAction := TAsynResponseUserInfo.Create;
  1538. // AsynAction.JoUsers := AJo;
  1539. // AsynAction.UpdateType := AUpdateType;
  1540. // AsynAction.Resume;
  1541. // Exit;
  1542. // end;
  1543. // Result := TStringList.Create;
  1544. // SetLength(AKeyValues, ja.Length);
  1545. // for iLoop := 0 to ja.Length - 1 do
  1546. // begin
  1547. // joUser := ja[iLoop];
  1548. // if joUser.S['l'] = '' then
  1549. // Continue;
  1550. // joUser.S['l'] := FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']);
  1551. // AKeyValues[iLoop][0] := joUser.S['l'];
  1552. // AKeyValues[iLoop][1] := joUser.AsJSon();
  1553. // AKeyValues[iLoop][2] := IntToStr(joUser.I['v']);
  1554. // AUser := GetOrCreateUser(joUser.S['l'], ARealICQClient);
  1555. // InitUserObject(AUser, joUser);
  1556. // Result.AddObject(AUser.LoginName, AUser);
  1557. // end;
  1558. //
  1559. // GetUsersHashProvider.Insert(AKeyValues);
  1560. //end;
  1561. procedure TUsersService.HandleUserInformations(AJo: ISuperObject;
  1562. ARealICQClient: TRealICQClient);
  1563. var
  1564. ja: TSuperArray;
  1565. AServerid: string;
  1566. AUsers: TStringList;
  1567. AsynAction: TAsynResponseUserInfo;
  1568. begin
  1569. InitAndSaveUsers(AJo, ARealICQClient);
  1570. // ja := AJo.A['us'];
  1571. // AServerid := AJo.S['s'];
  1572. // if ja.Length > 5 then
  1573. // begin
  1574. // AsynAction := TAsynResponseUserInfo.Create;
  1575. // AsynAction.JoUsers := AJo;
  1576. // AsynAction.Resume;
  1577. // Exit;
  1578. // end;
  1579. // AUsers := InitAndSaveUsers(AJo, ARealICQClient);
  1580. //
  1581. // try
  1582. // DoReceivedUserInformations(AServerid, AUsers);
  1583. // finally
  1584. // FreeAndNil(AUsers);
  1585. // end;
  1586. end;
  1587. //'{"uid":"lsyehui",
  1588. //"tel":"",
  1589. //"sex":2,
  1590. //"mob":"",
  1591. //"bid":837000001,
  1592. //"position":1,
  1593. //"secret":1,
  1594. //"v":1,
  1595. //"remark":{}, remark怎么是对象
  1596. //"showMob":true,不需要
  1597. //"uType":0, 不需要
  1598. //"Watchword":"",
  1599. //"address":null, 不需要
  1600. //"email":"",
  1601. //"branch":"",
  1602. //"sMob":"",
  1603. //"name":"\u53f6\u6167",
  1604. //"icon":"",
  1605. //"duty":"",
  1606. //"comp":"\u534f\u540c\u529e\u516c\u5c0f\u7ec4",
  1607. //"iconType":0,
  1608. //"officeID":""}'
  1609. procedure TUsersService.RequestUserDetailByLoginName(AProtocol: Byte;
  1610. ALoginName: TInterfaceList; ARealICQClient: TRealICQClient);
  1611. var
  1612. ALen: Integer;
  1613. AJoData, AJoData2: ISuperObject;
  1614. AUserArray, AUserArray2: TSuperArray;
  1615. AUsers: TStringList;
  1616. begin
  1617. if ALoginName = nil then
  1618. Exit;
  1619. while ALoginName.Count > 0 do
  1620. begin
  1621. AJoData := ALoginName[0] as ISuperObject;
  1622. ALoginName.Delete(0);
  1623. if not PacketAndSend(AProtocol, AJoData, ARealICQClient) then
  1624. begin
  1625. AJoData2 := SO();
  1626. AJoData2.S['s'] := AJoData.S['s'];
  1627. AJoData2.N['us'] := SO('[]');
  1628. AUserArray := AJoData.A['us'];
  1629. AUserArray2 := AJoData2.A['us'];
  1630. ALen := AUserArray.Length div 2;
  1631. while AUserArray.Length > ALen do
  1632. begin
  1633. AUserArray2.Add(AUserArray.S[0]);
  1634. AUserArray.Delete(0);
  1635. end;
  1636. ALoginName.Add(AJoData2);
  1637. ALoginName.Add(AJoData);
  1638. end;
  1639. end;
  1640. end;
  1641. procedure TUsersService.RequestUserDetailByUserSimple(AProtocol: Byte;
  1642. AUserSimples: TInterfaceList; ARealICQClient: TRealICQClient);
  1643. var
  1644. ALen: Integer;
  1645. AJoData, AJoData2: ISuperObject;
  1646. AUserArray, AUserArray2: TSuperArray;
  1647. AUsers: TStringList;
  1648. begin
  1649. if AUserSimples = nil then
  1650. Exit;
  1651. while AUserSimples.Count > 0 do
  1652. begin
  1653. AJoData := AUserSimples[0] as ISuperObject;
  1654. AUserSimples.Delete(0);
  1655. if not PacketAndSend(AProtocol, AJoData, ARealICQClient) then
  1656. begin
  1657. AJoData2 := SO();
  1658. AJoData2.S['s'] := AJoData.S['s'];
  1659. AJoData2.N['us'] := SO('[]');
  1660. AUserArray := AJoData.A['us'];
  1661. AUserArray2 := AJoData2.A['us'];
  1662. ALen := AUserArray.Length div 2;
  1663. while AUserArray.Length > ALen do
  1664. begin
  1665. AUserArray2.Add(AUserArray.O[0]);
  1666. AUserArray.Delete(0);
  1667. end;
  1668. AUserSimples.Add(AJoData2);
  1669. AUserSimples.Add(AJoData);
  1670. end;
  1671. end;
  1672. end;
  1673. procedure TUsersService.RequestUserInformations(ALoginNames: array of string;
  1674. ARealICQClient: TRealICQClient);
  1675. var
  1676. AJos: TInterfaceList;
  1677. begin
  1678. try
  1679. AJos := GetLoginNamesJsons(ALoginNames);
  1680. RequestUserDetailByLoginName(USERINFO_PROLOCOL, AJos, ARealICQClient);
  1681. except
  1682. on E: Exception do
  1683. begin
  1684. Error(E.Message, 'TUsersService.RequestUserInformations');
  1685. FreeAndNil(AJos);
  1686. end;
  1687. end;
  1688. end;
  1689. end.