static void Beat([NotNull] SchedulerTask scheduledTask) { if (Server.IsShuttingDown) { return; } if (ConfigKey.HeartbeatEnabled.Enabled()) { SendHeartBeat(); } else { // If heartbeats are disabled, the server data is written // to a text file instead (heartbeatdata.txt) string[] data = { Salt, Server.InternalIP.ToString(), Server.Port.ToStringInvariant(), Server.CountPlayers(false).ToStringInvariant(), ConfigKey.MaxPlayers.GetString(), Color.StripColors(ConfigKey.ServerName.GetString(),false), ConfigKey.IsPublic.GetString(), ConfigKey.HeartbeatUrl.GetString() }; const string tempFile = Paths.HeartbeatDataFileName + ".tmp"; File.WriteAllLines(tempFile, data, Encoding.ASCII); Paths.MoveOrReplaceFile(tempFile, Paths.HeartbeatDataFileName); } }
static void Beat( SchedulerTask scheduledTask ) { if( Server.IsShuttingDown ) return; if( ConfigKey.HeartbeatEnabled.Enabled() ) { SendMinecraftNetBeat(); if( ConfigKey.IsPublic.Enabled() && ConfigKey.HeartbeatToWoMDirect.Enabled() ) { SendWoMDirectBeat(); } } else { // If heartbeats are disabled, the server data is written // to a text file instead (heartbeatdata.txt) string[] data = new[]{ Salt, Server.InternalIP.ToString(), Server.Port.ToString(), Server.CountPlayers( false ).ToString(), ConfigKey.MaxPlayers.GetString(), ConfigKey.ServerName.GetString(), ConfigKey.IsPublic.GetString() }; const string tempFile = Paths.HeartbeatDataFileName + ".tmp"; File.WriteAllLines( tempFile, data, Encoding.ASCII ); Paths.MoveOrReplace( tempFile, Paths.HeartbeatDataFileName ); } }
public static void HbSave() { try { const string SaverFile = "heartbeatsaver.txt"; if (File.Exists(SaverFile)) { File.Delete(SaverFile); } if (Salt == null) { return; } if (Server.CountPlayers(false).ToString() == null) { return; } HbData = "port=" + Server.Port.ToString() + "&max=" + ConfigKey.MaxPlayers.GetString() + "&name=" + Uri.EscapeDataString(ConfigKey.ServerName.GetString()) + "&public=True" + "&salt=" + Salt + "&users=" + Server.CountPlayers(false).ToString(); File.WriteAllText(SaverFile, HbData, Encoding.ASCII); } catch (Exception ex) { Logger.Log(LogType.Error, "" + ex); } }
bool HandleOpcode(byte opcode) { switch (opcode) { case (byte)OpCode.Handshake: return(true); case 0xFE: // SMP ping packet id // 1.4 - 1.6 string name = Chat.ReplacePercentColorCodes(ConfigKey.ServerName.GetString(), false).Replace('&', '§'); string data = "§1\078\00.30c\0§E" + name + '\0' + Server.CountPlayers(false) + '\0' + ConfigKey.MaxPlayers.GetInt(); SendOldSMPKick(data); return(false); case 0x02: case 0xFA: SendOldSMPKick("§EPlease join us at §9http://classicube.net/"); Logger.Log(LogType.Warning, "Player.LoginSequence: A player tried connecting with Minecraft Beta client from {0}.", IP); // ignore SMP pings return(false); case (byte)'G': // WoM GET requests return(false); default: if (CheckModernSMP(opcode)) { return(false); } Logger.Log(LogType.Error, "Player.LoginSequence: Unexpected op code in the first packet from {0}: {1}.", IP, opcode); KickNow("Incompatible client, or a network error.", LeaveReason.ProtocolViolation); return(false); } }
internal HeartbeatData( [NotNull] Uri heartbeatUri ) { if( heartbeatUri == null ) throw new ArgumentNullException( "heartbeatUri" ); IsPublic = ConfigKey.IsPublic.Enabled(); MaxPlayers = ConfigKey.MaxPlayers.GetInt(); PlayerCount = Server.CountPlayers( false ); ServerIP = Server.InternalIP; Port = Server.Port; ProtocolVersion = Config.ProtocolVersion; Salt = Heartbeat.Salt; ServerName = ConfigKey.ServerName.GetString(); CustomData = new Dictionary<string, string>(); HeartbeatUri = heartbeatUri; }
public static void HbSave() { try { const string SaverFile = "heartbeatdata.txt"; if (File.Exists(SaverFile)) { File.Delete(SaverFile); } if (Salt == null) { return; } if (Server.CountPlayers(false).ToString() == null) { return; } string[] data = new[] { Salt, Server.InternalIP.ToString(), Server.Port.ToString(), Server.CountPlayers(false).ToString(), ConfigKey.MaxPlayers.GetString(), ConfigKey.ServerName.GetString(), ConfigKey.IsPublic.GetString(), Salt2 }; //"port=" + Server.Port.ToString() + "&max=" + ConfigKey.MaxPlayers.GetString() + "&name=" + //Uri.EscapeDataString(ConfigKey.ServerName.GetString()) + //"&public=True" + "&salt=" + Salt + "&users=" + Server.CountPlayers(false).ToString(); const string tempFile = Paths.HeartbeatDataFileName + ".tmp"; File.WriteAllLines(tempFile, data, Encoding.ASCII); Paths.MoveOrReplace(tempFile, Paths.HeartbeatDataFileName); } catch (Exception ex) { Logger.Log(LogType.Error, "" + ex); } }
internal HeartbeatData([NotNull] Uri heartbeatUri) { if (heartbeatUri == null) { throw new ArgumentNullException("heartbeatUri"); } IsPublic = ConfigKey.IsPublic.Enabled(); MaxPlayers = ConfigKey.MaxPlayers.GetInt(); PlayerCount = Server.CountPlayers(false); Port = Server.Port; ProtocolVersion = Config.ProtocolVersion; Salt = Heartbeat.Salt; ServerName = Color.StripColors(ConfigKey.ServerName.GetString(), false); if (Heartbeat.sendUptime) { string uptime = "[Uptime: " + (DateTime.UtcNow.Subtract(Server.StartTime)).ToMiniString() + "]"; string namePadded = ServerName.PadRight(64, ' '); ServerName = namePadded.Remove(namePadded.Length - uptime.Length, uptime.Length) + uptime; } CustomData = new Dictionary <string, string>(); HeartbeatUri = heartbeatUri; }
static void Beat(SchedulerTask scheduledTask) { if (Server.IsShuttingDown) { return; } data = new HeartbeatData { IsPublic = ConfigKey.IsPublic.GetBool(), MaxPlayers = ConfigKey.MaxPlayers.GetInt(), PlayerCount = Server.CountPlayers(false), ServerIP = Server.IP, Port = Server.Port, ProtocolVersion = Config.ProtocolVersion, Salt = Server.Salt, ServerName = ConfigKey.ServerName.GetString() }; // This needs to be wrapped in try/catch because and exception in an event handler // would permanently stop heartbeat sending. try { if (RaiseHeartbeatSendingEvent(data)) { RescheduleHeartbeat(); return; } } catch (Exception ex) { Logger.LogAndReportCrash("Heartbeat.Sending handler failed", "fCraft", ex, false); } if (ConfigKey.HeartbeatEnabled.GetBool()) { UriBuilder ub = new UriBuilder(Uri); StringBuilder sb = new StringBuilder(); sb.AppendFormat("public={0}&max={1}&users={2}&port={3}&version={4}&salt={5}&name={6}", data.IsPublic, data.MaxPlayers, data.PlayerCount, data.Port, data.ProtocolVersion, Uri.EscapeDataString(data.Salt), Uri.EscapeDataString(data.ServerName)); foreach (var pair in data.CustomData) { sb.AppendFormat("&{0}={1}", Uri.EscapeDataString(pair.Key), Uri.EscapeDataString(pair.Value)); } ub.Query = sb.ToString(); request = (HttpWebRequest)WebRequest.Create(ub.Uri); request.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback); request.Method = "GET"; request.Timeout = Timeout; request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.BypassCache); request.BeginGetResponse(ResponseCallback, null); } else { // If heartbeats are disabled, the data is written to a text file (heartbeatdata.txt) const string tempFile = Paths.HeartbeatDataFileName + ".tmp"; File.WriteAllLines(tempFile, new[] { Server.Salt, Server.IP.ToString(), Server.Port.ToString(), Server.CountPlayers(false).ToString(), ConfigKey.MaxPlayers.GetString(), ConfigKey.ServerName.GetString(), ConfigKey.IsPublic.GetString() }, Encoding.ASCII); Paths.MoveOrReplace(tempFile, Paths.HeartbeatDataFileName); RescheduleHeartbeat(); } }