first commit via git

This commit is contained in:
jomo
2014-05-16 23:04:40 +02:00
commit b7de342537
15 changed files with 972 additions and 0 deletions

55
adminchat.py Executable file
View File

@@ -0,0 +1,55 @@
from helpers import *
import org.bukkit as bukkit
ac_permission = "utils.ac"
ac_key = ","
ac_toggle_list = []
def adminchat(sender, msg):
name = "&7{unknown}"
try:
name = sender.getDisplayName()
except:
name = sender.getName()
broadcast(ac_permission, "&8[&bAC&8] &9%s&8: &b%s" % (name, msg))
# ac toggle
@hook.command("act")
def onCommand(sender,args):
if sender.hasPermission(ac_permission):
p = sender.getName()
if p in ac_toggle_list:
ac_toggle_list.remove(p)
msg(sender, "&8[&bAC&8] &aAC toggle: off")
else:
ac_toggle_list.append(p)
msg(sender, "&8[&bAC&8] &aAC toggle: on")
else:
noperm(sender)
return True
@hook.command("ac")
def onCommand(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
@hook.event("player.PlayerChatEvent", "normal")
def onChat(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)

96
chatgroups.py Executable file
View File

@@ -0,0 +1,96 @@
from helpers import *
import simplejson as json
import org.bukkit as bukkit
chatgroups_filename = "plugins/RedstonerUtils.py.dir/files/chatgroups.json"
groups = {}
cg_key = "."
cg_toggle_list = []
try:
groups = json.loads(open(chatgroups_filename).read())
except Exception, e:
error("Failed to load chatgroups: %s" % e)
@hook.command("chatgroup")
def onCommand(sender, args):
try:
plugHeader(sender, "ChatGroups")
if len(args) == 1 and args[0] == "leave":
if sender.getName() in groups.keys():
groupchat(sender, "left the group", True)
group = groups[sender.getName()]
del(groups[sender.getName()])
saveGroups()
else:
msg(sender, "&aYou can't leave no group, derp!")
elif len(args) == 1 and args[0] == "info":
if sender.getName() in groups.keys():
group = groups[sender.getName()]
msg(sender, "&aCurrent chatgroup: %s" % group)
users = []
for user, ugroup in groups.iteritems():
if ugroup == group: users += [user]
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.getName()] = args[1]
groupchat(sender, "joined the group", True)
saveGroups()
msg(sender, "&aYour chatgroup is set to '%s'" % args[1])
msg(sender, "&aAnyone in the group sees chat that begins with &e%s" % cg_key)
else:
msg(sender, "&e/chatgroup join <name>")
msg(sender, "&e/chatgroup leave")
msg(sender, "&e/chatgroup info")
except Exception, e:
error(e)
@hook.command("cgt")
def onCommand(sender,args):
p = sender.getName()
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[&bAC&8] &e&oCG toggle: on")
return True
def groupchat(sender, message, ann=False):
#try:
group = groups.get(sender.getName())
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)
for receiver in server.getOnlinePlayers():
groups.get(receiver.getName()) == group and msg(receiver, mesg)
#except Exception, e:
# error(e)
def saveGroups():
try:
chatgroups_file = open(chatgroups_filename, "w")
chatgroups_file.write(json.dumps(groups))
chatgroups_file.close()
except Exception, e:
error("Failed to write reports: " + str(e))
@hook.event("player.PlayerChatEvent", "normal")
def onChat(event):
sender = event.getPlayer()
msg = event.getMessage()
if not event.isCancelled():
if msg[:len(cg_key)] == cg_key and sender.getName() in groups.keys():
groupchat(sender, msg[1:])
event.setCancelled(True)
elif sender.getName() in cg_toggle_list:
groupchat(sender, msg)
event.setCancelled(True)

1
files/chatgroups.json Executable file
View File

@@ -0,0 +1 @@
{"TeoDiLenarda": "BTV", "MisaXage": "BTV", "cheetie": "sheep", "abh037": "9x9", "yop_tropix": "BTV", "oxmanlyfire123": "test", "minepro158": "trial", "eniallator": "BTV"}

