change indentation from 2 spaces to 4, fix #5

This commit is contained in:
jomo
2015-01-06 23:38:42 +01:00
parent 3435e99432
commit 9a916ed2cd
24 changed files with 1522 additions and 1522 deletions

80
abot.py
View File

@@ -5,59 +5,59 @@ answers = []
def load_answers():
global answers
answers = open_json_file("abot", [])
global answers
answers = open_json_file("abot", [])
# compile answers
for answer in answers:
answer["regex"] = [reg_compile(reg.lower()) for reg in answer["regex"]]
# compile answers
for answer in answers:
answer["regex"] = [reg_compile(reg.lower()) for reg in answer["regex"]]
def list_answers(sender):
for answer in answers:
msg(sender, "&e{")
msg(sender, " &eregex:")
for regex in answer["regex"]:
msg(sender, " " + regex.pattern, basecolor="a", usecolor = False)
msg(sender, " &epermission:")
msg(sender, " " + str(answer["hide-perm"]), basecolor="a", usecolor = False)
msg(sender, " &emessage:")
msg(sender, " " + "\n ".join(answer["message"].split("\n")))
msg(sender, "&e}")
for answer in answers:
msg(sender, "&e{")
msg(sender, " &eregex:")
for regex in answer["regex"]:
msg(sender, " " + regex.pattern, basecolor="a", usecolor = False)
msg(sender, " &epermission:")
msg(sender, " " + str(answer["hide-perm"]), basecolor="a", usecolor = False)
msg(sender, " &emessage:")
msg(sender, " " + "\n ".join(answer["message"].split("\n")))
msg(sender, "&e}")
@hook.command("abot")
def on_abot_command(sender, args):
plugin_header(sender, "AnswerBot")
if sender.hasPermission("utils.abot.admin"):
if not args:
msg(sender, "&2/abot list &eList all answers and their regex")
msg(sender, "&2/abot reload &eReload the config file")
elif args[0] == "list":
list_answers(sender)
elif args[0] == "reload":
load_answers()
msg(sender, "&2Reloaded!")
plugin_header(sender, "AnswerBot")
if sender.hasPermission("utils.abot.admin"):
if not args:
msg(sender, "&2/abot list &eList all answers and their regex")
msg(sender, "&2/abot reload &eReload the config file")
elif args[0] == "list":
list_answers(sender)
elif args[0] == "reload":
load_answers()
msg(sender, "&2Reloaded!")
else:
msg(sender)
else:
msg(sender)
else:
noperm(sender)
return True
noperm(sender)
return True
@hook.event("player.AsyncPlayerChatEvent", "low")
def on_chat(event):
sender = event.getPlayer()
message = event.getMessage().lower()
for answer in answers:
for regex in answer["regex"]:
if regex.search(message):
if not answer["hide-perm"] or not sender.hasPermission(answer["hide-perm"]):
plugin_header(sender, "AnswerBot")
msg(sender, answer["message"] + "\n ")
event.setCancelled(True)
info("(hidden) %s: '%s'" % (sender.getName(), message))
break
sender = event.getPlayer()
message = event.getMessage().lower()
for answer in answers:
for regex in answer["regex"]:
if regex.search(message):
if not answer["hide-perm"] or not sender.hasPermission(answer["hide-perm"]):
plugin_header(sender, "AnswerBot")
msg(sender, answer["message"] + "\n ")
event.setCancelled(True)
info("(hidden) %s: '%s'" % (sender.getName(), message))
break
load_answers()

View File

@@ -7,49 +7,49 @@ ac_toggle_list = []
ac_prefix = "&8[&cAC&8]"
def adminchat(sender, msg):
name = "&7{unknown}"
try:
name = sender.getDisplayName()
except AttributeError:
name = sender.getName()
broadcast(ac_permission, "%s &9%s&8: &b%s" % (ac_prefix, name, msg))
name = "&7{unknown}"
try:
name = sender.getDisplayName()
except AttributeError:
name = sender.getName()
broadcast(ac_permission, "%s &9%s&8: &b%s" % (ac_prefix, name, msg))
# ac toggle
@hook.command("act")
def on_act_command(sender, args):
if sender.hasPermission(ac_permission):
p = sender.getName()
if p in ac_toggle_list:
ac_toggle_list.remove(p)
msg(sender, "%s &aAC toggle: off" % ac_prefix)
if sender.hasPermission(ac_permission):
p = sender.getName()
if p in ac_toggle_list:
ac_toggle_list.remove(p)
msg(sender, "%s &aAC toggle: off" % ac_prefix)
else:
ac_toggle_list.append(p)
msg(sender, "%s &aAC toggle: on" % ac_prefix)
else:
ac_toggle_list.append(p)
msg(sender, "%s &aAC toggle: on" % ac_prefix)
else:
noperm(sender)
return True
noperm(sender)
return True
@hook.command("ac")
def on_ac_command(sender, args):
if sender.hasPermission(ac_permission):
if not checkargs(sender, args, 1, -1):
return True
adminchat(sender, " ".join(args))
else:
noperm(sender)
return True
if sender.hasPermission(ac_permission):
if not checkargs(sender, args, 1, -1):
return True
adminchat(sender, " ".join(args))
else:
noperm(sender)
return True
@hook.event("player.AsyncPlayerChatEvent", "low")
def on_chat(event):
sender = event.getPlayer()
msg = event.getMessage()
if sender.hasPermission(ac_permission) and not event.isCancelled():
if msg[:len(ac_key)] == ac_key:
adminchat(sender, msg[1:])
event.setCancelled(True)
elif sender.getName() in ac_toggle_list:
adminchat(sender, msg)
event.setCancelled(True)
sender = event.getPlayer()
msg = event.getMessage()
if sender.hasPermission(ac_permission) and not event.isCancelled():
if msg[:len(ac_key)] == ac_key:
adminchat(sender, msg[1:])
event.setCancelled(True)
elif sender.getName() in ac_toggle_list:
adminchat(sender, msg)
event.setCancelled(True)

190
badges.py
View File

@@ -2,136 +2,136 @@ from helpers import *
badges = open_json_file("badges", {})
badges_available = {
"helpful" : "A very helpful player",
"expert_minecraft" : "An expert in Minecraft",
"expert_coder" : "A good coder",
"oldtimer" : "A long time player",
"good_builder" : "A very good builder",
"friendly" : "Many think that this player is friendly",
"very_active" : "A very active player",
"trustworthy" : "This player is very trustworthy",
"helpful" : "A very helpful player",
"expert_minecraft" : "An expert in Minecraft",
"expert_coder" : "A good coder",
"oldtimer" : "A long time player",
"good_builder" : "A very good builder",
"friendly" : "Many think that this player is friendly",
"very_active" : "A very active player",
"trustworthy" : "This player is very trustworthy",
}
badges_perm_add = "utils.badges.add"
badges_perm_del = "utils.badges.delete"
def save_badges():
save_json_file("badges", badges)
save_json_file("badges", badges)
def get_badges(player):
sender_id = uid(player)
return badges.get(sender_id, [])
sender_id = uid(player)
return badges.get(sender_id, [])
def show_badges(sender, player):
player_badges = get_badges(player)
if player_badges:
msg(sender, "&6Badges of " + player.getName())
for key in player_badges:
msg(sender, "&b> &3&o%s" % badges_available[key])
else:
msg(sender, "&eThis player has no badges yet")
player_badges = get_badges(player)
if player_badges:
msg(sender, "&6Badges of " + player.getName())
for key in player_badges:
msg(sender, "&b> &3&o%s" % badges_available[key])
else:
msg(sender, "&eThis player has no badges yet")
def new_badge_event(player, badge):
msg(player, "")
msg(player, "&6Wow! You just received a badge!")
msg(player, "&b-> &3%s" % badges_available[badge])
msg(player, "&7Type /badge to see all your badges!")
msg(player, "")
player.playSound(player.getLocation(), "random.orb", 1, 1)
msg(player, "")
msg(player, "&6Wow! You just received a badge!")
msg(player, "&b-> &3%s" % badges_available[badge])
msg(player, "&7Type /badge to see all your badges!")
msg(player, "")
player.playSound(player.getLocation(), "random.orb", 1, 1)
def del_badge_event(player, badge):
msg(player, "&cWe took your badge \"%s\"." % badges_available[badge])
msg(player, "&cWe took your badge \"%s\"." % badges_available[badge])
def list_badges(sender):
if badges_available:
for key in badges_available.keys():
msg(sender, "&b> &3%s &7&o\"%s\"" % (key, badges_available[key]))
else:
msg(sender, "&cThere are currently no badges available")
if badges_available:
for key in badges_available.keys():
msg(sender, "&b> &3%s &7&o\"%s\"" % (key, badges_available[key]))
else:
msg(sender, "&cThere are currently no badges available")
def add_badge(sender, target, badge):
if badge in badges_available:
player_badges = get_badges(target)
if badge in player_badges:
msg(sender, "&cThis player got this badge already!")
return
player_badges.append(badge)
if player_badges:
badges[uid(target)] = player_badges
msg(sender, "&aYou just gave %s a new badge!" % target.getName())
new_badge_event(target, badge)
save_badges()
else:
msg(sender, "&cThere is no badge called %s. Check /badge list!" % badge)
if badge in badges_available:
player_badges = get_badges(target)
if badge in player_badges:
msg(sender, "&cThis player got this badge already!")
return
player_badges.append(badge)
if player_badges:
badges[uid(target)] = player_badges
msg(sender, "&aYou just gave %s a new badge!" % target.getName())
new_badge_event(target, badge)
save_badges()
else:
msg(sender, "&cThere is no badge called %s. Check /badge list!" % badge)
def del_badge(sender, target, badge):
if badge in badges_available.keys():
player_badges = get_badges(target)
if badge in player_badges:
player_badges.remove(badge)
badges[uid(target)] = player_badges
msg(sender, "&aYou just took %s from %s!" % (badge, target.getName()))
save_badges()
del_badge_event(target, badge)
return
msg(sender, "&c%s doesn't have this badge!" % target.getName())
else:
msg(sender, "&cThere is no badge called %s. Check /badge list!" % badge)
if badge in badges_available.keys():
player_badges = get_badges(target)
if badge in player_badges:
player_badges.remove(badge)
badges[uid(target)] = player_badges
msg(sender, "&aYou just took %s from %s!" % (badge, target.getName()))
save_badges()
del_badge_event(target, badge)
return
msg(sender, "&c%s doesn't have this badge!" % target.getName())
else:
msg(sender, "&cThere is no badge called %s. Check /badge list!" % badge)
@hook.command("badge", aliases=["badges", "rewards"])
def on_badge_command(sender, args):
argnum = int(len(args))
argnum = int(len(args))
# No arguments
if argnum is 0:
show_badges(sender, sender)
# No arguments
if argnum is 0:
show_badges(sender, sender)
# Length of arguments is 1
if argnum == 1:
# Length of arguments is 1
if argnum == 1:
# If only argument is "list"
if args[0].lower() == "list":
list_badges(sender)
return True
# If only argument is "list"
if args[0].lower() == "list":
list_badges(sender)
return True
# If only argument is a player name
target = server.getPlayer(args[0])
if is_player(target):
show_badges(sender, target)
return True
else:
msg(sender, "&cThere is no player called %s online." % args[0])
return True
# If only argument is a player name
target = server.getPlayer(args[0])
if is_player(target):
show_badges(sender, target)
return True
else:
msg(sender, "&cThere is no player called %s online." % args[0])
return True
msg(sender, "&cUnknown syntax: /badge <playername> &o&c /badge list")
return True
# Length of arguments is 3
if argnum == 3:
cmd = args[0].lower()
target = server.getPlayer(args[1])
new_badge = args[2].lower()
if cmd == "add":
if not sender.hasPermission(badges_perm_add):
noperm(sender)
msg(sender, "&cUnknown syntax: /badge <playername> &o&c /badge list")
return True
add_badge(sender, target, new_badge)
return True
if cmd == "take" or cmd == "del":
if not sender.hasPermission(badges_perm_del):
noperm(sender)
return True
del_badge(sender, target, new_badge)
return True
# Length of arguments is 3
if argnum == 3:
cmd = args[0].lower()
target = server.getPlayer(args[1])
new_badge = args[2].lower()
msg(sender, "&cUnknown syntax: /badge <add|take> <playername> <badge>")
return True
if cmd == "add":
if not sender.hasPermission(badges_perm_add):
noperm(sender)
return True
add_badge(sender, target, new_badge)
return True
if cmd == "take" or cmd == "del":
if not sender.hasPermission(badges_perm_del):
noperm(sender)
return True
del_badge(sender, target, new_badge)
return True
msg(sender, "&cUnknown syntax: /badge <add|take> <playername> <badge>")
return True

92
calc.py
View File

@@ -1,65 +1,65 @@
from helpers import *
calc_users = open_json_file("calc", [])
calc_users = open_json_file("calc", [])
math_operators = ["+", "-", "*", "/", "&", "|"]
ignore_operators = ["**", "&&", "||"] # ** may be too intensive, the others cause syntax errors
calc_perm = "utils.calc"
def calc(text):
"""
extracts a mathematical expression from `text`
returns (expression, result) or None
"""
expression = ""
should_calc = False
for char in text:
if char.isdigit() or (should_calc and char in [".", " "]):
expression += char
elif char in math_operators:
# calculation must include at least 1 operator
should_calc = True
expression += char
elif should_calc and char.isalpha():
# don't include any more text in the calculation
break
if should_calc and not any(op in expression for op in ignore_operators):
try:
result = str(eval(expression)) # pylint: disable = W0123
except: # pylint: disable = W0702
# we can run into all kinds of errors here
# most probably SyntaxError
return None
return (expression, result)
return None
"""
extracts a mathematical expression from `text`
returns (expression, result) or None
"""
expression = ""
should_calc = False
for char in text:
if char.isdigit() or (should_calc and char in [".", " "]):
expression += char
elif char in math_operators:
# calculation must include at least 1 operator
should_calc = True
expression += char
elif should_calc and char.isalpha():
# don't include any more text in the calculation
break
if should_calc and not any(op in expression for op in ignore_operators):
try:
result = str(eval(expression)) # pylint: disable = W0123
except: # pylint: disable = W0702
# we can run into all kinds of errors here
# most probably SyntaxError
return None
return (expression, result)
return None
@hook.event("player.AsyncPlayerChatEvent", "monitor")
def on_calc_chat(event):
sender = event.getPlayer()
message = event.getMessage()
if not event.isCancelled() and uid(sender) in calc_users and sender.hasPermission(calc_perm):
output = calc(message)
if output:
msg(sender, "&2=== Calc: &e" + output[0] + " &2= &c" + output[1])
sender = event.getPlayer()
message = event.getMessage()
if not event.isCancelled() and uid(sender) in calc_users and sender.hasPermission(calc_perm):
output = calc(message)
if output:
msg(sender, "&2=== Calc: &e" + output[0] + " &2= &c" + output[1])
@hook.command("calc", description="Toggles chat calculations")
def on_calc_command(sender, args):
plugin_header(sender, "Chat Calculator")
if not sender.hasPermission(calc_perm):
noperm(sender)
return True
if not checkargs(sender, args, 0, 1):
return True
if not is_player(sender):
msg(sender, "&cYou are not a player!" % sender)
return True
plugin_header(sender, "Chat Calculator")
if not sender.hasPermission(calc_perm):
noperm(sender)
return True
if not checkargs(sender, args, 0, 1):
return True
if not is_player(sender):
msg(sender, "&cYou are not a player!" % sender)
return True
toggle(sender, calc_users, name = "Calc")
save_json_file("calc", calc_users)
toggle(sender, calc_users, name = "Calc")
save_json_file("calc", calc_users)
status = "enabled" if uid(sender) in calc_users else "disabled"
msg(sender, "&6We just &e%s&6 Chat Calculator for you!" % status)
status = "enabled" if uid(sender) in calc_users else "disabled"
msg(sender, "&6We just &e%s&6 Chat Calculator for you!" % status)
return True
return True

