Move MUC config change handling into MUC module
- Remove status conditions code, since the XEP made a namespace bump to :1 and is now backwards compatible its useless - XEP-0045 mentions status code 100 can be in messages but there is no case given where this would ever happen, so its removed from message handling
This commit is contained in:
parent
b935ce7096
commit
1fec6681cd
|
@ -40,27 +40,6 @@ from gajim.common.file_props import FilesProp
|
||||||
|
|
||||||
log = logging.getLogger('gajim.c.connection_handlers_events')
|
log = logging.getLogger('gajim.c.connection_handlers_events')
|
||||||
|
|
||||||
CONDITION_TO_CODE = {
|
|
||||||
'realjid-public': 100,
|
|
||||||
'affiliation-changed': 101,
|
|
||||||
'unavailable-shown': 102,
|
|
||||||
'unavailable-not-shown': 103,
|
|
||||||
'configuration-changed': 104,
|
|
||||||
'self-presence': 110,
|
|
||||||
'logging-enabled': 170,
|
|
||||||
'logging-disabled': 171,
|
|
||||||
'non-anonymous': 172,
|
|
||||||
'semi-anonymous': 173,
|
|
||||||
'fully-anonymous': 174,
|
|
||||||
'room-created': 201,
|
|
||||||
'nick-assigned': 210,
|
|
||||||
'banned': 301,
|
|
||||||
'new-nick': 303,
|
|
||||||
'kicked': 307,
|
|
||||||
'removed-affiliation': 321,
|
|
||||||
'removed-membership': 322,
|
|
||||||
'removed-shutdown': 332,
|
|
||||||
}
|
|
||||||
|
|
||||||
class HelperEvent:
|
class HelperEvent:
|
||||||
def get_jid_resource(self, check_fake_jid=False):
|
def get_jid_resource(self, check_fake_jid=False):
|
||||||
|
@ -378,14 +357,7 @@ class GcPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
self.status_code = ['destroyed']
|
self.status_code = ['destroyed']
|
||||||
else:
|
else:
|
||||||
self.reason = self.stanza.getReason()
|
self.reason = self.stanza.getReason()
|
||||||
conditions = self.stanza.getStatusConditions()
|
self.status_code = self.stanza.getStatusCode()
|
||||||
if conditions:
|
|
||||||
self.status_code = []
|
|
||||||
for condition in conditions:
|
|
||||||
if condition in CONDITION_TO_CODE:
|
|
||||||
self.status_code.append(CONDITION_TO_CODE[condition])
|
|
||||||
else:
|
|
||||||
self.status_code = self.stanza.getStatusCode()
|
|
||||||
|
|
||||||
self.role = self.stanza.getRole()
|
self.role = self.stanza.getRole()
|
||||||
self.affiliation = self.stanza.getAffiliation()
|
self.affiliation = self.stanza.getAffiliation()
|
||||||
|
@ -429,22 +401,7 @@ class GcMessageReceivedEvent(nec.NetworkIncomingEvent):
|
||||||
# message from server
|
# message from server
|
||||||
self.nick = ''
|
self.nick = ''
|
||||||
|
|
||||||
conditions = self.stanza.getStatusConditions()
|
|
||||||
if conditions:
|
|
||||||
self.status_code = []
|
|
||||||
for condition in conditions:
|
|
||||||
if condition in CONDITION_TO_CODE:
|
|
||||||
self.status_code.append(CONDITION_TO_CODE[condition])
|
|
||||||
else:
|
|
||||||
self.status_code = self.stanza.getStatusCode()
|
|
||||||
|
|
||||||
if not self.stanza.getTag('body'): # no <body>
|
if not self.stanza.getTag('body'): # no <body>
|
||||||
# It could be a config change. See
|
|
||||||
# http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify
|
|
||||||
if self.stanza.getTag('x'):
|
|
||||||
if self.status_code != []:
|
|
||||||
app.nec.push_incoming_event(GcConfigChangedReceivedEvent(
|
|
||||||
None, conn=self.conn, msg_event=self))
|
|
||||||
if self.msg_obj.form_node:
|
if self.msg_obj.form_node:
|
||||||
# It could be a voice request. See
|
# It could be a voice request. See
|
||||||
# http://www.xmpp.org/extensions/xep-0045.html#voiceapprove
|
# http://www.xmpp.org/extensions/xep-0045.html#voiceapprove
|
||||||
|
|
|
@ -26,6 +26,7 @@ from gajim.common.modules import dataforms
|
||||||
from gajim.common import app
|
from gajim.common import app
|
||||||
from gajim.common import helpers
|
from gajim.common import helpers
|
||||||
from gajim.common.caps_cache import muc_caps_cache
|
from gajim.common.caps_cache import muc_caps_cache
|
||||||
|
from gajim.common.nec import NetworkEvent
|
||||||
from gajim.common.nec import NetworkIncomingEvent
|
from gajim.common.nec import NetworkIncomingEvent
|
||||||
|
|
||||||
log = logging.getLogger('gajim.c.m.muc')
|
log = logging.getLogger('gajim.c.m.muc')
|
||||||
|
@ -37,6 +38,7 @@ class MUC:
|
||||||
self._account = con.name
|
self._account = con.name
|
||||||
|
|
||||||
self.handlers = [
|
self.handlers = [
|
||||||
|
('message', self._on_config_change, '', nbxmpp.NS_MUC_USER),
|
||||||
('message', self._mediated_invite, '', nbxmpp.NS_MUC_USER),
|
('message', self._mediated_invite, '', nbxmpp.NS_MUC_USER),
|
||||||
('message', self._direct_invite, '', nbxmpp.NS_CONFERENCE),
|
('message', self._direct_invite, '', nbxmpp.NS_CONFERENCE),
|
||||||
]
|
]
|
||||||
|
@ -154,6 +156,41 @@ class MUC:
|
||||||
self._con.connection.SendAndCallForResponse(
|
self._con.connection.SendAndCallForResponse(
|
||||||
iq, self._default_response, {})
|
iq, self._default_response, {})
|
||||||
|
|
||||||
|
def _on_config_change(self, _con, stanza):
|
||||||
|
muc_user = stanza.getTag('x', namespace=nbxmpp.NS_MUC_USER)
|
||||||
|
if muc_user is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if stanza.getBody():
|
||||||
|
return
|
||||||
|
|
||||||
|
room_list = app.contacts.get_gc_list(self._account)
|
||||||
|
room_jid = str(stanza.getFrom())
|
||||||
|
if room_jid not in room_list:
|
||||||
|
# Message not from a group chat
|
||||||
|
return
|
||||||
|
|
||||||
|
# https://xmpp.org/extensions/xep-0045.html#registrar-statuscodes
|
||||||
|
change_codes = ['100', '102', '103', '104',
|
||||||
|
'170', '171', '172', '173', '174']
|
||||||
|
|
||||||
|
codes = set()
|
||||||
|
for status in muc_user.getTags('status'):
|
||||||
|
code = status.getAttr('code')
|
||||||
|
if code in change_codes:
|
||||||
|
codes.add(code)
|
||||||
|
|
||||||
|
if not codes:
|
||||||
|
return
|
||||||
|
|
||||||
|
log.info('Received config change: %s', codes)
|
||||||
|
app.nec.push_incoming_event(
|
||||||
|
NetworkEvent('gc-config-changed-received',
|
||||||
|
account=self._account,
|
||||||
|
room_jid=room_jid,
|
||||||
|
status_codes=codes))
|
||||||
|
raise nbxmpp.NodeProcessed
|
||||||
|
|
||||||
def destroy(self, room_jid, reason='', jid=''):
|
def destroy(self, room_jid, reason='', jid=''):
|
||||||
if not app.account_is_connected(self._account):
|
if not app.account_is_connected(self._account):
|
||||||
return
|
return
|
||||||
|
|
|
@ -1126,9 +1126,6 @@ class GroupchatControl(ChatControlBase):
|
||||||
self.parent_win.redraw_tab(self, 'attention')
|
self.parent_win.redraw_tab(self, 'attention')
|
||||||
else:
|
else:
|
||||||
self.attention_flag = True
|
self.attention_flag = True
|
||||||
if '100' in obj.status_code:
|
|
||||||
# Room is not anonymous
|
|
||||||
self.is_anonymous = False
|
|
||||||
if not obj.nick:
|
if not obj.nick:
|
||||||
# message from server
|
# message from server
|
||||||
self.print_conversation(
|
self.print_conversation(
|
||||||
|
@ -1416,40 +1413,40 @@ class GroupchatControl(ChatControlBase):
|
||||||
else:
|
else:
|
||||||
self.subject_button.show()
|
self.subject_button.show()
|
||||||
|
|
||||||
def _nec_gc_config_changed_received(self, obj):
|
def _nec_gc_config_changed_received(self, event):
|
||||||
# statuscode is a list
|
|
||||||
# http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify
|
# http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify
|
||||||
# http://www.xmpp.org/extensions/xep-0045.html#registrar-statuscodes...
|
if event.account != self.account:
|
||||||
# -init
|
return
|
||||||
if obj.room_jid != self.room_jid or obj.conn.name != self.account:
|
|
||||||
|
if event.room_jid != self.room_jid:
|
||||||
return
|
return
|
||||||
|
|
||||||
changes = []
|
changes = []
|
||||||
if '100' in obj.status_code:
|
if '100' in event.status_codes:
|
||||||
# Can be a presence (see chg_contact_status in groupchat_control.py)
|
# Can be a presence (see chg_contact_status in groupchat_control.py)
|
||||||
changes.append(_('Any occupant is allowed to see your full JID'))
|
changes.append(_('Any occupant is allowed to see your full JID'))
|
||||||
self.is_anonymous = False
|
self.is_anonymous = False
|
||||||
if '102' in obj.status_code:
|
if '102' in event.status_codes:
|
||||||
changes.append(_('Room now shows unavailable members'))
|
changes.append(_('Room now shows unavailable members'))
|
||||||
if '103' in obj.status_code:
|
if '103' in event.status_codes:
|
||||||
changes.append(_('Room now does not show unavailable members'))
|
changes.append(_('Room now does not show unavailable members'))
|
||||||
if '104' in obj.status_code:
|
if '104' in event.status_codes:
|
||||||
changes.append(_('A setting not related to privacy has been '
|
changes.append(_('A setting not related to privacy has been '
|
||||||
'changed'))
|
'changed'))
|
||||||
app.connections[self.account].get_module('Discovery').disco_muc(
|
app.connections[self.account].get_module('Discovery').disco_muc(
|
||||||
self.room_jid, self.update_actions, update=True)
|
self.room_jid, self.update_actions, update=True)
|
||||||
if '170' in obj.status_code:
|
if '170' in event.status_codes:
|
||||||
# Can be a presence (see chg_contact_status in groupchat_control.py)
|
# Can be a presence (see chg_contact_status in groupchat_control.py)
|
||||||
changes.append(_('Room logging is now enabled'))
|
changes.append(_('Room logging is now enabled'))
|
||||||
if '171' in obj.status_code:
|
if '171' in event.status_codes:
|
||||||
changes.append(_('Room logging is now disabled'))
|
changes.append(_('Room logging is now disabled'))
|
||||||
if '172' in obj.status_code:
|
if '172' in event.status_codes:
|
||||||
changes.append(_('Room is now non-anonymous'))
|
changes.append(_('Room is now non-anonymous'))
|
||||||
self.is_anonymous = False
|
self.is_anonymous = False
|
||||||
if '173' in obj.status_code:
|
if '173' in event.status_codes:
|
||||||
changes.append(_('Room is now semi-anonymous'))
|
changes.append(_('Room is now semi-anonymous'))
|
||||||
self.is_anonymous = True
|
self.is_anonymous = True
|
||||||
if '174' in obj.status_code:
|
if '174' in event.status_codes:
|
||||||
changes.append(_('Room is now fully anonymous'))
|
changes.append(_('Room is now fully anonymous'))
|
||||||
self.is_anonymous = True
|
self.is_anonymous = True
|
||||||
|
|
||||||
|
|
|
@ -385,7 +385,7 @@ class GajimRemote(Server):
|
||||||
# event has not been handled at GUI level
|
# event has not been handled at GUI level
|
||||||
return
|
return
|
||||||
self.raise_signal('GCMessage', (obj.conn.name, [obj.fjid, obj.msgtxt,
|
self.raise_signal('GCMessage', (obj.conn.name, [obj.fjid, obj.msgtxt,
|
||||||
obj.timestamp, obj.delayed, obj.xhtml_msgtxt, obj.status_code,
|
obj.timestamp, obj.delayed, obj.xhtml_msgtxt,
|
||||||
obj.displaymarking, obj.captcha_form, obj.needs_highlight]))
|
obj.displaymarking, obj.captcha_form, obj.needs_highlight]))
|
||||||
|
|
||||||
def on_our_status(self, obj):
|
def on_our_status(self, obj):
|
||||||
|
|
Loading…
Reference in New Issue