TeamsService.pas 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. unit TeamsService;
  2. interface
  3. uses
  4. StrUtils, SysUtils, Windows, superobject, Classes, BaseService, RealICQModel;
  5. type
  6. TTeamsService = class(TBaseService)
  7. private
  8. FTeams: TStrings;
  9. FTeamsIsGettedUsers: TStrings;
  10. procedure HandleUsersStatus(AJo: ISuperObject);
  11. public
  12. procedure Init;
  13. procedure Uninstall;
  14. procedure HandleTeamMemberssStatus(AJo: ISuperObject);
  15. function IsGettedUsers(ATeamID: string): Boolean;
  16. function GetUserInfos(ATeamID: string; ATeamMembers: TStrings): TStringList;
  17. procedure RequestUserStatus(ATeamID: string);
  18. constructor Create;
  19. destructor Destroy; override;
  20. class function GetService: TTeamsService; static;
  21. end;
  22. implementation
  23. uses
  24. MainFrm, DataProviderImport, InterfaceDataProvider, LoggerImport, Messages,
  25. UsersService, AsynRequestUserStatus;
  26. var
  27. ATeamsService: TTeamsService;
  28. { TTeamsServcie }
  29. procedure TTeamsService.HandleUsersStatus(AJo: ISuperObject);
  30. var
  31. iLoop: Integer;
  32. joUser: ISuperObject;
  33. ja: TSuperArray;
  34. AServerid: string;
  35. // AKeyValues: TKeyValues;
  36. AUser: TRealICQUser;
  37. AUSers: TStringList;
  38. // ATreeView: TRealICQContacterTreeView;
  39. begin
  40. ja := AJo.A['us'];
  41. AServerid := AJo.S['s'];
  42. AUsers := TStringList.Create;
  43. for iLoop := 0 to ja.Length - 1 do
  44. begin
  45. joUser := ja[iLoop];
  46. if joUser.S['l'] = '' then
  47. Continue;
  48. joUser.S['l'] := TUsersService.FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']);
  49. AUser := TUsersService.GetUsersService.GetUser(joUser.S['l']);
  50. if AUser = nil then
  51. Continue;
  52. AUser.LoginState := TRealICQLoginState(joUser.I['os']);
  53. AUsers.AddObject(AUser.LoginName, AUser);
  54. end;
  55. if AUsers.Count = 0 then
  56. Exit;
  57. try
  58. TUsersService.GetUsersService.UpdateTeamsMembers(AUsers);
  59. finally
  60. FreeAndNil(AUsers);
  61. end;
  62. end;
  63. procedure TTeamsService.RequestUserStatus(ATeamID: string);
  64. var
  65. AsynAction: TAsynRequestUserStatus;
  66. AUsers: TStringList;
  67. begin
  68. if IsGettedUsers(ATeamID) then
  69. begin
  70. AUsers := FTeamsIsGettedUsers.Objects[FTeamsIsGettedUsers.Indexof(ATeamID)] as TStringList;
  71. if AUsers.Count = 0 then
  72. Exit;
  73. AsynAction := TAsynRequestUserStatus.Create(True);
  74. AsynAction.Protocol := TEAMMEMBERS_USERSTATE_PROLOCOL;
  75. AsynAction.Users := TStringList.Create;
  76. AsynAction.Users.AddStrings(AUsers);
  77. AsynAction.Resume;
  78. end;
  79. end;
  80. constructor TTeamsService.Create;
  81. begin
  82. FTeams := TStringList.Create;
  83. FTeamsIsGettedUsers := TStringList.Create;
  84. end;
  85. destructor TTeamsService.Destroy;
  86. begin
  87. FreeAndNil(FTeams);
  88. FreeAndNil(FTeamsIsGettedUsers);
  89. inherited;
  90. end;
  91. class function TTeamsService.GetService: TTeamsService;
  92. begin
  93. if ATeamsService = nil then
  94. ATeamsService := TTeamsService.Create;
  95. Result := ATeamsService;
  96. end;
  97. function TTeamsService.GetUserInfos(ATeamID: string; ATeamMembers: TStrings): TStringList;
  98. begin
  99. if IsGettedUsers(ATeamID) then
  100. begin
  101. Result := FTeamsIsGettedUsers.Objects[FTeamsIsGettedUsers.Indexof(ATeamID)] as TStringList;
  102. if Result.Count = ATeamMembers.Count then
  103. Exit;
  104. FTeamsIsGettedUsers.Delete(FTeamsIsGettedUsers.Indexof(ATeamID));
  105. FreeAndNil(Result);
  106. end;
  107. try
  108. Result := TUsersService.GetUsersService.RequestAndGetTeamMembers(ATeamMembers, MainForm.RealICQClient);
  109. except
  110. on E: Exception do
  111. Error('获取群成员详细信息时报错', 'TTeamsServcie.GetUserInfos');
  112. end;
  113. FTeamsIsGettedUsers.AddObject(ATeamID, Result)
  114. end;
  115. procedure TTeamsService.HandleTeamMemberssStatus(AJo: ISuperObject);
  116. var
  117. iLoop: Integer;
  118. joUser: ISuperObject;
  119. ja: TSuperArray;
  120. AServerid: string;
  121. // AKeyValues: TKeyValues;
  122. AUser: TRealICQUser;
  123. AUSers: TStringList;
  124. // ATreeView: TRealICQContacterTreeView;
  125. begin
  126. ja := AJo.A['us'];
  127. AServerid := AJo.S['s'];
  128. AUsers := TStringList.Create;
  129. for iLoop := 0 to ja.Length - 1 do
  130. begin
  131. joUser := ja[iLoop];
  132. if joUser.S['l'] = '' then
  133. Continue;
  134. joUser.S['l'] := TUsersService.FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']);
  135. AUser := TUsersService.GetUsersService.GetUser(joUser.S['l']);
  136. if AUser = nil then
  137. Continue;
  138. AUser.LoginState := TRealICQLoginState(joUser.I['os']);
  139. AUsers.AddObject(AUser.LoginName, AUser);
  140. end;
  141. if AUsers.Count = 0 then
  142. Exit;
  143. try
  144. TUsersService.GetUsersService.UpdateTeamsMembers(AUsers);
  145. finally
  146. FreeAndNil(AUsers);
  147. end;
  148. end;
  149. procedure TTeamsService.Init;
  150. begin
  151. end;
  152. function TTeamsService.IsGettedUsers(ATeamID: string): Boolean;
  153. begin
  154. Result := FTeamsIsGettedUsers.IndexOf(ATeamID) > -1;
  155. end;
  156. procedure TTeamsService.Uninstall;
  157. begin
  158. FTeams.Clear;
  159. FTeamsIsGettedUsers.Clear;
  160. end;
  161. end.