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
|
to_whom_jid = jid
|
||||||
if resource:
|
if resource:
|
||||||
to_whom_jid += '/' + 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)
|
common.xmpp.NS_VERSION)
|
||||||
id_ = self.connection.getAnID()
|
id_ = self.connection.getAnID()
|
||||||
iq.setID(id_)
|
iq.setID(id_)
|
||||||
|
@ -1490,6 +1490,27 @@ class Connection(ConnectionHandlers):
|
||||||
self.version_ids.append(id_)
|
self.version_ids.append(id_)
|
||||||
self.connection.send(iq)
|
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):
|
def get_settings(self):
|
||||||
''' Get Gajim settings as described in XEP 0049 '''
|
''' Get Gajim settings as described in XEP 0049 '''
|
||||||
if not self.connection:
|
if not self.connection:
|
||||||
|
|
|
@ -38,6 +38,7 @@ import hashlib
|
||||||
from time import (altzone, daylight, gmtime, localtime, mktime, strftime,
|
from time import (altzone, daylight, gmtime, localtime, mktime, strftime,
|
||||||
time as time_time, timezone, tzname)
|
time as time_time, timezone, tzname)
|
||||||
from calendar import timegm
|
from calendar import timegm
|
||||||
|
import datetime
|
||||||
|
|
||||||
import socks5
|
import socks5
|
||||||
import common.xmpp
|
import common.xmpp
|
||||||
|
@ -1426,6 +1427,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
|
||||||
self.last_ids = []
|
self.last_ids = []
|
||||||
# IDs of jabber:iq:version requests
|
# IDs of jabber:iq:version requests
|
||||||
self.version_ids = []
|
self.version_ids = []
|
||||||
|
# IDs of urn:xmpp:time requests
|
||||||
|
self.entity_time_ids = []
|
||||||
# ID of urn:xmpp:ping requests
|
# ID of urn:xmpp:ping requests
|
||||||
self.awaiting_xmpp_ping_id = None
|
self.awaiting_xmpp_ping_id = None
|
||||||
self.continue_connect_info = 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.dispatch('LAST_STATUS_TIME', (jid_stripped, resource, -1, ''))
|
||||||
self.last_ids.remove(id_)
|
self.last_ids.remove(id_)
|
||||||
return
|
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:
|
if id_ == self.awaiting_xmpp_ping_id:
|
||||||
self.awaiting_xmpp_ping_id = None
|
self.awaiting_xmpp_ping_id = None
|
||||||
errmsg = iq_obj.getErrorMsg()
|
errmsg = iq_obj.getErrorMsg()
|
||||||
|
@ -1639,6 +1646,47 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
|
||||||
self.connection.send(iq_obj)
|
self.connection.send(iq_obj)
|
||||||
raise common.xmpp.NodeProcessed
|
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):
|
def _gMailNewMailCB(self, con, gm):
|
||||||
'''Called when we get notified of new mail messages in gmail account'''
|
'''Called when we get notified of new mail messages in gmail account'''
|
||||||
if not self.connection or self.connected < 2:
|
if not self.connection or self.connected < 2:
|
||||||
|
@ -2543,6 +2591,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco,
|
||||||
common.xmpp.NS_LAST)
|
common.xmpp.NS_LAST)
|
||||||
con.RegisterHandler('iq', self._VersionResultCB, 'result',
|
con.RegisterHandler('iq', self._VersionResultCB, 'result',
|
||||||
common.xmpp.NS_VERSION)
|
common.xmpp.NS_VERSION)
|
||||||
|
con.RegisterHandler('iq', self._TimeRevisedResultCB, 'result',
|
||||||
|
common.xmpp.NS_TIME_REVISED)
|
||||||
con.RegisterHandler('iq', self._MucOwnerCB, 'result',
|
con.RegisterHandler('iq', self._MucOwnerCB, 'result',
|
||||||
common.xmpp.NS_MUC_OWNER)
|
common.xmpp.NS_MUC_OWNER)
|
||||||
con.RegisterHandler('iq', self._MucAdminCB, 'result',
|
con.RegisterHandler('iq', self._MucAdminCB, 'result',
|
||||||
|
|
13
src/gajim.py
13
src/gajim.py
|
@ -1178,6 +1178,18 @@ class Interface:
|
||||||
if self.remote_ctrl:
|
if self.remote_ctrl:
|
||||||
self.remote_ctrl.raise_signal('OsInfo', (account, array))
|
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):
|
def handle_event_gc_notify(self, account, array):
|
||||||
#'GC_NOTIFY' (account, (room_jid, show, status, nick,
|
#'GC_NOTIFY' (account, (room_jid, show, status, nick,
|
||||||
# role, affiliation, jid, reason, actor, statusCode, newNick, avatar_sha))
|
# role, affiliation, jid, reason, actor, statusCode, newNick, avatar_sha))
|
||||||
|
@ -2163,6 +2175,7 @@ class Interface:
|
||||||
'VCARD': self.handle_event_vcard,
|
'VCARD': self.handle_event_vcard,
|
||||||
'LAST_STATUS_TIME': self.handle_event_last_status_time,
|
'LAST_STATUS_TIME': self.handle_event_last_status_time,
|
||||||
'OS_INFO': self.handle_event_os_info,
|
'OS_INFO': self.handle_event_os_info,
|
||||||
|
'ENTITY_TIME': self.handle_event_entity_time,
|
||||||
'GC_NOTIFY': self.handle_event_gc_notify,
|
'GC_NOTIFY': self.handle_event_gc_notify,
|
||||||
'GC_MSG': self.handle_event_gc_msg,
|
'GC_MSG': self.handle_event_gc_msg,
|
||||||
'GC_SUBJECT': self.handle_event_gc_subject,
|
'GC_SUBJECT': self.handle_event_gc_subject,
|
||||||
|
|
|
@ -171,6 +171,10 @@ class SignalObject(dbus.service.Object):
|
||||||
def OsInfo(self, account_and_array):
|
def OsInfo(self, account_and_array):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@dbus.service.signal(INTERFACE, signature='av')
|
||||||
|
def EntityTime(self, account_and_array):
|
||||||
|
pass
|
||||||
|
|
||||||
@dbus.service.signal(INTERFACE, signature='av')
|
@dbus.service.signal(INTERFACE, signature='av')
|
||||||
def GCPresence(self, account_and_array):
|
def GCPresence(self, account_and_array):
|
||||||
pass
|
pass
|
||||||
|
|
44
src/vcard.py
44
src/vcard.py
|
@ -112,6 +112,7 @@ class VcardWindow:
|
||||||
self.avatar_encoded = None
|
self.avatar_encoded = None
|
||||||
self.vcard_arrived = False
|
self.vcard_arrived = False
|
||||||
self.os_info_arrived = False
|
self.os_info_arrived = False
|
||||||
|
self.entity_time_arrived = False
|
||||||
self.update_progressbar_timeout_id = gobject.timeout_add(100,
|
self.update_progressbar_timeout_id = gobject.timeout_add(100,
|
||||||
self.update_progressbar)
|
self.update_progressbar)
|
||||||
|
|
||||||
|
@ -215,7 +216,7 @@ class VcardWindow:
|
||||||
|
|
||||||
def test_remove_progressbar(self):
|
def test_remove_progressbar(self):
|
||||||
if self.update_progressbar_timeout_id is not None and \
|
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)
|
gobject.source_remove(self.update_progressbar_timeout_id)
|
||||||
self.progressbar.hide()
|
self.progressbar.hide()
|
||||||
self.update_progressbar_timeout_id = None
|
self.update_progressbar_timeout_id = None
|
||||||
|
@ -250,6 +251,26 @@ class VcardWindow:
|
||||||
self.os_info_arrived = True
|
self.os_info_arrived = True
|
||||||
self.test_remove_progressbar()
|
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):
|
def fill_status_label(self):
|
||||||
if self.xml.get_widget('information_notebook').get_n_pages() < 5:
|
if self.xml.get_widget('information_notebook').get_n_pages() < 5:
|
||||||
return
|
return
|
||||||
|
@ -364,8 +385,25 @@ class VcardWindow:
|
||||||
else:
|
else:
|
||||||
gobject.idle_add(gajim.connections[self.account].request_os_info,
|
gobject.idle_add(gajim.connections[self.account].request_os_info,
|
||||||
self.contact.jid, self.contact.resource)
|
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': '',
|
self.os_info = {0: {'resource': self.contact.resource, 'client': '',
|
||||||
'os': ''}}
|
'os': ''}}
|
||||||
|
self.time_info = {0: {'resource': self.contact.resource, 'time': ''}}
|
||||||
i = 1
|
i = 1
|
||||||
contact_list = gajim.contacts.get_contacts(self.account, self.contact.jid)
|
contact_list = gajim.contacts.get_contacts(self.account, self.contact.jid)
|
||||||
if contact_list:
|
if contact_list:
|
||||||
|
@ -379,11 +417,15 @@ class VcardWindow:
|
||||||
gobject.idle_add(
|
gobject.idle_add(
|
||||||
gajim.connections[self.account].request_os_info, c.jid,
|
gajim.connections[self.account].request_os_info, c.jid,
|
||||||
c.resource)
|
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,
|
gajim.connections[self.account].request_last_status_time(c.jid,
|
||||||
c.resource)
|
c.resource)
|
||||||
self.os_info[i] = {'resource': c.resource, 'client': '',
|
self.os_info[i] = {'resource': c.resource, 'client': '',
|
||||||
'os': ''}
|
'os': ''}
|
||||||
|
self.time_info[i] = {'resource': c.resource, 'time': ''}
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
self.xml.get_widget('resource_prio_label').set_text(resources)
|
self.xml.get_widget('resource_prio_label').set_text(resources)
|
||||||
resource_prio_label_eventbox = self.xml.get_widget(
|
resource_prio_label_eventbox = self.xml.get_widget(
|
||||||
'resource_prio_label_eventbox')
|
'resource_prio_label_eventbox')
|
||||||
|
|
Loading…
Reference in New Issue