From 3cbb8dc9bd9ce90503c83bfea660a50bc5a332f4 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 3 Jun 2015 01:09:07 +0200 Subject: [PATCH] Prevent /up griefing, add /ackey, minor tweaks Dunno why its posting 'changes' in main.py tho --- adminchat.py | 42 ++++++-- blockplacemods.py | 255 +++++++++++++++++++--------------------------- helpers.py | 11 +- imout.py | 1 - main.py | 6 +- misc.py | 25 +++++ 6 files changed, 178 insertions(+), 162 deletions(-) diff --git a/adminchat.py b/adminchat.py index a90bbf8..a010969 100644 --- a/adminchat.py +++ b/adminchat.py @@ -1,8 +1,12 @@ #pylint: disable = F0401 from helpers import * +from basecommands import simplecommand ac_permission = "utils.ac" -ac_key = "," + +ac_defaultkey = "," +ac_keys = open_json_file("adminchat_keys", {}) + ac_toggle_list = [] ac_prefix = "&8[&cAC&8]" @@ -13,6 +17,7 @@ def adminchat(sender, msg): except AttributeError: name = sender.getName() broadcast(ac_permission, "%s &9%s&8: &b%s" % (ac_prefix, name, msg)) + # Needs something here like fine(message) to show up in the logs when you use ackey, but fine doesnt work for some reason. It did on the server with /pyeval (not show up on console, but show up in logs nevertheless) # ac toggle @@ -41,16 +46,41 @@ def on_ac_command(sender, args): noperm(sender) return True +def get_key(uuid): + key = ac_keys.get(uuid) + return key if key != None else ac_defaultkey + +@simplecommand("adminchatkey", + aliases = ["ackey"], + senderLimit = 0, + helpNoargs = True, + helpSubcmd = True, + description = "Sets a key character for adminchat", + usage = "") +def adminchatkey_command(sender, command, label, args): + key = " ".join(args) + uuid = uid(sender) + if key.lower() == "default" or key == ac_defaultkey: + del ac_keys[uuid] + save_keys() + return "&aYour adminchat key was set to the default character: '&c%s&a'" % ac_defaultkey + ac_keys[uid(sender)] = key + save_keys() + return "&aYour adminchat key was set to: '&c%s&a'" % key + +def save_keys(): + save_json_file("adminchat_keys", ac_keys) + @hook.event("player.AsyncPlayerChatEvent", "low") def on_chat(event): sender = event.getPlayer() msg = event.getMessage() if sender.hasPermission(ac_permission) and not event.isCancelled(): - if msg[:len(ac_key)] == ac_key: - #This solution to log any AC isn't very optimised as it will check for permission twice. Any fix for this? - runas(sender, "ac " + msg[1:]) + key = get_key(uid(sender)) + if sender.getName() in ac_toggle_list: + adminchat(sender, msg) event.setCancelled(True) - elif sender.getName() in ac_toggle_list: - runas(sender, "ac " + msg) + if msg[:len(key)] == key: + adminchat(sender, msg[len(key):]) event.setCancelled(True) diff --git a/blockplacemods.py b/blockplacemods.py index 178916c..6885f84 100644 --- a/blockplacemods.py +++ b/blockplacemods.py @@ -95,123 +95,83 @@ def getSettingDetails(arg): helpSubcmd = True, amax = 2) def toggle_command(sender, command, label, args): - try: - setting, details = getSettingDetails(args[0]) - Validate.isAuthorized(sender, "utils.toggle." + setting, "that setting") + setting, details = getSettingDetails(args[0]) + Validate.isAuthorized(sender, "utils.toggle." + setting, "that setting") - values = get(setting) - player = server.getPlayer(sender.getName()) - uuid = uid(player) - arglen = len(args) + values = get(setting) + player = server.getPlayer(sender.getName()) + uuid = uid(player) + arglen = len(args) - if details[0] in (0,2): # Toggle - default = details[0] == 0 # If True: toggle on if list doesn't contain the uuid + if details[0] in (0,2): # Toggle + default = details[0] == 0 # If True: toggle on if list doesn't contain the uuid - enabled = (uuid not in values) == default #Invert if details[0] == 2 (toggle disabled by default) - info("Enabled: " + str(enabled)) - new = None - if arglen == 1: + enabled = (uuid not in values) == default #Invert if details[0] == 2 (toggle disabled by default) + new = None + if arglen == 1: + new = not enabled + else: + arg2 = args[1].lower() + if arg2 == "info": + return " &aSetting %s:\n &9%s\n &6Accepted arguments: [on|enable|off|disable|toggle|switch|info]\n &6Aliases: %s" % (setting, details[2], ", ".join(details[3])) + elif arg2 in ("toggle", "switch"): new = not enabled + elif arg2 in ("on", "enable"): + new = not default + elif arg2 in ("off", "disable"): + new = default else: - arg2 = args[1].lower() - if arg2 == "info": - return " &aSetting %s:\n &9%s\n &6Accepted arguments: [on|enable|off|disable|toggle|switch|info]\n &6Aliases: %s" % (setting, details[2], ", ".join(details[3])) - elif arg2 in ("toggle", "switch"): - new = not enabled - elif arg2 in ("on", "enable"): - new = True == default - info("New: " + str(new)) - elif arg2 in ("off", "disable"): - new = False == default - info("New: " + str(new)) - else: - return " &cArgument '%s' was not recognized. \n Use &o/toggle %s info &cfor more information" % (arg2, setting) - if enabled == new: - return " &cAlready %s: &a%s" % ("enabled" if enabled else "disabled", details[1]) - if new == default: - values.remove(uuid) - else: - values.append(uuid) - saveSettings() - return (" &aEnabled " if new else " &aDisabled ") + details[1] + return " &cArgument '%s' was not recognized. \n Use &o/toggle %s info &cfor more information" % (arg2, setting) + if enabled == new: + return " &cAlready %s: &a%s" % ("enabled" if enabled else "disabled", details[1]) + if new == default: + values.remove(uuid) + else: + values.append(uuid) + saveSettings() + return (" &aEnabled " if new else " &aDisabled ") + details[1] - elif details[0] == 1: # Save ItemStack in hand - arg2 = args[1].lower() if arglen > 1 else "" - enabled = uuid in values + elif details[0] == 1: # Save ItemStack in hand + arg2 = args[1].lower() if arglen > 1 else "" + enabled = uuid in values - if arg2 == "clear": - if enabled: - del values[uuid] - return " &aDisabled " + details[1] + if arg2 == "clear": + if enabled: + del values[uuid] + return " &aDisabled " + details[1] - if arg2 == "details": - return " &aSetting %s:\n &9%s \n&6Accepted arguments: [|clear|details]" % (setting, details[2]) + if arg2 == "details": + return " &aSetting %s:\n &9%s \n&6Accepted arguments: [|clear|details]" % (setting, details[2]) - slot = int(arg2) if arg2.isdigit() else 0 - if not (0 <= slot <= details[4]): - return " &cSlot number must be more than or equal to 0 and less than or equal to %s!" % details[4] + slot = int(arg2) if arg2.isdigit() else 0 + if not (0 <= slot <= details[4]): + return " &cSlot number must be more than or equal to 0 and less than or equal to %s!" % details[4] - item = fromStack(player.getItemInHand()) - if item[0] == 0 or item[1] <= 0: - if enabled: - items = values[uuid] - if slot in items: - del items[slot] - saveSettings() - if len(items) == 0: - del values[uuid] - return " &aDisabled " + details[1] - return " &aCleared slot %s of setting %s" % (slot, setting) - return " &cSlot %s of setting %s was already cleared!" % (slot, setting) - return " &cAlready disabled: " + details[1] + item = fromStack(player.getItemInHand()) + if item[0] == 0 or item[1] <= 0: + if enabled: + items = values[uuid] + if slot in items: + del items[slot] + saveSettings() + if len(items) == 0: + del items + return " &aDisabled " + details[1] + return " &aCleared slot %s of setting %s" % (slot, setting) + return " &cSlot %s of setting %s was already cleared!" % (slot, setting) + return " &cAlready disabled: " + details[1] - if arglen == 2 and not arg2.isdigit(): - return " &cArgument '%s' was not recognized. \nUse &o/toggle %s details &cfor more detailsrmation." % (arg2, setting) + if arglen == 2 and not arg2.isdigit(): + return " &cArgument '%s' was not recognized. \nUse &o/toggle %s details &cfor more detailsrmation." % (arg2, setting) - if not enabled: - values[uuid] = {} - values[uuid][slot] = item - saveSettings() - return ((" &aEnabled setting %s, S" % setting) if len(values[uuid]) == 1 else " &aS") + "et itemstack in slot %s to item in hand" % (slot) - - return None #This shouldn't happen - except CommandException, e: - raise e - except: - error(trace()) - -""" - if info[0] in (0,2): # Toggle - default = info[0] == 0 - - enabled = (uuid not in values) == default #Invert if info[0] == 2 (toggle disabled by default) - info("Enabled": True) - new = None - if arglen == 1: - new = not enabled - else: - arg2 = args[1].lower() - if arg2 == "info": - return " &aSetting %s:\n &9%s\n &6Accepted arguments: [on|enable|off|disable|toggle|switch]\n &6Aliases: %s" % (setting, info[2], ", ".join(info[3])) - elif arg2 in ("toggle", "switch"): - new = not enabled - elif arg2 in ("on", "enable"): - new = True == default - elif arg2 in ("off", "disable"): - new = False == default - else: - return " &cArgument '%s' was not recognized. \nUse &o/toggle %s info &cfor more information" % (arg2, setting) - if enabled == new: - return " &cAlready %s: &a%s" % ("enabled" if enabled else "disabled", info[1]) - if new: - values.remove(uuid) - else: - values.append(uuid) - saveSettings() - return (" &aEnabled " if new else " &aDisabled ") + info[1] -""" + if not enabled: + values[uuid] = {} + values[uuid][slot] = item + saveSettings() + return ((" &aEnabled setting %s, S" % setting) if len(values[uuid]) == 1 else " &aS") + "et itemstack in slot %s to item in hand" % (slot) + return None #This shouldn't happen def fromStack(itemStack): @@ -226,62 +186,59 @@ def isEnabled(toggleSetting, uuid): @hook.event("block.BlockPlaceEvent", "monitor") def on_block_place(event): - try: - if event.isCancelled(): - return - player = event.getPlayer() - if not is_creative(player): - return + if event.isCancelled(): + return + player = event.getPlayer() + if not is_creative(player): + return - uuid = uid(player) - block = event.getBlockPlaced() - material = block.getType() + uuid = uid(player) + block = event.getBlockPlaced() + material = block.getType() - if (material in (Material.WOOD_STEP, Material.STEP) - and isEnabled("slab", uuid) - and player.hasPermission("utils.toggle.slab") - and block.getData() < 8 - ): - block.setData(block.getData() + 8) # Flip upside down + if (material in (Material.WOOD_STEP, Material.STEP) + and isEnabled("slab", uuid) + and player.hasPermission("utils.toggle.slab") + and block.getData() < 8 + ): + block.setData(block.getData() + 8) # Flip upside down - elif (material == Material.CAULDRON - and isEnabled("cauldron", uuid) - and player.hasPermission("utils.toggle.cauldron") - ): - block.setData(3) #3 layers of water, 3 signal strength + elif (material == Material.CAULDRON + and isEnabled("cauldron", uuid) + and player.hasPermission("utils.toggle.cauldron") + ): + block.setData(3) #3 layers of water, 3 signal strength - elif ((material == Material.FURNACE and player.hasPermission("utils.toggle.furnace")) - or (material == Material.DROPPER and player.hasPermission("utils.toggle.dropper")) - or (material == Material.HOPPER and player.hasPermission("utils.toggle.hopper")) - ): - stacks = get(str(material).lower()).get(uuid) - if stacks != None: # Enabled - state = block.getState() - inv = state.getInventory() - for slot, stack in stacks.iteritems(): - inv.setItem(int(slot), toStack(stack)) - state.update() + elif ((material == Material.FURNACE and player.hasPermission("utils.toggle.furnace")) + or (material == Material.DROPPER and player.hasPermission("utils.toggle.dropper")) + or (material == Material.HOPPER and player.hasPermission("utils.toggle.hopper")) + ): + stacks = get(str(material).lower()).get(uuid) + if stacks != None: # Enabled + state = block.getState() + inv = state.getInventory() + for slot, stack in stacks.iteritems(): + inv.setItem(int(slot), toStack(stack)) + state.update() - """ - elif (material == Material.REDSTONE_TORCH_ON - and event.getBlockAgainst().getType() == Material.REDSTONE_BLOCK - and isEnabled("torch", uuid) - and player.hasPermission("utils.toggle.torch") - ): - torches_to_break.append(block) - """ + """ + elif (material == Material.REDSTONE_TORCH_ON + and event.getBlockAgainst().getType() == Material.REDSTONE_BLOCK + and isEnabled("torch", uuid) + and player.hasPermission("utils.toggle.torch") + ): + torches_to_break.append(block) + """ - if (material in (Material.PISTON_BASE, Material.PISTON_STICKY_BASE) #Not elif because for droppers it can do 2 things - and isEnabled("piston", uuid) - and player.hasPermission("utils.toggle.piston") - ): - block.setData(faces[block.getFace(event.getBlockAgainst())]) - except: - error(trace()) + if (material in (Material.PISTON_BASE, Material.PISTON_STICKY_BASE) + and isEnabled("piston", uuid) + and player.hasPermission("utils.toggle.piston") + ): + block.setData(faces[block.getFace(event.getBlockAgainst())]) @hook.event("player.PlayerInteractEvent", "monitor") diff --git a/helpers.py b/helpers.py index 6d64755..a5123fa 100644 --- a/helpers.py +++ b/helpers.py @@ -39,6 +39,13 @@ def error(text): """ server.getLogger().severe("[RedstonerUtils] %s" % text) + +def fine(text): + """ + Log anything to the logs alone, not the console + """ + server.getLogger().fine(text) + def msg(player, text, usecolor = True, basecolor = None): """ send a message to player @@ -216,6 +223,4 @@ def toggle(player, ls, name = "Toggle", add = None): msg(player, "&a%s turned off!" % name) elif add != False: ls.append(pid) - msg(player, "&a%s turned on!" % name) - - + msg(player, "&a%s turned on!" % name) \ No newline at end of file diff --git a/imout.py b/imout.py index bb10204..806183f 100644 --- a/imout.py +++ b/imout.py @@ -1,4 +1,3 @@ -import thread from helpers import * from adminchat import * diff --git a/main.py b/main.py index b38fe56..4f06411 100644 --- a/main.py +++ b/main.py @@ -38,8 +38,8 @@ shared["load_modules"] = [ "adminchat", # Adds /badge, allows to give players achievements "badges", - # Adds a few block placement corrections/mods - "blockplacemods", + # Adds a few block placement corrections/mods + "blockplacemods", # Adds /calc, toggles automatic solving of Math expressions in chat "calc", # Plugin to locate laggy chunks. /lc lists chunks with more than n entities @@ -87,4 +87,4 @@ for module in shared["load_modules"]: info("Module %s loaded." % module) except: error("Failed to import module %s:" % module) - error(print_traceback()) + error(print_traceback()) \ No newline at end of file diff --git a/misc.py b/misc.py index 81218aa..7884b70 100644 --- a/misc.py +++ b/misc.py @@ -37,11 +37,20 @@ def on_join(event): player.teleport(player.getWorld().getSpawnLocation()) +# Prevent /up griefing. //up is blocked by PlotMe. +@hook.event("player.PlayerCommandPreprocessEvent", "low") +def on_command(event): + if event.getMessage()[:4].lower() == "/up ": + event.setMessage("/" + event.getMessage()) + + +""" Disabled while builder can't access Trusted @hook.event("player.PlayerGameModeChangeEvent", "low") def on_gamemode(event): user = event.getPlayer() if str(event.getNewGameMode()) != "SPECTATOR" and user.getWorld().getName() == "Trusted" and not user.hasPermission("mv.bypass.gamemode.Trusted"): event.setCancelled(True) +""" @hook.event("player.PlayerBedEnterEvent") @@ -208,3 +217,19 @@ def on_modules_command(sender, command, label, args): plugin_header(sender, "Modules") msg(sender, ", ".join([(("&a" if mod in shared["modules"] else "&c") + mod) for mod in shared["load_modules"]])) + +""" Something I'm planning for schematics +@hook.event("player.PlayerCommandPreprocessEvent", "low") +def on_command(event): + msg = " ".split(event.getMessage()) + if len(msg) < 3: + return + if msg[0].lower() not in ("/schematic", "/schem"): + return + if msg[1].lower() not in ("save", "load"): + return + msg[2] = event.getPlayer().getName() + "/" + msg[2] +""" + + +