From 0f202950a7e7eeda55075ccc23610be41e8834f4 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Fri, 21 Apr 2006 15:30:49 -0400 Subject: [PATCH] Wtf is mercurial doing --- chat/BuddyList.py | 15 ++++++++ chat/chat.glade | 89 +++++++++++++++++++++++++++++++------------- chat/main.py | 94 +++++++++++++++++++++++++++++++++++++---------- chat/network.py | 2 + chat/presence.py | 2 + 5 files changed, 157 insertions(+), 45 deletions(-) diff --git a/chat/BuddyList.py b/chat/BuddyList.py index e7cb7ca0..9bc63bad 100644 --- a/chat/BuddyList.py +++ b/chat/BuddyList.py @@ -1,3 +1,5 @@ +# -*- tab-width: 4; indent-tabs-mode: t -*- + import presence import avahi @@ -14,6 +16,13 @@ class Buddy(object): self._host = host self._address = address self._port = port + self._chat = None + + def set_chat(self, chat): + self._chat = chat + + def chat(self): + return self._chat def nick(self): return self._nick @@ -66,6 +75,12 @@ class BuddyList(object): return buddy return None + def find_buddy_by_address(self, address): + for buddy in self._buddies.keys(): + if buddy.address() == address: + return buddy + return None + def _notify_listeners(self, action, buddy): for listener in self._listeners: listener(action, buddy) diff --git a/chat/chat.glade b/chat/chat.glade index f8195768..1058c232 100644 --- a/chat/chat.glade +++ b/chat/chat.glade @@ -30,31 +30,6 @@ 0 0 - - - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_NONE - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 1 - 0 - 1 - - - True @@ -111,6 +86,70 @@ fill + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_NONE + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + True + True + + + + + 0 + 1 + 0 + 1 + fill + + diff --git a/chat/main.py b/chat/main.py index dff8cde7..e22a13af 100755 --- a/chat/main.py +++ b/chat/main.py @@ -1,4 +1,5 @@ #!/usr/bin/python -t +# -*- tab-width: 4; indent-tabs-mode: t -*- import os, sys, pwd sys.path.append(os.getcwd()) @@ -12,9 +13,46 @@ import BuddyList glade_dir = os.getcwd() + +class Chat(object): + def __init__(self, view, label): + self._buffer = gtk.TextBuffer() + self._view = view + self._label = label + + def activate(self, label): + self._view.set_buffer(self._buffer) + self._label.set_text(label) + + def recv_message(self, buddy, msg): + aniter = self._buffer.get_end_iter() + self._buffer.insert(aniter, buddy.nick() + ": " + msg + "\n") + + + +class GroupChat(Chat): + def __init__(self, parent, view, label): + Chat.__init__(self, view, label) + self._parent = parent + self._gc_controller = network.GroupChatController('224.0.0.221', 6666, self._recv_group_message) + self._gc_controller.start() + self._label_prefix = "Cha" + + def activate(self): + Chat.activate(self, "Group Chat") + + def send_message(self, text): + if len(text) > 0: + self._gc_controller.send_msg(text) + + def _recv_group_message(self, msg): + buddy = self._parent.find_buddy_by_address(msg['addr']) + if buddy: + self.recv_message(buddy, msg['data']) + + class ChatApp(SimpleGladeApp): def __init__(self, glade_file="chat.glade", root="mainWindow", domain=None, **kwargs): - self._pannounce = presence.PresenceAnnounce() self._buddy_list = BuddyList.BuddyList() self._buddy_list.add_buddy_listener(self._on_buddy_presence_event) @@ -41,43 +79,57 @@ class ChatApp(SimpleGladeApp): print "Selected %s" % name def _on_buddyList_buddy_double_clicked(self, widget, *args): + """ Select the chat for this buddy or group """ (model, aniter) = widget.get_selection().get_selected() - name = self.treemodel.get(aniter,0) - print "Double-clicked %s" % name + chat = None + buddy = self.treemodel.get_value(aniter, 1) + if not buddy: + chat = self._group_chat + else: + chat = buddy.chat() + + if chat: + chat.activate() + else: + # start a new chat with them + pass def _on_buddy_presence_event(self, action, buddy): if action == BuddyList.ACTION_BUDDY_ADDED: - aniter = self.treemodel.insert_after(None,None) - self.treemodel.set(aniter, 0, buddy.nick()) + aniter = self.treemodel.append(None) + self.treemodel.set(aniter, 0, buddy.nick(), 1, buddy) elif action == BuddyList.ACCTION_BUDDY_REMOVED: aniter = self.treemodel.get_iter(buddy.nick()) if aniter: self.treemodel.remove(iter) + def find_buddy_by_address(self, address): + return self._buddy_list.find_buddy_by_address(address) + def _on_main_window_delete(self, widget, *args): self.quit() - def _recv_group_message(self, msg): - aniter = self._group_chat_buffer.get_end_iter() - self._group_chat_buffer.insert(aniter, msg['data'] + "\n") -# print "Message: %s" % msg['data'] + def _get_current_chat(self): + selection = self.buddyListView.get_selection() + (model, aniter) = selection.get_selected() + buddy = model.get_value(aniter, 1) + if not buddy: + return self._group_chat + return buddy.chat() - def _send_group_message(self, widget, *args): + def _send_chat_message(self, widget, *args): + chat = self._get_current_chat() text = widget.get_text() - if len(text) > 0: - self._gc_controller.send_msg(text) + chat.send_message(text) widget.set_text("") def new(self): - self._group_chat_buffer = gtk.TextBuffer() - self.chatView.set_buffer(self._group_chat_buffer) - - self.treemodel = gtk.TreeStore(gobject.TYPE_STRING) + self.treemodel = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.buddyListView.set_model(self.treemodel) self.buddyListView.connect("cursor-changed", self._on_buddyList_buddy_selected) self.buddyListView.connect("row-activated", self._on_buddyList_buddy_double_clicked) self.mainWindow.connect("delete-event", self._on_main_window_delete) - self.entry.connect("activate", self._send_group_message) + self.entry.connect("activate", self._send_chat_message) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn("", renderer, text=0) @@ -86,12 +138,14 @@ class ChatApp(SimpleGladeApp): column.set_expand(True); self.buddyListView.append_column(column) + self._group_chat = GroupChat(self, self.chatView, self.chatLabel) + aniter = self.treemodel.append(None) + self.treemodel.set(aniter, 0, "Group", 1, None) + self._group_chat.activate() + self._pannounce.register_service(self._realname, 6666, presence.OLPC_CHAT_SERVICE, name = self._nick, realname = self._realname) - self._gc_controller = network.GroupChatController('224.0.0.221', 6666, self._recv_group_message) - self._gc_controller.start() - def cleanup(self): pass diff --git a/chat/network.py b/chat/network.py index a685a38a..1f2c904a 100644 --- a/chat/network.py +++ b/chat/network.py @@ -1,3 +1,5 @@ +# -*- tab-width: 4; indent-tabs-mode: t -*- + import socket import threading import traceback diff --git a/chat/presence.py b/chat/presence.py index 45a31f96..8b88492f 100644 --- a/chat/presence.py +++ b/chat/presence.py @@ -1,3 +1,5 @@ +# -*- tab-width: 4; indent-tabs-mode: t -*- + import avahi, dbus, dbus.glib OLPC_CHAT_SERVICE = "_olpc_chat._udp"