public Friend AddOrUpdate(ulong friendId, Player plr, FriendState playerState, FriendState friendState) { using (var db = GameDatabase.Open()) { if (_friends.TryGetValue(friendId, out var friend)) { var dbFriend = DbUtil.Find <PlayerFriendDto>(db, statement => statement .Where( $"{nameof(PlayerFriendDto.PlayerId):C} = @PlayerId AND {nameof(PlayerFriendDto.FriendId):C} = @FriendId") .WithParameters(new { PlayerId = Player.Account.Id, FriendId = friendId })).FirstOrDefault(); if (dbFriend == null) { dbFriend = DbUtil.Find <PlayerFriendDto>(db, statement => statement .Where( $"{nameof(PlayerFriendDto.PlayerId):C} = @PlayerId AND {nameof(PlayerFriendDto.FriendId):C} = @FriendId") .WithParameters(new { PlayerId = friendId, FriendId = Player.Account.Id })).FirstOrDefault(); } if (dbFriend == null) { throw new Exception("db and server are de-synced!"); } dbFriend.PlayerState = (int)playerState; dbFriend.FriendState = (int)friendState; DbUtil.Update(db, dbFriend); friend.PlayerState = playerState; friend.FriendState = friendState; return(friend); } var newDbFriend = new PlayerFriendDto() { PlayerId = (int)Player.Account.Id, FriendId = (int)friendId, PlayerState = (int)playerState, FriendState = (int)friendState }; DbUtil.Insert(db, newDbFriend); var newFriend = new Friend(Player.Account.Id, friendId, playerState, friendState); if (!_friends.TryAdd(newFriend.FriendId, newFriend)) { throw new ArgumentException("Player is already added", nameof(Player.Account.Id)); } if (plr != null) { var newPlrFriend = new Friend(friendId, Player.Account.Id, friendState, playerState); if (!plr.FriendManager._friends.TryAdd(Player.Account.Id, newPlrFriend)) { throw new ArgumentException("Player is already added", nameof(newFriend.FriendId)); } } return(newFriend); } }
internal Friend(PlayerFriendDto dto) { AccountId = (ulong)dto.PlayerId; FriendId = (ulong)dto.FriendId; PlayerState = (FriendState)dto.PlayerState; FriendState = (FriendState)dto.FriendState; }