GroupProcess.pas 15 KB

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