View File

@@ -10,83 +10,83 @@ cg_toggle_list = []
@hook.command("chatgroup")
def on_chatgroup_command(sender, args):
plugin_header(sender, "ChatGroups")
sender_id = uid(sender)
if len(args) == 1 and args[0] == "leave":
if sender_id in groups.keys():
groupchat(sender, "left the group", True)
group = groups[sender_id]
del(groups[sender_id])
save_groups()
plugin_header(sender, "ChatGroups")
sender_id = uid(sender)
if len(args) == 1 and args[0] == "leave":
if sender_id in groups.keys():
groupchat(sender, "left the group", True)
group = groups[sender_id]
del(groups[sender_id])
save_groups()
else:
msg(sender, "&aYou can't leave no group, derp!")
elif len(args) == 1 and args[0] == "info":
if sender_id in groups.keys():
group = groups[sender_id]
msg(sender, "&aCurrent chatgroup: %s" % group)
users = []
for uuid, ugroup in groups.iteritems():
if ugroup == group:
usr = server.getPlayer(juuid(uuid))
if usr:
users.append(usr.getDisplayName())
msg(sender, "&aUsers in this group:")
msg(sender, "&a%s" % ", ".join(users))
else:
msg(sender, "&aYou're in no chatgroup.")
elif len(args) == 2 and args[0] == "join":
groups[sender_id] = args[1]
groupchat(sender, "joined the group", True)
save_groups()
msg(sender, "&aYour chatgroup is set to '%s'" % args[1])
msg(sender, "&aUse chat like '&e%s<message>' to send messages to this group." % cg_key)
else:
msg(sender, "&aYou can't leave no group, derp!")
elif len(args) == 1 and args[0] == "info":
if sender_id in groups.keys():
group = groups[sender_id]
msg(sender, "&aCurrent chatgroup: %s" % group)
users = []
for uuid, ugroup in groups.iteritems():
if ugroup == group:
usr = server.getPlayer(juuid(uuid))
if usr:
users.append(usr.getDisplayName())
msg(sender, "&aUsers in this group:")
msg(sender, "&a%s" % ", ".join(users))
else:
msg(sender, "&aYou're in no chatgroup.")
elif len(args) == 2 and args[0] == "join":
groups[sender_id] = args[1]
groupchat(sender, "joined the group", True)
save_groups()
msg(sender, "&aYour chatgroup is set to '%s'" % args[1])
msg(sender, "&aUse chat like '&e%s<message>' to send messages to this group." % cg_key)
else:
msg(sender, "&e/chatgroup join <name>")
msg(sender, "&e/chatgroup leave")
msg(sender, "&e/chatgroup info")
msg(sender, "&e/chatgroup join <name>")
msg(sender, "&e/chatgroup leave")
msg(sender, "&e/chatgroup info")
@hook.command("cgt")
def on_cgt_command(sender, args):
p = uid(sender)
if p in cg_toggle_list:
cg_toggle_list.remove(p)
msg(sender, "&8[&bCG&8] &e&oCG toggle: off")
else:
cg_toggle_list.append(p)
msg(sender, "&8[&bCG&8] &e&oCG toggle: on")
return True
p = uid(sender)
if p in cg_toggle_list:
cg_toggle_list.remove(p)
msg(sender, "&8[&bCG&8] &e&oCG toggle: off")
else:
cg_toggle_list.append(p)
msg(sender, "&8[&bCG&8] &e&oCG toggle: on")
return True
def groupchat(sender, message, ann = False):
group = groups.get(uid(sender))
if group == None:
msg(sender, "&cYou are not in a group!")
return
name = sender.getDisplayName()
if ann:
mesg = "&8[&bCG&8] &e&o%s&e&o %s" % (name, message)
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)
group = groups.get(uid(sender))
if group == None:
msg(sender, "&cYou are not in a group!")
return
name = sender.getDisplayName()
if ann:
mesg = "&8[&bCG&8] &e&o%s&e&o %s" % (name, message)
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)
def save_groups():
save_json_file("chatgroups", groups)
save_json_file("chatgroups", groups)
@hook.event("player.AsyncPlayerChatEvent", "normal")
def on_chat(event):
sender = event.getPlayer()
msge = event.getMessage()
if not event.isCancelled():
sender_id = uid(sender)
if msge[:len(cg_key)] == cg_key and sender_id in groups.keys():
groupchat(sender, msge[1:])
event.setCancelled(True)
elif sender_id in cg_toggle_list:
groupchat(sender, msge)
event.setCancelled(True)
sender = event.getPlayer()
msge = event.getMessage()
if not event.isCancelled():
sender_id = uid(sender)
if msge[:len(cg_key)] == cg_key and sender_id in groups.keys():
groupchat(sender, msge[1:])
event.setCancelled(True)
elif sender_id in cg_toggle_list:
groupchat(sender, msge)
event.setCancelled(True)

View File

@@ -6,59 +6,59 @@ from helpers import *
# receive info based on the user's IP. information provided by ipinfo.io
def ip_info(player):
data = json.load(urllib2.urlopen("http://ipinfo.io%s/json" % str(player.getAddress().getAddress())))
return data
data = json.load(urllib2.urlopen("http://ipinfo.io%s/json" % str(player.getAddress().getAddress())))
return data
# receive first join date based on the player data (may not be accurate)
def get_first_join(player):
first_join = int(player.getFirstPlayed())
dt = datetime.datetime.fromtimestamp(first_join/1000.0)
return "%s-%s-%s %s:%s:%s" % (str(dt.year), str(dt.month), str(dt.day), str(dt.hour), str(dt.minute), str(dt.second))
first_join = int(player.getFirstPlayed())
dt = datetime.datetime.fromtimestamp(first_join/1000.0)
return "%s-%s-%s %s:%s:%s" % (str(dt.year), str(dt.month), str(dt.day), str(dt.hour), str(dt.minute), str(dt.second))
# receive country based on the user's IP
def get_country(data):
return str(data.get("country"))
return str(data.get("country"))
def get_all_names(player):
uuid = str(player.getUniqueId()).replace("-", "")
names = json.load(urllib2.urlopen("https://api.mojang.com/user/profiles/%s/names" % uuid))
return ", ".join(names)
uuid = str(player.getUniqueId()).replace("-", "")
names = json.load(urllib2.urlopen("https://api.mojang.com/user/profiles/%s/names" % uuid))
return ", ".join(names)
# combines data
def get_all_data(sender, player):
data = ip_info(player)
data = ip_info(player)
msg(sender, "")
try:
msg(sender, "&7 -- Data provided by Redstoner")
msg(sender, "&6> UUID: &e%s" % str(player.getUniqueId()))
msg(sender, "&6> First joined: &7(y-m-d h:m:s) &e%s" % get_first_join(player))
msg(sender, "")
msg(sender, "&7 -- Data provided by ipinfo.io")
msg(sender, "&6> Country: &e%s" % get_country(data))
msg(sender, "&7 -- Data provided by Mojang")
msg(sender, "&6> All ingame names used so far: &e%s" % get_all_names(player))
except Exception as e:
# can throw exceptions such as timeouts when Mojang API is down
warn(e)
try:
msg(sender, "&7 -- Data provided by Redstoner")
msg(sender, "&6> UUID: &e%s" % str(player.getUniqueId()))
msg(sender, "&6> First joined: &7(y-m-d h:m:s) &e%s" % get_first_join(player))
msg(sender, "")
msg(sender, "&7 -- Data provided by ipinfo.io")
msg(sender, "&6> Country: &e%s" % get_country(data))
msg(sender, "&7 -- Data provided by Mojang")
msg(sender, "&6> All ingame names used so far: &e%s" % get_all_names(player))
except Exception as e:
# can throw exceptions such as timeouts when Mojang API is down
warn(e)
@hook.command("check", description="Displays useful stuff about a user", usage="/check <player>")
def on_hook_command(sender, args):
if sender.hasPermission("utils.check"):
plugin_header(sender, "Check")
msg(sender, "&7Please notice that the data may not be fully accurate!")
if sender.hasPermission("utils.check"):
plugin_header(sender, "Check")
msg(sender, "&7Please notice that the data may not be fully accurate!")
player = server.getPlayer(args[0]) if len(args) > 0 else None
if player is not None and is_player(player):
get_all_data(sender, player)
player = server.getPlayer(args[0]) if len(args) > 0 else None
if player is not None and is_player(player):
get_all_data(sender, player)
else:
msg(sender, "&cLooks like this player is not online.")
else:
msg(sender, "&cLooks like this player is not online.")
else:
msg(sender, "&4You don't have the required permissions to execute this command!")
return True
msg(sender, "&4You don't have the required permissions to execute this command!")
return True

View File

@@ -5,46 +5,46 @@ no_cyclers = open_json_file("cycle", [])
@hook.command("cycle")
def on_cycler_command(sender, args):
plugin_header(sender, "Cycle")
if not is_player(sender):
msg(sender, "&conly players can do this")
return True
if not len(args) == 1:
msg(sender, "&cUsage: /cycle <on|off>")
return True
plugin_header(sender, "Cycle")
if not is_player(sender):
msg(sender, "&conly players can do this")
return True
if not len(args) == 1:
msg(sender, "&cUsage: /cycle <on|off>")
return True
cmd = args[0].lower()
pid = uid(sender)
nop = pid in no_cyclers
if cmd == "on":
if nop:
no_cyclers.remove(pid)
save_cyclers()
msg(sender, "&aTurned &2on&a inventory cycling!")
cmd = args[0].lower()
pid = uid(sender)
nop = pid in no_cyclers
if cmd == "on":
if nop:
no_cyclers.remove(pid)
save_cyclers()
msg(sender, "&aTurned &2on&a inventory cycling!")
else:
msg(sender, "&aAlready turned on.")
elif cmd == "off":
if not nop:
no_cyclers.append(pid)
save_cyclers()
msg(sender, "&aTurned &coff&a inventory cycling!")
else:
msg(sender, "&aAlready turned off.")
else:
msg(sender, "&aAlready turned on.")
elif cmd == "off":
if not nop:
no_cyclers.append(pid)
save_cyclers()
msg(sender, "&aTurned &coff&a inventory cycling!")
else:
msg(sender, "&aAlready turned off.")
else:
msg(sender, "&cUsage: /cycle <on|off>")
return True
msg(sender, "&cUsage: /cycle <on|off>")
return True
@hook.event("player.PlayerItemHeldEvent", "normal")
def on_slot_change(event):
player = event.getPlayer()
if is_creative(player) and uid(player) not in no_cyclers and not player.isSneaking():
prev_slot = event.getPreviousSlot()
new_slot = event.getNewSlot()
if (prev_slot == 0 and new_slot == 8): # left -> right
do_cycle(player, True)
elif (prev_slot == 8 and new_slot == 0): # right -> left
do_cycle(player, False)
player = event.getPlayer()
if is_creative(player) and uid(player) not in no_cyclers and not player.isSneaking():
prev_slot = event.getPreviousSlot()
new_slot = event.getNewSlot()
if (prev_slot == 0 and new_slot == 8): # left -> right
do_cycle(player, True)
elif (prev_slot == 8 and new_slot == 0): # right -> left
do_cycle(player, False)
# ITEM SLOTS #
#_____________________________
@@ -55,16 +55,16 @@ def on_slot_change(event):
# | 0| 1| 2| 3| 4| 5| 6| 7| 8|
def do_cycle(player, down):
inv = player.getInventory()
items = inv.getContents()
shift = -9 if down else 9
shift = shift % len(items)
for _ in range(4):
items = items[shift:] + items[:shift] # shift "around"
uniq_items = sorted(set(list(items)[:9])) # get unique inventory
if uniq_items != [None]: # row not empty
break
inv.setContents(items)
inv = player.getInventory()
items = inv.getContents()
shift = -9 if down else 9
shift = shift % len(items)
for _ in range(4):
items = items[shift:] + items[:shift] # shift "around"
uniq_items = sorted(set(list(items)[:9])) # get unique inventory
if uniq_items != [None]: # row not empty
break
inv.setContents(items)
def save_cyclers():
save_json_file("cycle", no_cyclers)
save_json_file("cycle", no_cyclers)

View File

