public override async void Process() { var alliance = await Resources.Alliances.GetAllianceAsync(AllianceId); if (alliance != null) { if (alliance.Members.Count <= 0 || alliance.Members.Count >= 50) { await new AllianceJoinRequestFailedMessage(Device).SendAsync(); } else if (alliance.Stream.FindIndex(e => e.StreamEntryType == 3 && e.SenderId == Device.Player.Home.Id && ((JoinRequestAllianceStreamEntry)e).State == 1) > -1) { await new AllianceJoinRequestFailedMessage(Device) { Reason = 2 }.SendAsync(); } else { await new AllianceJoinRequestOkMessage(Device).SendAsync(); var entry = new JoinRequestAllianceStreamEntry { Message = Message, State = 1 }; entry.SetTarget(Device.Player); entry.SetSender(Device.Player); alliance.AddEntry(entry); alliance.Save(); } } }
private static void OnRequestAllianceJoinRequestMessageReceived(RequestAllianceJoinRequestMessage message) { if (AllianceManager.TryGet(message.AllianceId, out Alliance alliance)) { LogicLong avatarId = message.Avatar.GetId(); if (alliance.Members.ContainsKey(avatarId) || alliance.Header.GetAllianceType() == AllianceType.OPEN) { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.GENERIC }, message); return; } if (alliance.Header.GetAllianceType() == AllianceType.CLOSED) { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.CLOSED }, message); return; } if (alliance.IsBanned(avatarId)) { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.BANNED }, message); return; } int pendingRequestCount = 0; for (int i = 0; i < alliance.StreamEntryList.Size(); i++) { StreamEntry streamEntry = StreamManager.GetAllianceStream(alliance.StreamEntryList[i]); if (streamEntry != null && streamEntry.GetStreamEntryType() == StreamEntryType.JOIN_REQUEST) { JoinRequestAllianceStreamEntry prevJoinRequestStreamEntry = (JoinRequestAllianceStreamEntry)streamEntry; if (prevJoinRequestStreamEntry.GetState() == 1) { pendingRequestCount += 1; if (prevJoinRequestStreamEntry.GetSenderAvatarId().Equals(avatarId)) { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.ALREADY_SENT }, message); return; } } else if (prevJoinRequestStreamEntry.GetState() == 0 && prevJoinRequestStreamEntry.GetAgeSeconds() < 3600) { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.ALREADY_SENT }, message); return; } } } if (pendingRequestCount >= 10) { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.TOO_MANY_PENDING_REQUESTS }, message); return; } if (message.Avatar.GetScore() < alliance.Header.GetRequiredScore()) { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.NO_SCORE }, message); return; } if (message.Avatar.GetDuelScore() < alliance.Header.GetRequiredDuelScore()) { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.NO_DUEL_SCORE }, message); return; } JoinRequestAllianceStreamEntry joinRequestAllianceStreamEntry = new JoinRequestAllianceStreamEntry(); AllianceStreamEntryUtil.SetSenderInfo(joinRequestAllianceStreamEntry, message.Avatar); string requestMessage = message.Message; if (requestMessage != null && requestMessage.Length >= 128) { requestMessage = requestMessage.Substring(0, 128); } joinRequestAllianceStreamEntry.SetMessage(requestMessage); StreamManager.Create(alliance.Id, joinRequestAllianceStreamEntry); alliance.AddStreamEntry(joinRequestAllianceStreamEntry); AllianceManager.Save(alliance); ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { Success = true }, message); } else { ServerRequestManager.SendResponse(new RequestAllianceJoinResponseMessage { ErrorReason = RequestAllianceJoinResponseMessage.Reason.GENERIC }, message); } }
private void OnRespondToAllianceJoinRequestMessageReceived(RespondToAllianceJoinRequestMessage message) { if (this.m_session.Alliance != null) { Alliance alliance = this.m_session.Alliance; AllianceMemberEntry memberEntry = alliance.Members[this.m_session.AccountId]; if (memberEntry.GetAllianceRole() == LogicAvatarAllianceRole.MEMBER) { AllianceInvitationSendFailedMessage allianceInvitationSendFailedMessage = new AllianceInvitationSendFailedMessage(); allianceInvitationSendFailedMessage.SetReason(AllianceInvitationSendFailedMessage.Reason.NO_RIGHTS); this.m_session.SendPiranhaMessage(allianceInvitationSendFailedMessage, 1); return; } LogicLong streamId = message.GetStreamEntryId(); if (alliance.StreamEntryList.IndexOf(streamId) != -1) { StreamEntry streamEntry = StreamManager.GetAllianceStream(message.GetStreamEntryId()); if (streamEntry.GetStreamEntryType() == StreamEntryType.JOIN_REQUEST) { JoinRequestAllianceStreamEntry joinRequestAllianceStreamEntry = (JoinRequestAllianceStreamEntry)streamEntry; if (joinRequestAllianceStreamEntry.GetState() == 1) { if (message.IsAccepted()) { ServerRequestManager.Create(new GameJoinAllianceRequestMessage { AccountId = joinRequestAllianceStreamEntry.GetSenderAvatarId(), AllianceId = alliance.Id, Invited = true }, ServerManager.GetDocumentSocket(9, joinRequestAllianceStreamEntry.GetSenderAvatarId())).OnComplete = args => { if (this.m_session.IsDestructed()) { return; } if (args.ErrorCode == ServerRequestError.Success) { if (args.ResponseMessage.Success) { joinRequestAllianceStreamEntry.SetState(2); joinRequestAllianceStreamEntry.SetResponderName(memberEntry.GetName()); alliance.UpdateStreamEntry(joinRequestAllianceStreamEntry); StreamManager.Save(joinRequestAllianceStreamEntry); } else { GameJoinAllianceResponseMessage gameJoinAllianceResponseMessage = (GameJoinAllianceResponseMessage)args.ResponseMessage; AllianceInvitationSendFailedMessage allianceInvitationSendFailedMessage = new AllianceInvitationSendFailedMessage(); switch (gameJoinAllianceResponseMessage.ErrorReason) { case GameJoinAllianceResponseMessage.Reason.NO_CASTLE: allianceInvitationSendFailedMessage.SetReason(AllianceInvitationSendFailedMessage.Reason.NO_CASTLE); if (joinRequestAllianceStreamEntry.GetState() == 1) { alliance.RemoveStreamEntry(joinRequestAllianceStreamEntry.GetId()); AllianceManager.Save(alliance); } break; case GameJoinAllianceResponseMessage.Reason.ALREADY_IN_ALLIANCE: allianceInvitationSendFailedMessage.SetReason(AllianceInvitationSendFailedMessage.Reason.ALREADY_IN_ALLIANCE); if (joinRequestAllianceStreamEntry.GetState() == 1) { alliance.RemoveStreamEntry(joinRequestAllianceStreamEntry.GetId()); AllianceManager.Save(alliance); } break; default: allianceInvitationSendFailedMessage.SetReason(AllianceInvitationSendFailedMessage.Reason.GENERIC); break; } this.m_session.SendPiranhaMessage(allianceInvitationSendFailedMessage, 1); } } else { AllianceInvitationSendFailedMessage allianceInvitationSendFailedMessage = new AllianceInvitationSendFailedMessage(); allianceInvitationSendFailedMessage.SetReason(AllianceInvitationSendFailedMessage.Reason.GENERIC); this.m_session.SendPiranhaMessage(allianceInvitationSendFailedMessage, 1); } }; } else { joinRequestAllianceStreamEntry.SetState(0); joinRequestAllianceStreamEntry.SetResponderName(memberEntry.GetName()); alliance.UpdateStreamEntry(joinRequestAllianceStreamEntry); StreamManager.Save(joinRequestAllianceStreamEntry); JoinAllianceResponseAvatarStreamEntry joinAllianceResponseAvatarStreamEntry = new JoinAllianceResponseAvatarStreamEntry(); joinAllianceResponseAvatarStreamEntry.SetSenderAvatarId(memberEntry.GetAvatarId()); joinAllianceResponseAvatarStreamEntry.SetSenderHomeId(memberEntry.GetHomeId()); joinAllianceResponseAvatarStreamEntry.SetSenderName(memberEntry.GetName()); joinAllianceResponseAvatarStreamEntry.SetSenderLevel(memberEntry.GetExpLevel()); joinAllianceResponseAvatarStreamEntry.SetSenderLeagueType(memberEntry.GetLeagueType()); joinAllianceResponseAvatarStreamEntry.SetAllianceId(alliance.Id); joinAllianceResponseAvatarStreamEntry.SetAllianceName(alliance.Header.GetAllianceName()); joinAllianceResponseAvatarStreamEntry.SetAllianceBadgeId(alliance.Header.GetAllianceBadgeId()); ServerMessageManager.SendMessage(new CreateAvatarStreamMessage { AccountId = joinRequestAllianceStreamEntry.GetSenderAvatarId(), Entry = joinAllianceResponseAvatarStreamEntry }, 9); } } } } } }