Refactor UserTune into own module
This commit is contained in:
parent
568c2d93a0
commit
a4350a812b
8 changed files with 105 additions and 87 deletions
|
@ -78,6 +78,7 @@ from gajim.common.modules.bookmarks import Bookmarks
|
||||||
from gajim.common.modules.pep import PEP
|
from gajim.common.modules.pep import PEP
|
||||||
from gajim.common.modules.user_avatar import UserAvatar
|
from gajim.common.modules.user_avatar import UserAvatar
|
||||||
from gajim.common.modules.user_activity import UserActivity
|
from gajim.common.modules.user_activity import UserActivity
|
||||||
|
from gajim.common.modules.user_tune import UserTune
|
||||||
from gajim.common.connection_handlers import *
|
from gajim.common.connection_handlers import *
|
||||||
from gajim.common.contacts import GC_Contact
|
from gajim.common.contacts import GC_Contact
|
||||||
from gajim.gtkgui_helpers import get_action
|
from gajim.gtkgui_helpers import get_action
|
||||||
|
@ -670,6 +671,7 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
self.register_module('Bookmarks', Bookmarks, self)
|
self.register_module('Bookmarks', Bookmarks, self)
|
||||||
self.register_module('UserAvatar', UserAvatar, self)
|
self.register_module('UserAvatar', UserAvatar, self)
|
||||||
self.register_module('UserActivity', UserActivity, self)
|
self.register_module('UserActivity', UserActivity, self)
|
||||||
|
self.register_module('UserTune', UserTune, self)
|
||||||
|
|
||||||
app.ged.register_event_handler('privacy-list-received', ged.CORE,
|
app.ged.register_event_handler('privacy-list-received', ged.CORE,
|
||||||
self._nec_privacy_list_received)
|
self._nec_privacy_list_received)
|
||||||
|
|
|
@ -296,7 +296,6 @@ class ConnectionPEP(object):
|
||||||
|
|
||||||
def reset_awaiting_pep(self):
|
def reset_awaiting_pep(self):
|
||||||
self.to_be_sent_mood = None
|
self.to_be_sent_mood = None
|
||||||
self.to_be_sent_tune = None
|
|
||||||
self.to_be_sent_nick = None
|
self.to_be_sent_nick = None
|
||||||
self.to_be_sent_location = None
|
self.to_be_sent_location = None
|
||||||
|
|
||||||
|
@ -306,8 +305,6 @@ class ConnectionPEP(object):
|
||||||
"""
|
"""
|
||||||
if self.to_be_sent_mood:
|
if self.to_be_sent_mood:
|
||||||
self.send_mood(*self.to_be_sent_mood)
|
self.send_mood(*self.to_be_sent_mood)
|
||||||
if self.to_be_sent_tune:
|
|
||||||
self.send_tune(*self.to_be_sent_tune)
|
|
||||||
if self.to_be_sent_nick:
|
if self.to_be_sent_nick:
|
||||||
self.send_nick(self.to_be_sent_nick)
|
self.send_nick(self.to_be_sent_nick)
|
||||||
if self.to_be_sent_location:
|
if self.to_be_sent_location:
|
||||||
|
@ -337,42 +334,6 @@ class ConnectionPEP(object):
|
||||||
# not all client support new XEP, so we still retract
|
# not all client support new XEP, so we still retract
|
||||||
self.get_module('PubSub').send_pb_retract('', nbxmpp.NS_MOOD, '0')
|
self.get_module('PubSub').send_pb_retract('', nbxmpp.NS_MOOD, '0')
|
||||||
|
|
||||||
def send_tune(self, artist='', title='', source='', track=0, length=0,
|
|
||||||
items=None):
|
|
||||||
if self.connected == 1:
|
|
||||||
# We are connecting, keep tune in mem and send it when we'll be
|
|
||||||
# connected
|
|
||||||
self.to_be_sent_tune = (artist, title, source, track, length, items)
|
|
||||||
return
|
|
||||||
if not self.pep_supported:
|
|
||||||
return
|
|
||||||
item = nbxmpp.Node('tune', {'xmlns': nbxmpp.NS_TUNE})
|
|
||||||
if artist:
|
|
||||||
i = item.addChild('artist')
|
|
||||||
i.addData(artist)
|
|
||||||
if title:
|
|
||||||
i = item.addChild('title')
|
|
||||||
i.addData(title)
|
|
||||||
if source:
|
|
||||||
i = item.addChild('source')
|
|
||||||
i.addData(source)
|
|
||||||
if track:
|
|
||||||
i = item.addChild('track')
|
|
||||||
i.addData(track)
|
|
||||||
if length:
|
|
||||||
i = item.addChild('length')
|
|
||||||
i.addData(length)
|
|
||||||
if items:
|
|
||||||
item.addChild(payload=items)
|
|
||||||
self.get_module('PubSub').send_pb_publish('', nbxmpp.NS_TUNE, item, '0')
|
|
||||||
|
|
||||||
def retract_tune(self):
|
|
||||||
if not self.pep_supported:
|
|
||||||
return
|
|
||||||
self.send_tune(None)
|
|
||||||
# not all client support new XEP, so we still retract
|
|
||||||
self.get_module('PubSub').send_pb_retract('', nbxmpp.NS_TUNE, '0')
|
|
||||||
|
|
||||||
def send_nickname(self, nick):
|
def send_nickname(self, nick):
|
||||||
if self.connected == 1:
|
if self.connected == 1:
|
||||||
# We are connecting, keep nick in mem and send it when we'll be
|
# We are connecting, keep nick in mem and send it when we'll be
|
||||||
|
|
|
@ -132,6 +132,7 @@ class PEPHandlerType(IntEnum):
|
||||||
@unique
|
@unique
|
||||||
class PEPEventType(IntEnum):
|
class PEPEventType(IntEnum):
|
||||||
ACTIVITY = 0
|
ACTIVITY = 0
|
||||||
|
TUNE = 1
|
||||||
|
|
||||||
|
|
||||||
ACTIVITIES = {
|
ACTIVITIES = {
|
||||||
|
|
96
gajim/common/modules/user_tune.py
Normal file
96
gajim/common/modules/user_tune.py
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
# This file is part of Gajim.
|
||||||
|
#
|
||||||
|
# Gajim is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published
|
||||||
|
# by the Free Software Foundation; version 3 only.
|
||||||
|
#
|
||||||
|
# Gajim is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Gajim. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# XEP-0118: User Tune
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import nbxmpp
|
||||||
|
from gi.repository import GLib
|
||||||
|
|
||||||
|
from gajim.common.const import PEPEventType
|
||||||
|
from gajim.common.exceptions import StanzaMalformed
|
||||||
|
from gajim.common.modules.pep import AbstractPEPModule, AbstractPEPData
|
||||||
|
|
||||||
|
log = logging.getLogger('gajim.c.m.user_tune')
|
||||||
|
|
||||||
|
|
||||||
|
class UserTuneData(AbstractPEPData):
|
||||||
|
|
||||||
|
type_ = PEPEventType.TUNE
|
||||||
|
|
||||||
|
def __init__(self, tune):
|
||||||
|
self._pep_specific_data = tune
|
||||||
|
|
||||||
|
def asMarkupText(self):
|
||||||
|
tune = self._pep_specific_data
|
||||||
|
|
||||||
|
artist = tune.get('artist', _('Unknown Artist'))
|
||||||
|
artist = GLib.markup_escape_text(artist)
|
||||||
|
|
||||||
|
title = tune.get('title', _('Unknown Title'))
|
||||||
|
title = GLib.markup_escape_text(title)
|
||||||
|
|
||||||
|
source = tune.get('source', _('Unknown Source'))
|
||||||
|
source = GLib.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 UserTune(AbstractPEPModule):
|
||||||
|
|
||||||
|
name = 'tune'
|
||||||
|
namespace = nbxmpp.NS_TUNE
|
||||||
|
pep_class = UserTuneData
|
||||||
|
store_publish = True
|
||||||
|
_log = log
|
||||||
|
|
||||||
|
def __init__(self, con):
|
||||||
|
AbstractPEPModule.__init__(self, con, con.name)
|
||||||
|
|
||||||
|
self.handlers = []
|
||||||
|
|
||||||
|
def _extract_info(self, item):
|
||||||
|
tune_dict = {}
|
||||||
|
tune_tag = item.getTag('tune', namespace=self.namespace)
|
||||||
|
if tune_tag is None:
|
||||||
|
raise StanzaMalformed('No activity node')
|
||||||
|
|
||||||
|
for child in tune_tag.getChildren():
|
||||||
|
name = child.getName().strip()
|
||||||
|
data = child.getData().strip()
|
||||||
|
if child.getName() in ['artist', 'title', 'source',
|
||||||
|
'track', 'length']:
|
||||||
|
tune_dict[name] = data
|
||||||
|
|
||||||
|
return tune_dict or None
|
||||||
|
|
||||||
|
def _build_node(self, data):
|
||||||
|
artist, title, source, track, length = data
|
||||||
|
item = nbxmpp.Node('tune', {'xmlns': nbxmpp.NS_TUNE})
|
||||||
|
if artist:
|
||||||
|
item.addChild('artist', payload=artist)
|
||||||
|
if title:
|
||||||
|
item.addChild('title', payload=title)
|
||||||
|
if source:
|
||||||
|
item.addChild('source', payload=source)
|
||||||
|
if track:
|
||||||
|
item.addChild('track', payload=track)
|
||||||
|
if length:
|
||||||
|
item.addChild('length', payload=length)
|
||||||
|
return item
|
|
@ -109,8 +109,6 @@ MOODS = {
|
||||||
'weak': _('Weak'),
|
'weak': _('Weak'),
|
||||||
'worried': _('Worried')}
|
'worried': _('Worried')}
|
||||||
|
|
||||||
TUNE_DATA = ['artist', 'title', 'source', 'track', 'length']
|
|
||||||
|
|
||||||
LOCATION_DATA = {
|
LOCATION_DATA = {
|
||||||
'accuracy': _('accuracy'),
|
'accuracy': _('accuracy'),
|
||||||
'alt': _('alt'),
|
'alt': _('alt'),
|
||||||
|
@ -234,47 +232,6 @@ class UserMoodPEP(AbstractPEP):
|
||||||
return mood
|
return mood
|
||||||
|
|
||||||
|
|
||||||
class UserTunePEP(AbstractPEP):
|
|
||||||
'''XEP-0118: User Tune'''
|
|
||||||
|
|
||||||
type_ = 'tune'
|
|
||||||
namespace = nbxmpp.NS_TUNE
|
|
||||||
|
|
||||||
def _extract_info(self, items):
|
|
||||||
tune_dict = {}
|
|
||||||
|
|
||||||
for item in items.getTags('item'):
|
|
||||||
tune_tag = item.getTag('tune')
|
|
||||||
if tune_tag:
|
|
||||||
for child in tune_tag.getChildren():
|
|
||||||
name = child.getName().strip()
|
|
||||||
data = child.getData().strip()
|
|
||||||
if child.getName() in TUNE_DATA:
|
|
||||||
tune_dict[name] = data
|
|
||||||
|
|
||||||
retracted = items.getTag('retract') or not ('artist' in tune_dict or
|
|
||||||
'title' in tune_dict)
|
|
||||||
return (tune_dict, retracted)
|
|
||||||
|
|
||||||
def asMarkupText(self):
|
|
||||||
assert not self._retracted
|
|
||||||
tune = self._pep_specific_data
|
|
||||||
|
|
||||||
artist = tune.get('artist', _('Unknown Artist'))
|
|
||||||
artist = GLib.markup_escape_text(artist)
|
|
||||||
|
|
||||||
title = tune.get('title', _('Unknown Title'))
|
|
||||||
title = GLib.markup_escape_text(title)
|
|
||||||
|
|
||||||
source = tune.get('source', _('Unknown Source'))
|
|
||||||
source = GLib.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 UserNicknamePEP(AbstractPEP):
|
class UserNicknamePEP(AbstractPEP):
|
||||||
'''XEP-0172: User Nickname'''
|
'''XEP-0172: User Nickname'''
|
||||||
|
|
||||||
|
@ -390,5 +347,5 @@ class AvatarNotificationPEP(AbstractPEP):
|
||||||
|
|
||||||
|
|
||||||
SUPPORTED_PERSONAL_USER_EVENTS = [
|
SUPPORTED_PERSONAL_USER_EVENTS = [
|
||||||
UserMoodPEP, UserTunePEP,
|
UserMoodPEP,
|
||||||
UserNicknamePEP, UserLocationPEP, AvatarNotificationPEP]
|
UserNicknamePEP, UserLocationPEP, AvatarNotificationPEP]
|
||||||
|
|
|
@ -629,7 +629,7 @@ def get_pep_as_pixbuf(pep_class):
|
||||||
mood = received_mood if received_mood in pep.MOODS else 'unknown'
|
mood = received_mood if received_mood in pep.MOODS else 'unknown'
|
||||||
pixbuf = load_mood_icon(mood).get_pixbuf()
|
pixbuf = load_mood_icon(mood).get_pixbuf()
|
||||||
return pixbuf
|
return pixbuf
|
||||||
elif isinstance(pep_class, pep.UserTunePEP):
|
elif pep_class == PEPEventType.TUNE:
|
||||||
icon = get_icon_pixmap('audio-x-generic', quiet=True)
|
icon = get_icon_pixmap('audio-x-generic', quiet=True)
|
||||||
if not icon:
|
if not icon:
|
||||||
path = os.path.join(configpaths.get('DATA'), 'emoticons', 'static',
|
path = os.path.join(configpaths.get('DATA'), 'emoticons', 'static',
|
||||||
|
|
|
@ -2169,7 +2169,8 @@ class Interface:
|
||||||
continue
|
continue
|
||||||
if app.connections[acct].music_track_info == music_track_info:
|
if app.connections[acct].music_track_info == music_track_info:
|
||||||
continue
|
continue
|
||||||
app.connections[acct].send_tune(artist, title, source)
|
app.connections[acct].get_module('UserTune').send(
|
||||||
|
(artist, title, source, None, None))
|
||||||
app.connections[acct].music_track_info = music_track_info
|
app.connections[acct].music_track_info = music_track_info
|
||||||
|
|
||||||
def read_sleepy(self):
|
def read_sleepy(self):
|
||||||
|
@ -2477,7 +2478,7 @@ class Interface:
|
||||||
received_mood = pep_obj._pep_specific_data['mood']
|
received_mood = pep_obj._pep_specific_data['mood']
|
||||||
mood = received_mood if received_mood in pep.MOODS else 'unknown'
|
mood = received_mood if received_mood in pep.MOODS else 'unknown'
|
||||||
return gtkgui_helpers.load_mood_icon(mood).get_pixbuf()
|
return gtkgui_helpers.load_mood_icon(mood).get_pixbuf()
|
||||||
elif isinstance(pep_obj, pep.UserTunePEP):
|
elif pep_obj == PEPEventType.TUNE:
|
||||||
path = os.path.join(
|
path = os.path.join(
|
||||||
configpaths.get('DATA'), 'emoticons', 'static', 'music.png')
|
configpaths.get('DATA'), 'emoticons', 'static', 'music.png')
|
||||||
return GdkPixbuf.Pixbuf.new_from_file(path)
|
return GdkPixbuf.Pixbuf.new_from_file(path)
|
||||||
|
|
|
@ -3594,7 +3594,7 @@ class RosterWindow:
|
||||||
if active:
|
if active:
|
||||||
app.interface.enable_music_listener()
|
app.interface.enable_music_listener()
|
||||||
else:
|
else:
|
||||||
app.connections[account].retract_tune()
|
app.connections[account].get_module('UserTune').retract()
|
||||||
# disable music listener only if no other account uses it
|
# disable music listener only if no other account uses it
|
||||||
for acc in app.connections:
|
for acc in app.connections:
|
||||||
if app.config.get_per('accounts', acc, 'publish_tune'):
|
if app.config.get_per('accounts', acc, 'publish_tune'):
|
||||||
|
|
Loading…
Add table
Reference in a new issue