diff options
Diffstat (limited to 'wrapper_player.py')
-rw-r--r-- | wrapper_player.py | 113 |
1 files changed, 90 insertions, 23 deletions
diff --git a/wrapper_player.py b/wrapper_player.py index 4ca302a..5fb5c79 100644 --- a/wrapper_player.py +++ b/wrapper_player.py @@ -1,25 +1,75 @@ import time import mysqlhack from mysql_utils import * +from util_events import fire_event from thread_utils import * from players_secret import * from datetime import datetime from com.ziclix.python.sql import zxJDBC +from traceback import format_exc as print_traceback -class py_player: +class py_player(object): def __init__(self,player): self.player = player self.logging_in = True - + self.authenticated = False self.login_time = time.time() - self.nickname = self.name - self.registered = False - self.password = "None" - self.banned = False - self.banned_reason = "You have been banned!" - self.played_time = time.time() - self.login_time - self.last_login = datetime.now() - self.first_seen = datetime.now() + + self.props ={"uuid":self.uuid, + "name":self.name, + "nickname":self.name, + "registered":False, + "password":"None", + "banned":False, + "banned_reason":"You have been banned!", + "played_time":time.time() - self.login_time, + "last_login":datetime.now(), + "first_seen":datetime.now()} + + def __setattr__(self, attribute, value): + if not attribute in dir(self): + if not 'props' in self.__dict__: + self.__dict__[attribute] = value + else: + self.props[attribute] = value + else: + object.__setattr__(self, attribute, value) + + def __getattr__(self, attribute): + try: + return self.props[attribute] + except: + pass + + def save(self): + properties = [] + keys = [] + columns = [] + + with mysql_connect() as sql: + columns = sql.columns + + for key, value in self.props.items(): + if key not in columns: + with mysql_connect() as sql: + if isinstance(value, int): + sql.execute("ALTER TABLE utils_players ADD %s INT" % key) + elif isinstance(value, str): + sql.execute("ALTER TABLE utils_players ADD %s TEXT" % key) + elif isinstance(value, bool): + sql.execute("ALTER TABLE utils_players ADD %s TINYINT(1)" % key) + if key == "uuid": + continue + keys.append(key+"=?") + properties.append(value) + print value + properties.append(self.props["uuid"]) + keys = str(tuple(keys)).replace("\'","").replace("(","").replace(")","") + + + with mysql_connect() as sql: + sql.execute("UPDATE utils_players set %s WHERE uuid = ?" % keys, properties) + def kick(self, kick_message = "You have been kicked from the server!"): self.player.KickPlayer(kick_message) @@ -34,6 +84,7 @@ class py_player: @property def uuid(self): return str(self.player.getUniqueId()) + class Py_players: @@ -60,10 +111,12 @@ py_players = Py_players() @async(daemon=True) def fetch_player(player): - properties = (player.uuid, player.name, player.nickname, player.registered, - player.password, player.banned, - player.banned_reason, player.played_time, - player.last_login, player.first_seen) + + properties = [] + keys = [] + for key, value in player.props.iteritems(): + keys.append(key) + properties.append(value) with mysql_connect() as sql: sql.execute("SELECT * FROM utils_players WHERE uuid = ?", (player.uuid,)) @@ -71,24 +124,34 @@ def fetch_player(player): if len(result) is 0: with mysql_connect() as sql: - sql.execute("INSERT INTO utils_players \ - (uuid, name, nickname, registered, password, banned, \ - banned_reason, played_time, last_login, first_seen) \ - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - - args=properties) + sql.execute("INSERT INTO utils_players %s \ + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" % str(tuple(keys)).replace("\'","") + ,args=tuple(properties)) elif len(result) is 1: + keys = [] props = result[0] - print props + with mysql_connect() as sql: + sql.execute("SHOW COLUMNS FROM utils_players") + result = sql.fetchall() + for row in result: + keys.append(row[0]) + + for key in keys: + player.props[key] = props[keys.index(key)] + for prop in properties: - prop = props[properties.index(prop)] + print str(prop) else: player.kick("Something went wrong while loading your player data, please contact an admin") return + player.logging_in = False player.msg("You have succesfully logged into redstoner!") + fire_event("player_login", player) + + blocked_events = ["block.BlockBreakEvent", "block.BlockPlaceEvent", "player.PlayerMoveEvent", @@ -106,7 +169,11 @@ for event in blocked_events: @hook.event("player.PlayerJoinEvent","lowest") def on_join(event): - player = py_player(event.getPlayer()) + try: + player = py_player(event.getPlayer()) + except: + print(print_traceback()) + time.sleep(10) py_players.append(player) player.msg("Your input will be blocked for a short while") fetch_player(player) |