using System; using System.Collections.Generic; using Woodpecker.Sessions; using Woodpecker.Game.Users; using Woodpecker.Game.Rooms.Units; namespace Woodpecker.Game.Rooms.Instances.Interaction { public partial class roomReactor : Reactor { #region Methods /// /// Tries to process a given chat message as a chat command and returns true if the operation has succeeded. /// /// The chat message to process. private bool handleSpecialChatCommand(string Text) { if (Text[0] == ':' && Text.Length > 3) // Could be a chat command (emotes too btw) { try { string Command = Text.Substring(1).Split(' ')[0]; string Body = ""; if(Text.Contains(" ")) Body = Text.Substring(Command.Length + 2); switch (Command) { #region Common commands for all users case "about": { Response.Initialize(139); // "BK" Response.Append("About Woodpecker"); Response.Append("
"); Response.Append("Woodpecker is a V13 Habbo Hotel emulator written in C#.NET by Nillus."); Response.Append("

"); Response.Append("Currently there are "); Response.Append(ObjectTree.Game.Users.userCount); Response.Append(" user(s) online."); sendResponse(); } break; #endregion #region Fancy commands case "descenditem": { if (!Session.User.hasFuseRight("fuse_funchatcommands")) return false; int itemID = int.Parse(Body); if (Session.roomInstance.containsFloorItem(itemID)) { Woodpecker.Game.Items.floorItem pItem = Session.roomInstance.getFloorItem(itemID); Woodpecker.Net.Game.Messages.serverMessage Message = new Woodpecker.Net.Game.Messages.serverMessage(230); // "Cf" Message.appendWired(pItem.X - 1); Message.appendWired(pItem.Y + 1); Message.appendWired(pItem.X); Message.appendWired(pItem.Y); Message.appendWired(true); Message.appendWired(itemID); Message.appendClosedValue("12.0"); Message.appendClosedValue(Woodpecker.Specialized.Text.stringFunctions.formatFloatForClient(pItem.Z)); Message.appendWired(new Random(DateTime.Now.Millisecond).Next(0, 10000)); Session.roomInstance.sendMessage(Message); } } break; case "handitem": { roomUser Me = Session.roomInstance.getRoomUser(Session.ID); Items.carryItemHelper.setHandItem(ref Me, Body); } break; #endregion #region Moderation commands case "alert": { if (!Session.User.hasFuseRight("fuse_alert")) return false; string Username = Body.Substring(0, Body.IndexOf(' ')); string Message = Body.Substring(Body.IndexOf(' ') + 1); if (Username.Length > 0 && Message.Length > 0) { if(ObjectTree.Game.Moderation.requestAlert(Session.User.ID, Username, Message, "")) Session.castWhisper("Alert sent to user."); } } break; case "kick": { if (!Session.User.hasFuseRight("fuse_kick")) return false; string Username = Body.Substring(0, Body.IndexOf(' ')); string Message = Body.Substring(Body.IndexOf(' ') + 1); if (Username.Length > 0) { if(ObjectTree.Game.Moderation.requestKickFromRoom(Session.User.ID, Username, Message, "")) Session.castWhisper("Kick sent to user."); } } break; case "ban": { if (!Session.User.hasFuseRight("fuse_ban")) return false; string Username = Body.Substring(0, Body.IndexOf(' ')); Body = Body.Substring(Body.IndexOf(' ') + 1); int Hours = int.Parse(Body.Substring(0, Body.IndexOf(' '))); string Message = Body.Substring(Body.IndexOf(' ') + 1); if (Message.Length > 0) { if (ObjectTree.Game.Moderation.requestBan(Session.User.ID, Username, Hours, false, false, Message, "")) Session.castWhisper("User banned for " + Hours + " hours."); } } break; case "unban": { if (!Session.User.hasFuseRight("fuse_superban")) // Only mods can unban return false; if (Body.Length > 0) { if (ObjectTree.Game.Moderation.requestUnban(Session.User.ID, Body, null, null)) { Session.castWhisper("Matching bans for given user have been removed."); ObjectTree.Game.Moderation.logModerationAction(Session.User.ID, "unban", ObjectTree.Game.Users.getUserID(Body), "", "Unban via :unban %username%"); } } } break; case "blacklist": { if (!Session.User.hasFuseRight("fuse_administrator_access")) return false; if (Body.Length > 0) { int userID = ObjectTree.Game.Users.getUserID(Body); if (userID > 0) { userAccessInformation lastAccess = ObjectTree.Game.Users.getLastAccess(userID); if (lastAccess != null) { ObjectTree.Net.Game.blackListIpAddress(lastAccess.IP); ObjectTree.Sessions.destroySessions(lastAccess.IP); Session.castWhisper("IP " + lastAccess.IP + " has been added to the connection blacklist."); } } } } break; case "roomalert": { if (!Session.User.hasFuseRight("fuse_room_alert")) return false; if (Body.Length > 0) { if(ObjectTree.Game.Moderation.requestRoomAlert(Session.User.ID, Session.roomID, Body, "")) Session.castWhisper("Alert sent to room."); } } break; case "roomkick": { if (!Session.User.hasFuseRight("fuse_room_kick")) return false; if (Body.Length > 0) { if(ObjectTree.Game.Moderation.requestRoomKick(Session.User.ID, Session.roomID, Body, "")) Session.castWhisper("Kick sent to room."); } } break; case "ha": case "hotelalert": { if (!Session.User.hasFuseRight("fuse_hotelalert")) return false; if (Body.Length > 0) { ObjectTree.Game.Moderation.castHotelAlert(Session.User.ID, Body); Session.castWhisper("Hotel alert sent."); } } break; #endregion #region Debug commands case "debug": { if (!Session.User.hasFuseRight("fuse_debug")) return false; switch (Body) { case "reloadstore": ObjectTree.Game.Items.loadDefinitions(); ObjectTree.Game.Store.loadSales(); ObjectTree.Game.Store.loadCataloguePages(); Session.castWhisper("Re-loaded item definitions, store sales and catalogue pages."); break; case "handitems": Session.itemStripHandler.loadHandItems(); Session.castWhisper("Re-loaded handitems."); break; } } break; case "createitem": { if (!Session.User.hasFuseRight("fuse_debug")) return false; int definitionID = int.Parse(Body.Substring(0, Body.IndexOf(' '))); int Amount = int.Parse(Body.Substring(Body.IndexOf(' ') + 1)); if (Amount <= 0) Amount = 1; for (int x = 1; x <= Amount; x++) { ObjectTree.Game.Items.createItemInstance(definitionID, Session.User.ID, null); } Session.itemStripHandler.loadHandItems(); Session.sendHandStrip("last"); } break; #endregion default: return false; } } catch { Session.castWhisper("Error occurred during processing of the chat command, check your parameters."); } return true; } return false; } #endregion } }