GroupProcess.pas 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  1. unit GroupProcess;
  2. interface
  3. uses
  4. superobject, GroupUtility, GroupClient, RealICQModel, Classes, SysUtils;
  5. type
  6. TBaseProcess = class
  7. private
  8. FClient: TGroupClient;
  9. public
  10. constructor Create(AClient: TGroupClient);
  11. procedure Excute(AData: ISuperObject); virtual;
  12. procedure Send(AData: string);
  13. property Client: TGroupClient read FClient;
  14. end;
  15. TGetMyGroupsResponse = class(TBaseProcess)
  16. public
  17. procedure Excute(AData: ISuperObject); override;
  18. end;
  19. TGroupCreateResponse = class(TBaseProcess)
  20. public
  21. procedure Excute(AData: ISuperObject); override;
  22. end;
  23. TGroupDeleteResponse = class(TBaseProcess)
  24. public
  25. procedure Excute(AData: ISuperObject); override;
  26. end;
  27. TGroupUpdateResponse = class(TBaseProcess)
  28. public
  29. procedure Excute(AData: ISuperObject); override;
  30. end;
  31. TGroupSearchResponse = class(TBaseProcess)
  32. public
  33. procedure Excute(AData: ISuperObject); override;
  34. end;
  35. TGroupAsynResponse = class(TBaseProcess)
  36. public
  37. procedure Excute(AData: ISuperObject); override;
  38. end;
  39. TMemberAddResponse = class(TBaseProcess)
  40. public
  41. procedure Excute(AData: ISuperObject); override;
  42. end;
  43. TMemberDelResponse = class(TBaseProcess)
  44. public
  45. procedure Excute(AData: ISuperObject); override;
  46. end;
  47. /// <summary>
  48. /// 群管理员收到加入群的申请
  49. /// </summary>
  50. TMemberApplyP = class(TBaseProcess)
  51. public
  52. procedure Excute(AData: ISuperObject); override;
  53. end;
  54. TMemberReplyP = class(TBaseProcess)
  55. public
  56. procedure Excute(AData: ISuperObject); override;
  57. end;
  58. TMessageBroadcast = class(TBaseProcess)
  59. public
  60. procedure Excute(AData: ISuperObject); override;
  61. end;
  62. TFileDownloadBroadcast = class(TBaseProcess)
  63. public
  64. procedure Excute(AData: ISuperObject); override;
  65. end;
  66. TOfflineMessageResponse = class(TBaseProcess)
  67. public
  68. procedure Excute(AData: ISuperObject); override;
  69. end;
  70. TNewOfflineMessageResponse = class(TBaseProcess)
  71. public
  72. procedure Excute(AData: ISuperObject); override;
  73. end;
  74. TMessageMiscBroadcast = class(TBaseProcess)
  75. public
  76. procedure Excute(AData: ISuperObject); override;
  77. end;
  78. function ManagersConvertToStr(AManagers: TSuperArray): string;
  79. function MembersConvertToStr(AJoUser: ISuperObject): string;
  80. implementation
  81. uses
  82. LoggerImport, GroupService, DataProviderImport, DateUtils,
  83. InterfaceDataProvider, GroupConfig;
  84. function ManagersConvertToStr(AManagers: TSuperArray): string;
  85. var
  86. iLoop: Integer;
  87. begin
  88. iLoop := 0;
  89. Result := '';
  90. while iLoop < AManagers.Length - 1 do
  91. begin
  92. Result := Result + AManagers[iLoop].AsString + Chr(10);
  93. Inc(iLoop);
  94. end;
  95. Result := Result + AManagers[iLoop].AsString
  96. end;
  97. function MembersConvertToStr(AJoUser: ISuperObject): string;
  98. var
  99. AItem: TSuperAvlEntry;
  100. begin
  101. Result := '';
  102. for AItem in AJoUser.AsObject do
  103. Result := Result + AItem.Value['id'].AsString + Chr(10);
  104. Result := Copy(Result, 0, Length(Result) - 1);
  105. end;
  106. function ToTeam(AJo: ISuperObject): TRealICQTeam;
  107. begin
  108. try
  109. Result := nil;
  110. if AJo = nil then
  111. Exit;
  112. Result := TRealICQTeam.Create;
  113. Result.TeamID := AJo.S['id'];
  114. Result.TeamCaption := AJo.S['name'];
  115. Result.TeamCreater := AJo.S['creator'];
  116. Result.TeamIntro := AJo.S['intro'];
  117. Result.TeamCallBoard := AJo.S['notice'];
  118. Result.TeamValidate := TRealICQTeamValidateType(AJo.I['auth']);
  119. Result.TeamManagers := ManagersConvertToStr(AJo.A['managers']);
  120. Result.TeamMembers := MembersConvertToStr(AJo.O['members']);
  121. except
  122. on Ex: Exception do
  123. begin
  124. Error(Ex.Message, 'ToTeam');
  125. Result.Free;
  126. end;
  127. end;
  128. end;
  129. function GetWaitingTeam(ATeamID: string): TRealICQTeam;
  130. begin
  131. Result := TRealICQTeam.Create;
  132. Result.TeamID := ATeamID;
  133. Result.TeamCaption := '群信息正在努力加载中...';
  134. Result.TeamIntro := '加载中...';
  135. Result.TeamCallBoard := '加载中...';
  136. end;
  137. { TNoProcess }
  138. constructor TBaseProcess.Create(AClient: TGroupClient);
  139. begin
  140. FClient := AClient;
  141. end;
  142. procedure TBaseProcess.Excute(AData: ISuperObject);
  143. begin
  144. Warning(AData.AsJSon(), 'TBaseProcess.Excute');
  145. end;
  146. procedure TBaseProcess.Send(AData: string);
  147. begin
  148. if FClient <> nil then
  149. FClient.Send(AData);
  150. end;
  151. { TGroupCreateResponse }
  152. procedure TGroupCreateResponse.Excute(AData: ISuperObject);
  153. var
  154. ATeam: TRealICQTeam;
  155. begin
  156. try
  157. ATeam := ToTeam(AData.O['group']);
  158. if ATeam = nil then
  159. Exit;
  160. except
  161. on Ex: Exception do
  162. begin
  163. Error(Ex.Message, 'TGroupCreateResponse.Excute');
  164. ATeam.Free;
  165. end;
  166. end;
  167. TGroupService.GetService.OnAddedTeam(ATeam);
  168. GetMapTeamUsersProvider.Insert(AData.S['group.id'], AData.O['group'].AsJSon(), AData.I['group.ver']);
  169. end;
  170. { TGroupDeleteResponse }
  171. procedure TGroupDeleteResponse.Excute(AData: ISuperObject);
  172. var
  173. ATeamID: string;
  174. begin
  175. try
  176. ATeamID := AData.S['group.id'];
  177. TGroupService.GetService.OnDeletedTeam(ATeamID);
  178. except
  179. on Ex: Exception do
  180. begin
  181. Error(Ex.Message, 'TGroupDeleteResponse.Excute');
  182. end;
  183. end;
  184. end;
  185. { TGroupUpdateResponse }
  186. procedure TGroupUpdateResponse.Excute(AData: ISuperObject);
  187. var
  188. ATeam: TRealICQTeam;
  189. begin
  190. try
  191. ATeam := TRealICQTeam.Create;
  192. ATeam.TeamID := AData.S['group.id'];
  193. ATeam.TeamCaption := AData.S['group.name'];
  194. ATeam.TeamIntro := AData.S['group.intro'];
  195. ATeam.TeamCallBoard := AData.S['group.notice'];
  196. ATeam.TeamValidate := TRealICQTeamValidateType(AData.I['group.auth']);
  197. TGroupService.GetService.OnTeamInfoChange(ATeam);
  198. except
  199. on Ex: Exception do
  200. begin
  201. Error(Ex.Message, 'TGroupCreateResponse.Excute');
  202. ATeam.Free;
  203. end;
  204. end;
  205. ATeam.Free;
  206. // GetMapTeamUsersProvider.Insert(AData.S['group.id'], AData.O['group'].AsJSon(), AData.I['group.ver']);
  207. end;
  208. { TGroupSearchResponse }
  209. procedure TGroupSearchResponse.Excute(AData: ISuperObject);
  210. var
  211. ARecord: TSearchTeamResultRecord;
  212. ARecords: TStringList;
  213. iLoop: Integer;
  214. jaGroups: TSuperArray;
  215. begin
  216. ARecords := TStringList.Create;
  217. try
  218. jaGroups := AData.A['groups'];
  219. for iLoop := 0 to jaGroups.Length - 1 do
  220. begin
  221. ARecord := TSearchTeamResultRecord.Create;
  222. ARecord.TeamID := jaGroups[iLoop]['id'].AsString;
  223. ARecord.TeamCaption := jaGroups[iLoop]['name'].AsString;
  224. ARecord.TeamCreater := jaGroups[iLoop]['creator'].AsString;
  225. ARecords.AddObject(IntToStr(iLoop), ARecord);
  226. end;
  227. TGroupService.GetService.OnSearched(ARecords, AData.I['skip'], AData.I['limit']);
  228. finally
  229. ARecords.Free;
  230. end;
  231. end;
  232. { TGroupAsynResponse }
  233. procedure TGroupAsynResponse.Excute(AData: ISuperObject);
  234. var
  235. ATeam: TRealICQTeam;
  236. AJo: ISuperObject;
  237. AMessageRep: TMessageBroadcast;
  238. begin
  239. try
  240. {$IFDEF OldGroup}
  241. AJo := AData.O['groups'];
  242. {$ELSE}
  243. AJo := AData.O['group'];
  244. {$ENDIF}
  245. ATeam := ToTeam(AJo);
  246. if ATeam = nil then
  247. Exit;
  248. except
  249. on Ex: Exception do
  250. begin
  251. Error(Ex.Message, 'TGroupCreateResponse.Excute');
  252. ATeam.Free;
  253. end;
  254. end;
  255. TGroupService.GetService.OnAddedTeam(ATeam);
  256. GetMapTeamUsersProvider.Insert(AJo.S['id'], AJo.AsJSon(), AJo.I['ver']);
  257. end;
  258. { TBaseProcess }
  259. //42["m.add.b",{"id":"","group":{"id":"0fde0aa744384f2e8b4973e17ca9b79a","members":["1000+002682BECE10-lqq"],"managers":[]},"operator":"1000+002682BECE10-test02"}]
  260. procedure TMemberAddResponse.Excute(AData: ISuperObject);
  261. var
  262. ATeamID: string;
  263. AMembers, AManagers: TStringList;
  264. jaMembers, jaManagers: TSuperArray;
  265. iLoop: Integer;
  266. begin
  267. try
  268. ATeamID := AData.S['group.id'];
  269. if Trim(ATeamID) = '' then
  270. Exit;
  271. AMembers := TStringList.Create;
  272. AManagers := TStringList.Create;
  273. jaMembers := AData.A['group.members'];
  274. jaManagers := AData.A['group.managers'];
  275. if jaMembers <> nil then
  276. for iLoop := 0 to jaMembers.Length - 1 do
  277. AMembers.Add(jaMembers.S[iLoop]);
  278. if jaManagers <> nil then
  279. for iLoop := 0 to jaManagers.Length - 1 do
  280. AManagers.Add(jaManagers.S[iLoop]);
  281. if (AMembers.Count > 0) then
  282. TGroupService.GetService.OnAddedMembers(ATeamID, AMembers);
  283. if (AManagers.Count > 0) then
  284. TGroupService.GetService.OnAddedManagers(ATeamID, AManagers);
  285. except
  286. on Ex: Exception do
  287. begin
  288. Error(Ex.Message, 'TMemberAddResponse.Excute');
  289. FreeAndNil(AMembers);
  290. FreeAndNil(AManagers);
  291. end;
  292. end;
  293. FreeAndNil(AMembers);
  294. FreeAndNil(AManagers);
  295. end;
  296. { TMemberDelResponse }
  297. procedure TMemberDelResponse.Excute(AData: ISuperObject);
  298. var
  299. ATeamID: string;
  300. AMembers, AManagers: TStringList;
  301. jaMembers, jaManagers: TSuperArray;
  302. iLoop: Integer;
  303. begin
  304. try
  305. ATeamID := AData.S['group.id'];
  306. if Trim(ATeamID) = '' then
  307. Exit;
  308. AMembers := TStringList.Create;
  309. AManagers := TStringList.Create;
  310. jaMembers := AData.A['group.members'];
  311. jaManagers := AData.A['group.managers'];
  312. if jaMembers <> nil then
  313. for iLoop := 0 to jaMembers.Length - 1 do
  314. AMembers.Add(jaMembers.S[iLoop]);
  315. if jaManagers <> nil then
  316. for iLoop := 0 to jaManagers.Length - 1 do
  317. AManagers.Add(jaManagers.S[iLoop]);
  318. if (AMembers.Count > 0) then
  319. TGroupService.GetService.OnDeletedMembers(ATeamID, AMembers);
  320. if (AManagers.Count > 0) then
  321. TGroupService.GetService.OnDeletedManagers(ATeamID, AManagers);
  322. except
  323. on Ex: Exception do
  324. begin
  325. Error(Ex.Message, 'TMemberAddResponse.Excute');
  326. FreeAndNil(AMembers);
  327. FreeAndNil(AManagers);
  328. end;
  329. end;
  330. FreeAndNil(AMembers);
  331. FreeAndNil(AManagers);
  332. end;
  333. { TMemberApplyP }
  334. procedure TMemberApplyP.Excute(AData: ISuperObject);
  335. var
  336. ATeamID: string;
  337. joApply: ISuperObject;
  338. begin
  339. ATeamID := AData.S['group.id'];
  340. joApply := AData.O['group.apply'];
  341. TGroupService.GetService.OnReceivedApplyBoardcast(ATeamID, joApply.S['uid'], joApply.S['msg']);
  342. end;
  343. { TMemberReplyP }
  344. //42["m.reply.p",
  345. //{"group":
  346. {"id":"5ebbdeeed099442e88980a4512227656",
  347. "apply":{"uid":"0578+0-lslinlh","msg":"","id":"a1e782d74bfd45e785dcb9ce85750a24"}
  348. // },
  349. // "id":"6d773f668b8d4811b990254396f0eb7e",
  350. //"reply":{"id":"6d773f668b8d4811b990254396f0eb7e","ret":1}}]
  351. procedure TMemberReplyP.Excute(AData: ISuperObject);
  352. var
  353. ATeamID, ALoginName, AMsg: string;
  354. ARet: Integer;
  355. begin
  356. ATeamID := AData.S['group.id'];
  357. ALoginName := AData.S['group.apply.uid'];
  358. AMsg := AData.S['group.reply.msg'];
  359. ARet := AData.I['group.reply.ret'];
  360. TGroupService.GetService.OnReceivedReplyBoardcast(ATeamID, ALoginName, AMsg, ARet);
  361. end;
  362. { TMessageBroadcast }
  363. //{id:'', group:{id:[id...]}, message:{message}}
  364. procedure TMessageBroadcast.Excute(AData: ISuperObject);
  365. var
  366. ATeamID: string;
  367. ASender: string;
  368. AStyle: string;
  369. AContent: string;
  370. TimesTamp: Int64;
  371. ASendTime: TDateTime;
  372. jaImgs: TSuperArray;
  373. iLoop: Integer;
  374. begin
  375. ATeamID := AData.S['group.id'];
  376. if TGroupService.GetService.GetTeam(ATeamID) = nil then
  377. begin
  378. FClient.AsynTeam(ATeamID);
  379. end;
  380. if AData.S['content'] <> '' then
  381. AContent := AData.S['content']
  382. else
  383. AContent := AData.S['txt'];
  384. if AData.I['msgType'] <> 4 then
  385. begin
  386. AContent := StringReplace(AContent, '\r\n', #13#10, [rfReplaceAll]);
  387. AContent := StringReplace(AContent, '[\r][\n]', '\r\n', [rfReplaceAll]);
  388. end
  389. else
  390. AContent := StringReplace(AContent, #$A, '\n', [rfReplaceAll]);
  391. ASender := AData.S['sender'];
  392. ASendTime := UnixToDateTime(Round(AData.I['ts'] / 1000) + 8 * 60 * 60);
  393. AStyle := JsonToFont(AData.O['style']);
  394. TGroupService.GetService.OnMessage(ATeamID, ASender, AContent, AStyle, ASendTime, AData.I['msgType'], AData.I['length']);
  395. Client.MessageMisc(ATeamID);
  396. end;
  397. { TGetMyGroupsResponse }
  398. procedure TGetMyGroupsResponse.Excute(AData: ISuperObject);
  399. var
  400. AJa: TSuperArray;
  401. iLoop, ARemoteVer, ALocalVer: Integer;
  402. AJson, ATeamID: string;
  403. AKeyValue: TKeyValue;
  404. ATeam: TRealICQTeam;
  405. begin
  406. AJa := AData.A['user.groups'];
  407. if AJa = nil then
  408. Exit;
  409. for iLoop := 0 to AJa.Length - 1 do
  410. begin
  411. ATeamID := AJa.O[iLoop].S['id'];
  412. ARemoteVer := AJa.O[iLoop].I['ver'];
  413. AKeyValue := GetMapTeamUsersProvider.FindKeyValue(ATeamID);
  414. ALocalVer := StrToIntDef(AKeyValue[2], -1);
  415. AJson := AKeyValue[1];
  416. try
  417. if (ALocalVer < 0) or (ALocalVer <> ARemoteVer) or (AJson = '') then
  418. begin
  419. ATeam := GetWaitingTeam(ATeamID);
  420. FClient.AsynTeam(ATeamID)
  421. end
  422. else
  423. ATeam := ToTeam(SO(AJson));
  424. if ATeam <> nil then
  425. TGroupService.GetService.OnAddedTeam(ATeam, AJa.O[iLoop].I['as']);
  426. except
  427. on Ex: Exception do
  428. begin
  429. Error(AJson, 'TGetMyGroupsResponse.Excute');
  430. FreeAndNil(ATeam);
  431. end;
  432. end;
  433. FreeAndNil(ATeam);
  434. end;
  435. // FClient.GetOffineMessage;
  436. end;
  437. { TOfflineMessageResponse }
  438. procedure TOfflineMessageResponse.Excute(AData: ISuperObject);
  439. var
  440. ATeamID: string;
  441. ASender: string;
  442. AStyle: string;
  443. AContent, AURL: string;
  444. TimesTamp: Int64;
  445. ASendTime: TDateTime;
  446. jaImgs, jaMsgs: TSuperArray;
  447. iLoop, jLoop, iCount: Integer;
  448. AItem: ISuperObject;
  449. config: TGroupConfig;
  450. service: TGroupService;
  451. begin
  452. jaMsgs := AData.AsArray;
  453. iCount := jaMsgs.Length;
  454. config := TGroupConfig.GetConfig;
  455. service := TGroupService.GetService;
  456. for iLoop := 0 to iCount - 1 do
  457. begin
  458. try
  459. AItem := jaMsgs.O[iLoop];
  460. ATeamID := AItem.S['group.id'];
  461. if AItem.S['content'] <> '' then
  462. AContent := AItem.S['content']
  463. else
  464. AContent := AItem.S['txt'];
  465. AContent := StringReplace(AContent, '\r\n', #13#10, [rfReplaceAll]);
  466. AContent := StringReplace(AContent, '[\r][\n]', '\r\n', [rfReplaceAll]);
  467. ASender := AItem.S['sender'];
  468. ASendTime := UnixToDateTime(Round(AItem.I['ts'] / 1000) + 8 * 60 * 60);
  469. AStyle := JsonToFont(AItem.O['style']);
  470. TGroupService.GetService.OnMessage(ATeamID, ASender, AContent, AStyle, ASendTime, AItem.I['msgType'], AItem.I['length']);
  471. finally
  472. Client.MessageMisc(ATeamID);
  473. end;
  474. end;
  475. end;
  476. { TFileDownloadBroadcast }
  477. procedure TFileDownloadBroadcast.Excute(AData: ISuperObject);
  478. var
  479. AURL: string;
  480. jaFiles: TSuperArray;
  481. iLoop: Integer;
  482. joFile: ISuperObject;
  483. config: TGroupConfig;
  484. service: TGroupService;
  485. begin
  486. jaFiles := AData.A['hashs'];
  487. config := TGroupConfig.GetConfig;
  488. service := TGroupService.GetService;
  489. for iLoop := 0 to jaFiles.Length - 1 do
  490. begin
  491. joFile := jaFiles.O[iLoop];
  492. AURL := Format(DOWNLOAD_URL, [config.ImageIP, config.ImagePort, joFile.S['hash']]);
  493. service.OnUploaded(AURL, joFile.S['file']);
  494. end;
  495. end;
  496. { TNewOfflineMessageResponse }
  497. procedure TNewOfflineMessageResponse.Excute(AData: ISuperObject);
  498. var
  499. ATeamID: string;
  500. ASender: string;
  501. AStyle: string;
  502. AContent, AURL: string;
  503. TimesTamp: Int64;
  504. ASendTime: TDateTime;
  505. jaImgs, jaMsgs: TSuperArray;
  506. iLoop, jLoop, iCount: Integer;
  507. AItem: ISuperObject;
  508. config: TGroupConfig;
  509. service: TGroupService;
  510. begin
  511. jaMsgs := AData.A['data'];
  512. iCount := jaMsgs.Length;
  513. config := TGroupConfig.GetConfig;
  514. service := TGroupService.GetService;
  515. for iLoop := 0 to iCount - 1 do
  516. begin
  517. try
  518. AItem := jaMsgs.O[iLoop];
  519. ATeamID := AItem.S['group.id'];
  520. if AItem.S['content'] <> '' then
  521. AContent := AItem.S['content']
  522. else
  523. AContent := AItem.S['txt'];
  524. AContent := StringReplace(AContent, '\r\n', #13#10, [rfReplaceAll]);
  525. AContent := StringReplace(AContent, '[\r][\n]', '\r\n', [rfReplaceAll]);
  526. ASender := AItem.S['sender'];
  527. ASendTime := UnixToDateTime(Round(AItem.I['ts'] / 1000) + 8 * 60 * 60);
  528. AStyle := JsonToFont(AItem.O['style']);
  529. TGroupService.GetService.OnMessage(ATeamID, ASender, AContent, AStyle, ASendTime, AItem.I['msgType'], AItem.I['length']);
  530. finally
  531. Client.MessageMisc(ATeamID);
  532. end;
  533. end;
  534. end;
  535. { TMessageMiscBroadcast }
  536. procedure TMessageMiscBroadcast.Excute(AData: ISuperObject);
  537. var
  538. ja: TSuperArray;
  539. jo: ISuperObject;
  540. i: Integer;
  541. begin
  542. ja := AData.A['group'];
  543. if ja <> nil then
  544. for I := 0 to ja.Length - 1 do
  545. TGroupService.GetService.OnMessageReaded(ja[i].S['id'], ja[i].I['ts'])
  546. else
  547. begin
  548. jo := AData.O['group'];
  549. if jo = nil then
  550. Exit;
  551. TGroupService.GetService.OnMessageReaded(jo.S['id'], jo.I['ts']);
  552. end;
  553. end;
  554. end.