X-Git-Url: https://jfr.im/git/irc/weechat/qweechat.git/blobdiff_plain/d1b4884dfd5699b2a8db04d3486515f45ea9a717..9587cb0afb338b7f7a56b6c2eedada509c96f102:/src/qweechat/qweechat.py diff --git a/src/qweechat/qweechat.py b/src/qweechat/qweechat.py index 1680669..604503c 100755 --- a/src/qweechat/qweechat.py +++ b/src/qweechat/qweechat.py @@ -1,7 +1,9 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright (C) 2011-2012 Sebastien Helleu +# qweechat.py - WeeChat remote GUI using Qt toolkit +# +# Copyright (C) 2011-2013 Sebastien Helleu # # This file is part of QWeeChat, a Qt remote GUI for WeeChat. # @@ -20,8 +22,7 @@ # # -# QWeeChat - WeeChat remote GUI using Qt toolkit. -# (this script requires WeeChat 0.3.7 or newer, running on local or remote host) +# This script requires WeeChat 0.3.7 or newer, running on local or remote host. # # History: # @@ -29,7 +30,7 @@ # start dev # -import sys, struct +import sys, struct, traceback import qt_compat QtCore = qt_compat.import_module('QtCore') QtGui = qt_compat.import_module('QtGui') @@ -139,6 +140,7 @@ class MainWindow(QtGui.QMainWindow): if self.config.getboolean('relay', 'autoconnect'): self.network.connect_weechat(self.config.get('relay', 'server'), self.config.get('relay', 'port'), + self.config.get('relay', 'ssl') == 'on', self.config.get('relay', 'password')) self.show() @@ -187,7 +189,9 @@ class MainWindow(QtGui.QMainWindow): def open_about_dialog(self): messages = ['%s %s' % (NAME, VERSION), - '© 2011-2012 %s <%s>' % (AUTHOR, AUTHOR_MAIL, AUTHOR_MAIL), + '© 2011-2013 %s <%s>' % (AUTHOR, AUTHOR_MAIL, AUTHOR_MAIL), + '', + 'Running with %s' % ('PySide' if qt_compat.uses_pyside else 'PyQt4'), '', 'WeeChat site: %s' % (WEECHAT_SITE, WEECHAT_SITE), ''] @@ -195,7 +199,7 @@ class MainWindow(QtGui.QMainWindow): def open_connection_dialog(self): values = {} - for option in ('server', 'port', 'password'): + for option in ('server', 'port', 'ssl', 'password'): values[option] = self.config.get('relay', option) self.connection_dialog = ConnectionDialog(values, self) self.connection_dialog.dialog_buttons.accepted.connect(self.connect_weechat) @@ -203,6 +207,7 @@ class MainWindow(QtGui.QMainWindow): def connect_weechat(self): self.network.connect_weechat(self.connection_dialog.fields['server'].text(), self.connection_dialog.fields['port'].text(), + self.connection_dialog.fields['ssl'].isChecked(), self.connection_dialog.fields['password'].text()) self.connection_dialog.close() @@ -214,14 +219,15 @@ class MainWindow(QtGui.QMainWindow): def network_status_set(self, status, extra): pal = self.network_status.palette() - if self.network.is_connected(): + if status == self.network.status_connected: pal.setColor(self.network_status.foregroundRole(), QtGui.QColor('green')) else: pal.setColor(self.network_status.foregroundRole(), QtGui.QColor('#aa0000')) + ssl = ' (SSL)' if status != self.network.status_disconnected and self.network.is_ssl() else '' self.network_status.setPalette(pal) icon = self.network.status_icon(status) if icon: - self.network_status.setText(' %s' % (icon, status.capitalize())) + self.network_status.setText(' %s' % (icon, status.capitalize() + ssl)) else: self.network_status.setText(status.capitalize()) if status == self.network.status_disconnected: @@ -236,16 +242,20 @@ class MainWindow(QtGui.QMainWindow): 'message (%d bytes):\n%s' % (len(message), protocol.hex_and_ascii(message, 20)), forcecolor='#008800') - proto = protocol.Protocol() - message = proto.decode(str(message)) - if message.uncompressed: - self.debug_display(0, '==>', - 'message uncompressed (%d bytes):\n%s' - % (message.size_uncompressed, - protocol.hex_and_ascii(message.uncompressed, 20)), - forcecolor='#008800') - self.debug_display(0, '', 'Message: %s' % message) - self.parse_message(message) + try: + proto = protocol.Protocol() + message = proto.decode(str(message)) + if message.uncompressed: + self.debug_display(0, '==>', + 'message uncompressed (%d bytes):\n%s' + % (message.size_uncompressed, + protocol.hex_and_ascii(message.uncompressed, 20)), + forcecolor='#008800') + self.debug_display(0, '', 'Message: %s' % message) + self.parse_message(message) + except: + print('Error while decoding message from WeeChat:\n%s' % traceback.format_exc()) + self.network.disconnect_weechat() def parse_message(self, message): if message.msgid.startswith('debug'): @@ -278,17 +288,40 @@ class MainWindow(QtGui.QMainWindow): item['prefix'], item['message']) elif message.msgid in ('_nicklist', 'nicklist'): - buffer_nicklist = {} + buffer_refresh = {} + for obj in message.objects: + if obj.objtype == 'hda' and obj.value['path'][-1] == 'nicklist_item': + group = '__root' + for item in obj.value['items']: + index = [i for i, b in enumerate(self.buffers) if b.pointer() == item['__path'][0]] + if index: + if not index[0] in buffer_refresh: + self.buffers[index[0]].nicklist = {} + buffer_refresh[index[0]] = True + if item['group']: + group = item['name'] + self.buffers[index[0]].nicklist_add_item(group, item['group'], item['prefix'], item['name'], item['visible']) + for index in buffer_refresh: + self.buffers[index].nicklist_refresh() + elif message.msgid == '_nicklist_diff': + buffer_refresh = {} for obj in message.objects: if obj.objtype == 'hda' and obj.value['path'][-1] == 'nicklist_item': + group = '__root' for item in obj.value['items']: index = [i for i, b in enumerate(self.buffers) if b.pointer() == item['__path'][0]] if index: - if not item['__path'][0] in buffer_nicklist: - self.buffers[index[0]].remove_all_nicks() - buffer_nicklist[item['__path'][0]] = True - if not item['group'] and item['visible']: - self.buffers[index[0]].add_nick(item['prefix'], item['name']) + buffer_refresh[index[0]] = True + if item['_diff'] == ord('^'): + group = item['name'] + elif item['_diff'] == ord('+'): + self.buffers[index[0]].nicklist_add_item(group, item['group'], item['prefix'], item['name'], item['visible']) + elif item['_diff'] == ord('-'): + self.buffers[index[0]].nicklist_remove_item(group, item['group'], item['name']) + elif item['_diff'] == ord('*'): + self.buffers[index[0]].nicklist_update_item(group, item['group'], item['prefix'], item['name'], item['visible']) + for index in buffer_refresh: + self.buffers[index].nicklist_refresh() elif message.msgid == '_buffer_opened': for obj in message.objects: if obj.objtype == 'hda' and obj.value['path'][-1] == 'buffer':