diff --git a/README.md b/README.md index d57f0c8..64ea7d0 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Detailed description: 0. Download [the latest spigot](http://ci.md-5.net/job/Spigot/lastStableBuild/artifact/Spigot-Server/target/spigot.jar) 0. Run it once inside redstoner, then shut it down again 0. Create a new directory (inside redstoner) called 'lib' -0. Download [jython](http://search.maven.org/remotecontent?filepath=org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar) and save it as 'jython.jar' inside lib +0. Download [jython](http://search.maven.org/remotecontent?filepath=org/python/jython-standalone/2.7-b2/jython-standalone-2.7-b2.jar) and save it as 'jython.jar' inside lib 0. Download [mysql-connector](https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.30.zip), extract 'mysql-connector-java-X.X.XX-bin.jar ' and save it as 'mysql-connector.jar' inside lib 0. Download [PyPluginLoader](http://gserv.me/static/PyPluginLoader-0.3.5.jar) (we're using [this fork](https://github.com/gdude2002/Python-Plugin-Loader)) into the plugins directory diff --git a/abot.py b/abot.py index b691113..d30f934 100644 --- a/abot.py +++ b/abot.py @@ -1,31 +1,68 @@ +import json from helpers import * from re import compile as reg_compile -rank_regex = "visitor|member|builder|trusted|helper|mod\\b|moderator|admin|owner|rank" +answers_filename = "plugins/redstoner-utils.py.dir/files/abot.json" +answers = [] -faq_regex = [ - # ranks - "\\b(how.*? (get\\b|be\\b|become)|who is|are you).*? (%s)|\\bwho owns.* server" % rank_regex, - # WE - "\\b(can|how|why).*? (have|haz|use|get|doesn|can'?t).*? (WorldEdit|WE\\b|W\\.E\\.\\b)", - # clearing plot - "\\b((why|how|who).*? (do|can)|how to).*?( /?p clear| clear.*? plot)", - # add someone to a plot, claim plot - "\\bhow.*? (get|claim|own|add).*? plot" -] -faq_regex = [reg_compile(reg.lower()) for reg in faq_regex] +def load_answers(): + global answers + try: + answers = json.loads(open(answers_filename).read()) + except Exception, e: + error("Failed to load answers: %s" % e) + + # compile answers + for answer in answers: + answer["regex"] = [reg_compile(reg.lower()) for reg in answer["regex"]] + + +def list_answers(sender): + for answer in answers: + msg(sender, "&e{") + msg(sender, " &eregex:") + for regex in answer["regex"]: + msg(sender, " " + regex.pattern, basecolor="a", usecolor=False) + msg(sender, " &epermission:") + msg(sender, " " + str(answer["hide-perm"]), basecolor="a", usecolor=False) + msg(sender, " &emessage:") + msg(sender, " " + "\n ".join(answer["message"].split("\n"))) + msg(sender, "&e}") + + +@hook.command("abot") +def onAbotCommand(sender, args): + plugHeader(sender, "AnswerBot") + if sender.hasPermission("utils.abot.admin"): + if not args: + msg(sender, "&2/abot list &eList all answers and their regex") + msg(sender, "&2/abot reload &eReload the config file") + elif args[0] == "list": + list_answers(sender) + elif args[0] == "reload": + load_answers() + msg(sender, "&2Reloaded!") + else: + msg(sender) + else: + noperm(sender) + return True + @hook.event("player.AsyncPlayerChatEvent", "low") def onChat(event): sender = event.getPlayer() - if not sender.hasPermission("utils.ignore_abot"): - message = event.getMessage().lower() - for regex in faq_regex: + message = event.getMessage().lower() + for answer in answers: + for regex in answer["regex"]: if regex.search(message): - plugHeader(sender, "AnswerBot") - msg(sender, "&aLooks like you're asking something that's likely in our FAQ.") - msg(sender, "&aTake a look at &4&l/faq&a and read through the pages.\n ") # trailing space required - event.setCancelled(True) - log("(hidden) %s: '%s'" % (sender.getName(), message)) - break + if answer["hide-perm"] and not sender.hasPermission(answer["hide-perm"]): + plugHeader(sender, "AnswerBot") + msg(sender, answer["message"] + "\n ") + event.setCancelled(True) + log("(hidden) %s: '%s'" % (sender.getName(), message)) + break + + +load_answers() \ No newline at end of file diff --git a/chatgroups.py b/chatgroups.py index 3c5c1b2..172b818 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -1,7 +1,7 @@ #pylint: disable=F0401 from helpers import * -from java.utils.UUID import fromString as juuid -import simplejson as json +from java.util.UUID import fromString as juuid +import json chatgroups_filename = "plugins/redstoner-utils.py.dir/files/chatgroups.json" groups = {} @@ -46,7 +46,7 @@ def onChatgroupCommand(sender, args): groupchat(sender, "joined the group", True) saveGroups() msg(sender, "&aYour chatgroup is set to '%s'" % args[1]) - msg(sender, "&aAnyone in the group sees chat that begins with &e%s" % cg_key) + msg(sender, "&aUse chat like '&e%s' to send messages to this group." % cg_key) else: msg(sender, "&e/chatgroup join ") msg(sender, "&e/chatgroup leave") @@ -66,6 +66,7 @@ def onCgtCommand(sender, args): msg(sender, "&8[&bCG&8] &e&oCG toggle: on") return True + def groupchat(sender, message, ann=False): #try: group = groups.get(str(sender.getUniqueId())) @@ -77,6 +78,7 @@ def groupchat(sender, message, ann=False): mesg = "&8[&bCG&8] &e&o%s&e&o %s" % (name, message) else: mesg = "&8[&bCG&8] &f%s&f: &6%s" % (name, message) + log("[ChatGroups] %s (%s): %s" % (sender, group, message)) for receiver in server.getOnlinePlayers(): groups.get(str(receiver.getUniqueId())) == group and msg(receiver, mesg) #except Exception, e: diff --git a/cycle.py b/cycle.py index c35e9bc..53d372c 100644 --- a/cycle.py +++ b/cycle.py @@ -1,4 +1,4 @@ -import simplejson as json +import json from helpers import * cyclers_file = "plugins/redstoner-utils.py.dir/files/cycle.json" diff --git a/damnspam.py b/damnspam.py index ba3867e..cff15b2 100644 --- a/damnspam.py +++ b/damnspam.py @@ -1,6 +1,6 @@ #pylint: disable=F0401 from helpers import * -import simplejson as json +import json spam_filename = "plugins/redstoner-utils.py.dir/files/damnspam.json" inputs = [] diff --git a/helpers.py b/helpers.py index 219172e..735090b 100644 --- a/helpers.py +++ b/helpers.py @@ -6,6 +6,9 @@ import org.bukkit.entity.Player as Player import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause as TeleportCause import org.bukkit.block as bblock + +shared = {} + server = bukkit.Bukkit.getServer() def log(text): diff --git a/main.py b/main.py index 59ac27a..a97930b 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,6 @@ __plugin_version__ = "3.0" __plugin_mainclass__ = "foobar" import sys -import thread from traceback import format_exc as print_traceback # damn pythonloader changed the PATH @@ -24,14 +23,14 @@ def onEnable(): @hook.disable def onDisable(): - mod["reports"].stopChecking() + shared["modules"]["reports"].stopChecking() log("RedstonerUtils disabled!") log("Loading RedstonerUtils...") # Import all modules, in this order -modules = [ +load_modules = [ "misc", "adminchat", "lagchunks", @@ -46,39 +45,11 @@ modules = [ "abot", "forcefield" ] -mod = {} -for module in modules: +shared["modules"] = {} +for module in load_modules: try: - mod[module] = __import__(module) + shared["modules"][module] = __import__(module) log("Module %s loaded." % module) except: error("Failed to import module %s:" % module) error(print_traceback()) - - - -# -# /pyeval - run python ingame -# -# has to be in main.py so we can access the modules - -def evalThread(sender, code): - try: - msg(sender, "%s" % unicode(eval(code)), False, "a") - except Exception, e: - msg(sender, "%s: %s" % (e.__class__.__name__, e), False, "c") - thread.exit() - -@hook.command("pyeval") -def onPyevalCommand(sender, args): - if sender.hasPermission("utils.pyeval"): - if not checkargs(sender, args, 1, -1): - return True - msg(sender, "%s" % " ".join(args), False, "e") - try: - thread.start_new_thread(evalThread, (sender, " ".join(args))) - except Exception, e: - msg(sender, "&cInternal error: %s" % e) - else: - noperm(sender) - return True diff --git a/misc.py b/misc.py index 4475560..b10cd7a 100644 --- a/misc.py +++ b/misc.py @@ -1,6 +1,7 @@ #pylint: disable=F0401 from helpers import * from time import time as now +import thread import org.bukkit.inventory.ItemStack as ItemStack # @@ -99,12 +100,13 @@ def onPlayerInteractEntity(event): def onPluginversionsCommand(sender, args): plugHeader(sender, "Plugin versions") plugins = list(server.getPluginManager().getPlugins()) - plugins.sort(key=lambda pl: pl.getName()) + plugins.sort(key=lambda pl: pl.getDescription().getName()) msg(sender, "&3Listing all " + str(len(plugins)) + " plugins and their version:") for plugin in plugins: - msg(sender, "&6" + plugin.getName() + "&r: &e" + plugin.getDescription().getVersion()) + msg(sender, "&6" + plugin.getDescription().getName() + "&r: &e" + plugin.getDescription().getVersion()) return True + # # /echo - essentials echo sucks and prints mail alerts sometimes # @@ -112,3 +114,30 @@ def onPluginversionsCommand(sender, args): @hook.command("echo") def onEchoCommand(sender, args): msg(sender, " ".join(args).replace("\\n", "\n")) + + +# +# /pyeval - run python ingame +# +# has to be in main.py so we can access the modules + +def evalThread(sender, code): + try: + msg(sender, "%s" % unicode(eval(code)), False, "a") + except Exception, e: + msg(sender, "%s: %s" % (e.__class__.__name__, e), False, "c") + thread.exit() + +@hook.command("pyeval") +def onPyevalCommand(sender, args): + if sender.hasPermission("utils.pyeval"): + if not checkargs(sender, args, 1, -1): + return True + msg(sender, "%s" % " ".join(args), False, "e") + try: + thread.start_new_thread(evalThread, (sender, " ".join(args))) + except Exception, e: + msg(sender, "&cInternal error: %s" % e) + else: + noperm(sender) + return True diff --git a/reports.py b/reports.py index 588681a..24e0edb 100644 --- a/reports.py +++ b/reports.py @@ -1,5 +1,5 @@ from helpers import * -import simplejson as json +import json import time import thread diff --git a/saylol.py b/saylol.py index 1956bfd..0e5caff 100644 --- a/saylol.py +++ b/saylol.py @@ -1,4 +1,4 @@ -import simplejson as json +import json from time import time from helpers import * from random import randrange diff --git a/tilehelper.py b/tilehelper.py index af22d30..0018961 100644 --- a/tilehelper.py +++ b/tilehelper.py @@ -3,7 +3,7 @@ import org.bukkit.event.block.BlockPlaceEvent as BlockPlaceEvent import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent import org.bukkit.event.player.PlayerInteractEvent as PlayerInteractEvent import thread -import simplejson as json +import json from time import sleep from helpers import *