public async Task AddFriendRequestHandler(AddFriendRequestPacket packet, IRakConnection connection) { var session = Server.SessionCache.GetSession(connection.EndPoint); var zone = ((WorldServer)Server).Zones.FirstOrDefault(z => z.ZoneId == session.ZoneId); if (zone == default) { Logger.Error($"Invalid ZoneId for {connection}"); return; } var player = zone.Players.First(p => p.Connection.Equals(connection)); await using var ctx = new UchuContext(); var friend = await ctx.Characters.FirstOrDefaultAsync(c => c.Name == packet.PlayerName); if (friend == default) { Logger.Information( $"{player.Name} is trying to be friends with a none existent player {packet.PlayerName}" ); player.Message(new NotifyFriendRequestResponsePacket { PlayerName = packet.PlayerName, Response = ServerFriendRequestResponse.InvalidName }); return; } var character = ctx.Characters.First(c => c.Id == session.CharacterId); var alreadyFriends = await ctx.Friends.Where(f => f.FriendA == character.Id || f.FriendB == character.Id ).AnyAsync(); if (alreadyFriends) { player.Message(new NotifyFriendRequestResponsePacket { PlayerName = packet.PlayerName, Response = ServerFriendRequestResponse.AlreadyFriends }); return; } var isPending = await ctx.FriendRequests.Where(f => f.Sender == character.Id && f.Receiver == friend.Id ).AnyAsync(); if (isPending) { player.Message(new NotifyFriendRequestResponsePacket { PlayerName = packet.PlayerName, Response = ServerFriendRequestResponse.PendingApproval }); return; } var request = new FriendRequest { Sender = character.Id, Receiver = friend.Id, BestFriend = packet.IsRequestingBestFriend }; await ctx.FriendRequests.AddAsync(request); }
public async Task AddFriendRequestHandler(AddFriendRequestPacket packet, IRakConnection connection) { var session = Server.SessionCache.GetSession(connection.EndPoint); var zone = ((WorldServer)Server).Zones.FirstOrDefault(z => z.ZoneInfo.LuzFile.WorldId == session.ZoneId); if (zone == default) { Logger.Error($"Invalid ZoneId for {connection}"); return; } var player = zone.Players.First(p => p.Connection.Equals(connection)); await using var ctx = new UchuContext(); var friend = ctx.Characters.FirstOrDefault(c => c.Name == packet.PlayerName); if (friend == default) { Logger.Information( $"{player.Name} is trying to be friends with a none existent player {packet.PlayerName}" ); player.Message(new NotifyFriendRequestResponsePacket { PlayerName = packet.PlayerName, Response = ServerFriendRequestResponse.InvalidName }); return; } var character = ctx.Characters.First(c => c.CharacterId == session.CharacterId); var relations = ctx.Friends.Where(f => f.FriendId == character.CharacterId || f.FriendTwoId == character.CharacterId ).ToArray(); foreach (var relation in relations) { if (!relation.IsAccepted || relation.IsDeclined) { continue; } if (relation.FriendId == friend.CharacterId || relation.FriendTwoId == friend.CharacterId) { if (!relation.IsBestFriend && packet.IsRequestingBestFriend) { continue; } player.Message(new NotifyFriendRequestResponsePacket { PlayerName = packet.PlayerName, Response = ServerFriendRequestResponse.AlreadyFriends }); return; } } Logger.Information($"Sending friend request from {player.Name} to {packet.PlayerName}!"); var invite = relations.FirstOrDefault(relation => relation.FriendId == friend.CharacterId || relation.FriendTwoId == friend.CharacterId ); if (invite == default) { invite = new Friend { FriendId = character.CharacterId, FriendTwoId = friend.CharacterId }; ctx.Friends.Add(invite); } else { invite.RequestingBestFriend = true; } // Friend one is sender; invite.FriendId = character.CharacterId; invite.FriendTwoId = friend.CharacterId; var friendPlayer = zone.Players.FirstOrDefault(p => p.ObjectId == invite.FriendTwoId); Logger.Information($"{friendPlayer} is getting a friend request from {player.Name}!"); invite.RequestHasBeenSent = false; if (!ReferenceEquals(friendPlayer, null)) { player.Message(new NotifyFriendRequestPacket { FriendName = player.Name, IsBestFriendRequest = packet.IsRequestingBestFriend }); invite.RequestHasBeenSent = true; Logger.Information($"Friend request sent to {friendPlayer} from {player}"); } await ctx.SaveChangesAsync(); }