Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAgustin Zubiaga <aguz@sugarlabs.org>2013-02-04 16:04:58 (GMT)
committer Agustin Zubiaga <aguz@sugarlabs.org>2013-02-04 16:04:58 (GMT)
commitb47c0b2144847adce307eb76599053f60a28ba0e (patch)
tree9c3e12d523889bc8217097cd05754e28e5a82b88
parent8ba78d9cdd23d76429db22e37639073a7b7dc75c (diff)
Adding BuddyList and Room classes to canvas.py
-rw-r--r--canvas.py110
-rw-r--r--chat.py21
2 files changed, 128 insertions, 3 deletions
diff --git a/canvas.py b/canvas.py
index b0307ff..afd1b27 100644
--- a/canvas.py
+++ b/canvas.py
@@ -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
diff --git a/chat.py b/chat.py
index dfaf6aa..42a1b7c 100644
--- a/chat.py
+++ b/chat.py
@@ -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()