Philipp Hörist pushed to branch master at gajim / python-nbxmpp
Commits:
b655a690 by lovetox at 2021-03-19T17:57:11+01:00
Add EntityTime(XEP-0202) module
- - - - -
4 changed files:
- nbxmpp/dispatcher.py
- nbxmpp/modules/date_and_time.py
- + nbxmpp/modules/entity_time.py
- nbxmpp/namespaces.py
Changes:
=====================================
nbxmpp/dispatcher.py
=====================================
@@ -83,6 +83,7 @@ from nbxmpp.modules.ping import Ping
from nbxmpp.modules.delimiter import Delimiter
from nbxmpp.modules.roster import Roster
from nbxmpp.modules.last_activity import LastActivity
+from nbxmpp.modules.entity_time import EntityTime
from nbxmpp.modules.misc import unwrap_carbon
from nbxmpp.modules.misc import unwrap_mam
from nbxmpp.util import get_properties_struct
@@ -195,6 +196,7 @@ class StanzaDispatcher(Observable):
self._modules['Delimiter'] = Delimiter(self._client)
self._modules['Roster'] = Roster(self._client)
self._modules['LastActivity'] = LastActivity(self._client)
+ self._modules['EntityTime'] = EntityTime(self._client)
for instance in self._modules.values():
for handler in instance.handlers:
=====================================
nbxmpp/modules/date_and_time.py
=====================================
@@ -195,3 +195,12 @@ def parse_datetime(timestring, check_utc=False,
# convert=None
return date_time
return None
+
+
+def get_local_time():
+ formated_time = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())
+ isdst = time.localtime().tm_isdst
+ zone = -(time.timezone, time.altzone)[isdst] / 60.0
+ zone = (zone / 60, abs(zone % 60))
+ tzo = '%+03d:%02d' % zone
+ return formated_time, tzo
=====================================
nbxmpp/modules/entity_time.py
=====================================
@@ -0,0 +1,106 @@
+# Copyright (C) 2021 Philipp Hörist <philipp AT hoerist.com>
+#
+# This file is part of nbxmpp.
+#
+# This program 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; either version 3
+# of the License, or (at your option) any later version.
+#
+# This program 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 this program; If not, see <http://www.gnu.org/licenses/>.
+
+from nbxmpp.protocol import Iq
+from nbxmpp.protocol import NodeProcessed
+from nbxmpp.namespaces import Namespace
+from nbxmpp.task import iq_request_task
+from nbxmpp.structs import StanzaHandler
+from nbxmpp.errors import MalformedStanzaError
+from nbxmpp.errors import StanzaError
+from nbxmpp.modules.base import BaseModule
+
+from nbxmpp.modules.date_and_time import parse_datetime
+from nbxmpp.modules.date_and_time import create_tzinfo
+from nbxmpp.modules.date_and_time import get_local_time
+
+
+class EntityTime(BaseModule):
+ def __init__(self, client):
+ BaseModule.__init__(self, client)
+
+ self._client = client
+ self.handlers = [
+ StanzaHandler(name='iq',
+ callback=self._answer_request,
+ priority=30,
+ typ='get',
+ ns=Namespace.TIME),
+ ]
+
+ self._enabled = False
+
+ def disable(self):
+ self._enabled = False
+
+ def enable(self):
+ self._enabled = True
+
+ @iq_request_task
+ def request_entity_time(self, jid):
+ _task = yield
+
+ response = yield _make_request(jid)
+ if response.isError():
+ raise StanzaError(response)
+
+ yield _parse_response(response)
+
+ def _answer_request(self, _con, stanza, _properties):
+ self._log.info('Request received from %s', stanza.getFrom())
+ if not self._enabled:
+ return
+
+ time, tzo = get_local_time()
+ iq = stanza.buildSimpleReply('result')
+ time_node = iq.addChild('time', namespace=Namespace.TIME)
+ time_node.setTagData('utc', time)
+ time_node.setTagData('tzo', tzo)
+ self._log.info('Send time: %s %s', time, tzo)
+ self._client.send_stanza(iq)
+ raise NodeProcessed
+
+
+def _make_request(jid):
+ iq = Iq('get', to=jid)
+ iq.addChild('time', namespace=Namespace.TIME)
+ return iq
+
+
+def _parse_response(response):
+ time_ = response.getTag('time')
+ if not time_:
+ raise MalformedStanzaError('time node missing', response)
+
+ tzo = time_.getTagData('tzo')
+ if not tzo:
+ raise MalformedStanzaError('tzo node or data missing', response)
+
+ remote_tz = create_tzinfo(tz_string=tzo)
+ if remote_tz is None:
+ raise MalformedStanzaError('invalid tzo data', response)
+
+ utc_time = time_.getTagData('utc')
+ if not utc_time:
+ raise MalformedStanzaError('utc node or data missing', response)
+
+ date_time = parse_datetime(utc_time, check_utc=True)
+ if date_time is None:
+ raise MalformedStanzaError('invalid timezone definition', response)
+
+ date_time = date_time.astimezone(remote_tz)
+ return date_time.strftime('%c %Z')
=====================================
nbxmpp/namespaces.py
=====================================
@@ -155,6 +155,7 @@ class _Namespaces:
STREAM_MGMT: str = 'urn:xmpp:sm:3'
STYLING: str = 'urn:xmpp:styling:0'
TIME_REVISED: str = 'urn:xmpp:time'
+ TIME: str = 'urn:xmpp:time'
TLS: str = 'urn:ietf:params:xml:ns:xmpp-tls'
TUNE: str = 'http://jabber.org/protocol/tune'
URL_DATA: str = 'http://jabber.org/protocol/url-data'
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/-/commit/b655a69053ab962d014bf524…
--
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/-/commit/b655a69053ab962d014bf524…
You're receiving this email because of your account on dev.gajim.org.
Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits:
c10f473f by lovetox at 2021-03-19T14:10:29+01:00
Get correct path
- - - - -
1 changed file:
- gajim/gtk/roster.py
Changes:
=====================================
gajim/gtk/roster.py
=====================================
@@ -268,6 +268,7 @@ def _on_remove_contact(self, _action, param):
app.window.remove_contact(self._account, param.get_string())
def _on_roster_row_activated(self, _treeview, path, _column):
+ path = self._modelfilter.convert_path_to_child_path(path)
iter_ = self._store.get_iter(path)
if self._store.iter_parent(iter_) is None:
# This is a group row
@@ -286,6 +287,7 @@ def _on_roster_button_press_event(self, treeview, event):
return
path, _, _, _ = pos
+ path = self._modelfilter.convert_path_to_child_path(path)
iter_ = self._store.get_iter(path)
if self._store.iter_parent(iter_) is None:
# Group row
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/c10f473ff146c5027476795376a51a7f…
--
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/c10f473ff146c5027476795376a51a7f…
You're receiving this email because of your account on dev.gajim.org.
Philipp Hörist pushed to branch master at gajim / gajim
Commits:
acc254fe by lovetox at 2021-03-18T21:31:10+01:00
Blocking: Convert JID to string
- - - - -
1 changed file:
- gajim/gtk/blocking.py
Changes:
=====================================
gajim/gtk/blocking.py
=====================================
@@ -76,7 +76,7 @@ def _on_blocking_list_received(self, task):
self._prev_blocked_jids = set(blocking_list)
self._ui.blocking_store.clear()
for item in blocking_list:
- self._ui.blocking_store.append((item,))
+ self._ui.blocking_store.append((str(item),))
self._set_grid_state(True)
self._disable_spinner()
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/acc254fe367cee2f15f1bcea55e9fce9…
--
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/acc254fe367cee2f15f1bcea55e9fce9…
You're receiving this email because of your account on dev.gajim.org.
Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits:
bc3e394a by lovetox at 2021-03-17T22:16:24+01:00
Simplify code
- - - - -
1 changed file:
- gajim/gtk/groupchat_invite.py
Changes:
=====================================
gajim/gtk/groupchat_invite.py
=====================================
@@ -80,17 +80,16 @@ def _add_contacts(self):
for account, _label in self._accounts:
self.new_contact_rows[account] = None
client = app.get_client(account)
- for jid, _data in client.get_module('Roster').iter():
- contact = client.get_module('Contacts').get_contact(jid)
+ for contact in client.get_module('Roster').iter_contacts():
# Exclude group chats
if contact.is_groupchat:
continue
# Exclude our own jids
- if jid in our_jids:
+ if contact.jid in our_jids:
continue
- row = ContactRow(account, contact, jid,
+ row = ContactRow(account, contact, contact.jid,
contact.name, show_account)
self._ui.contacts_listbox.add(row)
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/bc3e394a0921ab05faf7f909724945f1…
--
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/bc3e394a0921ab05faf7f909724945f1…
You're receiving this email because of your account on dev.gajim.org.