public async Task <PartyUpdateUserMigrationResponse> UpdateUserMigration(PartyUpdateUserMigrationRequest request) { var source = new CancellationTokenSource(); source.CancelAfter(PartyLockTimeoutDuration); var @lock = await _locker.AcquireAsync(PartyLockKey, cancellationToken : source.Token); if (@lock != null) { var result = PartyServiceResult.Ok; var party = await _repository.RetrieveByMember(request.Character); var member = party?.Members?.FirstOrDefault(m => m.ID == request.Character); if (party == null || member == null) { result = PartyServiceResult.FailedNotInParty; } if (result == PartyServiceResult.Ok) { member.Channel = request.Channel; member.Field = request.Field; await _repository.Update(party); await Task.WhenAll(party.Members.Select(async m => { var packet = new UnstructuredOutgoingPacket(PacketSendOperations.PartyResult); packet.WriteByte((byte)PartyResultCode.UserMigration); packet.WriteInt(party.ID); packet.WritePartyData(party, m.Channel); var dispatchRequest = new DispatchToCharactersRequest { Data = ByteString.CopyFrom(packet.Buffer) }; dispatchRequest.Characters.Add(m.ID); await _dispatcher.DispatchToCharacters(dispatchRequest); })); await _messenger.PublishAsync(new PartyUpdateEvent { Party = party }); } await @lock.ReleaseAsync(); return(new PartyUpdateUserMigrationResponse { Result = result }); } return(new PartyUpdateUserMigrationResponse { Result = PartyServiceResult.FailedTimeout }); }
public async Task <PartyJoinResponse> Join(PartyJoinRequest request) { var source = new CancellationTokenSource(); source.CancelAfter(PartyLockTimeoutDuration); var @lock = await _locker.AcquireAsync(PartyLockKey, cancellationToken : source.Token); if (@lock != null) { var result = PartyServiceResult.Ok; var party = await _repository.Retrieve(request.Party); if (await _repository.RetrieveByMember(request.Member.Id) != null) { result = PartyServiceResult.FailedAlreadyInParty; } if (party == null) { result = PartyServiceResult.FailedNonExistentParty; } else if (party.Members.Any(m => m.ID == request.Member.Id)) { result = PartyServiceResult.FailedAlreadyInParty; } else if (party.Members.Count >= 6) { result = PartyServiceResult.FailedFullParty; } if (result == PartyServiceResult.Ok) { party.Members.Add(new PartyMemberRecord(request.Member)); await _repository.Update(party); await Task.WhenAll(party.Members.Select(async m => { var packet = new UnstructuredOutgoingPacket(PacketSendOperations.PartyResult); packet.WriteByte((byte)PartyResultCode.JoinParty_Done); packet.WriteInt(party.ID); packet.WriteString(request.Member.Name); packet.WritePartyData(party, m.Channel); var dispatchRequest = new DispatchToCharactersRequest { Data = ByteString.CopyFrom(packet.Buffer) }; dispatchRequest.Characters.Add(m.ID); await _dispatcher.DispatchToCharacters(dispatchRequest); })); await _messenger.PublishAsync(new PartyUpdateEvent { Party = party }); } await @lock.ReleaseAsync(); return(new PartyJoinResponse { Result = result, Party = party?.ToContract() }); } return(new PartyJoinResponse { Result = PartyServiceResult.FailedTimeout }); }
public async Task <PartyWithdrawResponse> Withdraw(PartyWithdrawRequest request) { var source = new CancellationTokenSource(); source.CancelAfter(PartyLockTimeoutDuration); var @lock = await _locker.AcquireAsync(PartyLockKey, cancellationToken : source.Token); if (@lock != null) { var result = PartyServiceResult.Ok; var party = await _repository.RetrieveByMember(request.Character); var member = party?.Members?.FirstOrDefault(m => m.ID == request.Character); if (party == null || member == null) { result = PartyServiceResult.FailedNotInParty; } if (result == PartyServiceResult.Ok) { var targets = party.Members.ToList(); var isDisband = request.Character == party.Boss; if (isDisband) { party.Members.Clear(); await _repository.Delete(party); } else { party.Members.Remove(member); await _repository.Update(party); } await Task.WhenAll(targets.Select(async m => { var packet = new UnstructuredOutgoingPacket(PacketSendOperations.PartyResult); packet.WriteByte((byte)PartyResultCode.WithdrawParty_Done); packet.WriteInt(party.ID); packet.WriteInt(request.Character); packet.WriteBool(!isDisband); if (!isDisband) { packet.WriteBool(request.IsKick); packet.WriteString(member.Name); packet.WritePartyData(party, m.Channel); } var dispatchRequest = new DispatchToCharactersRequest { Data = ByteString.CopyFrom(packet.Buffer) }; dispatchRequest.Characters.Add(m.ID); await _dispatcher.DispatchToCharacters(dispatchRequest); })); await _messenger.PublishAsync(new PartyUpdateEvent { Party = party }); } await @lock.ReleaseAsync(); return(new PartyWithdrawResponse { Result = result }); } return(new PartyWithdrawResponse { Result = PartyServiceResult.FailedTimeout }); }