From 782f127b23e6d320338362e9279fd6b399e3d889 Mon Sep 17 00:00:00 2001 From: NEMESIS13cz Date: Mon, 17 Aug 2015 14:44:02 +0200 Subject: Changed timeout in loginsecurity to 60 seconds --- loginsecurity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loginsecurity.py b/loginsecurity.py index 88f5fec..e96edf2 100644 --- a/loginsecurity.py +++ b/loginsecurity.py @@ -8,7 +8,7 @@ import mysqlhack from com.ziclix.python.sql import zxJDBC from java.lang import Runnable -wait_time = 30 #seconds +wait_time = 60 #seconds admin_perm = "utils.loginsecurity.admin" min_pass_length = 8 blocked_events = ["block.BlockBreakEvent", "block.BlockPlaceEvent", "player.PlayerMoveEvent","player.AsyncPlayerChatEvent"] -- cgit v1.2.3 From 5f77eddf5c95b3ff38b8aaa56e1c019daeb1edc0 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 1 Nov 2015 21:59:05 +0100 Subject: This module should work now. Can someone test it? --- synchronizeranks.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/synchronizeranks.py b/synchronizeranks.py index 97439e0..56cc20b 100644 --- a/synchronizeranks.py +++ b/synchronizeranks.py @@ -27,19 +27,19 @@ def on_player_join(event): if role != ranks[rank]: set_role(uuid, ranks[rank]) return - if not user.hasPlayedBefore(): - return - if role == None: + if user.hasPlayedBefore() and role == None: msg(user, "&cYou haven't registed yet! Make sure to do so on redstoner.com") - def get_role(uuid): - return execute_query("SELECT `role_id` FROM users WHERE `uuid` = ? LIMIT 1", uuid)[0][17] + results = execute_query("SELECT `role_id` FROM users WHERE `uuid` = ? LIMIT 1", uuid) + return results[0][0] + # Returns a table with 1 row (LIMIT 1) and 1 column (SELECT `role_id`), so we're looking for the first row of the first column. def set_role(uuid, role_id): - execute_update("UPDATE users SET `role_id` = %d WHERE `uuid` = ?" % role_id, uuid) + execute_update(("UPDATE users SET `role_id` = %d WHERE `uuid` = ?" % role_id), uuid) + # %d is like %s for integers (unlogically, you'd expect something like %i), though %s also works here. def execute_query(query, uuid): -- cgit v1.2.3 From eb201196e16659730c36f5742bab19e34261282a Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 1 Nov 2015 22:03:21 +0100 Subject: Small change <3 --- synchronizeranks.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/synchronizeranks.py b/synchronizeranks.py index 56cc20b..8d0db60 100644 --- a/synchronizeranks.py +++ b/synchronizeranks.py @@ -21,13 +21,12 @@ def on_player_join(event): role = get_role(uuid) if role in [1, 2, 6]: #Disabled/Banned/Superadmin return - if role: + if role != None: for rank in ranks: if user.hasPermission("group." + rank): if role != ranks[rank]: set_role(uuid, ranks[rank]) - return - if user.hasPlayedBefore() and role == None: + elif user.hasPlayedBefore(): msg(user, "&cYou haven't registed yet! Make sure to do so on redstoner.com") -- cgit v1.2.3 From c84dce9d34d35fa6f71f18565ec55d0e54604a2c Mon Sep 17 00:00:00 2001 From: Pepich Date: Mon, 2 Nov 2015 00:02:44 +0100 Subject: Added colorsupport, fixed perms and limits into file, added length limitations, made file PEP8 conform --- chatalias.py | 97 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 43 deletions(-) diff --git a/chatalias.py b/chatalias.py index dc7db72..0a34ebe 100644 --- a/chatalias.py +++ b/chatalias.py @@ -17,95 +17,102 @@ from traceback import format_exc as trace data = None +max_entries = 10 +max_alias_length = 35 +# minecraft message limit is 100 so I decided to give a little tolerance +max_overall_length = 115 + +alias_perm = "utils.alias.allowed" +exceed_length = "utils.alias.exceedlimit" +exceed_entries = "utils.alias.exceedlimit" +exceed_overall_length = "utils.alias.exceedlimit" + + def safe_open_json(): global data if data is not None: return data data = open_json_file("aliases") if data is None: - data = {"gnl":{"max_len":"35","max_entries":"10"}} + data = {} save_json_file("aliases", data) return data -@hook.command("alias", usage = "/ [to_alias] [alias...]", desc = "Aliases words in chat") +@hook.command("alias", + usage="/ [to_alias] [alias...]", + desc="Aliases words in chat") def on_alias_command(sender, cmd, label, args): if not is_player(sender): - msg(sender, "Sorry, Console cannot alias words") - return True - - if not sender.hasPermission("utils.alias.allowed"): - plugin_header(recipient = sender, name = "Chat Alias") + msg(sender, "Sorry, Console cannot alias words") + return True + if not sender.hasPermission(alias_perm): + plugin_header(recipient=sender, name="Chat Alias") noperm(sender) return True - if len(args) == 0: - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "This is a plugin that allows you to type in chat and have words replaced by other ones automatically!") - msg(sender, "\nCommands:") - msg(sender, "/alias : removes from aliased words. Use * to remove all aliased words.") - msg(sender, "/alias : Will change to in chat") - msg(sender, "\nYour Aliases:") + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&7This is a plugin that allows you to get words" + + "replaced by other ones automatically!") + msg(sender, "&7\nCommands:") + msg(sender, "&e/alias &7removes from your aliases. " + + "Use &e/alias * &7to remove all aliases.") + msg(sender, "&e/alias &7will change &e " + + "&7to &e &7in chat") + msg(sender, "&7\nYour Aliases:") data = safe_open_json() try: for alias, value in data[str(sender.getUniqueId())].items(): - msg(sender, "%s ==> %s" % (alias, value)) + msg(sender, "&7%s &7==> %s" % (alias, value)) except KeyError: pass return True - elif len(args) == 1: data = safe_open_json() if args[0] == "*": try: del data[str(sender.getUniqueId())] except KeyError: - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "No alias data to remove!") + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&7No alias data to remove!") return True save_json_file("aliases", data) - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "ALL alias data successfuly removed!") + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&cALL &7alias data successfuly removed!") return True - try: if data[str(sender.getUniqueId())].pop(args[0], None) is None: - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "Could not remove: alias not present!") + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&7Could not remove: alias not present!") return True except KeyError: - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "Could not remove: you do not have any aliases!") + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&7Could not remove: you do not have any aliases!") return True - save_json_file("aliases", data) - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "Alias for %s successfuly removed" % args[0]) + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&7Alias for %s &7successfuly removed" % args[0]) return True - elif len(args) >= 2: data = safe_open_json() alias = " ".join(args[1:]) try: - if len(alias) > int(data["gnl"]["max_len"]) and int(data["gnl"]["max_len"]) >= 0: - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "Please do not alias long words/sentences.") + if (len(alias) > max_alias_length) and (max_alias_length >= 0) and (not sender.hasPermission(exceed_length)): + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&7Please do not alias long words/sentences.") return True - - if len(data[str(sender.getUniqueId())]) >= int(data["gnl"]["max_entries"]) and int(data["gnl"]["max_entries"]) >= 0: - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "You have reached the maximum amount of alias entries! Sorry!") + if (len(data[str(sender.getUniqueId())]) >= max_entries) and (max_entries >= 0) and (not sender.hasPermission(exceed_entries)): + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&7You have reached your alias limit!") return True except KeyError: data[str(sender.getUniqueId())] = {} - data[str(sender.getUniqueId())][args[0]] = alias save_json_file("aliases", data) - plugin_header(recipient = sender, name = "Chat Alias") - msg(sender, "Chat Alias %s ==> %s successfully created!" % (args[0], alias)) + plugin_header(recipient=sender, name="Chat Alias") + msg(sender, "&7Chat Alias %s &7==> %s &7successfully created!" % (args[0], alias)) return True - else: return False @@ -114,14 +121,18 @@ def on_alias_command(sender, cmd, label, args): def on_player_chat(event): playerid = str(event.getPlayer().getUniqueId()) data = safe_open_json() - if event.isCancelled(): return - try: crashtest = data[playerid].items() except KeyError: return - for alias, value in data[playerid].items(): event.setMessage(event.getMessage().replace(alias, value)) + if (event.getPlayer().hasPermission('essentials.chat.color')): + event.setMessage(colorify(event.getMessage())) + if (len(event.getMessage()) > max_overall_length) and (not sender.hasPermission(exceed_overall_length)): + event.setCancelled(True) + msg(sender, "&7The message generated was too long and was not sent " + + "but it would've looked like that:") + msg(sender, event.getMessage()) -- cgit v1.2.3 From 93ca9e045628ccc1d76a6ae8b3648126451f6a24 Mon Sep 17 00:00:00 2001 From: Nemes Date: Tue, 3 Nov 2015 16:57:19 +0100 Subject: Removed secondary permission, sorry my derp --- signalstrength.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/signalstrength.py b/signalstrength.py index 10a4933..ebe2bd1 100644 --- a/signalstrength.py +++ b/signalstrength.py @@ -109,9 +109,6 @@ def get_entire_container(container): helpSubcmd = True, senderLimit = 0) def on_signalstrength_command(sender, command, label, args): - if not sender.hasPermission("utils.ss"): - noperm(sender) - return None if len(args) > 0 and args[0].lower() in ("default", "defaults", "setdefaults"): strength, item_type, item_data = get_data(sender, args[1:]) -- cgit v1.2.3 From aa86881f5eabe0a7471aadf73ee8a7b789e679dc Mon Sep 17 00:00:00 2001 From: Dico200 Date: Tue, 3 Nov 2015 19:05:15 +0100 Subject: Fix survival use of /signalstrength, other interesting changes --- helpers.py | 10 +++++++ misc.py | 4 ++- signalstrength.py | 5 ++++ synchronizeranks.py | 79 ++++++++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 84 insertions(+), 14 deletions(-) diff --git a/helpers.py b/helpers.py index 898dea7..79af3a0 100644 --- a/helpers.py +++ b/helpers.py @@ -181,6 +181,16 @@ def is_creative(player): return str(player.getGameMode()) == "CREATIVE" +def is_rank(player, rank): + """ + rank: a string equal to the PEX group name found in /pex groups + returns True if one of the following conditions are met: + - the player is of the given rank, + - their rank inherits the given rank. + """ + return player.hasPermission("groups." + rank) + + def uid(player): """ returns the player's UUID diff --git a/misc.py b/misc.py index c6da200..09abcb8 100644 --- a/misc.py +++ b/misc.py @@ -7,6 +7,7 @@ import thread import org.bukkit.inventory.ItemStack as ItemStack import org.bukkit.Bukkit as Bukkit from basecommands import simplecommand, Validate +import java.util.Arrays as Arrays @@ -161,7 +162,8 @@ def on_pluginversions_command(sender, command, label, args): """ try: plugin_header(sender, "Plugin versions") - plugins = [pl.getDescription() for pl in list(ArrayList(java_array_to_list(server.getPluginManager().getPlugins())))] + raw_plugins = server.getPluginManager().getPlugins() # Plugin[] + plugins = [raw_plugins[i].getDescription() for i in range(len(raw_plugins))] info(type(plugins[0]).__name__) plugins.sort(key = lambda pl: pl.getDescription().getName()) msg(sender, "&3Listing all " + str(len(plugins)) + " plugins and their version:") diff --git a/signalstrength.py b/signalstrength.py index ebe2bd1..c668b46 100644 --- a/signalstrength.py +++ b/signalstrength.py @@ -109,6 +109,11 @@ def get_entire_container(container): helpSubcmd = True, senderLimit = 0) def on_signalstrength_command(sender, command, label, args): + + #Sender has to be in creative and if in Trusted world, they have to be Trusted+. Any ranks above trusted inherit groups.trusted. + if (not is_creative(sender)) or (sender.getWorld().getName() == "Trusted" and not is_rank(sender, "trusted")): + return "&cYou do not have permission to use that command in this world" + if len(args) > 0 and args[0].lower() in ("default", "defaults", "setdefaults"): strength, item_type, item_data = get_data(sender, args[1:]) diff --git a/synchronizeranks.py b/synchronizeranks.py index 8d0db60..4509185 100644 --- a/synchronizeranks.py +++ b/synchronizeranks.py @@ -3,6 +3,14 @@ from secrets import * import mysqlhack from com.ziclix.python.sql import zxJDBC +""" +WORK IN PROGRESS +""" + +#-----------------------Config-------------------------- + +config_file = "website-roles" + ranks = { "member" : 3, "builder" : 7, @@ -13,31 +21,41 @@ ranks = { "admin" : 5 } +ranks = open_json_file(config_file, ranks) + +def save_ranks(): + save_json_file(config_file, ranks) + +#-----------------------Event--------------------------- @hook.event("player.PlayerJoinEvent", "normal") def on_player_join(event): user = event.getPlayer() uuid = uid(player).replace("-", "") - role = get_role(uuid) - if role in [1, 2, 6]: #Disabled/Banned/Superadmin - return - if role != None: - for rank in ranks: - if user.hasPermission("group." + rank): - if role != ranks[rank]: - set_role(uuid, ranks[rank]) - elif user.hasPlayedBefore(): - msg(user, "&cYou haven't registed yet! Make sure to do so on redstoner.com") + + sql_instruction + + def callback_thing(role, args): + + if role in [1, 2, 6]: #Disabled/Banned/Superadmin + return + if role != None: + for rank in ranks: + if user.hasPermission("group." + rank): + if role != ranks[rank]: + set_role(uuid, ranks[rank]) + elif user.hasPlayedBefore(): + msg(user, "&cYou haven't registed yet! Make sure to do so on redstoner.com") def get_role(uuid): - results = execute_query("SELECT `role_id` FROM users WHERE `uuid` = ? LIMIT 1", uuid) + results = execute_query("SELECT `role_id` FROM users WHERE `uuid` = ? LIMIT 1;", uuid) return results[0][0] # Returns a table with 1 row (LIMIT 1) and 1 column (SELECT `role_id`), so we're looking for the first row of the first column. def set_role(uuid, role_id): - execute_update(("UPDATE users SET `role_id` = %d WHERE `uuid` = ?" % role_id), uuid) + execute_update("UPDATE users SET `role_id` = ? WHERE `uuid` = ?;", (role_id, uuid,)) # %d is like %s for integers (unlogically, you'd expect something like %i), though %s also works here. @@ -55,5 +73,40 @@ def execute_update(update, uuid): conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") curs = conn.cursor() curs.execute(update, (uuid,)) + conn.commit() curs.close() - conn.close() \ No newline at end of file + conn.close() + +def get_role(uuid): + sql_instruction() + +#--------------------------------Queries / Updates---------------------------- + +def sql_instruction(instruction, args, fetch = True, callback_func = ignored_func, callback_args = tuple()): + thread = threading.Thread(target = curs_instruction, args = (instruction_executor, instruction, fetch, callback_func, callback_args)) + thread.start() + + +def curs_instruction(func, instruction, fetch, callback_func, callback_args): + conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + curs = conn.getCursor() + + if fetch: + returned = func(curs, instruction, fetch) + curs.close() + conn.close() + callback_func(returned, callback_args) + + else: + func(curs, instruction, fetch) + conn.commit() + curs.close() + conn.close() + + +def instruction_executor(curs, instruction, fetch): + curs.execute(instruction) + return curs.fetchall() if fetch else None + +def ignored_func(*args): + pass \ No newline at end of file -- cgit v1.2.3 From 7282bf63f647fa217e6aa7d9a4f24050dacf850e Mon Sep 17 00:00:00 2001 From: Dico Date: Tue, 3 Nov 2015 19:16:35 +0100 Subject: Removed unneeded permission check from signalstrength.py... again xD --- signalstrength.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/signalstrength.py b/signalstrength.py index c668b46..d51f35a 100644 --- a/signalstrength.py +++ b/signalstrength.py @@ -109,10 +109,6 @@ def get_entire_container(container): helpSubcmd = True, senderLimit = 0) def on_signalstrength_command(sender, command, label, args): - - #Sender has to be in creative and if in Trusted world, they have to be Trusted+. Any ranks above trusted inherit groups.trusted. - if (not is_creative(sender)) or (sender.getWorld().getName() == "Trusted" and not is_rank(sender, "trusted")): - return "&cYou do not have permission to use that command in this world" if len(args) > 0 and args[0].lower() in ("default", "defaults", "setdefaults"): strength, item_type, item_data = get_data(sender, args[1:]) -- cgit v1.2.3 From eb491bcd9ef5919acc858c0d48834d6f7fe02c4e Mon Sep 17 00:00:00 2001 From: Dico Date: Wed, 4 Nov 2015 11:52:27 +0100 Subject: Update chatgroups, add /cg tpahere, add some cool code I added a function do_for_chatgroup which takes a groupname, a function, and additional arguments after a receiver. --- chatgroups.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/chatgroups.py b/chatgroups.py index 326b8d3..ab27e1f 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -43,6 +43,12 @@ def on_chatgroup_command(sender, command, label, args): msg(sender, "&aUse chat like '&e%s' to send messages to this group." % get_key(sender_id)) elif len(args) == 1 and args[0] == "key": msg(sender, "&aYour chatgroup key is currently: '&c%s&a'" % get_key(sender_id)) + elif len(args) == 1 and args[0] == "tpahere": + if sender_id in groups.keys(): + do_for_chatgroup(groups[sender_id], send_tpa_request, sender) + msg(sender, "&aSent a tpahere request to all users in your chatgroup") + else: + msg(sender, "&cYou have to be in a chatgroup to do that") else: msg(sender, "&e/chatgroup join ") msg(sender, "&e/chatgroup leave") @@ -73,10 +79,16 @@ def groupchat(sender, message, ann = False): else: mesg = "&8[&bCG&8] &f%s&f: &6%s" % (name, message) info("[ChatGroups] %s (%s): %s" % (sender.getDisplayName(), group, message)) - for receiver in server.getOnlinePlayers(): - groups.get(uid(receiver)) == group and msg(receiver, mesg) + do_for_chatgroup(group, msg, mesg) +def do_for_chatgroup(group, func, args): + for receiver in server.getOnlinePlayers(): + if groups.get(uid(receiver)) == group: + func(receiver, args) +def send_tpa_request(receiver, sender): + if not receiver == sender: + runas(sender, "/tpahere " + receiver.getName()) def save_groups(): save_json_file("chatgroups", groups) @@ -115,5 +127,6 @@ def chatgroupkey_command(sender, command, label, args): save_keys() return "&aYour chatgroup key was set to: '&c%s&a'" % key + def save_keys(): save_json_file("chatgroup_keys", cg_keys) -- cgit v1.2.3 From 4a4cdc839be140dc9486b2cffd8c065365a70404 Mon Sep 17 00:00:00 2001 From: Dico Date: Wed, 4 Nov 2015 11:53:09 +0100 Subject: Add /chatgroup tpahere to chatgroups help message --- chatgroups.py | 1 + 1 file changed, 1 insertion(+) diff --git a/chatgroups.py b/chatgroups.py index ab27e1f..2cd496a 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -54,6 +54,7 @@ def on_chatgroup_command(sender, command, label, args): msg(sender, "&e/chatgroup leave") msg(sender, "&e/chatgroup info") msg(sender, "&e/chatgroup key") + msg(sender, "&e/chatgroup tpahere") @hook.command("cgt") -- cgit v1.2.3 From 93c9bab421cadc26d2af32a882d38763ddf43bc5 Mon Sep 17 00:00:00 2001 From: Dico Date: Wed, 4 Nov 2015 12:01:38 +0100 Subject: Chatgroups optimization The message is now colorified just once, not for every recipient. I'll test all this at home <3 --- chatgroups.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/chatgroups.py b/chatgroups.py index 2cd496a..9965b96 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -79,13 +79,15 @@ 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) + mesg = colorify(mesg) + info("[ChatGroups] %s (%s): %s" % (sender.getDisplayName(), group, message)) - do_for_chatgroup(group, msg, mesg) + do_for_chatgroup(group, msg, mesg, usecolor = False) -def do_for_chatgroup(group, func, args): +def do_for_chatgroup(group, func, *args, **kwargs): for receiver in server.getOnlinePlayers(): if groups.get(uid(receiver)) == group: - func(receiver, args) + func(receiver, args, kwargs) def send_tpa_request(receiver, sender): if not receiver == sender: -- cgit v1.2.3 From 1b59c79fd715e9b5fc6dc2c197c4547b84c4e312 Mon Sep 17 00:00:00 2001 From: PixelSergey Date: Sat, 21 Nov 2015 12:08:45 +0200 Subject: Fixed chatalias, no bugs and now SAFE! \o/ --- chatalias.py | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/chatalias.py b/chatalias.py index 0a34ebe..d55269c 100644 --- a/chatalias.py +++ b/chatalias.py @@ -4,23 +4,21 @@ # so that when they send a # message in chat, it gets # replaced by their specified -# word. Configuration of this -# plugin is in the "gnl" -# (general) tag of the JSON -# file named "aliases". The -# file is generated if not +# word. The JSON file for this +# plugin is generated if not # present. Set values to -1 # for "unlimited" setting. from helpers import * +import re from traceback import format_exc as trace data = None max_entries = 10 max_alias_length = 35 -# minecraft message limit is 100 so I decided to give a little tolerance -max_overall_length = 115 +# Minecraft message limit is 100 so I decided to give a little tolerance (and I added a bit more) +max_overall_length = 100 + max_alias_length alias_perm = "utils.alias.allowed" exceed_length = "utils.alias.exceedlimit" @@ -38,6 +36,10 @@ def safe_open_json(): save_json_file("aliases", data) return data +def multiple_replace(aliases, text): + regex = re.compile("|".join(map(re.escape, aliases.keys()))) + return regex.sub(lambda mo: aliases[mo.group(0)], text) + @hook.command("alias", usage="/ [to_alias] [alias...]", @@ -45,7 +47,7 @@ def safe_open_json(): def on_alias_command(sender, cmd, label, args): if not is_player(sender): - msg(sender, "Sorry, Console cannot alias words") + msg(sender, "Sorry, non-players cannot alias words") return True if not sender.hasPermission(alias_perm): plugin_header(recipient=sender, name="Chat Alias") @@ -123,16 +125,14 @@ def on_player_chat(event): data = safe_open_json() if event.isCancelled(): return - try: - crashtest = data[playerid].items() - except KeyError: + if not data[playerid]: return - for alias, value in data[playerid].items(): - event.setMessage(event.getMessage().replace(alias, value)) - if (event.getPlayer().hasPermission('essentials.chat.color')): + event.setMessage(multiple_replace(data[playerid], event.getMessage())) + + if (event.getPlayer().hasPermission("essentials.chat.color")): event.setMessage(colorify(event.getMessage())) - if (len(event.getMessage()) > max_overall_length) and (not sender.hasPermission(exceed_overall_length)): + if (max_overall_length >= 0) and (len(event.getMessage()) > max_overall_length) and (not event.getPlayer().hasPermission(exceed_overall_length)): event.setCancelled(True) - msg(sender, "&7The message generated was too long and was not sent " + - "but it would've looked like that:") - msg(sender, event.getMessage()) + plugin_header(recipient=event.getPlayer(), name="Chat Alias") + msg(event.getPlayer(), "&7The message generated was too long and was not sent. :/") + -- cgit v1.2.3 From 23b3bffcf6faa699c3a850ab183675ee6d673c10 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 14:51:47 +0100 Subject: Major serversigns overhaul, it mostly works now. A little bit of testing and command help is left --- blockplacemods.py | 4 +- main.py | 4 +- serversigns.py | 386 ++++++++++++++++++++++++++++++------------------------ 3 files changed, 220 insertions(+), 174 deletions(-) diff --git a/blockplacemods.py b/blockplacemods.py index 246f9eb..85e71c5 100644 --- a/blockplacemods.py +++ b/blockplacemods.py @@ -24,7 +24,7 @@ settingInformation = dict( #[setting type, identifying description, detailed des ], furnace = [1, "automatically filling furnaces upon placement", - "Sets your preferred default furnace contents to your currently held itemstack. Use an empty hand to empty a slot, or /toggle dropper clear to clear all slots.", + "Sets your preferred default furnace contents to your currently held itemstack. Use an empty hand to empty a slot, or /toggle furnace clear to clear all slots.", ["cooker", "fillf"], 2 ], #torch = [0, @@ -44,7 +44,7 @@ settingInformation = dict( #[setting type, identifying description, detailed des ], hopper = [1, "automatically filling hoppers upon placement", - "Sets your preferred default hopper contents to your currently held itemstack. Use an empty hand to empty a slot, or /toggle dropper clear to clear all slots.", + "Sets your preferred default hopper contents to your currently held itemstack. Use an empty hand to empty a slot, or /toggle hopper clear to clear all slots.", ["itemtransporter", "fillh"], 4 ] ) diff --git a/main.py b/main.py index 4769bc5..ede4269 100644 --- a/main.py +++ b/main.py @@ -99,7 +99,9 @@ shared["load_modules"] = [ # a simple replacement for the buggy essentials /vanish "vanish", # ip-tracking utility - "iptracker" + "iptracker", + #server signs for everyone + "serversigns" ] shared["modules"] = {} for module in shared["load_modules"]: diff --git a/serversigns.py b/serversigns.py index c7bc23c..af175ba 100644 --- a/serversigns.py +++ b/serversigns.py @@ -3,219 +3,263 @@ from basecommands import simplecommand, Validate import org.bukkit.Material as Material import java.util.UUID as UUID import org.bukkit.Material as Material -import java.util.HashSet as JSet +import org.bukkit.block.BlockFace as BlockFace +blocked_cmds = ("pex", "kick", "ban", "tempban", "pyeval", "sudo") -cmd_use_perm = "utils.svs.cmd" -msg_use_perm = "utils.svs.msg" +def load_signs(): + signs_obj = open_json_file("serversigns", []) + loaded = {} + for entry in signs_obj: + loaded[tuple(entry[:4])] = list(entry[4:]) + return loaded -signs = open_json_file("serversigns", {}) # {("world", x, y, z): ["owner_id", "msg1", "msg2"]} +def save_signs(): + signs_obj = [] + for key, value in signs.iteritems(): + signs_obj.append(key + tuple(value)) + save_json_file("serversigns", signs_obj) -lines = {} #Accumulated messages so players can have longer messages: {"Dico200": "Message...........", ""} +signs = load_signs() # {("world", x, y, z): ["owner_id", "msg1", "msg2"]} -transparent_blocks_set = JSet([Material.AIR, Material.GLASS, Material.STAINED_GLASS]) #used in sender.getTargetBlock() +lines = {} # Accumulated messages so players can have longer messages: {"Dico200": "Message...........", ""} -@simplecommand(cmd = "serversigns", aliases = ["svs", "signmsg"], - description = "Makes something happen when you right click certain signs", - usage = "[claim|unclaim|add |remove |clear|info|help]", - helpNoargs = True, - senderLimit = 0) -def svs_command(sender, command, label, args): - try: - arg1 = args[0].lower() - if arg1 not in ("add", "remove", "clear", "claim", "unclaim", "help"): - return "&4That argument could not be recognized, use &o/svs &4help for more information" - - sender = server.getPlayer(sender.getName()) - block = sender.getTargetBlock(transparent_blocks_set, 8) - info("Block type: " + str(block.getType())) - if block.getType() not in (Material.SIGN_POST, Material.WALL_SIGN): - return "&4You have to be looking at a sign to use that!" - - loc = fromLoc(block.getLocation()) - sign = getSign(loc) - arglen = len(args) - arg2 = args[1].lower() if arglen > 1 else None - - - if arg1 == "claim": - Validate.isAuthorized(sender, "utils.serversigns.claim") - target = sender - if arg2: - Validate.isAuthorized(sender, "utils.serversigns.admin") - target = server.getOfflinePlayer(arg2) - Validate.notNone(target, signsMsg("That player could not be found", '4')) - - Validate.isPlayer(target) - uuid = uid(sender) - if sign != None: - if sign[0] == uuid: - return signsMsg(identifySign(loc, True) + " was already owned by that player", '4') - else: - sign[0] = uuid - else: - signs[loc] = [uuid] - - return signsMsg("Claimed " + identifySign(loc)) - - - elif arg1 == "unclaim": - Validate.isAuthorized(sender, "utils.serversigns.unclaim") - Validate.isTrue(canEdit(sign, sender), signsMsg("You cannot unclaim the %s!" % identifySign(loc)), '4') - - if not (("-c" in args) and sender.hasPermission("utils.serversigns.admin")): - del signs[locAt] - return signsMsg("The %s was reset successfully" % identifySign(loc)) - sign[0] = "" - return signsMsg("The %s had its owner removed successfully" % identifySign(loc)) - - - elif arg1 == "help": - admin = sender.hasPermission("utils.serversigns.admin") - - return - - - elif arg1 == "add": - Validate.isTrue(canEdit(sign, sender), signsMsg("You cannot edit the %s!" % identifySign(loc)), '4') - line = " ".join(args[1:]) - Validate.isTrue(line != "" and line != None, signsMsg("You have to enter a message to add or accumulate!", '4')) - key = sender.getName() - - Validate.isTrue(key in lines or line[:1] != "/" or sender.hasPermission("utils.serversigns.command"), signsMsg("You cannot add commands to a sign!", '4')) - - if line[-2:] == "++": - if key not in lines: - lines[key] = "" - lines[key] += " " + line[:-2] - elif key in lines: - line = lines[key] + " " + line - sign.append(colorify(line) if line[0] != "/" else line) - return signsMsg("Added line \"%s&a\" to the %s" % (line, identifySign(loc))) - - - elif arg1 == "info": - Validate.notNone(sign, signsMsg("The %s has not been claimed" % identifySign(loc), '4')) - lines = "" - for id, line in enumerate(sign[1:]): - lines += ("\n &a%s: \"%s&a\"" % (id + 1, line)) - msg = signsMsg("Some information about the %s:\n Owner: %s\n Lines: %s" % identifySign(loc), getOwner(sign), lines) - - - elif arg1 == "remove": - Validate.notNone(arg2, signsMsg("You have to enter the ID of the message to remove!", '4')) - try: - id = int(arg2) - except: - return signsMsg("The ID of the message has to be a number and can be found by using &o/svs info", '4') - Validate.isTrue(id != 0 and id < len(sign), signsMsg("The %s has no message with an ID of %s, use &o/svs info &4for all messages." % (identifySign(loc), id), '4')) - sign.remove(id) - return signsMsg("Removed message with id %s from the %s" % (id, identifySign(loc))) - except: - error(trace()) - - - -@hook.event("player.PlayerInteractEvent") -def onClick(event): - if str(event.getAction()) != "RIGHT_CLICK_BLOCK": - return - block = event.getClickedBlock() - if block.getType() not in (Material.WALL_SIGN, Material.SIGN_POST): - return - sign = getSign(fromLoc(block.getLocation())) - if sign != None: - player = event.getPlayer() - for message in sign[1:]: - if message[:1] == "/": - server.dispatchCommand(player, message[1:]) - else: - msg(player, message, usecolor = False) - -def fromLoc(bLoc): #Bukkit Location to ("world", x, y, z) +def fromLoc(bLoc): + """ + # Returns a tuple containing the (bukkit)location's world's name and its x, y and z coordinates + # The format for the tuple is ("world_name", x, y, z) + """ return (bLoc.getWorld().getName(), bLoc.getBlockX(), bLoc.getBlockY(), bLoc.getBlockZ()) def equals(loc1, loc2): + """ + # Returns whether loc1 and loc2 represent the same block + """ for i in range(4): if loc1[i] != loc2[i]: return False return True def getOwner(sign): + """ + # Returns the name of the sign its owner + """ return retrieve_player(sign[0]).getName() def isOwner(sign, player): + """ + # Returns whether the given player owns the sign + """ return sign and sign[0] == uid(player) def canEdit(sign, player): - return player.hasPermission("utils.serversigns.admin") or isOwner(sign, player) + """ + # Returns whether the given player can edit the sign. + # Returns False if the sign wasn't claimed. + """ + return (sign and player.hasPermission("utils.serversigns.admin")) or isOwner(sign, player) def getSign(locAt): + """ + # If data was found for a sign at the given location, returns the data. + # This data follows the format of ["owner_id", "msg1", "msg2"...]. + """ for loc, sign in signs.iteritems(): if equals(locAt, loc): return sign return None -def identifySign(loc, capital = False): - return "%sign at (%s) in %s" % ("S" if capital else "s", ",".join(loc[1:]), loc[0]) - -def signsMsg(msg, colour = 'a'): +def identifySign(loc): + """ + # Returns a string from which the user can tell what sign you're talking about. + # The string follows the format of "sign at (x,y,z) in world_name". + """ + return "sign at (%s) in %s" % (",".join((str(i) for i in loc[1:])), loc[0]) + +def signsMsg(msg, colour = '4'): + """ + # Returns the given msg, prefixed with '[Signs] '. + # The given colour is after applied to the msg. + # The colour defaults to 4 (dark red). + """ return "&c[Signs] &" + colour + msg +@simplecommand(cmd = "serversigns", aliases = ["svs", "signmsg"], + description = "Makes something happen when you right click certain signs", + usage = "[claim|unclaim|add |remove |clear|info|help]", + helpNoargs = True, + senderLimit = 0) +def svs_command(sender, command, label, args): + arg1 = args[0].lower() + Validate.isTrue(arg1 in ("claim", "reset", "add", "remove", "info", "clear", "help", "switch"), signsMsg("That argument could not be recognized, use &o/svs help &4for expected arguments")) + Validate.isAuthorized(sender, "utils.serversigns." + arg1) + + #-------------------- Sub commands that don't require any conditions ----------------------- + if arg1 == "help": + admin = sender.hasPermission("utils.serversigns.admin") + + return "&2COMMAND HELP HERE" + #------------------------------------------------------------------------------------------- + + block = sender.getTargetBlock(None, 5) + Validate.isTrue(block.getType() in (Material.SIGN_POST, Material.WALL_SIGN), signsMsg("You have to be looking at a sign to use that!")) + + loc = fromLoc(block.getLocation()) + sign = getSign(loc) + signName = identifySign(loc) + arg2 = args[1].lower() if len(args) > 1 else None + is_admin = sender.hasPermission("utils.serversigns.admin") + + #------------------------ Sub commands that require the block to be a sign ------------------------------- + if arg1 == "claim": + target = sender + if arg2: + Validate.isTrue(is_admin, signsMsg("You are not authorized to claim signs for other players")) + target = server.getOfflinePlayer(arg2) + Validate.notNone(target, signsMsg("That player could not be found")) + Validate.isTrue(target.isOnline(), signsMsg("The target has to be online")) + uuid = uid(target) + if sign != None: + if sign[0] == uuid: + return signsMsg("The" + signName + " was already owned by that player") + else: + sign[0] = uuid + else: + signs[loc] = [uuid] + save_signs() + return signsMsg("Claimed the " + signName + ((" for %s" % target.getName()) if (target != sender) else ""), 'a') + #---------------------------------------------------------------------------------------------------------- + + Validate.notNone(sign, signsMsg("The %s has not been claimed" % signName)) + + #----------------------Sub commands that require the sign to be claimed as well------------------------------------ + if arg1 == "info": + sign_lines = "" + for id, line in enumerate(sign[1:]): + sign_lines += ("\n &a%s: \"&f%s&a\"" % (id + 1, line)) + return signsMsg("Properties of the %s:\n Owner: %s\n Lines: %s" % (signName, getOwner(sign), sign_lines), 'a') + #--------------------------------------------------------------------------------------------------------------- + + 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": + line = " ".join(args[1:]) + Validate.isTrue(line != "" and line != None, signsMsg("You have to enter a message to add or accumulate")) + key = sender.getName() + global lines + Validate.isTrue(key in lines or line[:1] != "/" or sender.hasPermission("utils.serversigns.command"), signsMsg("You cannot add commands to a sign!")) + if line[-2:] == "++": + if key not in lines: + lines[key] = "" + lines[key] += " " + line[:-2] + return signsMsg("Added given message to the message you're accumulating. \nYour accumulated message is now as follows: \n&f%s" % lines[key], 'a') + if key in lines: + line = (lines[key] + " " + line)[1:] + Validate.isTrue(line[0] != "/" or line.split(" ")[0][1:] not in blocked_cmds, signsMsg("Usage of that command with server signs is prohibited")) + sign.append(colorify(line) if line[0] != "/" else line) + save_signs() + return signsMsg("Added line \"&f%s&a\" to the %s" % (line, signName), 'a') + + + if arg1 == "remove": + Validate.notNone(arg2, signsMsg("You have to enter the ID of the message to remove!")) + try: + id = int(arg2) + except: + return signsMsg("The ID of the message has to be a number and can be found by using &o/svs info") + Validate.isTrue(id != 0 and id < len(sign), signsMsg("The %s has no message with an ID of %s, use &o/svs info &4for all messages." % (signName, id))) + sign.remove(id) + return signsMsg("Removed message with id %s from the %s" % (id, signName), 'a') + + + if arg1 == "switch": + Validate.isTrue(len(args) == 3, signsMsg("You have to enter the 2 IDs of the lines to switch")) + try: + id1 = int(args[1]) + id2 = int(args[2]) + except: + return signsMsg("The ID of the message has to be a number and can be found by using &o/svs info") + for id in (id1, id2): + Validate.isTrue(id != 0 and id < len(sign), signsMsg("The %s has no message with an ID of %s, use &o/svs info &4for all messages." % (signName, id))) + sign[id1], sign[id2] = sign[id2], sign[id1] + return signsMsg("Switched the lines with IDs %s and %s of the %s" % (id1, id2, signName), 'a') + + + if arg1 == "clear": + signs[loc] = [sign[0]] + return signsMsg("Removed all messages from the %s" % signName, 'a') + + + if arg1 == "reset": + del signs[loc] + return signsMsg("Removed all messages and the owner from the %s, it can now be claimed" % signName, 'a') + #------------------------------------------------------------------------------------------------------- -""" -def eventhook(event, priority = "normal"): - - if "." not in event: - word = "" - for s in event: - if word != "" and s in "ABCDEFGHIJKLMNOPQRSTUVWXYZ": - break; - word += s.lower() - event = "%s.%s" % (word, event) - - def decorator(function): - - @hook.event(event, priority) - def hook(event): - try: - function(event) - except EventException, e: - pass - - return hook - - return decorator - -class EventException(Exception): - def __init__(self, msg): - self.msg = msg - -"" -@eventhook("PlayerInteractEvent") -def x(event): - - p = event.getPlayer() - if p == None: - raise EventException(Stuff) -"" -""" - - - - - +@hook.event("player.PlayerInteractEvent") +def on_click(event): + if str(event.getAction()) != "RIGHT_CLICK_BLOCK": + return + block = event.getClickedBlock() + if block.getType() not in (Material.WALL_SIGN, Material.SIGN_POST): + return + sign = getSign(fromLoc(block.getLocation())) + if sign != None: + player = event.getPlayer() + for message in sign[1:]: + if message[:1] == "/": + server.dispatchCommand(player, message[1:]) + else: + msg(player, message, usecolor = False) +# ---------------------------Sign breaking-------------------------------- +checking_block = False +faces = { + BlockFace.NORTH : (0,1,2), + BlockFace.SOUTH : 3, + BlockFace.WEST : 4, + BlockFace.EAST : 5 +} +@hook.event("block.BlockBreakEvent", "highest") +def on_break(event): + global checking_block + if checking_block or event.isCancelled(): + return + block = event.getBlock() + if block.getMaterial() in (Material.SIGN_POST, Material.WALL_SIGN): + check_sign(event, block, attached = False) + for block_face, data_values in faces.iteritems(): + block2 = block.getRelative(block_face) + if block2.getData() in data_values: + check_sign(event, block2) + block3 = block.getRelative(BlockFace.UP) + if block3.getMaterial == Material.SIGN_POST: + check_sign(event, block3) +def check_sign(event, block, attached = True): + player = event.getPlayer() + sign = getSign(fromLoc(block.getLocation())) + if not canEdit(sign, player) and not can_build(player, block.getLocation()): + event.setCancelled(True) + msg(event.getPlayer(), signsMsg("You cannot break %s" % ("the sign attached to that block" if attached else "that sign"))) + + +def can_build(player, block): + global checking_block + event = BlockBreakEvent(block, player) + checking_block = True + server.getPluginManager().callEvent(event) + checking_block = False + return not event.isCancelled() -- cgit v1.2.3 From 8613c9221e741499356a82faaff79725c4b3d1c6 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 15:52:41 +0100 Subject: Fix for /svs remove , Added some to blocked_cmds, /svs help still WIP --- serversigns.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/serversigns.py b/serversigns.py index af175ba..ecba2e8 100644 --- a/serversigns.py +++ b/serversigns.py @@ -5,7 +5,7 @@ import java.util.UUID as UUID import org.bukkit.Material as Material import org.bukkit.block.BlockFace as BlockFace -blocked_cmds = ("pex", "kick", "ban", "tempban", "pyeval", "sudo") +blocked_cmds = ("pex", "kick", "ban", "tempban", "pyeval", "sudo", "stop", "reload", "op", "deop", "whitelist") def load_signs(): signs_obj = open_json_file("serversigns", []) @@ -170,7 +170,7 @@ def svs_command(sender, command, label, args): except: return signsMsg("The ID of the message has to be a number and can be found by using &o/svs info") Validate.isTrue(id != 0 and id < len(sign), signsMsg("The %s has no message with an ID of %s, use &o/svs info &4for all messages." % (signName, id))) - sign.remove(id) + del sign[id] return signsMsg("Removed message with id %s from the %s" % (id, signName), 'a') -- cgit v1.2.3 From d3ba9eac73d159684809f9578d983ff223194ce5 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:06:55 +0100 Subject: More fixes, pretty much finished --- serversigns.py | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/serversigns.py b/serversigns.py index ecba2e8..45110f8 100644 --- a/serversigns.py +++ b/serversigns.py @@ -86,20 +86,41 @@ def signsMsg(msg, colour = '4'): @simplecommand(cmd = "serversigns", aliases = ["svs", "signmsg"], - description = "Makes something happen when you right click certain signs", - usage = "[claim|unclaim|add |remove |clear|info|help]", + description = "Makes something happen when you right click signs. \nUse /svs help for more details.", + usage = "[++]|remove |clear|info|help>", helpNoargs = True, senderLimit = 0) def svs_command(sender, command, label, args): arg1 = args[0].lower() - Validate.isTrue(arg1 in ("claim", "reset", "add", "remove", "info", "clear", "help", "switch"), signsMsg("That argument could not be recognized, use &o/svs help &4for expected arguments")) + Validate.isTrue(arg1 in ("claim", "reset", "add", "remove", "info", "clear", "help", "switch", "reverse", "unclaim"), + signsMsg("That argument could not be recognized, use &o/svs help &4for expected arguments")) Validate.isAuthorized(sender, "utils.serversigns." + arg1) #-------------------- Sub commands that don't require any conditions ----------------------- if arg1 == "help": admin = sender.hasPermission("utils.serversigns.admin") - - return "&2COMMAND HELP HERE" + 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" + 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." + return msg #------------------------------------------------------------------------------------------- block = sender.getTargetBlock(None, 5) @@ -109,13 +130,13 @@ def svs_command(sender, command, label, args): sign = getSign(loc) signName = identifySign(loc) arg2 = args[1].lower() if len(args) > 1 else None - is_admin = sender.hasPermission("utils.serversigns.admin") #------------------------ Sub commands that require the block to be a sign ------------------------------- if arg1 == "claim": + Validate.isTrue(not sign, signsMsg("The %s was already claimed" % signName)) target = sender if arg2: - Validate.isTrue(is_admin, signsMsg("You are not authorized to claim signs for other players")) + Validate.isTrue(player.hasPermission("utils.serversigns.admin"), signsMsg("You are not authorized to claim signs for other players")) target = server.getOfflinePlayer(arg2) Validate.notNone(target, signsMsg("That player could not be found")) Validate.isTrue(target.isOnline(), signsMsg("The target has to be online")) @@ -174,8 +195,8 @@ def svs_command(sender, command, label, args): return signsMsg("Removed message with id %s from the %s" % (id, signName), 'a') - if arg1 == "switch": - Validate.isTrue(len(args) == 3, signsMsg("You have to enter the 2 IDs of the lines to switch")) + if arg1 in ("switch", "reverse"): + Validate.isTrue(len(args) == 3, signsMsg("You have to enter the 2 IDs of the messages to reverse")) try: id1 = int(args[1]) id2 = int(args[2]) @@ -184,16 +205,19 @@ def svs_command(sender, command, label, args): for id in (id1, id2): Validate.isTrue(id != 0 and id < len(sign), signsMsg("The %s has no message with an ID of %s, use &o/svs info &4for all messages." % (signName, id))) sign[id1], sign[id2] = sign[id2], sign[id1] - return signsMsg("Switched the lines with IDs %s and %s of the %s" % (id1, id2, signName), 'a') + save_signs() + return signsMsg("Reversed the messages with IDs %s and %s of the %s" % (id1, id2, signName), 'a') if arg1 == "clear": signs[loc] = [sign[0]] + save_signs() return signsMsg("Removed all messages from the %s" % signName, 'a') - if arg1 == "reset": + if arg1 in ("reset", "unclaim"): 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 From da9255558c01efdcf0f9cd9ec98eee2ecc165fd6 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:10:16 +0100 Subject: Testing for sign breaking problems, added trace --- serversigns.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/serversigns.py b/serversigns.py index 45110f8..018bbb7 100644 --- a/serversigns.py +++ b/serversigns.py @@ -253,22 +253,25 @@ faces = { @hook.event("block.BlockBreakEvent", "highest") def on_break(event): - global checking_block - if checking_block or event.isCancelled(): - return - - block = event.getBlock() - if block.getMaterial() in (Material.SIGN_POST, Material.WALL_SIGN): - check_sign(event, block, attached = False) - - for block_face, data_values in faces.iteritems(): - block2 = block.getRelative(block_face) - if block2.getData() in data_values: - check_sign(event, block2) - - block3 = block.getRelative(BlockFace.UP) - if block3.getMaterial == Material.SIGN_POST: - check_sign(event, block3) + try: + global checking_block + if checking_block or event.isCancelled(): + return + + block = event.getBlock() + if block.getMaterial() in (Material.SIGN_POST, Material.WALL_SIGN): + check_sign(event, block, attached = False) + + for block_face, data_values in faces.iteritems(): + block2 = block.getRelative(block_face) + if block2.getData() in data_values: + check_sign(event, block2) + + block3 = block.getRelative(BlockFace.UP) + if block3.getMaterial == Material.SIGN_POST: + check_sign(event, block3) + except: + error(trace()) def check_sign(event, block, attached = True): -- cgit v1.2.3 From 5717f5852711a63adf0ffc9f959dc114b091e77a Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:12:35 +0100 Subject: Disabled chatalias so I can see errors --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index ede4269..7411d17 100644 --- a/main.py +++ b/main.py @@ -43,7 +43,7 @@ shared["load_modules"] = [ # Adds /calc, toggles automatic solving of Math expressions in chat "calc", # Adds aliasing of chat words - "chatalias", + #"chatalias", # Plugin to locate laggy chunks. /lc lists chunks with more than n entities "lagchunks", # Adds /report and /rp, Stores reports with time and location -- cgit v1.2.3 From f941f05f1d363c4e072b5ce19e3e97e6f163ac7d Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:16:06 +0100 Subject: Block break fix 1 --- serversigns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serversigns.py b/serversigns.py index 018bbb7..00101d0 100644 --- a/serversigns.py +++ b/serversigns.py @@ -259,7 +259,7 @@ def on_break(event): return block = event.getBlock() - if block.getMaterial() in (Material.SIGN_POST, Material.WALL_SIGN): + if block.getType() in (Material.SIGN_POST, Material.WALL_SIGN): check_sign(event, block, attached = False) for block_face, data_values in faces.iteritems(): -- cgit v1.2.3 From d83345d8f286a396431f5cefa692f82f4852bcb5 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:18:03 +0100 Subject: Block break fix 2 --- serversigns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serversigns.py b/serversigns.py index 00101d0..03a50ba 100644 --- a/serversigns.py +++ b/serversigns.py @@ -277,7 +277,7 @@ def on_break(event): def check_sign(event, block, attached = True): player = event.getPlayer() sign = getSign(fromLoc(block.getLocation())) - if not canEdit(sign, player) and not can_build(player, block.getLocation()): + if not canEdit(sign, player) and not can_build(player, block): event.setCancelled(True) msg(event.getPlayer(), signsMsg("You cannot break %s" % ("the sign attached to that block" if attached else "that sign"))) -- cgit v1.2.3 From 019b3c6b579177db11197c85e15b35d842febf76 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:20:54 +0100 Subject: Block break fix 3 --- serversigns.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/serversigns.py b/serversigns.py index 03a50ba..14e103d 100644 --- a/serversigns.py +++ b/serversigns.py @@ -245,10 +245,10 @@ def on_click(event): checking_block = False faces = { - BlockFace.NORTH : (0,1,2), - BlockFace.SOUTH : 3, - BlockFace.WEST : 4, - BlockFace.EAST : 5 + BlockFace.NORTH : (0,1,2,), + BlockFace.SOUTH : (3,), + BlockFace.WEST : (4,), + BlockFace.EAST : (5,), } @hook.event("block.BlockBreakEvent", "highest") @@ -268,7 +268,7 @@ def on_break(event): check_sign(event, block2) block3 = block.getRelative(BlockFace.UP) - if block3.getMaterial == Material.SIGN_POST: + if block3.getType() == Material.SIGN_POST: check_sign(event, block3) except: error(trace()) -- cgit v1.2.3 From 39b38ff0937ce5b00483e00f61598154a8fe14cf Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:25:56 +0100 Subject: Block break fix 4 --- serversigns.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/serversigns.py b/serversigns.py index 14e103d..cab8258 100644 --- a/serversigns.py +++ b/serversigns.py @@ -260,7 +260,8 @@ def on_break(event): block = event.getBlock() if block.getType() in (Material.SIGN_POST, Material.WALL_SIGN): - check_sign(event, block, attached = False) + if check_sign(event, block, attached = False): + del signs[from] for block_face, data_values in faces.iteritems(): block2 = block.getRelative(block_face) @@ -278,9 +279,13 @@ def check_sign(event, block, attached = True): player = event.getPlayer() sign = getSign(fromLoc(block.getLocation())) if not canEdit(sign, player) and not can_build(player, block): - event.setCancelled(True) - msg(event.getPlayer(), signsMsg("You cannot break %s" % ("the sign attached to that block" if attached else "that sign"))) - + event.setCancelled(True) + msg(event.getPlayer(), signsMsg("You cannot break %s" % ("the sign attached to that block" if attached else "that sign"))) + else: + loc = fromLoc(block.getLocation()) + del signs[loc] + save_signs() + msg(player, signsMsg("Reset the %s which you just broke" % identifySign(loc))) def can_build(player, block): global checking_block -- cgit v1.2.3 From ff365a832d23197965282f26426af81b846ce543 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:28:56 +0100 Subject: Derp! block break fix 5 --- serversigns.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/serversigns.py b/serversigns.py index cab8258..6550d74 100644 --- a/serversigns.py +++ b/serversigns.py @@ -260,8 +260,7 @@ def on_break(event): block = event.getBlock() if block.getType() in (Material.SIGN_POST, Material.WALL_SIGN): - if check_sign(event, block, attached = False): - del signs[from] + check_sign(event, block, attached = False): for block_face, data_values in faces.iteritems(): block2 = block.getRelative(block_face) -- cgit v1.2.3 From d1d62d71d2225271e94b03448e46c0ca717cb81e Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:30:09 +0100 Subject: Derp 2! block break fix 6 lel --- serversigns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serversigns.py b/serversigns.py index 6550d74..995e90c 100644 --- a/serversigns.py +++ b/serversigns.py @@ -260,7 +260,7 @@ def on_break(event): block = event.getBlock() if block.getType() in (Material.SIGN_POST, Material.WALL_SIGN): - check_sign(event, block, attached = False): + check_sign(event, block, attached = False) for block_face, data_values in faces.iteritems(): block2 = block.getRelative(block_face) -- cgit v1.2.3 From 2a68613e779f2f50f9ff66481ae0c3c335e246d7 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:38:21 +0100 Subject: Block break tweaks --- serversigns.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/serversigns.py b/serversigns.py index 995e90c..5b471c5 100644 --- a/serversigns.py +++ b/serversigns.py @@ -251,7 +251,7 @@ faces = { BlockFace.EAST : (5,), } -@hook.event("block.BlockBreakEvent", "highest") +@hook.event("block.BlockBreakEvent", "lowest") def on_break(event): try: global checking_block @@ -264,7 +264,7 @@ def on_break(event): for block_face, data_values in faces.iteritems(): block2 = block.getRelative(block_face) - if block2.getData() in data_values: + if block2.getType == Material.WALL_SIGN and block2.getData() in data_values: check_sign(event, block2) block3 = block.getRelative(BlockFace.UP) @@ -277,7 +277,7 @@ def on_break(event): def check_sign(event, block, attached = True): player = event.getPlayer() sign = getSign(fromLoc(block.getLocation())) - if not canEdit(sign, player) and not can_build(player, block): + if not can_build(player, block): event.setCancelled(True) msg(event.getPlayer(), signsMsg("You cannot break %s" % ("the sign attached to that block" if attached else "that sign"))) else: -- cgit v1.2.3 From 030b32f86a1c24ceb06cb744fc20dbd26c7b68b6 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:50:26 +0100 Subject: More tweaks --- serversigns.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/serversigns.py b/serversigns.py index 5b471c5..c26d4f8 100644 --- a/serversigns.py +++ b/serversigns.py @@ -134,6 +134,7 @@ def svs_command(sender, command, label, args): #------------------------ Sub commands that require the block to be a sign ------------------------------- if arg1 == "claim": Validate.isTrue(not sign, signsMsg("The %s was already claimed" % signName)) + Validate.isTrue(can_build2(block, player), signsMsg("You are not permitted to claim signs here")) target = sender if arg2: Validate.isTrue(player.hasPermission("utils.serversigns.admin"), signsMsg("You are not authorized to claim signs for other players")) @@ -251,7 +252,7 @@ faces = { BlockFace.EAST : (5,), } -@hook.event("block.BlockBreakEvent", "lowest") +@hook.event("block.BlockBreakEvent", "monitor") def on_break(event): try: global checking_block @@ -277,7 +278,7 @@ def on_break(event): def check_sign(event, block, attached = True): player = event.getPlayer() sign = getSign(fromLoc(block.getLocation())) - if not can_build(player, block): + if not can_build2(player, block): event.setCancelled(True) msg(event.getPlayer(), signsMsg("You cannot break %s" % ("the sign attached to that block" if attached else "that sign"))) else: @@ -286,7 +287,7 @@ def check_sign(event, block, attached = True): save_signs() msg(player, signsMsg("Reset the %s which you just broke" % identifySign(loc))) -def can_build(player, block): +def can_build2(player, block): global checking_block event = BlockBreakEvent(block, player) checking_block = True -- cgit v1.2.3 From 274ce42fc8face712f381c791c691b6897239f83 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 17:52:54 +0100 Subject: Block break fix infinity --- serversigns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serversigns.py b/serversigns.py index c26d4f8..3b32def 100644 --- a/serversigns.py +++ b/serversigns.py @@ -134,7 +134,7 @@ def svs_command(sender, command, label, args): #------------------------ Sub commands that require the block to be a sign ------------------------------- if arg1 == "claim": Validate.isTrue(not sign, signsMsg("The %s was already claimed" % signName)) - Validate.isTrue(can_build2(block, player), signsMsg("You are not permitted to claim signs here")) + Validate.isTrue(can_build2(sender, block), signsMsg("You are not permitted to claim signs here")) target = sender if arg2: Validate.isTrue(player.hasPermission("utils.serversigns.admin"), signsMsg("You are not authorized to claim signs for other players")) -- cgit v1.2.3 From ab42a0cb655d5e4123f8eeb8acd90de3531d0367 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 22 Nov 2015 18:01:27 +0100 Subject: Sorry for the spam --- serversigns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serversigns.py b/serversigns.py index 3b32def..297b727 100644 --- a/serversigns.py +++ b/serversigns.py @@ -265,7 +265,7 @@ def on_break(event): for block_face, data_values in faces.iteritems(): block2 = block.getRelative(block_face) - if block2.getType == Material.WALL_SIGN and block2.getData() in data_values: + if block2.getType() == Material.WALL_SIGN and block2.getData() in data_values: check_sign(event, block2) block3 = block.getRelative(BlockFace.UP) -- cgit v1.2.3 From 2808c5838b33dac74ad3ce34c733b2b7f1199d0a Mon Sep 17 00:00:00 2001 From: PixelSergey Date: Sun, 22 Nov 2015 19:56:11 +0200 Subject: Fixed a bug in chatalias. Still safe :D --- chatalias.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chatalias.py b/chatalias.py index d55269c..25e3336 100644 --- a/chatalias.py +++ b/chatalias.py @@ -125,8 +125,9 @@ def on_player_chat(event): data = safe_open_json() if event.isCancelled(): return - if not data[playerid]: + if not playerid in data: return + event.setMessage(multiple_replace(data[playerid], event.getMessage())) if (event.getPlayer().hasPermission("essentials.chat.color")): @@ -135,4 +136,3 @@ def on_player_chat(event): event.setCancelled(True) plugin_header(recipient=event.getPlayer(), name="Chat Alias") msg(event.getPlayer(), "&7The message generated was too long and was not sent. :/") - -- cgit v1.2.3 From 9d0e4c99ba84d4efb7828704ed5b0a8e7bdfc52d Mon Sep 17 00:00:00 2001 From: PanFritz Date: Mon, 23 Nov 2015 01:55:45 +0100 Subject: Removed "ls" in for loop --- setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index 336376f..74cc599 100755 --- a/setup.sh +++ b/setup.sh @@ -91,7 +91,7 @@ echo -e "\n> All plugins downloaded" cd "redstoner-utils.py.dir" echo -e "\n> Duplicating sample files" -for file in ls ./*.example; do +for file in ./*.example; do cp -v "$file" "$(echo "$file" | rev | cut -d "." -f 2- | rev)" done -- cgit v1.2.3 From 70b4db5318075c6f15eae65f7a75488964ec0390 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 23 Nov 2015 22:17:40 +0100 Subject: added wrappers, temp disabled all modules --- helpers.py | 51 +++++++++---------------------- main.py | 81 +++++-------------------------------------------- mysql_utils.py | 33 ++++++++++++++++++++ mysqlhack.py | 8 ++--- thread_utils.py | 24 +++++++++++++++ wrapper.py | 11 +++++++ wrapper_command.py | 11 +++++++ wrapper_event.py | 22 ++++++++++++++ wrapper_player.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 216 insertions(+), 114 deletions(-) create mode 100644 mysql_utils.py create mode 100644 thread_utils.py create mode 100644 wrapper.py create mode 100644 wrapper_command.py create mode 100644 wrapper_event.py create mode 100644 wrapper_player.py diff --git a/helpers.py b/helpers.py index 79af3a0..f7e125e 100644 --- a/helpers.py +++ b/helpers.py @@ -1,26 +1,30 @@ #pylint: disable = F0401 -from re import sub -from java.util.UUID import fromString as juuid -from json import dumps as json_dumps, loads as json_loads + import org.bukkit as bukkit -import org.bukkit.Location as Location -import org.bukkit.entity.Player as Player -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause as TeleportCause -import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent import org.bukkit.block as bblock +import org.bukkit.Location as Location import org.bukkit.event.entity as entity +import org.bukkit.entity.Player as Player import org.bukkit.command.ConsoleCommandSender +import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause as TeleportCause + +from re import sub +from thread_utils import * +from player import py_players from org.bukkit.entity import * from player import get_py_player -from player import py_players +from traceback import format_exc as trace +from java.util.UUID import fromString as juuid +from json import dumps as json_dumps, loads as json_loads #Imports for async query -from secrets import * +import threading import mysqlhack + +from secrets import * from com.ziclix.python.sql import zxJDBC -import threading -from traceback import format_exc as trace shared = {} # this dict can be used to share stuff across modules @@ -214,31 +218,6 @@ def known_player(player): """ return player.hasPlayedBefore() -""" -Runs a async query, calls target function with fetchall as an argument, it will be an empty list if there is nothing to fetch. -(So make sure your function takes that argument.) - -If you want your function to run sync in the case you are doing something spigot wouldn't like to be async use the bukkit scheduler. -Example can be found in loginsecurity.py - -""" -def async_query(mysql_database,query,query_args,target,*target_args,**target_kwargs): - - def async_query_t(mysql_database,query,query_args,target,target_args,target_kwargs): - db_conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") - db_curs = db_conn.cursor() - db_curs.execute(query,query_args) - db_conn.commit() - fetchall = db_curs.fetchall() - db_curs.close() - db_conn.close() - target(fetchall,target_args,target_kwargs) - - t = threading.Thread(target=async_query_t,args=(mysql_database,query,query_args,target,target_args,target_kwargs)) - t.daemon = True - t.start() - - def open_json_file(filename, default = None): """ opens the given json file and returns an object or returns None on error diff --git a/main.py b/main.py index 7411d17..3e1319d 100644 --- a/main.py +++ b/main.py @@ -11,8 +11,9 @@ sys.path += ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/l try: # Library that adds a bunch of re-usable methods which are used in nearly all other modules from helpers import * + from wrapper import * except: - print("[RedstonerUtils] ERROR: Failed to import helpers:") + print("[RedstonerUtils] ERROR: Failed to import Wrapper:") print(print_traceback()) @@ -24,85 +25,17 @@ def on_enable(): @hook.disable def on_disable(): - shared["modules"]["reports"].stop_reporting() + #shared["modules"]["reports"].stop_reporting() info("RedstonerUtils disabled!") info("Loading RedstonerUtils...") + + # Import all modules, in this order -shared["load_modules"] = [ - # Collection of tiny utilities - "misc", - # Adds chat for staff using /ac - "adminchat", - # Adds /badge, allows to give players achievements - "badges", - # Adds a few block placement corrections/mods - "blockplacemods", - # Adds /calc, toggles automatic solving of Math expressions in chat - "calc", - # Adds aliasing of chat words - #"chatalias", - # Plugin to locate laggy chunks. /lc lists chunks with more than n entities - "lagchunks", - # Adds /report and /rp, Stores reports with time and location - "reports", - # Adds group-chat with /chatgroup and /cgt to toggle normal chat into group mode - "chatgroups", - # Adds /token, reads and writes from the database to generate pronouncable (and thus memorable) registration-tokens for the website - "webtoken", - # Adds /lol, broadcasts random funyy messages. A bit like the splash text in the menu - "saylol", - # Adds /signalstrength, lets you request a signal strength and an amount of items will be inserted into target container to meet that strength. - "signalstrength", - # Shows the owner of a skull when right-clicked - "skullclick", - # Adds /listen, highlights chat and plays a sound when your name was mentioned - "mentio", - # Adds /cycler, swaps the hotbar with inventory when player changes slot from right->left or left->right - "cycle", - # Adds /getmotd & /setmotd to update the motd on the fly (no reboot) - "motd", - # AnswerBot. Hides stupid questions from chat and tells the sender about /faq or the like - "abot", - # Adds '/forcefield', creates forcefield for players who want it. - "forcefield", - # Adds /damnspam, creates timeout for buttons/levers to mitigate button spam. - "damnspam", - # Adds /check, useful to lookup details about a player - "check", - # Adds /an, a command you can use to share thoughts/plans/news - "adminnotes", - # Adds busy status to players - "imbusy", - # Adds /imout, displays fake leave/join messages - "imout", - #adds snowbrawl minigame - "snowbrawl", - # Adds /tm [player] for a messages to be sent to this player via /msg - "pmtoggle", - # Replacement for LoginSecurity - "loginsecurity", - # Centralized Player class - "player", - # Servercontrol extension for telnet access to logs/AC - #"servercontrol", - # Script helper plugin - "scriptutils", - # Per-player notes - "tag", - # vanish toggle module - temporary fix - #"vanishfix", - # obisidian mining punishment plugin - "punishments", - # a simple replacement for the buggy essentials /vanish - "vanish", - # ip-tracking utility - "iptracker", - #server signs for everyone - "serversigns" -] +shared["load_modules"] = ["test"] + shared["modules"] = {} for module in shared["load_modules"]: try: diff --git a/mysql_utils.py b/mysql_utils.py new file mode 100644 index 0000000..e59c3d9 --- /dev/null +++ b/mysql_utils.py @@ -0,0 +1,33 @@ +import mysqlhack +from secrets import * +from thread_utils import * +from com.ziclix.python.sql import zxJDBC +from traceback import format_exc as trace + +class mysql_connect: + def __init__(self): + self.conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + self.curs = self.conn.cursor() + + def execute(self, query, args=None): + if args is None: + return self.curs.execute(query) + else: + return self.curs.execute(query, args) + + def fetchall(self): + return self.curs.fetchall() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_inst, exc_tb): + if exc_type is None: + try: + self.conn.commit() + self.curs.close() + self.conn.close() + except: + print(trace()) + else: + print(exc_tb) diff --git a/mysqlhack.py b/mysqlhack.py index 7153bdf..5d45c52 100644 --- a/mysqlhack.py +++ b/mysqlhack.py @@ -4,12 +4,12 @@ A library that makes use of the so called ClassPathHack for jython to allow proper loading of mysql-connector.jar at runtime. Import only, no methods. """ -import java.lang.reflect.Method -import java.io.File -import java.net.URL -import java.net.URLClassLoader import jarray +import java.net.URL +import java.io.File from java.lang import Class +import java.net.URLClassLoader +import java.lang.reflect.Method # hacky code to add mysql-connector to java's classpath ('classPathHack') diff --git a/thread_utils.py b/thread_utils.py new file mode 100644 index 0000000..ec13c6f --- /dev/null +++ b/thread_utils.py @@ -0,0 +1,24 @@ +import threading +""" +Quick implementation of a @synchronized and @asynchronized decorators +""" + +#To be replaced by bukkit scheduler. +""" +def sync(lock=None): + def decorator(wrapped): + def wrapper(*args, **kwargs): + with lock: + return wrapped(*args, **kwargs) + return wrapper + return decorator +""" + +def async(daemon = True): + def decorator(function): + def wrapper(*args,**kwargs): + thread = threading.Thread(target=function,args=args,kwargs=kwargs) + thread.daemon = daemon + thread.start() + return wrapper + return decorator \ No newline at end of file diff --git a/wrapper.py b/wrapper.py new file mode 100644 index 0000000..ddca5b5 --- /dev/null +++ b/wrapper.py @@ -0,0 +1,11 @@ +""" +Adapter classes for spigot api for more idiomatic python code. + +Before you run away from this if the class you need to use isn't here, please create it. + + +""" +from helpers import * +from wrapper_event import * +from wrapper_player import * +from wrapper_command import * \ No newline at end of file diff --git a/wrapper_command.py b/wrapper_command.py new file mode 100644 index 0000000..dd51534 --- /dev/null +++ b/wrapper_command.py @@ -0,0 +1,11 @@ +from wrapper_player import * + +def command(command = "help"): + def decorator(wrapped): + @hook.command(command) + def wrapper(sender, command, label, args): + try: + return wrapped(sender = py_players[sender], command = command, label = label, args = args) + except: + print(print_traceback()) + return decorator \ No newline at end of file diff --git a/wrapper_event.py b/wrapper_event.py new file mode 100644 index 0000000..083bf33 --- /dev/null +++ b/wrapper_event.py @@ -0,0 +1,22 @@ +from wrapper import * +from wrapper_player import * +from traceback import format_exc as print_traceback + +class py_event: + def __init__(self,event): + self.event = event + try: + self.player = py_players[event.getPlayer()] + except: + warn("Player doesn't exist") + +def event_handler(event_name = None, priority = "normal"): + def decorator(wrapped): + @hook.event(event_name, priority) + def wrapper(event): + try: + wrapped(py_event(event)) + except: + print(print_traceback()) + return decorator + diff --git a/wrapper_player.py b/wrapper_player.py new file mode 100644 index 0000000..aca0e60 --- /dev/null +++ b/wrapper_player.py @@ -0,0 +1,89 @@ +import time +import mysqlhack +from mysql_utils import * +from thread_utils import * +from players_secret import * +from datetime import datetime +from com.ziclix.python.sql import zxJDBC + +class py_player: + def __init__(self,player): + self.player = player + self.login_time = time.time() + self.logging_in = False + + self.nickname = self.name + self.registered = False + self.password = "None" + self.banned = False + self.banned_reason = "You have been banned!" + self.played_time = time.time() - self.login_time + self.last_login = datetime.now() + self.first_seen = datetime.now() + + def kick(self, kick_message = "You have been kicked from the server!"): + self.player.KickPlayer(kick_message) + + @property + def name(self): + return self.player.getName() + + @property + def uuid(self): + return str(self.player.getUniqueId()) + + +class Py_players: + def __init__(self): + self.players = [] + + def __len__(self): + return len(self.players) + + def __getitem__(self, player): + for py_player in self.players: + if py_player.name == player.getName(): + return py_player + else: + return None + + def remove(self, player): + self.players.remove(player) + + def append(self, player): + self.players.append(player) + +py_players = Py_players() + +@async(daemon=True) +def fetch_player(player): + with mysql_connect() as sql: + sql.execute("SELECT * FROM utils_players WHERE uuid = ?", (player.uuid,)) + result = sql.fetchall() + + if len(result) is 0: + with mysql_connect() as sql: + sql.execute("INSERT INTO utils_players \ + (uuid, name, nickname, registered, password, banned, \ + banned_reason, played_time, last_login, first_seen) \ + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + + args=(player.uuid, player.name, player.nickname, player.registered, + player.password, player.banned, + player.banned_reason, player.played_time, + player.last_login, player.first_seen)) + else: + pass + + + +@hook.event("player.PlayerJoinEvent","lowest") +def on_join(event): + player = py_player(event.getPlayer()) + py_players.append(player) + fetch_player(player) + + +@hook.event("player.PlayerQuitEvent","highest") +def on_leave(event): + py_players.remove(py_players[event.getPlayer()]) -- cgit v1.2.3 From 781714bc7423565cd7aeb7b3b29899269cf80454 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 23 Nov 2015 22:28:11 +0100 Subject: Test --- wrapper_player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrapper_player.py b/wrapper_player.py index aca0e60..a889ede 100644 --- a/wrapper_player.py +++ b/wrapper_player.py @@ -74,7 +74,7 @@ def fetch_player(player): player.last_login, player.first_seen)) else: pass - + #test @hook.event("player.PlayerJoinEvent","lowest") -- cgit v1.2.3 From 522a7a99a115b2c32e8edd00fe47d1b288d6b006 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 Nov 2015 01:15:44 +0100 Subject: wrapper_command WIP --- serversigns.py | 53 +++++++----- vanish.py | 53 ++++++------ wrapper_command.py | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++-- wrapper_player.py | 3 + 4 files changed, 290 insertions(+), 56 deletions(-) diff --git a/serversigns.py b/serversigns.py index 297b727..f8f9db5 100644 --- a/serversigns.py +++ b/serversigns.py @@ -5,6 +5,14 @@ import java.util.UUID as UUID import org.bukkit.Material as Material import org.bukkit.block.BlockFace as BlockFace +""" + # About permissions: + # To use the command, the user needs to have utils.serversigns. + # To use ANY subcommand, the user needs to have utils.serversigns. IN ADDITION to the previously mentioned node. + # To be able to add commands as messages to a sign, a user will need the node utils.serversigns.command. + # To be able to claim a sign for another player or to edit signs that the user doesn't own, they will need utils.serversigns.admin. +""" + blocked_cmds = ("pex", "kick", "ban", "tempban", "pyeval", "sudo", "stop", "reload", "op", "deop", "whitelist") def load_signs(): @@ -24,6 +32,18 @@ signs = load_signs() # {("world", x, y, z): ["owner_id", "msg1", "msg2"]} lines = {} # Accumulated messages so players can have longer messages: {"Dico200": "Message...........", ""} +@hook.enable +def check_all_signs(): + # Check if all saved signs actually represent a sign block. There are ways to break the signs without the plugin knowing. + for loc in dict(signs): # Can't change dict size during iteration, using a copy + world = server.getWorld(loc[0]) + if world and world.getBlockAt(loc[1], loc[2], loc[3]).getType() in (Material.SIGN_POST, Material.WALL_SIGN): + continue + del signs[loc] + info("[Server Signs] Couldn't find a %s, removed the data for the sign that was once there." % identifySign(loc)) + save_signs() + + def fromLoc(bLoc): """ # Returns a tuple containing the (bukkit)location's world's name and its x, y and z coordinates @@ -222,9 +242,6 @@ def svs_command(sender, command, label, args): return signsMsg("Removed all messages and the owner from the %s, it can now be claimed" % signName, 'a') #------------------------------------------------------------------------------------------------------- - - - @hook.event("player.PlayerInteractEvent") def on_click(event): if str(event.getAction()) != "RIGHT_CLICK_BLOCK": @@ -254,25 +271,22 @@ faces = { @hook.event("block.BlockBreakEvent", "monitor") def on_break(event): - try: - global checking_block - if checking_block or event.isCancelled(): - return + global checking_block + if checking_block or event.isCancelled(): + return - block = event.getBlock() - if block.getType() in (Material.SIGN_POST, Material.WALL_SIGN): - check_sign(event, block, attached = False) + block = event.getBlock() + if block.getType() in (Material.SIGN_POST, Material.WALL_SIGN): + check_sign(event, block, attached = False) - for block_face, data_values in faces.iteritems(): - block2 = block.getRelative(block_face) - if block2.getType() == Material.WALL_SIGN and block2.getData() in data_values: - check_sign(event, block2) + for block_face, data_values in faces.iteritems(): + block2 = block.getRelative(block_face) + if block2.getType() == Material.WALL_SIGN and block2.getData() in data_values: + check_sign(event, block2) - block3 = block.getRelative(BlockFace.UP) - if block3.getType() == Material.SIGN_POST: - check_sign(event, block3) - except: - error(trace()) + block3 = block.getRelative(BlockFace.UP) + if block3.getType() == Material.SIGN_POST: + check_sign(event, block3) def check_sign(event, block, attached = True): @@ -287,6 +301,7 @@ def check_sign(event, block, attached = True): save_signs() msg(player, signsMsg("Reset the %s which you just broke" % identifySign(loc))) + def can_build2(player, block): global checking_block event = BlockBreakEvent(block, player) diff --git a/vanish.py b/vanish.py index a572ebc..87a667b 100644 --- a/vanish.py +++ b/vanish.py @@ -13,7 +13,7 @@ def is_vanished(player): return uid(player) in vanished -#this can be used to silently set the vanished state of a player +#this can be used to silently set the vanished state of a player I guess. def set_state(player, state): if state == is_vanished(player): return @@ -37,6 +37,10 @@ def disable_vanish(target): player.showPlayer(target) +def get_online_vanished_players(): + return (player.getPlayer() for player in (retrieve_player(uuid) for uuid in vanished) if player.isOnline()) + + @simplecommand("vanish", aliases = ["v"], usage = "[on/off]", @@ -48,45 +52,38 @@ def disable_vanish(target): helpSubcmd = True ) def vanish_command(sender, command, label, args): - try: - current_state = is_vanished(sender) - new_state = not current_state + current_state = is_vanished(sender) + new_state = not current_state - if len(args) == 1: - arg = args[0].lower() - if arg == "on": - new_state = True - elif arg == "off": - new_state = False - - if current_state == new_state: - return "&cYou were %s vanished!" % ("already" if current_state else "not yet") + if len(args) == 1: + arg = args[0].lower() + if arg == "on": + new_state = True + elif arg == "off": + new_state = False - set_state(sender, new_state) - return "&a%s vanish mode!" % ("Enabled" if new_state else "Disabled") - except: - error(trace()) + Validate.isTrue(current_state != new_state, "&cYou were %s vanished!" % ("already" if current_state else "not yet")) + set_state(sender, new_state) + return "&a%s vanish mode!" % ("Enabled" if new_state else "Disabled") @hook.event("player.PlayerJoinEvent") def on_player_join(event): player = event.getPlayer() - if not is_authorized(player): - for uuid in vanished: - player.hidePlayer(retrieve_player(uuid)) - - elif is_vanished(player): - msg(player, "&cKeep in mind that you are still vanished! Use /vanish to disable.") + for vanished in get_online_vanished_players(): + player.hidePlayer(vanished) @hook.event("player.PlayerQuitEvent") def on_player_quit(event): player = event.getPlayer() - if not is_authorized(player): - for uuid in vanished: - player.showPlayer(retrieve_player(uuid)) + for vanished in get_online_vanished_players(): + player.showPlayer(vanished) + + elif is_vanished(player): + disable_vanish(player) @simplecommand("vanishother", @@ -110,9 +107,7 @@ def vanishother_command(sender, command, label, args): elif arg == "off": new_state = False - if current_state == new_state: - return "&cThat player was already vanished!" if current_state else "&cThat player was not yet vanished!" - + Validate.isTrue(current_state != new_state, "&cThat player was %s vanished!" % ("already" if current_state else "not yet")) set_state(target, new_state) enabled_str = "enabled" if new_state else "disabled" diff --git a/wrapper_command.py b/wrapper_command.py index dd51534..90eaf01 100644 --- a/wrapper_command.py +++ b/wrapper_command.py @@ -1,11 +1,232 @@ from wrapper_player import * +from helpers import * -def command(command = "help"): - def decorator(wrapped): - @hook.command(command) - def wrapper(sender, command, label, args): +root_commands = Command_dict() # {"command": command_object} + +def check_arguments(command, arguments): + prev_required = True + type_message_seen = False + prev_arg = arguments[0] if len(arguments) > 0 else None + for arg_info in arguments[1:]: + + if not prev_arg.required and arg_info.required: + raise Argument_exception("Command: %s; There may not be required arguments after non-required arguments" % command) + + if prev_arg.type == Argument.MESSAGE: + raise Argument_exception("Command: %s; An argument of type MESSAGE may not be followed by other arguments" % command) + + prev_arg = arg_info + +#-------------------------------------------------------------------------------------- + +class Command_dict(dict): + #{"cmd1" : cmd_object} + def get_command_object(self, alias): + for cmd_name, cmd_obj in self.iteritems(): + if alias == cmd_name or alias in cmd_obj.aliases: + return cmd_obj + raise KeyError("Subcommand '%s' was not found" % alias) + +#-------------------------------------------------------------------------------------- + +class Command(object): + + def __init__(self, + command, + aliases = (), + arguments = ( + Argument("target", Argument.string, "the player to teleport to"), + Argument("second target", Argument.string, "the player to teleport", False), + ), + parent = None): + + self.command = command.lower() + self.arguments = arguments + + check_arguments(self.command, self.arguments) + + prev_required = True + for arg_info in self.arguments: + if not prev_required and arg_info.required: + raise Argument_exception("Command: %s; There may not be required arguments after non-required arguments" % self.command) + + self.aliases = tuple(alias.lower() for alias in aliases) + self.parent = parent + self.sub_commands = Command_dict() + + if self.parent == None: + root_commands[self.command] = self + else: try: - return wrapped(sender = py_players[sender], command = command, label = label, args = args) - except: - print(print_traceback()) - return decorator \ No newline at end of file + parent_route = self.parent.split(" ") + parent_sub_commands = root_commands + parent_obj = None + for cmd_name in parent_route: + parent_obj = parent_sub_commands.get_command_object(cmd_name) + parent_sub_commands = parent_obj.sub_commands + parent_obj.sub_commands[self.command] = self + + except command_exception, e: + error("Error occurred while setting up command hierarchy. " + e.message + "\n" + trace()) + + def __call__(self, handler): + self.handler = handler + + if parent == None: + @hook.command(self.command, self.aliases) + def run(sender, command, label, args): + try: + message = self.execute(sender, command, label, args) + except Command_exception as e: + message = e.message + except Exception: + error(trace()) + return True + if message: + sender.sendMessage(message) + return True + + return handler + + def execute(self, sender, command, label, args): + try: + return self.sub_commands.get_command_object(args[0].lower()).execute(sender, command, label, args[1:]) + except (KeyError, IndexError): + self.execute_checks(sender, command, label, args) + + def execute_checks(self, sender, command, label, args): + #TODO + + scape = Command_scape(args, self.arguments) + if is_player(sender): + sender = py_players[sender] + + return self.handler(sender, self, scape) + + def syntax(self): + return " ".join(tuple(arg_info.syntax() for arg_info in self.arguments)) + +#-------------------------------------------------------------------------------------- + +class Command_scape(list): + + def __init__(self, args, arg_layout): + super(list, self).__init__() + self.raw = args + self.arg_layout = arg_layout + + has_message = False + for i in range(len(arg_layout)): + arg_info = arg_layout[i] + + given = (len(args) >= i + 1) + if arg_info.required and not given: + raise Argument_exception("You must specify the " + arg_info.name) + + if not given: + self.append(None) + continue + + given_arg = args[i] + arg_type = arg_info.type + + if arg_type == Argument.STRING: + self.append(given_arg) + + elif arg_type == Argument.INTEGER: + try: + value = int(given_arg) + except ValueError: + raise Argument_exception("The %s has to be a round number" % arg_info.name) + self.append(value) + + elif arg_type == Argument.FLOAT: + try: + value = float(given_arg) + except ValueError: + raise Argument_exception("The %s has to be a number" % arg_info.name) + self.append(value) + + elif arg_type == Argument.PLAYER: + target = server.getPlayer(given_arg) + if target == None: + raise Argument_exception("The %s has to be an online player" % arg_info.name) + self.append(py_players[target]) + + elif arg_type == Argument.OFFLINE_PLAYER: + try: + # Code to get the PY PLAYER by name. Possibly, uid(server.getOfflinePlayer(given_arg)) can be used? + pass + except KeyError: + raise Argument_exception("The %s has to be an existing player" % arg_info.name) + self.append(None) + + elif arg_type == Argument.MESSAGE: + self.append(" ".join(args[i:])) + has_message = True + else: + error("Argument type not found: %d" % arg_type) + raise Argument_exception("A weird thing has happened, please contact an administrator") + + if not has_message: + self.remainder = args[len(arg_layout):] + else: + self.remainder = None + + def has_flag(self, flag, check_all = False): + return (("-" + flag) in self.raw) if check_all else (("-" + flag) in self.remainder) + + def get_raw(self): + return self.raw + + def get_arg_layout(self): + return self.arg_layout + +#-------------------------------------------------------------------------------------- + +class Command_exception(Exception): + + def __init__(self, message): + self.message = message + +class Argument_exception(Exception): + + def __init__(self, message): + self.message = message + +#-------------------------------------------------------------------------------------- + +class Argument(): + + STRING = 0 + INTEGER = 1 + FLOAT = 2 + PLAYER = 3 + OFFLINE_PLAYER = 4 + MESSAGE = 5 + + def __init__(self, name, type, definition, required = True): + self.name = name + self.type = type + self.definition = definition + self.required = required + + def syntax(self): + syntax = self.name + if self.type == Argument.MESSAGE: + syntax += "..." + return (("<%s>" if self.required else "[%s]") % syntax) + +#-------------------------------------------------------------------------------------- + +class Validate(): + + @staticmethod + def is_true(expression, fail_message): + if not expression: + raise Command_exception(fail_message) + + @staticmethod + def not_none(obj, fail_message): + if obj == None: + raise Command_exception(fail_message) diff --git a/wrapper_player.py b/wrapper_player.py index a889ede..db7f6cc 100644 --- a/wrapper_player.py +++ b/wrapper_player.py @@ -6,6 +6,9 @@ from players_secret import * from datetime import datetime from com.ziclix.python.sql import zxJDBC +def get_py_player(player): + + class py_player: def __init__(self,player): self.player = player -- cgit v1.2.3 From 0172cf2feb199773d8fcf6c3fb707804f7952ecd Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 Nov 2015 15:24:34 +0100 Subject: Revert "wrapper_command WIP" This reverts commit 522a7a99a115b2c32e8edd00fe47d1b288d6b006. --- serversigns.py | 53 +++++------- vanish.py | 53 ++++++------ wrapper_command.py | 237 ++--------------------------------------------------- wrapper_player.py | 3 - 4 files changed, 56 insertions(+), 290 deletions(-) diff --git a/serversigns.py b/serversigns.py index f8f9db5..297b727 100644 --- a/serversigns.py +++ b/serversigns.py @@ -5,14 +5,6 @@ import java.util.UUID as UUID import org.bukkit.Material as Material import org.bukkit.block.BlockFace as BlockFace -""" - # About permissions: - # To use the command, the user needs to have utils.serversigns. - # To use ANY subcommand, the user needs to have utils.serversigns. IN ADDITION to the previously mentioned node. - # To be able to add commands as messages to a sign, a user will need the node utils.serversigns.command. - # To be able to claim a sign for another player or to edit signs that the user doesn't own, they will need utils.serversigns.admin. -""" - blocked_cmds = ("pex", "kick", "ban", "tempban", "pyeval", "sudo", "stop", "reload", "op", "deop", "whitelist") def load_signs(): @@ -32,18 +24,6 @@ signs = load_signs() # {("world", x, y, z): ["owner_id", "msg1", "msg2"]} lines = {} # Accumulated messages so players can have longer messages: {"Dico200": "Message...........", ""} -@hook.enable -def check_all_signs(): - # Check if all saved signs actually represent a sign block. There are ways to break the signs without the plugin knowing. - for loc in dict(signs): # Can't change dict size during iteration, using a copy - world = server.getWorld(loc[0]) - if world and world.getBlockAt(loc[1], loc[2], loc[3]).getType() in (Material.SIGN_POST, Material.WALL_SIGN): - continue - del signs[loc] - info("[Server Signs] Couldn't find a %s, removed the data for the sign that was once there." % identifySign(loc)) - save_signs() - - def fromLoc(bLoc): """ # Returns a tuple containing the (bukkit)location's world's name and its x, y and z coordinates @@ -242,6 +222,9 @@ def svs_command(sender, command, label, args): return signsMsg("Removed all messages and the owner from the %s, it can now be claimed" % signName, 'a') #------------------------------------------------------------------------------------------------------- + + + @hook.event("player.PlayerInteractEvent") def on_click(event): if str(event.getAction()) != "RIGHT_CLICK_BLOCK": @@ -271,22 +254,25 @@ faces = { @hook.event("block.BlockBreakEvent", "monitor") def on_break(event): - global checking_block - if checking_block or event.isCancelled(): - return + try: + global checking_block + if checking_block or event.isCancelled(): + return - block = event.getBlock() - if block.getType() in (Material.SIGN_POST, Material.WALL_SIGN): - check_sign(event, block, attached = False) + block = event.getBlock() + if block.getType() in (Material.SIGN_POST, Material.WALL_SIGN): + check_sign(event, block, attached = False) - for block_face, data_values in faces.iteritems(): - block2 = block.getRelative(block_face) - if block2.getType() == Material.WALL_SIGN and block2.getData() in data_values: - check_sign(event, block2) + for block_face, data_values in faces.iteritems(): + block2 = block.getRelative(block_face) + if block2.getType() == Material.WALL_SIGN and block2.getData() in data_values: + check_sign(event, block2) - block3 = block.getRelative(BlockFace.UP) - if block3.getType() == Material.SIGN_POST: - check_sign(event, block3) + block3 = block.getRelative(BlockFace.UP) + if block3.getType() == Material.SIGN_POST: + check_sign(event, block3) + except: + error(trace()) def check_sign(event, block, attached = True): @@ -301,7 +287,6 @@ def check_sign(event, block, attached = True): save_signs() msg(player, signsMsg("Reset the %s which you just broke" % identifySign(loc))) - def can_build2(player, block): global checking_block event = BlockBreakEvent(block, player) diff --git a/vanish.py b/vanish.py index 87a667b..a572ebc 100644 --- a/vanish.py +++ b/vanish.py @@ -13,7 +13,7 @@ def is_vanished(player): return uid(player) in vanished -#this can be used to silently set the vanished state of a player I guess. +#this can be used to silently set the vanished state of a player def set_state(player, state): if state == is_vanished(player): return @@ -37,10 +37,6 @@ def disable_vanish(target): player.showPlayer(target) -def get_online_vanished_players(): - return (player.getPlayer() for player in (retrieve_player(uuid) for uuid in vanished) if player.isOnline()) - - @simplecommand("vanish", aliases = ["v"], usage = "[on/off]", @@ -52,38 +48,45 @@ def get_online_vanished_players(): helpSubcmd = True ) def vanish_command(sender, command, label, args): - current_state = is_vanished(sender) - new_state = not current_state + try: + current_state = is_vanished(sender) + new_state = not current_state - if len(args) == 1: - arg = args[0].lower() - if arg == "on": - new_state = True - elif arg == "off": - new_state = False + if len(args) == 1: + arg = args[0].lower() + if arg == "on": + new_state = True + elif arg == "off": + new_state = False - Validate.isTrue(current_state != new_state, "&cYou were %s vanished!" % ("already" if current_state else "not yet")) - set_state(sender, new_state) - return "&a%s vanish mode!" % ("Enabled" if new_state else "Disabled") + if current_state == new_state: + return "&cYou were %s vanished!" % ("already" if current_state else "not yet") + + set_state(sender, new_state) + return "&a%s vanish mode!" % ("Enabled" if new_state else "Disabled") + except: + error(trace()) @hook.event("player.PlayerJoinEvent") def on_player_join(event): player = event.getPlayer() + if not is_authorized(player): - for vanished in get_online_vanished_players(): - player.hidePlayer(vanished) + for uuid in vanished: + player.hidePlayer(retrieve_player(uuid)) + + elif is_vanished(player): + msg(player, "&cKeep in mind that you are still vanished! Use /vanish to disable.") @hook.event("player.PlayerQuitEvent") def on_player_quit(event): player = event.getPlayer() - if not is_authorized(player): - for vanished in get_online_vanished_players(): - player.showPlayer(vanished) - elif is_vanished(player): - disable_vanish(player) + if not is_authorized(player): + for uuid in vanished: + player.showPlayer(retrieve_player(uuid)) @simplecommand("vanishother", @@ -107,7 +110,9 @@ def vanishother_command(sender, command, label, args): elif arg == "off": new_state = False - Validate.isTrue(current_state != new_state, "&cThat player was %s vanished!" % ("already" if current_state else "not yet")) + if current_state == new_state: + return "&cThat player was already vanished!" if current_state else "&cThat player was not yet vanished!" + set_state(target, new_state) enabled_str = "enabled" if new_state else "disabled" diff --git a/wrapper_command.py b/wrapper_command.py index 90eaf01..dd51534 100644 --- a/wrapper_command.py +++ b/wrapper_command.py @@ -1,232 +1,11 @@ from wrapper_player import * -from helpers import * -root_commands = Command_dict() # {"command": command_object} - -def check_arguments(command, arguments): - prev_required = True - type_message_seen = False - prev_arg = arguments[0] if len(arguments) > 0 else None - for arg_info in arguments[1:]: - - if not prev_arg.required and arg_info.required: - raise Argument_exception("Command: %s; There may not be required arguments after non-required arguments" % command) - - if prev_arg.type == Argument.MESSAGE: - raise Argument_exception("Command: %s; An argument of type MESSAGE may not be followed by other arguments" % command) - - prev_arg = arg_info - -#-------------------------------------------------------------------------------------- - -class Command_dict(dict): - #{"cmd1" : cmd_object} - def get_command_object(self, alias): - for cmd_name, cmd_obj in self.iteritems(): - if alias == cmd_name or alias in cmd_obj.aliases: - return cmd_obj - raise KeyError("Subcommand '%s' was not found" % alias) - -#-------------------------------------------------------------------------------------- - -class Command(object): - - def __init__(self, - command, - aliases = (), - arguments = ( - Argument("target", Argument.string, "the player to teleport to"), - Argument("second target", Argument.string, "the player to teleport", False), - ), - parent = None): - - self.command = command.lower() - self.arguments = arguments - - check_arguments(self.command, self.arguments) - - prev_required = True - for arg_info in self.arguments: - if not prev_required and arg_info.required: - raise Argument_exception("Command: %s; There may not be required arguments after non-required arguments" % self.command) - - self.aliases = tuple(alias.lower() for alias in aliases) - self.parent = parent - self.sub_commands = Command_dict() - - if self.parent == None: - root_commands[self.command] = self - else: +def command(command = "help"): + def decorator(wrapped): + @hook.command(command) + def wrapper(sender, command, label, args): try: - parent_route = self.parent.split(" ") - parent_sub_commands = root_commands - parent_obj = None - for cmd_name in parent_route: - parent_obj = parent_sub_commands.get_command_object(cmd_name) - parent_sub_commands = parent_obj.sub_commands - parent_obj.sub_commands[self.command] = self - - except command_exception, e: - error("Error occurred while setting up command hierarchy. " + e.message + "\n" + trace()) - - def __call__(self, handler): - self.handler = handler - - if parent == None: - @hook.command(self.command, self.aliases) - def run(sender, command, label, args): - try: - message = self.execute(sender, command, label, args) - except Command_exception as e: - message = e.message - except Exception: - error(trace()) - return True - if message: - sender.sendMessage(message) - return True - - return handler - - def execute(self, sender, command, label, args): - try: - return self.sub_commands.get_command_object(args[0].lower()).execute(sender, command, label, args[1:]) - except (KeyError, IndexError): - self.execute_checks(sender, command, label, args) - - def execute_checks(self, sender, command, label, args): - #TODO - - scape = Command_scape(args, self.arguments) - if is_player(sender): - sender = py_players[sender] - - return self.handler(sender, self, scape) - - def syntax(self): - return " ".join(tuple(arg_info.syntax() for arg_info in self.arguments)) - -#-------------------------------------------------------------------------------------- - -class Command_scape(list): - - def __init__(self, args, arg_layout): - super(list, self).__init__() - self.raw = args - self.arg_layout = arg_layout - - has_message = False - for i in range(len(arg_layout)): - arg_info = arg_layout[i] - - given = (len(args) >= i + 1) - if arg_info.required and not given: - raise Argument_exception("You must specify the " + arg_info.name) - - if not given: - self.append(None) - continue - - given_arg = args[i] - arg_type = arg_info.type - - if arg_type == Argument.STRING: - self.append(given_arg) - - elif arg_type == Argument.INTEGER: - try: - value = int(given_arg) - except ValueError: - raise Argument_exception("The %s has to be a round number" % arg_info.name) - self.append(value) - - elif arg_type == Argument.FLOAT: - try: - value = float(given_arg) - except ValueError: - raise Argument_exception("The %s has to be a number" % arg_info.name) - self.append(value) - - elif arg_type == Argument.PLAYER: - target = server.getPlayer(given_arg) - if target == None: - raise Argument_exception("The %s has to be an online player" % arg_info.name) - self.append(py_players[target]) - - elif arg_type == Argument.OFFLINE_PLAYER: - try: - # Code to get the PY PLAYER by name. Possibly, uid(server.getOfflinePlayer(given_arg)) can be used? - pass - except KeyError: - raise Argument_exception("The %s has to be an existing player" % arg_info.name) - self.append(None) - - elif arg_type == Argument.MESSAGE: - self.append(" ".join(args[i:])) - has_message = True - else: - error("Argument type not found: %d" % arg_type) - raise Argument_exception("A weird thing has happened, please contact an administrator") - - if not has_message: - self.remainder = args[len(arg_layout):] - else: - self.remainder = None - - def has_flag(self, flag, check_all = False): - return (("-" + flag) in self.raw) if check_all else (("-" + flag) in self.remainder) - - def get_raw(self): - return self.raw - - def get_arg_layout(self): - return self.arg_layout - -#-------------------------------------------------------------------------------------- - -class Command_exception(Exception): - - def __init__(self, message): - self.message = message - -class Argument_exception(Exception): - - def __init__(self, message): - self.message = message - -#-------------------------------------------------------------------------------------- - -class Argument(): - - STRING = 0 - INTEGER = 1 - FLOAT = 2 - PLAYER = 3 - OFFLINE_PLAYER = 4 - MESSAGE = 5 - - def __init__(self, name, type, definition, required = True): - self.name = name - self.type = type - self.definition = definition - self.required = required - - def syntax(self): - syntax = self.name - if self.type == Argument.MESSAGE: - syntax += "..." - return (("<%s>" if self.required else "[%s]") % syntax) - -#-------------------------------------------------------------------------------------- - -class Validate(): - - @staticmethod - def is_true(expression, fail_message): - if not expression: - raise Command_exception(fail_message) - - @staticmethod - def not_none(obj, fail_message): - if obj == None: - raise Command_exception(fail_message) + return wrapped(sender = py_players[sender], command = command, label = label, args = args) + except: + print(print_traceback()) + return decorator \ No newline at end of file diff --git a/wrapper_player.py b/wrapper_player.py index db7f6cc..a889ede 100644 --- a/wrapper_player.py +++ b/wrapper_player.py @@ -6,9 +6,6 @@ from players_secret import * from datetime import datetime from com.ziclix.python.sql import zxJDBC -def get_py_player(player): - - class py_player: def __init__(self,player): self.player = player -- cgit v1.2.3 From 1969584312c4dc2f9b22ce04f571e47a71ac880f Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 Nov 2015 15:49:52 +0100 Subject: Revert "Merge branch 'wrapper' of https://github.com/RedstonerServer/redstoner-utils into wrapper" This reverts commit 4d5861fd3648e969b6a5dc6b210a81eccda2636c, reversing changes made to 9d0e4c99ba84d4efb7828704ed5b0a8e7bdfc52d. --- helpers.py | 51 ++++++++++++++++++++++--------- loginsecurity.py | 4 +-- main.py | 81 ++++++++++++++++++++++++++++++++++++++++++++----- mysql_utils.py | 33 -------------------- mysqlhack.py | 8 ++--- thread_utils.py | 24 --------------- wrapper.py | 11 ------- wrapper_command.py | 11 ------- wrapper_event.py | 22 -------------- wrapper_player.py | 89 ------------------------------------------------------ 10 files changed, 116 insertions(+), 218 deletions(-) delete mode 100644 mysql_utils.py delete mode 100644 thread_utils.py delete mode 100644 wrapper.py delete mode 100644 wrapper_command.py delete mode 100644 wrapper_event.py delete mode 100644 wrapper_player.py diff --git a/helpers.py b/helpers.py index f7e125e..79af3a0 100644 --- a/helpers.py +++ b/helpers.py @@ -1,30 +1,26 @@ #pylint: disable = F0401 - +from re import sub +from java.util.UUID import fromString as juuid +from json import dumps as json_dumps, loads as json_loads import org.bukkit as bukkit -import org.bukkit.block as bblock import org.bukkit.Location as Location -import org.bukkit.event.entity as entity import org.bukkit.entity.Player as Player -import org.bukkit.command.ConsoleCommandSender -import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause as TeleportCause - -from re import sub -from thread_utils import * -from player import py_players +import org.bukkit.event.block.BlockBreakEvent as BlockBreakEvent +import org.bukkit.block as bblock +import org.bukkit.event.entity as entity +import org.bukkit.command.ConsoleCommandSender from org.bukkit.entity import * from player import get_py_player -from traceback import format_exc as trace -from java.util.UUID import fromString as juuid -from json import dumps as json_dumps, loads as json_loads +from player import py_players #Imports for async query -import threading -import mysqlhack - from secrets import * +import mysqlhack from com.ziclix.python.sql import zxJDBC +import threading +from traceback import format_exc as trace shared = {} # this dict can be used to share stuff across modules @@ -218,6 +214,31 @@ def known_player(player): """ return player.hasPlayedBefore() +""" +Runs a async query, calls target function with fetchall as an argument, it will be an empty list if there is nothing to fetch. +(So make sure your function takes that argument.) + +If you want your function to run sync in the case you are doing something spigot wouldn't like to be async use the bukkit scheduler. +Example can be found in loginsecurity.py + +""" +def async_query(mysql_database,query,query_args,target,*target_args,**target_kwargs): + + def async_query_t(mysql_database,query,query_args,target,target_args,target_kwargs): + db_conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + db_curs = db_conn.cursor() + db_curs.execute(query,query_args) + db_conn.commit() + fetchall = db_curs.fetchall() + db_curs.close() + db_conn.close() + target(fetchall,target_args,target_kwargs) + + t = threading.Thread(target=async_query_t,args=(mysql_database,query,query_args,target,target_args,target_kwargs)) + t.daemon = True + t.start() + + def open_json_file(filename, default = None): """ opens the given json file and returns an object or returns None on error diff --git a/loginsecurity.py b/loginsecurity.py index 89f9e47..edf51e9 100644 --- a/loginsecurity.py +++ b/loginsecurity.py @@ -8,7 +8,7 @@ import mysqlhack from com.ziclix.python.sql import zxJDBC from java.lang import Runnable -wait_time = 60 #seconds +wait_time = 30 #seconds admin_perm = "utils.loginsecurity.admin" min_pass_length = 8 blocked_events = ["block.BlockBreakEvent", "block.BlockPlaceEvent", "player.PlayerMoveEvent","player.AsyncPlayerChatEvent"] @@ -272,4 +272,4 @@ def pre_command_proccess(event): args = event.getMessage().split(" ") if not args[0].lower() == "/login": msg(player.player, "&4You need to login before you do that!") - event.setCancelled(True) + event.setCancelled(True) \ No newline at end of file diff --git a/main.py b/main.py index 3e1319d..7411d17 100644 --- a/main.py +++ b/main.py @@ -11,9 +11,8 @@ sys.path += ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/l try: # Library that adds a bunch of re-usable methods which are used in nearly all other modules from helpers import * - from wrapper import * except: - print("[RedstonerUtils] ERROR: Failed to import Wrapper:") + print("[RedstonerUtils] ERROR: Failed to import helpers:") print(print_traceback()) @@ -25,17 +24,85 @@ def on_enable(): @hook.disable def on_disable(): - #shared["modules"]["reports"].stop_reporting() + shared["modules"]["reports"].stop_reporting() info("RedstonerUtils disabled!") info("Loading RedstonerUtils...") - - # Import all modules, in this order -shared["load_modules"] = ["test"] - +shared["load_modules"] = [ + # Collection of tiny utilities + "misc", + # Adds chat for staff using /ac + "adminchat", + # Adds /badge, allows to give players achievements + "badges", + # Adds a few block placement corrections/mods + "blockplacemods", + # Adds /calc, toggles automatic solving of Math expressions in chat + "calc", + # Adds aliasing of chat words + #"chatalias", + # Plugin to locate laggy chunks. /lc lists chunks with more than n entities + "lagchunks", + # Adds /report and /rp, Stores reports with time and location + "reports", + # Adds group-chat with /chatgroup and /cgt to toggle normal chat into group mode + "chatgroups", + # Adds /token, reads and writes from the database to generate pronouncable (and thus memorable) registration-tokens for the website + "webtoken", + # Adds /lol, broadcasts random funyy messages. A bit like the splash text in the menu + "saylol", + # Adds /signalstrength, lets you request a signal strength and an amount of items will be inserted into target container to meet that strength. + "signalstrength", + # Shows the owner of a skull when right-clicked + "skullclick", + # Adds /listen, highlights chat and plays a sound when your name was mentioned + "mentio", + # Adds /cycler, swaps the hotbar with inventory when player changes slot from right->left or left->right + "cycle", + # Adds /getmotd & /setmotd to update the motd on the fly (no reboot) + "motd", + # AnswerBot. Hides stupid questions from chat and tells the sender about /faq or the like + "abot", + # Adds '/forcefield', creates forcefield for players who want it. + "forcefield", + # Adds /damnspam, creates timeout for buttons/levers to mitigate button spam. + "damnspam", + # Adds /check, useful to lookup details about a player + "check", + # Adds /an, a command you can use to share thoughts/plans/news + "adminnotes", + # Adds busy status to players + "imbusy", + # Adds /imout, displays fake leave/join messages + "imout", + #adds snowbrawl minigame + "snowbrawl", + # Adds /tm [player] for a messages to be sent to this player via /msg + "pmtoggle", + # Replacement for LoginSecurity + "loginsecurity", + # Centralized Player class + "player", + # Servercontrol extension for telnet access to logs/AC + #"servercontrol", + # Script helper plugin + "scriptutils", + # Per-player notes + "tag", + # vanish toggle module - temporary fix + #"vanishfix", + # obisidian mining punishment plugin + "punishments", + # a simple replacement for the buggy essentials /vanish + "vanish", + # ip-tracking utility + "iptracker", + #server signs for everyone + "serversigns" +] shared["modules"] = {} for module in shared["load_modules"]: try: diff --git a/mysql_utils.py b/mysql_utils.py deleted file mode 100644 index e59c3d9..0000000 --- a/mysql_utils.py +++ /dev/null @@ -1,33 +0,0 @@ -import mysqlhack -from secrets import * -from thread_utils import * -from com.ziclix.python.sql import zxJDBC -from traceback import format_exc as trace - -class mysql_connect: - def __init__(self): - self.conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") - self.curs = self.conn.cursor() - - def execute(self, query, args=None): - if args is None: - return self.curs.execute(query) - else: - return self.curs.execute(query, args) - - def fetchall(self): - return self.curs.fetchall() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_inst, exc_tb): - if exc_type is None: - try: - self.conn.commit() - self.curs.close() - self.conn.close() - except: - print(trace()) - else: - print(exc_tb) diff --git a/mysqlhack.py b/mysqlhack.py index 5d45c52..7153bdf 100644 --- a/mysqlhack.py +++ b/mysqlhack.py @@ -4,12 +4,12 @@ A library that makes use of the so called ClassPathHack for jython to allow proper loading of mysql-connector.jar at runtime. Import only, no methods. """ -import jarray -import java.net.URL +import java.lang.reflect.Method import java.io.File -from java.lang import Class +import java.net.URL import java.net.URLClassLoader -import java.lang.reflect.Method +import jarray +from java.lang import Class # hacky code to add mysql-connector to java's classpath ('classPathHack') diff --git a/thread_utils.py b/thread_utils.py deleted file mode 100644 index ec13c6f..0000000 --- a/thread_utils.py +++ /dev/null @@ -1,24 +0,0 @@ -import threading -""" -Quick implementation of a @synchronized and @asynchronized decorators -""" - -#To be replaced by bukkit scheduler. -""" -def sync(lock=None): - def decorator(wrapped): - def wrapper(*args, **kwargs): - with lock: - return wrapped(*args, **kwargs) - return wrapper - return decorator -""" - -def async(daemon = True): - def decorator(function): - def wrapper(*args,**kwargs): - thread = threading.Thread(target=function,args=args,kwargs=kwargs) - thread.daemon = daemon - thread.start() - return wrapper - return decorator \ No newline at end of file diff --git a/wrapper.py b/wrapper.py deleted file mode 100644 index ddca5b5..0000000 --- a/wrapper.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -Adapter classes for spigot api for more idiomatic python code. - -Before you run away from this if the class you need to use isn't here, please create it. - - -""" -from helpers import * -from wrapper_event import * -from wrapper_player import * -from wrapper_command import * \ No newline at end of file diff --git a/wrapper_command.py b/wrapper_command.py deleted file mode 100644 index dd51534..0000000 --- a/wrapper_command.py +++ /dev/null @@ -1,11 +0,0 @@ -from wrapper_player import * - -def command(command = "help"): - def decorator(wrapped): - @hook.command(command) - def wrapper(sender, command, label, args): - try: - return wrapped(sender = py_players[sender], command = command, label = label, args = args) - except: - print(print_traceback()) - return decorator \ No newline at end of file diff --git a/wrapper_event.py b/wrapper_event.py deleted file mode 100644 index 083bf33..0000000 --- a/wrapper_event.py +++ /dev/null @@ -1,22 +0,0 @@ -from wrapper import * -from wrapper_player import * -from traceback import format_exc as print_traceback - -class py_event: - def __init__(self,event): - self.event = event - try: - self.player = py_players[event.getPlayer()] - except: - warn("Player doesn't exist") - -def event_handler(event_name = None, priority = "normal"): - def decorator(wrapped): - @hook.event(event_name, priority) - def wrapper(event): - try: - wrapped(py_event(event)) - except: - print(print_traceback()) - return decorator - diff --git a/wrapper_player.py b/wrapper_player.py deleted file mode 100644 index a889ede..0000000 --- a/wrapper_player.py +++ /dev/null @@ -1,89 +0,0 @@ -import time -import mysqlhack -from mysql_utils import * -from thread_utils import * -from players_secret import * -from datetime import datetime -from com.ziclix.python.sql import zxJDBC - -class py_player: - def __init__(self,player): - self.player = player - self.login_time = time.time() - self.logging_in = False - - self.nickname = self.name - self.registered = False - self.password = "None" - self.banned = False - self.banned_reason = "You have been banned!" - self.played_time = time.time() - self.login_time - self.last_login = datetime.now() - self.first_seen = datetime.now() - - def kick(self, kick_message = "You have been kicked from the server!"): - self.player.KickPlayer(kick_message) - - @property - def name(self): - return self.player.getName() - - @property - def uuid(self): - return str(self.player.getUniqueId()) - - -class Py_players: - def __init__(self): - self.players = [] - - def __len__(self): - return len(self.players) - - def __getitem__(self, player): - for py_player in self.players: - if py_player.name == player.getName(): - return py_player - else: - return None - - def remove(self, player): - self.players.remove(player) - - def append(self, player): - self.players.append(player) - -py_players = Py_players() - -@async(daemon=True) -def fetch_player(player): - with mysql_connect() as sql: - sql.execute("SELECT * FROM utils_players WHERE uuid = ?", (player.uuid,)) - result = sql.fetchall() - - if len(result) is 0: - with mysql_connect() as sql: - sql.execute("INSERT INTO utils_players \ - (uuid, name, nickname, registered, password, banned, \ - banned_reason, played_time, last_login, first_seen) \ - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - - args=(player.uuid, player.name, player.nickname, player.registered, - player.password, player.banned, - player.banned_reason, player.played_time, - player.last_login, player.first_seen)) - else: - pass - #test - - -@hook.event("player.PlayerJoinEvent","lowest") -def on_join(event): - player = py_player(event.getPlayer()) - py_players.append(player) - fetch_player(player) - - -@hook.event("player.PlayerQuitEvent","highest") -def on_leave(event): - py_players.remove(py_players[event.getPlayer()]) -- cgit v1.2.3 From 2690da56663950a6391be53ee02cfc00a7bead99 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 30 Nov 2015 02:19:07 +0100 Subject: This should keep players from interacting with comparators where they cannot build --- misc.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/misc.py b/misc.py index 09abcb8..236f6dd 100644 --- a/misc.py +++ b/misc.py @@ -114,6 +114,17 @@ def rs_material_broken_by_flow(material): length = len(parts) return length > 1 and (parts[0] == "DIODE" or parts[1] in ("TORCH", "WIRE", "BUTTON", "HOOK") or (length == 3 and parts[1] == "COMPARATOR")) + +@hook.event("player.PlayerInteractEvent") +def on_interact(event): + if (not event.isCancelled() + and str(event.getAction()) == "RIGHT_CLICK_BLOCK" + and str(event.getMaterial()) in ("REDSTONE_COMPARATOR_OFF", "REDSTONE_COMPARATOR_ON") + and not can_build(player, event.getClickedBlock()) + ): + event.setCancelled(True) + + sudo_blacklist = ["pyeval", "script_backup_begin", "script_backup_end", "script_backup_error", "script_backup_database_begin", "script_backup_database_dumps", "script_backup_database_end", "script_backup_database_error", "script_backup_database_abort", "script_trim", "script_trim_result", "script_spigot_update", "script_disk_filled", "script_restart", "script_restart_abort", "script_stop", "script_stop_abort", "script_shutdown", "stop", "esudo", "essentials:sudo"] -- cgit v1.2.3 From 2c8bfff01f5c35976fb89ecdfed7085f7fa11744 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 30 Nov 2015 02:31:28 +0100 Subject: Add sudo_blacklist to blocked_cmds in serversigns --- misc.py | 2 +- serversigns.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/misc.py b/misc.py index 236f6dd..0fd4a6a 100644 --- a/misc.py +++ b/misc.py @@ -127,7 +127,7 @@ def on_interact(event): sudo_blacklist = ["pyeval", "script_backup_begin", "script_backup_end", "script_backup_error", "script_backup_database_begin", "script_backup_database_dumps", "script_backup_database_end", "script_backup_database_error", "script_backup_database_abort", "script_trim", "script_trim_result", "script_spigot_update", "script_disk_filled", "script_restart", "script_restart_abort", -"script_stop", "script_stop_abort", "script_shutdown", "stop", "esudo", "essentials:sudo"] +"script_stop", "script_stop_abort", "script_shutdown", "stop", "esudo", "essentials:sudo", "sudo"] @simplecommand("sudo", usage = " [cmd..]", diff --git a/serversigns.py b/serversigns.py index 297b727..d9f2a44 100644 --- a/serversigns.py +++ b/serversigns.py @@ -5,7 +5,7 @@ import java.util.UUID as UUID import org.bukkit.Material as Material import org.bukkit.block.BlockFace as BlockFace -blocked_cmds = ("pex", "kick", "ban", "tempban", "pyeval", "sudo", "stop", "reload", "op", "deop", "whitelist") +blocked_cmds = tuple(shared["modules"]["misc"].sudo_blacklist) + ("pex", "kick", "ban", "tempban", "reload", "op", "deop", "whitelist") def load_signs(): signs_obj = open_json_file("serversigns", []) -- cgit v1.2.3 From 528269afd6a8b772f374c1980e9a54f052c7c791 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 9 Dec 2015 22:33:48 +0100 Subject: Added comment with permission nodes to blockplacemods --- blockplacemods.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/blockplacemods.py b/blockplacemods.py index 85e71c5..fd7071e 100644 --- a/blockplacemods.py +++ b/blockplacemods.py @@ -11,6 +11,17 @@ import org.bukkit.event.block.Action as Action import org.bukkit.block.BlockFace as BlockFace import org.bukkit.scheduler.BukkitRunnable as Runnable +""" + # Permissions: + # - utils.toggle: for use of the command + # - utils.toggle.cauldron + # - utils.toggle.slab + # - utils.toggle.furnace + # - utils.toggle.piston + # - utils.toggle.dropper + # - utils.toggle.hopper +""" + settingInformation = dict( #[setting type, identifying description, detailed description, aliases, (optional) max slot id], setting types: 0 = toggle, default on. 1 = Set your setting to held itemstack, 2 = toggle, default off cauldron = [0, "easy cauldron water level control", -- cgit v1.2.3 From fa81ace66eea366d66971c23c612b271a0e1c3a9 Mon Sep 17 00:00:00 2001 From: psrcek Date: Sat, 26 Dec 2015 23:57:34 +0100 Subject: Fixed capitalization --- setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index 74cc599..e542e09 100755 --- a/setup.sh +++ b/setup.sh @@ -25,7 +25,7 @@ mkdir -v "build" cd "build" echo -e "\n> Downloading Spigot build tools" -curl --progress-bar -Lo "buildtools.jar" "https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar" +curl --progress-bar -Lo "BuildTools.jar" "https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar" echo -e "\n> Building Spigot, this will take a while ..." java -jar BuildTools.jar > /dev/null -- cgit v1.2.3 From 883b02acd55da8b2c5c5f3d4528be36c8ecc3fd0 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 9 Jan 2016 16:40:57 +0100 Subject: Initial commit of chatalias.py v2 --- chatalias.py | 419 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 301 insertions(+), 118 deletions(-) diff --git a/chatalias.py b/chatalias.py index 25e3336..a73decb 100644 --- a/chatalias.py +++ b/chatalias.py @@ -1,138 +1,321 @@ -# Chat Aliasing plugin by Curs3d # -################################## -# Allows users to alias words, -# so that when they send a -# message in chat, it gets -# replaced by their specified -# word. The JSON file for this -# plugin is generated if not -# present. Set values to -1 -# for "unlimited" setting. +############################################ +# Alias v2.0 by Pepich # +# Changes to previous version from curs3d: # +# Dynamic alias limit from permissions # +# AC/CG/MSG support # +# Color support # +# Bugfixes # +# # +# TODO: # +# Add command support... # +############################################ +import os +import org.bukkit as bukkit +from org.bukkit import * from helpers import * -import re from traceback import format_exc as trace +from secrets import * -data = None +# Version number and requirements -max_entries = 10 -max_alias_length = 35 -# Minecraft message limit is 100 so I decided to give a little tolerance (and I added a bit more) -max_overall_length = 100 + max_alias_length +alias_version = "2.0.0" +helpers_versions = ["1.1.0", "2.0.0"] +enabled = False +error = colorify("&cUnspecified error") +commands_per_page = 5 +global_aliases = {"./":"/"} +data = {} +use_mysql = False -alias_perm = "utils.alias.allowed" -exceed_length = "utils.alias.exceedlimit" -exceed_entries = "utils.alias.exceedlimit" -exceed_overall_length = "utils.alias.exceedlimit" +# Permissions: +# Grants full access immediately +permission_ALL = "utils.alias.*" +# Access to the command to display the help screen +permission_BASE = "utils.alias" +# Make replacements only when the user has this permission +permission_USE = "utils.alias.use" +# Modify aliases +permission_MODIFY = "utils.alias.modify" +permission_MODIFY_OTHERS = "utils.alias.modify.others" +# List aliases +permission_LIST = "utils.alias.list" +permission_LIST_OTHERS = "utils.alias.list.others" +# Set alias amounts/length limits, e.g. utils.alias.amount.420 +permission_AMOUNT = "utils.alias.amount." +permission_LENGTH = "utils.alias.length." +# See when the plugin was disabled due to version errors +permission_INFO = "utils.alias.info" +permission_FINFO = "utils.alias.finfo" -def safe_open_json(): - global data - if data is not None: - return data - data = open_json_file("aliases") - if data is None: - data = {} - save_json_file("aliases", data) - return data +######## +# CODE # +######## -def multiple_replace(aliases, text): - regex = re.compile("|".join(map(re.escape, aliases.keys()))) - return regex.sub(lambda mo: aliases[mo.group(0)], text) +enabled = helpers_version in helpers_versions +if not enabled: + error = colorify("&6Incompatible versions detected (&chelpers.py&6)") + + +def safe_open_json(uuid): + if not os.path.exists("plugins/redstoner-utils.py.dir/files/aliases"): + os.makedirs("plugins/redstoner-utils.py.dir/files/aliases") + value = open_json_file("aliases/" + uuid) + if value is None: + value = global_aliases + save_json_file("aliases/" + uuid, value) + return value @hook.command("alias", - usage="/ [to_alias] [alias...]", - desc="Aliases words in chat") + usage="/ [...]", + desc="Allows aliasing of words") def on_alias_command(sender, cmd, label, args): - - if not is_player(sender): - msg(sender, "Sorry, non-players cannot alias words") - return True - if not sender.hasPermission(alias_perm): - plugin_header(recipient=sender, name="Chat Alias") - noperm(sender) - return True - if len(args) == 0: - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&7This is a plugin that allows you to get words" + - "replaced by other ones automatically!") - msg(sender, "&7\nCommands:") - msg(sender, "&e/alias &7removes from your aliases. " + - "Use &e/alias * &7to remove all aliases.") - msg(sender, "&e/alias &7will change &e " + - "&7to &e &7in chat") - msg(sender, "&7\nYour Aliases:") - data = safe_open_json() - try: - for alias, value in data[str(sender.getUniqueId())].items(): - msg(sender, "&7%s &7==> %s" % (alias, value)) - except KeyError: - pass - return True - elif len(args) == 1: - data = safe_open_json() - if args[0] == "*": - try: - del data[str(sender.getUniqueId())] - except KeyError: - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&7No alias data to remove!") - return True - save_json_file("aliases", data) - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&cALL &7alias data successfuly removed!") + try: + args = array_to_list(args) + if not enabled: + disabled_fallback(sender) return True - try: - if data[str(sender.getUniqueId())].pop(args[0], None) is None: - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&7Could not remove: alias not present!") - return True - except KeyError: - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&7Could not remove: you do not have any aliases!") + if not hasPerm(sender, permission_BASE): + plugin_header(recipient=sender, name="Alias") + noperm(sender) return True - save_json_file("aliases", data) - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&7Alias for %s &7successfuly removed" % args[0]) + return subcommands[args[0].lower()](sender, args[1:]) + except: + print(trace()) + return subcommands["help"](sender, "1") + + +def help(sender, args): + commands = [colorify("&e/alias help [page]")] + if hasPerm(sender, permission_LIST): + commands += [colorify("&e/alias list &7- Lists all your aliases")] + if hasPerm(sender, permission_MODIFY): + commands += [colorify("&e/alias add &7- Add an alias")] + commands += [colorify("&e/alias remove &7- Remove an alias")] + if can_remote(sender): + while len(commands) < commands_per_page: + commands += [""] + commands += [colorify("&7Following commands will be executed on yet all output will be redirected to you, except when you set silent to false, then will see it too.")] + if hasPerm(sender, permission_LIST_OTHERS): + commands += [colorify("&e/alias player list [silent]")] + if hasPerm(sender, permission_MODIFY_OTHERS): + commands += [colorify("&e/alias player add [silent]")] + commands += [colorify("&e/alias player remove [silent]")] + pages = (len(commands)-1)/commands_per_page + 1 + page = 1 + if len(args) != 0: + page = int(args[0]) + if (page > pages): + page = pages + if page < 1: + page = 1 + msg(sender, colorify("&e---- &6Help &e-- &6Page &c" + str(page) + "&6/&c" + str(pages) + " &e----")) + page -= 1 + to_display = commands[5*page:5*page+5] + for message in to_display: + msg(sender, message) + if page+1 < pages: + msg(sender, colorify("&6To display the next page, type &c/help " + str(page+2))) + return True + + +@hook.event("player.PlayerJoinEvent", "high") +def on_join(event): + try: + if enabled: + t = threading.Thread(target=load_data, args=(uid(event.getPlayer()), )) + t.daemon = True + t.start() + else: + if event.getPlayer().hasPermission(permission_FINFO): + disabled_fallback(event.getPlayer()) + except: + print(trace()) + + +@hook.event("player.AsyncPlayerChatEvent", "high") +def on_player_chat(event): + try: + if enabled: + if event.isCancelled(): + return + if not hasPerm(event.getPlayer(), permission_USE): + return + for alias, value in data[str(uid(event.getPlayer()))].items(): + if not event.getPlayer().hasPermission(permission_ALL) and len(event.getMessage()) > int(get_permission_content(event.getPlayer(), permission_LENGTH)): + event.setCanceled(True) + plugin_header(event.getPlayer, "Alias") + msg(event.getPlayer(), "The message you wanted to generate would exceed your limit. Please make it shorter!") + return + if event.getPlayer().hasPermission("essentials.chat.color"): + event.setMessage(event.getMessage().replace(colorify(alias), colorify(value))) + else: + event.setMessage(event.getMessage().replace(alias, value)) + except: + print(trace()) + +def hasPerm(player, permission): + return (player.hasPermission(permission)) or (player.hasPermission(permission_ALL)) + + +def disabled_fallback(receiver): + if not hasPerm(receiver, permission_INFO): + msg(receiver, colorify("&cUnknown command. Use &e/help&c, &e/plugins &cor ask a mod.")) + else: + msg(receiver, colorify("&cPlugin alias v" + alias_version + " has experienced an &eEMERGENCY SHUTDOWN:")) + msg(receiver, error) + msg(receiver, colorify("&cPlease contact a dev/admin (especially pep :P) about this to take a look at it.")) + + +def can_remote(player): + return hasPerm(player, permission_LIST_OTHERS) or hasPerm(player, permission_MODIFY_OTHERS) + + +def add(sender, args): + plugin_header(sender, "Alias") + if not sender.hasPermission(permission_ALL) and len(data[uid(sender)]) >= int(get_permission_content(sender, permission_AMOUNT)): + msg(sender, "&cCould not create alias: Max_limit reached!") return True - elif len(args) >= 2: - data = safe_open_json() - alias = " ".join(args[1:]) - try: - if (len(alias) > max_alias_length) and (max_alias_length >= 0) and (not sender.hasPermission(exceed_length)): - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&7Please do not alias long words/sentences.") - return True - if (len(data[str(sender.getUniqueId())]) >= max_entries) and (max_entries >= 0) and (not sender.hasPermission(exceed_entries)): - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&7You have reached your alias limit!") - return True - except KeyError: - data[str(sender.getUniqueId())] = {} - data[str(sender.getUniqueId())][args[0]] = alias - save_json_file("aliases", data) - plugin_header(recipient=sender, name="Chat Alias") - msg(sender, "&7Chat Alias %s &7==> %s &7successfully created!" % (args[0], alias)) + args = [args[0]] + [" ".join(args[1:])] + data[str(uid(sender))][str(args[0])] = args[1] + save_data(uid(sender)) + msg(sender, colorify("&7Alias: ") + args[0] + colorify("&7 -> " + args[1] + colorify("&7 was succesfully created!")), usecolor=sender.hasPermission("essentials.chat.color")) + return True + + +def radd(sender, args): + args = [args[0:1]] + [" ".join([args[2:len(args)-2]])] + [args[len(args)-1]] + plugin_header(sender, "Alias") + if args[3].lower() == "false": + plugin_header(target, "Alias") + msg(target, "&cPlayer " + sender_name + " &cis creating an alias for you!") + if not sender.hasPermission(permission_ALL) and len(data[uid(sender)]) >= int(get_permission_content(target, permission_AMOUNT)): + msg(sender, "&cCould not create alias: Max_limit reached!") + if args[3].lower() == "false": + msg(target, "&cCould not create alias: Max_limit reached!") return True + + target = get_player(args[0]) + if is_player(sender): + sender_name = colorify(sender.getDisplayName) else: - return False + sender_name = colorify("&6Console") + if len(args) == 3: + args += ["true"] + data[str(uid(target))][str(args[1])] = str(args[2]) + save_data(uid(target)) + msg(sender, colorify("&7Alias: ") + args[1] + colorify("&7 -> " + args[2] + colorify("&7 was succesfully created!")), usecolor=target.hasPermission("essentials.chat.color")) + if args[3].lower() == "false": + msg(target, colorify("&7Alias: ") + args[1] + colorify("&7 -> " + args[2] + colorify("&7 was succesfully created!")), usecolor=target.hasPermission("essentials.chat.color")) + return True -@hook.event("player.AsyncPlayerChatEvent", "high") -def on_player_chat(event): - playerid = str(event.getPlayer().getUniqueId()) - data = safe_open_json() - if event.isCancelled(): - return - if not playerid in data: - return - - event.setMessage(multiple_replace(data[playerid], event.getMessage())) - - if (event.getPlayer().hasPermission("essentials.chat.color")): - event.setMessage(colorify(event.getMessage())) - if (max_overall_length >= 0) and (len(event.getMessage()) > max_overall_length) and (not event.getPlayer().hasPermission(exceed_overall_length)): - event.setCancelled(True) - plugin_header(recipient=event.getPlayer(), name="Chat Alias") - msg(event.getPlayer(), "&7The message generated was too long and was not sent. :/") +def remove(sender, args): + plugin_header(sender, "Alias") + try: + msg(sender, colorify("&7Successfully removed alias ") + args[0] + colorify(" &7-> ") + data[uid(sender)].pop(args[0]) + colorify("&7!"), usecolor=sender.hasPermission("essentials.chat.color")) + save_data(uid(sender)) + except: + msg(sender, colorify("&cCould not remove alias ") + args[0] + colorify(", it does not exist."), usecolor=sender.hasPermission("essentials.chat.color")) + return True + + +def rremove(sender, args): + plugin_header(sender, "Alias") + target = get_player(args[0]) + if is_player(sender): + sender_name = colorify(sender.getDisplayName) + else: + sender_name = colorify("&6Console") + if args[2].lower() == "false": + print("WTF") + plugin_header(target, "Alias") + msg(target, "&cPlayer " + sender_name + " &cis removing an alias for you!") + try: + alias = data[uid(target)].pop(args[1]) + msg(sender, colorify("&7Successfully removed alias ") + args[1] + colorify(" &7-> ") + alias + colorify("&7!"), usecolor=sender.hasPermission("essentials.chat.color")) + if args[2].lower() == "false": + msg(target, colorify("&7Successfully removed alias ") + args[1] + colorify(" &7-> ") + alias + colorify("&7!"), usecolor=sender.hasPermission("essentials.chat.color")) + save_data(uid(target)) + except: + msg(sender, colorify("&cCould not remove alias ") + args[1] + colorify(", it does not exist."), usecolor=sender.hasPermission("essentials.chat.color")) + if args[2].lower() == "false": + msg(target, colorify("&cCould not remove alias ") + args[1] + colorify(", it does not exist."), usecolor=sender.hasPermission("essentials.chat.color")) + return True + + +def list_alias(sender, args): + plugin_header(sender, "Alias") + msg(sender, "&7You have a total of " + str(len(data[uid(sender)])) + " aliases:") + for word, alias in data[str(uid(sender))].items(): + msg(sender, colorify("&7") + word + colorify("&7 -> ") + alias, usecolor=sender.hasPermission("essentials.chat.color")) + return True + + +def rlist_alias(sender, args): + plugin_header(sender, "Alias") + target = get_player(args[0]) + if is_player(sender): + sender_name = colorify(sender.getDisplayName) + else: + sender_name = colorify("&6Console") + if len(args) == 1: + args += ["true"] + msg(sender, "Player " + args[0] + " has following aliases (" + str(len(data[uid(target)])) + " in total):") + if args[1].lower() == "false": + plugin_header(target, "Alias") + msg(target, "&cPlayer " + sender_name + " &cis listing your aliases (" + str(len(data[uid(target)])) + " in total):") + for word, alias in data[str(uid(target))].items(): + msg(sender, colorify("&7") + word + colorify("&7 -> ") + alias, usecolor=target.hasPermission("essentials.chat.color")) + if args[1].lower() == "false": + msg(target, colorify("&7") + word + colorify("&7 -> ") + alias, usecolor=target.hasPermission("essentials.chat.color")) + return True + + +def remote(sender, args): + try: + return remotes[args[1].lower()](sender, [args[0]] + [args[2:]]) + except: + print(trace()) + return subcommands["help"](sender, ["2"]) + + +def load_data(uuid): + if use_mysql: + conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + curs = conn.cursor() + curs.execute("SELECT alias FROM alias WHERE uuid = ?", (uuid, )) + results = curs.fetchall() + if len(results) == 0: + results = global_aliases + curs.execute("INSERT INTO alias VALUES (?,?)", (uuid, results, )) + data[uuid] = results + else: + data[uuid] = safe_open_json(uuid) + + +def save_data(uuid): + if use_mysql: + conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + curs = conn.cursor() + curs.execute("UPDATE alias SET alias = ? WHERE uuid = ?", (data[uuid], uuid, )) + else: + save_json_file("aliases/" + uuid, data[uuid]) + +# Subcommands: + +subcommands = { + "help": help, + "add": add, + "remove": remove, + "player": remote, + "list": list_alias +} + +remotes = { + "add": radd, + "remove": rremove, + "list": rlist_alias, +} -- cgit v1.2.3 From cbc77de8262204b64bb3695a78acafb76c8ca47f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 9 Jan 2016 16:42:26 +0100 Subject: Helpers v2.0.0, added versioning, added array_to_list and get_permission_content, renamed isIP to is_ip --- helpers.py | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) mode change 100644 => 100755 helpers.py diff --git a/helpers.py b/helpers.py old mode 100644 new mode 100755 index 79af3a0..8485b2a --- a/helpers.py +++ b/helpers.py @@ -22,7 +22,7 @@ import threading from traceback import format_exc as trace - +helpers_version = "2.0.0" shared = {} # this dict can be used to share stuff across modules server = bukkit.Bukkit.getServer() @@ -87,7 +87,7 @@ def colorify(text): """ replace &-codes with real color codes """ - return sub("&" + u"\u00A7", "&", "%s" % sub("&(?=[?\\da-fk-or])", u"\u00A7", "%s" % text)) + return sub("&(?=[?\\da-fk-or])", u"\u00A7", "%s" % text) def stripcolors(text): @@ -181,16 +181,6 @@ def is_creative(player): return str(player.getGameMode()) == "CREATIVE" -def is_rank(player, rank): - """ - rank: a string equal to the PEX group name found in /pex groups - returns True if one of the following conditions are met: - - the player is of the given rank, - - their rank inherits the given rank. - """ - return player.hasPermission("groups." + rank) - - def uid(player): """ returns the player's UUID @@ -281,7 +271,8 @@ def send_JSON_message(playername, message): bukkit.Bukkit.getServer().dispatchCommand(bukkit.Bukkit.getServer().getConsoleSender(), "tellraw " + playername + " " + message) -def isIP(tocheck): +# Allows to check if a String is a valid IPv4 or not. Accepts any string, returns true if the String is a valid IPv4 +def is_ip(tocheck): subsets = ["","","",""] i = 0 for j in range(0,len(tocheck)): @@ -299,3 +290,27 @@ def isIP(tocheck): if not ((int(subsets[j]) >= 0) & (int(subsets[j]) <= 255)): return False return True + + +# Allows the use of e.g. numeric permission nodes like "permission.amount.5" and similar. +# To get the data fetch the player and the start of the permission node, looking like "permission.amount." +def get_permission_content(player, permnode): + perms = player.getEffectivePermissions() + for perm in perms: + if str(perm.getPermission()).startswith(permnode): + return str(perm.getPermission()).replace(permnode, "") + + +# Gets an online player from their name +def get_player(name): + for p in bukkit.Bukkit.getServer().getOnlinePlayers(): + if p.getName().lower() == name.lower(): + return p + return None + + +def array_to_list(array): + return_list = [] + for a in array: + return_list += [a] + return return_list -- cgit v1.2.3 From 3a2d1193ca90697bcff0fd977f76cb03adcc3182 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 9 Jan 2016 16:43:19 +0100 Subject: iptracker v1.1.0 updating to helpers v2.0.0 functions; fixing bugs in data management and command execution --- iptracker.py | 215 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 108 insertions(+), 107 deletions(-) mode change 100644 => 100755 iptracker.py diff --git a/iptracker.py b/iptracker.py old mode 100644 new mode 100755 index 8bbd053..969a822 --- a/iptracker.py +++ b/iptracker.py @@ -1,107 +1,108 @@ -import mysqlhack -import org.bukkit as bukkit -import json -from java.util import UUID as UUID -from helpers import * -from org.bukkit import * -from traceback import format_exc as trace -from iptracker_secrets import * - - -iptrack_permission = "utils.iptrack" - - -@hook.event("player.PlayerJoinEvent", "low") -def on_player_join(event): - t = threading.Thread(target=on_player_join_thread, args=(event, )) - t.daemon = True - t.start() - -def on_player_join_thread(event): - player = event.getPlayer() - ip = player.getAddress().getHostString() - uuid = uid(player) - conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") - curs = conn.cursor() - curs.execute("SELECT ips FROM uuid2ips WHERE uuid = ?", (uuid, )) - results = curs.fetchall() - if len(results) == 0: - ips = [] - else: - ips = json.loads(results[0][0]) - curs.execute("SELECT uuids FROM ip2uuids WHERE ip = ?", (ip, )) - results = curs.fetchall() - if len(results) == 0: - uuids = [] - else: - uuids = json.loads(results[0][0]) - new_ip_entry = (len(ips) == 0) - new_uuid_entry = (len(uuids) == 0) - if ip not in ips: - ips.append(ip) - if new_ip_entry: - curs.execute("INSERT INTO uuid2ips VALUES (?,?)", (uuid, json.dumps(ips), )) - else: - curs.execute("UPDATE uuid2ips SET ips = ? WHERE uuid = ?", (uuid, json.dumps(ips), )) - if uuid not in uuids: - uuids.append(uuid) - if new_uuid_entry: - curs.execute("INSERT INTO ip2uuids VALUES (?,?)", (ip, json.dumps(uuids), )) - else: - curs.execute("UPDATE ip2uuids SET uuids = ? WHERE uuid = ?", (ip, json.dumps(uuids), )) - conn.commit() - curs.close() - conn.close() - - -@hook.command("getinfo") -def on_getinfo_command(sender, args): - t = threading.Thread(target=on_player_join_thread, args=(sender, args)) - t.daemon = True - t.start() - -def on_getinfo_command_thread(sender, args): - if(sender.hasPermission(iptrack_permission)): - if not checkargs(sender, args, 1, 1): - return False - else: - if isIP(args[0]): - conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") - curs = conn.cursor() - curs.execute("SELECT uuids FROM ip2uuids WHERE ip = ?", (args[0], )) - results = curs.fetchall() - curs.close() - conn.close() - if len(results) == 0: - msg(sender, "IP " + args[0] + " is not registered in the database, maybe you got a number wrong?") - else: - uuids = json.loads(results[0][0]) - msg(sender, "IP " + args[0] + " was seen with " + str(len(uuids)) + " different Accounts:") - for i in range(0, len(uuids)): - p=Bukkit.getOfflinePlayer(UUID.fromString(uuids[i])) - if is_player(sender): - send_JSON_message(sender.getName(), '["",{"text":"' + p.getName() + ' - (uuid: ' + uuids[i] + '","color":"gold","clickEvent":{"action":"run_command","value":"/getinfo ' + p.getName() + '"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"To search for ' + p.getName() + ' in the database, simply click the name!","color":"gold"}]}}}]') - else: - msg(sender,p.getName() + " - (uuid: " + uuids[i] + ")") - else: - target = Bukkit.getOfflinePlayer(args[0]) - uuid = target.getUniqueId() - conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") - curs = conn.cursor() - curs.execute("SELECT ips FROM uuid2ips WHERE uuid = ?", (uuid.toString(), )) - results = curs.fetchall() - curs.close() - conn.close() - if len(results) == 0: - msg(sender, "Player " + args[0] + " is not registered in the database, maybe you misspelled the name?") - else: - ips = json.loads(results[0][0]) - msg(sender, "Player " + args[0] + " was seen with " + str(len(ips)) + " different IPs:") - for i in range(0, len(ips)): - if is_player(sender): - send_JSON_message(sender.getName(), '["",{"text":"' + ips[i] + '","color":"gold","clickEvent":{"action":"run_command","value":"/getinfo ' + ips[i] + '"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"To search for the IP ' + ips[i] + ' in the database, simply click the IP!","color":"gold"}]}}}]') - else: - msg(sender,ips[i]) - else: - noperm(sender) - return True +import mysqlhack +import org.bukkit as bukkit +import json +from java.util import UUID as UUID +from helpers import * +from org.bukkit import * +from traceback import format_exc as trace +from iptracker_secrets import * + + +iptrack_permission = "utils.iptrack" +iptrack_version = "1.1.0" + + +@hook.event("player.PlayerJoinEvent", "low") +def on_player_join(event): + t = threading.Thread(target=on_player_join_thread, args=(event, )) + t.daemon = True + t.start() + +def on_player_join_thread(event): + player = event.getPlayer() + ip = player.getAddress().getHostString() + uuid = uid(player) + conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + curs = conn.cursor() + curs.execute("SELECT ips FROM uuid2ips WHERE uuid = ?", (uuid, )) + results = curs.fetchall() + if len(results) == 0: + ips = [] + else: + ips = json.loads(results[0][0]) + curs.execute("SELECT uuids FROM ip2uuids WHERE ip = ?", (ip, )) + results = curs.fetchall() + if len(results) == 0: + uuids = [] + else: + uuids = json.loads(results[0][0]) + new_ip_entry = (len(ips) == 0) + new_uuid_entry = (len(uuids) == 0) + if ip not in ips: + ips.append(ip) + if new_ip_entry: + curs.execute("INSERT INTO uuid2ips VALUES (?,?)", (uuid, json.dumps(ips), )) + else: + curs.execute("UPDATE uuid2ips SET ips = ? WHERE uuid = ?", (json.dumps(ips), uuid, )) + if uuid not in uuids: + uuids.append(uuid) + if new_uuid_entry: + curs.execute("INSERT INTO ip2uuids VALUES (?,?)", (ip, json.dumps(uuids), )) + else: + curs.execute("UPDATE ip2uuids SET uuids = ? WHERE ip = ?", (json.dumps(uuids), ip, )) + conn.commit() + curs.close() + conn.close() + + +@hook.command("getinfo") +def on_getinfo_command(sender, args): + t = threading.Thread(target=on_getinfo_command_thread, args=(sender, args)) + t.daemon = True + t.start() + +def on_getinfo_command_thread(sender, args): + if(sender.hasPermission(iptrack_permission)): + if not checkargs(sender, args, 1, 1): + return False + else: + if is_ip(args[0]): + conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + curs = conn.cursor() + curs.execute("SELECT uuids FROM ip2uuids WHERE ip = ?", (args[0], )) + results = curs.fetchall() + curs.close() + conn.close() + if len(results) == 0: + msg(sender, "IP " + args[0] + " is not registered in the database, maybe you got a number wrong?") + else: + uuids = json.loads(results[0][0]) + msg(sender, "IP " + args[0] + " was seen with " + str(len(uuids)) + " different Accounts:") + for i in range(0, len(uuids)): + p=Bukkit.getOfflinePlayer(UUID.fromString(uuids[i])) + if is_player(sender): + send_JSON_message(sender.getName(), '["",{"text":"' + p.getName() + ' - (uuid: ' + uuids[i] + '","color":"gold","clickEvent":{"action":"run_command","value":"/getinfo ' + p.getName() + '"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"To search for ' + p.getName() + ' in the database, simply click the name!","color":"gold"}]}}}]') + else: + msg(sender,p.getName() + " - (uuid: " + uuids[i] + ")") + else: + target = Bukkit.getOfflinePlayer(args[0]) + uuid = target.getUniqueId() + conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + curs = conn.cursor() + curs.execute("SELECT ips FROM uuid2ips WHERE uuid = ?", (uuid.toString(), )) + results = curs.fetchall() + curs.close() + conn.close() + if len(results) == 0: + msg(sender, "Player " + args[0] + " is not registered in the database, maybe you misspelled the name?") + else: + ips = json.loads(results[0][0]) + msg(sender, "Player " + args[0] + " was seen with " + str(len(ips)) + " different IPs:") + for i in range(0, len(ips)): + if is_player(sender): + send_JSON_message(sender.getName(), '["",{"text":"' + ips[i] + '","color":"gold","clickEvent":{"action":"run_command","value":"/getinfo ' + ips[i] + '"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"To search for the IP ' + ips[i] + ' in the database, simply click the IP!","color":"gold"}]}}}]') + else: + msg(sender,ips[i]) + else: + noperm(sender) + return True -- cgit v1.2.3 From 799584df46a0c53484a3b8cab11efdd4d67d319a Mon Sep 17 00:00:00 2001 From: PixelSergey Date: Sun, 7 Feb 2016 13:15:51 +0200 Subject: Unbusies on logout --- imbusy.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/imbusy.py b/imbusy.py index 64fa30b..37a964e 100644 --- a/imbusy.py +++ b/imbusy.py @@ -105,3 +105,10 @@ def on_cmd_preprocess_event(event): plugin_header(recipient = event.getPlayer(), name = "I'M BUSY!") msg(event.getPlayer(), "We are sorry, but %s is currently busy. Please try again later." % message[1]) event.setCancelled(True) + +@hook.event("player.PlayerQuitEvent", "lowest") +def on_player_leave(event): + try: + busy_players.remove(event.getPlayer().getName()) + except: + pass -- cgit v1.2.3 From f03f34777b1d0ddc95c2ddb17e6eddfd832a8332 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 14 Feb 2016 22:24:11 +0100 Subject: Added tabnames module, disabled iptracker due to instability --- main.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 7411d17..2d6f253 100644 --- a/main.py +++ b/main.py @@ -98,10 +98,12 @@ shared["load_modules"] = [ "punishments", # a simple replacement for the buggy essentials /vanish "vanish", - # ip-tracking utility - "iptracker", + # ip-tracking utility - disabled as of instability + #"iptracker", #server signs for everyone - "serversigns" + "serversigns", + # tabnames module to make players names colored on their chars and sort tab after ranks + "tabnames" ] shared["modules"] = {} for module in shared["load_modules"]: -- cgit v1.2.3 From 70f2001e7b24bf35202d5d255c3a3f7398c708af Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 14 Feb 2016 22:25:02 +0100 Subject: initial commit, adding the tabnames module --- tabnames.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100755 tabnames.py diff --git a/tabnames.py b/tabnames.py new file mode 100755 index 0000000..049098c --- /dev/null +++ b/tabnames.py @@ -0,0 +1,35 @@ +import mysqlhack +import org.bukkit as bukkit +import json +from java.util import UUID as UUID +from helpers import * +from org.bukkit import * +from traceback import format_exc as trace +from iptracker_secrets import * + +tabnames_version = "v1.0.0" + +############################################################## +# # +# This module automatically puts people in the corresponding # +# scoreboard team so that their name is colored properly and # +# tab will be nicely sorted. # +# # +############################################################## + +ranks = ["visitor", "member", "builder", "trusted", "modintraining", "mod", "admin", "breaker"] +prefixes = {"admin":"a", "mod":"b", "modintraining":"c", "trusted":"d", "builder":"e", "member":"f","visitor":"g"} + +@hook.event("player.PlayerJoinEvent", "low") +def on_player_join(event): + scoreboard_team = prefix(get_Rank(event.getPlayer())) + bukkit.Bukkit.getServer().dispatchCommand(bukkit.Bukkit.getServer().getConsoleSender(), "scoreboard teams join " + scoreboard_team + " " + event.getPlayer().getName()) + +def get_Rank(player): + for i in range(0, len(ranks) - 1): + if not player.hasPermission("group." + ranks[i]): + break + return ranks[i-1] + +def prefix(rank): + return prefixes.get(rank) + "_" + rank -- cgit v1.2.3 From 91afa684cd09cd4638ee74733a5cb60b2e4a247f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 14 Feb 2016 22:33:44 +0100 Subject: removed unnessecary imports, code cleanup --- tabnames.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tabnames.py b/tabnames.py index 049098c..c0848c0 100755 --- a/tabnames.py +++ b/tabnames.py @@ -1,11 +1,6 @@ -import mysqlhack import org.bukkit as bukkit -import json -from java.util import UUID as UUID from helpers import * from org.bukkit import * -from traceback import format_exc as trace -from iptracker_secrets import * tabnames_version = "v1.0.0" @@ -23,7 +18,8 @@ prefixes = {"admin":"a", "mod":"b", "modintraining":"c", "trusted":"d", "builder @hook.event("player.PlayerJoinEvent", "low") def on_player_join(event): scoreboard_team = prefix(get_Rank(event.getPlayer())) - bukkit.Bukkit.getServer().dispatchCommand(bukkit.Bukkit.getServer().getConsoleSender(), "scoreboard teams join " + scoreboard_team + " " + event.getPlayer().getName()) + bukkit.Bukkit.getServer().dispatchCommand(bukkit.Bukkit.getServer().getConsoleSender(), + "scoreboard teams join " + scoreboard_team + " " + event.getPlayer().getName()) def get_Rank(player): for i in range(0, len(ranks) - 1): -- cgit v1.2.3 From 5a0477fdbfaa222350c62ce948d8371c34bd538f Mon Sep 17 00:00:00 2001 From: jomo Date: Sun, 14 Feb 2016 23:52:50 +0100 Subject: clean up tabnames doesn't throw exceptions when group can't be found, will print warning instead --- tabnames.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tabnames.py b/tabnames.py index c0848c0..65e1a2c 100755 --- a/tabnames.py +++ b/tabnames.py @@ -1,6 +1,4 @@ -import org.bukkit as bukkit from helpers import * -from org.bukkit import * tabnames_version = "v1.0.0" @@ -12,20 +10,29 @@ tabnames_version = "v1.0.0" # # ############################################################## -ranks = ["visitor", "member", "builder", "trusted", "modintraining", "mod", "admin", "breaker"] +ranks = ["visitor", "member", "builder", "trusted", "modintraining", "mod", "admin"] prefixes = {"admin":"a", "mod":"b", "modintraining":"c", "trusted":"d", "builder":"e", "member":"f","visitor":"g"} @hook.event("player.PlayerJoinEvent", "low") def on_player_join(event): - scoreboard_team = prefix(get_Rank(event.getPlayer())) - bukkit.Bukkit.getServer().dispatchCommand(bukkit.Bukkit.getServer().getConsoleSender(), - "scoreboard teams join " + scoreboard_team + " " + event.getPlayer().getName()) + player = event.getPlayer() + team = get_team(player) + if team: + cmd = "scoreboard teams join %s %s" % (team, player.getName()) + server.dispatchCommand(server.getConsoleSender(), cmd) -def get_Rank(player): - for i in range(0, len(ranks) - 1): - if not player.hasPermission("group." + ranks[i]): +def get_rank(player): + player_rank = None + for rank in ranks: + if not player.hasPermission("group.%s" % rank): break - return ranks[i-1] + player_rank = rank + if not player_rank: + warn("Couldn't find rank for player %s" % player.getName()) + return player_rank -def prefix(rank): - return prefixes.get(rank) + "_" + rank +def get_team(player): + rank = get_rank(player) + if rank: + prefix = prefixes.get(rank) + return "_".join([prefix, rank]) \ No newline at end of file -- cgit v1.2.3 From 6a4d1447ece65d7cfcfba6b9596f60003e436490 Mon Sep 17 00:00:00 2001 From: jomo Date: Mon, 15 Feb 2016 01:27:13 +0100 Subject: rename tabnames to nametags I think it's a more descriptive name --- main.py | 6 +++--- nametags.py | 37 +++++++++++++++++++++++++++++++++++++ tabnames.py | 38 -------------------------------------- 3 files changed, 40 insertions(+), 41 deletions(-) create mode 100755 nametags.py delete mode 100755 tabnames.py diff --git a/main.py b/main.py index 2d6f253..be3a65b 100644 --- a/main.py +++ b/main.py @@ -89,7 +89,7 @@ shared["load_modules"] = [ # Servercontrol extension for telnet access to logs/AC #"servercontrol", # Script helper plugin - "scriptutils", + "scriptutils", # Per-player notes "tag", # vanish toggle module - temporary fix @@ -102,8 +102,8 @@ shared["load_modules"] = [ #"iptracker", #server signs for everyone "serversigns", - # tabnames module to make players names colored on their chars and sort tab after ranks - "tabnames" + # Makes player's names colored, sorts tab list by rank + "nametags" ] shared["modules"] = {} for module in shared["load_modules"]: diff --git a/nametags.py b/nametags.py new file mode 100755 index 0000000..88c0696 --- /dev/null +++ b/nametags.py @@ -0,0 +1,37 @@ +from helpers import * + +############################################################## +# # +# This module automatically puts people in the corresponding # +# scoreboard team so that their name is colored properly and # +# tab will be nicely sorted. # +# # +############################################################## + +ranks = ["visitor", "member", "builder", "trusted", "modintraining", "mod", "admin"] +# prefixes are used for sorting in the tab list +prefixes = {"admin":"a", "mod":"b", "modintraining":"c", "trusted":"d", "builder":"e", "member":"f","visitor":"g"} + +@hook.event("player.PlayerJoinEvent", "low") +def on_player_join(event): + player = event.getPlayer() + team = get_team(player) + if team: + cmd = "scoreboard teams join %s %s" % (team, player.getName()) + server.dispatchCommand(server.getConsoleSender(), cmd) + +def get_rank(player): + player_rank = None + for rank in ranks: + if not player.hasPermission("group.%s" % rank): + break + player_rank = rank + if not player_rank: + warn("Couldn't find rank for player %s" % player.getName()) + return player_rank + +def get_team(player): + rank = get_rank(player) + if rank: + prefix = prefixes.get(rank) + return "_".join([prefix, rank]) \ No newline at end of file diff --git a/tabnames.py b/tabnames.py deleted file mode 100755 index 65e1a2c..0000000 --- a/tabnames.py +++ /dev/null @@ -1,38 +0,0 @@ -from helpers import * - -tabnames_version = "v1.0.0" - -############################################################## -# # -# This module automatically puts people in the corresponding # -# scoreboard team so that their name is colored properly and # -# tab will be nicely sorted. # -# # -############################################################## - -ranks = ["visitor", "member", "builder", "trusted", "modintraining", "mod", "admin"] -prefixes = {"admin":"a", "mod":"b", "modintraining":"c", "trusted":"d", "builder":"e", "member":"f","visitor":"g"} - -@hook.event("player.PlayerJoinEvent", "low") -def on_player_join(event): - player = event.getPlayer() - team = get_team(player) - if team: - cmd = "scoreboard teams join %s %s" % (team, player.getName()) - server.dispatchCommand(server.getConsoleSender(), cmd) - -def get_rank(player): - player_rank = None - for rank in ranks: - if not player.hasPermission("group.%s" % rank): - break - player_rank = rank - if not player_rank: - warn("Couldn't find rank for player %s" % player.getName()) - return player_rank - -def get_team(player): - rank = get_rank(player) - if rank: - prefix = prefixes.get(rank) - return "_".join([prefix, rank]) \ No newline at end of file -- cgit v1.2.3 From 34ed3a1023a757f4cdecb13d9e72bcbc188a269f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 15 Feb 2016 16:50:21 +0100 Subject: Fixed naming error in rank trainingmod --- nametags.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nametags.py b/nametags.py index 88c0696..4d86bbe 100755 --- a/nametags.py +++ b/nametags.py @@ -8,9 +8,9 @@ from helpers import * # # ############################################################## -ranks = ["visitor", "member", "builder", "trusted", "modintraining", "mod", "admin"] +ranks = ["visitor", "member", "builder", "trusted", "trainingmod", "mod", "admin"] # prefixes are used for sorting in the tab list -prefixes = {"admin":"a", "mod":"b", "modintraining":"c", "trusted":"d", "builder":"e", "member":"f","visitor":"g"} +prefixes = {"admin":"a", "mod":"b", "trainingmod":"c", "trusted":"d", "builder":"e", "member":"f","visitor":"g"} @hook.event("player.PlayerJoinEvent", "low") def on_player_join(event): -- cgit v1.2.3 From 9160c85d09248b031b5378d48d188148d8cb8c56 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 15 Feb 2016 17:32:50 +0100 Subject: Added automatic disabling of cgt when leaving a chatgroup --- chatgroups.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/chatgroups.py b/chatgroups.py index 9965b96..aed22cd 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -21,6 +21,8 @@ def on_chatgroup_command(sender, command, label, args): if len(args) == 1 and args[0] == "leave": if sender_id in groups.keys(): groupchat(sender, "left the group", True) + if sender in cg_toggle_list: + cg_toggle_list.remove(p) group = groups[sender_id] del(groups[sender_id]) save_groups() -- cgit v1.2.3 From 412ed59225a864e9c59d36fa11ad670410a44fe2 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 15 Feb 2016 17:33:14 +0100 Subject: Added aliases and proper command description --- pmtoggle.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pmtoggle.py b/pmtoggle.py index e1bac06..1cdf17b 100644 --- a/pmtoggle.py +++ b/pmtoggle.py @@ -5,7 +5,11 @@ from java.util.UUID import fromString as juuid toggle_dict = {} permission = "utils.pmtoggle" -@hook.command("tm") +@hook.command("tm", + aliases = ["tmsg", "mt", "msgt"], + usage = "/ [player]", + description = "Toggle automatic sending of messages" + ) def on_toggle_message_command(sender, command, label, args): if not sender.hasPermission(permission) or not is_player(sender): noperm(sender) -- cgit v1.2.3 From 0aad531f9ec75f3e133f7d6060a1d1b64e17b7dc Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 15 Feb 2016 17:38:19 +0100 Subject: Added more aliases --- pmtoggle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pmtoggle.py b/pmtoggle.py index 1cdf17b..19caf9e 100644 --- a/pmtoggle.py +++ b/pmtoggle.py @@ -5,8 +5,8 @@ from java.util.UUID import fromString as juuid toggle_dict = {} permission = "utils.pmtoggle" -@hook.command("tm", - aliases = ["tmsg", "mt", "msgt"], +@hook.command("pmtoggle", + aliases = ["tm", "mt", "tmsg", "msgt", "pmt", "tpm"], usage = "/ [player]", description = "Toggle automatic sending of messages" ) -- cgit v1.2.3 From 621f4ca23b1a1befacfb71c85255a19db0d260e1 Mon Sep 17 00:00:00 2001 From: PixelSergey Date: Tue, 8 Mar 2016 20:32:56 +0200 Subject: Added a debug decorator, use @debug to nicely print function errors --- helpers.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/helpers.py b/helpers.py index 8485b2a..4c32e24 100755 --- a/helpers.py +++ b/helpers.py @@ -314,3 +314,13 @@ def array_to_list(array): for a in array: return_list += [a] return return_list + + +#debug wrapper +def debug(func): + def wrap(*args, **kwargs): + try: + func(*args, **kwargs) + except: + print(trace()) + return wrap -- cgit v1.2.3 From fad1ae0f90022aee9d336618dd2c0cc3b8ba95a2 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sat, 12 Mar 2016 01:00:07 +0100 Subject: Fixed a return message in blockplacemods.py --- blockplacemods.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blockplacemods.py b/blockplacemods.py index fd7071e..b87c5ee 100644 --- a/blockplacemods.py +++ b/blockplacemods.py @@ -150,7 +150,8 @@ def toggle_command(sender, command, label, args): if arg2 == "clear": if enabled: del values[uuid] - return " &aDisabled " + details[1] + return " &aDisabled " + details[1] + return " &cAlready disabled: " + details[1] if arg2 == "details": return " &aSetting %s:\n &9%s \n&6Accepted arguments: [|clear|details]" % (setting, details[2]) -- cgit v1.2.3 From 286f8751b5d3edcaa2e1f8c22b47f292887c979f Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sat, 12 Mar 2016 01:02:48 +0100 Subject: Fix tab -.- lol why did it load locally? --- blockplacemods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockplacemods.py b/blockplacemods.py index b87c5ee..8d18699 100644 --- a/blockplacemods.py +++ b/blockplacemods.py @@ -150,7 +150,7 @@ def toggle_command(sender, command, label, args): if arg2 == "clear": if enabled: del values[uuid] - return " &aDisabled " + details[1] + return " &aDisabled " + details[1] return " &cAlready disabled: " + details[1] if arg2 == "details": -- cgit v1.2.3 From c870561f7db96d0ab010e99fdd22699a24e0630b Mon Sep 17 00:00:00 2001 From: psrcek Date: Sat, 26 Mar 2016 21:56:10 +0100 Subject: removed some unnecesary code The below if statement is always true and the value of timeout_on isn't used before a return statement. timeout_on = False if timeout_on == False: --- damnspam.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/damnspam.py b/damnspam.py index 6a4c2b3..af800af 100644 --- a/damnspam.py +++ b/damnspam.py @@ -47,8 +47,6 @@ def on_dammnspam_command(sender, command, label, args): timeout_on = round(float(timeout_on), 2) timeout_off = timeout_on if 60 >= timeout_on <= -2 or timeout_on == 0: - timeout_on = False - if timeout_on == False: msg(sender, "&cThe timeout must be within 0-60 or -1.") return True except ValueError: -- cgit v1.2.3 From 46f1564af03a35c006448df77b1207f516592489 Mon Sep 17 00:00:00 2001 From: Pepich Date: Mon, 11 Apr 2016 15:18:59 +0200 Subject: Fixed indentation error ll 39-41 --- damnspam.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/damnspam.py b/damnspam.py index 6a4c2b3..83dfb5f 100644 --- a/damnspam.py +++ b/damnspam.py @@ -36,9 +36,9 @@ def on_dammnspam_command(sender, command, label, args): msg(sender, "&c/damnspam &e(Levers only)") return True #Gittestlol - if not is_creative(sender): - msg(sender, "&cYou can only do this in Creative mode.") - return True + if not is_creative(sender): + msg(sender, "&cYou can only do this in Creative mode.") + return True # /damnspam if len(args) == 1: -- cgit v1.2.3 From fa1d5e900d13c546ddf069849e14eadafdc79377 Mon Sep 17 00:00:00 2001 From: Pepich Date: Mon, 11 Apr 2016 16:59:42 +0200 Subject: Fixed player subcommand, removed debug outputs --- chatalias.py | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/chatalias.py b/chatalias.py index a73decb..530cc90 100644 --- a/chatalias.py +++ b/chatalias.py @@ -11,6 +11,7 @@ ############################################ import os +import mysqlhack import org.bukkit as bukkit from org.bukkit import * from helpers import * @@ -26,6 +27,7 @@ error = colorify("&cUnspecified error") commands_per_page = 5 global_aliases = {"./":"/"} data = {} +# DON'T SET THIS TO TRUE! MySQL requestst are NOT async yet! (And for some reason it doesn't want to store any data ._.) use_mysql = False # Permissions: @@ -83,7 +85,6 @@ def on_alias_command(sender, cmd, label, args): return True return subcommands[args[0].lower()](sender, args[1:]) except: - print(trace()) return subcommands["help"](sender, "1") @@ -132,7 +133,7 @@ def on_join(event): if event.getPlayer().hasPermission(permission_FINFO): disabled_fallback(event.getPlayer()) except: - print(trace()) + return @hook.event("player.AsyncPlayerChatEvent", "high") @@ -154,7 +155,7 @@ def on_player_chat(event): else: event.setMessage(event.getMessage().replace(alias, value)) except: - print(trace()) + return def hasPerm(player, permission): return (player.hasPermission(permission)) or (player.hasPermission(permission_ALL)) @@ -186,8 +187,13 @@ def add(sender, args): def radd(sender, args): - args = [args[0:1]] + [" ".join([args[2:len(args)-2]])] + [args[len(args)-1]] plugin_header(sender, "Alias") + args = args[0:2] + [" ".join(args[2:len(args)-1])] + [args[len(args)-1]] + if is_player(sender): + sender_name = colorify(sender.getDisplayName()) + else: + sender_name = colorify("&6Console") + target = get_player(args[0]) if args[3].lower() == "false": plugin_header(target, "Alias") msg(target, "&cPlayer " + sender_name + " &cis creating an alias for you!") @@ -196,12 +202,6 @@ def radd(sender, args): if args[3].lower() == "false": msg(target, "&cCould not create alias: Max_limit reached!") return True - - target = get_player(args[0]) - if is_player(sender): - sender_name = colorify(sender.getDisplayName) - else: - sender_name = colorify("&6Console") if len(args) == 3: args += ["true"] data[str(uid(target))][str(args[1])] = str(args[2]) @@ -226,11 +226,10 @@ def rremove(sender, args): plugin_header(sender, "Alias") target = get_player(args[0]) if is_player(sender): - sender_name = colorify(sender.getDisplayName) + sender_name = colorify(sender.getDisplayName()) else: sender_name = colorify("&6Console") if args[2].lower() == "false": - print("WTF") plugin_header(target, "Alias") msg(target, "&cPlayer " + sender_name + " &cis removing an alias for you!") try: @@ -276,13 +275,18 @@ def rlist_alias(sender, args): def remote(sender, args): try: - return remotes[args[1].lower()](sender, [args[0]] + [args[2:]]) + return remotes[args[1].lower()](sender, [args[0]] + args[2:]) except: - print(trace()) return subcommands["help"](sender, ["2"]) - def load_data(uuid): + load_data_thread(uuid) +# t = threading.Thread(target=load_data_thread, args=(uuid)) +# t.daemon = True +# t.start() + + +def load_data_thread(uuid): if use_mysql: conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") curs = conn.cursor() @@ -295,8 +299,13 @@ def load_data(uuid): else: data[uuid] = safe_open_json(uuid) - def save_data(uuid): + save_data_thread(uuid) +# t = threading.Thread(target=save_data_thread, args=(uuid)) +# t.daemon = True +# t.start() + +def save_data_thread(uuid): if use_mysql: conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") curs = conn.cursor() -- cgit v1.2.3 From 48251e1e520a2f3ad42d30a2ab8e11fd09abee19 Mon Sep 17 00:00:00 2001 From: Pepich Date: Tue, 12 Apr 2016 14:52:16 +0200 Subject: Cleanup, adding debug outputs back, removing empty try/catch phrases --- chatalias.py | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/chatalias.py b/chatalias.py index 530cc90..de18f78 100644 --- a/chatalias.py +++ b/chatalias.py @@ -27,7 +27,7 @@ error = colorify("&cUnspecified error") commands_per_page = 5 global_aliases = {"./":"/"} data = {} -# DON'T SET THIS TO TRUE! MySQL requestst are NOT async yet! (And for some reason it doesn't want to store any data ._.) +# DON'T SET THIS TO TRUE! MySQL requestst are NOT ASYNC yet! (And for some reason it doesn't want to store any data ._.) use_mysql = False # Permissions: @@ -55,6 +55,7 @@ permission_FINFO = "utils.alias.finfo" # CODE # ######## +# OnEnable enabled = helpers_version in helpers_versions if not enabled: error = colorify("&6Incompatible versions detected (&chelpers.py&6)") @@ -124,16 +125,13 @@ def help(sender, args): @hook.event("player.PlayerJoinEvent", "high") def on_join(event): - try: - if enabled: - t = threading.Thread(target=load_data, args=(uid(event.getPlayer()), )) - t.daemon = True - t.start() - else: - if event.getPlayer().hasPermission(permission_FINFO): - disabled_fallback(event.getPlayer()) - except: - return + if enabled: + t = threading.Thread(target=load_data, args=(uid(event.getPlayer()), )) + t.daemon = True + t.start() + else: + if event.getPlayer().hasPermission(permission_FINFO): + disabled_fallback(event.getPlayer()) @hook.event("player.AsyncPlayerChatEvent", "high") @@ -155,7 +153,8 @@ def on_player_chat(event): else: event.setMessage(event.getMessage().replace(alias, value)) except: - return + print(trace()) + def hasPerm(player, permission): return (player.hasPermission(permission)) or (player.hasPermission(permission_ALL)) @@ -279,12 +278,15 @@ def remote(sender, args): except: return subcommands["help"](sender, ["2"]) -def load_data(uuid): - load_data_thread(uuid) -# t = threading.Thread(target=load_data_thread, args=(uuid)) -# t.daemon = True -# t.start() +def load_data(uuid): + try: + load_data_thread(uuid) +# t = threading.Thread(target=load_data_thread, args=(uuid)) +# t.daemon = True +# t.start() + except: + print(trace()) def load_data_thread(uuid): if use_mysql: @@ -299,11 +301,15 @@ def load_data_thread(uuid): else: data[uuid] = safe_open_json(uuid) + def save_data(uuid): - save_data_thread(uuid) -# t = threading.Thread(target=save_data_thread, args=(uuid)) -# t.daemon = True -# t.start() + try: + save_data_thread(uuid) +# t = threading.Thread(target=save_data_thread, args=(uuid)) +# t.daemon = True +# t.start() + except: + print(trace()) def save_data_thread(uuid): if use_mysql: @@ -313,8 +319,8 @@ def save_data_thread(uuid): else: save_json_file("aliases/" + uuid, data[uuid]) -# Subcommands: +# Subcommands: subcommands = { "help": help, "add": add, -- cgit v1.2.3 From 07039b3d1601b67056044c45a7ee88d4e0062c97 Mon Sep 17 00:00:00 2001 From: Dico Date: Wed, 25 May 2016 01:37:01 +0200 Subject: Fix command given for next help page in chatalias.py --- chatalias.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatalias.py b/chatalias.py index de18f78..da1a657 100644 --- a/chatalias.py +++ b/chatalias.py @@ -119,7 +119,7 @@ def help(sender, args): for message in to_display: msg(sender, message) if page+1 < pages: - msg(sender, colorify("&6To display the next page, type &c/help " + str(page+2))) + msg(sender, colorify("&6To display the next page, type &c/alias help " + str(page+2))) return True -- cgit v1.2.3 From a5556760761974590b0666c3e89043aa5fc98a1d Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 02:39:05 +0200 Subject: Prevent complete multi-replacement in chatalias. Doesn't prevent 1 -> 2 and 23 -> 5 to make for 13 -> 5, but does prevent a -> 20 and 2 -> 3. Tested. --- chatalias.py | 25 +++++++++++++++++++++---- main.py | 2 +- plugin.yml | 3 +-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/chatalias.py b/chatalias.py index da1a657..be97228 100644 --- a/chatalias.py +++ b/chatalias.py @@ -86,6 +86,7 @@ def on_alias_command(sender, cmd, label, args): return True return subcommands[args[0].lower()](sender, args[1:]) except: + print(trace()) return subcommands["help"](sender, "1") @@ -179,8 +180,9 @@ def add(sender, args): msg(sender, "&cCould not create alias: Max_limit reached!") return True args = [args[0]] + [" ".join(args[1:])] - data[str(uid(sender))][str(args[0])] = args[1] - save_data(uid(sender)) + if not add_alias_data(uid(sender), str(args[0]), args[1]): + msg(sender, colorify("&c") + "Could not add an alias for this sequence because a priorly added alias contains it") + return True msg(sender, colorify("&7Alias: ") + args[0] + colorify("&7 -> " + args[1] + colorify("&7 was succesfully created!")), usecolor=sender.hasPermission("essentials.chat.color")) return True @@ -203,14 +205,29 @@ def radd(sender, args): return True if len(args) == 3: args += ["true"] - data[str(uid(target))][str(args[1])] = str(args[2]) - save_data(uid(target)) + if not add_alias_data(uid(target), str(args[1]), str(args[2])): + message = colorify("&c") + "Could not add an alias for this sequence because a priorly added alias contains it" + msg(sender, message) + if args[3].lower() == "false": + msg(target, message) + return True msg(sender, colorify("&7Alias: ") + args[1] + colorify("&7 -> " + args[2] + colorify("&7 was succesfully created!")), usecolor=target.hasPermission("essentials.chat.color")) if args[3].lower() == "false": msg(target, colorify("&7Alias: ") + args[1] + colorify("&7 -> " + args[2] + colorify("&7 was succesfully created!")), usecolor=target.hasPermission("essentials.chat.color")) return True +def add_alias_data(puuid, aliased, new_alias): + prior = data[puuid] + if aliased not in prior: + for alias in prior.values(): + if aliased in alias: + return False + prior[aliased] = new_alias + save_data(puuid) + return True + + def remove(sender, args): plugin_header(sender, "Alias") try: diff --git a/main.py b/main.py index be3a65b..651a547 100644 --- a/main.py +++ b/main.py @@ -43,7 +43,7 @@ shared["load_modules"] = [ # Adds /calc, toggles automatic solving of Math expressions in chat "calc", # Adds aliasing of chat words - #"chatalias", + "chatalias", # Plugin to locate laggy chunks. /lc lists chunks with more than n entities "lagchunks", # Adds /report and /rp, Stores reports with time and location diff --git a/plugin.yml b/plugin.yml index 4991e40..97e69a1 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,5 +1,4 @@ name: RedstonerUtils main: main.py version: 3.1.0 -author: redstone_sheep - +author: redstone_sheep \ No newline at end of file -- cgit v1.2.3 From 4e6bd44c387b4956da5bf39a3a80b25b0b495aba Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 02:40:50 +0200 Subject: Undoing these small changes from last commit... --- chatalias.py | 1 - plugin.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/chatalias.py b/chatalias.py index be97228..24a445e 100644 --- a/chatalias.py +++ b/chatalias.py @@ -86,7 +86,6 @@ def on_alias_command(sender, cmd, label, args): return True return subcommands[args[0].lower()](sender, args[1:]) except: - print(trace()) return subcommands["help"](sender, "1") diff --git a/plugin.yml b/plugin.yml index 97e69a1..bdd5acb 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,4 +1,4 @@ name: RedstonerUtils main: main.py version: 3.1.0 -author: redstone_sheep \ No newline at end of file +author: redstone_sheep -- cgit v1.2.3 From 7fdaee155aabc69e658d5eaf4d6aa502ab90239c Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 02:46:53 +0200 Subject: Fix yo shitty chatgroups code --- chatgroups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatgroups.py b/chatgroups.py index aed22cd..be29e53 100644 --- a/chatgroups.py +++ b/chatgroups.py @@ -89,7 +89,7 @@ def groupchat(sender, message, ann = False): def do_for_chatgroup(group, func, *args, **kwargs): for receiver in server.getOnlinePlayers(): if groups.get(uid(receiver)) == group: - func(receiver, args, kwargs) + func(receiver, *args, **kwargs) def send_tpa_request(receiver, sender): if not receiver == sender: -- cgit v1.2.3 From fca3cf250c10c47d849c2faef7a1a1f2d601d57b Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 02:52:24 +0200 Subject: Imbusy: Fixed typos and some *flaws* which I will disregard here @curs3d --- imbusy.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/imbusy.py b/imbusy.py index 37a964e..153c00f 100644 --- a/imbusy.py +++ b/imbusy.py @@ -17,8 +17,8 @@ from traceback import format_exc as trace busy_players = [] -def unclear(): - msg(sender, "Umm, what? Sorry, directions unlclear, got head stuck in washing machine") +def unclear(sender): + msg(sender, "Umm, what? Sorry, directions unclear, got head stuck in washing machine") @hook.command("busy", @@ -39,7 +39,7 @@ def on_busy_command(sender, cmd, label, args): if len(args) == 0: plugin_header(recipient = sender, name = "I'M BUSY!") - msg(sender, "This plugin allows being busy, and when turned on you will not recieve any direct messages or tpa requests.") + msg(sender, "This plugin allows being busy, and when turned on you will not receive any direct messages or tpa requests.") msg(sender, "\nCommands:") msg(sender, "/busy on: turns on busy mode") msg(sender, "/busy off: turns off busy mode") @@ -78,7 +78,7 @@ def on_busy_command(sender, cmd, label, args): else: plugin_header(recipient = sender, name = "I'M BUSY!") - unclear() + unclear(sender) return False elif len(args) == 2 and args[0] == "status": @@ -92,7 +92,7 @@ def on_busy_command(sender, cmd, label, args): else: plugin_header(recipient = sender, name = "I'M BUSY!") - unclear() + unclear(sender) return False -- cgit v1.2.3 From 8165d5977b407d10b97e65a2e15bbcf97855f224 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 03:00:35 +0200 Subject: Small change to imbusy messages --- imbusy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/imbusy.py b/imbusy.py index 153c00f..049d721 100644 --- a/imbusy.py +++ b/imbusy.py @@ -54,14 +54,14 @@ def on_busy_command(sender, cmd, label, args): return True busy_players.append(sender.getName()) plugin_header(recipient = sender, name = "I'M BUSY!") - broadcast(None, "%s is now SUPER busy! Don't even TRY bothering them, it will not work!" % sender.getName()) + broadcast(None, "&c[&2Busy&c] &fNow busy: %s&f, don't even TRY bothering them!" % sender.getDisplayName()) return True elif args[0] == "off": plugin_header(recipient = sender, name = "I'M BUSY!") try: busy_players.remove(sender.getName()) - msg(sender, "Master has sent /busy command, %s is freeee!" % sender.getName()) + msg(sender, "Master has sent /busy command, %s&f is freeee of bothering!" % sender.getDisplayName()) return True except ValueError: msg(sender, "You are not busy! You cannot be even less busy! Are you perhaps bored?") @@ -82,7 +82,7 @@ def on_busy_command(sender, cmd, label, args): return False elif len(args) == 2 and args[0] == "status": - plugin_header(recipient = sender, name = "I'M BUSY!") + plugin_header(recipient = sender, name = "I'M BUSY!") if args[1] in busy_players: msg(sender, "Yes, %s is busy. Shhh..." % args[1]) return True -- cgit v1.2.3 From 29e7ce174b5f353d79773f1e73f047bb0007acbc Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 03:02:01 +0200 Subject: Imbusy command: Replace plugin_header calls with a single one at the start --- imbusy.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/imbusy.py b/imbusy.py index 049d721..8e84cbd 100644 --- a/imbusy.py +++ b/imbusy.py @@ -32,13 +32,13 @@ def on_busy_command(sender, cmd, label, args): msg(sender, "Sorry, Console cannot be busy") return True + plugin_header(recipient = sender, name = "I'M BUSY!") + if not sender.hasPermission("utils.busy.allowed"): - plugin_header(recipient = sender, name = "I'M BUSY!") noperm(sender) return True if len(args) == 0: - plugin_header(recipient = sender, name = "I'M BUSY!") msg(sender, "This plugin allows being busy, and when turned on you will not receive any direct messages or tpa requests.") msg(sender, "\nCommands:") msg(sender, "/busy on: turns on busy mode") @@ -49,16 +49,13 @@ def on_busy_command(sender, cmd, label, args): elif len(args) == 1: if args[0] == "on": if sender.getName() in busy_players: - plugin_header(recipient = sender, name = "I'M BUSY!") msg(sender, "You cannot be even more focused than this without being a jedi!") return True busy_players.append(sender.getName()) - plugin_header(recipient = sender, name = "I'M BUSY!") broadcast(None, "&c[&2Busy&c] &fNow busy: %s&f, don't even TRY bothering them!" % sender.getDisplayName()) return True elif args[0] == "off": - plugin_header(recipient = sender, name = "I'M BUSY!") try: busy_players.remove(sender.getName()) msg(sender, "Master has sent /busy command, %s&f is freeee of bothering!" % sender.getDisplayName()) @@ -68,7 +65,6 @@ def on_busy_command(sender, cmd, label, args): return True elif args[0] == "status": - plugin_header(recipient = sender, name = "I'M BUSY!") if sender.getName() in busy_players: msg(sender, "You are super-duper busy and concentrated right now. Think, think, think!") return True @@ -77,12 +73,10 @@ def on_busy_command(sender, cmd, label, args): return True else: - plugin_header(recipient = sender, name = "I'M BUSY!") unclear(sender) return False elif len(args) == 2 and args[0] == "status": - plugin_header(recipient = sender, name = "I'M BUSY!") if args[1] in busy_players: msg(sender, "Yes, %s is busy. Shhh..." % args[1]) return True @@ -91,7 +85,6 @@ def on_busy_command(sender, cmd, label, args): return True else: - plugin_header(recipient = sender, name = "I'M BUSY!") unclear(sender) return False -- cgit v1.2.3 From 9a1006e7114e9ed63b67e1197a3ec934a9089814 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 03:05:59 +0200 Subject: Imbusy command: status tweaked, cleaned up return statements --- imbusy.py | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/imbusy.py b/imbusy.py index 8e84cbd..a480e2e 100644 --- a/imbusy.py +++ b/imbusy.py @@ -44,49 +44,45 @@ def on_busy_command(sender, cmd, label, args): msg(sender, "/busy on: turns on busy mode") msg(sender, "/busy off: turns off busy mode") msg(sender, "/busy status [player]: shows your or [player]'s current busy status.") - return True elif len(args) == 1: if args[0] == "on": if sender.getName() in busy_players: msg(sender, "You cannot be even more focused than this without being a jedi!") - return True - busy_players.append(sender.getName()) - broadcast(None, "&c[&2Busy&c] &fNow busy: %s&f, don't even TRY bothering them!" % sender.getDisplayName()) - return True + else: + busy_players.append(sender.getName()) + broadcast(None, "&c[&2Busy&c] &fNow busy: %s&r, don't even TRY bothering them!" % sender.getDisplayName()) elif args[0] == "off": try: busy_players.remove(sender.getName()) - msg(sender, "Master has sent /busy command, %s&f is freeee of bothering!" % sender.getDisplayName()) - return True + msg(sender, "Master has sent /busy command, %s&r is freeee of bothering!" % sender.getDisplayName()) except ValueError: msg(sender, "You are not busy! You cannot be even less busy! Are you perhaps bored?") - return True elif args[0] == "status": if sender.getName() in busy_players: msg(sender, "You are super-duper busy and concentrated right now. Think, think, think!") - return True else: msg(sender, "You are completely unable to focus right now.") - return True else: unclear(sender) return False elif len(args) == 2 and args[0] == "status": - if args[1] in busy_players: - msg(sender, "Yes, %s is busy. Shhh..." % args[1]) - return True + target = server.getPlayer(args[1]) + if target is None: + msg(sender, "That player is not online, I doubt they are busy.") + elif target.getName() in busy_players: + msg(sender, "Yes, %s&r is busy. Shhh..." % target.getDisplayName()) else: - msg(sender, "No, you're good. Feel free to chat with %s!" % args[1]) - return True + msg(sender, "No, you're good. Feel free to chat with %s&r!" % target.getDisplayName()) else: unclear(sender) return False + return True @hook.event("player.PlayerCommandPreprocessEvent", "monitor") -- cgit v1.2.3 From 5592e16200212b22f61f358183740d8a34030bc9 Mon Sep 17 00:00:00 2001 From: Dico Date: Wed, 25 May 2016 15:49:11 +0200 Subject: Solidify imbusy blocking pms, tpas, etc. I used reflection to get the Map object from the SimpleCommandMap instance stored in the implementation of PluginManager. I replaced all Command instances in there that handle /msg, /tpa, /tpahere and /reply, minus /minecraft:tell, with a wrapper that checks if the target is busy. Tested adequately, but some more would be nice. --- imbusy.py | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 131 insertions(+), 10 deletions(-) diff --git a/imbusy.py b/imbusy.py index a480e2e..8d7ae74 100644 --- a/imbusy.py +++ b/imbusy.py @@ -13,7 +13,9 @@ from helpers import * from basecommands import simplecommand +import org.bukkit.command.Command as Command from traceback import format_exc as trace + busy_players = [] @@ -85,19 +87,138 @@ def on_busy_command(sender, cmd, label, args): return True -@hook.event("player.PlayerCommandPreprocessEvent", "monitor") -def on_cmd_preprocess_event(event): - message = event.getMessage().split(" ") - if message[0] == "/msg" or message[0] == "/w" or message[0] == "/m" or \ - message[0] == "/tell" or message[0] == "/tpa" or message[0] == "/tpahere": - if message[1] in busy_players: - plugin_header(recipient = event.getPlayer(), name = "I'M BUSY!") - msg(event.getPlayer(), "We are sorry, but %s is currently busy. Please try again later." % message[1]) - event.setCancelled(True) - @hook.event("player.PlayerQuitEvent", "lowest") def on_player_leave(event): try: busy_players.remove(event.getPlayer().getName()) except: pass + + +#---- Dicode for catching any bothering of busy people ---- + + +reply_targets = {} +override_perm = "utils.imbusy.override" + + +def whisper(sender, target_name): + target = server.getPlayer(target_name) + + if target is not None: + if target is not sender and not sender.hasPermission(override_perm) and target.getName() in busy_players: + msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) + return False + + reply_targets[sender.getName()] = target.getName() + + # allow the target to reply regardless of sender being busy + if target.getName() in reply_targets: + del reply_targets[target.getName()] + return True + + +def reply(sender): + if sender.getName() in reply_targets: + target = server.getPlayer(reply_targets[sender.getName()]) + if target is not None: + if target is not sender and not sender.hasPermission(override_perm) and target.getName() in busy_players: + msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) + return False + + # allow the target to reply regardless of sender being busy + if target.getName() in reply_targets: + del reply_targets[target.getName()] + return True + + +class CommandWrapper(Command): + + def __init__(self, wrapped, checker): + Command.__init__(self, wrapped.getName()) + self.setDescription(wrapped.getDescription()) + self.setPermission(wrapped.getPermission()) + self.setUsage(wrapped.getUsage()) + self.setAliases(wrapped.getAliases()) + self.wrapped = wrapped + self.checker = checker + + def execute(self, sender, label, args): + try: + if self.checker(sender, args): + return self.wrapped.execute(sender, label, args) + except: + error(trace()) + return True + + def tabComplete(self, sender, alias, args): + return self.wrapped.tabComplete(sender, alias, args) + +def msg_command_checker(sender, args): + return len(args) <= 1 or whisper(sender, args[0]) + +def reply_command_checker(sender, args): + return len(args) == 0 or reply(sender) + +def tpa_command_checker(sender, args): + if len(args) == 0: + return True + target = server.getPlayer(args[0]) + if target is not None and target is not sender and not sender.hasPermission(override_perm) and target.getName() in busy_players: + msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) + return False + return True + +def tpahere_command_checker(sender, args): + return tpa_command_checker(sender, args) + + +@hook.event("player.PlayerCommandPreprocessEvent", "monitor") +def on_player_command_preprocess(event): + message = event.getMessage().split(" ") + if len(message) > 1 and message[0].lower() in ("/tell", "/minecraft:tell") and not whisper(event.getPlayer(), message[1]): + event.setCancelled(True) + + +@hook.enable +def replace_ess_commands(): + + try: + mapField = server.getPluginManager().getClass().getDeclaredField("commandMap") + mapField.setAccessible(True) + commandMap = mapField.get(server.getPluginManager()) + + commandsField = commandMap.getClass().getDeclaredField("knownCommands") + commandsField.setAccessible(True) + map = commandsField.get(commandMap) + + essMsgCmd = map.get("essentials:msg") + essReplyCmd = map.get("essentials:reply") + essTpaCmd = map.get("essentials:tpa") + essTpahereCmd = map.get("essentials:tpahere") + + msgCmdWrapper = CommandWrapper(essMsgCmd, msg_command_checker) + replyCmdWrapper = CommandWrapper(essReplyCmd, reply_command_checker) + tpaCmdWrapper = CommandWrapper(essTpaCmd, tpa_command_checker) + tpahereCmdWrapper = CommandWrapper(essTpahereCmd, tpahere_command_checker) + + iterator = map.entrySet().iterator() + while iterator.hasNext(): + entry = iterator.next() + value = entry.getValue() + if value is essMsgCmd: + entry.setValue(msgCmdWrapper) + info("[imbusy] wrapped /" + entry.getKey()) + elif value is essReplyCmd: + entry.setValue(replyCmdWrapper) + info("[imbusy] wrapped /" + entry.getKey()) + elif value is essTpaCmd: + entry.setValue(tpaCmdWrapper) + info("[imbusy] wrapped /" + entry.getKey()) + elif value is essTpahereCmd: + entry.setValue(tpahereCmdWrapper) + info("[imbusy] wrapped /" + entry.getKey()) + + except: + error("[Imbusy] Failed to wrap essentials commands") + error(trace()) -- cgit v1.2.3 From a2a43ed464edbafe9548c156371d8013cc9e054d Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 16:13:36 +0200 Subject: Replace camelCase with _ stuff --- imbusy.py | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/imbusy.py b/imbusy.py index 8d7ae74..2baefa3 100644 --- a/imbusy.py +++ b/imbusy.py @@ -144,6 +144,7 @@ class CommandWrapper(Command): self.checker = checker def execute(self, sender, label, args): + info("/" + self.getLabel() + " executed by " + sender.getName()) try: if self.checker(sender, args): return self.wrapped.execute(sender, label, args) @@ -184,39 +185,40 @@ def on_player_command_preprocess(event): def replace_ess_commands(): try: - mapField = server.getPluginManager().getClass().getDeclaredField("commandMap") - mapField.setAccessible(True) - commandMap = mapField.get(server.getPluginManager()) + info("[imbusy] Wrapping ess commands") + map_field = server.getPluginManager().getClass().getDeclaredField("commandMap") + map_field.setAccessible(True) + command_map = map_field.get(server.getPluginManager()) - commandsField = commandMap.getClass().getDeclaredField("knownCommands") - commandsField.setAccessible(True) - map = commandsField.get(commandMap) + commands_field = command_map.getClass().getDeclaredField("knownCommands") + commands_field.setAccessible(True) + map = commands_field.get(command_map) - essMsgCmd = map.get("essentials:msg") - essReplyCmd = map.get("essentials:reply") - essTpaCmd = map.get("essentials:tpa") - essTpahereCmd = map.get("essentials:tpahere") + ess_msg_cmd = map.get("essentials:msg") + ess_reply_cmd = map.get("essentials:reply") + ess_tpa_cmd = map.get("essentials:tpa") + ess_tpahere_cmd = map.get("essentials:tpahere") - msgCmdWrapper = CommandWrapper(essMsgCmd, msg_command_checker) - replyCmdWrapper = CommandWrapper(essReplyCmd, reply_command_checker) - tpaCmdWrapper = CommandWrapper(essTpaCmd, tpa_command_checker) - tpahereCmdWrapper = CommandWrapper(essTpahereCmd, tpahere_command_checker) + msg_cmd_wrapper = CommandWrapper(ess_msg_cmd, msg_command_checker) + reply_cmd_wrapper = CommandWrapper(ess_reply_cmd, reply_command_checker) + tpa_cmd_wrapper = CommandWrapper(ess_tpa_cmd, tpa_command_checker) + tpahere_cmd_wrapper = CommandWrapper(ess_tpahere_cmd, tpahere_command_checker) iterator = map.entrySet().iterator() while iterator.hasNext(): entry = iterator.next() value = entry.getValue() - if value is essMsgCmd: - entry.setValue(msgCmdWrapper) + if value is ess_msg_cmd: + entry.setValue(msg_cmd_wrapper) info("[imbusy] wrapped /" + entry.getKey()) - elif value is essReplyCmd: - entry.setValue(replyCmdWrapper) + elif value is ess_reply_cmd: + entry.setValue(reply_cmd_wrapper) info("[imbusy] wrapped /" + entry.getKey()) - elif value is essTpaCmd: - entry.setValue(tpaCmdWrapper) + elif value is ess_tpa_cmd: + entry.setValue(tpa_cmd_wrapper) info("[imbusy] wrapped /" + entry.getKey()) - elif value is essTpahereCmd: - entry.setValue(tpahereCmdWrapper) + elif value is ess_tpahere_cmd: + entry.setValue(tpahere_cmd_wrapper) info("[imbusy] wrapped /" + entry.getKey()) except: -- cgit v1.2.3 From 29f846c8f9532ac0950c4187171b042d8e5dee49 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 16:31:32 +0200 Subject: Undo prior changes in favor of pull request --- chatalias.py | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/chatalias.py b/chatalias.py index 24a445e..d1c1b62 100644 --- a/chatalias.py +++ b/chatalias.py @@ -1,3 +1,19 @@ +Skip to content +This repository +Search +Pull requests +Issues +Gist + @Dico200 + Unwatch 13 + Star 5 + Fork 3 RedstonerServer/redstoner-utils + Code Issues 8 Pull requests 3 Wiki Pulse Graphs Settings +Tree: cb1a333a56 Find file Copy pathredstoner-utils/chatalias.py +07039b3 15 hours ago +@Dico200 Dico200 Fix command given for next help page in chatalias.py +5 contributors @PixelSergey @Pepich @NEMESIS13cz @Dico200 @invalid-email-address +RawBlameHistory 337 lines (290 sloc) 12.9 KB ############################################ # Alias v2.0 by Pepich # # Changes to previous version from curs3d: # @@ -179,9 +195,8 @@ def add(sender, args): msg(sender, "&cCould not create alias: Max_limit reached!") return True args = [args[0]] + [" ".join(args[1:])] - if not add_alias_data(uid(sender), str(args[0]), args[1]): - msg(sender, colorify("&c") + "Could not add an alias for this sequence because a priorly added alias contains it") - return True + data[str(uid(sender))][str(args[0])] = args[1] + save_data(uid(sender)) msg(sender, colorify("&7Alias: ") + args[0] + colorify("&7 -> " + args[1] + colorify("&7 was succesfully created!")), usecolor=sender.hasPermission("essentials.chat.color")) return True @@ -204,29 +219,14 @@ def radd(sender, args): return True if len(args) == 3: args += ["true"] - if not add_alias_data(uid(target), str(args[1]), str(args[2])): - message = colorify("&c") + "Could not add an alias for this sequence because a priorly added alias contains it" - msg(sender, message) - if args[3].lower() == "false": - msg(target, message) - return True + data[str(uid(target))][str(args[1])] = str(args[2]) + save_data(uid(target)) msg(sender, colorify("&7Alias: ") + args[1] + colorify("&7 -> " + args[2] + colorify("&7 was succesfully created!")), usecolor=target.hasPermission("essentials.chat.color")) if args[3].lower() == "false": msg(target, colorify("&7Alias: ") + args[1] + colorify("&7 -> " + args[2] + colorify("&7 was succesfully created!")), usecolor=target.hasPermission("essentials.chat.color")) return True -def add_alias_data(puuid, aliased, new_alias): - prior = data[puuid] - if aliased not in prior: - for alias in prior.values(): - if aliased in alias: - return False - prior[aliased] = new_alias - save_data(puuid) - return True - - def remove(sender, args): plugin_header(sender, "Alias") try: @@ -350,3 +350,5 @@ remotes = { "remove": rremove, "list": rlist_alias, } +Status API Training Shop Blog About +© 2016 GitHub, Inc. Terms Privacy Security Contact Help \ No newline at end of file -- cgit v1.2.3 From d88baa4899d49b3224732e513bb05ea224b6c9f3 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 16:37:58 +0200 Subject: What is this.. sorry --- chatalias.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/chatalias.py b/chatalias.py index d1c1b62..5560c5f 100644 --- a/chatalias.py +++ b/chatalias.py @@ -1,19 +1,3 @@ -Skip to content -This repository -Search -Pull requests -Issues -Gist - @Dico200 - Unwatch 13 - Star 5 - Fork 3 RedstonerServer/redstoner-utils - Code Issues 8 Pull requests 3 Wiki Pulse Graphs Settings -Tree: cb1a333a56 Find file Copy pathredstoner-utils/chatalias.py -07039b3 15 hours ago -@Dico200 Dico200 Fix command given for next help page in chatalias.py -5 contributors @PixelSergey @Pepich @NEMESIS13cz @Dico200 @invalid-email-address -RawBlameHistory 337 lines (290 sloc) 12.9 KB ############################################ # Alias v2.0 by Pepich # # Changes to previous version from curs3d: # -- cgit v1.2.3 From 2d6725df73df9d92a36aea2ab76f8573f32faf75 Mon Sep 17 00:00:00 2001 From: Dico Date: Wed, 25 May 2016 16:40:31 +0200 Subject: Prevent chained aliases in chatalias Prevents 1 -> 23 along with 2 -> 3 and similar stuff --- chatalias.py | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/chatalias.py b/chatalias.py index 5560c5f..7163245 100644 --- a/chatalias.py +++ b/chatalias.py @@ -179,8 +179,9 @@ def add(sender, args): msg(sender, "&cCould not create alias: Max_limit reached!") return True args = [args[0]] + [" ".join(args[1:])] - data[str(uid(sender))][str(args[0])] = args[1] - save_data(uid(sender)) + if not add_alias_data(uid(sender), str(args[0]), args[1]): + msg(sender, colorify("&c") + "Could not add this alias because it would cause some sequences to be replaced multiple times" + return True msg(sender, colorify("&7Alias: ") + args[0] + colorify("&7 -> " + args[1] + colorify("&7 was succesfully created!")), usecolor=sender.hasPermission("essentials.chat.color")) return True @@ -203,14 +204,37 @@ def radd(sender, args): return True if len(args) == 3: args += ["true"] - data[str(uid(target))][str(args[1])] = str(args[2]) - save_data(uid(target)) + if not add_alias_data(uid(target), str(args[1]), str(args[2])): + message = colorify("&c") + "Could not add this alias because it would cause some sequences to be replaced multiple times" + msg(sender, message) + if args[3].lower() == "false": + msg(target, message) + return True msg(sender, colorify("&7Alias: ") + args[1] + colorify("&7 -> " + args[2] + colorify("&7 was succesfully created!")), usecolor=target.hasPermission("essentials.chat.color")) if args[3].lower() == "false": msg(target, colorify("&7Alias: ") + args[1] + colorify("&7 -> " + args[2] + colorify("&7 was succesfully created!")), usecolor=target.hasPermission("essentials.chat.color")) return True +def add_alias_data(puuid, aliased, new_alias): + prior = data[puuid] + + # prevent 2 -> 3 if there is 1 -> 2 + if aliased not in prior: + for alias in prior.values(): + if aliased in alias: + return False + + # prevent 1 -> 2 if there is 2 -> 3 + for sequence in prior: + if sequence in new alias: + return False + + prior[aliased] = new_alias + save_data(puuid) + return True + + def remove(sender, args): plugin_header(sender, "Alias") try: @@ -334,5 +358,3 @@ remotes = { "remove": rremove, "list": rlist_alias, } -Status API Training Shop Blog About -© 2016 GitHub, Inc. Terms Privacy Security Contact Help \ No newline at end of file -- cgit v1.2.3 From 16e78a267766192486b88195bac1ee6c6ea45667 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 16:44:09 +0200 Subject: Add missing ) to chatalias --- chatalias.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatalias.py b/chatalias.py index 7163245..708179c 100644 --- a/chatalias.py +++ b/chatalias.py @@ -180,7 +180,7 @@ def add(sender, args): return True args = [args[0]] + [" ".join(args[1:])] if not add_alias_data(uid(sender), str(args[0]), args[1]): - msg(sender, colorify("&c") + "Could not add this alias because it would cause some sequences to be replaced multiple times" + msg(sender, colorify("&c") + "Could not add this alias because it would cause some sequences to be replaced multiple times", usecolor = False) return True msg(sender, colorify("&7Alias: ") + args[0] + colorify("&7 -> " + args[1] + colorify("&7 was succesfully created!")), usecolor=sender.hasPermission("essentials.chat.color")) return True -- cgit v1.2.3 From 1fdf97f77a3c5f1a263fa252802a7840416a7bc5 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 16:46:49 +0200 Subject: Add missing _ ... lol --- chatalias.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatalias.py b/chatalias.py index 708179c..07f132f 100644 --- a/chatalias.py +++ b/chatalias.py @@ -227,7 +227,7 @@ def add_alias_data(puuid, aliased, new_alias): # prevent 1 -> 2 if there is 2 -> 3 for sequence in prior: - if sequence in new alias: + if sequence in new_alias: return False prior[aliased] = new_alias -- cgit v1.2.3 From a532c6b42c2c2629c7772e5538012446047da197 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 18:18:27 +0200 Subject: Changed broadcast message, removed two debugs --- imbusy.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/imbusy.py b/imbusy.py index 2baefa3..4dc6f59 100644 --- a/imbusy.py +++ b/imbusy.py @@ -53,7 +53,7 @@ def on_busy_command(sender, cmd, label, args): msg(sender, "You cannot be even more focused than this without being a jedi!") else: busy_players.append(sender.getName()) - broadcast(None, "&c[&2Busy&c] &fNow busy: %s&r, don't even TRY bothering them!" % sender.getDisplayName()) + broadcast(None, "&c[&2Busy&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) elif args[0] == "off": try: @@ -144,7 +144,6 @@ class CommandWrapper(Command): self.checker = checker def execute(self, sender, label, args): - info("/" + self.getLabel() + " executed by " + sender.getName()) try: if self.checker(sender, args): return self.wrapped.execute(sender, label, args) @@ -185,7 +184,6 @@ def on_player_command_preprocess(event): def replace_ess_commands(): try: - info("[imbusy] Wrapping ess commands") map_field = server.getPluginManager().getClass().getDeclaredField("commandMap") map_field.setAccessible(True) command_map = map_field.get(server.getPluginManager()) -- cgit v1.2.3 From 00e38efd14eaa3261b1dd66f71157a7f048bd92c Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 18:32:20 +0200 Subject: Added catcher for /mail send --- imbusy.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/imbusy.py b/imbusy.py index 4dc6f59..225862b 100644 --- a/imbusy.py +++ b/imbusy.py @@ -154,6 +154,7 @@ class CommandWrapper(Command): def tabComplete(self, sender, alias, args): return self.wrapped.tabComplete(sender, alias, args) + def msg_command_checker(sender, args): return len(args) <= 1 or whisper(sender, args[0]) @@ -172,6 +173,15 @@ def tpa_command_checker(sender, args): def tpahere_command_checker(sender, args): return tpa_command_checker(sender, args) +def mail_command_checker(sender, args): + if len(args) < 3 or args[0].lower() != "send": + return True + target = server.getPlayer(args[1]) + if target is not None and target is not sender and not sender.hasPermission(override_perm) and target.getName() in busy_players: + msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) + return False + return True + @hook.event("player.PlayerCommandPreprocessEvent", "monitor") def on_player_command_preprocess(event): @@ -196,11 +206,13 @@ def replace_ess_commands(): ess_reply_cmd = map.get("essentials:reply") ess_tpa_cmd = map.get("essentials:tpa") ess_tpahere_cmd = map.get("essentials:tpahere") + ess_mail_cmd = map.get("essentials:mail") msg_cmd_wrapper = CommandWrapper(ess_msg_cmd, msg_command_checker) reply_cmd_wrapper = CommandWrapper(ess_reply_cmd, reply_command_checker) tpa_cmd_wrapper = CommandWrapper(ess_tpa_cmd, tpa_command_checker) tpahere_cmd_wrapper = CommandWrapper(ess_tpahere_cmd, tpahere_command_checker) + mail_cmd_wrapper = CommandWrapper(ess_mail_cmd, mail_command_checker) iterator = map.entrySet().iterator() while iterator.hasNext(): @@ -218,6 +230,9 @@ def replace_ess_commands(): elif value is ess_tpahere_cmd: entry.setValue(tpahere_cmd_wrapper) info("[imbusy] wrapped /" + entry.getKey()) + elif value is ess_mail_cmd: + entry.setValue(mail_cmd_wrapper) + info("[imbusy] wrapped /" + entry.getKey()) except: error("[Imbusy] Failed to wrap essentials commands") -- cgit v1.2.3 From 8629b39ce10242da9d4686f6bb2dcd7c24b53832 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 18:41:42 +0200 Subject: Make /busy a toggle, move help page to /busy help. Changed a few messages --- imbusy.py | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/imbusy.py b/imbusy.py index 225862b..1fc9e63 100644 --- a/imbusy.py +++ b/imbusy.py @@ -40,34 +40,44 @@ def on_busy_command(sender, cmd, label, args): noperm(sender) return True + sender_name = sender.getName() + if len(args) == 0: - msg(sender, "This plugin allows being busy, and when turned on you will not receive any direct messages or tpa requests.") - msg(sender, "\nCommands:") - msg(sender, "/busy on: turns on busy mode") - msg(sender, "/busy off: turns off busy mode") - msg(sender, "/busy status [player]: shows your or [player]'s current busy status.") + if sender_name in busy_players: + busy_players.remove(sender_name) + msg(sender, "Your busy status was removed, you can be bothered again") + else: + busy_players.append(sender_name) + broadcast(None, "&c[&2Busy&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) elif len(args) == 1: - if args[0] == "on": - if sender.getName() in busy_players: + if args[0].lower() == "on": + if sender_name in busy_players: msg(sender, "You cannot be even more focused than this without being a jedi!") else: - busy_players.append(sender.getName()) + busy_players.append(sender_name) broadcast(None, "&c[&2Busy&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) - elif args[0] == "off": + elif args[0].lower() == "off": try: - busy_players.remove(sender.getName()) - msg(sender, "Master has sent /busy command, %s&r is freeee of bothering!" % sender.getDisplayName()) + busy_players.remove(sender_name) + msg(sender, "Your busy status was removed, you can be bothered again") except ValueError: msg(sender, "You are not busy! You cannot be even less busy! Are you perhaps bored?") - elif args[0] == "status": - if sender.getName() in busy_players: + elif args[0].lower() == "status": + if sender_name in busy_players: msg(sender, "You are super-duper busy and concentrated right now. Think, think, think!") else: msg(sender, "You are completely unable to focus right now.") + elif args[0].lower() in ("?", "help"): + msg(sender, "Let's you put yourself in busy status, preventing pms and tpa requests from other players") + msg(sender, "\nCommands:") + msg(sender, "/busy: toggles busy status") + msg(sender, "/busy on: turns on busy status") + msg(sender, "/busy off: turns off busy status") + msg(sender, "/busy status [player]: shows your or [player]'s current busy status.") else: unclear(sender) return False @@ -75,7 +85,7 @@ def on_busy_command(sender, cmd, label, args): elif len(args) == 2 and args[0] == "status": target = server.getPlayer(args[1]) if target is None: - msg(sender, "That player is not online, I doubt they are busy.") + msg(sender, "That player is not online, they may be busy IRL, we never know") elif target.getName() in busy_players: msg(sender, "Yes, %s&r is busy. Shhh..." % target.getDisplayName()) else: -- cgit v1.2.3 From 28afa1ddcf9d9d43c7cc076e6091b33452bf2b1c Mon Sep 17 00:00:00 2001 From: Dico200 Date: Wed, 25 May 2016 18:54:32 +0200 Subject: Changed debug output, tweaked [busy] broadcast prefix --- imbusy.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/imbusy.py b/imbusy.py index 1fc9e63..380c920 100644 --- a/imbusy.py +++ b/imbusy.py @@ -48,7 +48,7 @@ def on_busy_command(sender, cmd, label, args): msg(sender, "Your busy status was removed, you can be bothered again") else: busy_players.append(sender_name) - broadcast(None, "&c[&2Busy&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) + broadcast(None, "&c[&fBUSY&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) elif len(args) == 1: if args[0].lower() == "on": @@ -56,7 +56,7 @@ def on_busy_command(sender, cmd, label, args): msg(sender, "You cannot be even more focused than this without being a jedi!") else: busy_players.append(sender_name) - broadcast(None, "&c[&2Busy&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) + broadcast(None, "&c[&fBUSY&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) elif args[0].lower() == "off": try: @@ -184,6 +184,7 @@ def tpahere_command_checker(sender, args): return tpa_command_checker(sender, args) def mail_command_checker(sender, args): + info("Mail command executed") if len(args) < 3 or args[0].lower() != "send": return True target = server.getPlayer(args[1]) @@ -225,24 +226,26 @@ def replace_ess_commands(): mail_cmd_wrapper = CommandWrapper(ess_mail_cmd, mail_command_checker) iterator = map.entrySet().iterator() + wrapped_commands = [] while iterator.hasNext(): entry = iterator.next() value = entry.getValue() + changed = True if value is ess_msg_cmd: entry.setValue(msg_cmd_wrapper) - info("[imbusy] wrapped /" + entry.getKey()) elif value is ess_reply_cmd: entry.setValue(reply_cmd_wrapper) - info("[imbusy] wrapped /" + entry.getKey()) elif value is ess_tpa_cmd: entry.setValue(tpa_cmd_wrapper) - info("[imbusy] wrapped /" + entry.getKey()) elif value is ess_tpahere_cmd: entry.setValue(tpahere_cmd_wrapper) - info("[imbusy] wrapped /" + entry.getKey()) elif value is ess_mail_cmd: entry.setValue(mail_cmd_wrapper) - info("[imbusy] wrapped /" + entry.getKey()) + else: + changed = False + if changed: + wrapped_commands.append(entry.getKey()) + info("[imbusy] wrapped commands: /" + ", /".join(wrapped_commands)) except: error("[Imbusy] Failed to wrap essentials commands") -- cgit v1.2.3 From 89e3982a299d94173704784438ac9393ebd6acaf Mon Sep 17 00:00:00 2001 From: Dico200 Date: Thu, 26 May 2016 04:37:47 +0200 Subject: Implement some of pizza's changes from imbusy branch --- imbusy.py | 180 +++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 103 insertions(+), 77 deletions(-) diff --git a/imbusy.py b/imbusy.py index 380c920..2df0a03 100644 --- a/imbusy.py +++ b/imbusy.py @@ -1,99 +1,126 @@ -# I'M BUSY! Plugin by Curs3d # -############################## -# Concept by CookieManors :D # -# http://bit.ly/1GnNPW8 # -############################## -# This plugin permits users to -# send a command that renders -# them "busy", not letting them -# to get tpa requests or direct -# messages, except from console. -# On restart, all busy data will -# be cleared. +################################## +# I'M BUSY! Plugin by Curs3d # +# Concept by CookieManors :D # +################################## +# This plugin permits users to # +# send a command that renders # +# them "busy", not letting them # +# to get tpa requests or direct # +# messages, except from console. # +# On restart, all busy data will # +# be cleared. # +################################## from helpers import * -from basecommands import simplecommand import org.bukkit.command.Command as Command -from traceback import format_exc as trace -busy_players = [] +imbusy_version = "v1.1.0" + +base_permission = "utils.busy" # for /busy status +use_permission = "utils.busy.use" # for being busy +override_permission = "utils.busy.override" # for being able to bother busy people -def unclear(sender): - msg(sender, "Umm, what? Sorry, directions unclear, got head stuck in washing machine") +busy_players = [] -@hook.command("busy", - aliases = ["focus"], - usage = "/ ", - description = "Sets busy mode on, you cannot recieve tpas and MSGs" +@hook.command("imbusy", + aliases = ["busy"], + usage = "/ [on, off, status/check]", + description = "Offers control over your busy status" ) def on_busy_command(sender, cmd, label, args): - if not is_player(sender): - msg(sender, "Sorry, Console cannot be busy") - return True + msg(sender, "&7Sorry, Console cannot be busy") + return True plugin_header(recipient = sender, name = "I'M BUSY!") - if not sender.hasPermission("utils.busy.allowed"): + #args = array_to_list(args) + if not sender.hasPermission(base_permission): noperm(sender) return True + if len(args) == 0: + return toggle(sender) + + arg0 = args[0].lower() + if arg0 == "on": + return on(sender) + if arg0 == "off": + return off(sender) + if arg0 in ("status", "check"): + return status(sender, args[1:]) + return help(sender) + + +def toggle(sender): + if not sender.hasPermission(use_permission): + noperm(sender) + return True sender_name = sender.getName() + if sender_name in busy_players: + busy_players.remove(sender_name) + broadcast(None, colorify(sender.getDisplayName() + " &7is no longer busy...")) + else: + busy_players.append(sender_name) + broadcast(None, colorify(sender.getDisplayName() + " &7is now busy...")) + return True - if len(args) == 0: - if sender_name in busy_players: - busy_players.remove(sender_name) - msg(sender, "Your busy status was removed, you can be bothered again") - else: - busy_players.append(sender_name) - broadcast(None, "&c[&fBUSY&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) - elif len(args) == 1: - if args[0].lower() == "on": - if sender_name in busy_players: - msg(sender, "You cannot be even more focused than this without being a jedi!") - else: - busy_players.append(sender_name) - broadcast(None, "&c[&fBUSY&c] %s&r is now busy, don't even TRY bothering them!" % sender.getDisplayName()) - - elif args[0].lower() == "off": - try: - busy_players.remove(sender_name) - msg(sender, "Your busy status was removed, you can be bothered again") - except ValueError: - msg(sender, "You are not busy! You cannot be even less busy! Are you perhaps bored?") - - elif args[0].lower() == "status": - if sender_name in busy_players: - msg(sender, "You are super-duper busy and concentrated right now. Think, think, think!") - else: - msg(sender, "You are completely unable to focus right now.") - - elif args[0].lower() in ("?", "help"): - msg(sender, "Let's you put yourself in busy status, preventing pms and tpa requests from other players") - msg(sender, "\nCommands:") - msg(sender, "/busy: toggles busy status") - msg(sender, "/busy on: turns on busy status") - msg(sender, "/busy off: turns off busy status") - msg(sender, "/busy status [player]: shows your or [player]'s current busy status.") - else: - unclear(sender) - return False +def help(sender): + msg(sender, "Let's you put yourself in busy status, preventing pms and tpa requests from other players") + msg(sender, "\n&eCommands:") + msg(sender, "&e/busy &7- Toggles busy status") + msg(sender, "&e/busy on &7- Turns on busy status") + msg(sender, "&e/busy off &7- Turns off busy status") + msg(sender, "&e/busy status [player] &7- shows your or [player]'s current busy status") + return True - elif len(args) == 2 and args[0] == "status": - target = server.getPlayer(args[1]) + +def on(sender): + if not sender.hasPermission(use_permission): + noperm(sender) + return True + sender_name = sender.getName() + if sender_name in busy_players: + msg(sender, "&7You are already busy!") + return True + busy_players.append(sender_name) + broadcast(None, colorify(sender.getDisplayName() + " &7is now busy...")) + return True + + +def off(sender): + if not sender.hasPermission(use_permission): + noperm(sender) + return True + sender_name = sender.getName() + if sender_name not in busy_players: + msg(sender, "&7You are not busy! You cannot be even less busy! Are you perhaps bored?") + return True + busy_players.remove(sender_name) + broadcast(None, colorify(sender.getDisplayName() + " &7is no longer busy...")) + return True + + +def status(sender, args): + if not sender.hasPermission(base_permission): + noperm(sender) + return True + if len(args) == 0: + if sender.getName() in busy_players: + msg(sender, "&7You are currently busy.") + else: + msg(sender, "&7You are currently not busy.") + else: + target = server.getPlayer(args[0]) if target is None: - msg(sender, "That player is not online, they may be busy IRL, we never know") + msg(sender, "&7That player is not online") elif target.getName() in busy_players: - msg(sender, "Yes, %s&r is busy. Shhh..." % target.getDisplayName()) + msg(sender, "&7Player &e" + args[0] + " &7is currently busy.") else: - msg(sender, "No, you're good. Feel free to chat with %s&r!" % target.getDisplayName()) - - else: - unclear(sender) - return False + msg(sender, "&7Player &e" + args[0] + " &7is currently not busy.") return True @@ -109,14 +136,13 @@ def on_player_leave(event): reply_targets = {} -override_perm = "utils.imbusy.override" def whisper(sender, target_name): target = server.getPlayer(target_name) if target is not None: - if target is not sender and not sender.hasPermission(override_perm) and target.getName() in busy_players: + if target is not sender and not sender.hasPermission(override_permission) and target.getName() in busy_players: msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) return False @@ -132,7 +158,7 @@ def reply(sender): if sender.getName() in reply_targets: target = server.getPlayer(reply_targets[sender.getName()]) if target is not None: - if target is not sender and not sender.hasPermission(override_perm) and target.getName() in busy_players: + if target is not sender and not sender.hasPermission(override_permission) and target.getName() in busy_players: msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) return False @@ -175,7 +201,7 @@ def tpa_command_checker(sender, args): if len(args) == 0: return True target = server.getPlayer(args[0]) - if target is not None and target is not sender and not sender.hasPermission(override_perm) and target.getName() in busy_players: + if target is not None and target is not sender and not sender.hasPermission(override_permission) and target.getName() in busy_players: msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) return False return True @@ -188,7 +214,7 @@ def mail_command_checker(sender, args): if len(args) < 3 or args[0].lower() != "send": return True target = server.getPlayer(args[1]) - if target is not None and target is not sender and not sender.hasPermission(override_perm) and target.getName() in busy_players: + if target is not None and target is not sender and not sender.hasPermission(override_permission) and target.getName() in busy_players: msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) return False return True -- cgit v1.2.3 From 3859ad8e4065730458e990eabb9ae8d0fa14799a Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sat, 28 May 2016 21:43:59 +0200 Subject: Fix error on player quit for player.py --- player.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/player.py b/player.py index 0f4a47f..b1a2ddd 100644 --- a/player.py +++ b/player.py @@ -25,5 +25,6 @@ def on_join(event): @hook.event("player.PlayerQuitEvent","highest") def on_leave(event): - py_players.remove(get_py_player(event.getPlayer())) - + player = get_py_player(event.getPlayer()) + if player in py_players: + py_players.remove(player) -- cgit v1.2.3 From 7a905643eb772fd15c9fbd92942655c66b8dff0d Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sat, 28 May 2016 22:18:27 +0200 Subject: Enabled friends module, added friends check in imbusy, fixed small mistakes --- friends.py | 4 ++++ imbusy.py | 74 +++++++++++++++++++++++++++++++++++++++++++------------------- main.py | 2 ++ 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/friends.py b/friends.py index 870560e..130954a 100644 --- a/friends.py +++ b/friends.py @@ -5,6 +5,10 @@ friends = open_json_file("friends", {}) # {Player_UUID:[List_of_friend friend_join_sound = "random.orb" +def is_friend_of(player, other): + lst = friends.get(uid(player)) + return lst is not None and uid(other) in lst + @hook.event("player.PlayerJoinEvent", "high") # creates sound and sends a bold message on friend join def fjm(event): # friend join message diff --git a/imbusy.py b/imbusy.py index 2df0a03..c56ee69 100644 --- a/imbusy.py +++ b/imbusy.py @@ -12,6 +12,7 @@ ################################## from helpers import * +from friends import is_friend_of import org.bukkit.command.Command as Command imbusy_version = "v1.1.0" @@ -21,7 +22,7 @@ use_permission = "utils.busy.use" # for being busy override_permission = "utils.busy.override" # for being able to bother busy people -busy_players = [] +busy_players = {} # name : false/true where false is normal busy and true is super busy @hook.command("imbusy", @@ -51,6 +52,8 @@ def on_busy_command(sender, cmd, label, args): return off(sender) if arg0 in ("status", "check"): return status(sender, args[1:]) + if arg0 == "super": + return super_cmd(sender) return help(sender) @@ -60,11 +63,11 @@ def toggle(sender): return True sender_name = sender.getName() if sender_name in busy_players: - busy_players.remove(sender_name) - broadcast(None, colorify(sender.getDisplayName() + " &7is no longer busy...")) + del busy_players[sender_name] + broadcast(None, sender.getDisplayName() + " &7is no longer busy...") else: busy_players.append(sender_name) - broadcast(None, colorify(sender.getDisplayName() + " &7is now busy...")) + broadcast(None, sender.getDisplayName() + " &7is now busy...") return True @@ -75,6 +78,7 @@ def help(sender): msg(sender, "&e/busy on &7- Turns on busy status") msg(sender, "&e/busy off &7- Turns off busy status") msg(sender, "&e/busy status [player] &7- shows your or [player]'s current busy status") + msg(sender, "&e/busy super &7- sets your status to SUPER busy such that even friends can not bother you") return True @@ -83,11 +87,11 @@ def on(sender): noperm(sender) return True sender_name = sender.getName() - if sender_name in busy_players: + if busy_players.get(sender_name) is False: # can be None, False or True msg(sender, "&7You are already busy!") - return True - busy_players.append(sender_name) - broadcast(None, colorify(sender.getDisplayName() + " &7is now busy...")) + else: + busy_players[sender_name] = False # busy but not super busy + broadcast(None, sender.getDisplayName() + " &7is now busy...") return True @@ -99,8 +103,8 @@ def off(sender): if sender_name not in busy_players: msg(sender, "&7You are not busy! You cannot be even less busy! Are you perhaps bored?") return True - busy_players.remove(sender_name) - broadcast(None, colorify(sender.getDisplayName() + " &7is no longer busy...")) + del busy_players[sender_name] + broadcast(None, sender.getDisplayName() + " &7is no longer busy...") return True @@ -110,7 +114,10 @@ def status(sender, args): return True if len(args) == 0: if sender.getName() in busy_players: - msg(sender, "&7You are currently busy.") + if busy_players[sender_name] is False: + msg(sender, "&7You are currently busy.") + else: + msg(sender, "&7You are currently SUPER busy.") else: msg(sender, "&7You are currently not busy.") else: @@ -118,18 +125,33 @@ def status(sender, args): if target is None: msg(sender, "&7That player is not online") elif target.getName() in busy_players: - msg(sender, "&7Player &e" + args[0] + " &7is currently busy.") + if busy_players[target.getName()] is False: + msg(sender, "&7Player %s &7is currently busy." % target.getDisplayName()) + else: + msg(sender, "&7Player %s &7is currently SUPER busy." % target.getDisplayName()) else: - msg(sender, "&7Player &e" + args[0] + " &7is currently not busy.") + msg(sender, "&7Player %s &7is currently not busy." % target.getDisplayName()) + return True + + +def super_cmd(sender): + if not sender.hasPermission(use_permission): + noperm(sender) + return True + sender_name = sender.getName() + if busy_players.get(sender_name) is True: + msg(sender, "&7You are already SUPER busy!") + else: + busy_players[sender_name] = True # SUPER busy + broadcast(None, sender.getDisplayName() + " &7is now SUPER busy...") return True @hook.event("player.PlayerQuitEvent", "lowest") def on_player_leave(event): - try: - busy_players.remove(event.getPlayer().getName()) - except: - pass + player_name = event.getPlayer().getName() + if player_name in busy_players: + del busy_players[player_name] #---- Dicode for catching any bothering of busy people ---- @@ -138,11 +160,19 @@ def on_player_leave(event): reply_targets = {} +def can_send(sender, target): + if not target.getName() in busy_players: + return True + if target is sender or sender.hasPermission(override_permission): + return True + return busy_players[target.getName()] is False and is_friend_of(target, sender) + + def whisper(sender, target_name): target = server.getPlayer(target_name) if target is not None: - if target is not sender and not sender.hasPermission(override_permission) and target.getName() in busy_players: + if not can_send(sender, target): msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) return False @@ -158,7 +188,7 @@ def reply(sender): if sender.getName() in reply_targets: target = server.getPlayer(reply_targets[sender.getName()]) if target is not None: - if target is not sender and not sender.hasPermission(override_permission) and target.getName() in busy_players: + if not can_send(sender, target): msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) return False @@ -181,7 +211,7 @@ class CommandWrapper(Command): def execute(self, sender, label, args): try: - if self.checker(sender, args): + if not is_player(sender) or self.checker(sender, args): return self.wrapped.execute(sender, label, args) except: error(trace()) @@ -201,7 +231,7 @@ def tpa_command_checker(sender, args): if len(args) == 0: return True target = server.getPlayer(args[0]) - if target is not None and target is not sender and not sender.hasPermission(override_permission) and target.getName() in busy_players: + if target is not None and not can_send(sender, target): msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) return False return True @@ -214,7 +244,7 @@ def mail_command_checker(sender, args): if len(args) < 3 or args[0].lower() != "send": return True target = server.getPlayer(args[1]) - if target is not None and target is not sender and not sender.hasPermission(override_permission) and target.getName() in busy_players: + if target is not None and not can_send(sender, target): msg(sender, "&c[&fBUSY&c] %s&r is busy!" % target.getDisplayName()) return False return True diff --git a/main.py b/main.py index 651a547..64405eb 100644 --- a/main.py +++ b/main.py @@ -44,6 +44,8 @@ shared["load_modules"] = [ "calc", # Adds aliasing of chat words "chatalias", + # For players to point friends + "friends", # Plugin to locate laggy chunks. /lc lists chunks with more than n entities "lagchunks", # Adds /report and /rp, Stores reports with time and location -- cgit v1.2.3 From 28ac05ce0ae43b4598a01cbacbb7ee13f32b350a Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sat, 28 May 2016 22:22:51 +0200 Subject: Tweak imbusy permission nodes --- imbusy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/imbusy.py b/imbusy.py index c56ee69..5382f32 100644 --- a/imbusy.py +++ b/imbusy.py @@ -17,9 +17,9 @@ import org.bukkit.command.Command as Command imbusy_version = "v1.1.0" -base_permission = "utils.busy" # for /busy status -use_permission = "utils.busy.use" # for being busy -override_permission = "utils.busy.override" # for being able to bother busy people +base_permission = "utils.imbusy" # for /busy status +use_permission = "utils.imbusy.use" # for being busy +override_permission = "utils.imbusy.override" # for being able to bother busy people busy_players = {} # name : false/true where false is normal busy and true is super busy -- cgit v1.2.3 From a19f0b5bdc5b05496b2d70c78f891fbc7cc7711e Mon Sep 17 00:00:00 2001 From: Pepich Date: Sat, 28 May 2016 22:33:38 +0200 Subject: Added support for /rl; Made comments more precise --- chatalias.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/chatalias.py b/chatalias.py index 07f132f..7295cca 100644 --- a/chatalias.py +++ b/chatalias.py @@ -55,11 +55,18 @@ permission_FINFO = "utils.alias.finfo" # CODE # ######## -# OnEnable +# OnModuleLoad enabled = helpers_version in helpers_versions if not enabled: error = colorify("&6Incompatible versions detected (&chelpers.py&6)") - +for player in Server.getOnlinePlayers(): + if enabled: + t = threading.Thread(target=load_data, args=(uid(event.getPlayer()), )) + t.daemon = True + t.start() + else: + if event.getPlayer().hasPermission(permission_FINFO): + disabled_fallback(event.getPlayer()) def safe_open_json(uuid): if not os.path.exists("plugins/redstoner-utils.py.dir/files/aliases"): -- cgit v1.2.3 From 7da3fd5b717c9bb73576802a8b1e73ac40e8214f Mon Sep 17 00:00:00 2001 From: Pepich Date: Sat, 28 May 2016 22:35:28 +0200 Subject: That's an "s", not an "S" ._. --- chatalias.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chatalias.py b/chatalias.py index 7295cca..1069ef3 100644 --- a/chatalias.py +++ b/chatalias.py @@ -59,7 +59,7 @@ permission_FINFO = "utils.alias.finfo" enabled = helpers_version in helpers_versions if not enabled: error = colorify("&6Incompatible versions detected (&chelpers.py&6)") -for player in Server.getOnlinePlayers(): +for player in server.getOnlinePlayers(): if enabled: t = threading.Thread(target=load_data, args=(uid(event.getPlayer()), )) t.daemon = True -- cgit v1.2.3 From c534d9316a06ed732ff1f3d0daca19dd693b1761 Mon Sep 17 00:00:00 2001 From: Pepich Date: Sat, 28 May 2016 22:40:08 +0200 Subject: Moved OnModuleLoad to bottom of file --- chatalias.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/chatalias.py b/chatalias.py index 1069ef3..cb7d80c 100644 --- a/chatalias.py +++ b/chatalias.py @@ -55,19 +55,6 @@ permission_FINFO = "utils.alias.finfo" # CODE # ######## -# OnModuleLoad -enabled = helpers_version in helpers_versions -if not enabled: - error = colorify("&6Incompatible versions detected (&chelpers.py&6)") -for player in server.getOnlinePlayers(): - if enabled: - t = threading.Thread(target=load_data, args=(uid(event.getPlayer()), )) - t.daemon = True - t.start() - else: - if event.getPlayer().hasPermission(permission_FINFO): - disabled_fallback(event.getPlayer()) - def safe_open_json(uuid): if not os.path.exists("plugins/redstoner-utils.py.dir/files/aliases"): os.makedirs("plugins/redstoner-utils.py.dir/files/aliases") @@ -365,3 +352,17 @@ remotes = { "remove": rremove, "list": rlist_alias, } + +# OnModuleLoad + +enabled = helpers_version in helpers_versions +if not enabled: + error = colorify("&6Incompatible versions detected (&chelpers.py&6)") +for player in server.getOnlinePlayers(): + if enabled: + t = threading.Thread(target=load_data, args=(uid(event.getPlayer()), )) + t.daemon = True + t.start() + else: + if event.getPlayer().hasPermission(permission_FINFO): + disabled_fallback(event.getPlayer()) -- cgit v1.2.3 From c3189639f09723500f6597917369e601a44c68cb Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sat, 28 May 2016 23:05:43 +0200 Subject: Fixes and stuff --- chatalias.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/chatalias.py b/chatalias.py index cb7d80c..449a68f 100644 --- a/chatalias.py +++ b/chatalias.py @@ -191,6 +191,8 @@ def radd(sender, args): if args[3].lower() == "false": plugin_header(target, "Alias") msg(target, "&cPlayer " + sender_name + " &cis creating an alias for you!") + elif args[3].lower() != "true": + args[2] += " " + args[3] if not sender.hasPermission(permission_ALL) and len(data[uid(sender)]) >= int(get_permission_content(target, permission_AMOUNT)): msg(sender, "&cCould not create alias: Max_limit reached!") if args[3].lower() == "false": @@ -274,7 +276,7 @@ def rlist_alias(sender, args): plugin_header(sender, "Alias") target = get_player(args[0]) if is_player(sender): - sender_name = colorify(sender.getDisplayName) + sender_name = colorify(sender.getDisplayName()) else: sender_name = colorify("&6Console") if len(args) == 1: @@ -282,11 +284,9 @@ def rlist_alias(sender, args): msg(sender, "Player " + args[0] + " has following aliases (" + str(len(data[uid(target)])) + " in total):") if args[1].lower() == "false": plugin_header(target, "Alias") - msg(target, "&cPlayer " + sender_name + " &cis listing your aliases (" + str(len(data[uid(target)])) + " in total):") + msg(target, "&cPlayer " + sender_name + " &cis listing your aliases") for word, alias in data[str(uid(target))].items(): msg(sender, colorify("&7") + word + colorify("&7 -> ") + alias, usecolor=target.hasPermission("essentials.chat.color")) - if args[1].lower() == "false": - msg(target, colorify("&7") + word + colorify("&7 -> ") + alias, usecolor=target.hasPermission("essentials.chat.color")) return True @@ -341,15 +341,21 @@ def save_data_thread(uuid): # Subcommands: subcommands = { "help": help, + "?": help, "add": add, "remove": remove, + "del": remove, + "delete": remove, "player": remote, + "remote": remote, "list": list_alias } remotes = { "add": radd, "remove": rremove, + "del": rremove, + "delete": rremove, "list": rlist_alias, } @@ -360,9 +366,9 @@ if not enabled: error = colorify("&6Incompatible versions detected (&chelpers.py&6)") for player in server.getOnlinePlayers(): if enabled: - t = threading.Thread(target=load_data, args=(uid(event.getPlayer()), )) + t = threading.Thread(target=load_data, args=(uid(player), )) t.daemon = True t.start() else: - if event.getPlayer().hasPermission(permission_FINFO): - disabled_fallback(event.getPlayer()) + if player.hasPermission(permission_FINFO): + disabled_fallback(player) -- cgit v1.2.3 From e35fadc353f764a22d1d2c4b29463c81d091b36b Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 29 May 2016 20:55:10 +0200 Subject: Added/fixed torch breaker setting. Added a few missing saveSettings() calls. Fixed /set on turning it off and vice-versa for boolean settings that are enabled by default. A few more tweaks. --- blockplacemods.py | 181 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 101 insertions(+), 80 deletions(-) diff --git a/blockplacemods.py b/blockplacemods.py index 8d18699..d012e54 100644 --- a/blockplacemods.py +++ b/blockplacemods.py @@ -9,7 +9,7 @@ import org.bukkit.inventory.ItemStack as ItemStack import org.bukkit.Material as Material import org.bukkit.event.block.Action as Action import org.bukkit.block.BlockFace as BlockFace -import org.bukkit.scheduler.BukkitRunnable as Runnable +import org.bukkit.scheduler.BukkitRunnable as BukkitRunnable """ # Permissions: @@ -38,11 +38,11 @@ settingInformation = dict( #[setting type, identifying description, detailed des "Sets your preferred default furnace contents to your currently held itemstack. Use an empty hand to empty a slot, or /toggle furnace clear to clear all slots.", ["cooker", "fillf"], 2 ], - #torch = [0, - # "removal of torches you place on redstone blocks", - # "Toggles whether redstone torches which you place on redstone blocks will be deleted after a short amount of delay.", - # ["redstonetorch", "tor"] - #], + torch = [0, + "removal of torches you place on redstone blocks", + "Toggles whether redstone torches which you place on redstone blocks will be deleted after a short amount of delay.", + ["redstonetorch", "tor"] + ], piston = [2, "rotating pistons, droppers and hoppers to face the block you place them against", "Toggles whether pistons or sticky pistons which you place will be rotated to face the block which you placed them against.", @@ -66,7 +66,7 @@ defaults = { 2: list } -faces = { +piston_faces = { BlockFace.DOWN : 0, BlockFace.UP : 1, BlockFace.NORTH : 2, @@ -75,6 +75,14 @@ faces = { BlockFace.EAST : 5 } +torch_faces = { + 1: BlockFace.WEST, + 2: BlockFace.EAST, + 3: BlockFace.NORTH, + 4: BlockFace.SOUTH, + 5: BlockFace.DOWN +} + playerSettings = open_json_file("blockplacemods", {}) for setting, details in settingInformation.iteritems(): @@ -128,14 +136,14 @@ def toggle_command(sender, command, label, args): elif arg2 in ("toggle", "switch"): new = not enabled elif arg2 in ("on", "enable"): - new = not default + new = True elif arg2 in ("off", "disable"): - new = default + new = False else: return " &cArgument '%s' was not recognized. \n Use &o/toggle %s info &cfor more information" % (arg2, setting) - if enabled == new: + if enabled is new: return " &cAlready %s: &a%s" % ("enabled" if enabled else "disabled", details[1]) - if new == default: + if new is default: values.remove(uuid) else: values.append(uuid) @@ -150,10 +158,11 @@ def toggle_command(sender, command, label, args): if arg2 == "clear": if enabled: del values[uuid] + saveSettings() return " &aDisabled " + details[1] return " &cAlready disabled: " + details[1] - if arg2 == "details": + if arg2 == "info": return " &aSetting %s:\n &9%s \n&6Accepted arguments: [|clear|details]" % (setting, details[2]) slot = int(arg2) if arg2.isdigit() else 0 @@ -166,10 +175,11 @@ def toggle_command(sender, command, label, args): items = values[uuid] if slot in items: del items[slot] - saveSettings() if len(items) == 0: del items + saveSettings() return " &aDisabled " + details[1] + saveSettings() 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] @@ -198,59 +208,63 @@ def isEnabled(toggleSetting, uuid): @hook.event("block.BlockPlaceEvent", "monitor") def on_block_place(event): - if event.isCancelled(): - return - player = event.getPlayer() - if not is_creative(player): - return - - 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 - - - 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.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) - """ - + try: - 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())]) + if event.isCancelled(): + return + player = event.getPlayer() + if not is_creative(player): + return + + 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 + + + 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.REDSTONE_TORCH_ON + and isEnabled("torch", uuid) + and player.hasPermission("utils.toggle.torch") + and block.getData() in torch_faces + and block.getRelative(torch_faces[block.getData()]).getType() is Material.REDSTONE_BLOCK + ): + torches_to_break.append(block) + + + elif (material in (Material.PISTON_BASE, Material.PISTON_STICKY_BASE) + and isEnabled("piston", uuid) + and player.hasPermission("utils.toggle.piston") + ): + block.setData(piston_faces[block.getFace(event.getBlockAgainst())]) + except: + error(trace()) @hook.event("player.PlayerInteractEvent", "monitor") @@ -269,29 +283,36 @@ def on_interact(event): if not event2.isCancelled(): block.setData(block.getData() - 1 if block.getData() > 0 else 3) -""" + break_torches = True torches_to_break = deque() def stop_breaking_torches(): break_torches = False - info("Interrupted torch breaking thread") + info("[BlockPlaceMods] Interrupted torch breaking thread") + +class JBukkitRunnable(BukkitRunnable): -class torch_breaker(Runnable): + def __init__(self, func): + self.run = func - def run(): - try: - if break_torches: - for i in range(len(torches_to_break)): - block = torches_to_break.popleft() - mat = block.getType() - if mat == Material.REDSTONE_TORCH_OFF: - block.setTypeId(0) - elif mat == Material.REDSTONE_TORCH_ON: +def torch_breaker(): + + try: + if break_torches: + for i in range(len(torches_to_break)): + block = torches_to_break.popleft() + mat = block.getType() + if mat == Material.REDSTONE_TORCH_OFF: + block.setTypeId(0) + elif mat == Material.REDSTONE_TORCH_ON: + if block.getData() in torch_faces and block.getRelative(torch_faces[block.getData()]).getType() is Material.REDSTONE_BLOCK: torches_to_break.append(block) - except: - error(trace()) -""" + except: + error(trace()) + +def schedule_torch_breaker(): + JBukkitRunnable(torch_breaker).runTaskTimer(server.getPluginManager().getPlugin("RedstonerUtils"), 0, 1) -- cgit v1.2.3 From 5a757b7fb10a959c245d29b3eaddd69325f1ba55 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 29 May 2016 20:56:29 +0200 Subject: Removed @hook.enable decs from modules, added them to the on_enable() method of main.py. --- imbusy.py | 1 - main.py | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/imbusy.py b/imbusy.py index 5382f32..05049c5 100644 --- a/imbusy.py +++ b/imbusy.py @@ -257,7 +257,6 @@ def on_player_command_preprocess(event): event.setCancelled(True) -@hook.enable def replace_ess_commands(): try: diff --git a/main.py b/main.py index 64405eb..fba0c5a 100644 --- a/main.py +++ b/main.py @@ -19,12 +19,17 @@ except: @hook.enable def on_enable(): + if "blockplacemods" in shared["modules"]: + shared["modules"]["blockplacemods"].schedule_torch_breaker() + if "imbusy" in shared["modules"]: + shared["modules"]["imbusy"].replace_ess_commands() info("RedstonerUtils enabled!") @hook.disable def on_disable(): - shared["modules"]["reports"].stop_reporting() + if "reports" in shared["modules"]: + shared["modules"]["reports"].stop_reporting() info("RedstonerUtils disabled!") -- cgit v1.2.3 From 8e4f30a017650fc103ccf580aba37986728abd64 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 29 May 2016 21:08:28 +0200 Subject: Changed command blacklist to a whitelist. Added /svs commands to show whitelisted commands. Added a few more command aliases. Added maximum line count and maximum line size. --- serversigns.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/serversigns.py b/serversigns.py index d9f2a44..d5a4829 100644 --- a/serversigns.py +++ b/serversigns.py @@ -5,7 +5,23 @@ import java.util.UUID as UUID import org.bukkit.Material as Material import org.bukkit.block.BlockFace as BlockFace -blocked_cmds = tuple(shared["modules"]["misc"].sudo_blacklist) + ("pex", "kick", "ban", "tempban", "reload", "op", "deop", "whitelist") +commands_whitelist = ( + "mail", "email", "memo", + "echo", "ping", + "cg join", + "cg info", + "chatgroup join", + "chatgroup info", + "i", + "item", + "p h", "plot home", "plot h", "p home", "plotme home", "plotme h", + "up", + "tppos", + "seen" +) + +max_line_length = 256 +max_lines = 20 def load_signs(): signs_obj = open_json_file("serversigns", []) @@ -20,9 +36,11 @@ def save_signs(): signs_obj.append(key + tuple(value)) save_json_file("serversigns", signs_obj) -signs = load_signs() # {("world", x, y, z): ["owner_id", "msg1", "msg2"]} +# {("world", x, y, z): ["owner_id", "msg1", "msg2"]} +signs = load_signs() -lines = {} # Accumulated messages so players can have longer messages: {"Dico200": "Message...........", ""} +# Accumulated messages so players can have longer messages: {"Dico200": "Message...........", ""} +lines = {} def fromLoc(bLoc): """ @@ -92,7 +110,8 @@ 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", "info", "clear", "help", "switch", "reverse", "unclaim"), + 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) @@ -105,7 +124,7 @@ def svs_command(sender, command, label, args): 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" + 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" @@ -120,7 +139,12 @@ def svs_command(sender, command, label, args): 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"): + return signsMsg("Whitelisted commands: &3" + ", ".join(commands_whitelist), 'a') #------------------------------------------------------------------------------------------- block = sender.getTargetBlock(None, 5) @@ -144,7 +168,7 @@ def svs_command(sender, command, label, args): uuid = uid(target) if sign != None: if sign[0] == uuid: - return signsMsg("The" + signName + " was already owned by that player") + return signsMsg("The " + signName + " was already owned by that player") else: sign[0] = uuid else: @@ -156,7 +180,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 == "info": + if arg1 in ("info", "lines"): sign_lines = "" for id, line in enumerate(sign[1:]): sign_lines += ("\n &a%s: \"&f%s&a\"" % (id + 1, line)) @@ -167,25 +191,43 @@ def svs_command(sender, command, label, args): #---------------------- Sub commands that require you to own targeted sign as well ------------------------- if arg1 == "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:]) Validate.isTrue(line != "" and line != None, signsMsg("You have to enter a message to add or accumulate")) key = sender.getName() global lines Validate.isTrue(key in lines or line[:1] != "/" or sender.hasPermission("utils.serversigns.command"), signsMsg("You cannot add commands to a sign!")) + if line[-2:] == "++": if key not in lines: lines[key] = "" + Validate.isTrue(len(lines[key]) + len(line[:-2]) + 1 <= max_line_length, signsMsg("This line would be too long, so the given message was not added to the accumulated message")) lines[key] += " " + line[:-2] return signsMsg("Added given message to the message you're accumulating. \nYour accumulated message is now as follows: \n&f%s" % lines[key], 'a') + if key in lines: line = (lines[key] + " " + line)[1:] - Validate.isTrue(line[0] != "/" or line.split(" ")[0][1:] not in blocked_cmds, signsMsg("Usage of that command with server signs is prohibited")) + Validate.isTrue(len(line) <= max_line_length, signsMsg("This line would be too long, so it was not added to the sign. It is however still accumulated.")) + + if line[0] == "/": + cmd = line[1:].lower() + whitelisted = False + for wl_cmd in commands_whitelist: + if cmd[:len(wl_cmd)] == wl_cmd: + whitelisted = True + break + Validate.isTrue(whitelisted, signsMsg("That command is not whitelisted for use with serversigns")) + + if key in lines: + del lines[key] + sign.append(colorify(line) if line[0] != "/" else line) save_signs() return signsMsg("Added line \"&f%s&a\" to the %s" % (line, signName), 'a') - if arg1 == "remove": + if arg1 in ("remove", "rem", "del", "delete"): Validate.notNone(arg2, signsMsg("You have to enter the ID of the message to remove!")) try: id = int(arg2) @@ -220,6 +262,7 @@ def svs_command(sender, command, label, args): 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 From a0a7d43a3820b8daeede9b0b85a8a2f5a19c122d Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 29 May 2016 21:29:36 +0200 Subject: Tweak comment above imbusy, removed credits, removed a useless comment with an old line of code --- imbusy.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/imbusy.py b/imbusy.py index 05049c5..ec6c57b 100644 --- a/imbusy.py +++ b/imbusy.py @@ -1,15 +1,12 @@ -################################## -# I'M BUSY! Plugin by Curs3d # -# Concept by CookieManors :D # -################################## -# This plugin permits users to # -# send a command that renders # -# them "busy", not letting them # -# to get tpa requests or direct # -# messages, except from console. # -# On restart, all busy data will # -# be cleared. # -################################## +""" +This plugin permits users to +send a command that renders +them "busy", not letting them +to get tpa requests or direct +messages, except from console. +On restart, all busy data will +be cleared. +""" from helpers import * from friends import is_friend_of @@ -37,7 +34,6 @@ def on_busy_command(sender, cmd, label, args): plugin_header(recipient = sender, name = "I'M BUSY!") - #args = array_to_list(args) if not sender.hasPermission(base_permission): noperm(sender) return True -- cgit v1.2.3 From 33d8fd2f08df21052cb2c9a6b30b49baa61305cd Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 29 May 2016 22:18:42 +0200 Subject: Removed Pan from pythoners, added Pep, added essentials:esudo to sudo_blacklist --- misc.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/misc.py b/misc.py index 0fd4a6a..026650e 100644 --- a/misc.py +++ b/misc.py @@ -127,7 +127,7 @@ def on_interact(event): sudo_blacklist = ["pyeval", "script_backup_begin", "script_backup_end", "script_backup_error", "script_backup_database_begin", "script_backup_database_dumps", "script_backup_database_end", "script_backup_database_error", "script_backup_database_abort", "script_trim", "script_trim_result", "script_spigot_update", "script_disk_filled", "script_restart", "script_restart_abort", -"script_stop", "script_stop_abort", "script_shutdown", "stop", "esudo", "essentials:sudo", "sudo"] +"script_stop", "script_stop_abort", "script_shutdown", "stop", "esudo", "essentials:sudo", "sudo", "essentials:esudo"] @simplecommand("sudo", usage = " [cmd..]", @@ -212,12 +212,12 @@ def eval_thread(sender, code): msg(sender, ">>> %s: %s" % (eclass.__name__, e) + "\n ", False, "c") thread.exit() -pythoners = [ -"e452e012-2c82-456d-853b-3ac8e6b581f5", # Nemes -"ae795aa8-6327-408e-92ab-25c8a59f3ba1", # jomo -"305ccbd7-0589-403e-a45b-d791dcfdee7d", # PanFritz -"51f2ad3c-6cc8-40ea-aa2b-f25970316921" # Dico -] +pythoners = ( + "e452e012-2c82-456d-853b-3ac8e6b581f5", # Nemes + "ae795aa8-6327-408e-92ab-25c8a59f3ba1", # jomo + "d2693e91-93e1-4e3f-929f-f38e1ce8df03", # Pepich1851 + "51f2ad3c-6cc8-40ea-aa2b-f25970316921" # Dico200 +) @simplecommand("pyeval", usage = "[code..]", -- cgit v1.2.3 From 361da9e049ec9b575b2b78eb7b663e6efeff6950 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Sun, 29 May 2016 23:49:45 +0200 Subject: Chatalias: Fixed all the things (permission AMOUNT, permission LENGTH, and more), incremented version number --- chatalias.py | 164 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 89 insertions(+), 75 deletions(-) diff --git a/chatalias.py b/chatalias.py index 449a68f..0e2b297 100644 --- a/chatalias.py +++ b/chatalias.py @@ -1,14 +1,4 @@ -############################################ -# Alias v2.0 by Pepich # -# Changes to previous version from curs3d: # -# Dynamic alias limit from permissions # -# AC/CG/MSG support # -# Color support # -# Bugfixes # -# # -# TODO: # -# Add command support... # -############################################ +# TODO: Add cg/ac/msg support import os import mysqlhack @@ -20,15 +10,14 @@ from secrets import * # Version number and requirements -alias_version = "2.0.0" +alias_version = "2.1.0" helpers_versions = ["1.1.0", "2.0.0"] enabled = False -error = colorify("&cUnspecified error") +error_msg = colorify("&cUnspecified error") commands_per_page = 5 global_aliases = {"./":"/"} data = {} -# DON'T SET THIS TO TRUE! MySQL requestst are NOT ASYNC yet! (And for some reason it doesn't want to store any data ._.) -use_mysql = False +use_mysql = True # Permissions: @@ -60,8 +49,8 @@ def safe_open_json(uuid): os.makedirs("plugins/redstoner-utils.py.dir/files/aliases") value = open_json_file("aliases/" + uuid) if value is None: - value = global_aliases - save_json_file("aliases/" + uuid, value) + value = dict(global_aliases) + save_json_file("aliases/" + uuid, value) return value @@ -69,6 +58,9 @@ def safe_open_json(uuid): usage="/ [...]", desc="Allows aliasing of words") def on_alias_command(sender, cmd, label, args): + if not is_player(sender): + msg(sender, "&cThe console cannot use aliases!") + return True try: args = array_to_list(args) if not enabled: @@ -130,24 +122,23 @@ def on_join(event): @hook.event("player.AsyncPlayerChatEvent", "high") def on_player_chat(event): - try: - if enabled: - if event.isCancelled(): - return - if not hasPerm(event.getPlayer(), permission_USE): + if enabled: + if event.isCancelled(): + return + player = event.getPlayer() + if not hasPerm(player, permission_USE): + return + msg_limit = int(get_permission_content(player, permission_LENGTH)) + for alias, value in data[str(uid(player))].items(): + if player.hasPermission("essentials.chat.color"): + event.setMessage(event.getMessage().replace(colorify(alias), colorify(value))) + else: + event.setMessage(event.getMessage().replace(alias, value)) + if not player.hasPermission(permission_ALL) and len(event.getMessage()) > msg_limit: + event.setCancelled(True) + plugin_header(player, "Alias") + msg(player, "The message you wanted to generate would exceed the length limit limit of %d. Please make it shorter!" % msg_limit) return - for alias, value in data[str(uid(event.getPlayer()))].items(): - if not event.getPlayer().hasPermission(permission_ALL) and len(event.getMessage()) > int(get_permission_content(event.getPlayer(), permission_LENGTH)): - event.setCanceled(True) - plugin_header(event.getPlayer, "Alias") - msg(event.getPlayer(), "The message you wanted to generate would exceed your limit. Please make it shorter!") - return - if event.getPlayer().hasPermission("essentials.chat.color"): - event.setMessage(event.getMessage().replace(colorify(alias), colorify(value))) - else: - event.setMessage(event.getMessage().replace(alias, value)) - except: - print(trace()) def hasPerm(player, permission): @@ -159,7 +150,7 @@ def disabled_fallback(receiver): msg(receiver, colorify("&cUnknown command. Use &e/help&c, &e/plugins &cor ask a mod.")) else: msg(receiver, colorify("&cPlugin alias v" + alias_version + " has experienced an &eEMERGENCY SHUTDOWN:")) - msg(receiver, error) + msg(receiver, error_msg) msg(receiver, colorify("&cPlease contact a dev/admin (especially pep :P) about this to take a look at it.")) @@ -169,11 +160,11 @@ def can_remote(player): def add(sender, args): plugin_header(sender, "Alias") - if not sender.hasPermission(permission_ALL) and len(data[uid(sender)]) >= int(get_permission_content(sender, permission_AMOUNT)): - msg(sender, "&cCould not create alias: Max_limit reached!") - return True + uuid = uid(sender) args = [args[0]] + [" ".join(args[1:])] - if not add_alias_data(uid(sender), str(args[0]), args[1]): + if (args[0] not in data[uuid]) and is_alias_limit_reached(sender, sender): + return True + if not add_alias_data(uuid, str(args[0]), args[1]): msg(sender, colorify("&c") + "Could not add this alias because it would cause some sequences to be replaced multiple times", usecolor = False) return True msg(sender, colorify("&7Alias: ") + args[0] + colorify("&7 -> " + args[1] + colorify("&7 was succesfully created!")), usecolor=sender.hasPermission("essentials.chat.color")) @@ -187,20 +178,21 @@ def radd(sender, args): sender_name = colorify(sender.getDisplayName()) else: sender_name = colorify("&6Console") - target = get_player(args[0]) + target = server.getPlayer(args[0]) + if target == None: + msg(sender, "&cThat player is not online") + return True + uuid = uid(target) if args[3].lower() == "false": plugin_header(target, "Alias") msg(target, "&cPlayer " + sender_name + " &cis creating an alias for you!") elif args[3].lower() != "true": args[2] += " " + args[3] - if not sender.hasPermission(permission_ALL) and len(data[uid(sender)]) >= int(get_permission_content(target, permission_AMOUNT)): - msg(sender, "&cCould not create alias: Max_limit reached!") - if args[3].lower() == "false": - msg(target, "&cCould not create alias: Max_limit reached!") + if (args[1] not in data[uuid]) and is_alias_limit_reached(target, sender, args[3].lower() == "false"): return True if len(args) == 3: args += ["true"] - if not add_alias_data(uid(target), str(args[1]), str(args[2])): + if not add_alias_data(uuid, str(args[1]), str(args[2])): message = colorify("&c") + "Could not add this alias because it would cause some sequences to be replaced multiple times" msg(sender, message) if args[3].lower() == "false": @@ -212,6 +204,19 @@ def radd(sender, args): return True +def is_alias_limit_reached(player, recipient, not_silent = False): + if player.hasPermission(permission_ALL): + return False + alias_limit = int(get_permission_content(player, permission_AMOUNT)) + if len(data[uid(player)]) > alias_limit: + message = ("&cYour limit of %d has been reached" if player is recipient else "&cThe limit of %d has been reached for that player") % alias_limit + msg(recipient, message) + if not_silent: + msg(player, message) + return True + return False + + def add_alias_data(puuid, aliased, new_alias): prior = data[puuid] @@ -298,45 +303,54 @@ def remote(sender, args): def load_data(uuid): - try: - load_data_thread(uuid) -# t = threading.Thread(target=load_data_thread, args=(uuid)) -# t.daemon = True -# t.start() - except: - print(trace()) - -def load_data_thread(uuid): if use_mysql: - conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") - curs = conn.cursor() - curs.execute("SELECT alias FROM alias WHERE uuid = ?", (uuid, )) - results = curs.fetchall() - if len(results) == 0: - results = global_aliases - curs.execute("INSERT INTO alias VALUES (?,?)", (uuid, results, )) - data[uuid] = results + try: + t = threading.Thread(target=load_data_thread, args=(uuid,)) + t.daemon = True + t.start() + except: + error(trace()) else: data[uuid] = safe_open_json(uuid) +def load_data_thread(uuid): + conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + curs = conn.cursor() + curs.execute("SELECT `alias` FROM `chatalias` WHERE `uuid` = ?;", (uuid, )) + results = curs.fetchall() + if len(results) == 0: + value = dict(global_aliases) + curs.execute("INSERT INTO `chatalias` VALUES (?,?);", (uuid, json_dumps(results), )) + conn.commit() + else: + value = json_loads(results[0][0]) + curs.close() + conn.close() + data[uuid] = value -def save_data(uuid): - try: - save_data_thread(uuid) -# t = threading.Thread(target=save_data_thread, args=(uuid)) -# t.daemon = True -# t.start() - except: - print(trace()) -def save_data_thread(uuid): +def save_data(uuid): if use_mysql: - conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") - curs = conn.cursor() - curs.execute("UPDATE alias SET alias = ? WHERE uuid = ?", (data[uuid], uuid, )) + try: + t = threading.Thread(target=save_data_thread, args=(uuid,)) + t.daemon = True + t.start() + except: + error(trace()) else: save_json_file("aliases/" + uuid, data[uuid]) +def save_data_thread(uuid): + conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver") + curs = conn.cursor() + try: + curs.execute("UPDATE `chatalias` SET `alias` = ? WHERE `uuid` = ?;", (json_dumps(data[uuid]), uuid, )) + except: + error(trace()) + conn.commit() + curs.close() + conn.close() + # Subcommands: subcommands = { @@ -363,7 +377,7 @@ remotes = { enabled = helpers_version in helpers_versions if not enabled: - error = colorify("&6Incompatible versions detected (&chelpers.py&6)") + error_msg = colorify("&6Incompatible versions detected (&chelpers.py&6)") for player in server.getOnlinePlayers(): if enabled: t = threading.Thread(target=load_data, args=(uid(player), )) -- cgit v1.2.3 From fe32e7a49cea69678101da332827ca7603a8fe90 Mon Sep 17 00:00:00 2001 From: Dico200 Date: Mon, 30 May 2016 00:05:49 +0200 Subject: Cleaned up some of helpers.py --- chatalias.py | 4 +--- helpers.py | 27 ++------------------------- loginsecurity.py | 1 + 3 files changed, 4 insertions(+), 28 deletions(-) diff --git a/chatalias.py b/chatalias.py index 0e2b297..bc21e13 100644 --- a/chatalias.py +++ b/chatalias.py @@ -5,8 +5,6 @@ import mysqlhack import org.bukkit as bukkit from org.bukkit import * from helpers import * -from traceback import format_exc as trace -from secrets import * # Version number and requirements @@ -208,7 +206,7 @@ def is_alias_limit_reached(player, recipient, not_silent = False): if player.hasPermission(permission_ALL): return False alias_limit = int(get_permission_content(player, permission_AMOUNT)) - if len(data[uid(player)]) > alias_limit: + if len(data[uid(player)]) >= alias_limit: message = ("&cYour limit of %d has been reached" if player is recipient else "&cThe limit of %d has been reached for that player") % alias_limit msg(recipient, message) if not_silent: diff --git a/helpers.py b/helpers.py index 4c32e24..d6e46bd 100755 --- a/helpers.py +++ b/helpers.py @@ -11,8 +11,6 @@ import org.bukkit.block as bblock import org.bukkit.event.entity as entity import org.bukkit.command.ConsoleCommandSender from org.bukkit.entity import * -from player import get_py_player -from player import py_players #Imports for async query from secrets import * @@ -254,19 +252,6 @@ def save_json_file(filename, obj): error("Failed to write to %s: %s" % (filename, e)) -def toggle(player, ls, name = "Toggle", add = None): - """ - Toggles presence of a player's UUID in a list - If add is given, True explicitely adds it whereas False removes it - """ - pid = uid(player) - if pid in ls or add == False: - ls.remove(pid) - msg(player, "&a%s turned off!" % name) - elif add != False: - ls.append(pid) - msg(player, "&a%s turned on!" % name) - def send_JSON_message(playername, message): bukkit.Bukkit.getServer().dispatchCommand(bukkit.Bukkit.getServer().getConsoleSender(), "tellraw " + playername + " " + message) @@ -298,21 +283,13 @@ def get_permission_content(player, permnode): perms = player.getEffectivePermissions() for perm in perms: if str(perm.getPermission()).startswith(permnode): - return str(perm.getPermission()).replace(permnode, "") - - -# Gets an online player from their name -def get_player(name): - for p in bukkit.Bukkit.getServer().getOnlinePlayers(): - if p.getName().lower() == name.lower(): - return p - return None + return str(perm.getPermission())[len(permnode):] def array_to_list(array): return_list = [] for a in array: - return_list += [a] + return_list.append(a) return return_list diff --git a/loginsecurity.py b/loginsecurity.py index edf51e9..4fbb307 100644 --- a/loginsecurity.py +++ b/loginsecurity.py @@ -7,6 +7,7 @@ from login_secrets import * #Don't forget to make login_secrets aswell import mysqlhack from com.ziclix.python.sql import zxJDBC from java.lang import Runnable +from player import get_py_player, py_players wait_time = 30 #seconds admin_perm = "utils.loginsecurity.admin" -- cgit v1.2.3