add XEP-202 in vcard window. Fixes #4007
This commit is contained in:
parent
bec8b7ff15
commit
7c96178126
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1481,7 +1481,7 @@ class Connection(ConnectionHandlers):
|
|||
to_whom_jid = jid
|
||||
if resource:
|
||||
to_whom_jid += '/' + resource
|
||||
iq = common.xmpp.Iq(to = to_whom_jid, typ = 'get', queryNS =\
|
||||
iq = common.xmpp.Iq(to=to_whom_jid, typ='get', queryNS=\
|
||||
common.xmpp.NS_VERSION)
|
||||
id_ = self.connection.getAnID()
|
||||
iq.setID(id_)
|
||||
|
@ -1490,6 +1490,27 @@ class Connection(ConnectionHandlers):
|
|||
self.version_ids.append(id_)
|
||||
self.connection.send(iq)
|
||||
|
||||
def request_entity_time(self, jid, resource, groupchat_jid=None):
|
||||
'''groupchat_jid is used when we want to send a request to a real jid
|
||||
and act as if the answer comes from the groupchat_jid'''
|
||||
if not self.connection:
|
||||
return
|
||||
# If we are invisible, do not request
|
||||
if self.connected == gajim.SHOW_LIST.index('invisible'):
|
||||
self.dispatch('ENTITY_TIME', (jid, resource, _('Not fetched because of invisible status')))
|
||||
return
|
||||
to_whom_jid = jid
|
||||
if resource:
|
||||
to_whom_jid += '/' + resource
|
||||
iq = common.xmpp.Iq(to=to_whom_jid, typ='get', queryNS=\
|
||||
common.xmpp.NS_TIME_REVISED)
|
||||
id_ = self.connection.getAnID()
|
||||
iq.setID(id_)
|
||||
if groupchat_jid:
|
||||
self.groupchat_jids[id_] = groupchat_jid
|
||||
self.entity_time_ids.append(id_)
|
||||
self.connection.send(iq)
|
||||
|
||||
def get_settings(self):
|
||||
''' Get Gajim settings as described in XEP 0049 '''
|
||||
if not self.connection:
|
||||
|
|
|
@ -38,6 +38,7 @@ import hashlib
|
|||
from time import (altzone, daylight, gmtime, localtime, mktime, strftime,
|
||||
time as time_time, timezone, tzname)
|
||||
from calendar import timegm
|
||||
import datetime
|
||||
|
||||
import socks5
|
||||
import common.xmpp
|
||||
|
@ -1426,6 +1427,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
|
|||
self.last_ids = []
|
||||
# IDs of jabber:iq:version requests
|
||||
self.version_ids = []
|
||||
# IDs of urn:xmpp:time requests
|
||||
self.entity_time_ids = []
|
||||
# ID of urn:xmpp:ping requests
|
||||
self.awaiting_xmpp_ping_id = None
|
||||
self.continue_connect_info = None
|
||||
|
@ -1475,6 +1478,10 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
|
|||
self.dispatch('LAST_STATUS_TIME', (jid_stripped, resource, -1, ''))
|
||||
self.last_ids.remove(id_)
|
||||
return
|
||||
if id_ in self.entity_time_ids:
|
||||
self.dispatch('ENTITY_TIME', (jid_stripped, resource, ''))
|
||||
self.entity_time_ids.remove(id_)
|
||||
return
|
||||
if id_ == self.awaiting_xmpp_ping_id:
|
||||
self.awaiting_xmpp_ping_id = None
|
||||
errmsg = iq_obj.getErrorMsg()
|
||||
|
@ -1639,6 +1646,47 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
|
|||
self.connection.send(iq_obj)
|
||||
raise common.xmpp.NodeProcessed
|
||||
|
||||
def _TimeRevisedResultCB(self, con, iq_obj):
|
||||
log.debug('TimeRevisedResultCB')
|
||||
time_info = ''
|
||||
qp = iq_obj.getTag('time')
|
||||
tzo = qp.getTag('tzo').getData()
|
||||
if tzo == 'Z':
|
||||
tzo = '0:0'
|
||||
tzoh, tzom = tzo.split(':')
|
||||
utc_time = qp.getTag('utc').getData()
|
||||
ZERO = datetime.timedelta(0)
|
||||
class UTC(datetime.tzinfo):
|
||||
def utcoffset(self, dt):
|
||||
return ZERO
|
||||
def tzname(self, dt):
|
||||
return "UTC"
|
||||
def dst(self, dt):
|
||||
return ZERO
|
||||
|
||||
class contact_tz(datetime.tzinfo):
|
||||
def utcoffset(self, dt):
|
||||
return datetime.timedelta(hours=int(tzoh), minutes=int(tzom))
|
||||
def tzname(self, dt):
|
||||
return "remote timezone"
|
||||
def dst(self, dt):
|
||||
return ZERO
|
||||
|
||||
t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ')
|
||||
t = t.replace(tzinfo=UTC())
|
||||
|
||||
time_info = t.astimezone(contact_tz()).strftime('%c')
|
||||
id_ = iq_obj.getID()
|
||||
if id_ in self.groupchat_jids:
|
||||
who = self.groupchat_jids[id_]
|
||||
del self.groupchat_jids[id_]
|
||||
else:
|
||||
who = helpers.get_full_jid_from_iq(iq_obj)
|
||||
jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who)
|
||||
if id_ in self.entity_time_ids:
|
||||
self.entity_time_ids.remove(id_)
|
||||
self.dispatch('ENTITY_TIME', (jid_stripped, resource, time_info))
|
||||
|
||||
def _gMailNewMailCB(self, con, gm):
|
||||
'''Called when we get notified of new mail messages in gmail account'''
|
||||
if not self.connection or self.connected < 2:
|
||||
|
@ -2543,6 +2591,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
|
|||
common.xmpp.NS_LAST)
|
||||
con.RegisterHandler('iq', self._VersionResultCB, 'result',
|
||||
common.xmpp.NS_VERSION)
|
||||
con.RegisterHandler('iq', self._TimeRevisedResultCB, 'result',
|
||||
common.xmpp.NS_TIME_REVISED)
|
||||
con.RegisterHandler('iq', self._MucOwnerCB, 'result',
|
||||
common.xmpp.NS_MUC_OWNER)
|
||||
con.RegisterHandler('iq', self._MucAdminCB, 'result',
|
||||
|
|
13
src/gajim.py
13
src/gajim.py
|
@ -1178,6 +1178,18 @@ class Interface:
|
|||
if self.remote_ctrl:
|
||||
self.remote_ctrl.raise_signal('OsInfo', (account, array))
|
||||
|
||||
def handle_event_entity_time(self, account, array):
|
||||
#'ENTITY_TIME' (account, (jid, resource, time_info))
|
||||
win = None
|
||||
if array[0] in self.instances[account]['infos']:
|
||||
win = self.instances[account]['infos'][array[0]]
|
||||
elif array[0] + '/' + array[1] in self.instances[account]['infos']:
|
||||
win = self.instances[account]['infos'][array[0] + '/' + array[1]]
|
||||
if win:
|
||||
win.set_entity_time(array[1], array[2])
|
||||
if self.remote_ctrl:
|
||||
self.remote_ctrl.raise_signal('EntityTime', (account, array))
|
||||
|
||||
def handle_event_gc_notify(self, account, array):
|
||||
#'GC_NOTIFY' (account, (room_jid, show, status, nick,
|
||||
# role, affiliation, jid, reason, actor, statusCode, newNick, avatar_sha))
|
||||
|
@ -2163,6 +2175,7 @@ class Interface:
|
|||
'VCARD': self.handle_event_vcard,
|
||||
'LAST_STATUS_TIME': self.handle_event_last_status_time,
|
||||
'OS_INFO': self.handle_event_os_info,
|
||||
'ENTITY_TIME': self.handle_event_entity_time,
|
||||
'GC_NOTIFY': self.handle_event_gc_notify,
|
||||
'GC_MSG': self.handle_event_gc_msg,
|
||||
'GC_SUBJECT': self.handle_event_gc_subject,
|
||||
|
|
|
@ -171,6 +171,10 @@ class SignalObject(dbus.service.Object):
|
|||
def OsInfo(self, account_and_array):
|
||||
pass
|
||||
|
||||
@dbus.service.signal(INTERFACE, signature='av')
|
||||
def EntityTime(self, account_and_array):
|
||||
pass
|
||||
|
||||
@dbus.service.signal(INTERFACE, signature='av')
|
||||
def GCPresence(self, account_and_array):
|
||||
pass
|
||||
|
|
44
src/vcard.py
44
src/vcard.py
|
@ -112,6 +112,7 @@ class VcardWindow:
|
|||
self.avatar_encoded = None
|
||||
self.vcard_arrived = False
|
||||
self.os_info_arrived = False
|
||||
self.entity_time_arrived = False
|
||||
self.update_progressbar_timeout_id = gobject.timeout_add(100,
|
||||
self.update_progressbar)
|
||||
|
||||
|
@ -215,7 +216,7 @@ class VcardWindow:
|
|||
|
||||
def test_remove_progressbar(self):
|
||||
if self.update_progressbar_timeout_id is not None and \
|
||||
self.vcard_arrived and self.os_info_arrived:
|
||||
self.vcard_arrived and self.os_info_arrived and self.entity_time_arrived:
|
||||
gobject.source_remove(self.update_progressbar_timeout_id)
|
||||
self.progressbar.hide()
|
||||
self.update_progressbar_timeout_id = None
|
||||
|
@ -250,6 +251,26 @@ class VcardWindow:
|
|||
self.os_info_arrived = True
|
||||
self.test_remove_progressbar()
|
||||
|
||||
def set_entity_time(self, resource, time_info):
|
||||
if self.xml.get_widget('information_notebook').get_n_pages() < 5:
|
||||
return
|
||||
i = 0
|
||||
time_s = ''
|
||||
while i in self.time_info:
|
||||
if not self.time_info[i]['resource'] or \
|
||||
self.time_info[i]['resource'] == resource:
|
||||
self.time_info[i]['time'] = time_info
|
||||
if i > 0:
|
||||
time_s += '\n'
|
||||
time_s += self.time_info[i]['time']
|
||||
i += 1
|
||||
|
||||
if time_s == '':
|
||||
time_s = Q_('?Time:Unknown')
|
||||
self.xml.get_widget('time_label').set_text(time_s)
|
||||
self.entity_time_arrived = True
|
||||
self.test_remove_progressbar()
|
||||
|
||||
def fill_status_label(self):
|
||||
if self.xml.get_widget('information_notebook').get_n_pages() < 5:
|
||||
return
|
||||
|
@ -364,8 +385,25 @@ class VcardWindow:
|
|||
else:
|
||||
gobject.idle_add(gajim.connections[self.account].request_os_info,
|
||||
self.contact.jid, self.contact.resource)
|
||||
|
||||
# do not wait for entity_time if contact is not connected or has error
|
||||
# additional check for observer is needed, as show is offline for him
|
||||
if self.contact.show in ('offline', 'error')\
|
||||
and not self.contact.is_observer():
|
||||
self.entity_time_arrived = True
|
||||
else: # Request entity time if contact is connected
|
||||
if self.gc_contact:
|
||||
j, r = gajim.get_room_and_nick_from_fjid(self.real_jid)
|
||||
gobject.idle_add(gajim.connections[self.account].\
|
||||
request_entity_time, j, r, self.contact.jid)
|
||||
else:
|
||||
gobject.idle_add(gajim.connections[self.account].\
|
||||
request_entity_time, self.contact.jid, self.contact.resource)
|
||||
|
||||
|
||||
self.os_info = {0: {'resource': self.contact.resource, 'client': '',
|
||||
'os': ''}}
|
||||
self.time_info = {0: {'resource': self.contact.resource, 'time': ''}}
|
||||
i = 1
|
||||
contact_list = gajim.contacts.get_contacts(self.account, self.contact.jid)
|
||||
if contact_list:
|
||||
|
@ -379,11 +417,15 @@ class VcardWindow:
|
|||
gobject.idle_add(
|
||||
gajim.connections[self.account].request_os_info, c.jid,
|
||||
c.resource)
|
||||
gobject.idle_add(gajim.connections[self.account].\
|
||||
request_entity_time, c.jid, c.resource)
|
||||
gajim.connections[self.account].request_last_status_time(c.jid,
|
||||
c.resource)
|
||||
self.os_info[i] = {'resource': c.resource, 'client': '',
|
||||
'os': ''}
|
||||
self.time_info[i] = {'resource': c.resource, 'time': ''}
|
||||
i += 1
|
||||
|
||||
self.xml.get_widget('resource_prio_label').set_text(resources)
|
||||
resource_prio_label_eventbox = self.xml.get_widget(
|
||||
'resource_prio_label_eventbox')
|
||||
|
|
Loading…
Reference in New Issue