unit GroupProcess; interface uses superobject, GroupUtility, GroupClient, GroupModel, Classes, SysUtils; type TBaseProcess = class private FClient: TGroupClient; public constructor Create(AClient: TGroupClient); procedure Excute(AData: ISuperObject); virtual; procedure Send(AData: string); property Client: TGroupClient read FClient; end; TGroupCreateResponse = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; TGroupDeleteResponse = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; TGroupUpdateResponse = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; TGroupSearchResponse = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; TGroupSearchByIDResponse = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; TMemberAddResponse = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; TMemberDelResponse = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; /// /// 群管理员收到加入群的申请 /// TMemberApplyP = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; TMemberReplyP = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; TMessageBroadcast = class(TBaseProcess) public procedure Excute(AData: ISuperObject); override; end; function ManagersConvertToStr(AManagers: TSuperArray): string; function MembersConvertToStr(AJoUser: ISuperObject): string; implementation uses LoggerImport, GroupService, DataProviderImport, DateUtils; function ManagersConvertToStr(AManagers: TSuperArray): string; var iLoop: Integer; begin iLoop := 0; Result := ''; while iLoop < AManagers.Length - 1 do begin Result := Result + AManagers[iLoop].AsString + Chr(10); Inc(iLoop); end; Result := Result + AManagers[iLoop].AsString end; function MembersConvertToStr(AJoUser: ISuperObject): string; var AItem: TSuperAvlEntry; begin Result := ''; for AItem in AJoUser.AsObject do Result := Result + AItem.Value['id'].AsString + Chr(10); Result := Copy(Result, 0, Length(Result) - 1); end; { TNoProcess } constructor TBaseProcess.Create(AClient: TGroupClient); begin FClient := AClient; end; procedure TBaseProcess.Excute(AData: ISuperObject); begin end; procedure TBaseProcess.Send(AData: string); begin if FClient <> nil then FClient.Send(AData); end; { TGroupCreateResponse } procedure TGroupCreateResponse.Excute(AData: ISuperObject); var ATeam: TRealICQTeam; iLoop: Integer; begin try ATeam := TRealICQTeam.Create; ATeam.TeamID := AData.S['group.id']; ATeam.TeamCaption := AData.S['group.name']; ATeam.TeamCreater := AData.S['group.creator']; ATeam.TeamIntro := AData.S['group.intro']; ATeam.TeamCallBoard := AData.S['group.notice']; ATeam.TeamValidate := TRealICQTeamValidateType(AData.I['group.auth']); ATeam.TeamManagers := ManagersConvertToStr(AData.A['group.managers']); ATeam.TeamMembers := MembersConvertToStr(AData.O['group.members']); except on Ex: Exception do begin Error(Ex.Message, 'TGroupCreateResponse.Excute'); ATeam.Free; end; end; TGroupService.GetService.AddTeam(ATeam); GetMapTeamUsersProvider.Insert(AData.S['group.id'], AData.O['group'].AsJSon(), AData.I['group.ver']); end; { TGroupDeleteResponse } procedure TGroupDeleteResponse.Excute(AData: ISuperObject); var ATeamID: string; begin try ATeamID := AData.A['group.id'].S[0]; TGroupService.GetService.RemoveTeam(ATeamID); except on Ex: Exception do begin Error(Ex.Message, 'TGroupDeleteResponse.Excute'); end; end; end; { TGroupUpdateResponse } procedure TGroupUpdateResponse.Excute(AData: ISuperObject); var ATeam: TRealICQTeam; begin try ATeam := TRealICQTeam.Create; ATeam.TeamID := AData.S['group.id']; ATeam.TeamCaption := AData.S['group.name']; ATeam.TeamIntro := AData.S['group.intro']; ATeam.TeamCallBoard := AData.S['group.notice']; ATeam.TeamValidate := TRealICQTeamValidateType(AData.I['group.auth']); TGroupService.GetService.UpdateTeam(ATeam); except on Ex: Exception do begin Error(Ex.Message, 'TGroupCreateResponse.Excute'); ATeam.Free; end; end; ATeam.Free; // GetMapTeamUsersProvider.Insert(AData.S['group.id'], AData.O['group'].AsJSon(), AData.I['group.ver']); end; { TGroupSearchResponse } procedure TGroupSearchResponse.Excute(AData: ISuperObject); var ARecord: TSearchTeamResultRecord; ARecords: TStringList; iLoop: Integer; jaGroups: TSuperArray; begin ARecords := TStringList.Create; try jaGroups := AData.A['groups']; for iLoop := 0 to jaGroups.Length - 1 do begin ARecord := TSearchTeamResultRecord.Create; ARecord.TeamID := jaGroups[iLoop]['id'].AsString; ARecord.TeamCaption := jaGroups[iLoop]['name'].AsString; ARecord.TeamCreater := jaGroups[iLoop]['creator'].AsString; ARecords.AddObject(IntToStr(iLoop), ARecord); end; TGroupService.GetService.OnSearched(ARecords, AData.I['skip'], AData.I['limit']); finally ARecords.Free; end; end; { TGroupSearchByIDResponse } procedure TGroupSearchByIDResponse.Excute(AData: ISuperObject); var ARecord: TSearchTeamResultRecord; jaGroups: TSuperArray; begin jaGroups := AData.A['groups']; if jaGroups.Length > 0 then begin ARecord := TSearchTeamResultRecord.Create; ARecord.TeamID := jaGroups[0]['id'].AsString; ARecord.TeamCaption := jaGroups[0]['name'].AsString; ARecord.TeamCreater := jaGroups[0]['creator'].AsString; TGroupService.GetService.OnSearched(TSearchTeamResultRecord(ARecord)); end; end; { TBaseProcess } procedure TMemberAddResponse.Excute(AData: ISuperObject); var ATeamID: string; AMembers, AManagers: TStringList; jaMembers, jaManagers: TSuperArray; iLoop: Integer; begin try ATeamID := AData.S['group.id']; if Trim(ATeamID) = '' then Exit; AMembers := TStringList.Create; AManagers := TStringList.Create; jaMembers := AData.A['group.members']; jaManagers := AData.A['group.managers']; for iLoop := 0 to jaMembers.Length - 1 do AMembers.Add(jaMembers.S[iLoop]); for iLoop := 0 to jaManagers.Length - 1 do AManagers.Add(jaManagers.S[iLoop]); if AData.A['group.members'].Length > 0 then TGroupService.GetService.OnAddedMembers(ATeamID, AMembers); if AData.A['group.managers'].Length > 0 then TGroupService.GetService.OnAddedManagers(ATeamID, AManagers); except on Ex: Exception do begin Error(Ex.Message, 'TMemberAddResponse.Excute'); FreeAndNil(AMembers); FreeAndNil(AManagers); end; end; FreeAndNil(AMembers); FreeAndNil(AManagers); end; { TMemberDelResponse } procedure TMemberDelResponse.Excute(AData: ISuperObject); var ATeamID: string; AMembers, AManagers: TStringList; jaMembers, jaManagers: TSuperArray; iLoop: Integer; begin try ATeamID := AData.S['group.id']; if Trim(ATeamID) = '' then Exit; AMembers := TStringList.Create; AManagers := TStringList.Create; jaMembers := AData.A['group.members']; jaManagers := AData.A['group.managers']; for iLoop := 0 to jaMembers.Length - 1 do AMembers.Add(jaMembers.S[iLoop]); for iLoop := 0 to jaManagers.Length - 1 do AManagers.Add(jaManagers.S[iLoop]); if AData.A['group.members'].Length > 0 then TGroupService.GetService.OnDeletedMembers(ATeamID, AMembers); if AData.A['group.managers'].Length > 0 then TGroupService.GetService.OnDeletedManagers(ATeamID, AManagers); except on Ex: Exception do begin Error(Ex.Message, 'TMemberAddResponse.Excute'); FreeAndNil(AMembers); FreeAndNil(AManagers); end; end; FreeAndNil(AMembers); FreeAndNil(AManagers); end; { TMemberApplyP } procedure TMemberApplyP.Excute(AData: ISuperObject); var ATeamID: string; joApply: ISuperObject; begin ATeamID := AData.S['group.id']; joApply := AData.O['group.apply']; TGroupService.GetService.OnReceivedApplyRequest(joApply.S['uid'], joApply.S['msg']); end; { TMemberReplyP } procedure TMemberReplyP.Excute(AData: ISuperObject); var ATeamID: string; joApply: ISuperObject; begin ATeamID := AData.S['group.id']; joApply := AData.O['group.apply']; TGroupService.GetService.OnReceivedApplyRequest(joApply.S['uid'], joApply.S['msg']); end; { TMessageBroadcast } //{id:'', group:{id:[id...]}, message:{message}} procedure TMessageBroadcast.Excute(AData: ISuperObject); var ATeamID: string; ASender: string; AStyle: string; AContent: string; TimesTamp: Int64; ASendTime: TDateTime; jaImgs: TSuperArray; iLoop: Integer; begin ATeamID := AData.A['group.id'].S[0]; AContent := AData.S['msg.txt']; AContent := StringReplace(AContent, '\r\n', #13#10, [rfReplaceAll]); AContent := StringReplace(AContent, '[\r][\n]', '\r\n', [rfReplaceAll]); ASender := AData.S['msg.sender']; ASendTime := UnixToDateTime(Round(AData.I['msg.ts'] / 1000)+8*60*60); AStyle := Format('"%s", %s, [%s], [%s]',[ AData.A['msg.style'].S[0], AData.A['msg.style'].S[1], AData.A['msg.style'].S[3], AData.A['msg.style'].S[2]]); jaImgs := AData.A['msg.img']; for ILoop := 0 to jaImgs.Length - 1 do if jaImgs.O[iLoop].I['ret'] = 1 then Client.DownloadTeamFace(jaImgs.O[iLoop].S['hash'], jaImgs.O[iLoop].S['file'], ''); end; end.