public void NotifyClients(uint sessionId, ServerInfoBase info) { var serverName = ""; if (info is WorldServerInfo) { serverName = "WorldServer"; } else if (info is WorldNodeInfo) { serverName = "NodeServer"; } if (info == null) { if (Servers.TryRemove(sessionId, out info)) { Log.Message($"{serverName} (Realm: {info.RealmId}, Host: {info.IPAddress}, Port: {info.Port}) disconnected."); } } else { var status = "connected"; if (Servers.ContainsKey(sessionId)) { status = "updated"; } Servers.AddOrUpdate(sessionId, info, (k, v) => info); Log.Message($"{serverName} (Host: {info.IPAddress}, Port: {info.Port}, Connections: {info.ActiveConnections}) {status}."); } }
/// <summary> /// Will apply the current server-info to the public vars /// </summary> /// <param name="si"></param> private void ApplyServerInfo(ServerInfoBase si) { var nu = si == null; LastStatusDate = nu ? "-" : si.RequestDate.AddMilliseconds(si.RequestTime).ToString("HH:mm:ss"); IsOnline = !nu && si.HadSuccess; PlayerCount = nu ? 0 : si.CurrentPlayerCount; MaxPlayerCount = nu ? 0 : si.MaxPlayerCount; Version = nu ? "0.0.0" : si.MinecraftVersion; MOTD = nu || !si.HadSuccess ? "-" : si.ServerMotd; LastError = !nu && si.LastError != null?si.LastError.GetType().Name : "-"; PlayerList.Clear(); if (!nu && si.OnlinePlayers != null) { PlayerList.AddRange(si.OnlinePlayers); } }
private ServerInfoBase Ping(CancellationToken ct) { var srv = "[" + Address + ":" + Port + "]"; Logger.WriteLine("Pinging server " + srv); ServerInfoBase current = null; // safety-wrapper try { // current server-info object for (var i = 0; i < 2; i++) { if ((current = GetMethod(i, ct)).HadSuccess || ct.IsCancellationRequested) { break; } } // if the result is null, nothing to do here if (current != null) { Logger.WriteLine("Ping result " + srv + " is " + current.HadSuccess, Types.LogLevel.Debug); _history.Add(current); } else { Logger.WriteLine("Ping result null " + srv, Types.LogLevel.Debug); } } catch (Exception ex) { Logger.WriteLine("Fatal Error when Pinging... " + ex.ToString(), Types.LogLevel.Error); } // cleanup, done ClearMem(); return(current); }
/// <summary> /// This method will repeatedly ping the server to request infos. /// It will then trigger given events. /// </summary> public void Ping(CancellationToken ct) { var srv = "[" + Address + ":" + Port + "]"; Program.WriteLine("Pinging server " + srv); // safety-wrapper try { // current server-info object ServerInfoBase current = null; for (var i = 0; i < 2; i++) { if ((current = GetMethod(i, ct)).HadSuccess || ct.IsCancellationRequested) { break; } } // if the result is null, nothing to do here if (current != null) { Program.WriteLine("Ping result " + srv + " is " + current.HadSuccess); History.Add(current); } else { Program.WriteLine("Ping result null " + srv); } } catch (Exception ex) { Program.WriteLine("Fatal Error when Pinging... " + ex.ToString()); } // cleanup, done ClearMem(); }
public ServerStatsWrapper(ServerInfoBase serverInfo, ServerPlayersBase[] players, int gameServerId) { this.serverInfo = serverInfo; this.players = players; this.gameServerId = gameServerId; }
/// <summary> /// Will compare the last status with the current one and return event updates. /// </summary> /// <returns></returns> public EventBase[] Update() { // event-queue var events = new List <EventBase>(); var isFirst = last == null; var current = Base.GetLatestServerInfo(); if (current != null) { // if first info, or last success was different from this (either went online or went offline) => invoke if (NotifyServer && (isFirst || last.HadSuccess != current.HadSuccess)) { Debug.WriteLine("Server '" + Base.Address + ":" + Base.Port + "' status change: " + current.HadSuccess); var errMsg = current.LastError != null ? "Connection Failed: " + current.LastError.GetType().Name : ""; events.Add(new OnlineStatusEvent(current.HadSuccess, current.HadSuccess ? current.ServerMotd : errMsg)); } // if first info, or last player count was different (player went online or offline) => invoke if (NotifyCount) { var diff = isFirst ? current.CurrentPlayerCount : current.CurrentPlayerCount - last.CurrentPlayerCount; if (diff != 0) { Debug.WriteLine("Server '" + Base.Address + ":" + Base.Port + "' count change: " + diff); events.Add(new PlayerChangeEvent(diff)); } } // check current list for new players var onlineIds = new List <string>(); if (current.OnlinePlayers != null) { foreach (var p in current.OnlinePlayers) { // save online user id temporarily if (!onlineIds.Contains(p.Id)) { onlineIds.Add(p.Id); } // register name userNames[p.Id] = p.Name; // if notify and user has state and last state was offline and user is watched, notify change if (NotifyNames && (!userStates.ContainsKey(p.Id) || !userStates[p.Id])) { events.Add(new PlayerStateEvent(p, true)); } // register state or set to true userStates[p.Id] = true; } } // this needs to be done to avoid ElementChangedException var keys = userStates.Keys.ToArray(); // check all states for players who went offline foreach (var k in keys) { if (!userStates[k] || onlineIds.Contains(k)) { continue; } // if user state still true, but he is not in online list => went offline userStates[k] = false; // create payload var p = new PlayerPayLoad { Id = k, RawName = userNames[k] }; // notify => invoke if (NotifyNames) { events.Add(new PlayerStateEvent(p, false)); } } } // set new last last = current; ApplyServerInfo(current); return(events.ToArray()); }
public void Update(ServerInfoBase info) { proxy.Update(info); }
public void Register(ServerInfoBase info) { proxy.Register(info); }