Unify updating of accounts and contact pep information. Implement and use asMarkupText() for tunes.
This commit is contained in:
parent
234a6520dd
commit
5f4db2eed9
|
@ -1434,11 +1434,10 @@ class ChatControl(ChatControlBase):
|
|||
def update_mood(self):
|
||||
if isinstance(self.contact, GC_Contact):
|
||||
return
|
||||
|
||||
pep = self.contact.pep
|
||||
if 'mood' in pep and not pep['mood'].was_retracted():
|
||||
if 'mood' in pep:
|
||||
self._mood_image.set_from_pixbuf(pep['mood'].asPixbufIcon())
|
||||
self._mood_image.set_tooltip_markup(pep['mood'].asMarkup())
|
||||
self._mood_image.set_tooltip_markup(pep['mood'].asMarkupText())
|
||||
self._mood_image.show()
|
||||
else:
|
||||
self._mood_image.hide()
|
||||
|
@ -1489,35 +1488,12 @@ class ChatControl(ChatControlBase):
|
|||
self._activity_image.hide()
|
||||
|
||||
def update_tune(self):
|
||||
artist = None
|
||||
title = None
|
||||
source = None
|
||||
|
||||
if isinstance(self.contact, GC_Contact):
|
||||
return
|
||||
|
||||
if 'artist' in self.contact.tune:
|
||||
artist = self.contact.tune['artist'].strip()
|
||||
artist = gobject.markup_escape_text(artist)
|
||||
if 'title' in self.contact.tune:
|
||||
title = self.contact.tune['title'].strip()
|
||||
title = gobject.markup_escape_text(title)
|
||||
if 'source' in self.contact.tune:
|
||||
source = self.contact.tune['source'].strip()
|
||||
source = gobject.markup_escape_text(source)
|
||||
|
||||
if artist or title:
|
||||
if not artist:
|
||||
artist = _('Unknown Artist')
|
||||
if not title:
|
||||
title = _('Unknown Title')
|
||||
if not source:
|
||||
source = _('Unknown Source')
|
||||
|
||||
self._tune_image.set_tooltip_markup(
|
||||
_('<b>"%(title)s"</b> by <i>%(artist)s</i>\n'
|
||||
'from <i>%(source)s</i>') % {'title': title, 'artist': artist,
|
||||
'source': source})
|
||||
|
||||
pep = self.contact.pep
|
||||
if 'tune' in pep:
|
||||
self._tune_image.set_tooltip_markup(pep['tune'].asMarkupText())
|
||||
self._tune_image.show()
|
||||
else:
|
||||
self._tune_image.hide()
|
||||
|
|
|
@ -171,6 +171,7 @@ class Connection(ConnectionHandlers):
|
|||
self.mood = {}
|
||||
self.tune = {}
|
||||
self.activity = {}
|
||||
self.pep = {}
|
||||
# Do we continue connection when we get roster (send presence,get vcard..)
|
||||
self.continue_connect_info = None
|
||||
# Do we auto accept insecure connection
|
||||
|
|
|
@ -203,6 +203,13 @@ import gtkgui_helpers
|
|||
import gobject
|
||||
|
||||
|
||||
def translate_mood(mood):
|
||||
if mood in MOODS:
|
||||
return MOODS[mood]
|
||||
else:
|
||||
return mood
|
||||
|
||||
|
||||
class AbstractPEP(object):
|
||||
|
||||
type = ''
|
||||
|
@ -219,14 +226,49 @@ class AbstractPEP(object):
|
|||
|
||||
def __init__(self, jid, account, items):
|
||||
self._pep_specific_data, self._retracted = self._extract_info(items)
|
||||
|
||||
self._update_contacts(jid, account)
|
||||
if jid == common.gajim.get_jid_from_account(account):
|
||||
self._update_account(account)
|
||||
|
||||
self.do(jid, account)
|
||||
|
||||
def _extract_info(self, items):
|
||||
'''To be implemented by subclasses'''
|
||||
raise NotImplementedError
|
||||
|
||||
def was_rectacted(self):
|
||||
return self._retracted
|
||||
def _update_contacts(self, jid, account):
|
||||
dict = {} if self._retracted else self._pep_specific_data
|
||||
|
||||
for contact in common.gajim.contacts.get_contacts(account, jid):
|
||||
setattr(contact, self.type, dict)
|
||||
|
||||
if self._retracted:
|
||||
if self.type in contact.pep:
|
||||
del contact.pep[self.type]
|
||||
else:
|
||||
contact.pep[self.type] = self
|
||||
|
||||
def _update_account(self, account):
|
||||
dict = {} if self._retracted else self._pep_specific_data
|
||||
|
||||
acc = common.gajim.connections[account]
|
||||
setattr(acc, self.type, dict)
|
||||
|
||||
if self._retracted:
|
||||
if self.type in acc.pep:
|
||||
del acc.pep[self.type]
|
||||
else:
|
||||
acc.pep[self.type] = self
|
||||
|
||||
def asPixbufIcon(self):
|
||||
'''To be implemented by subclasses'''
|
||||
raise NotImplementedError
|
||||
|
||||
def asMarkupText(self):
|
||||
'''To be implemented by subclasses'''
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class UserMoodPEP(AbstractPEP):
|
||||
'''XEP-0107: User Mood'''
|
||||
|
@ -251,45 +293,31 @@ class UserMoodPEP(AbstractPEP):
|
|||
return (mood_dict, retracted)
|
||||
|
||||
def do(self, jid, name):
|
||||
mood_dict = {} if self._retracted else self._pep_specific_data
|
||||
|
||||
if jid == common.gajim.get_jid_from_account(name):
|
||||
acc = common.gajim.connections[name]
|
||||
acc.mood = mood_dict
|
||||
|
||||
user = common.gajim.get_room_and_nick_from_fjid(jid)[0]
|
||||
for contact in common.gajim.contacts.get_contacts(name, user):
|
||||
contact.mood = mood_dict
|
||||
contact.pep['mood'] = self
|
||||
|
||||
|
||||
if jid == common.gajim.get_jid_from_account(name):
|
||||
common.gajim.interface.roster.draw_account(name)
|
||||
common.gajim.interface.roster.draw_mood(user, name)
|
||||
ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name)
|
||||
common.gajim.interface.roster.draw_mood(jid, name)
|
||||
ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name)
|
||||
if ctrl:
|
||||
ctrl.update_mood()
|
||||
|
||||
|
||||
def asPixbufIcon(self):
|
||||
if self._retracted:
|
||||
return None
|
||||
else:
|
||||
received_mood = self._pep_specific_data['mood']
|
||||
mood = received_mood if received_mood in MOODS else 'unknown'
|
||||
pixbuf = gtkgui_helpers.load_mood_icon(mood).get_pixbuf()
|
||||
return pixbuf
|
||||
assert not self._retracted
|
||||
received_mood = self._pep_specific_data['mood']
|
||||
mood = received_mood if received_mood in MOODS else 'unknown'
|
||||
pixbuf = gtkgui_helpers.load_mood_icon(mood).get_pixbuf()
|
||||
return pixbuf
|
||||
|
||||
def asMarkupText(self):
|
||||
if self._retracted:
|
||||
return None
|
||||
else:
|
||||
untranslated_mood = self._pep_specific_data['mood']
|
||||
mood = MOODS[untranslated_mood] if untranslated_mood in MOODS else untranslated_mood
|
||||
markuptext = '<b>%s</b>' % gobject.markup_escape_text(mood)
|
||||
if 'text' in self._pep_specific_data:
|
||||
text = self._pep_specific_data['text']
|
||||
markuptext += '(%s)' + gobject.markup_escape_text(text)
|
||||
return markuptext
|
||||
assert not self._retracted
|
||||
untranslated_mood = self._pep_specific_data['mood']
|
||||
mood = translate_mood(untranslated_mood)
|
||||
markuptext = '<b>%s</b>' % gobject.markup_escape_text(mood)
|
||||
if 'text' in self._pep_specific_data:
|
||||
text = self._pep_specific_data['text']
|
||||
markuptext += ' (%s)' % gobject.markup_escape_text(text)
|
||||
return markuptext
|
||||
|
||||
|
||||
class UserTunePEP(AbstractPEP):
|
||||
|
@ -310,27 +338,36 @@ class UserTunePEP(AbstractPEP):
|
|||
if child.getName() in TUNE_DATA:
|
||||
tune_dict[name] = data
|
||||
|
||||
retracted = items.getTag('retract') or not tune_dict
|
||||
retracted = items.getTag('retract') or not ('artist' in tune_dict or
|
||||
'title' in tune_dict)
|
||||
return (tune_dict, retracted)
|
||||
|
||||
|
||||
def do(self, jid, name):
|
||||
tune_dict = {} if self._retracted else self._pep_specific_data
|
||||
|
||||
if jid == common.gajim.get_jid_from_account(name):
|
||||
acc = common.gajim.connections[name]
|
||||
acc.tune = tune_dict
|
||||
|
||||
user = common.gajim.get_room_and_nick_from_fjid(jid)[0]
|
||||
for contact in common.gajim.contacts.get_contacts(name, user):
|
||||
contact.tune = tune_dict
|
||||
|
||||
def do(self, jid, name):
|
||||
if jid == common.gajim.get_jid_from_account(name):
|
||||
common.gajim.interface.roster.draw_account(name)
|
||||
common.gajim.interface.roster.draw_tune(user, name)
|
||||
ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name)
|
||||
common.gajim.interface.roster.draw_tune(jid, name)
|
||||
ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name)
|
||||
if ctrl:
|
||||
ctrl.update_tune()
|
||||
|
||||
def asMarkupText(self):
|
||||
assert not self._retracted
|
||||
tune = self._pep_specific_data
|
||||
|
||||
artist = tune.get('artist', _('Unknown Artist'))
|
||||
artist = gobject.markup_escape_text(artist)
|
||||
|
||||
title = tune.get('title', _('Unknown Title'))
|
||||
title = gobject.markup_escape_text(title)
|
||||
|
||||
source = tune.get('source', _('Unknown Source'))
|
||||
source = gobject.markup_escape_text(source)
|
||||
|
||||
tune_string = _('<b>"%(title)s"</b> by <i>%(artist)s</i>\n'
|
||||
'from <i>%(source)s</i>') % {'title': title,
|
||||
'artist': artist, 'source': source}
|
||||
return tune_string
|
||||
|
||||
|
||||
class UserActivityPEP(AbstractPEP):
|
||||
|
@ -361,20 +398,11 @@ class UserActivityPEP(AbstractPEP):
|
|||
return (activity_dict, retracted)
|
||||
|
||||
def do(self, jid, name):
|
||||
activity_dict = {} if self._retracted else self._pep_specific_data
|
||||
|
||||
if jid == common.gajim.get_jid_from_account(name):
|
||||
acc = common.gajim.connections[name]
|
||||
acc.activity = activity_dict
|
||||
|
||||
user = common.gajim.get_room_and_nick_from_fjid(jid)[0]
|
||||
for contact in common.gajim.contacts.get_contacts(name, user):
|
||||
contact.activity = activity_dict
|
||||
|
||||
if jid == common.gajim.get_jid_from_account(name):
|
||||
common.gajim.interface.roster.draw_account(name)
|
||||
common.gajim.interface.roster.draw_activity(user, name)
|
||||
ctrl = common.gajim.interface.msg_win_mgr.get_control(user, name)
|
||||
common.gajim.interface.roster.draw_activity(jid, name)
|
||||
ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, name)
|
||||
if ctrl:
|
||||
ctrl.update_activity()
|
||||
|
||||
|
@ -437,7 +465,7 @@ class ConnectionPEP:
|
|||
for pep_class in SUPPORTED_PERSONAL_USER_EVENTS:
|
||||
pep = pep_class.get_tag_as_PEP(jid, self.name, event_tag)
|
||||
if pep:
|
||||
self.dispatch('PEP_RECEIVED', (pep.type, pep))
|
||||
self.dispatch('PEP_RECEIVED', (jid, pep.type))
|
||||
|
||||
items = event_tag.getTag('items')
|
||||
if items is None: return
|
||||
|
|
|
@ -1281,15 +1281,10 @@ class RosterWindow:
|
|||
iters = self._get_contact_iter(jid, account, model=self.model)
|
||||
if not iters or not gajim.config.get('show_mood_in_roster'):
|
||||
return
|
||||
jid = self.model[iters[0]][C_JID]
|
||||
jid = jid.decode('utf-8')
|
||||
jid = self.model[iters[0]][C_JID].decode('utf-8')
|
||||
contact = gajim.contacts.get_contact(account, jid)
|
||||
if 'mood' in contact.mood and contact.mood['mood'].strip() in MOODS:
|
||||
pixbuf = gtkgui_helpers.load_mood_icon(
|
||||
contact.mood['mood'].strip()).get_pixbuf()
|
||||
elif 'mood' in contact.mood:
|
||||
pixbuf = gtkgui_helpers.load_mood_icon(
|
||||
'unknown').get_pixbuf()
|
||||
if 'mood' in contact.pep:
|
||||
pixbuf = contact.pep['mood'].asPixbufIcon()
|
||||
else:
|
||||
pixbuf = None
|
||||
for child_iter in iters:
|
||||
|
|
|
@ -579,17 +579,9 @@ class RosterTooltip(NotificationAreaTooltip):
|
|||
Append Tune, Mood, Activity information of the specified contact
|
||||
to the given property list.
|
||||
'''
|
||||
if 'mood' in contact.mood:
|
||||
mood = contact.mood['mood'].strip()
|
||||
mood = MOODS.get(mood, mood)
|
||||
mood = gobject.markup_escape_text(mood)
|
||||
if 'mood' in contact.pep:
|
||||
mood = contact.pep['mood'].asMarkupText()
|
||||
mood_string = _('Mood:') + ' <b>%s</b>' % mood
|
||||
if 'text' in contact.mood \
|
||||
and contact.mood['text'] != '':
|
||||
mood_text = contact.mood['text'].strip()
|
||||
mood_text = \
|
||||
gobject.markup_escape_text(mood_text)
|
||||
mood_string += ' (%s)' % mood_text
|
||||
properties.append((mood_string, None))
|
||||
|
||||
if 'activity' in contact.activity:
|
||||
|
@ -617,27 +609,9 @@ class RosterTooltip(NotificationAreaTooltip):
|
|||
activity_string += ' (%s)' % activity_text
|
||||
properties.append((activity_string, None))
|
||||
|
||||
if 'artist' in contact.tune \
|
||||
or 'title' in contact.tune:
|
||||
if 'artist' in contact.tune:
|
||||
artist = contact.tune['artist'].strip()
|
||||
artist = gobject.markup_escape_text(artist)
|
||||
else:
|
||||
artist = _('Unknown Artist')
|
||||
if 'title' in contact.tune:
|
||||
title = contact.tune['title'].strip()
|
||||
title = gobject.markup_escape_text(title)
|
||||
else:
|
||||
title = _('Unknown Title')
|
||||
if 'source' in contact.tune:
|
||||
source = contact.tune['source'].strip()
|
||||
source = gobject.markup_escape_text(source)
|
||||
else:
|
||||
source = _('Unknown Source')
|
||||
tune_string = _('Tune:') + ' ' + \
|
||||
_('<b>"%(title)s"</b> by <i>%(artist)s</i>\n'
|
||||
'from <i>%(source)s</i>') % {'title': title,
|
||||
'artist': artist, 'source': source}
|
||||
if 'tune' in contact.pep:
|
||||
tune = contact.pep['tune'].asMarkupText()
|
||||
tune_string = _('Tune:') + ' %s' % tune
|
||||
properties.append((tune_string, None))
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue