Implement user gaming (xep-0196)

- configuration options
- theming options
- /gaming
This commit is contained in:
mathieui 2013-03-12 16:12:47 +01:00
parent cec1151ecb
commit d797b1fd65
9 changed files with 126 additions and 6 deletions

View file

@ -349,6 +349,15 @@ display_tune_notifications = false
# option will be ignored.
enable_user_tune = true
# Display user gaming notifications as information messages or not
display_gaming_notifications = false
# Receive the gaming notifications or not (in order to display informations
# in the roster).
# If this is set to false, then the display_gaming_notifications
# option will be ignored.
enable_user_gaming = true
# Display user mood notifications as information messages or not
display_mood_notifications = false

View file

@ -113,6 +113,11 @@ section of this documentation.
the nick you will use when joining a room with no associated nick
If this is empty, the $USER environnement variable will be used
*display_gaming_notifications*:: false
If set to true, notifications about the games your are playing
will be displayed in the info buffer as 'Gaming' messages.
*display_tune_notifications*:: false
If set to true, notifications about the music your contacts listen to
@ -135,7 +140,12 @@ section of this documentation.
*enable_user_activity*:: true
Set this to false if you dont want to receive the mood of your contacts
Set this to false if you dont want to receive the activity of your contacts
anymore.
*enable_user_gaming*:: true
Set this to false if you dont want to receive the gaming activity of your contacts
anymore.
*enable_user_mood*:: true
@ -572,6 +582,12 @@ bar = false
If set to true, notifications about the current activity of your contacts
will be displayed in the info buffer as 'Activity' messages.
*display_gaming_notifications*:: false
If set to true, notifications about the game your are playing
will be displayed in the info buffer as 'Gaming' messages.
*display_mood_notifications*:: false
If set to true, notifications about the mood of your contacts

View file

@ -315,6 +315,25 @@ def format_tune_string(infos):
elems.append('[' + mins + ':' + secs + ']')
return ' '.join(elems)
def format_gaming_string(infos):
"""
Construct a string from a dict containing the "user gaming"
informations.
(for now, only use address and name)
:param dict infos: The informations
:returns: The formatted string
:rtype: :py:class:`str`
"""
name = infos.get('name')
if not name:
return ''
server_address = infos.get('server_address')
if server_address:
return '%s on %s' % (name, server_address)
return name
def safeJID(*args, **kwargs):
"""
Construct a :py:class:`sleekxmpp.JID` object from a string.

View file

@ -84,6 +84,9 @@ class Connection(sleekxmpp.ClientXMPP):
if config.get('enable_user_activity', 'true') != 'false':
self.register_plugin('xep_0108')
if config.get('enable_user_gaming', 'true') != 'false':
self.register_plugin('xep_0196')
if config.get('send_poezio_info', 'true') == 'true':
info = {'name':'poezio',
'version': options.version}

View file

@ -68,6 +68,7 @@ class Contact(object):
self._name = ''
self.error = None
self.tune = {}
self.gaming = {}
self.mood = ''
self.activity = ''

View file

@ -265,9 +265,11 @@ class Core(object):
if config.get('enable_user_nick', 'true') != 'false':
self.xmpp.add_event_handler("user_nick_publish", self.on_nick_received)
if config.get('enable_user_mood', 'true') != 'false':
self.xmpp.add_event_handler("user_mood_publish", self.on_mood)
self.xmpp.add_event_handler("user_mood_publish", self.on_mood_event)
if config.get('enable_user_activity', 'true') != 'false':
self.xmpp.add_event_handler("user_activity_publish", self.on_activity)
self.xmpp.add_event_handler("user_activity_publish", self.on_activity_event)
if config.get('enable_user_gaming', 'true') != 'false':
self.xmpp.add_event_handler("user_gaming_publish", self.on_gaming_event)
self.xmpp.register_handler(self.all_stanzas)
self.initial_joins = []
@ -2215,6 +2217,20 @@ class Core(object):
return self.information('%s is not a correct value for an activity' % specific, 'Error')
self.xmpp.plugin['xep_0108'].publish_activity(general, specific, text, block=False)
def command_gaming(self, arg):
"""
/gaming [<game name> [server address]]
"""
args = common.shell_split(arg)
if not args:
return self.xmpp.plugin['xep_1096'].stop(block=False)
name = args[0]
if len(args) > 1:
address = args[1]
else:
address = None
return self.xmpp.plugin['xep_0196'].publish_gaming(name=name, server_address=address, block=False)
def completion_activity(self, the_input):
"""Completion for /activity"""
txt = the_input.get_text()
@ -2303,6 +2319,8 @@ class Core(object):
self.xmpp.plugin['xep_0107'].stop(block=False)
if config.get('enable_user_activity', 'true') != 'false':
self.xmpp.plugin['xep_0108'].stop(block=False)
if config.get('enable_user_gaming', 'true') != 'false':
self.xmpp.plugin['xep_0196'].stop(block=False)
self.plugin_manager.disable_plugins()
self.disconnect(msg)
self.running = False
@ -2571,13 +2589,20 @@ class Core(object):
' Nothing means "stop broadcasting an activity".'),
shortdesc=_('Send your activity.'),
completion=self.completion_activity)
if config.get('eanble_user_activity', 'true') != 'false':
if config.get('enable_user_activity', 'true') != 'false':
self.register_command('mood', self.command_mood,
usage='[<mood> [text]]',
desc=_('Send your current mood to your contacts (use the completion).'
' Nothing means "stop broadcasting a mood".'),
shortdesc=_('Send your mood.'),
completion=self.completion_mood)
if config.get('enable_user_gaming', 'true') != 'false':
self.register_command('gaming', self.command_gaming,
usage='[<game name> [server address]]',
desc=_('Send your current gaming activity to your contacts.'
' Nothing means "stop broadcasting a mood".'),
shortdesc=_('Send your gaming activity.'),
completion=None)
####################### XMPP Event Handlers ##################################
@ -2720,7 +2745,37 @@ class Core(object):
else:
contact.name= ''
def on_mood(self, message):
def on_gaming_event(self, message):
"""
Called when a pep notification for user gaming
is received
"""
contact = roster[message['from'].bare]
if not contact:
return
item = message['pubsub_event']['items']['item']
if item.find('{urn:xmpp:gaming:0}gaming') is not None:
item = item['gaming']
# only name and server_address are used for now
contact.gaming = {
'character_name': item['character_name'],
'character_profile': item['character_profile'],
'name': item['name'],
'level': item['level'],
'uri': item['uri'],
'server_name': item['server_name'],
'server_address': item['server_address'],
}
else:
contact.gaming = {}
if config.get_by_tabname('display_gaming_notifications', 'false', contact.bare_jid) == 'true':
if contact.gaming:
self.information('%s is playing %s' % (contact.bare_jid, common.format_gaming_string(contact.gaming)), 'Gaming')
else:
self.information(contact.bare_jid + ' stopped playing.', 'Gaming')
def on_mood_event(self, message):
"""
Called when a pep notification for an user mood
is received.
@ -2747,7 +2802,7 @@ class Core(object):
else:
self.information(contact.bare_jid + ' stopped having his/her mood.', 'Mood')
def on_activity(self, message):
def on_activity_event(self, message):
"""
Called when a pep notification for an user activity
is received.

View file

@ -2855,6 +2855,8 @@ class RosterInfoTab(Tab):
acc.append('Mood: %s' % cont.mood)
if cont.activity:
acc.append('Activity: %s' % cont.activity)
if cont.gaming:
acc.append('Game: %s' % (common.format_gaming_string(cont.gaming)))
msg = '\n'.join(acc)
elif isinstance(selected_row, Resource):
res = selected_row

View file

@ -204,7 +204,9 @@ class Theme(object):
CHAR_ROSTER_ASKED = '?'
CHAR_ROSTER_ACTIVITY = ''
CHAR_ROSTER_MOOD = ''
CHAR_ROSTER_GAMING = ''
COLOR_ROSTER_GAMING = (6, -1)
COLOR_ROSTER_MOOD = (2, -1)
COLOR_ROSTER_ACTIVITY = (3, -1)
COLOR_ROSTER_TUNE = (6, -1)
@ -225,6 +227,7 @@ class Theme(object):
'help': (10, -1),
'headline': (11, -1, 'b'),
'tune': (6, -1),
'gaming': (6, -1),
'mood': (2, -1),
'activity': (3, -1),
'default': (7, -1),

View file

@ -1942,6 +1942,8 @@ class RosterWin(Win):
added += len(get_theme().CHAR_ROSTER_MOOD)
if contact.activity:
added += len(get_theme().CHAR_ROSTER_ACTIVITY)
if contact.gaming:
added += len(get_theme().CHAR_ROSTER_GAMING)
if config.getl('show_roster_jids', 'true') == 'false' and contact.name:
display_name = '%s' % contact.name
@ -1966,6 +1968,8 @@ class RosterWin(Win):
self.addstr(get_theme().CHAR_ROSTER_ACTIVITY, to_curses_attr(get_theme().COLOR_ROSTER_ACTIVITY))
if contact.mood:
self.addstr(get_theme().CHAR_ROSTER_MOOD, to_curses_attr(get_theme().COLOR_ROSTER_MOOD))
if contact.gaming:
self.addstr(get_theme().CHAR_ROSTER_GAMING, to_curses_attr(get_theme().COLOR_ROSTER_GAMING))
self.finish_line()
def draw_resource_line(self, y, resource, colored):
@ -2033,14 +2037,22 @@ class ContactInfoWin(Win):
if contact.tune:
self.addstr(i, 0, 'Current Tune: %s' % common.format_tune_string(contact.tune), to_curses_attr(get_theme().COLOR_NORMAL_TEXT))
self.finish_line()
i += 1
if contact.mood:
self.addstr(i, 0, 'Mood: %s' % contact.mood, to_curses_attr(get_theme().COLOR_NORMAL_TEXT))
self.finish_line()
i += 1
if contact.activity:
self.addstr(i, 0, 'Activity: %s' % contact.activity, to_curses_attr(get_theme().COLOR_NORMAL_TEXT))
self.finish_line()
i += 1
if contact.gaming:
self.addstr(i, 0, 'Game: %s on %s' % (contact.gaming['name'], contact.gamin['server_address']), to_curses_attr(get_theme().COLOR_NORMAL_TEXT))
self.finish_line()
i += 1
def draw_group_info(self, group):