public void RemoveNode(AuthoryNode node) { foreach (var server in node.MapServers) { server.AuthoryMap.OnlineChannels.Remove(server); } Nodes.Remove(node); }
public void CheckNodeConnections() { for (int i = DataHandler.Nodes.Count - 1; i >= 0; i--) { if (DataHandler.Nodes[i].NodeMasterConnection.Status == NetConnectionStatus.Disconnected) { AuthoryNode node = DataHandler.Nodes[i]; Console.WriteLine($"Removing node: {node}"); DataHandler.RemoveNode(node); } } }
public AuthoryMapServer(AuthoryNode masterNode, int mapPort, AuthoryMap map) { OnlineCharacters = new List <Character>(); this.MasterNode = masterNode; this.IP = masterNode.NodeMasterIP; this.Port = mapPort; this.AuthoryMap = map; }
/// <summary> /// Nodes will report their map servers load every X seconds. /// </summary> /// <param name="msgIn"></param> public void LoadReport(NetIncomingMessage msgIn) { AuthoryNode node = DataHandler.GetNode(msgIn.SenderConnection); int count = msgIn.ReadInt32(); for (int i = 0; i < count; i++) { AuthoryMapServer channel = node.GetMapServerByPort(msgIn.ReadInt32()); int channelLoad = msgIn.ReadInt32(); channel.Load = channelLoad; } }
/// <summary> /// When a new Node server connects. /// </summary> /// <param name="msgIn"></param> /// <param name="hailMessage"></param> public void NewServerNodeConnection(NetIncomingMessage msgIn, NetIncomingMessage hailMessage) { Console.WriteLine("New node connection..."); string ip = hailMessage.ReadString(); int port = msgIn.SenderConnection.RemoteEndPoint.Port; int latestPort = DataHandler.FindLatestPort(); Console.WriteLine($"Latest port: {latestPort}"); latestPort++; Console.WriteLine($"Latest port: {latestPort}"); Console.WriteLine($"Connection: {ip}:{port}"); AuthoryNode newNode = new AuthoryNode(msgIn.SenderConnection, ip, port); Console.WriteLine($"New node created:"); Console.WriteLine(newNode); if (DataHandler.Nodes.Count == 0) { OutgoingMessageHandler.Instance.SendMapsRequest(newNode.NodeMasterConnection, DataHandler.Maps.Values.ToArray(), latestPort); Console.WriteLine($"Current node count {DataHandler.Nodes.Count} requesting all maps from new node"); Console.WriteLine(newNode); DataHandler.ListNodes(); } else { AuthoryNode overloadedNode = DataHandler.GetOverloadedNode(); AuthoryMapServer overloadedMap = overloadedNode.GetOverloadedMap(); if (overloadedMap == null) { DataHandler.ListNodes(); throw new Exception("There aren't any nodes at the moment!"); } else { OutgoingMessageHandler.Instance.SendMapsRequest(newNode.NodeMasterConnection, overloadedMap.AuthoryMap, latestPort); Console.WriteLine("Map request sent..."); } } DataHandler.AddNode(newNode); Console.WriteLine($"New node added to Online Nodes."); Console.WriteLine(); }
/// <summary> /// When a map server closes on a node. /// </summary> /// <param name="msgIn"></param> public void MapsRemoved(NetIncomingMessage msgIn) { AuthoryNode node = DataHandler.GetNode(msgIn.SenderConnection); int msgInfoCount = msgIn.ReadInt32(); for (int i = 0; i < msgInfoCount; i++) { int mapPort = msgIn.ReadInt32(); int mapIndex = msgIn.ReadInt32(); string mapName = msgIn.ReadString(); node.RemoveMapServer(mapPort, mapIndex, mapName); } }
public AuthoryNode GetOverloadedNode() { AuthoryNode returnNode = null; foreach (var node in Nodes) { if (returnNode == null) { returnNode = node; } else { if (returnNode.GetOverallLoad() < node.GetOverallLoad()) { returnNode = node; } } } return(returnNode); }
/// <summary> /// If the map server approved the connection of the sent character. The server will send the map server information to the connected client. /// </summary> /// <param name="msgIn"></param> public void ConnectionApproved(NetIncomingMessage msgIn) { int port = msgIn.ReadInt32(); int accountId = msgIn.ReadInt32(); int characterId = msgIn.ReadInt32(); long uid = msgIn.ReadInt64(); ushort characterServerId = msgIn.ReadUInt16(); Console.WriteLine("Connection Approved at uid: " + uid); Account account = DataHandler.GetAccount(accountId); account.SetConnectedCharacter(characterId); account.ConnectionApproved = true; AuthoryNode node = DataHandler.GetNode(msgIn.SenderConnection); if (node == null) { Console.WriteLine($"Node not found with Connection({msgIn.SenderConnection})"); return; } AuthoryMapServer server = node.GetMapServerByPort(port); if (server == null) { Console.WriteLine($"Server not found with Port({port})"); return; } account.ConnectedServerMap = server; if (server.GetCharacter(characterId) == null) { server.OnlineCharacters.Add(account.ConnectedCharacter); } OutgoingMessageHandler.Instance.SendConnectionApproved(account, server); }
/// <summary> /// When a node creates a map server. /// </summary> /// <param name="msgIn"></param> public void MapCreated(NetIncomingMessage msgIn) { AuthoryNode node = DataHandler.GetNode(msgIn.SenderConnection); int mapPort = msgIn.ReadInt32(); int mapIndex = msgIn.ReadInt32(); string mapName = msgIn.ReadString(); Console.WriteLine("Created map port: " + mapPort); Console.WriteLine("MAP NAME: " + mapName); Console.WriteLine("MAP IDNEX: " + mapIndex); AuthoryMapServer map = new AuthoryMapServer(node, mapPort, DataHandler.Maps.Values.Single(x => x.MapIndex == mapIndex)); node.AddMapServer(map); DataHandler.GetMap(mapIndex).OnlineChannels.Add(map); Console.WriteLine("Map added:"); Console.WriteLine(map); }
public void AddNode(AuthoryNode newNode) { Nodes.Add(newNode); }