GroupService.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. unit GroupService;
  2. interface
  3. uses
  4. StrUtils, SysUtils, Windows, superobject, Classes, GroupClient, RealICQModel,
  5. xFonts, Graphics, DownloadFileFromWeb, DateUtils;
  6. type
  7. TGroupService = class
  8. private
  9. FTeams: TStringList;
  10. FLoginName: string;
  11. FGroupClient: TGroupClient;
  12. FDownFile: TDownFile;
  13. function RemoveMembers(AMembers: string; ARemoveMembers: TStrings): string;
  14. function AddMembers(AMembers: string; ANewMembers: TStrings): string;
  15. procedure DownFaceFileComplete(Source_file, Dest_file: string; blStatus: boolean; ErrMessage: string);
  16. function AddMember(AMembers, ANewMember: string): string;
  17. public
  18. procedure Init(ALoginName: string);
  19. procedure Uninstall;
  20. class function GetService: TGroupService; static;
  21. constructor Create;
  22. destructor Destroy; override;
  23. { TODO -olqq -c : 群组请求 2015/6/8 11:09:05 }
  24. procedure QuitTeam(ATeamID: string);
  25. procedure DisbandTeam(ATeamID: string);
  26. procedure UpdateTeam(ATeamID, AIntro, ANotice, AName: string; AAuth: Integer);
  27. procedure CreateTeam(ATeamName, ATeamCallBoard, ATeamIntro: string; ATeamMembers: TStringList; AIsTempTeam: Boolean; ATeamValidateType: TRealICQTeamValidateType);
  28. procedure SearchTeam(AKey: string; ASearchType: TRealICQTeamSearchType; AMatchingType: TRealICQMatchingType; APage: Integer);
  29. procedure AddTeamMembers(ATeamID: string; AAddMembers: TStringList);
  30. procedure RemoveTeamMembers(ATeamID: string; ARemoveMembers: TStringList);
  31. procedure UpdateTeamMembers(ATeamID: string; AOldMembers, ANewMembers: TStringList);
  32. function RemoveManager(ATeamID, ALoginName: string): Boolean;
  33. function AddManager(ATeamID, ALoginName: string): Boolean;
  34. procedure SetAlias(ATeamID, ALoginName, Alias: string);
  35. function GetAlias(ATeamID, ALoginName: string): string;
  36. procedure JoinTeam(ATeamID, ATag: string);
  37. procedure JoinTeamResponse(ATeamID, ALoginName, ATag: string; Accepted: Boolean);
  38. procedure SendTeamMessage(ATeamID, ASender, AMsg: string; AFont: TFont; AFaces: TStringList; Attachs: string);
  39. function IsTeamManager(ATeamID, ALoginName: string): Boolean;
  40. function GetTeam(ATeamID: string): TRealICQTeam;
  41. function GetTeams: TStringList;
  42. procedure MessageMiscMust(ATeamID: string);
  43. { TODO -olqq -c : 群组信息反馈 2015/6/8 11:08:43 }
  44. procedure OnMessageReaded(ATeamID: string; ts: Int64);
  45. procedure OnAddedTeam(ATeam: TRealICQTeam; ts: Int64 = 0);
  46. procedure OnDeletedTeam(ATeamID: string);
  47. procedure OnTeamInfoChange(ATeam: TRealICQTeam);
  48. procedure OnSearched(ARecords: TStringList; ASkip, ALimit: Integer); overload;
  49. procedure OnAddedMembers(ATeamID: string; AMembers: TStrings);
  50. procedure OnAddedManagers(ATeamID: string; AManagers: TStrings);
  51. procedure OnDeletedMembers(ATeamID: string; AMembers: TStrings);
  52. procedure OnDeletedManagers(ATeamID: string; AManagers: TStrings);
  53. procedure OnReceivedApplyBoardcast(ATeamID, ALoginName, ATag: string);
  54. procedure OnReceivedReplyBoardcast(ATeamID, ALoginName, ATag: string; ARet: Integer);
  55. procedure OnMessage(ATeamID, ASender, AContent, AStyle: string; ASendTime: TDateTime; AMSGType, ALength: Integer);
  56. procedure OnUploaded(ADownloadURL, AFileName: string);
  57. end;
  58. {$INCLUDE LXTalk.inc}
  59. implementation
  60. uses
  61. MainFrm, SearchTeamFrm, RealICQUtils, ShareUtils, RealICQClient, LoggerImport,
  62. RealICQUtility, ConditionConfig, IdURI, IdHTTP, HTTPApp, IdTStrings;
  63. var
  64. AGroupService: TGroupService;
  65. procedure ClearStringList(AStringList: TStringList);
  66. var
  67. AObj: TObject;
  68. begin
  69. if AStringList = nil then
  70. Exit;
  71. while AStringList.Count > 0 do
  72. begin
  73. Aobj := AStringList.Objects[0];
  74. AStringList.Delete(0);
  75. FreeAndNil(AObj);
  76. end;
  77. end;
  78. { TGroupService }
  79. function TGroupService.AddManager(ATeamID, ALoginName: string): Boolean;
  80. var
  81. AManagers: TStringList;
  82. begin
  83. if Trim(ALoginName) = '' then
  84. Exit;
  85. AManagers := TStringList.Create;
  86. try
  87. AManagers.Add(ALoginName);
  88. FGroupClient.AddTeamMembers(ATeamID, nil, AManagers);
  89. finally
  90. AManagers.Free;
  91. end;
  92. end;
  93. function TGroupService.AddMembers(AMembers: string; ANewMembers: TStrings): string;
  94. var
  95. iLoop: Integer;
  96. AMemberList: TStrings;
  97. begin
  98. iLoop := 0;
  99. Result := '';
  100. AMemberList := SplitString(AMembers, Chr(10));
  101. try
  102. for iLoop := AMemberList.Count - 1 downto 0 do
  103. begin
  104. if Length(Trim(AMemberList[iLoop])) = 0 then
  105. AMemberList.Delete(iLoop);
  106. end;
  107. for iLoop := 0 to ANewMembers.Count - 1 do
  108. if AMemberList.IndexOf(ANewMembers[iLoop]) < 0 then
  109. AMemberList.Add(ANewMembers[iLoop]);
  110. iLoop := 0;
  111. while iLoop < AMemberList.Count - 1 do
  112. begin
  113. Result := Result + AMemberList[iLoop] + Chr(10);
  114. Inc(iLoop);
  115. end;
  116. Result := Result + AMemberList[iLoop]
  117. finally
  118. AMemberList.Free;
  119. end;
  120. end;
  121. function TGroupService.AddMember(AMembers: string; ANewMember: string): string;
  122. begin
  123. Result := AMembers;
  124. if Pos(ANewMember, AMembers) > 0 then
  125. Exit;
  126. Result := AMembers + Chr(10) + ANewMember;
  127. end;
  128. procedure TGroupService.AddTeamMembers(ATeamID: string; AAddMembers: TStringList);
  129. begin
  130. FGroupClient.AddTeamMembers(ATeamID, AAddMembers, nil);
  131. end;
  132. constructor TGroupService.Create;
  133. begin
  134. FTeams := TStringList.Create;
  135. FGroupClient := TGroupClient.Create;
  136. FDownFile := TDownFile.Create;
  137. inherited;
  138. end;
  139. procedure TGroupService.CreateTeam(ATeamName, ATeamCallBoard, ATeamIntro: string; ATeamMembers: TStringList; AIsTempTeam: Boolean; ATeamValidateType: TRealICQTeamValidateType);
  140. begin
  141. FGroupClient.CreateTeam(ATeamName, ATeamCallBoard, ATeamIntro, ATeamMembers, AIsTempTeam);
  142. end;
  143. procedure TGroupService.RemoveTeamMembers(ATeamID: string; ARemoveMembers: TStringList);
  144. begin
  145. FGroupClient.RemoveTeamMembers(ATeamID, ARemoveMembers, nil);
  146. end;
  147. destructor TGroupService.Destroy;
  148. begin
  149. ClearStringList(FTeams);
  150. FreeAndNil(FGroupClient);
  151. FreeAndNil(FDownFile);
  152. inherited;
  153. end;
  154. procedure TGroupService.DisbandTeam(ATeamID: string);
  155. begin
  156. FGroupClient.RemoveTeam(ATeamID);
  157. end;
  158. function TGroupService.GetAlias(ATeamID, ALoginName: string): string;
  159. begin
  160. end;
  161. class function TGroupService.GetService: TGroupService;
  162. begin
  163. if AGroupService = nil then
  164. AGroupService := TGroupService.Create;
  165. Result := AGroupService;
  166. end;
  167. function TGroupService.GetTeam(ATeamID: string): TRealICQTeam;
  168. var
  169. iIndex: Integer;
  170. ATeam: TRealICQTeam;
  171. begin
  172. ATeam := nil;
  173. iIndex := FTeams.IndexOf(ATeamID);
  174. if iIndex > -1 then
  175. ATeam := FTeams.Objects[iIndex] as TRealICQTeam;
  176. Result := ATeam;
  177. end;
  178. function TGroupService.GetTeams: TStringList;
  179. begin
  180. Result := FTeams;
  181. end;
  182. procedure TGroupService.Init(ALoginName: string);
  183. begin
  184. FLoginName := ALoginName;
  185. FGroupClient.Connect(ALoginName);
  186. end;
  187. function TGroupService.IsTeamManager(ATeamID, ALoginName: string): Boolean;
  188. var
  189. iIndex: Integer;
  190. ATempTeam: TRealICQTeam;
  191. begin
  192. iIndex := FTeams.IndexOf(ATeamID);
  193. ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
  194. if (AnsiPos(Chr(10) + ALoginName + Chr(10), Chr(10) + ATempTeam.TeamManagers + Chr(10)) > 0) or (AnsiSameText(ALoginName, ATempTeam.TeamCreater)) then
  195. Result := True
  196. else
  197. Result := False;
  198. end;
  199. procedure TGroupService.JoinTeam(ATeamID, ATag: string);
  200. begin
  201. FGroupClient.JoinTeam(ATeamID, ATag);
  202. end;
  203. procedure TGroupService.JoinTeamResponse(ATeamID, ALoginName, ATag: string; Accepted: Boolean);
  204. begin
  205. FGroupClient.JoinTeamResponse(ATeamID, ALoginName, ATag, Accepted);
  206. end;
  207. procedure TGroupService.OnAddedManagers(ATeamID: string; AManagers: TStrings);
  208. var
  209. iLoop, iIndex: Integer;
  210. ATempTeam: TRealICQTeam;
  211. begin
  212. iIndex := FTeams.IndexOf(ATeamID);
  213. if iIndex < 0 then
  214. Exit;
  215. ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
  216. ATempTeam.TeamManagers := AddMembers(ATempTeam.TeamManagers, AManagers);
  217. MainForm.WebSocketSendReadTeamInfo(ATempTeam.TeamID);
  218. end;
  219. procedure TGroupService.OnAddedMembers(ATeamID: string; AMembers: TStrings);
  220. var
  221. iLoop, iIndex: Integer;
  222. ATempTeam: TRealICQTeam;
  223. begin
  224. iIndex := FTeams.IndexOf(ATeamID);
  225. if iIndex < 0 then
  226. begin
  227. FGroupClient.AsynTeam(ATeamID);
  228. Exit;
  229. end;
  230. ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
  231. ATempTeam.TeamMembers := AddMembers(ATempTeam.TeamMembers, AMembers);
  232. MainForm.WebSocketSendReadTeamInfo(ATempTeam.TeamID);
  233. end;
  234. procedure TGroupService.OnAddedTeam(ATeam: TRealICQTeam; ts: Int64);
  235. var
  236. iIndex: Integer;
  237. ATempTeam: TObject;
  238. LastMessageTime: TDateTime;
  239. LastMessageTimeTs: Int64;
  240. begin
  241. iIndex := FTeams.IndexOf(ATeam.TeamID);
  242. if iIndex > -1 then
  243. begin
  244. ATempTeam := FTeams.Objects[iIndex];
  245. if ATempTeam <> nil then
  246. FreeAndNil(ATempTeam);
  247. FTeams.Delete(iIndex);
  248. end;
  249. FTeams.AddObject(ATeam.TeamID, ATeam.Clone);
  250. MainForm.WebSocketSendReadTeamInfo(ATeam.TeamID);
  251. {$IFNDEF OldGroup}
  252. LastMessageTime := MainForm.DBHistory.GetLastMessageTimeByTeamID(ATeam.TeamID);
  253. if (LastMessageTime = 0) and (ts <= 0) then
  254. Exit
  255. else if (ts > LastMessageTime) then
  256. FGroupClient.GetHistoryMessages(ATeam.TeamID, ts)
  257. else
  258. begin
  259. LastMessageTimeTs := (DateTimeToUnix(LastMessageTime) - 8 * 60 * 60) * 1000;
  260. FGroupClient.GetHistoryMessages(ATeam.TeamID, LastMessageTimeTs);
  261. end;
  262. {$ENDIF}
  263. end;
  264. procedure TGroupService.OnDeletedManagers(ATeamID: string; AManagers: TStrings);
  265. var
  266. iLoop, iIndex: Integer;
  267. ATempTeam: TRealICQTeam;
  268. begin
  269. iIndex := FTeams.IndexOf(ATeamID);
  270. if iIndex < 0 then
  271. Exit;
  272. ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
  273. ATempTeam.TeamManagers := RemoveMembers(ATempTeam.TeamManagers, AManagers);
  274. MainForm.WebSocketSendReadTeamInfo(ATempTeam.TeamID);
  275. end;
  276. procedure TGroupService.OnDeletedMembers(ATeamID: string; AMembers: TStrings);
  277. var
  278. iLoop, iIndex: Integer;
  279. ATempTeam: TRealICQTeam;
  280. begin
  281. iIndex := FTeams.IndexOf(ATeamID);
  282. if iIndex < 0 then
  283. Exit;
  284. for iLoop := 0 to AMembers.Count - 1 do
  285. if SameText(FLoginName, AMembers[iLoop]) then
  286. begin
  287. MainForm.WebSocketQuitTeam(ATeamID);
  288. ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
  289. if ATempTeam <> nil then
  290. FreeAndNil(ATempTeam);
  291. FTeams.Delete(iIndex);
  292. Exit;
  293. end;
  294. ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
  295. ATempTeam.TeamMembers := RemoveMembers(ATempTeam.TeamMembers, AMembers);
  296. ATempTeam.TeamManagers := RemoveMembers(ATempTeam.TeamManagers, AMembers);
  297. MainForm.WebSocketSendReadTeamInfo(ATempTeam.TeamID);
  298. end;
  299. procedure TGroupService.OnDeletedTeam(ATeamID: string);
  300. var
  301. iIndex: Integer;
  302. begin
  303. iIndex := FTeams.IndexOf(ATeamID);
  304. if iIndex >= 0 then
  305. begin
  306. MainForm.WebSocketRemoveTeamResponse(ATeamID);
  307. FTeams.Delete(iIndex);
  308. end;
  309. end;
  310. procedure TGroupService.OnMessage(ATeamID, ASender, AContent, AStyle: string; ASendTime: TDateTime; AMSGType: Integer; ALength: Integer);
  311. const
  312. AParam: string = '?center=%s&marker=%s&lat=%s&lng=%s';
  313. ARM_2_MP3_URL: string = 'http://127.0.0.1:3000/api/amr2mp3';
  314. BODY: string = '{"data":"%s"}';
  315. var
  316. tmpStrs: TIdStringList;
  317. str: string;
  318. h: TIdHTTP;
  319. jo: ISuperObject;
  320. begin
  321. if AMSGType = 2 then
  322. MainForm.WebSocketRecivedbroadcastmesssage('', ATeamID, ASender, AStyle, '[image-src="' + AContent + '"]', ASendTime)
  323. else if AMSGType = 3 then
  324. MainForm.RealICQClientReceivedOfflineFile(nil, ASender, AContent, ALength, ASendTime)
  325. else if AMSGType = 4 then
  326. begin
  327. h := TIdHTTP.Create(nil);
  328. try
  329. tmpStrs := TIdStringList.Create;
  330. str := Format(BODY, [AContent]);
  331. tmpStrs.Add(str);
  332. h.Request.ContentType := 'application/json';
  333. AContent := h.Post(ARM_2_MP3_URL, tmpStrs);
  334. jo := SO(AContent);
  335. if (jo <> nil) and (jo.I['ret'] = 1) then
  336. MainForm.WebSocketRecivedbroadcastmesssage('', ATeamID, ASender, AStyle, '[voice-src="' + jo.S['url'] + '"]', ASendTime);
  337. finally
  338. tmpStrs.Free;
  339. end;
  340. end
  341. else if AMSGType = 5 then
  342. begin
  343. tmpStrs := TRealICQUtility.SplitString(AContent, ':');
  344. try
  345. AContent := '[map-src="' + (TConditionConfig.GetConfig.MapHost + Format(AParam, [HTTPEncode(UTF8Encode(tmpStrs[0])), HTTPEncode(UTF8Encode(tmpStrs[1])), tmpStrs[2], tmpStrs[3]])) + '"]';
  346. MainForm.WebSocketRecivedbroadcastmesssage('', ATeamID, ASender, AStyle, AContent, ASendTime)
  347. finally
  348. tmpStrs.Free;
  349. end;
  350. end
  351. else
  352. MainForm.WebSocketRecivedbroadcastmesssage('', ATeamID, ASender, AStyle, AContent, ASendTime);
  353. end;
  354. procedure TGroupService.OnMessageReaded(ATeamID: string; ts: Int64);
  355. var
  356. AList: TList;
  357. i: Integer;
  358. begin
  359. i := MainForm.NotReadMessages.IndexOf(MainFrm.TeamMessageID + ATeamID);
  360. if i > -1 then
  361. begin
  362. AList := MainForm.NotReadMessages.Objects[i] as TList;
  363. MainForm.NotReadMessages.Delete(i);
  364. TRealICQUtility.FreeList(AList);
  365. MainForm.StopHeadImageFlash(ATeamID);
  366. end;
  367. end;
  368. procedure TGroupService.OnReceivedApplyBoardcast(ATeamID, ALoginName, ATag: string);
  369. begin
  370. MainForm.WebSocketJionTeamRequest(ATeamID, ALoginName, ATag);
  371. end;
  372. procedure TGroupService.OnReceivedReplyBoardcast(ATeamID, ALoginName, ATag: string; ARet: Integer);
  373. var
  374. iIndex: Integer;
  375. ATempTeam: TRealICQTeam;
  376. begin
  377. if SameText(ALoginName, FLoginName) then
  378. case ARet of
  379. 0:
  380. begin
  381. MainForm.RealICQClientJoinTeamResponse(nil, ATeamID, '管理员', ATag, False);
  382. end;
  383. 1:
  384. begin
  385. FGroupClient.AsynTeam(ATeamID);
  386. MainForm.RealICQClientJoinTeamResponse(nil, ATeamID, '管理员', ATag, True);
  387. end;
  388. 5:
  389. begin
  390. MessageBox(SearchTeamForm.Handle, PChar('申请加入的群组不允许任何人加入!!!'), '提示', MB_ICONINFORMATION);
  391. end;
  392. end
  393. else
  394. begin
  395. if ARet = 1 then
  396. begin
  397. iIndex := FTeams.IndexOf(ATeamID);
  398. if iIndex < 0 then
  399. Exit;
  400. ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
  401. ATempTeam.TeamMembers := AddMember(ATempTeam.TeamMembers, ALoginName);
  402. MainForm.WebSocketSendReadTeamInfo(ATempTeam.TeamID);
  403. end;
  404. end;
  405. end;
  406. procedure TGroupService.OnSearched(ARecords: TStringList; ASkip, ALimit: Integer);
  407. begin
  408. SearchTeamForm.ShowTeamSearchResult(ARecords);
  409. end;
  410. procedure TGroupService.OnTeamInfoChange(ATeam: TRealICQTeam);
  411. var
  412. iIndex: Integer;
  413. ATempTeam: TRealICQTeam;
  414. begin
  415. iIndex := FTeams.IndexOf(ATeam.TeamID);
  416. if iIndex > -1 then
  417. begin
  418. ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
  419. if ATempTeam = nil then
  420. Exit;
  421. ATempTeam.TeamCaption := ATeam.TeamCaption;
  422. ATempTeam.TeamIntro := ATeam.TeamIntro;
  423. ATempTeam.TeamCallBoard := ATeam.TeamCallBoard;
  424. ATempTeam.TeamValidate := ATeam.TeamValidate;
  425. MainForm.WebSocketSendReadTeamInfo(ATeam.TeamID);
  426. end;
  427. end;
  428. procedure TGroupService.OnUploaded(ADownloadURL, AFileName: string);
  429. begin
  430. FDownFile.OnComplete := DownFaceFileComplete;
  431. FDownFile.ThreadDownFile(ADownloadURL, TRealICQClient.GetReceivedFaceDir + AFileName);
  432. end;
  433. procedure TGroupService.DownFaceFileComplete(Source_file, Dest_file: string; blStatus: boolean; ErrMessage: string);
  434. begin
  435. if not blStatus then
  436. begin
  437. Error(ErrMessage, '下载群图片');
  438. Exit;
  439. end;
  440. ShowGettedFace(Dest_file);
  441. end;
  442. procedure TGroupService.QuitTeam(ATeamID: string);
  443. var
  444. AMembers: TStringList;
  445. begin
  446. AMembers := TStringList.Create;
  447. try
  448. AMembers.Add(FLoginName);
  449. FGroupClient.RemoveTeamMembers(ATeamID, AMembers, nil);
  450. finally
  451. AMembers.Free;
  452. end;
  453. end;
  454. function TGroupService.RemoveManager(ATeamID, ALoginName: string): Boolean;
  455. var
  456. AManagers: TStringList;
  457. begin
  458. if Trim(ALoginName) = '' then
  459. Exit;
  460. AManagers := TStringList.Create;
  461. try
  462. AManagers.Add(ALoginName);
  463. FGroupClient.RemoveTeamMembers(ATeamID, nil, AManagers);
  464. finally
  465. AManagers.Free;
  466. end;
  467. // FGroupClient.RemoveManager();
  468. end;
  469. function TGroupService.RemoveMembers(AMembers: string; ARemoveMembers: TStrings): string;
  470. var
  471. iLoop, iIndex: Integer;
  472. AMemberList: TStrings;
  473. begin
  474. iLoop := 0;
  475. Result := '';
  476. AMemberList := SplitString(AMembers, Chr(10));
  477. try
  478. for iLoop := AMemberList.Count - 1 downto 0 do
  479. begin
  480. if Length(Trim(AMemberList[iLoop])) = 0 then
  481. AMemberList.Delete(iLoop);
  482. end;
  483. for iLoop := 0 to ARemoveMembers.Count - 1 do
  484. begin
  485. iIndex := AMemberList.IndexOf(ARemoveMembers[iLoop]);
  486. if iIndex > -1 then
  487. AMemberList.Delete(iIndex);
  488. end;
  489. iLoop := 0;
  490. while iLoop < AMemberList.Count - 1 do
  491. begin
  492. Result := Result + AMemberList[iLoop] + Chr(10);
  493. Inc(iLoop);
  494. end;
  495. Result := Result + AMemberList[iLoop]
  496. finally
  497. AMemberList.Free;
  498. end;
  499. end;
  500. procedure TGroupService.SearchTeam(AKey: string; ASearchType: TRealICQTeamSearchType; AMatchingType: TRealICQMatchingType; APage: Integer);
  501. begin
  502. case ASearchType of
  503. tsByTeamID:
  504. FGroupClient.SearchTeam(AKey, '', '', '', AMatchingType, 0, 500);
  505. tsByTeamCaption:
  506. FGroupClient.SearchTeam('', AKey, '', '', AMatchingType, 0, 500);
  507. tsByTeamIntro:
  508. FGroupClient.SearchTeam('', '', AKey, '', AMatchingType, 0, 500);
  509. // tsByTeamCreater: FGroupClient.SearchTeam('', '', '', '', 0, 500);
  510. end;
  511. end;
  512. procedure TGroupService.SendTeamMessage(ATeamID, ASender, AMsg: string; AFont: TFont; AFaces: TStringList; Attachs: string);
  513. begin
  514. FGroupClient.SendTeamMessage(ATeamID, ASender, AMsg, AFont, AFaces, Attachs);
  515. end;
  516. procedure TGroupService.SetAlias(ATeamID, ALoginName, Alias: string);
  517. begin
  518. end;
  519. procedure TGroupService.Uninstall;
  520. var
  521. iIndex: Integer;
  522. ATeam: TRealICQTeam;
  523. begin
  524. ATeam := nil;
  525. for iIndex := 0 to FTeams.Count - 1 do
  526. begin
  527. ATeam := FTeams.Objects[iIndex] as TRealICQTeam;
  528. {$IFDEF OldGroup}
  529. FGroupClient.MessageMiscMust(ATeam.TeamID);
  530. {$ENDIF}
  531. end;
  532. FGroupClient.Disconnect;
  533. end;
  534. procedure TGroupService.MessageMiscMust(ATeamID: string);
  535. begin
  536. FGroupClient.MessageMiscMust(ATeamID);
  537. end;
  538. procedure TGroupService.UpdateTeam(ATeamID, AIntro, ANotice, AName: string; AAuth: Integer);
  539. begin
  540. FGroupClient.UpdateTeamInfo(ATeamID, AIntro, ANotice, AName, AAuth);
  541. end;
  542. procedure TGroupService.UpdateTeamMembers(ATeamID: string; AOldMembers, ANewMembers: TStringList);
  543. var
  544. iLoop: Integer;
  545. ATeamAddMembers, ATeamRemoveMembers: TStringList;
  546. MemberListChanged: Boolean;
  547. begin
  548. ATeamAddMembers := TStringList.Create;
  549. ATeamRemoveMembers := TStringList.Create;
  550. MemberListChanged := False;
  551. for iLoop := 0 to ANewMembers.Count - 1 do
  552. begin
  553. if AOldMembers.IndexOf(ANewMembers[iLoop]) = -1 then
  554. begin
  555. MemberListChanged := True;
  556. ATeamAddMembers.Add(ANewMembers[iLoop]);
  557. end;
  558. end;
  559. if MemberListChanged then
  560. AddTeamMembers(ATeamID, ATeamAddMembers);
  561. MemberListChanged := False;
  562. for iLoop := 0 to AOldMembers.Count - 1 do
  563. begin
  564. if Length(Trim(AOldMembers[iLoop])) = 0 then
  565. Continue;
  566. if ANewMembers.IndexOf(AOldMembers[iLoop]) = -1 then
  567. begin
  568. MemberListChanged := True;
  569. ATeamRemoveMembers.Add(AOldMembers[iLoop]);
  570. end;
  571. end;
  572. if MemberListChanged then
  573. RemoveTeamMembers(ATeamID, ATeamRemoveMembers);
  574. ATeamAddMembers.Free;
  575. ATeamRemoveMembers.Free;
  576. end;
  577. end.