UsersService.pas 55 KB

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