WorkmatesService.pas 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. unit WorkmatesService;
  2. interface
  3. uses
  4. StrUtils, SysUtils, Windows, superobject, Classes, BaseService, RealICQModel;
  5. type
  6. TWorkmatesService = class(TBaseService)
  7. private
  8. FWorkmates: TStringList;
  9. FWorkmatesNeedUpdate: TStringList;
  10. public
  11. procedure HandleUsersStatus(AJo: ISuperObject);
  12. function GetWorkmates: TStringList;
  13. function GetWorkmate(ALoginName: string): TRealICQUser;
  14. procedure Init;
  15. procedure Uninstall;
  16. function IsWorkmate(ALoginName: string): Boolean;
  17. procedure AddWorkmates(AWorkmates: TStrings);
  18. constructor Create;
  19. destructor Destroy; override;
  20. class function GetService: TWorkmatesService; static;
  21. procedure RequestUserStatus;
  22. procedure RequstUserInfos;
  23. property WorkmatesNeedUpdate: TStringList read FWorkmatesNeedUpdate write FWorkmatesNeedUpdate;
  24. end;
  25. implementation
  26. uses
  27. UsersService, AsynRequestUserStatus, AsynRequestUserInfo, MainFrm, LoggerImport;
  28. var
  29. AWorkmatesService: TWorkmatesService;
  30. function WorkmatesSort(List: TStringList; Index1, Index2: Integer): Integer;
  31. var
  32. AUser1,
  33. AUser2: TRealICQUser;
  34. begin
  35. AUser1 := List.Objects[Index1] as TRealICQUser;
  36. AUser2 := List.Objects[Index2] as TRealICQUser;
  37. if AUser1.Position < AUser2.Position then
  38. Result := -1
  39. else
  40. if AUser1.Position = AUser2.Position then
  41. Result := 0
  42. else
  43. Result := 1;
  44. end;
  45. { TWorkmatesService }
  46. procedure TWorkmatesService.AddWorkmates(AWorkmates: TStrings);
  47. var
  48. iLoop, jLoop: Integer;
  49. ABranchIDs: TStrings;
  50. TmpUsers1, TmpUsers2: TStringList;
  51. AUser: TRealICQUser;
  52. begin
  53. // ABranchIDs := TStringList.Create;
  54. // TmpUsers1 := TStringList.Create;
  55. // TmpUsers2 := TStringList.Create;
  56. // for iLoop := 0 to AWorkmates.Count - 1 do
  57. // begin
  58. // AUser := AWorkmates.Objects[iLoop] As TRealICQUser;
  59. // if ABranchIDs.IndexOf(AUser.BranchID) < 0 then
  60. // ABranchIDs.Add(AUser.BranchID);
  61. // end;
  62. //
  63. // for iLoop := 0 to ABranchIDs.Count - 1 do
  64. // begin
  65. // for jLoop := 0 to AWorkmates.Count - 1 do
  66. // begin
  67. // AWorkmates.
  68. // AUser := AWorkmates.Objects[iLoop] As TRealICQUser;
  69. // if AUser then
  70. //
  71. // end;
  72. // end;
  73. FWorkmates.AddStrings(AWorkmates);
  74. // FWorkmates.CustomSort(WorkmatesSort);
  75. // for iLoop := 0 to FWorkmates.Count - 1 do
  76. // begin
  77. // AUser := FWorkmates.Objects[iLoop] As TRealICQUser;
  78. // Debug(AUser.LoginName + ';' + FloatToStr(AUser.Position), 'WorkmatesSort');
  79. // end;
  80. end;
  81. constructor TWorkmatesService.Create;
  82. begin
  83. FWorkmates := TStringList.Create;
  84. FWorkmates.Duplicates := dupIgnore;
  85. FWorkmatesNeedUpdate := TStringList.Create;
  86. FWorkmatesNeedUpdate.Duplicates := dupIgnore;
  87. end;
  88. destructor TWorkmatesService.Destroy;
  89. begin
  90. FreeAndNil(FWorkmates);
  91. FreeAndNil(FWorkmatesNeedUpdate);
  92. inherited;
  93. end;
  94. class function TWorkmatesService.GetService: TWorkmatesService;
  95. begin
  96. if AWorkmatesService = nil then
  97. AWorkmatesService := TWorkmatesService.Create;
  98. Result := AWorkmatesService;
  99. end;
  100. function TWorkmatesService.GetWorkmate(ALoginName: string): TRealICQUser;
  101. var
  102. iIndex: Integer;
  103. begin
  104. iIndex := FWorkmates.Indexof(ALoginName);
  105. if iIndex > -1 then
  106. Result := FWorkmates.Objects[iIndex] as TRealICQUser
  107. else
  108. Result := nil;
  109. end;
  110. function TWorkmatesService.GetWorkmates: TStringList;
  111. var
  112. tmpList: TStringList;
  113. begin
  114. Result := TStringList.Create;
  115. Result.AddStrings(FWorkmates);
  116. // try
  117. // Result := TUsersService.GetUsersService.GetOrCreateUsers(tmpList);
  118. // finally
  119. // FreeAndNil(tmpList);
  120. // end;
  121. end;
  122. procedure TWorkmatesService.HandleUsersStatus(AJo: ISuperObject);
  123. var
  124. iLoop: Integer;
  125. joUser: ISuperObject;
  126. ja: TSuperArray;
  127. AServerid: string;
  128. // AKeyValues: TKeyValues;
  129. AUser: TRealICQUser;
  130. AUSers: TStringList;
  131. // ATreeView: TRealICQContacterTreeView;
  132. begin
  133. ja := AJo.A['us'];
  134. AServerid := AJo.S['s'];
  135. AUsers := TStringList.Create;
  136. for iLoop := 0 to ja.Length - 1 do
  137. begin
  138. joUser := ja[iLoop];
  139. if joUser.S['l'] = '' then
  140. Continue;
  141. joUser.S['l'] := TUsersService.FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']);
  142. AUser := GetWorkmate(joUser.S['l']);
  143. if AUser = nil then
  144. Continue;
  145. AUser.LoginState := TRealICQLoginState(joUser.I['os']);
  146. AUsers.AddObject(AUser.LoginName, AUser);
  147. end;
  148. if AUsers.Count = 0 then
  149. Exit;
  150. try
  151. TUsersService.GetUsersService.UpdateUserStateToTreeView(AUsers, GetTreeView(LVMyContacters));
  152. finally
  153. FreeAndNil(AUsers);
  154. end;
  155. end;
  156. procedure TWorkmatesService.Init;
  157. begin
  158. end;
  159. function TWorkmatesService.IsWorkmate(ALoginName: string): Boolean;
  160. begin
  161. Result := FWorkmates.IndexOf(ALoginName) >= 0;
  162. end;
  163. procedure TWorkmatesService.RequestUserStatus;
  164. var
  165. AsynAction: TAsynRequestUserStatus;
  166. begin
  167. AsynAction := TAsynRequestUserStatus.Create(True);
  168. AsynAction.Protocol := WORKMATES_USERSTATE_PROLOCOL;
  169. AsynAction.Users := TStringList.Create;
  170. AsynAction.Users.AddStrings(FWorkmates);
  171. AsynAction.Resume;
  172. end;
  173. procedure TWorkmatesService.RequstUserInfos;
  174. var
  175. AsynAction: TAsynRequestUserInfo;
  176. begin
  177. if FWorkmatesNeedUpdate.Count = 0 then
  178. Exit;
  179. TUsersService.GetUsersService.RequestWorkmatesInfos(FWorkmatesNeedUpdate);
  180. // AsynAction := TAsynRequestUserInfo.Create;
  181. // AsynAction.Users.AddStrings(FWorkmatesNeedUpdate);
  182. FWorkmatesNeedUpdate.Clear;
  183. // AsynAction.Resume;
  184. end;
  185. procedure TWorkmatesService.Uninstall;
  186. begin
  187. FWorkmatesNeedUpdate.Clear;
  188. FWorkmates.Clear;
  189. end;
  190. end.