public async UniTaskVoid HandleRequestKickMemberFromGuild(RequestHandlerData requestHandler, RequestKickMemberFromGuildMessage request, RequestProceedResultDelegate <ResponseKickMemberFromGuildMessage> result) { #if UNITY_STANDALONE && !CLIENT_BUILD await UniTask.Yield(); IPlayerCharacterData playerCharacter; if (!GameInstance.ServerUserHandlers.TryGetPlayerCharacter(requestHandler.ConnectionId, out playerCharacter)) { result.InvokeError(new ResponseKickMemberFromGuildMessage() { message = UITextKeys.UI_ERROR_NOT_LOGGED_IN, }); return; } ValidateGuildRequestResult validateResult = GameInstance.ServerGuildHandlers.CanKickMemberFromGuild(playerCharacter, request.memberId); if (!validateResult.IsSuccess) { result.InvokeError(new ResponseKickMemberFromGuildMessage() { message = validateResult.GameMessage, }); return; } // Save to database AsyncResponseData <EmptyMessage> updateResp = await DbServiceClient.ClearCharacterGuildAsync(new ClearCharacterGuildReq() { CharacterId = request.memberId }); if (!updateResp.IsSuccess) { result.InvokeError(new ResponseKickMemberFromGuildMessage() { message = validateResult.GameMessage, }); return; } // Delete from cache IPlayerCharacterData memberCharacter; long memberConnectionId; if (GameInstance.ServerUserHandlers.TryGetPlayerCharacterById(request.memberId, out memberCharacter) && GameInstance.ServerUserHandlers.TryGetConnectionId(request.memberId, out memberConnectionId)) { memberCharacter.ClearGuild(); GameInstance.ServerGameMessageHandlers.SendClearGuildData(memberConnectionId, validateResult.GuildId); } validateResult.Guild.RemoveMember(request.memberId); GameInstance.ServerGuildHandlers.SetGuild(validateResult.GuildId, validateResult.Guild); // Broadcast via chat server if (ClusterClient.IsNetworkActive) { ClusterClient.SendRemoveSocialMember(MMOMessageTypes.UpdateGuildMember, validateResult.GuildId, request.memberId); } GameInstance.ServerGameMessageHandlers.SendRemoveGuildMemberToMembers(validateResult.Guild, request.memberId); result.InvokeSuccess(new ResponseKickMemberFromGuildMessage()); #endif }
public async UniTaskVoid HandleRequestLeaveGuild(RequestHandlerData requestHandler, EmptyMessage request, RequestProceedResultDelegate <ResponseLeaveGuildMessage> result) { #if UNITY_STANDALONE && !CLIENT_BUILD await UniTask.Yield(); IPlayerCharacterData playerCharacter; if (!GameInstance.ServerUserHandlers.TryGetPlayerCharacter(requestHandler.ConnectionId, out playerCharacter)) { result.InvokeError(new ResponseLeaveGuildMessage() { message = UITextKeys.UI_ERROR_NOT_LOGGED_IN, }); return; } ValidateGuildRequestResult validateResult = GameInstance.ServerGuildHandlers.CanLeaveGuild(playerCharacter); if (!validateResult.IsSuccess) { result.InvokeError(new ResponseLeaveGuildMessage() { message = validateResult.GameMessage, }); return; } if (validateResult.Guild.IsLeader(playerCharacter.Id)) { // Delete from database AsyncResponseData <EmptyMessage> deleteResp = await DbServiceClient.DeleteGuildAsync(new DeleteGuildReq() { GuildId = validateResult.GuildId }); if (!deleteResp.IsSuccess) { result.InvokeError(new ResponseLeaveGuildMessage() { message = UITextKeys.UI_ERROR_INTERNAL_SERVER_ERROR, }); return; } IPlayerCharacterData memberCharacter; long memberConnectionId; foreach (string memberId in validateResult.Guild.GetMemberIds()) { // Save to database _ = DbServiceClient.ClearCharacterGuildAsync(new ClearCharacterGuildReq() { CharacterId = memberId }); // Update cache if (GameInstance.ServerUserHandlers.TryGetPlayerCharacterById(memberId, out memberCharacter) && GameInstance.ServerUserHandlers.TryGetConnectionId(memberId, out memberConnectionId)) { memberCharacter.ClearGuild(); GameInstance.ServerGameMessageHandlers.SendClearGuildData(memberConnectionId, validateResult.GuildId); } // Broadcast via chat server if (ClusterClient.IsNetworkActive) { ClusterClient.SendRemoveSocialMember(MMOMessageTypes.UpdateGuildMember, validateResult.GuildId, memberId); } } GameInstance.ServerGuildHandlers.RemoveGuild(validateResult.GuildId); // Broadcast via chat server if (ClusterClient.IsNetworkActive) { ClusterClient.SendGuildTerminate(MMOMessageTypes.UpdateGuild, validateResult.GuildId); } } else { // Save to database AsyncResponseData <EmptyMessage> updateResp = await DbServiceClient.ClearCharacterGuildAsync(new ClearCharacterGuildReq() { CharacterId = playerCharacter.Id }); if (!updateResp.IsSuccess) { result.InvokeError(new ResponseLeaveGuildMessage() { message = UITextKeys.UI_ERROR_INTERNAL_SERVER_ERROR, }); return; } // Update cache playerCharacter.ClearGuild(); validateResult.Guild.RemoveMember(playerCharacter.Id); GameInstance.ServerGuildHandlers.SetGuild(validateResult.GuildId, validateResult.Guild); GameInstance.ServerGameMessageHandlers.SendRemoveGuildMemberToMembers(validateResult.Guild, playerCharacter.Id); GameInstance.ServerGameMessageHandlers.SendClearGuildData(requestHandler.ConnectionId, validateResult.GuildId); // Broadcast via chat server if (ClusterClient.IsNetworkActive) { ClusterClient.SendRemoveSocialMember(MMOMessageTypes.UpdateGuildMember, validateResult.GuildId, playerCharacter.Id); } } result.InvokeSuccess(new ResponseLeaveGuildMessage()); #endif }