unit TeamsService; interface uses StrUtils, SysUtils, Windows, superobject, Classes, BaseService, RealICQModel; type TTeamsService = class(TBaseService) private FTeams: TStrings; FTeamsIsGettedUsers: TStrings; procedure HandleUsersStatus(AJo: ISuperObject); public procedure Init; procedure Uninstall; procedure HandleTeamMemberssStatus(AJo: ISuperObject); function IsGettedUsers(ATeamID: string): Boolean; function GetUserInfos(ATeamID: string; ATeamMembers: TStrings): TStringList; procedure RequestUserStatus(ATeamID: string); constructor Create; destructor Destroy; override; class function GetService: TTeamsService; static; end; implementation uses MainFrm, DataProviderImport, InterfaceDataProvider, LoggerImport, Messages, UsersService, AsynRequestUserStatus; var ATeamsService: TTeamsService; { TTeamsServcie } procedure TTeamsService.HandleUsersStatus(AJo: ISuperObject); var iLoop: Integer; joUser: ISuperObject; ja: TSuperArray; AServerid: string; // AKeyValues: TKeyValues; AUser: TRealICQUser; AUSers: TStringList; // ATreeView: TRealICQContacterTreeView; begin ja := AJo.A['us']; AServerid := AJo.S['s']; AUsers := TStringList.Create; for iLoop := 0 to ja.Length - 1 do begin joUser := ja[iLoop]; if joUser.S['l'] = '' then Continue; joUser.S['l'] := TUsersService.FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']); AUser := TUsersService.GetUsersService.GetUser(joUser.S['l']); if AUser = nil then Continue; AUser.LoginState := TRealICQLoginState(joUser.I['os']); AUsers.AddObject(AUser.LoginName, AUser); end; if AUsers.Count = 0 then Exit; try TUsersService.GetUsersService.UpdateTeamsMembers(AUsers); finally FreeAndNil(AUsers); end; end; procedure TTeamsService.RequestUserStatus(ATeamID: string); var AsynAction: TAsynRequestUserStatus; AUsers: TStringList; begin if IsGettedUsers(ATeamID) then begin AUsers := FTeamsIsGettedUsers.Objects[FTeamsIsGettedUsers.Indexof(ATeamID)] as TStringList; if AUsers.Count = 0 then Exit; AsynAction := TAsynRequestUserStatus.Create(True); AsynAction.Protocol := TEAMMEMBERS_USERSTATE_PROLOCOL; AsynAction.Users := TStringList.Create; AsynAction.Users.AddStrings(AUsers); AsynAction.Resume; end; end; constructor TTeamsService.Create; begin FTeams := TStringList.Create; FTeamsIsGettedUsers := TStringList.Create; end; destructor TTeamsService.Destroy; begin FreeAndNil(FTeams); FreeAndNil(FTeamsIsGettedUsers); inherited; end; class function TTeamsService.GetService: TTeamsService; begin if ATeamsService = nil then ATeamsService := TTeamsService.Create; Result := ATeamsService; end; function TTeamsService.GetUserInfos(ATeamID: string; ATeamMembers: TStrings): TStringList; begin if IsGettedUsers(ATeamID) then begin Result := FTeamsIsGettedUsers.Objects[FTeamsIsGettedUsers.Indexof(ATeamID)] as TStringList; if Result.Count = ATeamMembers.Count then Exit; FTeamsIsGettedUsers.Delete(FTeamsIsGettedUsers.Indexof(ATeamID)); FreeAndNil(Result); end; try Result := TUsersService.GetUsersService.RequestAndGetTeamMembers(ATeamMembers, MainForm.RealICQClient); except on E: Exception do Error('获取群成员详细信息时报错', 'TTeamsServcie.GetUserInfos'); end; FTeamsIsGettedUsers.AddObject(ATeamID, Result) end; procedure TTeamsService.HandleTeamMemberssStatus(AJo: ISuperObject); var iLoop: Integer; joUser: ISuperObject; ja: TSuperArray; AServerid: string; // AKeyValues: TKeyValues; AUser: TRealICQUser; AUSers: TStringList; // ATreeView: TRealICQContacterTreeView; begin ja := AJo.A['us']; AServerid := AJo.S['s']; AUsers := TStringList.Create; for iLoop := 0 to ja.Length - 1 do begin joUser := ja[iLoop]; if joUser.S['l'] = '' then Continue; joUser.S['l'] := TUsersService.FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']); AUser := TUsersService.GetUsersService.GetUser(joUser.S['l']); if AUser = nil then Continue; AUser.LoginState := TRealICQLoginState(joUser.I['os']); AUsers.AddObject(AUser.LoginName, AUser); end; if AUsers.Count = 0 then Exit; try TUsersService.GetUsersService.UpdateTeamsMembers(AUsers); finally FreeAndNil(AUsers); end; end; procedure TTeamsService.Init; begin end; function TTeamsService.IsGettedUsers(ATeamID: string): Boolean; begin Result := FTeamsIsGettedUsers.IndexOf(ATeamID) > -1; end; procedure TTeamsService.Uninstall; begin FTeams.Clear; FTeamsIsGettedUsers.Clear; end; end.