protected override async Task Handle(PJoinPacket packet, IPlayerEntity player) { switch (packet.RequestType) { case PJoinPacketType.Requested: case PJoinPacketType.Invited: await player.EmitEventAsync(new GroupInvitationSendEvent { Target = _manager.GetPlayerByCharacterId(packet.CharacterId) }); break; case PJoinPacketType.Accepted: GroupInvitDto group = _groupManager.GetPendingInvitationsByCharacterId(player.Id)?.FirstOrDefault(s => s.Target == player); if (group == null) { return; } await player.EmitEventAsync(new GroupInvitationAcceptEvent { Invitation = group }); break; case PJoinPacketType.Declined: GroupInvitDto invitation = _groupManager.GetPendingInvitationsByCharacterId(player.Id)?.FirstOrDefault(s => s.Target == player); if (invitation == null) { return; } await player.EmitEventAsync(new GroupInvitationRefuseEvent() { Invitation = invitation }); break; case PJoinPacketType.Sharing: break; case PJoinPacketType.AcceptedShare: break; case PJoinPacketType.DeclinedShare: break; } }
public void RemoveInvitation(GroupInvitDto dto) { if (_pendingInvitations.ContainsKey(dto.Id)) { if (_pendingInvitationsByCharacterId.TryGetValue(dto.Target.Id, out List <GroupInvitDto> group)) { group.Remove(dto); } _pendingInvitations.Remove(dto.Id); } }
public GroupInvitDto CreateInvitation(IPlayerEntity sender, IPlayerEntity target) { var invitation = new GroupInvitDto { Id = Guid.NewGuid(), Sender = sender, Target = target, CreationUtc = DateTime.UtcNow }; _pendingInvitations.Add(invitation.Id, invitation); if (!_pendingInvitationsByCharacterId.TryGetValue(target.Id, out List <GroupInvitDto> invitations)) { invitations = new List <GroupInvitDto>(); _pendingInvitationsByCharacterId[target.Id] = invitations; } invitations.Add(invitation); return(invitation); }
public void AcceptInvitation(GroupInvitDto dto) { if (!_pendingInvitations.TryGetValue(dto.Id, out dto)) { return; } RemoveInvitation(dto); if (dto.Target.HasGroup) { return; } if (!dto.Sender.HasGroup) { CreateGroup(dto.Sender); } dto.Target.JoinGroup(dto.Sender.Group).ConfigureAwait(false).GetAwaiter().GetResult(); }