@@ -10,145 +10,145 @@ removing_input = False
def save_inputs():
save_json_file("damnspam", inputs)
save_json_file("damnspam", inputs)
def location_str(block):
return ";".join([block.getWorld().getName(), str(block.getX()), str(block.getY()), str(block.getZ())])
return ";".join([block.getWorld().getName(), str(block.getX()), str(block.getY()), str(block.getZ())])
def add_input(creator, block, timeout_off, timeout_on):
inputs[location_str(block)] = {
"creator" : uid(creator),
"timeout_off" : timeout_off,
"timeout_on" : timeout_on,
"last_time" : 0
}
inputs[location_str(block)] = {
"creator" : uid(creator),
"timeout_off" : timeout_off,
"timeout_on" : timeout_on,
"last_time" : 0
}
@hook.command("damnspam")
def on_dammnspam_command(sender, args):
global changing_input
global changing_input
plugin_header(sender, "DamnSpam")
if not checkargs(sender, args, 1, 2):
msg(sender, "&c/damnspam <seconds> &e(Buttons/Levers)")
msg(sender, "&c/damnspam <seconds after off> <seconds after on> &e(Levers only)")
return True
if not is_creative(sender):
msg(sender, "&cYou can only do this in Creative mode.")
return True
# /damnspam <secs>
if len(args) == 1:
timeout_on = args[0]
try:
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:
msg(sender, "&cThe timeout must be a number")
plugin_header(sender, "DamnSpam")
if not checkargs(sender, args, 1, 2):
msg(sender, "&c/damnspam <seconds> &e(Buttons/Levers)")
msg(sender, "&c/damnspam <seconds after off> <seconds after on> &e(Levers only)")
return True
# /damnspam <off> <on>
elif len(args) == 2:
timeout_on = args[0]
timeout_off = args[1]
try:
timeout_on = round(float(timeout_on), 2)
timeout_off = round(float(timeout_off), 2)
if 60 >= timeout_on <= -2 or timeout_on == 0:
timeout_on = False
if 60 >= timeout_off <= -2 or timeout_off == 0:
timeout_off = False
if timeout_on == False or timeout_off == False:
msg(sender, "&cThe timeout must be within 0-60 or -1.")
return True
except ValueError:
msg(sender, "&cThe timeout must be a number")
if not is_creative(sender):
msg(sender, "&cYou can only do this in Creative mode.")
return True
# /damnspam <secs>
if len(args) == 1:
timeout_on = args[0]
try:
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:
msg(sender, "&cThe timeout must be a number")
return True
# /damnspam <off> <on>
elif len(args) == 2:
timeout_on = args[0]
timeout_off = args[1]
try:
timeout_on = round(float(timeout_on), 2)
timeout_off = round(float(timeout_off), 2)
if 60 >= timeout_on <= -2 or timeout_on == 0:
timeout_on = False
if 60 >= timeout_off <= -2 or timeout_off == 0:
timeout_off = False
if timeout_on == False or timeout_off == False:
msg(sender, "&cThe timeout must be within 0-60 or -1.")
return True
except ValueError:
msg(sender, "&cThe timeout must be a number")
return True
# get the block we're looking at
target = sender.getTargetBlock(None, 10)
ttype = str(target.getType())
if ttype not in accepted_inputs:
msg(sender, "&cPlease look at a button or lever while executing this command!")
return True
if location_str(target) in inputs:
changing_input = True # this input already has a timeout
# test if player is allowed to build here
test_event = BlockBreakEvent(target, sender)
server.getPluginManager().callEvent(test_event)
changing_input = False
if test_event.isCancelled():
msg(sender, "&cYou are not allowed to modify this %s" % str(target.getType()).lower())
return True
# add block to inputs
add_input(sender, target, timeout_off, timeout_on)
save_inputs()
msg(sender, "&aSuccessfully set a timeout for this %s." % ttype.lower().replace("_", " "))
return True
# get the block we're looking at
target = sender.getTargetBlock(None, 10)
ttype = str(target.getType())
if ttype not in accepted_inputs:
msg(sender, "&cPlease look at a button or lever while executing this command!")
return True
if location_str(target) in inputs:
changing_input = True # this input already has a timeout
# test if player is allowed to build here
test_event = BlockBreakEvent(target, sender)
server.getPluginManager().callEvent(test_event)
changing_input = False
if test_event.isCancelled():
msg(sender, "&cYou are not allowed to modify this %s" % str(target.getType()).lower())
return True
# add block to inputs
add_input(sender, target, timeout_off, timeout_on)
save_inputs()
msg(sender, "&aSuccessfully set a timeout for this %s." % ttype.lower().replace("_", " "))
return True
@hook.event("block.BlockBreakEvent", "normal")
def on_block_break(event):
global removing_input
global removing_input
if removing_input:
return True
sender = event.getPlayer()
block = event.getBlock()
btype = str(block.getType()).lower()
if str(block.getType()) in accepted_inputs and not event.isCancelled():
pos_str = location_str(block)
if inputs.get(pos_str):
plugin_header(sender, "DamnSpam")
if sender.isSneaking():
# test if player is allowed to build here
removing_input = True
test_event = BlockBreakEvent(block, sender)
server.getPluginManager().callEvent(test_event)
removing_input = False
if test_event.isCancelled():
event.setCancelled(True)
msg(sender, "&cYou are not allowed to remove this %s" % btype)
return True
inputs.pop(pos_str) # remove
save_inputs()
msg(sender, "&eSuccessfully removed this %s!" % btype)
return True
elif not changing_input:
event.setCancelled(True)
msg(sender, "&cYou cannot destroy this %s!" % btype)
msg(sender, "&c&nSneak&c and break if you want to remove it.")
if removing_input:
return True
sender = event.getPlayer()
block = event.getBlock()
btype = str(block.getType()).lower()
if str(block.getType()) in accepted_inputs and not event.isCancelled():
pos_str = location_str(block)
if inputs.get(pos_str):
plugin_header(sender, "DamnSpam")
if sender.isSneaking():
# test if player is allowed to build here
removing_input = True
test_event = BlockBreakEvent(block, sender)
server.getPluginManager().callEvent(test_event)
removing_input = False
if test_event.isCancelled():
event.setCancelled(True)
msg(sender, "&cYou are not allowed to remove this %s" % btype)
return True
inputs.pop(pos_str) # remove
save_inputs()
msg(sender, "&eSuccessfully removed this %s!" % btype)
return True
elif not changing_input:
event.setCancelled(True)
msg(sender, "&cYou cannot destroy this %s!" % btype)
msg(sender, "&c&nSneak&c and break if you want to remove it.")
return True
@hook.event("player.PlayerInteractEvent", "normal")
def on_interact(event):
if (str(event.getAction()) == "RIGHT_CLICK_BLOCK") and not event.isCancelled():
sender = event.getPlayer()
block = event.getClickedBlock()
btype = str(block.getType()).lower()
powered = (block.getData() & 0x8) == 0x8 if btype == "lever" else False # data > 7, but this is how bukkit does it
pos_str = location_str(block)
data = inputs.get(pos_str)
if data:
checktime = data["timeout_on"] if powered else data["timeout_off"]
if checktime == -1:
event.setCancelled(True)
plugin_header(sender, "DamnSpam")
msg(sender, "&cThis %s is locked permanently." % (btype))
elif data["last_time"] + checktime > now():
event.setCancelled(True)
plugin_header(sender, "DamnSpam")
msg(sender, "&cThis %s has a timeout of %ss." % (btype, checktime))
else:
inputs[pos_str]["last_time"] = round(now(), 2)
if (str(event.getAction()) == "RIGHT_CLICK_BLOCK") and not event.isCancelled():
sender = event.getPlayer()
block = event.getClickedBlock()
btype = str(block.getType()).lower()
powered = (block.getData() & 0x8) == 0x8 if btype == "lever" else False # data > 7, but this is how bukkit does it
pos_str = location_str(block)
data = inputs.get(pos_str)
if data:
checktime = data["timeout_on"] if powered else data["timeout_off"]
if checktime == -1:
event.setCancelled(True)
plugin_header(sender, "DamnSpam")
msg(sender, "&cThis %s is locked permanently." % (btype))
elif data["last_time"] + checktime > now():
event.setCancelled(True)
plugin_header(sender, "DamnSpam")
msg(sender, "&cThis %s has a timeout of %ss." % (btype, checktime))
else:
inputs[pos_str]["last_time"] = round(now(), 2)

View File

@@ -18,130 +18,130 @@ whitelists = {} # {ff_owner_id: [white, listed, ids]} (Adding file usage later,
@hook.command("forcefield")
def on_forcefield_command(sender, args):
if not is_player(sender) or not sender.hasPermission(ff_perm):
noperm(sender)
return True
if not is_player(sender) or not sender.hasPermission(ff_perm):
noperm(sender)
return True
if not args or args[0].upper() in ["ON", "OFF"]: # Toggle
forcefield_toggle(sender, args[:1])
return True
if not args or args[0].upper() in ["ON", "OFF"]: # Toggle
forcefield_toggle(sender, args[:1])
return True
args[0] = args[0].upper() # If it gets to this point, there are argument(s).
if args[0] in ["WHITELIST", "WL", "WLIST"]: # Whitelist commands
if not args[1:] or args[1].upper() == "LIST":
thread.start_new_thread(whitelist_list, (sender,))
return True
args[0] = args[0].upper() # If it gets to this point, there are argument(s).
if args[0] in ["WHITELIST", "WL", "WLIST"]: # Whitelist commands
if not args[1:] or args[1].upper() == "LIST":
thread.start_new_thread(whitelist_list, (sender,))
return True
args[1] = args[1].upper() # If it gets too this point, there is a second argument.
if args[1] == "CLEAR":
whitelist_clear(sender)
elif args[1] in ["ADD", "+"]:
change_whitelist(sender, True, args[2:])
elif args[1] in ["REMOVE", "DELETE", "REM", "DEL", "-"]:
change_whitelist(sender, False, args[2:])
args[1] = args[1].upper() # If it gets too this point, there is a second argument.
if args[1] == "CLEAR":
whitelist_clear(sender)
elif args[1] in ["ADD", "+"]:
change_whitelist(sender, True, args[2:])
elif args[1] in ["REMOVE", "DELETE", "REM", "DEL", "-"]:
change_whitelist(sender, False, args[2:])
else:
forcefield_header(sender, "&cInvalid syntax. Use &e/ff ? &cfor info.")
elif args[0] in ["HELP", "?"]: # /forcefield help
forcefield_help(sender)
else:
forcefield_header(sender, "&cInvalid syntax. Use &e/ff ? &cfor info.")
elif args[0] in ["HELP", "?"]: # /forcefield help
forcefield_help(sender)
else:
forcefield_header(sender, "&cInvalid syntax. Use &e/ff ? &cfor info.")
return True
forcefield_header(sender, "&cInvalid syntax. Use &e/ff ? &cfor info.")
return True
def change_whitelist(sender, add, names): #Add names if add == True else Remove names.
if names:
sender_id = uid(sender)
if sender_id not in whitelists:
whitelists[sender_id] = []
if names:
sender_id = uid(sender)
if sender_id not in whitelists:
whitelists[sender_id] = []
for name in names:
player = server.getPlayer(name)
if player:
player_id = uid(player)
pname = player.getName()
sname = stripcolors(sender.getDisplayName())
for name in names:
player = server.getPlayer(name)
if player:
player_id = uid(player)
pname = player.getName()
sname = stripcolors(sender.getDisplayName())
# add player to whitelist if not already added
if add and player_id not in whitelists[sender_id]:
if sender != player:
whitelists[sender_id].append(player_id)
forcefield_header(sender, "&bAdded &f%s &bto your forcefield whitelist." % pname)
forcefield_header(player, "&f%s &badded you to his forcefield whitelist." % sname)
else:
forcefield_header(sender, "&cYou can't whitelist yourself.")
# add player to whitelist if not already added
if add and player_id not in whitelists[sender_id]:
if sender != player:
whitelists[sender_id].append(player_id)
forcefield_header(sender, "&bAdded &f%s &bto your forcefield whitelist." % pname)
forcefield_header(player, "&f%s &badded you to his forcefield whitelist." % sname)
else:
forcefield_header(sender, "&cYou can't whitelist yourself.")
# remove player from whitelist if whitelisted
elif not add and player_id in whitelists[sender_id]:
whitelists[sender_id].remove(player_id)
forcefield_header(sender, "&cRemoved &f%s &cfrom your forcefield whitelist." % pname)
forcefield_header(player, "&f%s &cremoved you from his forcefield whitelist." % sname)
# remove player from whitelist if whitelisted
elif not add and player_id in whitelists[sender_id]:
whitelists[sender_id].remove(player_id)
forcefield_header(sender, "&cRemoved &f%s &cfrom your forcefield whitelist." % pname)
forcefield_header(player, "&f%s &cremoved you from his forcefield whitelist." % sname)
# player was already / not added to whitelist
else:
var = "already" if add == True else "not"
forcefield_header(sender, "&f%s &cwas %s in your forcefield whitelist!" % (pname, var))
# player was already / not added to whitelist
else:
var = "already" if add == True else "not"
forcefield_header(sender, "&f%s &cwas %s in your forcefield whitelist!" % (pname, var))
else:
forcefield_header(sender, "&cplayer &f%s &cwas not found (must be online)." % name)
else:
forcefield_header(sender, "&cGive space-separated playernames.")
else:
forcefield_header(sender, "&cplayer &f%s &cwas not found (must be online)." % name)
else:
forcefield_header(sender, "&cGive space-separated playernames.")
def whitelist_list(player):
try:
player_id = uid(player)
count = 0
forcefield_header(player, "&bForcefield whitelist:")
for user_id in whitelists.get(player_id, []):
count += 1
pname = retrieve_player(user_id).getName()
msg(player, "&b %s. &f%s" % (count, pname))
if count == 0:
msg(player, "&c Your whitelist has no entries.")
except:
warn("Unable to finish whitelist_list process")
try:
player_id = uid(player)
count = 0
forcefield_header(player, "&bForcefield whitelist:")
for user_id in whitelists.get(player_id, []):
count += 1
pname = retrieve_player(user_id).getName()
msg(player, "&b %s. &f%s" % (count, pname))
if count == 0:
msg(player, "&c Your whitelist has no entries.")
except:
warn("Unable to finish whitelist_list process")
def whitelist_clear(player):
player_id = uid(player)
if whitelists.get(player_id):
whitelists.pop(player_id)
forcefield_header(player, "&bForcefield whitelist cleared.")
else:
forcefield_header(player, "&cYou had no players whitelisted.")
player_id = uid(player)
if whitelists.get(player_id):
whitelists.pop(player_id)
forcefield_header(player, "&bForcefield whitelist cleared.")
else:
forcefield_header(player, "&cYou had no players whitelisted.")
def forcefield_help(player):
msg(player, " ")
forcefield_header(player, "&b&l/Forcefield help: Your forcefield is %s" % ("&2&lON" if uid(player) in ff_users else "&c&lOFF"))
msg(player, "&b You can use the forcefield to keep players on distance.")
msg(player, "&b Commands:")
msg(player, "&b 1. &6/ff &ohelp &b aliases: &6?")
msg(player, "&b 2. &6/ff &o(on off)")
msg(player, "&b 3. &6/ff &owhitelist (list) &b aliases: &6wlist, wl")
msg(player, "&b 4. &6/ff wl &oclear")
msg(player, "&b 5. &6/ff wl &oadd <players> &b aliases: &6+")
msg(player, "&b 6. &6/ff wl &oremove <players> &b aliases: &6delete, rem, del, -")
msg(player, " ")
msg(player, " ")
forcefield_header(player, "&b&l/Forcefield help: Your forcefield is %s" % ("&2&lON" if uid(player) in ff_users else "&c&lOFF"))
msg(player, "&b You can use the forcefield to keep players on distance.")
msg(player, "&b Commands:")
msg(player, "&b 1. &6/ff &ohelp &b aliases: &6?")
msg(player, "&b 2. &6/ff &o(on off)")
msg(player, "&b 3. &6/ff &owhitelist (list) &b aliases: &6wlist, wl")
msg(player, "&b 4. &6/ff wl &oclear")
msg(player, "&b 5. &6/ff wl &oadd <players> &b aliases: &6+")
msg(player, "&b 6. &6/ff wl &oremove <players> &b aliases: &6delete, rem, del, -")
msg(player, " ")
def forcefield_toggle(player, arg): # arg is a list with max 1 string
player_id = uid(player)
enabled = player_id in ff_users
argoff = arg[0].upper() == "OFF" if arg else False
if enabled and (not arg or argoff): # 3 possibilities for arg: [], ["OFF"], ["ON"]. This is the most efficient way. (Case insensitive)
ff_users.remove(player_id)
forcefield_header(player, "&bForcefield toggle: &c&lOFF")
elif not enabled and not argoff:
ff_users.append(player_id)
forcefield_header(player, "&bForcefield toggle: &2&lON")
else:
forcefield_header(player, "&cYour forcefield is already %s!" % arg[0].lower())
player_id = uid(player)
enabled = player_id in ff_users
argoff = arg[0].upper() == "OFF" if arg else False
if enabled and (not arg or argoff): # 3 possibilities for arg: [], ["OFF"], ["ON"]. This is the most efficient way. (Case insensitive)
ff_users.remove(player_id)
forcefield_header(player, "&bForcefield toggle: &c&lOFF")
elif not enabled and not argoff:
ff_users.append(player_id)
forcefield_header(player, "&bForcefield toggle: &2&lON")
else:
forcefield_header(player, "&cYour forcefield is already %s!" % arg[0].lower())
def forcefield_header(player, message):
msg(player, "%s %s" % (ff_prefix, message))
msg(player, "%s %s" % (ff_prefix, message))
#--------------------------------------------------------------------------------------------------------#
@@ -149,41 +149,41 @@ def forcefield_header(player, message):
@hook.event("player.PlayerMoveEvent")
def on_move(event):
if ff_users:
player = event.getPlayer()
if is_creative(player):
player_id = uid(player)
if ff_users:
player = event.getPlayer()
if is_creative(player):
player_id = uid(player)
# moving player has forcefield, nearby player should be moved away
if player_id in ff_users:
for entity in player.getNearbyEntities(fd, fd, fd):
whitelisted = (uid(entity) in whitelists.get(player_id, []))
if is_player(entity) and not entity.hasPermission(pass_perm) and not whitelisted:
move_away(player, entity)
# moving player has forcefield, nearby player should be moved away
if player_id in ff_users:
for entity in player.getNearbyEntities(fd, fd, fd):
whitelisted = (uid(entity) in whitelists.get(player_id, []))
if is_player(entity) and not entity.hasPermission(pass_perm) and not whitelisted:
move_away(player, entity)
# nearby player has forcefield, moving player should be moved away
if not player.hasPermission(pass_perm):
for entity in player.getNearbyEntities(fd, fd, fd):
entity_id = uid(entity)
ff_enabled = (entity_id in ff_users)
whitelisted = (player_id in whitelists.get(entity_id, []))
if is_player(entity) and is_creative(entity) and ff_enabled and not whitelisted:
move_away(entity, player)
# nearby player has forcefield, moving player should be moved away
if not player.hasPermission(pass_perm):
for entity in player.getNearbyEntities(fd, fd, fd):
entity_id = uid(entity)
ff_enabled = (entity_id in ff_users)
whitelisted = (player_id in whitelists.get(entity_id, []))
if is_player(entity) and is_creative(entity) and ff_enabled and not whitelisted:
move_away(entity, player)
def move_away(player, entity):
# Pushes entity away from player
# Pushes entity away from player
player_loc = player.getLocation()
entity_loc = entity.getLocation()
player_loc = player.getLocation()
entity_loc = entity.getLocation()
dx = entity_loc.getX() - player_loc.getX()
vx = sin(Xv * dx)
dy = entity_loc.getY() - player_loc.getY()
vy = sin(Xv * dy)
dz = entity_loc.getZ() - player_loc.getZ()
vz = sin(Xv * dz)
entity.setVelocity(Vector(vx , vy, vz))
dx = entity_loc.getX() - player_loc.getX()
vx = sin(Xv * dx)
dy = entity_loc.getY() - player_loc.getY()
vy = sin(Xv * dy)
dz = entity_loc.getZ() - player_loc.getZ()
vz = sin(Xv * dz)
entity.setVelocity(Vector(vx , vy, vz))
#--------------------------------------------------------------------------------------------------------#
@@ -191,7 +191,7 @@ def move_away(player, entity):
@hook.event("player.PlayerQuitEvent")
def on_quit(event):
player = event.getPlayer()
player_id = uid(player)
if player_id in ff_users:
ff_users.remove(player_id)
player = event.getPlayer()
player_id = uid(player)
if player_id in ff_users:
ff_users.remove(player_id)

