summaryrefslogtreecommitdiff
path: root/gui/managui.py
diff options
context:
space:
mode:
Diffstat (limited to 'gui/managui.py')
-rw-r--r--gui/managui.py192
1 files changed, 192 insertions, 0 deletions
diff --git a/gui/managui.py b/gui/managui.py
new file mode 100644
index 0000000..d6dd79a
--- /dev/null
+++ b/gui/managui.py
@@ -0,0 +1,192 @@
+#!/usr/bin/python2
+# -- coding: utf-8 --
+
+import asyncore
+import logging
+import webbrowser
+
+import kivy
+kivy.require('1.9.1')
+
+from kivy.app import App
+from kivy.clock import Clock
+from kivy.core.window import Window
+from kivy.properties import BooleanProperty
+from kivy.uix.floatlayout import FloatLayout
+from kivy.uix.popup import Popup
+
+from kivy.config import ConfigParser
+config = ConfigParser()
+config.read("manachat.ini")
+
+import monsterdb
+import itemdb
+import net
+import net.mapserv as mapserv
+import gui.handlers as handlers
+import plugins
+from commands import process_line
+from net.onlineusers import OnlineUsers
+from loggers import netlog, debuglog
+from logicmanager import logic_manager
+
+
+class DebugLogHandler(logging.Handler):
+
+ def __init__(self, app, **kwargs):
+ self.app = app
+ super(self.__class__, self).__init__(**kwargs)
+
+ def emit(self, record):
+ msg = self.format(record)
+ self.app.root.messages_log.append_message(msg)
+
+
+class MenuPopup(Popup):
+ visible = BooleanProperty(False)
+
+ def on_open(self, *args):
+ self.visible = True
+
+ def on_dismiss(self, *args):
+ self.visible = False
+
+
+class AboutPopup(Popup):
+ pass
+
+
+class RootWidget(FloatLayout):
+ mobile = BooleanProperty(False)
+
+ def _focus_chat_input(self, dt):
+ self.chat_input.focus = True
+
+ def on_command_enter(self, *args):
+ process_line(self.chat_input.text.encode('utf-8'))
+ self.chat_input.text = ''
+ Clock.schedule_once(self._focus_chat_input, 0.1) # dirty hack :^)
+
+
+class ManaGuiApp(App):
+ use_kivy_settings = BooleanProperty(False)
+
+ def hook_keyboard(self, window, key, *largs):
+ if key == 27:
+ self.show_menu(not self._menu_popup.visible)
+ # self.stop()
+ return True
+ return False
+
+ def on_start(self):
+ 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)
+
+ monsterdb.read_monster_db()
+ itemdb.load_itemdb('itemdb.txt')
+
+ dbgh = DebugLogHandler(self)
+ dbgh.setFormatter(logging.Formatter("[%(asctime)s] %(message)s",
+ datefmt="%H:%M"))
+ debuglog.addHandler(dbgh)
+ debuglog.setLevel(logging.INFO)
+
+ net2 = DebugLogHandler(self)
+ net2.setFormatter(logging.Formatter("[%(asctime)s] %(message)s",
+ datefmt="%H:%M"))
+ net2.setLevel(logging.ERROR)
+ netlog.addHandler(net2)
+
+ plugins.load_plugins(config)
+
+ handlers.app = self
+
+ import chat
+ chat.pp_actions = ()
+
+ # self.reconnect()
+
+ Clock.schedule_once(self.update_online_list, 0.2)
+ Clock.schedule_interval(self.update_online_list, 35)
+ Clock.schedule_interval(self.update_loop, 0)
+ Clock.schedule_once(self.show_menu, 1.5)
+
+ def build(self):
+ self.icon = 'icon.png'
+ Window.bind(on_keyboard=self.hook_keyboard)
+ return RootWidget()
+
+ def build_settings(self, settings):
+ from kivy.uix.settings import SettingString
+
+ class SettingPassword(SettingString):
+ def _create_popup(self, instance):
+ SettingString._create_popup(self, instance)
+ self.textinput.password = True
+
+ def add_widget(self, *largs):
+ if self.content is not None:
+ self.content.clear_widgets()
+ return SettingString.add_widget(self, *largs)
+
+ settings.register_type('password', SettingPassword)
+ settings.add_json_panel('ManaChat', config,
+ filename='manachat.json')
+
+ def update_loop(self, *l):
+ asyncore.loop(timeout=0, count=10)
+ logic_manager.tick()
+
+ def on_pause(self):
+ return True
+
+ def on_stop(self):
+ Clock.unschedule(self.update_loop)
+ Clock.unschedule(self.update_online_list)
+
+ def open_link(self, link):
+ webbrowser.open(link)
+
+ def update_online_list(self, *l):
+ lst = OnlineUsers.dl_online_list(config.get('Other',
+ 'online_txt_url'))
+ if lst is not None:
+ lst.sort()
+ self.root.players_list.items = lst
+
+ def reconnect(self):
+ if mapserv.server is not None:
+ mapserv.cleanup()
+
+ 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'))
+
+ if hasattr(self, '_menu_popup'):
+ self._menu_popup.dismiss()
+
+ def show_about(self):
+ AboutPopup().open()
+
+ def show_menu(self, show=True):
+ if not hasattr(self, '_menu_popup'):
+ self._menu_popup = MenuPopup()
+ if show:
+ self._menu_popup.open()
+ else:
+ self._menu_popup.dismiss()
+
+
+if __name__ == "__main__":
+ ManaGuiApp().run()