1
files/lol.json Executable file
View File

@@ -0,0 +1 @@
["wat is bynarie?", "I made a 1 tick OR gate!", "I had my muke mited the entire time!", "Wat ave you done ere!", "I aspire to be as grammer as you!", "you're doing it wrogn!", "It smells like someone sneezed!", "NEVER EAT SHREDDED WHEAT!", "that's not funneh", "do you even elevator?", "half empty or half full?", "ERMAGAWD! is that disco?! :o", "stop. hammertime.", "made by redstone_sheep!", "roses are red, violets are blue, i have a gun, get in the van.", "i like turtles.", "blargh", "Algorythm! Best rythm ever!", "Who is binary?", "Derp!", "the pie is a truth!", "have you tried turning it off and on again?", "you borke it!", "you don't even dicoder!", "because racecar!", "Hikkup!... Hikkup!", "I'm not even angry", "connected with a potato using MineFood", "Never gonna give you up!", "May death rain upon them", "itz Dico! :o", ".o/", "Let's go to YOLO Country, California!", "I have more ram than a flock of sheep!", "ain't nobody got time for that?", "my dog is on the roof!", "'#swaghetti #yolonaise'", "Letz Shear Redstone Sheep!", "bannanaboats!", "OMG WHO THE HELL CARS!", "BAM! that's the bam.", "nice banana, bannana!", "There's something in your face!", "it was paaaiin!", "It's so fluffy I'm gonna die!!", "There's a snake in my boot", "no, this is Patrick", "S*** MY MOM IS A RAPPER", "'[pointless button]'", "Bazinga!!!!!!", "SayLol is on bukkit.org !", "Pigglys Dad Is a RAIL", "Hey apple! - WHAT? - knife.", "&dFloyd!", "Looks like somone farted!", "don't be a dico!", "iTouch kids!", "/lolwut", "pistatoens!", "IKR", "RTFM!!", "Can i haz An aussie kiss ?", "It's a kind of magic", "Captain Obvious srikes again!", "I made a JebExtender!", "I made a Lock-O-Stable!", "What is the charge?!", "Doggie afuera!", "DOOM THE DERP!", "Gunder shot first!", "Hoppers In redstoner LOL", "Better, Faster, Smaller!!", "Unforgivable grammer!", "I'M FROM PLANET MINECRAFT, CAN I HAVE OP TO REVIEW YOUR SERVER?", "Luke, use the mass times acceleration!", "Suicide cake!!!!", "(\u30ce\u0ca0\u76ca\u0ca0)\u30ce\u5f61\u253b\u2501\u253b \u10da(\u0ca0\u76ca\u0ca0\u10da) TABLE TENNIS!", "Halloween = Christmas; 31 OCT = 25 DEC", "TRY RESETING IT FIRST!", "Java coders don't C#!", "DEATH TO GOOGLE+", "YOU'RE A WIZARD HARRY!", "&cYou can use SayLol again in &a0 seconds!", "Disney600!", "Do an aileron roll!", "only ENGUIRSH in chat now!", "io.netty!", "eni1 need halp?", "Oppa Gunder Style!", "I won't sleep until I find a cure for my insomnia!", "Its impossible to make perfection better", "sounds like you're choking on a hambgurger", "Mountain DEWM", "Coca Colo", "This is legit yo", "Why not", "You may not rest now, there is a dance off nearby!", "Thats what she said!", "WHAT DID YOU DO I DON'T EVEN", "I invented a new word, its called Plaigerism", "IT'S OVER 9000!!!!!!!!!", "Officially an unofficial WR in minecraft", "On a scale 1-10, what's your favorite color of the alphabet?", "Happy birthday Redstoner!", "OMG IT SPINS!", "such lol, much lols, very funny", "April Fools!", "Sheep Simulator!", "u wot m8", "If my plot gets rotated, would it be a plot twist?", "Written in Python!"]

1
files/reports.json Executable file
View File

@@ -0,0 +1 @@
[]

74
helpers.py Executable file
View File

