first commit via git
This commit is contained in:
55
adminchat.py
Executable file
55
adminchat.py
Executable 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
96
chatgroups.py
Executable 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
1
files/chatgroups.json
Executable 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
1
files/lol.json
Executable 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
1
files/reports.json
Executable file
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
74
helpers.py
Executable file
74
helpers.py
Executable 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
61
lagchunks.py
Executable 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
284
main.py
Executable 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<o 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
21
mysqlhack.py
Executable 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
28
plotter.py
Executable 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
4
plugin.yml
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
name: RedstonerUtils
|
||||||
|
main: main.py
|
||||||
|
version: v3.0.0
|
||||||
|
author: redstone_sheep
|
||||||
133
reports.py
Executable file
133
reports.py
Executable 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
91
saylol.py
Executable 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
15
skullclick.py
Normal 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)
|
||||||
110
webtoken.py
Normal file
110
webtoken.py
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
import mysqlhack
|
||||||
|
import thread
|
||||||
|
from re import match
|
||||||
|
from com.ziclix.python.sql import zxJDBC
|
||||||
|
from helpers 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user