Пример #1
0
        /// <summary>
        /// Remove Player from Friends Manager Cache
        /// </summary>
        /// <param name="Player">Gameplayer to Remove</param>
        public void RemovePlayerFriendsListFromCache(GamePlayer Player)
        {
            if (Player == null)
            {
                throw new ArgumentNullException("Player");
            }

            string[] friends;
            if (!PlayersFriendsListsCache.TryRemove(Player, out friends))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Gameplayer ({0}) was not registered in Friends Manager Cache while trying to remove!", Player);
                }
            }

            FriendStatus[] offlineFriends;
            if (!PlayersFriendsStatusCache.TryRemove(Player, out offlineFriends))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Gameplayer ({0}) was not registered in Friends Manager Status Cache while trying to remove!", Player);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Add Player to Friends Manager Cache
        /// </summary>
        /// <param name="Player">Gameplayer to Add</param>
        public void AddPlayerFriendsListToCache(GamePlayer Player)
        {
            if (Player == null)
            {
                throw new ArgumentNullException("Player");
            }

            var friends = Player.SerializedFriendsList;

            if (!PlayersFriendsListsCache.AddIfNotExists(Player, friends))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Gameplayer ({0}) is already registered in Friends Manager Cache while adding!", Player);
                }
            }

            var offlineFriends = new FriendStatus[0];

            if (friends.Any())
            {
                offlineFriends = Database.SelectObjects <DOLCharacters>("`Name` = @Name", friends.Select(name => new[] { new QueryParameter("@Name", name) })).SelectMany(chars => chars)
                                 .Select(chr => new FriendStatus(chr.Name, chr.Level, chr.Class, chr.LastPlayed)).ToArray();
            }

            if (!PlayersFriendsStatusCache.AddIfNotExists(Player, offlineFriends))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Gameplayer ({0}) is already registered in Friends Manager Status Cache while adding!", Player);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// Add a Friend Entry to GamePlayer Friends List.
        /// </summary>
        /// <param name="Player">GamePlayer to Add Friend to.</param>
        /// <param name="Friend">Friend's Name to Add</param>
        /// <returns>True if friend was added successfully</returns>
        public bool AddFriendToPlayerList(GamePlayer Player, string Friend)
        {
            if (Player == null)
            {
                throw new ArgumentNullException("Player");
            }

            if (Friend == null)
            {
                throw new ArgumentNullException("Friend");
            }

            Friend = Friend.Trim();

            if (string.IsNullOrEmpty(Friend))
            {
                throw new ArgumentException("Friend need to be a valid non-empty or white space string!", "Friend");
            }

            var success = false;

            if (!PlayersFriendsListsCache.TryUpdate(Player, list => {
                if (list.Contains(Friend))
                {
                    return(list);
                }

                success = true;
                return(list.Concat(new [] { Friend }).ToArray());
            }))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Gameplayer ({0}) was not registered in Friends Manager Cache while trying to Add a new Friend ({1})", Player, Friend);
                }
            }

            if (success)
            {
                Player.Out.SendAddFriends(new [] { Friend });
                Player.SerializedFriendsList = this[Player];

                var offlineFriend = Database.SelectObjects <DOLCharacters>("`Name` = @Name", new QueryParameter("@Name", Friend)).FirstOrDefault();

                if (offlineFriend != null)
                {
                    if (!PlayersFriendsStatusCache.TryUpdate(Player, list => list.Where(frd => frd.Name != Friend)
                                                             .Concat(new [] { new FriendStatus(offlineFriend.Name, offlineFriend.Level, offlineFriend.Class, offlineFriend.LastPlayed) })
                                                             .ToArray()))
                    {
                        if (log.IsWarnEnabled)
                        {
                            log.WarnFormat("Gameplayer ({0}) was not registered in Friends Manager Status Cache while trying to Add a new Friend ({1})", Player, Friend);
                        }
                    }
                }
            }

            return(success);
        }
Пример #4
0
        /// <summary>
        /// Add Player to Friends Manager Cache
        /// </summary>
        /// <param name="Player">Gameplayer to Add</param>
        public void AddPlayerFriendsListToCache(GamePlayer Player)
        {
            if (Player == null)
            {
                throw new ArgumentNullException("Player");
            }

            var friends = Player.SerializedFriendsList;

            if (!PlayersFriendsListsCache.AddIfNotExists(Player, friends))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Gameplayer ({0}) is already registered in Friends Manager Cache while adding!", Player);
                }
            }

            var offlineFriends = Array.Empty <FriendStatus>();

            if (friends.Any())
            {
                offlineFriends = Database.SelectObjects <DOLCharacters>(DB.Column(nameof(DOLCharacters.Name)).IsIn(friends))
                                 .Select(chr => new FriendStatus(chr.Name, chr.Level, chr.Class, chr.LastPlayed)).ToArray();
            }

            if (!PlayersFriendsStatusCache.AddIfNotExists(Player, offlineFriends))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Gameplayer ({0}) is already registered in Friends Manager Status Cache while adding!", Player);
                }
            }
        }
