/// <summary>
        /// Send a message to a Character
        /// </summary>
        /// <returns></returns>
        public int?SendMessageToCharacter(string messagePacket, int fromChannel, MessageType messageType, string characterName, int?characterId = null)
        {
            try
            {
                WorldserverDTO worldserver = ServerCommunicationHelper.Instance.Worldservers.SingleOrDefault(c => c.ConnectedCharacters.Any(cc => cc.Key == characterName) ||
                                                                                                             (characterId.HasValue && c.ConnectedCharacters.ContainsValue(characterId.Value)));

                if (worldserver != null)
                {
                    if (String.IsNullOrEmpty(characterName) && characterId.HasValue)
                    {
                        characterName = worldserver.ConnectedCharacters.SingleOrDefault(c => c.Value == characterId.Value).Key;
                    }

                    //character is connected to different world
                    Clients.All.sendMessageToCharacter(characterName, messagePacket, fromChannel, messageType);
                    return(worldserver.ChannelId);
                }
                else if (messageType == MessageType.Shout)
                {
                    //send to all registered worlds
                    Clients.All.sendMessageToCharacter(characterName, messagePacket, fromChannel, messageType);
                    return(null);
                }
            }
            catch (Exception)
            {
                Logger.Log.Error("Sending message to character failed.");
                return(null);
            }

            return(null);
        }
        public int?RegisterWorldserver(string groupName, WorldserverDTO worldserver)
        {
            int?newChannelId = null;

            try
            {
                if (!ServerCommunicationHelper.Instance.WorldserverGroups.Any(g => g.GroupName == groupName))
                {
                    //add world server
                    ServerCommunicationHelper.Instance.Worldservers.Add(worldserver);

                    //create new server group
                    worldserver.ChannelId = 1;
                    newChannelId          = 1;
                    ServerCommunicationHelper.Instance.WorldserverGroups.Add(new WorldserverGroupDTO(groupName, worldserver));
                    Logger.Log.InfoFormat($"World {worldserver.Id} with address {worldserver.Endpoint} has been registered to new server group {groupName}.");
                }
                else if (ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(wg => wg.GroupName == groupName)?.Servers.Contains(worldserver) ?? false)
                {
                    //worldserver is already registered
                    Logger.Log.InfoFormat($"World {worldserver.Id} with address {worldserver.Endpoint} is already registered.");
                }
                else
                {
                    //add worldserver to existing group
                    WorldserverGroupDTO worldserverGroup = ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(wg => wg.GroupName == groupName);

                    //add world server
                    worldserver.ChannelId = worldserverGroup.Servers.Count() + 1;
                    newChannelId          = worldserver.ChannelId;
                    ServerCommunicationHelper.Instance.Worldservers.Add(worldserver);
                    worldserverGroup?.Servers.Add(worldserver);
                    Logger.Log.InfoFormat($"World {worldserver.Id} with address {worldserver.Endpoint} has been added to server group {groupName}.");
                }
            }
            catch (Exception ex)
            {
                Logger.Log.Error($"Registering world {worldserver.Id} with endpoint {worldserver.Endpoint} failed.", ex);
            }

            return(newChannelId);
        }
        private void RemoveWorldFromWorldserver(ScsTcpEndPoint endpoint, string groupName)
        {
            WorldserverDTO worldserverToRemove = ServerCommunicationHelper.Instance.WorldserverGroups
                                                 .SingleOrDefault(g => g.GroupName == groupName).Servers.SingleOrDefault(w => w.Endpoint.Equals(endpoint));

            ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(g => g.GroupName == groupName).Servers.Remove(worldserverToRemove);
            ServerCommunicationHelper.Instance.Worldservers.Remove(worldserverToRemove);
            Logger.Log.InfoFormat($"World {worldserverToRemove.Id} with address {endpoint} has been unregistered successfully.");

            if (!ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(g => g.GroupName == groupName)?.Servers.Any() ?? false)
            {
                WorldserverGroupDTO worldserverGroup = ServerCommunicationHelper.Instance.WorldserverGroups.SingleOrDefault(g => g.GroupName == groupName);

                if (worldserverGroup != null)
                {
                    ServerCommunicationHelper.Instance.WorldserverGroups.Remove(worldserverGroup);
                    Logger.Log.InfoFormat($"World server group {groupName} has been removed as no world was left.");
                }
            }
        }
        /// <summary>
        /// Disconnect character from server.
        /// </summary>
        /// <param name="characterName">Character who wants to disconnect.</param>
        /// <param name="characterId">same as for characterName</param>
        public void DisconnectCharacter(string characterName, long characterId)
        {
            try
            {
                WorldserverDTO worldserver = ServerCommunicationHelper.Instance.Worldservers.SingleOrDefault(s => s.ConnectedCharacters.ContainsKey(characterName));

                if (worldserver != null)
                {
                    worldserver.ConnectedCharacters.Remove(characterName);

                    // inform clients
                    Clients.All.characterDisconnected(characterName, characterId);

                    Logger.Log.InfoFormat($"Character {characterName} has been disconnected.");
                }
            }
            catch (Exception ex)
            {
                Logger.Log.Error("Error while disconnecting character.", ex);
            }
        }
        /// <summary>
        /// Disconnect Account from server.
        /// </summary>
        /// <param name="accountName">Account who wants to disconnect.</param>
        public void DisconnectAccount(string accountName)
        {
            try
            {
                WorldserverDTO worldserver = ServerCommunicationHelper.Instance.Worldservers.SingleOrDefault(s => s.ConnectedAccounts.ContainsKey(accountName.ToLower()));

                if (worldserver != null)
                {
                    worldserver.ConnectedAccounts.Remove(accountName.ToLower());

                    // inform clients
                    Clients.All.accountDisconnected(accountName);

                    Logger.Log.InfoFormat($"Account {accountName} has been disconnected.");
                }
            }
            catch (Exception ex)
            {
                Logger.Log.Error("Error while disconnecting account.", ex);
            }
        }
Exemple #6
0
        /// <summary>
        /// Send a message to a Character
        /// </summary>
        /// <returns></returns>
        public int?SendMessageToCharacter(string worldgroup, string sourceCharacterName, string characterName, string messagePacket, int fromChannel, MessageType messageType)
        {
            try
            {
                WorldserverDTO worldserver = ServerCommunicationHelper.Instance.WorldserverGroups.FirstOrDefault(s => s.GroupName == worldgroup).Servers.SingleOrDefault(c => c.ConnectedCharacters.Any(cc => cc.Key == characterName));

                if (worldserver != null)
                {
                    //character is connected to different world
                    Clients.All.sendMessageToCharacter(worldgroup, sourceCharacterName, characterName, messagePacket, fromChannel, messageType);
                    return(worldserver.ChannelId);
                }
                if (messageType == MessageType.Shout)
                {
                    //send to all registered worlds
                    Clients.All.sendMessageToCharacter("*", sourceCharacterName, characterName, messagePacket, fromChannel, messageType);
                    return(null);
                }
                if (messageType == MessageType.Family)
                {
                    Clients.All.sendMessageToCharacter(worldgroup, sourceCharacterName, characterName, messagePacket, fromChannel, messageType);
                    return(null);
                }
                if (messageType == MessageType.FamilyChat)
                {
                    Clients.All.sendMessageToCharacter(worldgroup, sourceCharacterName, characterName, messagePacket, fromChannel, messageType);
                    return(null);
                }
            }
            catch (Exception)
            {
                Logger.Log.Error("Sending message to character failed.");
                return(null);
            }

            return(null);
        }