View File

@@ -8,153 +8,153 @@ friend_join_sound = "random.orb"
@hook.event("player.PlayerJoinEvent", "high") # creates sound and sends a bold message on friend join
def fjm(event): # friend join message
player = event.getPlayer()
player_id = uid(player)
player = event.getPlayer()
player_id = uid(player)
for onlineplayer in list(server.getOnlinePlayers()):
if player_id in friends.get(uid(onlineplayer), []):
msg(onlineplayer, "&a&l%s &ajoined!" % player.getName())
onlineplayer.playSound(onlineplayer.getLocation(), friend_join_sound, 1, 0)
for onlineplayer in list(server.getOnlinePlayers()):
if player_id in friends.get(uid(onlineplayer), []):
msg(onlineplayer, "&a&l%s &ajoined!" % player.getName())
onlineplayer.playSound(onlineplayer.getLocation(), friend_join_sound, 1, 0)
def save_friends(): # saves to friends file
save_json_file("friends", friends)
save_json_file("friends", friends)
def friendmessage(player, message): # sends a message with a prefix
msg(player, "&7[&aFriends&7] " + message)
msg(player, "&7[&aFriends&7] " + message)
def ls(sender):
try:
sender_friends = friends.get(uid(sender), False)
if sender_friends:
friends_string = ""
for uuid in sender_friends:
friends_string += (retrieve_player(uuid).getName() + ", ")
friendmessage(sender, "&aYour friends list: " + friends_string[:len(friends_string)-2])
else:
friendmessage(sender, "&cYour friends list is empty")
except:
warn("Unable to finish friends' ls process")
try:
sender_friends = friends.get(uid(sender), False)
if sender_friends:
friends_string = ""
for uuid in sender_friends:
friends_string += (retrieve_player(uuid).getName() + ", ")
friendmessage(sender, "&aYour friends list: " + friends_string[:len(friends_string)-2])
else:
friendmessage(sender, "&cYour friends list is empty")
except:
warn("Unable to finish friends' ls process")
def clear(sender):
sender_id = uid(sender)
sender_id = uid(sender)
if friends.get(sender_id, False):
friends.pop(sender_id)
friendmessage(sender, "&aFriends list cleared")
save_friends()
else:
friendmessage(sender, "&cYour friends list is already empty")
if friends.get(sender_id, False):
friends.pop(sender_id)
friendmessage(sender, "&aFriends list cleared")
save_friends()
else:
friendmessage(sender, "&cYour friends list is already empty")
def add(sender, names):
sender_id = uid(sender)
added = []
notfound = []
friendalready = []
sender_id = uid(sender)
added = []
notfound = []
friendalready = []
if not sender_id in friends:
friends[sender_id] = []
if not sender_id in friends:
friends[sender_id] = []
for name in names:
player = server.getPlayer(name)
if player:
player_id = uid(player)
not_yourself = player != sender
for name in names:
player = server.getPlayer(name)
if player:
player_id = uid(player)
not_yourself = player != sender
if not player_id in friends[sender_id]:
if not_yourself:
friends[sender_id].append(player_id)
added.append(player.getName())
friendmessage(player.getPlayer(), "&a&o%s &aadded you to their friends list" % stripcolors(sender.getDisplayName()))
else:
friendalready.append(player.getName())
if not player_id in friends[sender_id]:
if not_yourself:
friends[sender_id].append(player_id)
added.append(player.getName())
friendmessage(player.getPlayer(), "&a&o%s &aadded you to their friends list" % stripcolors(sender.getDisplayName()))
else:
friendalready.append(player.getName())
else:
notfound.append(name)
else:
notfound.append(name)
save_friends()
if added:
friendmessage(sender, "&a&o%s&a added." % ", ".join(added))
if notfound:
friendmessage(sender, "&c&o%s&c not found. (must be online)" % ", ".join(notfound))
if friendalready:
friendmessage(sender, "&c&o%s&c is/are already your friend." % ", ".join(friendalready))
if not not_yourself:
friendmessage(sender, "&cYou can't add yourself to your friends list.")
save_friends()
if added:
friendmessage(sender, "&a&o%s&a added." % ", ".join(added))
if notfound:
friendmessage(sender, "&c&o%s&c not found. (must be online)" % ", ".join(notfound))
if friendalready:
friendmessage(sender, "&c&o%s&c is/are already your friend." % ", ".join(friendalready))
if not not_yourself:
friendmessage(sender, "&cYou can't add yourself to your friends list.")
def rem(sender, names):
sender_id = uid(sender)
removed = []
notfound = []
notafriend = []
sender_id = uid(sender)
removed = []
notfound = []
notafriend = []
for name in names:
player = server.Player(name)
if player:
player_id = uid(player)
if player_id in friends.get(sender_id, []):
friends[sender_id].remove(player_id)
removed.append(player.getName())
friendmessage(player.getPlayer(), "&c&o%s &cremoved you from their friends list" % stripcolors(sender.getDisplayName()))
else:
notafriend.append(player.getName())
else:
notfound.append(name)
for name in names:
player = server.Player(name)
if player:
player_id = uid(player)
if player_id in friends.get(sender_id, []):
friends[sender_id].remove(player_id)
removed.append(player.getName())
friendmessage(player.getPlayer(), "&c&o%s &cremoved you from their friends list" % stripcolors(sender.getDisplayName()))
else:
notafriend.append(player.getName())
else:
notfound.append(name)
save_friends()
if removed:
friendmessage(sender, "&a&o%s&a removed." % ", ".join(removed))
if notfound:
friendmessage(sender, "&c&o%s&c not found. (must be online)" % ", ".join(notfound))
if notafriend:
friendmessage(sender, "&c&o%s&c is/are not in your friends list." % ", ".join(notafriend))
save_friends()
if removed:
friendmessage(sender, "&a&o%s&a removed." % ", ".join(removed))
if notfound:
friendmessage(sender, "&c&o%s&c not found. (must be online)" % ", ".join(notfound))
if notafriend:
friendmessage(sender, "&c&o%s&c is/are not in your friends list." % ", ".join(notafriend))
def fhelp(sender):
friendmessage(sender, "&a&l/friends help")
msg(sender, "&a1. /friends &oadd <names...> &6aliases: &o+")
msg(sender, "&a2. /friends &orem <names...> &6aliases: &oremove, delete, del, -")
msg(sender, "&a3. /friends &oclear &6aliases: &o/")
msg(sender, "&a4. /friends &olist &6aliases: &olst, *")
msg(sender, "&a5. /friends &ohelp &6aliases: &o?")
friendmessage(sender, "&a&l/friends help")
msg(sender, "&a1. /friends &oadd <names...> &6aliases: &o+")
msg(sender, "&a2. /friends &orem <names...> &6aliases: &oremove, delete, del, -")
msg(sender, "&a3. /friends &oclear &6aliases: &o/")
msg(sender, "&a4. /friends &olist &6aliases: &olst, *")
msg(sender, "&a5. /friends &ohelp &6aliases: &o?")
@hook.command("friends")
def on_friend_command(sender, args):
if not is_player(sender):
friendmessage(sender, "&c&lYou can't have friends!")
return True
if not is_player(sender):
friendmessage(sender, "&c&lYou can't have friends!")
return True
cmd = args[0] if args else None
fargs = args[1:]
cmd = args[0] if args else None
fargs = args[1:]
# /friends list
if cmd in ["list", "lst", "*"]:
thread.start_new_thread(ls, (sender,))
# /friends list
if cmd in ["list", "lst", "*"]:
thread.start_new_thread(ls, (sender,))
# /friends clear
elif cmd in ["clear", "/"]:
clear(sender)
# /friends clear
elif cmd in ["clear", "/"]:
clear(sender)
# /friends add <names>
elif cmd in ["add", "+"]:
if fargs:
add(sender, fargs)
else:
fhelp(sender)
# /friends remove <names>
elif cmd in ["remove", "rem", "delete", "del", "-"]:
if fargs:
rem(sender, fargs)
else:
fhelp(sender)
# /friends add <names>
elif cmd in ["add", "+"]:
if fargs:
add(sender, fargs)
else:
fhelp(sender)
# /friends remove <names>
elif cmd in ["remove", "rem", "delete", "del", "-"]:
if fargs:
rem(sender, fargs)
else:
fhelp(sender)
else:
fhelp(sender)
return True
fhelp(sender)
return True

View File

