diff options
author | Agustin Zubiaga <aguz@sugarlabs.org> | 2013-02-04 16:04:58 (GMT) |
---|---|---|
committer | Agustin Zubiaga <aguz@sugarlabs.org> | 2013-02-04 16:04:58 (GMT) |
commit | b47c0b2144847adce307eb76599053f60a28ba0e (patch) | |
tree | 9c3e12d523889bc8217097cd05754e28e5a82b88 | |
parent | 8ba78d9cdd23d76429db22e37639073a7b7dc75c (diff) |
Adding BuddyList and Room classes to canvas.py
-rw-r--r-- | canvas.py | 110 | ||||
-rw-r--r-- | chat.py | 21 |
2 files changed, 128 insertions, 3 deletions
@@ -1,4 +1,5 @@ # Copyright 2012 S. Daniel Francis <francis@sugarlabs.org> +# Copyright 2013 Agustin Zubiaga <aguz@sugarlabs.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,11 +20,120 @@ import logging logger = logging.getLogger('canvas') from gi.repository import Gtk +from gettext import gettext as _ +from chat import ChatClient + class Canvas(Gtk.Box): def __init__(self, toolbar_box, activity): Gtk.Box.__init__(self) self.activity = activity + self._client = ChatClient(*open('../pass.txt').read().split(',')) + self._client.connect('message-received', self._message_received) + + self._rooms = {} + + self._buddy_list = BuddyList() + self._rooms_notebook = Gtk.Notebook() + + paned = Gtk.HPaned() + paned.add1(self._buddy_list) + paned.add2(self._rooms_notebook) + + self.pack_start(paned, True, True, 0) + self.show_all() + + def _message_received(self, client, user, message): + if user in self._rooms.keys(): + name = self._buddy_list.get_user_name(user) + new_room = Room(self._client, user, name, msg=message) + label = Gtk.Label(name) + self._rooms_notebook.append_page(label, new_room) + def new(self): pass + + +class Room(Gtk.Box): + + def __init__(self, client, user, name, msg=''): + Gtk.Box.__init__(self) + self.set_orientation(Gtk.Orientation.VERTICAL) + + messages = Gtk.TextView() + self._messages_buffer = messages.get_buffer() + self.pack_start(messages, True, True, 5) + + input_box = Gtk.Box() + msg_input = Gtk.Entry() + send_btn = Gtk.Button(_('Send')) + input_box.pack_start(msg_input, True, False, 5) + input_box.pack_start(send_btn, False, True, 5) + self.pack_start(input_box, False, True, 5) + + self._add_message(name, msg) + + self._user = user + self._name = name + self._client = client + + self.show_all() + + def _message_received(self, user, message): + self._add_message(self._name, message) + + def _add_message(self, user, message): + self._messages_buffer.props.text += '%s: %s\n' % (user, message) + + def _send_new_message(self, message): + self._add_message(_('Me'), message) + self._client.send_message(self._user, message) + + +class BuddyList(Gtk.Box): + + def __init__(self): + Gtk.Box.__init__(self) + self.set_orientation(Gtk.Orientation.VERTICAL) + + scroll = Gtk.ScrolledWindow() + scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + + model = Gtk.ListStore(str, str) + tree_view = Gtk.TreeView(model) + + column = Gtk.TreeViewColumn() + + # TODO: Use a pixbuf to show the state + status = Gtk.CellRendererText() + column.pack_start(status, True) + column.add_attribute(status, 'text', 0) + + tree_view.append_column(column) + + column = Gtk.TreeViewColumn() + buddy = Gtk.CellRendererText() + column.pack_start(buddy, True) + column.add_attribute(buddy, 'text', 1) + + tree_view.append_column(column) + + scroll.add(tree_view) + + self.pack_start(scroll, True, True, 0) + + self._list = {} + + self.show_all() + + def presence_change(self, client, user, status): + self._list[user] = status + self._model.clear() + + for b in self._list.keys(): + self.model.append([self._list(b), b]) + + def get_user(self, user_address): + # TODO: Implement this + return user_address @@ -16,12 +16,16 @@ # MA 02110-1301, USA. import xmpp +import threading + from gi.repository import GObject class ChatClient(GObject.GObject): __gsignals__ = {'message-received': (GObject.SignalFlags.RUN_FIRST, None, + [str, str]), + 'presence-changed': (GObject.SignalFlags.RUN_FIRST, None, [str, str])} def __init__(self, user, password): @@ -32,16 +36,27 @@ class ChatClient(GObject.GObject): self._client.connect() self._client.auth(jid.getNode(), password) self._client.RegisterHandler('message', self._message_received_cb) + self._client.RegisterHandler('presence', self._presence_cb) self._client.sendInitPresence() - GObject.timeout_add(1000, lambda: self._client.Process(1)) + # Starts XMPP Client loop + threading.Thread(target=self.run).start() + + def run(self): + while self._client.Process(1): + pass def _message_received_cb(self, client, message_node): user = message_node.getFrom() body = message_node.getBody() self.emit('message-received', user, body) + def _presence_cb(self, client, presence_protocol): + user = presence_protocol.getNick() + status = presence_protocol.getStatus() + self.emit('presence-changed', user, status) + def send_message(self, user, text): message = xmpp.Message(user, text) self._client.send(message) @@ -63,8 +78,8 @@ if __name__ == '__main__': password = getpass.getpass() cc = ChatClient(user, password) - cc.send_message('yoa.bauza.92@facebook.com', 'Hola, yoa :)') + cc.send_message('aguzubiaga97@gmail.com', 'Hello from XMPPY :)') cc.connect('message-received', mr) loop = GObject.MainLoop() - loop.run()
\ No newline at end of file + loop.run() |