@@ -0,0 +1,74 @@
from re import sub
import org.bukkit as bukkit
import org.bukkit.Location as Location
import org.bukkit.entity.Player as Player
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause as TeleportCause
import org.bukkit.block as block
from java.util.logging import Level
server = bukkit.Bukkit.getServer()
def log(text):
server.getLogger().info("[RedstonerUtils] %s" % colorify(text))
def error(text):
server.getLogger().severe("[RedstonerUtils] %s" % text)
def msg(player, text, usecolor=True, basecolor=None):
if player and (player == server.getConsoleSender() or player.getPlayer()): #getPlayer() returns None when offline
if basecolor:
player.sendMessage(colorify("&%s" % basecolor) + (colorify(text) if usecolor else text))
else:
player.sendMessage(colorify(text) if usecolor else text)
# better than bukkit's broadcast.
# bukkit only works with permissibles that are subscribed to perm
def broadcast(perm, text):
try:
text = colorify(text)
for recipient in server.getOnlinePlayers().tolist() + [server.getConsoleSender()]:
(not perm or recipient.hasPermission(perm)) and msg(recipient, text)
except Exception, e:
error(e)
def colorify(text):
return sub("&(?=[?\da-fk-or])", u"\u00A7", "%s" % text)
def safetp(player, world, x, y, z, yaw=0, pitch=0):
tpblock = Location(world, x, y, z).getBlock()
if (tpblock.isEmpty() and tpblock.getRelative(block.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 plugHeader(sender, name):
msg(sender, "&2--=[ %s ]=--" % name)
def noperm(player):
msg(player, "&cno permission")
def runas(player, cmd):
server.dispatchCommand(player, cmd)
def isPlayer(sender):
return (isinstance(sender, Player))
def checkargs(sender, args, min, max):
if not (len(args) >= min and (max < 0 or len(args) <= max)):
if min == max:
msg(sender, "&cNeeds " + str(min) + " arguments!")
return False
elif max < 0:
msg(sender, "&cNeeds at least " + str(min) + " arguments!")
return False
else:
msg(sender, "&cNeeds " + str(min) + " to " + str(max) + " arguments!")
return False
return True
def warp(sender, args, warpname):
if not checkargs(sender, args, 0, 1):
return True
runas(sender, " ".join(["warp", warpname, sender.getName()]))
return True

61
lagchunks.py Executable file
View File

@@ -0,0 +1,61 @@
import org.bukkit as bukkit
from helpers import *
lagchunks = []
def printHelp(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")
def scanChunks(amount):
try:
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
except Exception, e:
error(e)
def listChunks(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------------------")
def tpChunk(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]))
@hook.command("lagchunks")
def onCommand(sender, args):
try:
if sender.hasPermission("utils.lagchunks"):
plugHeader(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, )
scanChunks(int(amount))
listChunks(sender)
elif len(args) == 1 and args[0].lower() == "list":
listChunks(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):
tpChunk(sender, int(args[1]))
else:
msg(sender, "&cOnly players can do this!")
else:
printHelp(sender)
else:
noperm(sender)
return True
except Exception, e:
error(e)

284
main.py Executable file
View File

@@ -0,0 +1,284 @@
__plugin_name__ = "RedstonerUtils"
__plugin_version__ = "3.0"
__plugin_mainclass__ = "foobar"
import sys
# damn pythonloader changed this...
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:
import adminchat
except Exception, e:
print("[RedstonerUtils] ERROR: Failed to import adminchat: %s" % e)
try:
import lagchunks
except Exception, e:
print("[RedstonerUtils] ERROR: Failed to import lagchunks: %s" % e)
try:
import reports
except Exception, e:
print("[RedstonerUtils] ERROR: Failed to import reports: %s" % e)
try:
import chatgroups
except Exception, e:
print("[RedstonerUtils] ERROR: Failed to import chatgroups: %s" % e)
try:
import webtoken
except Exception, e:
print("[RedstonerUtils] ERROR: Failed to import webtoken: %s" % e)
try:
import saylol
except Exception, e:
print("[RedstonerUtils] ERROR: Failed to import saylol: %s" % e)
try:
import skullclick
except Exception, e:
print("[RedstonerUtils] ERROR: Failed to import saylol: %s]" % e)
try:
from helpers import *
except Exception, e:
print("[RedstonerUtils] ERROR: Failed to import helpers: %s" % e)
import thread
import org.bukkit.entity.Player as Player
@hook.enable
def onEnable():
log("RedstonerUtils enabled!")
@hook.disable
def onDisable():
reports.stopChecking()
log("RedstonerUtils disabled!")
# warp aliases
@hook.command("spawn")
def onCommand(sender, args):
warp(sender, args, "spawn")
return True
@hook.command("cr")
def onCommand(sender, args):
warp(sender, args, "cr")
return True
@hook.command("tr")
def onCommand(sender, args):
warp(sender, args, "tr")
return True
@hook.command("faq")
def onCommand(sender, args):
warp(sender, args, "faq")
return True
# misc
@hook.event("player.PlayerJoinEvent", "monitor")
def onJoin(event):
player = event.getPlayer()
for item in player.getInventory():
if (item != None and item.getTypeId() == 175 and item.getDurability() > 5):
item.setDurability(0)
log("&cPlayer '%s' had 175:6 or higher in his inventory! Replaced with 175:0" % player.getName())
msg(player, " &a----------------------------------------------------")
msg(player, " &4&lWARNING: &cYou had 175:7 (invalid flower) in your inventory.")
msg(player, " &cThis crashes your client. We have replaced it with 175:0.")
msg(player, " &a----------------------------------------------------")
if not server.getOfflinePlayer(player.getName()).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, " &6please make sure to read the info here:")
msg(player, " &6/The FAQ at /spawn")
msg(player, " &6/rules")
msg(player, " &6/ranks")
msg(player, " &6thank you and happy playing ;)")
msg(player, " \n ")
def evalThread(foo, sender, code):
try:
msg(sender, "%s" % unicode(eval(code)), False, "a")
except Exception, e:
msg(sender, "%s: %s" % (e.__class__.__name__, e), False, "c")
thread.exit()
@hook.command("pyeval")
def onCommand(sender, args):
if sender.hasPermission("utils.pyeval"):
if not checkargs(sender, args, 1, -1):
return True
msg(sender, "%s" % " ".join(args), False, "e")
try:
thread.start_new_thread(evalThread, ("foo", sender, " ".join(args)))
except Exception, e:
msg(sender, "&cInternal error: %s" % e)
else:
noperm(sender)
return True
@hook.command("sudo")
def onCommand(sender, args):
if sender.hasPermission("utils.sudo"):
plugHeader(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)
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
# text things
@hook.command("rules")
def onCommand(sender, args):
if not checkargs(sender, args, 0, 0):
return True
arrow = u"\u2192"
plugHeader(sender, "Redstoner rules")
msg(sender, "&31 &7" + arrow + " &bMake use of common sense and respect.")
msg(sender, "&32 &7" + arrow + " &bDo NOT ask for promotion.")
msg(sender, "&33 &7" + arrow + " &bDo NOT use cheats in Survival worlds.")
msg(sender, "&34 &7" + arrow + " &bDo NOT spam entities or leave clocks running.")
msg(sender, "&35 &7" + arrow + " &bSwearing is okay, offending is NOT.")
msg(sender, "&36 &7" + arrow + " &bDo NOT build huge walls around your plot.")
msg(sender, "&37 &7" + arrow + " &bListen to the admins and mods, even if it is not in the rules.")
msg(sender, "&38 &7" + arrow + " &bOnly english in public chat.")
msg(sender, "&39 &7" + arrow + " &bEveryone can get punished, even admins.")
msg(sender, "&310 &7" + arrow + " &bSame rules for everyone.")
msg(sender, "&311 &7" + arrow + " &bNO OP items.")
msg(sender, "&312 &7" + arrow + " &bDo NOT trap other players.")
return True
@hook.command("history")
def onCOmmand(sender, args):
if not checkargs(sender, args, 0, 0):
return True
plugHeader(sender, "Redstoner history")
msg(sender, "")
msg(sender, " &2First, oliverissocool1 owned redstoner.com plus the server which usually had 10-15 players on.")
msg(sender, "")
msg(sender, " &2Oliver became lazy and thus moved ownership to oleerik, who was another admin there.")
msg(sender, "")
msg(sender, " &2Dico joined the server and later he became a moderator.")
msg(sender, "")
msg(sender, " &2But then oleerik also became lazy, lost interest and shut down the server.")
msg(sender, "")
msg(sender, " &2Some time later he offered dico to use the server and he was - of course - interested in it.")
msg(sender, "")
msg(sender, " &2The server did not have the old worlds and configuration anymore and it was down for a good while, so it was like a complete new server.")
msg(sender, "")
msg(sender, " &2He invited some friends to help him set up the server before opening it to the public (as his 'fan server').")
msg(sender, "")
msg(sender, " &2Redstone Sheep was one of these friends and made the website, he happened to become the guy who maintains the whole server.")
msg(sender, "")
msg(sender, " &2The server somtimes crashed or lost it's connection and we were not too happy plus oleerik was always paying for it, without using it himself.")
msg(sender, "")
msg(sender, " &2PanFritz first helped out by donating and then offered to host a physical server.")
msg(sender, "")
msg(sender, " &2We discussed a lot and moved everything, it worked very well.")
msg(sender, "")
msg(sender, " &2A month or two later, a new server was bought from donations and it took some time until the new machine was ready, but the move went quick and without much downtime.")
msg(sender, "")
msg(sender, " &2Another couple months later, the server underwent many major changes, this update was known as Redstoner 2.0 and vastly improved almost every aspect of the server.")
msg(sender, "")
msg(sender, " &2That's our story for now.")
return True
@hook.command("nick")
def onCommand(sender, args):
plugHeader(sender, "Nicknames")
msg(sender, "&31. &aYou need to be Donor or Trusted. &8&o(See /ranks)")
msg(sender, "&32. &aHas to begin with &nat least&3&o " + sender.getName()[:3] + "&a.")
msg(sender, "&33. &aMore characters are required when other players")
msg(sender, "&a begin with the same 3 letters.")
msg(sender, "&34. &aIt must not be longer than your name.")
msg(sender, "&a (e.g. No addons like '&3" + sender.getName() + "TheCoolOne&a'.)")
msg(sender, "&6Ask any staff to get your nickname. Requests are ignored when requirements are not covered. Be patient.")
return True
@hook.command("ranks")
def onCommand(sender, args):
if not checkargs(sender, args, 0, 0):
return True
plugHeader(sender, "Rank colours")
msg(sender, " &7Guest")
msg(sender, " &fMember")
msg(sender, " &aBuilder")
msg(sender, " &3Trusted")
msg(sender, " &cModerator")
msg(sender, " &4Admin")
plugHeader(sender, "Rank info")
msg(sender, " &oitalic &rnames are nicks. use &a/realname <nick>&r to check")
msg(sender, " &eDonator&r rank has <name> &e$&r")
msg(sender, " &eDonator+&r rank has <name> &e&l$&r")
msg(sender, " To get the &e$&r, see &a/donate&r for more info")
msg(sender, "")
return True
@hook.command("donate")
def onCommand(sender, args):
if not checkargs(sender, args, 0, 0):
return True
msg(sender, "")
plugHeader(sender, "Donations")
msg(sender, " &aWant to donate? Awesome!")
msg(sender, " &6all info is at &nredstoner.com/donate&r")
msg(sender, "")
return True
# debug and logging
@hook.command("pluginversions")
def onCommand(sender, args):
plugHeader(sender, "Plugin versions")
plugins = server.getPluginManager().getPlugins().tolist()
plugins.sort(key=lambda pl: pl.getName())
msg(sender, "&3Listing all " + str(len(plugins)) + " plugins and their version:")
for plugin in plugins:
msg(sender, "&6" + plugin.getName() + "&r: &e" + plugin.getDescription().getVersion())
return True

21
mysqlhack.py Executable file
View File

@@ -0,0 +1,21 @@
import java.lang.reflect.Method
import java.io.File
import java.net.URL
import java.net.URLClassLoader
import jarray
from java.lang import Class
# hacky code to add mysql-connector to java's classpath ('classPathHack')
jarfile = "lib/mysql-connector-java-5.1.14-bin.jar"
driver = "com.mysql.jdbc.Driver"
url = java.io.File(jarfile).toURL()
sysloader = java.lang.ClassLoader.getSystemClassLoader()
sysclass = java.net.URLClassLoader
method = sysclass.getDeclaredMethod("addURL", [java.net.URL])
method.setAccessible(1)
jarray.array([url], java.lang.Object)
method.invoke(sysloader, [url])
Class.forName(driver)

28
plotter.py Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/python
# this was going to be a PlotMe-like plugin "plotter"
# but it seems like PlotMe is still beeing developed, so we don't need our own.
import sys
x_plot_size = 3
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)]
def bounds(x, z):
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)]
x = int(sys.argv[1])
z = int(sys.argv[2])
print "id: %s" % plot_id(x, z)
print "base: %s" % base_coords(x, z)
print "bounds: %s" % bounds(x, z)

