public ServerStatus() { Version = new VersionPair(MinecraftServer.FrontendVersion); Players = new PlayersStatus(); Description = ChatMessageServer.CreateText(MinecraftServer.PingReplyMessage).Json; //Favicon - nothing seem to work but the gist says it should /*Favicon = "http://mctraveler.eu/icon.png"; * //http://status.mctraveler.eu/logo.png"; * * Bitmap b = new Bitmap(16, 16); * using (var g = Graphics.FromImage(b)) * { * g.FillEllipse(Brushes.Red, 1, 2, 5, 6); * } * using (var ms = new MemoryStream()) * { * b.Save(ms, System.Drawing.Imaging.ImageFormat.Png); * Favicon = "data:image/png;base64," + Convert.ToBase64String(ms.ToArray()); * }*/ string faviconPath = "icon.png"; if (File.Exists(faviconPath)) { Favicon = "data:image/png;base64," + Convert.ToBase64String(File.ReadAllBytes(faviconPath)); } }
public DisconnectHandshake(string message) { var msg = ChatMessageServer.CreateText(message); this.Message = msg.Json; this.Message.Color = "red"; }
public static ChatMessageServer CreateText (string message, ChatPosition pos = ChatPosition.ChatBox) { if (message.Length > 119) throw new ArgumentException ("Too long >119"); var c = new ChatMessageServer (); c.Json = new ChatJson (); c.Json.Text = message; c.Position = pos; return c; }
public static ChatMessageServer CreateText(string message, ChatPosition pos = ChatPosition.ChatBox) { if (message.Length > 119) { throw new ArgumentException("Too long >119"); } var c = new ChatMessageServer(); c.Json = new ChatJson(); c.Json.Text = message; c.Position = pos; return(c); }
/// <summary> /// Return true to block message /// </summary> public static bool ParseServer(Client player, ChatMessageServer chat) { chat.SetPacketBuffer(null); var cm = chat.Json; string trans = cm.Translate; if (trans == "tile.bed.noSleep") { player.TellSystem(Chat.DarkBlue, "No sleep during daytime"); return true; } var args = cm.With; if (trans == null || args == null) return false; //ignore Joined/Left messages, generated in proxy instead if (trans.StartsWith("multiplayer.player")) return true; switch (trans) { //ignore some messages case "commands.weather.clear": case "commands.weather.rain": case "commands.weather.thunder": case "commands.gamemode.success.other": case "commands.save.success": case "chat.type.admin": return true; } Debug.WriteLine("ServerChat: " + cm.Serialize()); if (trans == "chat.type.announcement") { /* if (args.Count == 2) player.Tell(Chat.Purple, "[" + args [0] + "] " + args [1]); else { string t = ""; foreach (var a in args) t += " " + a.Text; player.Tell(Chat.Purple, t); }*/ return false; } //Herobrine never dies for (int n = 0; n < args.Count; n++) { if (args [n].Text == "Player") return true; } //Allow all other if (trans.StartsWith("death.") == false) return false; //Block all other usernames if (args [0].Text != player.MinecraftUsername) return true; //not sure but better require preparation again chat.SetPacketBuffer(null); //Adjust player name if (args [0].Text != null) args [0].Text = args [0].Text.Replace(player.MinecraftUsername, player.Name); if (args [0].ClickEvent != null) args [0].ClickEvent.Value = args [0].ClickEvent.Value.Replace(player.MinecraftUsername, player.Name); //Adjust attacker name if (args.Count > 1) { string byWho = args [1].Text; Client pp = PlayerList.GetPlayerByUsername(byWho); if (pp != null) { Log.WriteAction(player, new Attacked(pp), true); if (pp.Settings.Cloaked == MobType.None.ToString()) { trans = "death.attack.mob"; cm.Translate = trans; args [1].Text = "Skeleton"; } else if (pp.Settings.Cloaked != null) { trans = "death.attack.mob"; cm.Translate = trans; args [1].Text = pp.Settings.Cloaked; } else { //Stats player.Settings.Stats.Murdered += 1; pp.Settings.Stats.Kills += 1; } } } if (!Cause.Alternatives.ContainsKey(trans)) { Parser.TellNuxas(Chat.Aqua, "Unhandled cause of death: " + trans); return false; } /*var list = Cause.Alternatives [trans]; Random r = new Random(); cm.Translate = list [r.Next(list.Length)]; */ cm.Color = "red"; player.Session.World.SendToAll(chat); player.Settings.Stats.NaturalDeath += 1; return true; }
/// <summary> /// Pure chat messages /// </summary> public static void ParseClientChat(Client player, string message) { //Block unknown prevent mistype if (message.StartsWith(",") || message.StartsWith(">")) { player.TellSystem(Chat.Red, "unknown start symbol, begin with a space to ignore"); return; } //remove links from new players /* if (player.Uptime.TotalDays < 2) { player.Tell(Chat.Purple, "New players can't send links"); message = message.Replace("http://", ""); message = message.Replace("https://", ""); var mp = message.Split(); foreach(var m in mp) { if(m.StartsWith("http://") || m.StartsWith("https://")) } }*/ //Short /tell if (message.StartsWith(".")) { string[] parts = message.Substring(1).Split(' '); if (parts.Length < 2) { player.TellSystem(Chat.Red, "Usage: .username message"); return; } message = FormatSpell(player, parts.JoinFrom(1)); Chatting.Parser.SendPrivateMessage(player, parts [0], message); return; } //Short reply if (message.StartsWith("<")) { if (player.LastInTell == null) { player.TellSystem(Chat.Red, "You must have received a private message before replying"); return; } message = FormatSpell(player, message.Substring(1)); Chatting.Parser.SendPrivateMessage(player, player.LastInTell, message); return; } //Short /t if (message.StartsWith("-")) { if (player.LastOutTell == null) { player.TellSystem(Chat.Red, "Use \".username message\" one time first"); return; } message = FormatSpell(player, message.Substring(1)); Chatting.Parser.SendPrivateMessage(player, player.LastOutTell, message); return; } //CAPS block if (message.Length > 3) { string caps = message.ToUpperInvariant(); if (caps == message) message = message.ToLowerInvariant(); } //Shout ! if (message == "!") message = "!!"; bool shout = message.StartsWith("!"); if (shout) message = message.Substring(1); if (player.Session.CurrentRegion != null && player.Session.CurrentRegion.Type == "spawn" && player.ChatChannel == null) shout = true; int receivers = 0; //No shouting for banned if (shout && Banned.CheckBanned(player) != null) { player.TellSystem(Chat.Red, "No shouting for the banned!"); return; } //Format Translate Spell for all other message = FormatSpell(player, message); //War chat if (!shout) { if (WarChat(player, message)) return; } if (player.Settings.Cloaked != null || player.Session is PossessSession) { player.TellSystem(Chat.Red, "no chat while cloaked, pm still works"); return; } foreach (Client p in PlayerList.List) { if (shout) { p.TellSystem(Chat.Gold + player.Name + " " + Chat.White + (p.Settings.Help ? "[shout] " : ""), message); receivers += 1; continue; } if (player.ChatChannel != null) { //Channel chat if (player.ChatChannel == p.ChatChannel) { p.TellSystem(Chat.Blue + player.Name + " " + Chat.Green + "[" + p.ChatChannel + "] ", message); receivers += 1; } continue; } double distance = player.Session.Position.DistanceTo(p.Session.Position); //residents always hear if (distance >= DistanceMax && TalkingToResident(player, p)) { p.TellSystem(Chat.Blue + player.Name + " " + Chat.Aqua + "[" + player.Session.CurrentRegion.Name + "] " + Chat.Gray, message); receivers += 1; continue; } if (p.Settings.Firehose == false) { if (player.Session.World != p.Session.World) continue; if (player.Session.Dimension != p.Session.Dimension) continue; } else { if (player.Session.World != p.Session.World) distance = DistanceMax + 1; if (player.Session.Dimension != p.Session.Dimension) distance = DistanceMax + 1; //firehose does not hear banned if ((p.Session is HellSession == false) && Banned.CheckBanned(player) != null) continue; } var chatText = new ChatJson() { Text = message, Color = "gray", //HoverEvent = ChatEvent.HoverShowText("that's what " + player.Name + " said"), }; var c = new ChatJson(); c.Translate = "%1$s %2$s"; c.With = new List<ChatJson>() { new ChatJson() { Text = player.Name, Color = "blue", ClickEvent = ChatEvent.ClickSuggestCommand("." + player.Name + " "), HoverEvent = ChatEvent.HoverShowText("send private message"), }, chatText }; if (distance < DistanceClose && p != player) chatText.Color = "yellow"; else if (distance < DistanceFar || p.Settings.Firehose && distance < DistanceMax) chatText.Color = "white"; else if (distance < DistanceMax || p.Settings.Firehose) chatText.Color = "gray"; else continue; var packet = new ChatMessageServer(); packet.Json = c; //Send message p.Queue.Queue(packet); if (p.Settings.Cloaked != null) //Dont count cloaked players continue; if (p != player) receivers += 1; } if (receivers == 0) player.TellSystem(Chat.Blue, "No one heard you, " + Chat.Gray + "see /help"); Log.WriteChat(player, player.ChatChannel, receivers, message); player.ChatEntry = new Entry(player.ChatChannel, message); }