Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/activities/chat/ChatActivity.py
blob: 83c199ff1b01f3606d60aa8ef84f616ba3fc7188 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import dbus
import random
import logging

import gtk
import gobject
from gettext import gettext as _

from sugar.activity.Activity import Activity
from sugar.presence import Service
from sugar.chat.Chat import Chat
from sugar.chat.BuddyChat import BuddyChat
from sugar.p2p.Stream import Stream
from sugar.presence.PresenceService import PresenceService
import sugar.env

_CHAT_ACTIVITY_TYPE = "_chat_activity._tcp"

class ChatActivity(Activity):
	def __init__(self, service):
		Activity.__init__(self)
		self.set_title(_('Private chat'))

		self._service = service
		self._chat = BuddyChat(self._service)
		self.add(self._chat)
		self._chat.show()		

	def recv_message(self, message):
		self._chat.recv_message(message)

class ChatShellDbusService(dbus.service.Object):
	def __init__(self, parent):
		self._parent = parent
		session_bus = dbus.SessionBus()
		bus_name = dbus.service.BusName('com.redhat.Sugar.Chat', bus=session_bus)
		object_path = '/com/redhat/Sugar/Chat'
		dbus.service.Object.__init__(self, bus_name, object_path)

	@dbus.service.method('com.redhat.Sugar.ChatShell')
	def open_chat(self, service_path):
		self._parent.open_chat(service_path)

class ChatListener:
	def __init__(self):
		ChatShellDbusService(self)

		self._chats = {}
	
		self._pservice = PresenceService()
		self._pservice.register_service_type(BuddyChat.SERVICE_TYPE)

	def start(self):
		self._service = self._pservice.register_service(sugar.env.get_nick_name(),
				BuddyChat.SERVICE_TYPE)
		self._buddy_stream = Stream.new_from_service(self._service)
		self._buddy_stream.set_data_listener(self._recv_message)

	def _recv_message(self, address, message):
		[nick, msg] = Chat.deserialize_message(message)
		buddy = self._pservice.get_buddy_by_nick_name(nick)
		if buddy:
			if buddy == self._pservice.get_owner():
				return		
			service = buddy.get_service_of_type(BuddyChat.SERVICE_TYPE)
			name = service.get_name()
			if service:
				if not self._chats.has_key(name):
					self.open_chat(service)
				self._chats[name].recv_message(message)			
			else:
				logging.error('The buddy %s does not have a chat service.' % (nick))
		else:
			logging.error('The buddy %s is not present.' % (nick))
			return
		
	def open_chat(self, service_path):
		service = self._pservice._new_object(service_path)
		chat = ChatActivity(service)
		self._chats[service.get_name()] = chat
		return chat

def start():
	chat_listener = ChatListener()
	chat_listener.start()