@@ -15,198 +15,198 @@ server = bukkit.Bukkit.getServer()
def info(text):
"""
Log info to console
"""
server.getLogger().info("[RedstonerUtils] %s" % text)
"""
Log info to console
"""
server.getLogger().info("[RedstonerUtils] %s" % text)
def warn(text):
"""
Log warning to console
"""
server.getLogger().warning("[RedstonerUtils] %s" % text)
"""
Log warning to console
"""
server.getLogger().warning("[RedstonerUtils] %s" % text)
def error(text):
"""
Log error to console
"""
server.getLogger().severe("[RedstonerUtils] %s" % text)
"""
Log error to console
"""
server.getLogger().severe("[RedstonerUtils] %s" % text)
def msg(player, text, usecolor = True, basecolor = None):
"""
send a message to player
the player may be None or offline, which this method just ignores
unless usecolor is False, &-codes are translated to real color codes
for that case, basecolor can be useful. basecolor accepts a single character as color code
"""
if player and (player == server.getConsoleSender() or player.getPlayer()): # getPlayer() returns None when offline
if basecolor:
if usecolor:
text = colorify(text)
player.sendMessage(colorify("&%s" % basecolor) + text)
else:
player.sendMessage(colorify(text) if usecolor else text)
"""
send a message to player
the player may be None or offline, which this method just ignores
unless usecolor is False, &-codes are translated to real color codes
for that case, basecolor can be useful. basecolor accepts a single character as color code
"""
if player and (player == server.getConsoleSender() or player.getPlayer()): # getPlayer() returns None when offline
if basecolor:
if usecolor:
text = colorify(text)
player.sendMessage(colorify("&%s" % basecolor) + text)
else:
player.sendMessage(colorify(text) if usecolor else text)
def broadcast(perm, text):
"""
better than bukkit's broadcast.
bukkit only works with permissibles that are subscribed to perm
"""
text = colorify(text)
for recipient in list(server.getOnlinePlayers()) + [server.getConsoleSender()]:
if not perm or recipient.hasPermission(perm):
msg(recipient, text)
"""
better than bukkit's broadcast.
bukkit only works with permissibles that are subscribed to perm
"""
text = colorify(text)
for recipient in list(server.getOnlinePlayers()) + [server.getConsoleSender()]:
if not perm or recipient.hasPermission(perm):
msg(recipient, text)
def colorify(text):
"""
replace &-codes with real color codes
"""
return sub("&(?=[?\\da-fk-or])", u"\u00A7", "%s" % text)
"""
replace &-codes with real color codes
"""
return sub("&(?=[?\\da-fk-or])", u"\u00A7", "%s" % text)
def stripcolors(text):
"""
strips all (real) color codes from text
"""
return sub(u"\u00A7[\\da-fk-or]", "", "%s" % text)
"""
strips all (real) color codes from text
"""
return sub(u"\u00A7[\\da-fk-or]", "", "%s" % text)
def safetp(player, world, x, y, z, yaw = 0, pitch = 0):
"""
teleports the player to the given Location
if the player would spawn inside blocks, the location is escalated until the location is safe
"""
tpblock = Location(world, x, y, z).getBlock()
if (tpblock.isEmpty() and tpblock.getRelative(bblock.BlockFace.UP).isEmpty()) or y > 255:
player.teleport(Location(world, x+0.5, y, z+0.5, yaw, pitch), TeleportCause.COMMAND)
else:
safetp(player, world, x, y+1, z, yaw, pitch)
"""
teleports the player to the given Location
if the player would spawn inside blocks, the location is escalated until the location is safe
"""
tpblock = Location(world, x, y, z).getBlock()
if (tpblock.isEmpty() and tpblock.getRelative(bblock.BlockFace.UP).isEmpty()) or y > 255:
player.teleport(Location(world, x+0.5, y, z+0.5, yaw, pitch), TeleportCause.COMMAND)
else:
safetp(player, world, x, y+1, z, yaw, pitch)
def plugin_header(recipient = None, name="Redstoner Utils"):
"""
sends the recipient a "Plugin Header", in the format of: --=[ PluginName ]=--
"""
"""
sends the recipient a "Plugin Header", in the format of: --=[ PluginName ]=--
"""
head = "\n&2--=[ %s ]=--" % name
msg(recipient, head)
return head
head = "\n&2--=[ %s ]=--" % name
msg(recipient, head)
return head
def noperm(player):
"""
Send the default permission failure message to the player
"""
msg(player, "&cno permission")
"""
Send the default permission failure message to the player
"""
msg(player, "&cno permission")
def runas(player, cmd):
"""
run a command as player
the cmd should no be prefixed with a /
"""
server.dispatchCommand(player, cmd)
"""
run a command as player
the cmd should no be prefixed with a /
"""
server.dispatchCommand(player, cmd)
def is_player(obj):
"""
return True when ob is a bukkit Player
"""
return (isinstance(obj, Player))
"""
return True when ob is a bukkit Player
"""
return (isinstance(obj, Player))
def checkargs(sender, args, amin, amax):
"""
check if a command has a valid amount of args, otherwise notify the sender
amin is the minimum amount of args
amax is the maximum amount of args
if amax is < 0, infinite args will be accepted
return True if args has a valid length, False otherwise
"""
if not (len(args) >= amin and (amax < 0 or len(args) <= amax)):
if amin == amax:
msg(sender, "&cNeeds " + str(amin) + " arguments!")
return False
elif amax < 0:
msg(sender, "&cNeeds at least " + str(amin) + " arguments!")
return False
else:
msg(sender, "&cNeeds " + str(amin) + " to " + str(amax) + " arguments!")
return False
return True
"""
check if a command has a valid amount of args, otherwise notify the sender
amin is the minimum amount of args
amax is the maximum amount of args
if amax is < 0, infinite args will be accepted
return True if args has a valid length, False otherwise
"""
if not (len(args) >= amin and (amax < 0 or len(args) <= amax)):
if amin == amax:
msg(sender, "&cNeeds " + str(amin) + " arguments!")
return False
elif amax < 0:
msg(sender, "&cNeeds at least " + str(amin) + " arguments!")
return False
else:
msg(sender, "&cNeeds " + str(amin) + " to " + str(amax) + " arguments!")
return False
return True
def is_creative(player):
"""
returns True if the player is in Creative mode
"""
return str(player.getGameMode()) == "CREATIVE"
"""
returns True if the player is in Creative mode
"""
return str(player.getGameMode()) == "CREATIVE"
def uid(player):
"""
returns the player's UUID
"""
return str(player.getUniqueId())
"""
returns the player's UUID
"""
return str(player.getUniqueId())
def retrieve_player(uuid_str):
"""
gets an offline player by UUID string
the uuid MUST contain dashes
"""
return server.getOfflinePlayer(juuid(uuid_str))
"""
gets an offline player by UUID string
the uuid MUST contain dashes
"""
return server.getOfflinePlayer(juuid(uuid_str))
def known_player(player):
"""
to be used on OfflinePlayer (which can be online!)
returns True if the player has been on the server
this is different to HasPlayedBefore(), which will return False on first join
"""
return player.hasPlayedBefore()
"""
to be used on OfflinePlayer (which can be online!)
returns True if the player has been on the server
this is different to HasPlayedBefore(), which will return False on first join
"""
return player.hasPlayedBefore()
def open_json_file(filename, default):
"""
opens the given json file and returns an object or returns None on error
filename is the path + name of the file.
"""
data = None
try:
with open("plugins/redstoner-utils.py.dir/files/%s.json" % filename) as obj:
data = json_loads(obj.read())
except Exception, e:
error("Failed to read from %s: %s" % (filename, e))
return (default if data is None else data)
"""
opens the given json file and returns an object or returns None on error
filename is the path + name of the file.
"""
data = None
try:
with open("plugins/redstoner-utils.py.dir/files/%s.json" % filename) as obj:
data = json_loads(obj.read())
except Exception, e:
error("Failed to read from %s: %s" % (filename, e))
return (default if data is None else data)
def save_json_file(filename, obj):
"""
saves the given object as json into filename
filename is the path + name of the file.
"""
try:
with open("plugins/redstoner-utils.py.dir/files/%s.json" % filename, "w") as f:
f.write(json_dumps(obj))
except Exception, e:
error("Failed to write to %s: %s" % (filename, e))
"""
saves the given object as json into filename
filename is the path + name of the file.
"""
try:
with open("plugins/redstoner-utils.py.dir/files/%s.json" % filename, "w") as f:
f.write(json_dumps(obj))
except Exception, e:
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)
"""
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)

View File

@@ -6,22 +6,22 @@ imout_toggle_list = []
@hook.command("imout")
def on_imout_command(sender, args):
if sender.hasPermission("utils.imout"):
name = sender.getName()
symbol = "&a&l+"
if name in imout_toggle_list:
msg(sender, "&eWelcome back! You are no longer hidden")
msg(sender, "&6We disabled /act for you!")
if name in imout_toggle_list:
imout_toggle_list.remove(name)
if name in ac_toggle_list:
ac_toggle_list.remove(name)
else:
symbol = "&c&l-"
msg(sender, "&eYou just left... Or didn't you?")
imout_toggle_list.append(name)
if name not in ac_toggle_list:
msg(sender, "&6We enabled /act for you!")
ac_toggle_list.append(name)
if sender.hasPermission("utils.imout"):
name = sender.getName()
symbol = "&a&l+"
if name in imout_toggle_list:
msg(sender, "&eWelcome back! You are no longer hidden")
msg(sender, "&6We disabled /act for you!")
if name in imout_toggle_list:
imout_toggle_list.remove(name)
if name in ac_toggle_list:
ac_toggle_list.remove(name)
else:
symbol = "&c&l-"
msg(sender, "&eYou just left... Or didn't you?")
imout_toggle_list.append(name)
if name not in ac_toggle_list:
msg(sender, "&6We enabled /act for you!")
ac_toggle_list.append(name)
broadcast(None, "%s &7%s" % (symbol, name))
broadcast(None, "%s &7%s" % (symbol, name))

View File

@@ -6,55 +6,55 @@ lagchunks = []
def print_help(sender):
msg(sender, " &b/lagchunks <amount> &eList chunks where #entities >= <amount>")
msg(sender, " &b/lagchunks list &eShow list again")
msg(sender, " &b/lagchunks tp <num> &eTeleport to chunk <num> from list")
msg(sender, " &b/lagchunks <amount> &eList chunks where #entities >= <amount>")
msg(sender, " &b/lagchunks list &eShow list again")
msg(sender, " &b/lagchunks tp <num> &eTeleport to chunk <num> from list")
def scan_chunks(amount):
global lagchunks
chunks = []
for world in bukkit.Bukkit.getServer().getWorlds():
for chunk in world.getLoadedChunks():
if len(chunk.getEntities()) >= amount:
ents = chunk.getEntities()
# [0]world [1]X [2]Y [3]Z [4]amount
chunks.append([chunk.getWorld(), int(ents[-1].getLocation().getX()), int(ents[0].getLocation().getY()), int(ents[0].getLocation().getZ()), len(ents)])
chunks.sort(key = lambda entry: entry[4], reverse = True)
lagchunks = chunks
global lagchunks
chunks = []
for world in bukkit.Bukkit.getServer().getWorlds():
for chunk in world.getLoadedChunks():
if len(chunk.getEntities()) >= amount:
ents = chunk.getEntities()
# [0]world [1]X [2]Y [3]Z [4]amount
chunks.append([chunk.getWorld(), int(ents[-1].getLocation().getX()), int(ents[0].getLocation().getY()), int(ents[0].getLocation().getZ()), len(ents)])
chunks.sort(key = lambda entry: entry[4], reverse = True)
lagchunks = chunks
def list_chunks(sender):
for id, chunk in enumerate(lagchunks):
msg(sender, "&b%s&a: (&b%s&a) %s&7, &a%s &7(%s)" % (id, chunk[4], chunk[1], chunk[3], chunk[0].getName()))
msg(sender, "&2------------------")
for id, chunk in enumerate(lagchunks):
msg(sender, "&b%s&a: (&b%s&a) %s&7, &a%s &7(%s)" % (id, chunk[4], chunk[1], chunk[3], chunk[0].getName()))
msg(sender, "&2------------------")
def tp_chunk(sender, id):
chunk = lagchunks[id]
safetp(sender, chunk[0], chunk[1], chunk[2], chunk[3])
msg(sender, "&aTeleported to &b%s&a, &b%s&a in &7%s&a with &b%s&a entities nearby." % (chunk[1], chunk[3], chunk[0].getName(), chunk[4]))
chunk = lagchunks[id]
safetp(sender, chunk[0], chunk[1], chunk[2], chunk[3])
msg(sender, "&aTeleported to &b%s&a, &b%s&a in &7%s&a with &b%s&a entities nearby." % (chunk[1], chunk[3], chunk[0].getName(), chunk[4]))
@hook.command("lagchunks")
def on_lagchunks_command(sender, args):
if sender.hasPermission("utils.lagchunks"):
plugin_header(sender, "Lagchunks")
global lagchunks
if len(args) == 1 and args[0].isdigit() and int(args[0]) > 0:
amount = args[0]
msg(sender, "&aChunks with at least &b%s &aentities:" % amount, )
scan_chunks(int(amount))
list_chunks(sender)
elif len(args) == 1 and args[0].lower() == "list":
list_chunks(sender)
elif len(args) == 2 and args[0].lower() == "tp" and args[1].isdigit() and int(args[1]) <= len(lagchunks)-1:
if isinstance(sender, Player):
tp_chunk(sender, int(args[1]))
else:
msg(sender, "&cOnly players can do this!")
if sender.hasPermission("utils.lagchunks"):
plugin_header(sender, "Lagchunks")
global lagchunks
if len(args) == 1 and args[0].isdigit() and int(args[0]) > 0:
amount = args[0]
msg(sender, "&aChunks with at least &b%s &aentities:" % amount, )
scan_chunks(int(amount))
list_chunks(sender)
elif len(args) == 1 and args[0].lower() == "list":
list_chunks(sender)
elif len(args) == 2 and args[0].lower() == "tp" and args[1].isdigit() and int(args[1]) <= len(lagchunks)-1:
if isinstance(sender, Player):
tp_chunk(sender, int(args[1]))
else:
msg(sender, "&cOnly players can do this!")
else:
print_help(sender)
else:
print_help(sender)
else:
noperm(sender)
return True
noperm(sender)
return True

60
main.py
View File

@@ -9,52 +9,52 @@ from traceback import format_exc as print_traceback
sys.path += ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/pymodules/python2.7', '/usr/lib/pyshared/python2.7']
try:
from helpers import *
from helpers import *
except:
print("[RedstonerUtils] ERROR: Failed to import helpers:")
print(print_traceback())
print("[RedstonerUtils] ERROR: Failed to import helpers:")
print(print_traceback())
@hook.enable
def on_enable():
info("RedstonerUtils enabled!")
info("RedstonerUtils enabled!")
@hook.disable
def on_disable():
shared["modules"]["reports"].stop_reporting()
info("RedstonerUtils disabled!")
shared["modules"]["reports"].stop_reporting()
info("RedstonerUtils disabled!")
info("Loading RedstonerUtils...")
# Import all modules, in this order
shared["load_modules"] = [
"misc",
"adminchat",
"badges",
"calc",
"lagchunks",
"reports",
"chatgroups",
"webtoken",
"saylol",
"skullclick",
"mentio",
"cycle",
"motd",
"abot",
"forcefield",
"damnspam",
"check",
"imout"
"misc",
"adminchat",
"badges",
"calc",
"lagchunks",
"reports",
"chatgroups",
"webtoken",
"saylol",
"skullclick",
"mentio",
"cycle",
"motd",
"abot",
"forcefield",
"damnspam",
"check",
"imout"
]
shared["modules"] = {}
for module in shared["load_modules"]:
try:
shared["modules"][module] = __import__(module)
info("Module %s loaded." % module)
except:
error("Failed to import module %s:" % module)
error(print_traceback())
try:
shared["modules"][module] = __import__(module)
info("Module %s loaded." % module)
except:
error("Failed to import module %s:" % module)
error(print_traceback())

204
mentio.py
View File

@@ -10,140 +10,140 @@ colors_reg = reg_compile(u"\u00A7[\\da-fk-or]") # finds color codes
def saveMentions():
save_json_file("mentio", mentions)
save_json_file("mentio", mentions)
@hook.event("player.AsyncPlayerChatEvent", "high")
def onChat(event):
if not event.isCancelled():
sender = event.getPlayer()
words = event.getMessage().split(" ")
recipients = event.getRecipients() # set of <Player>, may be a lazy or unmodifiable collection
if not event.isCancelled():
sender = event.getPlayer()
words = event.getMessage().split(" ")
recipients = event.getRecipients() # set of <Player>, may be a lazy or unmodifiable collection
for recipient in list(recipients):
recuid = uid(recipient)
for recipient in list(recipients):
recuid = uid(recipient)
if recuid in mentions:
keywords = mentions[uid(recipient)]
else:
# player
keywords = [recipient.getName().lower(), stripcolors(recipient.getDisplayName()).lower()]
if recuid in mentions:
keywords = mentions[uid(recipient)]
else:
# player
keywords = [recipient.getName().lower(), stripcolors(recipient.getDisplayName()).lower()]
rec_words = words[:] # copy
for index, word in enumerate(rec_words):
isMentioned = False
rec_words = words[:] # copy
for index, word in enumerate(rec_words):
isMentioned = False
for keyword in keywords:
if keyword in word.lower(): # is the keyword mentioned
isMentioned = True
for keyword in keywords:
if keyword in word.lower(): # is the keyword mentioned
isMentioned = True
if isMentioned:
# join all color codes used upto this word
colors = "".join(colors_reg.findall("".join(words[:index+1])))
# highlight the word containing mention, then apply all previous color codes
rec_words[index] = colorify("&r&a&o") + stripcolors(word) + colorify("&r") + colors
# No need to
break
if isMentioned:
# join all color codes used upto this word
colors = "".join(colors_reg.findall("".join(words[:index+1])))
# highlight the word containing mention, then apply all previous color codes
rec_words[index] = colorify("&r&a&o") + stripcolors(word) + colorify("&r") + colors
# No need to
break
# player was mentioned
if rec_words != words:
try:
recipients.remove(recipient) # don't send original message
except:
# list might not be mutable, ignoring. Receiver will get the message twice
pass
message = " ".join([sender.getDisplayName(), arrow] + rec_words)
msg(recipient, message, usecolor = False)
recipient.playSound(recipient.getLocation(), "mob.chicken.plop", 1, 2)
# player was mentioned
if rec_words != words:
try:
recipients.remove(recipient) # don't send original message
except:
# list might not be mutable, ignoring. Receiver will get the message twice
pass
message = " ".join([sender.getDisplayName(), arrow] + rec_words)
msg(recipient, message, usecolor = False)
recipient.playSound(recipient.getLocation(), "mob.chicken.plop", 1, 2)
def get_keywords(player):
sender_id = uid(player)
if sender_id in mentions.keys():
keywords = mentions[sender_id]
else:
keywords = []
return keywords
sender_id = uid(player)
if sender_id in mentions.keys():
keywords = mentions[sender_id]
else:
keywords = []
return keywords
def add_keyword(sender, args):
keywords = get_keywords(sender)
new_word = stripcolors(args[1].lower())
keywords = get_keywords(sender)
new_word = stripcolors(args[1].lower())
if len(keywords) >= max_amount:
msg(sender, "&cYou are already listening for %s words! Try &6/mentio del <word>" % max_amount)
if len(keywords) >= max_amount:
msg(sender, "&cYou are already listening for %s words! Try &6/mentio del <word>" % max_amount)
return True
if len(new_word) > 20:
msg(sender, "&cThis word is longer than 20 characters. Pick a shorter one!")
return True
if new_word in keywords:
msg(sender, "&cYou are already listening for this word! Try &6/mentio list")
return True
keywords.append(new_word)
if keywords:
mentions[uid(sender)] = keywords
msg(sender, "&aYou are now listening for '&2%s'!" % new_word)
saveMentions()
return True
if len(new_word) > 20:
msg(sender, "&cThis word is longer than 20 characters. Pick a shorter one!")
return True
if new_word in keywords:
msg(sender, "&cYou are already listening for this word! Try &6/mentio list")
return True
keywords.append(new_word)
if keywords:
mentions[uid(sender)] = keywords
msg(sender, "&aYou are now listening for '&2%s'!" % new_word)
saveMentions()
return True
def del_keyword(sender, args):
keywords = get_keywords(sender)
del_word = stripcolors(args[1].lower())
keywords = get_keywords(sender)
del_word = stripcolors(args[1].lower())
if not keywords:
msg(sender, "&cYou are currently listening for no words! Try &6/mentio add <word>")
return
if not keywords:
msg(sender, "&cYou are currently listening for no words! Try &6/mentio add <word>")
return
if del_word in keywords:
keywords.remove(del_word)
sender_id = uid(sender)
if keywords:
mentions[sender_id] = keywords
elif sender_id in mentions:
del mentions[sender_id]
saveMentions()
msg(sender, "&aYou are no longer listening for '&2%s&e'!" % del_word)
else:
msg(sender, "&cWe can't remove something that doesn't exist! Try &6/mentio list")
if del_word in keywords:
keywords.remove(del_word)
sender_id = uid(sender)
if keywords:
mentions[sender_id] = keywords
elif sender_id in mentions:
del mentions[sender_id]
saveMentions()
msg(sender, "&aYou are no longer listening for '&2%s&e'!" % del_word)
else:
msg(sender, "&cWe can't remove something that doesn't exist! Try &6/mentio list")
def show_help(player):
msg(player, "&a/mentio add <word>")
msg(player, "&a/mentio del <word>")
msg(player, "&a/mentio list")
msg(player, "&a/mentio add <word>")
msg(player, "&a/mentio del <word>")
msg(player, "&a/mentio list")
@hook.command("mentio")
def onListenCommand(sender, args):
plugin_header(sender, "Mentio")
plugin_header(sender, "Mentio")
argnum = len(args)
if argnum:
cmd = args[0].lower()
argnum = len(args)
if argnum:
cmd = args[0].lower()
# /mentio add <word>
if argnum == 2 and cmd == "add":
add_keyword(sender, args)
# /mentio add <word>
if argnum == 2 and cmd == "add":
add_keyword(sender, args)
# /mentio del <word>
elif argnum == 2 and cmd == "del":
del_keyword(sender, args)
# /mentio del <word>
elif argnum == 2 and cmd == "del":
del_keyword(sender, args)
# /mentio list
elif argnum == 1 and cmd == "list":
msg(sender, "&aWords you're listening for:")
keywords = get_keywords(sender)
for word in keywords:
msg(sender, "&c- &3%s" % word)
if not keywords:
msg(sender, "&cYou are currently listening for no words! Try &6/mentio add <word>")
# /mentio list
elif argnum == 1 and cmd == "list":
msg(sender, "&aWords you're listening for:")
keywords = get_keywords(sender)
for word in keywords:
msg(sender, "&c- &3%s" % word)
if not keywords:
msg(sender, "&cYou are currently listening for no words! Try &6/mentio add <word>")
else:
show_help(sender)
else:
show_help(sender)
else:
show_help(sender)
return True
show_help(sender)
return True

180
misc.py
View File

@@ -9,60 +9,60 @@ import org.bukkit.inventory.ItemStack as ItemStack
# Welcome new players
@hook.event("player.PlayerJoinEvent", "monitor")
def on_join(event):
player = event.getPlayer()
player = event.getPlayer()
# send welcome broadcast
if not player.hasPlayedBefore():
broadcast("utils.greet_new", "")
broadcast("utils.greet_new", "&a&lPlease welcome &f" + player.getDisplayName() + " &a&lto Redstoner!")
broadcast("utils.greet_new", "")
# send welcome broadcast
if not player.hasPlayedBefore():
broadcast("utils.greet_new", "")
broadcast("utils.greet_new", "&a&lPlease welcome &f" + player.getDisplayName() + " &a&lto Redstoner!")
broadcast("utils.greet_new", "")
# clear out some eventual crap before
msg(player, " \n \n \n \n \n \n \n \n \n \n \n \n ")
msg(player, " &4Welcome to the Redstoner Server!")
msg(player, " &6Before you ask us things, take a quick")
msg(player, " &6look at the &a&l/FAQ &6command.")
msg(player, " \n&6thank you and happy playing ;)")
msg(player, " \n \n")
# clear out some eventual crap before
msg(player, " \n \n \n \n \n \n \n \n \n \n \n \n ")
msg(player, " &4Welcome to the Redstoner Server!")
msg(player, " &6Before you ask us things, take a quick")
msg(player, " &6look at the &a&l/FAQ &6command.")
msg(player, " \n&6thank you and happy playing ;)")
msg(player, " \n \n")
# teleport to spawn when spawning inside portal
loginloc = player.getLocation().getBlock().getType()
headloc = player.getEyeLocation().getBlock().getType()
if str(loginloc) == "PORTAL" or str(headloc) == "PORTAL":
msg(player, "&4Looks like you spawned in a portal... Let me help you out")
msg(player, "&6You can use /back if you &nreally&6 want to go back")
player.teleport(player.getWorld().getSpawnLocation())
# teleport to spawn when spawning inside portal
loginloc = player.getLocation().getBlock().getType()
headloc = player.getEyeLocation().getBlock().getType()
if str(loginloc) == "PORTAL" or str(headloc) == "PORTAL":
msg(player, "&4Looks like you spawned in a portal... Let me help you out")
msg(player, "&6You can use /back if you &nreally&6 want to go back")
player.teleport(player.getWorld().getSpawnLocation())
# /sudo - execute command/chat *as* a player/console
@hook.command("sudo")
def on_sudo_command(sender, args):
if sender.hasPermission("utils.sudo"):
plugin_header(sender, "Sudo")
if not checkargs(sender, args, 2, -1):
return True
target = args[0]
if sender.hasPermission("utils.sudo"):
plugin_header(sender, "Sudo")
if not checkargs(sender, args, 2, -1):
return True
target = args[0]
cmd = " ".join(args[1:])
msg(sender, "Running '&e%s&r' as &3%s" % (cmd, target))
if cmd[0] == "/":
cmd = cmd[1:]
if target.lower() == "server" or target.lower() == "console":
runas(server.getConsoleSender(), cmd)
elif server.getPlayer(target):
runas(server.getPlayer(target), cmd)
else:
msg(sender, "&cPlayer %s not found!" % target)
cmd = " ".join(args[1:])
msg(sender, "Running '&e%s&r' as &3%s" % (cmd, target))
if cmd[0] == "/":
cmd = cmd[1:]
if target.lower() == "server" or target.lower() == "console":
runas(server.getConsoleSender(), cmd)
elif server.getPlayer(target):
runas(server.getPlayer(target), cmd)
else:
msg(sender, "&cPlayer %s not found!" % target)
else:
if target.lower() == "server" or target.lower() == "console":
runas(server.getConsoleSender(), "say %s" % cmd)
elif server.getPlayer(target):
server.getPlayer(target).chat(cmd)
else:
msg(sender, "&cPlayer %s not found!" % target)
else:
if target.lower() == "server" or target.lower() == "console":
runas(server.getConsoleSender(), "say %s" % cmd)
elif server.getPlayer(target):
server.getPlayer(target).chat(cmd)
else:
msg(sender, "&cPlayer %s not found!" % target)
else:
noperm(sender)
return True
noperm(sender)
return True
# /gm - custom gamemode command with extra perms for greater control
@@ -94,80 +94,80 @@ last_shear = 0.0
@hook.event("player.PlayerInteractEntityEvent")
def on_player_entity_interact(event):
global last_shear
if not event.isCancelled():
shear_time = now()
if last_shear + 0.4 < shear_time:
last_shear = shear_time
sender = event.getPlayer()
entity = event.getRightClicked()
if is_player(entity) and uid(entity) == "ae795aa8-6327-408e-92ab-25c8a59f3ba1" and str(sender.getItemInHand().getType()) == "SHEARS" and is_creative(sender):
for _ in range(5):
entity.getWorld().dropItemNaturally(entity.getLocation(), ItemStack(bukkit.Material.getMaterial("REDSTONE")))
entity.getWorld().dropItemNaturally(entity.getLocation(), ItemStack(bukkit.Material.getMaterial("WOOL")))
sender.playSound(entity.getLocation(), "mob.cow.say", 1, 1)
global last_shear
if not event.isCancelled():
shear_time = now()
if last_shear + 0.4 < shear_time:
last_shear = shear_time
sender = event.getPlayer()
entity = event.getRightClicked()
if is_player(entity) and uid(entity) == "ae795aa8-6327-408e-92ab-25c8a59f3ba1" and str(sender.getItemInHand().getType()) == "SHEARS" and is_creative(sender):
for _ in range(5):
entity.getWorld().dropItemNaturally(entity.getLocation(), ItemStack(bukkit.Material.getMaterial("REDSTONE")))
entity.getWorld().dropItemNaturally(entity.getLocation(), ItemStack(bukkit.Material.getMaterial("WOOL")))
sender.playSound(entity.getLocation(), "mob.cow.say", 1, 1)
# /pluginversions - print all plugins + versions; useful when updating plugins
@hook.command("pluginversions")
def on_pluginversions_command(sender, args):
plugin_header(sender, "Plugin versions")
plugins = list(server.getPluginManager().getPlugins())
plugins.sort(key = lambda pl: pl.getDescription().getName())
msg(sender, "&3Listing all " + str(len(plugins)) + " plugins and their version:")
for plugin in plugins:
msg(sender, "&6" + plugin.getDescription().getName() + "&r: &e" + plugin.getDescription().getVersion())
return True
plugin_header(sender, "Plugin versions")
plugins = list(server.getPluginManager().getPlugins())
plugins.sort(key = lambda pl: pl.getDescription().getName())
msg(sender, "&3Listing all " + str(len(plugins)) + " plugins and their version:")
for plugin in plugins:
msg(sender, "&6" + plugin.getDescription().getName() + "&r: &e" + plugin.getDescription().getVersion())
return True
# /echo - essentials echo sucks and prints mail alerts sometimes
@hook.command("echo")
def on_echo_command(sender, args):
msg(sender, " ".join(args).replace("\\n", "\n"))
msg(sender, " ".join(args).replace("\\n", "\n"))
# /pyeval - run python ingame
# has to be in main.py so we can access the modules
def eval_thread(sender, code):
try:
result = eval(code)
msg(sender, ">>> %s: %s" % (colorify("&3") + type(result).__name__, colorify("&a") + unicode(result) + "\n "), usecolor = False)
except:
e = exc_info()[1]
try:
eclass = e.__class__
except AttributeError:
eclass = type(e)
msg(sender, ">>> %s: %s" % (eclass.__name__, e) + "\n ", False, "c")
thread.exit()
result = eval(code)
msg(sender, ">>> %s: %s" % (colorify("&3") + type(result).__name__, colorify("&a") + unicode(result) + "\n "), usecolor = False)
except:
e = exc_info()[1]
try:
eclass = e.__class__
except AttributeError:
eclass = type(e)
msg(sender, ">>> %s: %s" % (eclass.__name__, e) + "\n ", False, "c")
thread.exit()
# /pyeval - run python code ingame
@hook.command("pyeval")
def on_pyeval_command(sender, args):
if sender.hasPermission("utils.pyeval"):
if not checkargs(sender, args, 1, -1):
return True
msg(sender, "%s" % " ".join(args), False, "e")
thread.start_new_thread(eval_thread, (sender, " ".join(args)))
else:
noperm(sender)
return True
if sender.hasPermission("utils.pyeval"):
if not checkargs(sender, args, 1, -1):
return True
msg(sender, "%s" % " ".join(args), False, "e")
thread.start_new_thread(eval_thread, (sender, " ".join(args)))
else:
noperm(sender)
return True
# /modules - list all modules, unloaded modules in red
@hook.command("modules")
def on_modules_command(sender, args):
plugin_header(sender, "Modules")
for mod in shared["load_modules"]:
color = "a" if mod in shared["modules"] else "c"
msg(sender, "&" + color + mod)
plugin_header(sender, "Modules")
for mod in shared["load_modules"]:
color = "a" if mod in shared["modules"] else "c"
msg(sender, "&" + color + mod)
# Disable spectator teleportation
@hook.event("player.PlayerTeleportEvent")
def on_player_teleport(event):
player = event.getPlayer()
if not event.isCancelled() and str(event.getCause()) == "SPECTATE" and not player.hasPermission("utils.tp.spectate"):
event.setCancelled(True)
msg(event.getPlayer(), "&cSpectator teleportation is disabled")
player = event.getPlayer()
if not event.isCancelled() and str(event.getCause()) == "SPECTATE" and not player.hasPermission("utils.tp.spectate"):
event.setCancelled(True)
msg(event.getPlayer(), "&cSpectator teleportation is disabled")

32
motd.py
View File

@@ -6,30 +6,30 @@ motd = default_motd
@hook.command("getmotd")
def on_getmotd_command(sender, args):
plugin_header(sender, "MOTD")
msg(sender, motd, usecolor = False)
plugin_header(sender, "MOTD")
msg(sender, motd, usecolor = False)
@hook.command("setmotd")
def on_setmotd_command(sender, args):
global motd
if sender.hasPermission("utils.setmotd"):
if not checkargs(sender, args, 1, -1):
return True
global motd
if sender.hasPermission("utils.setmotd"):
if not checkargs(sender, args, 1, -1):
return True
motd = colorify(" ".join(args).replace("\\n", "\n"))
motd = colorify(" ".join(args).replace("\\n", "\n"))
if motd == "--reset":
motd = default_motd
if motd == "--reset":
motd = default_motd
broadcast(None, plugin_header(name="MOTD"))
broadcast(None, "&aNew MOTD:&r\n%s" % motd)
broadcast(None, " ")
else:
noperm(sender)
return True
broadcast(None, plugin_header(name="MOTD"))
broadcast(None, "&aNew MOTD:&r\n%s" % motd)
broadcast(None, " ")
else:
noperm(sender)
return True
@hook.event("server.ServerListPingEvent")
def on_server_ping(event):
event.setMotd(motd)
event.setMotd(motd)

View File

@@ -10,15 +10,15 @@ z_plot_size = 3
padding = 1
def base_coords(x, z):
pid = plot_id(x, z)
return [pid[0] * (x_plot_size + padding), pid[1] * (z_plot_size + padding)]
pid = plot_id(x, z)
return [pid[0] * (x_plot_size + padding), pid[1] * (z_plot_size + padding)]
def bounds(x, z):
base = base_coords(x, z)
return [base, [base[0] + x_plot_size, base[1] + z_plot_size]]
base = base_coords(x, z)
return [base, [base[0] + x_plot_size, base[1] + z_plot_size]]
def plot_id(x, z):
return [x // (x_plot_size + padding), z // (z_plot_size + padding)]
return [x // (x_plot_size + padding), z // (z_plot_size + padding)]
x = int(sys.argv[1])

View File

@@ -12,128 +12,128 @@ rp_permission = "utils.rp"
def print_help(sender):
msg(sender, " &2/report <text> &eReport something")
msg(sender, " &2/rp list &eList unresolved reports (id, player, text)")
msg(sender, " &2/rp tp <id> &eTeleport to report's location & show details")
msg(sender, " &2/rp del <id> &eResolve a report")
msg(sender, " &2/report <text> &eReport something")
msg(sender, " &2/rp list &eList unresolved reports (id, player, text)")
msg(sender, " &2/rp tp <id> &eTeleport to report's location & show details")
msg(sender, " &2/rp del <id> &eResolve a report")
def print_list(sender):
try: # new thread, anything can happen.
msg(sender, "&a" + str(len(reports)) + " reports:")
for i, report in enumerate(reports):
name = retrieve_player(report["uuid"]).getName()
msg(sender, "&8[&e%s &c%s&8] &3%s&f: &a%s" % (i, report["time"], name, report["msg"]))
except:
warn("Failed to complete report's print_list() thread")
try: # new thread, anything can happen.
msg(sender, "&a" + str(len(reports)) + " reports:")
for i, report in enumerate(reports):
name = retrieve_player(report["uuid"]).getName()
msg(sender, "&8[&e%s &c%s&8] &3%s&f: &a%s" % (i, report["time"], name, report["msg"]))
except:
warn("Failed to complete report's print_list() thread")
def tp_report(sender, rep_id):
if rep_id >= len(reports) or rep_id < 0:
msg(sender, "&cReport &3#" + str(rep_id) + "&c does not exist!")
return True
else:
report = reports[rep_id]
safetp(sender, server.getWorld(report["world"]), report["x"], report["y"], report["z"], report["yaw"], report["pitch"])
msg(sender, "&aTeleported to report #%s" % rep_id )
if rep_id >= len(reports) or rep_id < 0:
msg(sender, "&cReport &3#" + str(rep_id) + "&c does not exist!")
return True
else:
report = reports[rep_id]
safetp(sender, server.getWorld(report["world"]), report["x"], report["y"], report["z"], report["yaw"], report["pitch"])
msg(sender, "&aTeleported to report #%s" % rep_id )
def delete_report(sender, rep_id):
if len(reports) > rep_id >= 0:
report = reports[rep_id]
reports.pop(rep_id)
save_reports()
msg(sender, "&aReport #%s deleted." % rep_id)
reporter = server.getOfflinePlayer(juuid(report["uuid"]))
plugin_header(reporter, "Report")
msg(reporter, "&aReport '&e%s&a' was resolved by %s." % (report["msg"], sender.getName()))
else:
msg(sender, "&cThat report does not exist!")
if len(reports) > rep_id >= 0:
report = reports[rep_id]
reports.pop(rep_id)
save_reports()
msg(sender, "&aReport #%s deleted." % rep_id)
reporter = server.getOfflinePlayer(juuid(report["uuid"]))
plugin_header(reporter, "Report")
msg(reporter, "&aReport '&e%s&a' was resolved by %s." % (report["msg"], sender.getName()))
else:
msg(sender, "&cThat report does not exist!")
def save_reports():
save_json_file("reports", reports)
save_json_file("reports", reports)
@hook.command("rp")
def on_rp_command(sender, args):
if sender.hasPermission(rp_permission):
plugin_header(sender, "Reports")
if len(args) > 0:
if args[0] == "list":
# needs to run in seperate thread because of getOfflinePlayer
thread.start_new_thread(print_list, (sender,))
else:
if not checkargs(sender, args, 2, 2):
return True
try:
repid = int(args[1])
except ValueError:
msg(sender, "&cDoesn't look like &3" + args[1] + "&c is a valid number!")
print_help(sender)
return True
if args[0] == "tp":
if not is_player(sender):
msg(sender, "&conly players can do this")
return True
tp_report(sender, repid)
elif args[0] == "del":
delete_report(sender, repid)
if sender.hasPermission(rp_permission):
plugin_header(sender, "Reports")
if len(args) > 0:
if args[0] == "list":
# needs to run in seperate thread because of getOfflinePlayer
thread.start_new_thread(print_list, (sender,))
else:
if not checkargs(sender, args, 2, 2):
return True
try:
repid = int(args[1])
except ValueError:
msg(sender, "&cDoesn't look like &3" + args[1] + "&c is a valid number!")
print_help(sender)
return True
if args[0] == "tp":
if not is_player(sender):
msg(sender, "&conly players can do this")
return True
tp_report(sender, repid)
elif args[0] == "del":
delete_report(sender, repid)
else:
print_help(sender)
else:
print_help(sender)
print_help(sender)
else:
print_help(sender)
else:
noperm(sender)
return True
noperm(sender)
return True
@hook.command("report")
def on_report_command(sender, args):
plugin_header(sender, "Report")
if not is_player(sender):
msg(sender, "&conly players can do this")
plugin_header(sender, "Report")
if not is_player(sender):
msg(sender, "&conly players can do this")
return True
if not checkargs(sender, args, 1, -1):
return True
text = " ".join(args)
loc = sender.getLocation()
reporter = sender.name
reporter_id = uid(sender)
report = {
"uuid": reporter_id,
"msg": text,
"x": int(loc.x),
"y": int(loc.y),
"z": int(loc.z),
"yaw": int(loc.yaw),
"pitch": int(loc.pitch),
"world": loc.getWorld().name,
"time": time.strftime(time_format)
}
reports.append(report)
save_reports()
broadcast(rp_permission, "&aReport #" + str(len(reports) -1) + ": " + reporter + "&f: " + text)
msg(sender, "&aReported \"&e" + text + "&a\"")
return True
if not checkargs(sender, args, 1, -1):
return True
text = " ".join(args)
loc = sender.getLocation()
reporter = sender.name
reporter_id = uid(sender)
report = {
"uuid": reporter_id,
"msg": text,
"x": int(loc.x),
"y": int(loc.y),
"z": int(loc.z),
"yaw": int(loc.yaw),
"pitch": int(loc.pitch),
"world": loc.getWorld().name,
"time": time.strftime(time_format)
}
reports.append(report)
save_reports()
broadcast(rp_permission, "&aReport #" + str(len(reports) -1) + ": " + reporter + "&f: " + text)
msg(sender, "&aReported \"&e" + text + "&a\"")
return True
def reports_reminder(): # needs 2 args for unknown reason
while True:
for i in range(0, check_delay*2):
time.sleep(0.5) # check every 0.5 seconds if we should kill the thread
if not check_reports:
info("Reports reminder thread killed.")
thread.exit()
if len(reports) > 0:
broadcast(rp_permission, "&2--=[ Reports ]=--")
broadcast(rp_permission, "&aThere are %s pending reports!" % len(reports))
while True:
for i in range(0, check_delay*2):
time.sleep(0.5) # check every 0.5 seconds if we should kill the thread
if not check_reports:
info("Reports reminder thread killed.")
thread.exit()
if len(reports) > 0:
broadcast(rp_permission, "&2--=[ Reports ]=--")
broadcast(rp_permission, "&aThere are %s pending reports!" % len(reports))
def stop_reporting():
global check_reports
info("Ending reports reminder thread")
check_reports = False
global check_reports
info("Ending reports reminder thread")
check_reports = False
thread.start_new_thread(reports_reminder, ())

146
saylol.py
View File

@@ -9,95 +9,95 @@ last_msg = 0
def save_lols():
save_json_file("lol", lols)
save_json_file("lol", lols)
def add_lol(txt):
lols.append(txt)
save_lols()
lols.append(txt)
save_lols()
def del_lol(lid):
lols.pop(lid)
save_lols()
lols.pop(lid)
save_lols()
def print_lol(sender, lid):
global last_msg
if time() - last_msg > timeout:
if len(lols) > lid:
dispname = sender.getDisplayName() if is_player(sender) else sender.getName()
broadcast(None, "&8[&blol&8] &7%s&8: &e%s" % (dispname, lols[lid]))
last_msg = time()
global last_msg
if time() - last_msg > timeout:
if len(lols) > lid:
dispname = sender.getDisplayName() if is_player(sender) else sender.getName()
broadcast(None, "&8[&blol&8] &7%s&8: &e%s" % (dispname, lols[lid]))
last_msg = time()
else:
msg(sender, "&cInvalid id")
else:
msg(sender, "&cInvalid id")
else:
msg(sender, "&cYou can use SayLol again in &a%s seconds!" % int(timeout + 1 - (time() - last_msg)))
msg(sender, "&cYou can use SayLol again in &a%s seconds!" % int(timeout + 1 - (time() - last_msg)))
def search_lols(sender, keyword):
if not keyword:
msg(sender, "&cPlease provide a keyword to search for!")
return
keyword = keyword.lower()
msg(sender, "&aLols containing '&6%s&a':" % keyword)
for i, lol in enumerate(lols):
if keyword in lol.lower():
msg(sender, "&a%s: &e%s" % (str(i).rjust(3), lol))
msg(sender, "") # empty line showing end of list
if not keyword:
msg(sender, "&cPlease provide a keyword to search for!")
return
keyword = keyword.lower()
msg(sender, "&aLols containing '&6%s&a':" % keyword)
for i, lol in enumerate(lols):
if keyword in lol.lower():
msg(sender, "&a%s: &e%s" % (str(i).rjust(3), lol))
msg(sender, "") # empty line showing end of list
@hook.command("lol")
def on_lol_command(sender, args):
plugin_header(sender, "SayLol")
plugin_header(sender, "SayLol")
cmd = args[0] if len(args) > 0 else None
if len(args) == 0:
if sender.hasPermission("utils.lol"):
print_lol(sender, randrange(len(lols)))
else:
noperm(sender)
elif cmd == "id":
if sender.hasPermission("utils.lol.id"):
try:
i = int(args[1])
print_lol(sender, i)
except ValueError:
msg(sender, "&cInvalid number '&e%s&c'" % args[1])
else:
noperm(sender)
elif cmd == "list":
for i in range(len(lols)):
msg(sender, "&a%s: &e%s" % (str(i).rjust(3), lols[i]))
elif cmd == "search":
if sender.hasPermission("utils.lol.search"):
search_lols(sender, " ".join(args[1:]))
else:
noperm(sender)
elif cmd == "add":
if sender.hasPermission("utils.lol.modify"):
add_lol(" ".join(args[1:]))
msg(sender, "&aNew lol message added!")
else:
noperm(sender)
elif cmd == "del":
if sender.hasPermission("utils.lol.modify"):
try:
i = int(args[1])
del_lol(i)
msg(sender, "&aLol message &e#%s&a deleted!" % i)
except ValueError:
msg(sender, "&cInvalid number '&e%s&c'" % args[1])
cmd = args[0] if len(args) > 0 else None
if len(args) == 0:
if sender.hasPermission("utils.lol"):
print_lol(sender, randrange(len(lols)))
else:
noperm(sender)
elif cmd == "id":
if sender.hasPermission("utils.lol.id"):
try:
i = int(args[1])
print_lol(sender, i)
except ValueError:
msg(sender, "&cInvalid number '&e%s&c'" % args[1])
else:
noperm(sender)
elif cmd == "list":
for i in range(len(lols)):
msg(sender, "&a%s: &e%s" % (str(i).rjust(3), lols[i]))
elif cmd == "search":
if sender.hasPermission("utils.lol.search"):
search_lols(sender, " ".join(args[1:]))
else:
noperm(sender)
elif cmd == "add":
if sender.hasPermission("utils.lol.modify"):
add_lol(" ".join(args[1:]))
msg(sender, "&aNew lol message added!")
else:
noperm(sender)
elif cmd == "del":
if sender.hasPermission("utils.lol.modify"):
try:
i = int(args[1])
del_lol(i)
msg(sender, "&aLol message &e#%s&a deleted!" % i)
except ValueError:
msg(sender, "&cInvalid number '&e%s&c'" % args[1])
else:
msg(sender, "&a/lol &eSay random message")
msg(sender, "&a/lol list &eList all messages")
msg(sender, "&a/lol id <id> &eSay specific message")
msg(sender, "&a/lol add <text> &eAdd message")
msg(sender, "&a/lol del <id> &eDelete message")
return True
msg(sender, "&a/lol &eSay random message")
msg(sender, "&a/lol list &eList all messages")
msg(sender, "&a/lol id <id> &eSay specific message")
msg(sender, "&a/lol add <text> &eAdd message")
msg(sender, "&a/lol del <id> &eDelete message")
return True

View File

@@ -4,13 +4,13 @@ from helpers import msg
@hook.event("player.PlayerInteractEvent", "monitor")
def on_block_interact(event):
if (str(event.getAction()) == "RIGHT_CLICK_BLOCK"):
sender = event.getPlayer()
block = event.getClickedBlock().getState()
if (isinstance(block, bukkit.block.Skull) and not event.isCancelled()):
owner = block.getOwner()
if (owner):
msg(sender, "&eThat's %s." % owner)
else:
msg(sender, "&cThis skull has no name (Steve)")
event.setCancelled(True)
if (str(event.getAction()) == "RIGHT_CLICK_BLOCK"):
sender = event.getPlayer()
block = event.getClickedBlock().getState()
if (isinstance(block, bukkit.block.Skull) and not event.isCancelled()):
owner = block.getOwner()
if (owner):
msg(sender, "&eThat's %s." % owner)
else:
msg(sender, "&cThis skull has no name (Steve)")
event.setCancelled(True)

View File

@@ -18,45 +18,45 @@ upmul = 0.95 # multiplicate with goup each row
def spawn(dispname, sender, x, y, z):
"""
Sends the actual player to sender
"""
server = bukkit.getServer().getServer()
world = server.getWorldServer(0) # main world
profile = GameProfile(dispname, dispname) # set player details
manager = PlayerInteractManager(world)
entity = EntityPlayer(server, world, profile, manager) # create Player's entity
entity.setPosition(x, y, z)
packet = PacketPlayOutNamedEntitySpawn(entity) # create packet for entity spawn
sender.getHandle().playerConnection.sendPacket(packet) # send packet
"""
Sends the actual player to sender
"""
server = bukkit.getServer().getServer()
world = server.getWorldServer(0) # main world
profile = GameProfile(dispname, dispname) # set player details
manager = PlayerInteractManager(world)
entity = EntityPlayer(server, world, profile, manager) # create Player's entity
entity.setPosition(x, y, z)
packet = PacketPlayOutNamedEntitySpawn(entity) # create packet for entity spawn
sender.getHandle().playerConnection.sendPacket(packet) # send packet
@hook.command("spawnplayer")
def on_spawnplayer_command(sender, args):
global amount, row, ground, goup
global amount, row, ground, goup
# X and Z position
xpos = sender.getLocation().add(-float(row-1 * shift + (amount * margin) / 2), 0, 0).getX()
row = sender.getLocation().add(0, 0, -row).getZ()
# X and Z position
xpos = sender.getLocation().add(-float(row-1 * shift + (amount * margin) / 2), 0, 0).getX()
row = sender.getLocation().add(0, 0, -row).getZ()
count = 0
stop = False
while not stop:
for i in range(amount):
player = players[count]
x = int(xpos + i*margin)
spawn(player, sender, x, ground, row)
print(player, x, ground, row)
count += 1
if count >= len(players):
stop = True
print "breaking"
break
print("next row")
row -= 1 # next row (-z)
xpos -= shift # shift left
amount += int(shift*margin*2) # add players left and right
if abs(row) % int(goup) == 0:
goup *= upmul
ground += 1
print "Going up by 1: %s" % ground
count = 0
stop = False
while not stop:
for i in range(amount):
player = players[count]
x = int(xpos + i*margin)
spawn(player, sender, x, ground, row)
print(player, x, ground, row)
count += 1
if count >= len(players):
stop = True
print "breaking"
break
print("next row")
row -= 1 # next row (-z)
xpos -= shift # shift left
amount += int(shift*margin*2) # add players left and right
if abs(row) % int(goup) == 0:
goup *= upmul
ground += 1
print "Going up by 1: %s" % ground

View File

@@ -9,13 +9,13 @@ from helpers import *
tilehelpers = open_json_file("tilehelpers", [])
dirmap = {
# [x, y, z]
"n": [0, 0, -1],
"e": [+1, 0, 0],
"s": [0, 0, +1],
"w": [-1, 0, 0],
"u": [0, +1, 0],
"d": [0, -1, 0]
# [x, y, z]
"n": [0, 0, -1],
"e": [+1, 0, 0],
"s": [0, 0, +1],
"w": [-1, 0, 0],
"u": [0, +1, 0],
"d": [0, -1, 0]
}
# FIXME: disallow multiple regions by single person.
@@ -24,111 +24,111 @@ dirmap = {
@hook.event("block.BlockPlaceEvent", "low")
def on_place_block(event):
if not event.isCancelled():
player = event.getPlayer()
block = event.getBlockPlaced()
for th in tilehelpers:
area = th.get("area")
if th.get("owner") == uid(player) and str(block.getWorld().getUID()) == th.get("world") and block.getX() in range(area[0][0], area[0][1]+1) and block.getY() in range(area[1][0], area[1][1]+1) and block.getZ() in range(area[2][0], area[2][1]+1) and event.canBuild():
if not event.isCancelled():
player = event.getPlayer()
block = event.getBlockPlaced()
for th in tilehelpers:
area = th.get("area")
if th.get("owner") == uid(player) and str(block.getWorld().getUID()) == th.get("world") and block.getX() in range(area[0][0], area[0][1]+1) and block.getY() in range(area[1][0], area[1][1]+1) and block.getZ() in range(area[2][0], area[2][1]+1) and event.canBuild():
# stack block in directions
for direction in th.get("directions"):
directions = dirmap[direction]
size = [
1 + abs(area[0][1] - area[0][0]),
1 + abs(area[1][1] - area[1][0]),
1 + abs(area[2][1] - area[2][0])
]
against = event.getBlockAgainst()
# stack block in directions
for direction in th.get("directions"):
directions = dirmap[direction]
size = [
1 + abs(area[0][1] - area[0][0]),
1 + abs(area[1][1] - area[1][0]),
1 + abs(area[2][1] - area[2][0])
]
against = event.getBlockAgainst()
newblock = block.getWorld().getBlockAt(
block.getX() + size[0] * directions[0],
block.getY() + size[1] * directions[1],
block.getZ() + size[2] * directions[2]
)
newblock = block.getWorld().getBlockAt(
block.getX() + size[0] * directions[0],
block.getY() + size[1] * directions[1],
block.getZ() + size[2] * directions[2]
)
newagainst = against.getWorld().getBlockAt(
against.getX() + size[0] * directions[0],
against.getY() + size[1] * directions[1],
against.getZ() + size[2] * directions[2]
)
newstate = newblock.getState()
newstate.setType(block.getType())
newstate.setData(block.getState().getData())
newagainst = against.getWorld().getBlockAt(
against.getX() + size[0] * directions[0],
against.getY() + size[1] * directions[1],
against.getZ() + size[2] * directions[2]
)
newstate = newblock.getState()
newstate.setType(block.getType())
newstate.setData(block.getState().getData())
event = BlockPlaceEvent(newstate.getBlock(), newblock.getState(), newagainst, event.getItemInHand(), player, event.canBuild())
server.getPluginManager().callEvent(event)
if not event.isCancelled():
newblock.setType(block.getType())
newblock.setData(block.getData())
event = BlockPlaceEvent(newstate.getBlock(), newblock.getState(), newagainst, event.getItemInHand(), player, event.canBuild())
server.getPluginManager().callEvent(event)
if not event.isCancelled():
newblock.setType(block.getType())
newblock.setData(block.getData())
@hook.event("block.BlockBreakEvent", "low")
def on_break_block(event):
if not event.isCancelled():
player = event.getPlayer()
block = event.getBlock()
for th in tilehelpers:
area = th.get("area")
if th.get("owner") == uid(player) and str(block.getWorld().getUID()) == th.get("world") and block.getX() in range(area[0][0], area[0][1]+1) and block.getY() in range(area[1][0], area[1][1]+1) and block.getZ() in range(area[2][0], area[2][1]+1):
if not event.isCancelled():
player = event.getPlayer()
block = event.getBlock()
for th in tilehelpers:
area = th.get("area")
if th.get("owner") == uid(player) and str(block.getWorld().getUID()) == th.get("world") and block.getX() in range(area[0][0], area[0][1]+1) and block.getY() in range(area[1][0], area[1][1]+1) and block.getZ() in range(area[2][0], area[2][1]+1):
# stack block in directions
for direction in th.get("directions"):
directions = dirmap[direction]
size = [
1 + abs(area[0][1] - area[0][0]),
1 + abs(area[1][1] - area[1][0]),
1 + abs(area[2][1] - area[2][0])
]
# stack block in directions
for direction in th.get("directions"):
directions = dirmap[direction]
size = [
1 + abs(area[0][1] - area[0][0]),
1 + abs(area[1][1] - area[1][0]),
1 + abs(area[2][1] - area[2][0])
]
newblock = block.getWorld().getBlockAt(
block.getX() + size[0] * directions[0],
block.getY() + size[1] * directions[1],
block.getZ() + size[2] * directions[2]
)
newblock = block.getWorld().getBlockAt(
block.getX() + size[0] * directions[0],
block.getY() + size[1] * directions[1],
block.getZ() + size[2] * directions[2]
)
event = BlockBreakEvent(newblock, player)
server.getPluginManager().callEvent(event)
if not event.isCancelled():
newblock.setTypeId(0)
event = BlockBreakEvent(newblock, player)
server.getPluginManager().callEvent(event)
if not event.isCancelled():
newblock.setTypeId(0)
@hook.event("player.PlayerInteractEvent", "low")
def on_block_interact(event):
action = event.getAction()
if not event.isCancelled() and str(action) == "RIGHT_CLICK_BLOCK":
player = event.getPlayer()
block = event.getClickedBlock()
for th in tilehelpers:
area = th.get("area")
if th.get("owner") == uid(player) and str(block.getWorld().getUID()) == th.get("world") and block.getX() in range(area[0][0], area[0][1]+1) and block.getY() in range(area[1][0], area[1][1]+1) and block.getZ() in range(area[2][0], area[2][1]+1):
action = event.getAction()
if not event.isCancelled() and str(action) == "RIGHT_CLICK_BLOCK":
player = event.getPlayer()
block = event.getClickedBlock()
for th in tilehelpers:
area = th.get("area")
if th.get("owner") == uid(player) and str(block.getWorld().getUID()) == th.get("world") and block.getX() in range(area[0][0], area[0][1]+1) and block.getY() in range(area[1][0], area[1][1]+1) and block.getZ() in range(area[2][0], area[2][1]+1):
# stack block in directions
for direction in th.get("directions"):
directions = dirmap[direction]
size = [
1 + abs(area[0][1] - area[0][0]),
1 + abs(area[1][1] - area[1][0]),
1 + abs(area[2][1] - area[2][0])
]
# stack block in directions
for direction in th.get("directions"):
directions = dirmap[direction]
size = [
1 + abs(area[0][1] - area[0][0]),
1 + abs(area[1][1] - area[1][0]),
1 + abs(area[2][1] - area[2][0])
]
newblock = block.getWorld().getBlockAt(
block.getX() + size[0] * directions[0],
block.getY() + size[1] * directions[1],
block.getZ() + size[2] * directions[2]
)
newblock = block.getWorld().getBlockAt(
block.getX() + size[0] * directions[0],
block.getY() + size[1] * directions[1],
block.getZ() + size[2] * directions[2]
)
event = PlayerInteractEvent(event.getPlayer(), action, event.getItem(), newblock, event.getBlockFace())
server.getPluginManager().callEvent(event)
if not event.isCancelled():
# FIXME: do not use bukkit API calls outside main thread
thread.start_new_thread(update_block, (block, newblock))
event = PlayerInteractEvent(event.getPlayer(), action, event.getItem(), newblock, event.getBlockFace())
server.getPluginManager().callEvent(event)
if not event.isCancelled():
# FIXME: do not use bukkit API calls outside main thread
thread.start_new_thread(update_block, (block, newblock))
def update_block(block, newblock):
try: # we're in a thread, the universe may hace collapsed in another thread
sleep(0.2)
newblock.setType(block.getType())
newblock.setData(block.getData())
except Exception, e:
error("Failed to update %s block in %s at %s,%s,%s: '%s'" % (str(block.getType()), block.getWorld().getName(), block.getX(), block.getY(), block.getZ(), e))
try: # we're in a thread, the universe may hace collapsed in another thread
sleep(0.2)
newblock.setType(block.getType())
newblock.setData(block.getData())
except Exception, e:
error("Failed to update %s block in %s at %s,%s,%s: '%s'" % (str(block.getType()), block.getWorld().getName(), block.getX(), block.getY(), block.getZ(), e))

View File

@@ -18,96 +18,96 @@ from random import randrange
def mysql_query(query, args, fetch = True):
conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver")
curs = conn.cursor()
curs.execute(query, args)
if fetch:
results = curs.fetchall()
else:
results = conn.commit()
curs.close()
conn.close()
return results
conn = zxJDBC.connect(mysql_database, mysql_user, mysql_pass, "com.mysql.jdbc.Driver")
curs = conn.cursor()
curs.execute(query, args)
if fetch:
results = curs.fetchall()
else:
results = conn.commit()
curs.close()
conn.close()
return results
def generate_token(length):
cons = 'bcdfghjklmnpqrstvwxyz'
vows = 'aeiou'
cons = 'bcdfghjklmnpqrstvwxyz'
vows = 'aeiou'
token = ''
start = randrange(2)
for i in range(0, length):
if i % 2 == start:
token += cons[randrange(21)]
else:
token += vows[randrange(5)]
return token
token = ''
start = randrange(2)
for i in range(0, length):
if i % 2 == start:
token += cons[randrange(21)]
else:
token += vows[randrange(5)]
return token
def get_token(uuid):
results = mysql_query("SELECT DISTINCT `token`, `email` FROM register_tokens WHERE `uuid` = ? LIMIT 1", (uuid,))
return results[0] if len(results) == 1 else None
results = mysql_query("SELECT DISTINCT `token`, `email` FROM register_tokens WHERE `uuid` = ? LIMIT 1", (uuid,))
return results[0] if len(results) == 1 else None
def token_command(sender):
plugin_header(sender, "Website Token")
if is_player(sender):
try:
token = get_token(sender.getUniqueId().toString().replace("-", ""))
if token:
msg(sender, "&aEmail: &e%s" % token[1])
msg(sender, "&aToken: &e%s" % token[0])
msg(sender, "&cIMPORTANT: never share the token with anyone!")
msg(sender, "&cIt could be used to claim your website account!")
else:
msg(sender, "&cYou don't have a token yet! Use &e/gettoken <email>&c.")
except Exception, e:
error(e)
msg(sender, "&cError getting your token, please contact an admin!")
else:
msg(sender, "&cThis is only for players..")
plugin_header(sender, "Website Token")
if is_player(sender):
try:
token = get_token(sender.getUniqueId().toString().replace("-", ""))
if token:
msg(sender, "&aEmail: &e%s" % token[1])
msg(sender, "&aToken: &e%s" % token[0])
msg(sender, "&cIMPORTANT: never share the token with anyone!")
msg(sender, "&cIt could be used to claim your website account!")
else:
msg(sender, "&cYou don't have a token yet! Use &e/gettoken <email>&c.")
except Exception, e:
error(e)
msg(sender, "&cError getting your token, please contact an admin!")
else:
msg(sender, "&cThis is only for players..")
def tokengen_command(sender, args):
plugin_header(sender, "Website Token")
if is_player(sender):
if len(args) < 1:
msg(sender, "&cPlease use &e/gettoken <email adress>")
plugin_header(sender, "Website Token")
if is_player(sender):
if len(args) < 1:
msg(sender, "&cPlease use &e/gettoken <email adress>")
else:
# email may contain spaces
mail = " ".join(args)
# email regex, needs something followed by an @ followed by domain or IP
if match("^.+@(.+\\..{2,}|\\[[0-9a-fA-F:.]+\\])$", mail) != None:
token = generate_token(6)
uuid = sender.getUniqueId().toString().replace("-", "")
try:
mysql_query("DELETE FROM register_tokens WHERE `uuid` = ?", (uuid,), False)
mysql_query("INSERT INTO register_tokens (`uuid`, `token`, `email`) VALUES (?, ?, ?)", (uuid, token, mail), False)
msg(sender, "&aToken generated!")
msg(sender, "&aEmail: &e%s" % mail)
msg(sender, "&aToken: &e%s" % token)
msg(sender, "&cIMPORTANT: never share the token with anyone!")
msg(sender, "&cIt could be used to claim your website account!")
except Exception, e:
error(e)
msg(sender, "&cError getting your token, please contact an admin!")
else:
msg(sender, "&c'&6%s&c' doesn't look like a valid email adress!" % mail)
else:
# email may contain spaces
mail = " ".join(args)
# email regex, needs something followed by an @ followed by domain or IP
if match("^.+@(.+\\..{2,}|\\[[0-9a-fA-F:.]+\\])$", mail) != None:
token = generate_token(6)
uuid = sender.getUniqueId().toString().replace("-", "")
try:
mysql_query("DELETE FROM register_tokens WHERE `uuid` = ?", (uuid,), False)
mysql_query("INSERT INTO register_tokens (`uuid`, `token`, `email`) VALUES (?, ?, ?)", (uuid, token, mail), False)
msg(sender, "&aToken generated!")
msg(sender, "&aEmail: &e%s" % mail)
msg(sender, "&aToken: &e%s" % token)
msg(sender, "&cIMPORTANT: never share the token with anyone!")
msg(sender, "&cIt could be used to claim your website account!")
except Exception, e:
error(e)
msg(sender, "&cError getting your token, please contact an admin!")
else:
msg(sender, "&c'&6%s&c' doesn't look like a valid email adress!" % mail)
else:
msg(sender, "&cThis is only for players..")
msg(sender, "&cThis is only for players..")
@hook.command("token")
def on_token_command(sender, args):
thread.start_new_thread(token_command, (sender,))
return True
thread.start_new_thread(token_command, (sender,))
return True
@hook.command("gettoken")
def on_gettoken_command(sender, args):
thread.start_new_thread(tokengen_command, (sender, args))
return True
thread.start_new_thread(tokengen_command, (sender, args))
return True