Beispiel #1
0
        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}.");
            }
        }
Beispiel #2
0
        /// <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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        /// <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();
        }
Beispiel #5
0
 public ServerStatsWrapper(ServerInfoBase serverInfo, ServerPlayersBase[] players, int gameServerId)
 {
     this.serverInfo   = serverInfo;
     this.players      = players;
     this.gameServerId = gameServerId;
 }
Beispiel #6
0
        /// <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());
        }
Beispiel #7
0
 public void Update(ServerInfoBase info)
 {
     proxy.Update(info);
 }
Beispiel #8
0
 public void Register(ServerInfoBase info)
 {
     proxy.Register(info);
 }