GroupService.pas 18 KB

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