unit UsersService; interface uses StrUtils, SysUtils, Windows, superobject, RealICQClient, Classes, RealICQContacterTreeView, RealICQContacterListView, ComCtrls, BaseService, AsynResponseUserInfo, RealICQModel, WideStrings; type TUsersService = class(TBaseService) private {$REGION '本地用户数据管理'} FUsers: TStringList; {$ENDREGION} {$REGION '根据部门ID获取用户简单信息'} procedure HandleBranchUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient); procedure DoGettedUsersByBranchID(AServerID, ABranchID: string; AUsers: TStringList); {$ENDREGION} {$REGION '单位用户'} procedure HandleCompanyUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient); {$ENDREGION} {$REGION '群组用户'} procedure HandleTeamUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient); {$ENDREGION} {$region '好友'} /// /// 响应好友简单消息 /// 协议号03 /// /// {[{simple user}, {simple user}, {simple user}]} /// procedure HandleFriends(AJo: ISuperObject; ARealICQClient: TRealICQClient); /// /// 响应好友详细消息 /// 协议号05 /// /// {"s":"ServerID", "us":[{detail user}, {detail user}, {detail user}]} /// procedure HandleDetailFriends(AJo: ISuperObject; ARealICQClient: TRealICQClient); procedure UpdateOrAddFriends(AUsers: TStringList); {$ENDREGION} {$REGION '用户详细信息'} /// /// 响应用户详细信息 /// 协议号00 /// /// {"s":"ServerID", "us":[{detail user}, {detail user}, {detail user}]} /// procedure HandleUserInformations(AJo: ISuperObject; ARealICQClient: TRealICQClient); procedure DoReceivedUserInformations(AServerID: string; AUsers: TStringList); {$ENDREGION} constructor Create; procedure HandleMessage(ASender: TObject; const AData: TBytes); //function GetAndSaveUsersByJsons(AJo: ISuperObject; ARealICQClient: TRealICQClient): TStringList; procedure RequestUserInformation(ALoginName: string; ARealICQClient: TRealICQClient); /// /// 更新内存用户信息并保存到本地数据库 /// /// {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]} /// function InitAndSaveUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient; AUpdateType: TUpdateUIType = uutAll): TStringList; procedure HandleDetailWorkmates(AJo: ISuperObject; ARealICQClient: TRealICQClient); function GetUserRemark(ALoginName: string): ISuperObject; public destructor Destroy; override; class function GetUsersService: TUsersService; procedure Init; procedure Uninstall; procedure RequestWorkmatesInfos(ALoginNames: TStrings); procedure RequestUserInformations(ALoginNames: TStrings; ARealICQClient: TRealICQClient); overload; procedure RequestUserInformations(ALoginNames: array of string; ARealICQClient: TRealICQClient); overload; procedure RequestUserStatus(AProtocol: Byte; AUsers: TStringList); procedure RequestUsersByBranchID(AServerID: string; ABranchIDs: TStrings; ARealICQClient: TRealICQClient); procedure RequestFriends(ARealICQClient: TRealICQClient); procedure RequestCompany(ARealICQClient: TRealICQClient); procedure RequestUserDetailByUserSimple(AProtocol: Byte; AUserSimples: TInterfaceList; ARealICQClient: TRealICQClient); procedure RequestUserDetailByLoginName(AProtocol: Byte; ALoginName: TInterfaceList; ARealICQClient: TRealICQClient); function GetOrRequestUser(ALoginName: string; ARealICQClient: TRealICQClient = nil): TRealICQUser; function GetUser(ALoginName: string): TRealICQUser; function GetMe: TRealICQUser; procedure DoOnReceivedUserStatus(ALoginName: string; ALoginState: TRealICQLoginState; ALeaveMessage: string); /// /// 获取用户信息 /// /// 登录名 /// /// 所有的用户信息 function GetOrCreateUsers(ALoginNames: TStrings; ARealICQClient: TRealICQClient = nil): TStringList; function GetWorkmatesAndFriends(): TStringList; function IsWorkmateOrFriend(ALoginName: string): Boolean; function RequestAndGetTeamMembers(AMembers: TStrings; ARealICQClient: TRealICQClient): TStringList; function IsCanSee(ALoginName: string): Boolean; {$REGION '更新到UI'} procedure DoGettedCompanyUsers(AUsers: TStringList; ABranch: string); procedure DoGettedFriends(AUsers: TStringList); procedure UpdateOrAddUsersToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView; ABranchID: string = ''); procedure UpdateUsersToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView); procedure UpdateUserStateToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView); procedure UpdateOrAddUsersToListView(AListView: TRealICQContacterListView; AUsers: TStringList); procedure UpdateUsersToListView(AListView: TRealICQContacterListView; AUsers: TStringList); procedure UpdateUserStateListView(AListView: TRealICQContacterListView; AUsers: TStringList); procedure UpdateListItem(AListItem: TRealICQContacterListItem; AUser: TRealICQUser; AShowNavBarNumeric: Boolean = True); procedure UpdateTreeNode(Employee: TRealICQEmployee; RealICQUser: TRealICQUser; AShowNavBarNumeric: Boolean = True); procedure UpdateFriends(AUsers: TStringList); procedure UpdateTeamsMembers(AUsers: TStringList); procedure UpdateOrAddFriend(AUser: TRealICQUser); {$ENDREGION} {$REGION '本地用户数据管理'} function InitAndRequestUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient; ARequestRealTime: Boolean = True; ANeedRequestUsers: TStringList = nil): TStringList; function GetOrCreateUser(ALoginName: string; ARealICQClient: TRealICQClient): TRealICQUser; procedure AddMoreUser(AUser: TRealICQUser); {$ENDREGION} end; const /// /// 协议$00 /// request {"s":"ServerID","us":["u1","u2",..,"un"]} /// response {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]} /// USERINFO_PROLOCOL: byte = $00; /// /// 协议$01 /// request {"s":"ServerID", "bs":[b1, b2, ..., bn]} /// request {"s":"ServerID","us":["u1","u2",..,"un"]} /// response { /// "s":"ServerID", /// "bs":{ /// "b1":[{simple user}, {simple user}, {simple user}], /// "b2":[{simple user}, {simple user}, {simple user}] /// } /// } /// /// BRANCH_USERS_PROLOCOL: byte = $01; /// /// 协议$02 /// request 就一个协议头 /// response /// { /// "completed":true, /// "bs":{ /// "b1":[{simple user}, {simple user}, {simple user}], /// "b2":[{simple user}, {simple user}, {simple user}] /// } /// } /// COMPANY_USERS_PROLOCOL: byte = $02; /// /// 协议$03 /// request 就一个协议头 /// response /// { /// [{simple user}, {simple user}, {simple user}] /// } /// } /// FRIENDS_PROLOCOL: byte = $03; /// /// 协议$04 /// request {"s":"ServerID", "us":[{simple user}, {simple user}, {simple user}]} /// response {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]} /// TEAM_USER_PROLOCOL: byte = $04; /// /// 协议$05 /// request {"s":"ServerID", "us":[{simple user}, {simple user}, {simple user}]} /// response {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]} /// FRIENDS_DETAIL_PROLOCOL: byte = $05; /// /// 协议$06 /// request {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]} /// response {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]} /// WORKMATES_USERSTATE_PROLOCOL: byte = $06; /// /// 协议$07 /// request {"s":"ServerID","us":["u1","u2",..,"un"]} /// response {"s":"ServerID","us":[{detail user},{detail user},...,{detail user}]} /// WORKMATEINFO_PROLOCOL: byte = $07; /// /// 协议$08 /// request {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]} /// response {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]} /// TEAMMEMBERS_USERSTATE_PROLOCOL: byte = $08; /// /// 协议$09 /// request {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]} /// response {"s":"ServerID", "us":[{user state}, {user state},...,{user state}]} /// FRIENDS_USERSTATE_PROLOCOL: byte = $09; implementation uses MainFrm, DataProviderImport, InterfaceDataProvider, LoggerImport, GIFImage, Messages, TalkingFrm, UserCardDetailView, SMSFrm, TeamOptionsFrm, FriendsService, WorkmatesService, Forms, AsynRequestUserInfo, TeamsService, UserRemarkService, LimitCondition, Dialogs, ConditionConfig; var AUsersService: TUsersService; procedure TUsersService.AddMoreUser(AUser: TRealICQUser); var AUser1: TRealICQUSer; begin if (AUser = nil) or (Auser.LoginName = '') then Exit; AUser1 := GetUser(Auser.LoginName); if AUser1 <> nil then Exit; AUser1 := GetOrCreateUser(Auser.LoginName, Mainform.RealICQClient); AUser1.DisplayName:= AUser.DisplayName; AUser1.BranchID := AUser.BranchID; AUser1.LoginState := AUser.LoginState; AUser1.Tel:=AUser.Tel; AUser1.Mobile:=AUser.Mobile; AUser1.Email:=AUser.Email; AUser1.LeaveMessage :=AUser.LeaveMessage; end; constructor TUsersService.Create; begin FUsers := TStringList.Create; end; destructor TUsersService.Destroy; begin FreeStringList(FUsers); inherited; end; procedure TUsersService.DoGettedCompanyUsers(AUsers: TStringList; ABranch: string); var ATreeVeiw: TRealICQContacterTreeView; iLoop: Integer; begin ATreeVeiw := GetTreeView(LVMyContacters); if ATreeVeiw <> nil then UpdateOrAddUsersToTreeView(AUsers, ATreeVeiw, ABranch); end; procedure TUsersService.DoGettedFriends(AUsers: TStringList); begin TFriendsService.GetService.AddFriends(AUsers); UpdateOrAddFriends(AUsers); TFriendsService.GetService.RequestUserStatus(AUsers); end; procedure TUsersService.DoGettedUsersByBranchID(AServerID, ABranchID: string; AUsers: TStringList); var ATreeView: TRealICQContacterTreeView; begin if SameText(AServerID, MainForm.RealICQClient.ServerID) then begin ATreeView := GetTreeView(LVMyContacters); if ATreeView <> nil then begin UpdateOrAddUsersToTreeView(AUsers, ATreeView, ABranchID); end; end; if SameText(AServerID, MainForm.CurrentServerID) then begin ATreeView := GetTreeView(LVMoreUsers); if ATreeView <> nil then begin UpdateOrAddUsersToTreeView(AUsers, ATreeView, ABranchID); end; end; end; procedure TUsersService.DoOnReceivedUserStatus(ALoginName: string; ALoginState: TRealICQLoginState; ALeaveMessage: string); var AUser: TRealICQUser; begin AUser := GetUser(ALoginName); if AUser = nil then Exit; // // if (AUser.LoginState = stOffline) and (ALoginState <> stOffline) then // begin // SendGetUserInformation(RealICQUser.FLoginName, False); // end; if not (ALoginState <> stMobileOnline) or (AUser.LoginState = stOffline) then AUser.LoginState := ALoginState else Exit; AUser.LeaveMessage := ALeaveMessage; // AUser.LoginAtWeb := ALoginAtWeb; // AUser.LoginAsWaiter := ALoginAsWaiter; if (AUser.LoginState <> stOffline) and (AUser.LoginState <> stHidden) then begin AUser.GettedOffliceAutoResponseSet := False; AUser.OfflineAutoResponseEnabled := False; AUser.OfflineAutoResponseText := ''; end; MainForm.RealICQClientUserInformationReady(nil, AUser); end; procedure TUsersService.DoReceivedUserInformations(AServerID: string; AUsers: TStringList); var ATreeView: TRealICQContacterTreeView; iLoop: Integer; AUser: TRealICQUser; begin if (AUsers = nil) or (AUsers.Count = 0) then Exit; if SameText(AServerID, MainForm.RealICQClient.ServerID) then begin ATreeView := GetTreeView(LVMyContacters); if ATreeView <> nil then UpdateUsersToTreeView(AUsers, ATreeView); end; if SameText(AServerID, MainForm.CurrentServerID) then begin ATreeView := GetTreeView(LVMoreUsers); if ATreeView <> nil then begin UpdateUsersToTreeView(AUsers, ATreeView); end; end; for iLoop := 0 to AUsers.Count - 1 do begin AUser := AUsers.Objects[iLoop] as TRealICQUser; // UpdateSeeInformationForm(AUser); UpdateTalkingForm(AUser); UpdateSMSForm(AUser); UpdateMemberInfoOfTeamOptionsForm(AUser); Mainform.UpdateAddrBookInfo(AUser); if (Length(AUser.HeadImageFile) > 0) and not FileExists(AUser.HeadImageFile) then MainForm.RealICQClient.SendDownloadHeadImageRequest(AUser.LoginName); end; UpdateTeamsMembers(AUsers); UpdateFriends(AUsers); end; function TUsersService.GetMe: TRealICQUser; begin Result := MainForm.RealICQClient.Me; end; function TUsersService.GetOrCreateUser(ALoginName: string; ARealICQClient: TRealICQClient): TRealICQUser; var iIndex: Integer; AJson: string; begin ALoginName := GetLocalUID(ALoginName); iIndex := FUsers.IndexOf(ALoginName); if iIndex < 0 then begin Result := TRealICQUser.Create(ALoginName, ARealICQClient); // AJson := Trim(GetUsersHashProvider.Find(ALoginName)); // if AJson <> '' then // InitUserObject(Result, AJson); FUsers.AddObject(ALoginName, Result); Exit; end; Result := FUsers.Objects[iIndex] as TRealICQUser; end; function TUsersService.IsCanSee(ALoginName: string): Boolean; var isMe, isSeeRight: Boolean; AUser: TRealICQUser; begin if not TConditionConfig.GetConfig.UserInfoController then begin Result := True; Exit; end; Result := False; AUser := GetUser(ALoginName); if AUser = nil then Exit; if AnsiSameText(ALoginName, MainForm.RealICQClient.LoginName) then begin Result := True; Exit; end; case AUser.Secret of slOnlyFriendCanSee: begin Result := IsWorkmateOrFriend(ALoginName); Exit; end; slAllCanSee: begin Result := True; Exit; end; slAllCannotSee: begin Exit; end; end; end; function TUsersService.IsWorkmateOrFriend(ALoginName: string): Boolean; begin Result := TFriendsService.GetService.IsFriend(ALoginName) or TWorkmatesService.GetService.IsWorkmate(ALoginName); end; procedure TUsersService.Init; var AUsers: TWideStrings; i, iIndex: Integer; JO: ISuperObject; ALoginName: string; AUser: TRealICQUser; begin MainForm.RealICQClient.OnUsersHandleMessages := HandleMessage; MainForm.RealICQClient.Me := GetOrCreateUser(Mainform.RealICQClient.LoginName, Mainform.RealICQClient); MainForm.RealICQClient.Me.LoginState := MainForm.RealICQClient.LoginState; // if Trim(MainForm.RealICQClient.Me.TrueName) = '' then // MainForm.RealICQClient.Me.TrueName := MainForm.RealICQClient.Me.DisplayName; // MainForm.RealICQClient.GetUserLoginState() LoggerImport.LoginName := Mainform.RealICQClient.LoginName; LoggerImport.Monitor; MainForm.ShowMeInformation; AUsers := GetUsersHashProvider.FindAll; for i := 0 to AUsers.Count - 1 do begin JO := SO(AUsers[I]); AUser := TRealICQUser.Create(ALoginName, MainForm.RealICQClient); InitUserObject(AUser, JO); ALoginName := GetLocalUID(JO.S['l']); FUsers.AddObject(ALoginName, AUser); end; end; function TUsersService.GetUserRemark(ALoginName: string): ISuperObject; begin end; procedure TUsersService.Uninstall; begin MainForm.RealICQClient.Me := nil; MainForm.RealICQClient.OnUsersHandleMessages := nil; ClearStringList(FUsers); end; {$REGION 'Old InitAndRequestUsers'} //function TUsersService.InitAndRequestUsers( // AJo: ISuperObject; // ARealICQClient: TRealICQClient; // ARequestRealTime: Boolean = True; // ANeedRequestUsers: TStringList = nil): TStringList; //var // AjaUsers: TSuperArray; // iLoop, jLoop, ALen: Integer; // ALoginNames: array of WideString; // ALoginNames2: TStrings; // AUsers: TKeyValues; // IsDownloaded: Boolean; // AUser: TRealICQUser; //begin // Result := TStringList.Create(); // AjaUsers := AJo.AsArray; // if AjaUsers.Length = 0 then // Exit; // SetLength(ALoginNames, AjaUsers.Length); // for iLoop := 0 to AjaUsers.Length - 1 do // begin // AjaUsers[iLoop].S['l'] := GetLocalUID(AjaUsers[iLoop].S['l']); // ALoginNames[iLoop] := WideString(AjaUsers[iLoop].S['l']); // Result.AddObject(ALoginNames[iLoop], GetOrCreateUser(ALoginNames[iLoop], ARealICQClient)); // end; // // AUsers := GetUsersHashProvider.Find(ALoginNames); // ALoginNames2 := TStringList.Create; // ALen := Length(AUsers); // try // for jLoop := 0 to ALen - 1 do // AUsers[jLoop][0] := GetLocalUID(AUsers[jLoop][0]); // for iLoop := 0 to AjaUsers.Length - 1 do // begin // AUser := GetOrCreateUser(AjaUsers[iLoop].S['l'], ARealICQClient); // IsDownloaded := False; // for jLoop := 0 to ALen - 1 do // if SameText(AjaUsers[iLoop].S['l'], AUsers[jLoop][0]) then // begin // IsDownloaded := True and ARequestRealTime; // InitUserObject(AUser, AUsers[jLoop][1]); // if (AjaUsers[iLoop].I['v'] <> StrToIntDef(AUsers[jLoop][2], -1)) then // ALoginNames2.Add(AUsers[jLoop][0]) // else // IsDownloaded := True; // Break; // end; // AUser.IsComparedVer := True and ARequestRealTime; // if not IsDownloaded then // ALoginNames2.Add(AjaUsers[iLoop].S['l']); // end; // if not ARequestRealTime then // begin // if ANeedRequestUsers = nil then // Exit; // ANeedRequestUsers.Duplicates := dupIgnore; // ANeedRequestUsers.AddStrings(ALoginNames2); // end // else // if ALoginNames2.Count > 0 then // RequestUserInformations(ALoginNames2, ARealICQClient); // except // on E: Exception do // begin // Error(E.Message, 'TUsersService.InitAndRequestUsers'); // FreeAndNil(ALoginNames2); // end; // end; // FreeAndNil(ALoginNames2); //end; {$ENDREGION} function TUsersService.InitAndRequestUsers( AJo: ISuperObject; ARealICQClient: TRealICQClient; ARequestRealTime: Boolean = True; ANeedRequestUsers: TStringList = nil): TStringList; var AjaUsers: TSuperArray; iLoop, jLoop, ALen: Integer; ALoginNames2: TStrings; AUsers: TStringList; IsDownloaded: Boolean; AUser: TRealICQUser; begin Result := TStringList.Create(); AjaUsers := AJo.AsArray; if AjaUsers.Length = 0 then Exit; try ALoginNames2 := TStringList.Create; for iLoop := 0 to AjaUsers.Length - 1 do begin AjaUsers[iLoop].S['l'] := GetLocalUID(AjaUsers[iLoop].S['l']); AUser := GetOrCreateUser(WideString(AjaUsers[iLoop].S['l']), ARealICQClient); Result.AddObject(AUser.LoginName, AUser); if (AUser.CurrentExInfoVersion = -1) or (AjaUsers[iLoop].I['v'] <> AUser.CurrentExInfoVersion) then ALoginNames2.Add(AUser.LoginName); AUser.IsComparedVer := True; end; if ALoginNames2.Count > 0 then RequestUserInformations(ALoginNames2, ARealICQClient); except on E: Exception do begin Error(E.Message, 'TUsersService.InitAndRequestUsers'); FreeAndNil(ALoginNames2); end; end; FreeAndNil(ALoginNames2); end; function TUsersService.GetOrCreateUsers(ALoginNames: TStrings; ARealICQClient: TRealICQClient = nil): TStringList; var iLoop, jLoop, ALen: Integer; AUser: TRealICQUser; AUsers: TKeyValues; ALoginNameArray: array of WideString; IsFound: Boolean; begin if ARealICQClient = nil then ARealICQClient := Mainform.RealICQClient; Result := TStringList.Create; iLoop := 0; while iLoop < ALoginNames.Count do begin AUser := GetUser(ALoginNames[iLoop]); if AUser <> nil then ALoginNames.Delete(iLoop) else begin AUser := GetOrCreateUser(ALoginNames[iLoop], ARealICQClient); inc(iLoop) end; Result.AddObject(AUser.LoginName, AUser); end; // if ALoginNames.Count = 0 then // Exit; // // SetLength(ALoginNameArray, ALoginNames.Count); // for iLoop := 0 to ALoginNames.Count - 1 do // ALoginNameArray[iLoop] := ALoginNames[iLoop]; // AUsers := GetUsersHashProvider.Find(ALoginNameArray); // // ALen := Length(AUsers); // for iLoop := 0 to ALen - 1 do // AUsers[iLoop][0] := FullLoginName(ARealICQClient.CenterServerID, ARealICQClient.ServerID, AUsers[iLoop][0]); // // for iLoop := 0 to ALoginNames.Count - 1 do // begin // AUser := GetOrCreateUser(ALoginNames[iLoop], ARealICQClient); // for jLoop := 0 to ALen - 1 do // if SameText(ALoginNames[iLoop], AUsers[jLoop][0]) then // begin // InitUserObject(AUser, AUsers[jLoop][1]); // Break; // end; // end; end; function TUsersService.GetOrRequestUser(ALoginName: string; ARealICQClient: TRealICQClient = nil): TRealICQUser; begin if ARealICQClient = nil then ARealICQClient := MainForm.RealICQClient; Result := GetOrCreateUser(ALoginName, ARealICQClient); if Result.IsComparedVer then Exit; Result.IsComparedVer := True; RequestUserInformation(ALoginName, ARealICQClient); end; function TUsersService.GetUser(ALoginName: string): TRealICQUser; var iIndex: Integer; begin Result := nil; ALoginName := GetLocalUID(ALoginName); iIndex := FUsers.IndexOf(ALoginName); if iIndex >= 0 then Result := FUsers.Objects[iIndex] as TRealICQUser; end; class function TUsersService.GetUsersService: TUsersService; begin if AUsersService = nil then AUsersService := TUsersService.Create; Result := AUsersService; end; function TUsersService.GetWorkmatesAndFriends: TStringList; var AUsers: TStringList; begin Result := TFriendsService.GetService.GetFriends; AUsers := TWorkmatesService.GetService.GetWorkmates; try Result.Duplicates := dupIgnore; Result.AddStrings(AUsers); finally FreeAndNil(AUsers); end; end; function TUsersService.RequestAndGetTeamMembers(AMembers: TStrings; ARealICQClient: TRealICQClient): TStringList; var AUserJos: TInterfaceList; begin Result := GetOrCreateUsers(AMembers, ARealICQClient); AUserJos := GetSimpleUserJsons(Result); try RequestUserDetailByUserSimple(TEAM_USER_PROLOCOL, AUserJos, ARealICQClient); except on E: Exception do Error(E.Message, 'TUsersService.RequestAndGetTeamMembers'); end; end; procedure TUsersService.RequestCompany(ARealICQClient: TRealICQClient); begin PacketAndSend(COMPANY_USERS_PROLOCOL, nil, ARealICQClient); end; procedure TUsersService.RequestFriends(ARealICQClient: TRealICQClient); begin PacketAndSend(FRIENDS_PROLOCOL, nil, ARealICQClient); end; //$D4 + len + $00 + jsonLen + ["user1", "user2", ... , "usern"] procedure TUsersService.RequestUserInformations(ALoginNames: TStrings; ARealICQClient: TRealICQClient); var AJos: TInterfaceList; begin try AJos := GetLoginNamesJsons(ALoginNames); RequestUserDetailByLoginName(USERINFO_PROLOCOL, AJos, ARealICQClient); except on E: Exception do begin Error(E.Message, 'TUsersService.RequestUserInformations'); FreeAndNil(AJos); end; end; end; procedure TUsersService.RequestWorkmatesInfos(ALoginNames: TStrings); var AJos: TInterfaceList; begin try AJos := GetLoginNamesJsons(ALoginNames); RequestUserDetailByLoginName(WORKMATEINFO_PROLOCOL, AJos, MainForm.RealICQClient); except on E: Exception do begin Error(E.Message, 'TUsersService.RequestWorkmatesInfos'); end; end; end; procedure TUsersService.RequestUserInformation(ALoginName: string; ARealICQClient: TRealICQClient); var ArrTmp: array[0..0] of string; begin if ALoginName = '' then Exit; ArrTmp[0] := ALoginName; RequestUserInformations(ArrTmp, ARealICQClient); end; procedure TUsersService.RequestUsersByBranchID(AServerID: string; ABranchIDs: TStrings; ARealICQClient: TRealICQClient); var iLoop, Alen: Integer; SendBuffer: TBytes; AJo: ISuperObject; begin try if (ABranchIDs = nil) or (ABranchIDs.Count = 0) then Exit; AJo := SO(); AJo.S['s'] := AServerID; for iLoop := 0 to ABranchIDs.Count - 1 do AJo.A['bs'].S[iLoop] := ABranchIDs[iLoop]; PacketAndSend(BRANCH_USERS_PROLOCOL, AJo, ARealICQClient); except on E: Exception do Error(E.Message, 'TUsersService.RequestUsersByBranchID'); end; end; procedure TUsersService.RequestUserStatus(AProtocol: Byte; AUsers: TStringList); var AUserJos: TInterfaceList; ALen: Integer; AJoData, AJoData2: ISuperObject; AUserArray, AUserArray2: TSuperArray; begin AUserJos := GetUserStatusJsons(AUsers); try while AUserJos.Count > 0 do begin AJoData := AUserJos[0] as ISuperObject; AUserJos.Delete(0); if not PacketAndSend(AProtocol, AJoData, Mainform.RealICQClient) then begin AJoData2 := SO(); AJoData2.S['s'] := AJoData.S['s']; AJoData2.N['us'] := SO('[]'); AUserArray := AJoData.A['us']; AUserArray2 := AJoData2.A['us']; ALen := AUserArray.Length div 2; while AUserArray.Length > ALen do begin AUserArray2.Add(AUserArray.O[0]); AUserArray.Delete(0); end; AUserJos.Add(AJoData2); AUserJos.Add(AJoData); end; end; except on E: Exception do Error(E.Message, 'TUsersService.RequestUserStatus'); end; end; procedure TUsersService.UpdateListItem(AListItem: TRealICQContacterListItem; AUser: TRealICQUser; AShowNavBarNumeric: Boolean = True); var GIFImage: TGIFImage; jo: IsuperObject; ARemarkTel, ARemarkMobile, ARemark: string; begin jo := TUserRemarkService.GetService.GetUserRemark(AUser.LoginName); if jo <> nil then begin ARemark := jo.S['Remark']; ARemarkTel := jo.S['Phone']; ARemarkMobile := jo.S['Mobile']; end; AListItem.HasCamera := AUser.InstalledCamera; AListItem.Watchword := AUser.Watchword; AListItem.LeaveMessage := AUser.LeaveMessage; AListItem.Branch:=AUser.Branch; AListItem.HasTelephone := (Length(Trim(ARemarkTel)) > 0) or (Length(Trim(AUser.Tel)) > 0) or (Length(Trim(AUser.Mobile)) > 0); AListItem.TelephoneHint := ''; if Length(Trim(ARemarkTel)) > 0 then begin AListItem.TelephoneHint := AListItem.TelephoneHint + '备注:' + Trim(ARemarkTel); end; if Length(Trim(AUser.Tel)) > 0 then begin if Length(Trim(AListItem.TelephoneHint)) > 0 then AListItem.TelephoneHint := AListItem.TelephoneHint + ' '; AListItem.TelephoneHint := AListItem.TelephoneHint + '电话:' + Trim(AUser.Tel); end; if Length(Trim(AUser.Mobile)) > 0 then begin if Length(Trim(AListItem.TelephoneHint)) > 0 then AListItem.TelephoneHint := AListItem.TelephoneHint + ' '; AListItem.TelephoneHint := AListItem.TelephoneHint + '手机:' + Trim(AUser.Mobile); end; AListItem.HasMobilePhone := (Length(Trim(AUser.Mobile)) > 0) or (Length(Trim(ARemarkMobile)) > 0); AListItem.HasEmail := (Length(Trim(AUser.Email)) > 0); AListItem.HasSMS := AListItem.HasMobilePhone; AListItem.HeadImageHint := '单击显示联系人卡片'; if Length(Trim(ARemarkMobile)) > 0 then AListItem.MobilePhoneHint := Trim(ARemarkMobile) else AListItem.MobilePhoneHint := Trim(AUser.Mobile); AListItem.Mobile:=Trim(AUser.Mobile); AListItem.Tel := Trim(AUser.Tel); AListItem.HasMobilePhone := False; AListItem.MobilePhoneHint :=AListItem.MobilePhoneHint+ '(双击发送手机短信息)'; AListItem.TelephoneHint :=AListItem.TelephoneHint; AListItem.EmailHint := Trim(AUser.Email) + '(双击发送邮件)'; AListItem.SMSHint := AListItem.MobilePhoneHint; AListItem.CameraHint := '双击发送视频对话邀请'; AListItem.Company := AUser.Company; AListItem.HasTelephone := AListItem.HasTelephone and AListItem.ListView.ShowTelButton; AListItem.HasMobilePhone := AListItem.HasMobilePhone and AListItem.ListView.ShowMobileButton; AListItem.HasEmail := AListItem.HasEmail and AListItem.ListView.ShowEmailButton; AListItem.HasSMS := AListItem.HasSMS and AListItem.ListView.ShowSMSButton; if FileExists(AUser.HeadImageFile) then begin try if (AUser.HeadImageFileType = htGIF) then begin GIFImage := TGIFImage.Create; GIFImage.Animate := False; try GIFImage.LoadFromFile(AUser.HeadImageFile); AListItem.HeadImagePicture.Bitmap.Assign(GIFImage); finally GIFImage.Free; end; end else AListItem.HeadImagePicture.LoadFromFile(AUser.HeadImageFile); except AListItem.HeadImagePicture.Graphic := nil; end; end else AListItem.HeadImagePicture.Graphic := nil; AListItem.DisplayName := AUser.DisplayName; AListItem.LoginState := AUser.LoginState; AListItem.Data := AUser; end; procedure TUsersService.UpdateTreeNode(Employee: TRealICQEmployee; RealICQUser: TRealICQUser; AShowNavBarNumeric: Boolean); var GIFImage: TGIFImage; jo: IsuperObject; ARemarkTel, ARemarkMobile, ARemark: string; begin jo := TUserRemarkService.GetService.GetUserRemark(RealICQUser.LoginName); if jo <> nil then begin ARemark := jo.S['Remark']; ARemarkTel := jo.S['Phone']; ARemarkMobile := jo.S['Mobile']; end; Employee.HasCamera := RealICQUser.InstalledCamera; Employee.Watchword := RealICQUser.Watchword; Employee.LeaveMessage := RealICQUser.LeaveMessage; Employee.HasNewSNS := ShowSNS and RealICQUser.HasNewSNSUpdate; Employee.NewSNSHint := '个人空间最近有更新,点击查看'; Employee.HasTelephone := (Length(Trim(ARemarkTel)) > 0) or (Length(Trim(RealICQUser.Tel)) > 0) or (Length(Trim(RealICQUser.Mobile)) > 0); Employee.TelephoneHint := ''; if Length(Trim(ARemarkTel)) > 0 then begin Employee.TelephoneHint := Employee.TelephoneHint + '备注:' + Trim(ARemarkTel); end; if Length(Trim(RealICQUser.Tel)) > 0 then begin if Length(Trim(Employee.TelephoneHint)) > 0 then Employee.TelephoneHint := Employee.TelephoneHint + ' '; Employee.TelephoneHint := Employee.TelephoneHint + '电话:' + Trim(RealICQUser.Tel); end; if Length(Trim(RealICQUser.Mobile)) > 0 then begin if Length(Trim( Employee.TelephoneHint)) > 0 then Employee.TelephoneHint := Employee.TelephoneHint + ' '; Employee.TelephoneHint := Employee.TelephoneHint + '手机:' + Trim(RealICQUser.Mobile); end; Employee.HasMobilePhone := False; Employee.HasSMS :=(Length(Trim(RealICQUser.Mobile)) > 0); Employee.Tel := Trim(RealICQUser.Tel); Employee.Mobile := Trim(RealICQUser.Mobile); if Length(Trim(ARemarkMobile)) > 0 then Employee.MobilePhoneHint := Trim(ARemarkMobile) else Employee.MobilePhoneHint :=Trim(RealICQUser.Mobile); Employee.HeadImageHint := '单击显示联系人卡片'; Employee.TelephoneHint := Trim(Employee.TelephoneHint); Employee.AddFriendHint:='双击添加好友'; Employee.EmailHint := Trim(RealICQUser.Email) + '(双击发送邮件)'; Employee.SMSHint := Employee.MobilePhoneHint + '(双击发送手机短信息)'; Employee.CameraHint := '双击发送视频对话邀请'; if FileExists(RealICQUser.HeadImageFile) then begin try if (RealICQUser.HeadImageFileType = htGIF) then begin GIFImage := TGIFImage.Create; GIFImage.Animate := False; try GIFImage.LoadFromFile(RealICQUser.HeadImageFile); Employee.HeadImagePicture.Bitmap.Assign(GIFImage); finally GIFImage.Free; end; end else Employee.HeadImagePicture.LoadFromFile(RealICQUser.HeadImageFile); except Employee.HeadImagePicture.Graphic := nil; end; end else Employee.HeadImagePicture.Graphic := nil; Employee.DisplayName := RealICQUser.DisplayName; Employee.LoginState := RealICQUser.LoginState; Employee.Data := RealICQUser; // if AShowNavBarNumeric then Employee.Update; // if AShowNavBarNumeric then ShowNavBarNumeric; end; procedure TUsersService.UpdateUsersToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView); var iLoop, ItemIndex: Integer; RealICQUser: TRealICQUser; Employee: TRealICQEmployee; begin if ATreeView = nil then Exit; ATreeView.AdjustPosition :=False; ATreeView.HideSystemScrollBar; ATreeView.AutoChangeOnlineNumeric := True; ATreeView.OnItemOnline := nil; ATreeView.OnItemOffline := nil; ATreeView.BeginUpdate; try {$region '添加联系人'} for iLoop := AUsers.Count - 1 downto 0 do begin RealICQUser := AUsers.Objects[iLoop] as TRealICQUser; ItemIndex := ATreeView.EmployeeItems.IndexOf(RealICQUser.LoginName); if ItemIndex >= 0 then begin Employee := ATreeView.EmployeeItems.Objects[ItemIndex] as TRealICQEmployee; UpdateTreeNode(Employee, RealICQUser, False); end; end; {$endregion} PostMessage(ATreeView.Handle, WM_SIZE, 0, 0); finally ATreeView.EndUpdate; end; end; procedure TUsersService.UpdateTeamsMembers(AUsers: TStringList); var iLoop: Integer; begin for iLoop := 0 to AUsers.Count - 1 do TalkingFrm.UpdateTalkingForm(AUsers.Objects[iLoop] as TRealICQUser); end; procedure TUsersService.UpdateFriends(AUsers: TStringList); var iLoop,iIndex: Integer; AUser: TRealICQUser; ATreeView: TRealICQContacterTreeView; AFriend: TRealICQEmployee; begin iIndex:= MainForm.ContacterTreeViews.IndexOf(LvFriends); ATreeView := MainForm.ContacterTreeViews.Objects[iIndex] as TRealICQContacterTreeView; ATreeView.BeginUpdate; try for iLoop :=AUsers.Count - 1 downto 0 do begin AUser := AUsers.Objects[iLoop] as TRealICQUser; if AnsiSameText(AUser.LoginName, MainForm.RealICQClient.LoginName) then Continue; iIndex := ATreeView.EmployeeItems.IndexOf(AUser.LoginName); if (iIndex) < 0 then Continue; AFriend := ATreeView.EmployeeItems.Objects[iIndex] as TRealICQEmployee; UpdateTreeNode(AFriend, AUser, False); end; finally ATreeView.EndUpdate; end; end; procedure TUsersService.UpdateOrAddFriend(AUser: TRealICQUser); var iIndex: Integer; ATreeView: TRealICQContacterTreeView; AFriend: TRealICQEmployee; begin iIndex:= MainForm.ContacterTreeViews.IndexOf(LvFriends); ATreeView := MainForm.ContacterTreeViews.Objects[iIndex] as TRealICQContacterTreeView; ATreeView.BeginUpdate; try if AnsiSameText(AUser.LoginName, MainForm.RealICQClient.LoginName) then Exit; iIndex := ATreeView.EmployeeItems.IndexOf(AUser.LoginName); if (iIndex) >= 0 then AFriend := ATreeView.EmployeeItems.Objects[iIndex] as TRealICQEmployee else begin AFriend := TRealICQEmployee.Create(AUser.LoginName); AFriend.BranchID :=LVFriends; ATreeView.AddEmployee(AFriend); end; UpdateTreeNode(AFriend, AUser, False); finally ATreeView.EndUpdate; end; end; procedure TUsersService.UpdateOrAddFriends(AUsers: TStringList); var iLoop,iIndex: Integer; AUser: TRealICQUser; ATreeView: TRealICQContacterTreeView; AFriend: TRealICQEmployee; begin iIndex:= MainForm.ContacterTreeViews.IndexOf(LvFriends); ATreeView := MainForm.ContacterTreeViews.Objects[iIndex] as TRealICQContacterTreeView; ATreeView.BeginUpdate; try for iLoop :=AUsers.Count - 1 downto 0 do begin AUser := AUsers.Objects[iLoop] as TRealICQUser; if AnsiSameText(AUser.LoginName, MainForm.RealICQClient.LoginName) then Continue; iIndex := ATreeView.EmployeeItems.IndexOf(AUser.LoginName); if (iIndex) >= 0 then AFriend := ATreeView.EmployeeItems.Objects[iIndex] as TRealICQEmployee else begin AFriend := TRealICQEmployee.Create(AUser.LoginName); AFriend.BranchID :=LVFriends; ATreeView.AddEmployee(AFriend); end; UpdateTreeNode(AFriend, AUser, False); end; finally ATreeView.EndUpdate; end; end; procedure TUsersService.UpdateOrAddUsersToListView(AListView: TRealICQContacterListView; AUsers: TStringList); var iLoop, ItemIndex: Integer; RealICQUser: TRealICQUser; Employee: TRealICQContacterListItem; begin if AListView = nil then Exit; {$region '添加联系人'} for iLoop := AUsers.Count - 1 downto 0 do begin RealICQUser := AUsers.Objects[iLoop] as TRealICQUser; ItemIndex := AListView.Items.IndexOf(RealICQUser.LoginName); if ItemIndex >= 0 then begin Employee := AListView.Items.Objects[ItemIndex] as TRealICQContacterListItem; end else begin ItemIndex := AListView.Items.Add(RealICQUser.LoginName); Employee := AListView.Items.Objects[ItemIndex] as TRealICQContacterListItem; end; UpdateListItem(Employee, RealICQUser, False); end; {$endregion} PostMessage(AListView.Handle, WM_SIZE, 0, 0); AListView.ReDrawAll; end; procedure TUsersService.UpdateUserStateListView( AListView: TRealICQContacterListView; AUsers: TStringList); var iLoop, ItemIndex: Integer; RealICQUser: TRealICQUser; Employee: TRealICQContacterListItem; begin if AListView = nil then Exit; for iLoop := AUsers.Count - 1 downto 0 do begin RealICQUser := AUsers.Objects[iLoop] as TRealICQUser; ItemIndex := AListView.Items.IndexOf(RealICQUser.LoginName); if ItemIndex >= 0 then begin Employee := AListView.Items.Objects[ItemIndex] as TRealICQContacterListItem; Employee.LoginState := RealICQUser.LoginState; end; end; PostMessage(AListView.Handle, WM_SIZE, 0, 0); AListView.ReDrawAll; end; procedure TUsersService.UpdateUserStateToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView); var iLoop, ItemIndex: Integer; RealICQUser: TRealICQUser; Employee: TRealICQEmployee; begin if ATreeView = nil then Exit; ATreeView.AdjustPosition :=False; ATreeView.HideSystemScrollBar; ATreeView.AutoChangeOnlineNumeric := True; ATreeView.OnItemOnline := nil; ATreeView.OnItemOffline := nil; ATreeView.BeginUpdate; try {$region '添加联系人'} for iLoop := AUsers.Count - 1 downto 0 do begin RealICQUser := AUsers.Objects[iLoop] as TRealICQUser; ItemIndex := ATreeView.EmployeeItems.IndexOf(RealICQUser.LoginName); if ItemIndex >= 0 then begin Employee := ATreeView.EmployeeItems.Objects[ItemIndex] as TRealICQEmployee; Employee.LoginState := RealICQUser.LoginState; end; end; {$endregion} PostMessage(ATreeView.Handle, WM_SIZE, 0, 0); finally ATreeView.EndUpdate; end; end; procedure TUsersService.UpdateUsersToListView(AListView: TRealICQContacterListView; AUsers: TStringList); var iLoop, ItemIndex: Integer; RealICQUser: TRealICQUser; Employee: TRealICQContacterListItem; begin if AListView = nil then Exit; {$region '添加联系人'} for iLoop := AUsers.Count - 1 downto 0 do begin RealICQUser := AUsers.Objects[iLoop] as TRealICQUser; ItemIndex := AListView.Items.IndexOf(RealICQUser.LoginName); if ItemIndex >= 0 then begin Employee := AListView.Items.Objects[ItemIndex] as TRealICQContacterListItem; UpdateListItem(Employee, RealICQUser, False); end; end; {$endregion} PostMessage(AListView.Handle, WM_SIZE, 0, 0); AListView.ReDrawAll; end; procedure TUsersService.UpdateOrAddUsersToTreeView(AUsers: TStringList; ATreeView: TRealICQContacterTreeView; ABranchID: string = ''); var iLoop, ItemIndex: Integer; RealICQUser: TRealICQUser; Employee: TRealICQEmployee; TmpBranch : TRealICQBranch; ParentNode: TTreeNode; BranchInfo: TRealICQBranchInfo; procedure CalculateEmployeeCount(AParentNode: TTreeNode; IsAddOnline: Boolean); begin while AParentNode <> nil do begin TmpBranch := AParentNode.Data; if IsAddOnline then TmpBranch.OnlineEmployee:=TmpBranch.OnlineEmployee + 1 else TmpBranch.OnlineEmployee:=TmpBranch.OnlineEmployee - 1; AParentNode := AParentNode.Parent; end end; begin if ATreeView = nil then Exit; if (ABranchID <> '') and (ATreeView.BranchItems.IndexOf(ABranchID) < 0) then Exit; ATreeView.AdjustPosition :=False; ATreeView.HideSystemScrollBar; ATreeView.AutoChangeOnlineNumeric := True; ATreeView.OnItemOnline := nil; ATreeView.OnItemOffline := nil; ATreeView.BeginUpdate; try {$region '添加联系人'} for iLoop := AUsers.Count - 1 downto 0 do begin RealICQUser := AUsers.Objects[iLoop] as TRealICQUser; ItemIndex := ATreeView.EmployeeItems.IndexOf(RealICQUser.LoginName); if ItemIndex >= 0 then begin Employee := ATreeView.EmployeeItems.Objects[ItemIndex] as TRealICQEmployee; CalculateEmployeeCount(Employee.Node.Parent, ((Employee.LoginState = stOffline) or (Employee.LoginState = stHidden)) and ((RealICQUser.LoginState <> stOffline) and (RealICQUser.LoginState <> stHidden))); UpdateTreeNode(Employee, RealICQUser, False); Continue; end; Employee := TRealICQEmployee.Create(RealICQUser.LoginName); if True then if ABranchID <> '' then Employee.BranchID := ABranchID else Employee.BranchID := RealICQUser.BranchID; Employee.HasAddFreindButton:=True; Employee.HasEmail := False; Employee.SeeInfoPermissions:=RealICQUser.SeeInfoPermissions; ATreeView.AddEmployee(Employee); ParentNode := Employee.Node.Parent; // if (RealICQUser.LoginState <> stOffline) and (RealICQUser.LoginState <> stHidden) then // CalculateEmployeeCount(Employee.Node.Parent, true); UpdateTreeNode(Employee, RealICQUser, False); // while ParentNode <> nil do // begin // TmpBranch :=ParentNode.Data; // TmpBranch.EmployeeCount:=TmpBranch.EmployeeCount-1; // if (Employee.LoginState <> stOffline) and (Employee.LoginState <> stHidden ) then // TmpBranch.OnlineEmployee:=TmpBranch.OnlineEmployee-1; // ParentNode := ParentNode.Parent; // end; // if Assigned(Employee.Node.Parent) then // begin // UpdateTreeNode(Employee, RealICQUser, False); // if (not Assigned(Employee.Node.Parent.Parent)) // and (Employee.LoginState<>stOffline) // and (Employee.LoginState<>stHidden ) then // begin // TmpBranch:=Employee.Node.Parent.data; // TmpBranch.OnlineEmployee:=TmpBranch.OnlineEmployee - 1; // TmpBranch.EmployeeCount:=TmpBranch.EmployeeCount - 1; // TmpBranch.Update; // end; // end // else // begin // ATreeView.EmployeeItems.Delete(ATreeView.EmployeeItems.IndexOf(RealICQUser.LoginName)); // FreeAndNil(Employee); // end; end; {$endregion} PostMessage(ATreeView.Handle, WM_SIZE, 0, 0); finally ATreeView.EndUpdate; end; end; procedure TUsersService.HandleBranchUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient); var joBranchs: ISuperObject; item: TSuperAvlEntry; AServerID: string; AUsers: TStringList; begin joBranchs := AJo.O['bs']; AServerID := AJo.S['s']; for item in joBranchs.AsObject do begin try AUsers := InitAndRequestUsers(item.Value, ARealICQClient); DoGettedUsersByBranchID(AServerID, item.Name, AUsers); finally if AUsers <> nil then FreeAndNil(AUsers); end; end; end; procedure TUsersService.HandleCompanyUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient); var AUsers: TStringList; IsCompleted: Boolean; AItem: TSuperAvlEntry; ABranchs: TSuperTableString; AEmployee: TRealICQEmployee; ATreeVeiw: TRealICQContacterTreeView; Branch: TRealICQBranch; ParentNode: TTreeNode; // AsynAction: TAsynRequestUserInfo; begin IsCompleted := AJo.B['completed']; ABranchs := AJo.O['bs'].AsObject; // AsynAction := TAsynRequestUserInfo.Create; for AItem in ABranchs do begin try AUsers := InitAndRequestUsers(AItem.Value, ARealICQClient, False, TWorkmatesService.GetService.WorkmatesNeedUpdate); TWorkmatesService.GetService.AddWorkmates(AUsers); DoGettedCompanyUsers(AUsers, AItem.Name); except on E: Exception do begin Error(E.Message, 'TUsersService.HandleCompanyUsers'); FreeAndNil(AUsers); end; end; FreeAndNil(AUsers); end; if IsCompleted then begin TWorkmatesService.GetService.RequstUserInfos; Sleep(100); ARealICQClient.SendDeviceChanged; Sleep(100); ARealICQClient.SendGetBlacklists; Sleep(100); ARealICQClient.SendGetWebTabs; Sleep(100); TWorkmatesService.GetService.RequestUserStatus; ARealICQClient.LoadPersonalConfigs; MainForm.RealICQClientGettedFriendList(nil); ATreeVeiw := GetTreeView(LVMyContacters); ATreeVeiw.OnHeadImageMouseEnter := Mainform.NodeOnHeadImageMouseEnter; ATreeVeiw.OnHeadImageMouseLeave := Mainform.NodeOnHeadImageMouseLeave; AEmployee := ATreeVeiw.GetEmployee(ARealICQClient.Me.LoginName); ParentNode := AEmployee.Node.Parent; while ParentNode <> nil do begin ParentNode.Expanded := True; Branch:=ParentNode.Data; Branch.IsGetUserList:=True; ParentNode := ParentNode.Parent; end; ATreeVeiw.MoveScrollBarToTop; end; // if AsynAction.Users.Count > 0 then // AsynAction.Resume // else // FreeAndNil(AsynAction); end; procedure TUsersService.HandleDetailWorkmates(AJo: ISuperObject; ARealICQClient: TRealICQClient); var AUsers: TStringList; begin InitAndSaveUsers(AJo, ARealICQClient, uutCompany); end; procedure TUsersService.HandleDetailFriends(AJo: ISuperObject; ARealICQClient: TRealICQClient); var AUsers: TStringList; begin InitAndSaveUsers(AJo, ARealICQClient, uutFriend); // AUsers := InitAndSaveUsers(AJo, ARealICQClient); // try // UpdateFriends(AUsers); // finally // FreeAndNil(AUsers); // end; end; procedure TUsersService.HandleFriends(AJo: ISuperObject; ARealICQClient: TRealICQClient); var AUserJos: TInterfaceList; AUsers: TStringList; AFriendsNeedRequest: TStrings; begin AUsers := InitAndRequestUsers(AJo, ARealICQClient, False); try AUserJos := GetSimpleUserJsons(Ausers); RequestUserDetailByUserSimple(FRIENDS_DETAIL_PROLOCOL, AUserJos, ARealICQClient); DoGettedFriends(AUsers); finally FreeAndNil(AUsers); end; end; procedure TUsersService.HandleMessage(ASender: TObject; const AData: TBytes); var AProtocol: Byte; ALen: SmallInt; AJson: string; AJo: ISuperObject; begin AProtocol := AData[0]; CopyMemory(@ALen, @AData[1], 2); SetLength(AJson, ALen); CopyMemory(PChar(AJson), @AData[3], ALen); if AJson = '' then Exit; try AJo := SO(AJson); except on E: Exception do Error('转化不了:'+AJson, 'TUsersService.HandleMessage'); end; try // SUCCESS('协议:'+ IntToHex(AProtocol, 2), 'TUsersService.HandleMessage'); case AProtocol of $00: HandleUserInformations(AJo, ASender as TRealICQClient); $01: HandleBranchUsers(AJo, ASender as TRealICQClient); $02: HandleCompanyUsers(AJo, ASender as TRealICQClient); $03: HandleFriends(AJo, ASender as TRealICQClient); $04: HandleTeamUsers(AJo, ASender as TRealICQClient); $05: HandleDetailFriends(AJo, ASender as TRealICQClient); $06: TWorkmatesService.GetService.HandleUsersStatus(AJo); $07: HandleDetailWorkmates(AJo, ASender as TRealICQClient); $08: TTeamsService.GetService.HandleTeamMemberssStatus(AJo); $09: TFriendsService.GetService.HandeFriendsState(AJo); end; except on E: Exception do Error('协议处理错误:'+ E.Message, IntToHex(AProtocol, 2)); end; end; procedure TUsersService.HandleTeamUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient); var AUsers: TStringList; begin InitAndSaveUsers(AJo, ARealICQClient, uutTeam); // try // UpdateTeamsMembers(AUsers); // finally // FreeAndNil(AUsers); // end; end; function TUsersService.InitAndSaveUsers(AJo: ISuperObject; ARealICQClient: TRealICQClient; AUpdateType: TUpdateUIType = uutAll): TStringList; var iLoop: Integer; joUser: ISuperObject; ja: TSuperArray; AServerid: string; AKeyValues: TKeyValues; AUser: TRealICQUser; AUSers: TStringList; ATreeView: TRealICQContacterTreeView; ATime: Cardinal; procedure UpdateDataAndUI; var jLoop: Integer; begin if (AUsers = nil) or (AUsers.Count = 0) then Exit; case AUpdateType of uutAll: ; uutTeam: begin AUsersService.UpdateTeamsMembers(AUsers); Exit; end; uutFriend: begin AUsersService.UpdateFriends(AUsers); Exit; end; uutCompany: begin if SameText(AServerID, MainForm.RealICQClient.ServerID) then begin ATreeView := AUsersService.GetTreeView(LVMyContacters); if ATreeView <> nil then AUsersService.UpdateUsersToTreeView(AUsers, ATreeView); end; Exit; end; end; if SameText(AServerID, MainForm.RealICQClient.ServerID) then begin ATreeView := GetTreeView(LVMyContacters); if ATreeView <> nil then UpdateUsersToTreeView(AUsers, ATreeView); end; if SameText(AServerID, MainForm.CurrentServerID) then begin ATreeView := GetTreeView(LVMoreUsers); if ATreeView <> nil then UpdateUsersToTreeView(AUsers, ATreeView); end; for jLoop := 0 to AUsers.Count - 1 do begin AUser := AUsers.Objects[jLoop] as TRealICQUser; UpdateSeeInformationForm(AUser.LoginName); UpdateTalkingForm(AUser); UpdateSMSForm(AUser); UpdateMemberInfoOfTeamOptionsForm(AUser); Mainform.UpdateAddrBookInfo(AUser); if (Length(AUser.HeadImageFile) > 0) and not FileExists(AUser.HeadImageFile) then MainForm.RealICQClient.SendDownloadHeadImageRequest(AUser.LoginName); end; UpdateUsersToListView(Mainform.FLVLatests, AUsers); UpdateTeamsMembers(AUsers); UpdateFriends(AUsers); end; begin if AJo = nil then Exit; ja := AJo.A['us']; AServerid := AJo.S['s']; SetLength(AKeyValues, ja.Length); 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']); AKeyValues[iLoop][0] := joUser.S['l']; AKeyValues[iLoop][1] := joUser.AsJSon(); AKeyValues[iLoop][2] := IntToStr(joUser.I['v']); AUser := GetOrCreateUser(joUser.S['l'], MainForm.RealICQClient); AUser.IsComparedVer := True; InitUserObject(AUser, joUser); AUsers.AddObject(AUser.LoginName, AUser); end; try // ATime := GetTickCount; GetUsersHashProvider.Insert(AKeyValues); // Log(Format('SQLite插入数据耗时:%dms',[GetTickCount - ATime]), '数据库性能监控'); except on E: Exception do begin Error(E.Message, 'TAsynResponseUserInfo.Execute'); UpdateDataAndUI; FreeAndNil(AUsers); end; end; // ATime := GetTickCount; UpdateDataAndUI; // Log(Format('UI更新耗时:%dms',[GetTickCount - ATime]), 'UI性能监控'); FreeAndNil(AUsers); end; //var // iLoop: Integer; // joUser: ISuperObject; // ja: TSuperArray; // AUser: TRealICQUser; // AKeyValues: TKeyValues; // AServerid: string; // AsynAction: TAsynResponseUserInfo; //begin // ja := AJo.A['us']; // AServerid := AJo.S['s']; // if ja.Length > 5 then // begin // AsynAction := TAsynResponseUserInfo.Create; // AsynAction.JoUsers := AJo; // AsynAction.UpdateType := AUpdateType; // AsynAction.Resume; // Exit; // end; // Result := TStringList.Create; // SetLength(AKeyValues, ja.Length); // for iLoop := 0 to ja.Length - 1 do // begin // joUser := ja[iLoop]; // if joUser.S['l'] = '' then // Continue; // joUser.S['l'] := FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']); // AKeyValues[iLoop][0] := joUser.S['l']; // AKeyValues[iLoop][1] := joUser.AsJSon(); // AKeyValues[iLoop][2] := IntToStr(joUser.I['v']); // AUser := GetOrCreateUser(joUser.S['l'], ARealICQClient); // InitUserObject(AUser, joUser); // Result.AddObject(AUser.LoginName, AUser); // end; // // GetUsersHashProvider.Insert(AKeyValues); //end; procedure TUsersService.HandleUserInformations(AJo: ISuperObject; ARealICQClient: TRealICQClient); var ja: TSuperArray; AServerid: string; AUsers: TStringList; AsynAction: TAsynResponseUserInfo; begin InitAndSaveUsers(AJo, ARealICQClient); // ja := AJo.A['us']; // AServerid := AJo.S['s']; // if ja.Length > 5 then // begin // AsynAction := TAsynResponseUserInfo.Create; // AsynAction.JoUsers := AJo; // AsynAction.Resume; // Exit; // end; // AUsers := InitAndSaveUsers(AJo, ARealICQClient); // // try // DoReceivedUserInformations(AServerid, AUsers); // finally // FreeAndNil(AUsers); // end; end; //'{"uid":"lsyehui", //"tel":"", //"sex":2, //"mob":"", //"bid":837000001, //"position":1, //"secret":1, //"v":1, //"remark":{}, remark怎么是对象 //"showMob":true,不需要 //"uType":0, 不需要 //"Watchword":"", //"address":null, 不需要 //"email":"", //"branch":"", //"sMob":"", //"name":"\u53f6\u6167", //"icon":"", //"duty":"", //"comp":"\u534f\u540c\u529e\u516c\u5c0f\u7ec4", //"iconType":0, //"officeID":""}' procedure TUsersService.RequestUserDetailByLoginName(AProtocol: Byte; ALoginName: TInterfaceList; ARealICQClient: TRealICQClient); var ALen: Integer; AJoData, AJoData2: ISuperObject; AUserArray, AUserArray2: TSuperArray; AUsers: TStringList; begin if ALoginName = nil then Exit; while ALoginName.Count > 0 do begin AJoData := ALoginName[0] as ISuperObject; ALoginName.Delete(0); if not PacketAndSend(AProtocol, AJoData, ARealICQClient) then begin AJoData2 := SO(); AJoData2.S['s'] := AJoData.S['s']; AJoData2.N['us'] := SO('[]'); AUserArray := AJoData.A['us']; AUserArray2 := AJoData2.A['us']; ALen := AUserArray.Length div 2; while AUserArray.Length > ALen do begin AUserArray2.Add(AUserArray.S[0]); AUserArray.Delete(0); end; ALoginName.Add(AJoData2); ALoginName.Add(AJoData); end; end; end; procedure TUsersService.RequestUserDetailByUserSimple(AProtocol: Byte; AUserSimples: TInterfaceList; ARealICQClient: TRealICQClient); var ALen: Integer; AJoData, AJoData2: ISuperObject; AUserArray, AUserArray2: TSuperArray; AUsers: TStringList; begin if AUserSimples = nil then Exit; while AUserSimples.Count > 0 do begin AJoData := AUserSimples[0] as ISuperObject; AUserSimples.Delete(0); if not PacketAndSend(AProtocol, AJoData, ARealICQClient) then begin AJoData2 := SO(); AJoData2.S['s'] := AJoData.S['s']; AJoData2.N['us'] := SO('[]'); AUserArray := AJoData.A['us']; AUserArray2 := AJoData2.A['us']; ALen := AUserArray.Length div 2; while AUserArray.Length > ALen do begin AUserArray2.Add(AUserArray.O[0]); AUserArray.Delete(0); end; AUserSimples.Add(AJoData2); AUserSimples.Add(AJoData); end; end; end; procedure TUsersService.RequestUserInformations(ALoginNames: array of string; ARealICQClient: TRealICQClient); var AJos: TInterfaceList; begin try AJos := GetLoginNamesJsons(ALoginNames); RequestUserDetailByLoginName(USERINFO_PROLOCOL, AJos, ARealICQClient); except on E: Exception do begin Error(E.Message, 'TUsersService.RequestUserInformations'); FreeAndNil(AJos); end; end; end; end.