FriendsService.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. unit FriendsService;
  2. interface
  3. uses
  4. StrUtils, SysUtils, Windows, superobject, Classes, BaseService;
  5. type
  6. TFriendsService = class(TBaseService)
  7. private
  8. FFriends: TStrings;
  9. public
  10. function GetFriends: TStringList;
  11. procedure Init;
  12. procedure Uninstall;
  13. procedure AddFriends(AFriends: TStrings);
  14. procedure AddFriend(AFriend: TObject);
  15. function IsFriend(ALoginName: string): Boolean;
  16. constructor Create;
  17. destructor Destroy; override;
  18. class function GetService: TFriendsService; static;
  19. /// <summary>
  20. /// 批量处理好友状态,处理09协议
  21. /// </summary>
  22. /// <param name="AJo"></param>
  23. procedure HandeFriendsState(AJo: ISuperObject);
  24. procedure RequestUserStatus(AUsers: TStringList);
  25. end;
  26. implementation
  27. uses
  28. MainFrm, DataProviderImport, InterfaceDataProvider, LoggerImport, Messages,
  29. UsersService, RealICQClient, AsynRequestUserStatus, RealICQModel;
  30. var
  31. AFriendsService: TFriendsService;
  32. { TFriendsService }
  33. function TFriendsService.GetFriends: TStringList;
  34. var
  35. tmpList: TStringList;
  36. begin
  37. tmpList := TStringList.Create;
  38. tmpList.AddStrings(FFriends);
  39. try
  40. Result := TUsersService.GetUsersService.GetOrCreateUsers(tmpList);
  41. finally
  42. FreeAndNil(tmpList);
  43. end;
  44. end;
  45. procedure TFriendsService.RequestUserStatus(AUsers: TStringList);
  46. var
  47. AsynAction: TAsynRequestUserStatus;
  48. begin
  49. AsynAction := TAsynRequestUserStatus.Create(True);
  50. AsynAction.Protocol := FRIENDS_USERSTATE_PROLOCOL;
  51. AsynAction.Users := TStringList.Create;
  52. AsynAction.Users.AddStrings(AUsers);
  53. AsynAction.Resume;
  54. end;
  55. procedure TFriendsService.Init;
  56. begin
  57. Uninstall;
  58. end;
  59. function TFriendsService.IsFriend(ALoginName: string): Boolean;
  60. begin
  61. Result := FFriends.IndexOf(ALoginName) >= 0;
  62. end;
  63. procedure TFriendsService.Uninstall;
  64. begin
  65. FFriends.Clear;
  66. end;
  67. destructor TFriendsService.Destroy;
  68. begin
  69. FreeAndNil(FFriends);
  70. Inherited;
  71. end;
  72. procedure TFriendsService.AddFriend(AFriend: TObject);
  73. begin
  74. if not AFriend.ClassNameIs('TRealICQUser') then
  75. Exit;
  76. FFriends.Add((AFriend as TRealICQUser).LoginName);
  77. TUsersService.GetUsersService.UpdateOrAddFriend(AFriend as TRealICQUser);
  78. end;
  79. procedure TFriendsService.AddFriends(AFriends: TStrings);
  80. var
  81. iLoop: Integer;
  82. begin
  83. for iLoop := 0 to AFriends.Count - 1 do
  84. if FFriends.IndexOf(AFriends[iLoop]) < 0 then
  85. FFriends.Add(AFriends[iLoop]);
  86. end;
  87. constructor TFriendsService.Create;
  88. begin
  89. FFriends := TStringList.Create;
  90. Inherited;
  91. end;
  92. class function TFriendsService.GetService: TFriendsService;
  93. begin
  94. if AFriendsService = nil then
  95. AFriendsService := TFriendsService.Create;
  96. Result := AFriendsService;
  97. end;
  98. procedure TFriendsService.HandeFriendsState(AJo: ISuperObject);
  99. var
  100. iLoop: Integer;
  101. joUser: ISuperObject;
  102. ja: TSuperArray;
  103. AServerid: string;
  104. // AKeyValues: TKeyValues;
  105. AUser: TRealICQUser;
  106. AUSers: TStringList;
  107. // ATreeView: TRealICQContacterTreeView;
  108. begin
  109. ja := AJo.A['us'];
  110. AServerid := AJo.S['s'];
  111. AUsers := TStringList.Create;
  112. for iLoop := 0 to ja.Length - 1 do
  113. begin
  114. joUser := ja[iLoop];
  115. if joUser.S['l'] = '' then
  116. Continue;
  117. joUser.S['l'] := TUsersService.FullLoginName(MainForm.RealICQClient.CenterServerID, AServerid, joUser.S['l']);
  118. AUser := TUsersService.GetUsersService.GetUser(joUser.S['l']);
  119. if AUser = nil then
  120. Continue;
  121. AUser.LoginState := TRealICQLoginState(joUser.I['os']);
  122. AUsers.AddObject(AUser.LoginName, AUser);
  123. end;
  124. if AUsers.Count = 0 then
  125. Exit;
  126. try
  127. TUsersService.GetUsersService.UpdateUserStateToTreeView(AUsers, GetTreeView(LvFriends));
  128. finally
  129. FreeAndNil(AUsers);
  130. end;
  131. end;
  132. end.