From 8e2ff33dbbdcc52e869d697697a5000771f83476 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 5 Jun 2016 17:46:35 +0200 Subject: Serversigns permissions fix, adapted help page to user permissions, implemented help pages --- serversigns.py | 135 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 96 insertions(+), 39 deletions(-) diff --git a/serversigns.py b/serversigns.py index 1b6742e..4fe952e 100644 --- a/serversigns.py +++ b/serversigns.py @@ -4,6 +4,7 @@ import org.bukkit.Material as Material import java.util.UUID as UUID import org.bukkit.Material as Material import org.bukkit.block.BlockFace as BlockFace +from math import ceil commands_whitelist = ( "mail", "email", "memo", @@ -22,6 +23,7 @@ commands_whitelist = ( max_line_length = 256 max_lines = 20 +help_page_size = 12 def load_signs(): signs_obj = open_json_file("serversigns", []) @@ -103,6 +105,46 @@ def signsMsg(msg, colour = '4'): return "&c[Signs] &" + colour + msg +# /svs command + + +subcommand_info = ( + + (("claim",), ( + "Claims the sign so that you can add messages to it", + ), (("[owner]", "claims.other"),)), + (("info", "lines"), ( + "Displays information about the (claimed) sign", + )), + (("add",), ( + "Adds the message to the sign. Use ++ at the end", + "to add the message to your buffer. You can then use", + "the same command again to create a longer message", + ), (("[++]", None),)), + (("remove", "rem", "del", "delete"), ( + "Removes the message with the given ID from the sign.", + "The ID is given before each message by &b/svs info&a.", + ), (("", None),)), + (("switch", "reverse"), ( + "Reverses the order in which the given messages are shown.", + ), ((" ", None),)), + (("clear",), ( + "Removes all messages from the sign.", + )), + (("reset", "unclaim"), ( + "Resets the sign, removing all messages and its owner.", + )), + (("whitelist", "commands", "wl"), ( + "Displays a list of whitelisted commands", + )), + (("help",), ( + "Displays this help page", + ), (("[page]", None),)), + +) + + + @simplecommand(cmd = "serversigns", aliases = ["svs", "signmsg"], description = "Makes something happen when you right click signs. \nUse /svs help for more details.", usage = "[++]|remove |clear|info|help>", @@ -110,40 +152,55 @@ def signsMsg(msg, colour = '4'): senderLimit = 0) def svs_command(sender, command, label, args): arg1 = args[0].lower() - Validate.isTrue(arg1 in ("claim", "reset", "add", "remove", "rem", "del", "delete", "info", "lines", - "clear", "help", "switch", "reverse", "unclaim", "commands", "whitelist", "wl"), - signsMsg("That argument could not be recognized, use &o/svs help &4for expected arguments")) - Validate.isAuthorized(sender, "utils.serversigns." + arg1) + + cmd_info = None + for cmd in subcommand_info: + if arg1 in cmd[0]: + cmd_info = cmd + break + + Validate.notNone(cmd_info, signsMsg("That command could not be recognized, use &o/svs help &4for expected arguments")) + cmd = cmd_info[0][0] + Validate.isAuthorized(sender, "utils.serversigns." + cmd) #-------------------- Sub commands that don't require any conditions ----------------------- - if arg1 == "help": - admin = sender.hasPermission("utils.serversigns.admin") - msg = signsMsg("Server signs lets you add messages to a sign.", 'a') - msg += "\nRight clicking the sign will display all the messages. Commands" - msg += "\ncan also be added, by prefixing the message with a '/'." - msg += "\nHow to use &b/serversigns&a:" - msg += "\n&b/svs claim" + ("" if not sender.hasPermission("utils.serversigns.admin") else " [owner]") - msg += "\n&a- Claims the sign so that you can add messages to it" - msg += "\n&b/svs info|lines" - msg += "\n&a- Displays information about the (claimed) sign" - msg += "\n&b/svs add [++]" - msg += "\n&a- Adds the message to the sign. Use ++ at the end" - msg += "\n&a- to add the message to your buffer. You can then use" - msg += "\n&a- the same command again to create a longer message." - msg += "\n&b/svs remove " - msg += "\n&a- Removes the message with the given ID from the sign." - msg += "\n&a- The ID is given before each message by &b/svs info&a." - msg += "\n&b/svs switch|reverse " - msg += "\n&a- Reverses the order in which the given messages are shown." - msg += "\n&b/svs clear" - msg += "\n&a- Removes all messages from the sign." - msg += "\n&b/svs reset|unclaim" - msg += "\n&a- Resets the sign, removing all messages and its owner." - msg += "\n&b/svs commands|whitelist|wl" - msg += "\n&a- Shows a list of whitelisted commands" - return msg - - if arg1 in ("commands", "whitelist", "wl"): + if cmd == "help": + all_lines = [ + "&aServer signs let's you add messages to a sign.", + "Right clicking the sign will display all the messages. Commands", + "can also be added, by prefixing the message with a '/'.", + "How to use &b/serversigns&a:", + ] + + for cmd in subcommand_info: + if sender.hasPermission("utils.serversigns." + cmd[0][0]): + params = "" + if len(cmd) == 3: + for param, perm in cmd[2]: + if perm is None or sender.hasPermission("utils.serversigns." + perm): + params += param + " " + all_lines.append("&b/svs %s %s" % ("|".join(cmd[0]), params)) + for info_line in cmd[1]: + all_lines.append("&a- " + info_line) + + last_page = int(ceil(len(all_lines) / help_page_size)) + info("last page: %d" % last_page) + page = 1 + if len(args) > 1 and args[1].isdigit(): + page = int(args[1]) + if page <= 0: + page = 1 + elif page > last_page: + page = last_page + + first_line = signsMsg("Serversigns help page %d" % page, '6') + if page < last_page: + first_line += ", &e/svs help %d&6 for the next" % (page + 1) + page_lines = [first_line] + all_lines[(page - 1) * help_page_size : min(page * help_page_size, len(all_lines))] + return "\n".join(page_lines) + + + if cmd == "whitelist": return signsMsg("Whitelisted commands: &3" + ", ".join(commands_whitelist), 'a') #------------------------------------------------------------------------------------------- @@ -156,7 +213,7 @@ def svs_command(sender, command, label, args): arg2 = args[1].lower() if len(args) > 1 else None #------------------------ Sub commands that require the block to be a sign ------------------------------- - if arg1 == "claim": + if cmd == "claim": Validate.isTrue(not sign, signsMsg("The %s was already claimed" % signName)) Validate.isTrue(can_build2(sender, block), signsMsg("You are not permitted to claim signs here")) target = sender @@ -180,7 +237,7 @@ def svs_command(sender, command, label, args): Validate.notNone(sign, signsMsg("The %s has not been claimed" % signName)) #----------------------Sub commands that require the sign to be claimed as well------------------------------------ - if arg1 in ("info", "lines"): + if cmd == "info": sign_lines = "" for id, line in enumerate(sign[1:]): sign_lines += ("\n &a%s: \"&f%s&a\"" % (id + 1, line)) @@ -190,7 +247,7 @@ def svs_command(sender, command, label, args): Validate.isTrue(canEdit(sign, sender), signsMsg("You do not own the %s!" % signName)) #---------------------- Sub commands that require you to own targeted sign as well ------------------------- - if arg1 == "add": + if cmd == "add": Validate.isTrue(len(sign) - 1 <= max_lines, signsMsg("This sign already has the maximum amount of lines, you cannot add more")) line = " ".join(args[1:]) @@ -227,7 +284,7 @@ def svs_command(sender, command, label, args): return signsMsg("Added line \"&f%s&a\" to the %s" % (line, signName), 'a') - if arg1 in ("remove", "rem", "del", "delete"): + if cmd == "remove": Validate.notNone(arg2, signsMsg("You have to enter the ID of the message to remove!")) try: id = int(arg2) @@ -238,7 +295,7 @@ def svs_command(sender, command, label, args): return signsMsg("Removed message with id %s from the %s" % (id, signName), 'a') - if arg1 in ("switch", "reverse"): + if cmd == "switch": Validate.isTrue(len(args) == 3, signsMsg("You have to enter the 2 IDs of the messages to reverse")) try: id1 = int(args[1]) @@ -252,13 +309,13 @@ def svs_command(sender, command, label, args): return signsMsg("Reversed the messages with IDs %s and %s of the %s" % (id1, id2, signName), 'a') - if arg1 == "clear": + if cmd == "clear": signs[loc] = [sign[0]] save_signs() return signsMsg("Removed all messages from the %s" % signName, 'a') - if arg1 in ("reset", "unclaim"): + if cmd == "reset": del signs[loc] save_signs() return signsMsg("Removed all messages and the owner from the %s, it can now be claimed" % signName, 'a') -- cgit v1.2.3