Пример #5
0
        /// <summary>
        /// Remove a Friend Entry from GamePlayer Friends List.
        /// </summary>
        /// <param name="Player">GamePlayer to Add Friend to.</param>
        /// <param name="Friend">Friend's Name to Add</param>
        /// <returns>True if friend was added successfully</returns>
        public bool RemoveFriendFromPlayerList(GamePlayer Player, string Friend)
        {
            if (Player == null)
            {
                throw new ArgumentNullException("Player");
            }

            if (Friend == null)
            {
                throw new ArgumentNullException("Friend");
            }

            Friend = Friend.Trim();

            if (string.IsNullOrEmpty(Friend))
            {
                throw new ArgumentException("Friend need to be a valid non-empty or white space string!", "Friend");
            }

            var success = false;

            if (!PlayersFriendsListsCache.TryUpdate(Player, list => {
                var result = list.Except(new [] { Friend }).ToArray();
                if (result.Length < list.Length)
                {
                    success = true;
                    return(result);
                }

                return(list);
            }))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Gameplayer ({0}) was not registered in Friends Manager Cache while trying to Remove a Friend ({1})", Player, Friend);
                }
            }

            if (success)
            {
                Player.Out.SendRemoveFriends(new [] { Friend });
                Player.SerializedFriendsList = this[Player];

                if (!PlayersFriendsStatusCache.TryUpdate(Player, list => list.Where(frd => frd.Name != Friend).ToArray()))
                {
                    if (log.IsWarnEnabled)
                    {
                        log.WarnFormat("Gameplayer ({0}) was not registered in Friends Manager Status Cache while trying to Remove a Friend ({1})", Player, Friend);
                    }
                }
            }

            return(success);
        }
Пример #6
0
        /// <summary>
        /// Send Players Friends Social Windows
        /// </summary>
        /// <param name="Player">GamePlayer to Send Friends social window to</param>
        public void SendPlayerFriendsSocial(GamePlayer Player)
        {
            if (Player == null)
            {
                throw new ArgumentNullException("Player");
            }

            // "TF" - clear friend list in social
            Player.Out.SendMessage("TF", eChatType.CT_SocialInterface, eChatLoc.CL_SystemWindow);

            var offlineFriends = this[Player].ToList();
            var index          = 0;

            foreach (var friend in this[Player].Select(name => PlayersFriendsListsCache.FirstOrDefault(kv => kv.Key.Name == name))
                     .Where(kv => kv.Key != null && !kv.Key.IsAnonymous).Select(kv => kv.Key))
            {
                offlineFriends.Remove(friend.Name);
                Player.Out.SendMessage(
                    string.Format(
                        "F,{0},{1},{2},{3},\"{4}\"",
                        index++,
                        friend.Name,
                        friend.Level,
                        friend.CharacterClass.ID,
                        friend.CurrentZone == null ? string.Empty : friend.CurrentZone.Description),
                    eChatType.CT_SocialInterface, eChatLoc.CL_SystemWindow);
            }

            // Query Offline Characters
            FriendStatus[] offline;

            if (PlayersFriendsStatusCache.TryGetValue(Player, out offline))
            {
                foreach (var friend in offline.Where(frd => offlineFriends.Contains(frd.Name)))
                {
                    Player.Out.SendMessage(
                        string.Format(
                            "F,{0},{1},{2},{3},\"{4}\"",
                            index++,
                            friend.Name,
                            friend.Level,
                            friend.ClassID,
                            friend.LastPlayed),
                        eChatType.CT_SocialInterface, eChatLoc.CL_SystemWindow);
                }
            }
        }
Пример #7
0
        /// <summary>
        /// Notify Friends of this Player that he exited Game
        /// </summary>
        /// <param name="Player">GamePlayer to notify to friends</param>
        private void NotifyPlayerFriendsExitingGame(GamePlayer Player)
        {
            var playerName   = Player.Name;
            var playerUpdate = new [] { playerName };

            foreach (GamePlayer friend in PlayersFriendsListsCache.Where(kv => kv.Value.Contains(playerName)).Select(kv => kv.Key))
            {
                friend.Out.SendRemoveFriends(playerUpdate);
            }

            var offline = new FriendStatus(Player.Name, Player.Level, Player.CharacterClass.ID, DateTime.Now);

            PlayersFriendsStatusCache.FreezeWhile(dict => {
                foreach (var list in dict.Where(kv => kv.Value.Any(frd => frd.Name == Player.Name)).ToArray())
                {
                    dict[list.Key] = list.Value.Where(frd => frd.Name != Player.Name).Concat(new [] { offline }).ToArray();
                }
            });
        }