/// <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); } }
/// <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); }