diff options
Diffstat (limited to 'curses/tmwcli.py')
-rw-r--r-- | curses/tmwcli.py | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/curses/tmwcli.py b/curses/tmwcli.py new file mode 100644 index 0000000..679019b --- /dev/null +++ b/curses/tmwcli.py @@ -0,0 +1,134 @@ +#!/usr/bin/python2 + +import os +import sys +import logging +import time +import asyncore +import threading +from ConfigParser import ConfigParser + +# add .. to PYTHONPATH +parent, _ = os.path.split(os.getcwd()) +sys.path.insert(0, parent) +sys.path.insert(1, os.path.join(parent, "plugins")) + +try: + import construct + del construct +except ImportError: + sys.path.insert(1, os.path.join(parent, "external")) + +del parent + +import cui +import handlers +import net +import net.mapserv as mapserv +import plugins +import monsterdb +import itemdb +from commands import process_line +from net.onlineusers import OnlineUsers +from loggers import netlog, debuglog +from logicmanager import logic_manager + + +class SideBarUpdater(threading.Thread): + + def __init__(self, window, online_users_obj, update_interval=20): + self._active = True + self._timer = 0 + self._update_interval = update_interval + self._online_users_obj = online_users_obj + self._window = window + threading.Thread.__init__(self) + + def run(self): + while self._active: + if (time.time() - self._timer) > self._update_interval: + self._window.clear() + for user in self._online_users_obj.online_users: + print user + self._window.addstr(user + '\n') + self._window.refresh() + self._timer = time.time() + else: + time.sleep(1.0) + + def stop(self): + self._active = False + + +class CursesDebugLogHandler(logging.Handler): + def emit(self, record): + msg = self.format(record) + cui.chatlog_append(msg) + + +def loop(): + try: + while True: + asyncore.loop(timeout=0.2, count=5) + logic_manager.tick() + except KeyboardInterrupt: + return + + +if __name__ == "__main__": + config = ConfigParser() + if len(sys.argv) > 1: + config.read(sys.argv[1]) + else: + config.read('../manachat.ini') + + rootLogger = logging.getLogger('') + rootLogger.addHandler(logging.NullHandler()) + + dbgh = CursesDebugLogHandler() + dbgh.setFormatter(logging.Formatter("[%(asctime)s] %(message)s", + datefmt="%H:%M")) + debuglog.addHandler(dbgh) + debuglog.setLevel(logging.INFO) + + if config.getboolean('Other', 'log_network_packets'): + import os + import tempfile + + logfile = os.path.join(tempfile.gettempdir(), "netlog.txt") + netlog.setLevel(logging.INFO) + fh = logging.FileHandler(logfile, mode="w") + fmt = logging.Formatter("[%(asctime)s] %(message)s", + datefmt="%Y-%m-%d %H:%M:%S") + fh.setFormatter(fmt) + netlog.addHandler(fh) + + cui.init() + + plugins.load_plugins(config) + + monsterdb.read_monster_db('../monsterdb.txt') + itemdb.load_itemdb('../itemdb.txt') + + online_users = OnlineUsers(config.get('Other', 'online_txt_url')) + online_users.start() + side_bar_updater = SideBarUpdater(cui.players_win, online_users) + side_bar_updater.start() + + net.login(host=config.get('Server', 'host'), + port=config.getint('Server', 'port'), + username=config.get('Player', 'username'), + password=config.get('Player', 'password'), + charname=config.get('Player', 'charname')) + + t = threading.Thread(target=loop) + t.setDaemon(True) + t.start() + + cui.input_loop(process_line) + + side_bar_updater.stop() + online_users.stop() + cui.finalize() + + mapserv.cleanup() |