4
plugin.yml Executable file
View File

@@ -0,0 +1,4 @@
name: RedstonerUtils
main: main.py
version: v3.0.0
author: redstone_sheep

133
reports.py Executable file
View File

@@ -0,0 +1,133 @@
from helpers import *
import simplejson as json
import time
import sys
import os
import thread
# pythonloader changes this for some reason..
#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']
reports_filename = "plugins/RedstonerUtils.py.dir/files/reports.json"
time_format = "%Y.%m.%d %H:%M"
reports = []
check_reports = True
check_delay = 60*10 # seconds
try:
reports = json.loads(open(reports_filename).read())
except Exception, e:
error("Failed to load reports: %s" % e)
def printHelp(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")
def printList(sender):
msg(sender, "&a" + str(len(reports)) + " reports:")
for i, report in enumerate(reports):
msg(sender, "&8[&e" + str(i) + " &c" + report['time'] + "&8] &3" + report['player'] + "&f: &a" + report['msg'])
def tp(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 )
def deleteReport(sender, rep_id):
report = reports[rep_id]
reports.pop(rep_id)
saveReports()
msg(sender, "&aReport #%s deleted." % rep_id)
reporter = server.getOfflinePlayer(report['player'])
plugHeader(reporter, "Report")
msg(reporter, "&aReport '&e%s&a' was resolved by %s." % (report['msg'], sender.getName()))
def saveReports():
try:
reports_file = open(reports_filename, "w")
reports_file.write(json.dumps(reports))
reports_file.close()
except Exception, e:
error("Failed to write reports: " + str(e))
@hook.command("rp")
def onCommand(sender, args):
if sender.hasPermission("utils.rp"):
plugHeader(sender, "Reports")
if len(args) > 0:
if args[0] == "list":
printList(sender)
else:
if not checkargs(sender, args, 2, 2):
return True
try:
repid = int(args[1])
except:
msg(sender, "&cDoesn't look like &3" + args[1] + "&c is a valid number!")
printHelp(sender)
return True
if args[0] == "tp":
if not isPlayer(sender):
msg(sender, "&conly players can do this")
return True
tp(sender, repid)
elif args[0] == "del":
deleteReport(sender, repid)
else:
printHelp(sender)
else:
printHelp(sender)
else:
noperm(sender)
return True
@hook.command("report")
def onCommand(sender, args):
plugHeader(sender, "Report")
if not isPlayer(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
report = {
'player': reporter,
'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)
saveReports()
broadcast("utils.rp", "&aReport #" + str(len(reports) -1) + ": " + reporter + "&f: " + text)
msg(sender, "&aReported \"&e" + text + "&a\"")
return True
def checkForReports(foo, sender): # 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:
log("Reports reminder thread killed.")
thread.exit()
if len(reports) > 0:
broadcast("utils.rp", "&2--=[ Reports ]=--")
broadcast("utils.rp", "&aThere are %s pending reports!" % len(reports))
def stopChecking():
log("Ending reports reminder thread")
check_reports = False
thread.start_new_thread(checkForReports, ("foo", "bar"))

91
saylol.py Executable file
View File

@@ -0,0 +1,91 @@
import simplejson as json
import org.bukkit as bukkit
from time import time
from helpers import *
from random import randrange
lol_filename = "plugins/RedstonerUtils.py.dir/files/lol.json"
lols = []
timeout = 15
last_msg = 0
try:
lols = json.loads(open(lol_filename).read())
except Exception, e:
error("Failed to load lols: %s" % e)
def save_lols():
try:
lolfile = open(lol_filename, "w")
lolfile.write(json.dumps(lols))
lolfile.close()
except Exception, e:
error("Failed to write lols: " + str(e))
def add_lol(txt):
lols.append(txt)
save_lols()
def del_lol(id):
lols.pop(id)
save_lols()
def print_lol(sender, id):
global last_msg
if time() - last_msg > timeout:
dispname = sender.getDisplayName() if isPlayer(sender) else sender.getName()
broadcast("", "&8[&blol&8] &7%s&8: &e%s" % (dispname, lols[id]))
last_msg = time()
else:
plugHeader(sender, "SayLol")
msg(sender, "&cYou can use SayLol again in &a%s seconds!" % int(timeout + 1 - (time() - last_msg)))
@hook.command("lol")
def onCommand(sender, args):
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 Exception, e:
plugHeader(sender, "SayLol")
msg(sender, "&cInvalid number '&e%s&c'" % args[1])
else:
noperm(sender)
elif cmd == "list":
plugHeader(sender, "SayLol")
for i in range(len(lols)):
msg(sender, "&a%s: &e%s" % (str(i).rjust(3), lols[i]))
elif cmd == "add":
if sender.hasPermission("utils.lol.modify"):
plugHeader(sender, "SayLol")
add_lol(" ".join(args[1:]))
msg(sender, "&aNew lol message added!")
else:
noperm(sender)
elif cmd == "del":
if sender.hasPermission("utils.lol.modify"):
plugHeader(sender, "SayLol")
try:
i = int(args[1])
del_lol(i)
msg(sender, "&aLol message &e#%s&a deleted!" % i)
except Exception, e:
msg(sender, "&cInvalid number '&e%s&c'" % args[1])
else:
plugHeader(sender, "SayLol")
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

15
skullclick.py Normal file
View File

@@ -0,0 +1,15 @@
import org.bukkit as bukkit
from helpers import *
@hook.event("player.PlayerInteractEvent", "monitor")
def onInteract(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)

107
webtoken.py Normal file
View File

@@ -0,0 +1,107 @@
import mysqlhack
import thread
from re import match
from com.ziclix.python.sql import zxJDBC
from helpers import *
from secrets import *
from secrets import *
from random import randrange
# table schema:
# string "uuid", limit: 32, null: false
# string "token", limit: 6, null: false
# string "email", null: false
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
def generate_token(length):
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
def set_token(uuid):
token = generate_token(6)
# REPLACE INTO website.register_token uuid={uuid}, token={token};
return token
def get_token(uuid):
# ae795aa86327408e92ab25c8a59f3ba1
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, args, foo):
plugHeader(sender, "Website Token")
if isPlayer(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])
else:
msg(sender, "&cYou don't have a token yet! Use &e/tokengen <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, foo):
plugHeader(sender, "Website Token")
if isPlayer(sender):
if checkargs(sender, args, 1, -1):
# email regex, needs something followed by an @ followed by something
mail = " ".join(args) # email may contain spaces
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)
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..")
@hook.command("token")
def onCommand(sender, args):
thread.start_new_thread(token_command, (sender, args, "foo"))
return True
@hook.command("tokengen")
def onCommand(sender, args):
thread.start_new_thread(tokengen_command, (sender, args, "foo"))
return True