diff options
author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2017-08-17 12:31:00 -0700 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2017-08-20 13:52:40 +0100 |
commit | 79740f1156f29a8940b93360242877fb7c828ad7 (patch) | |
tree | 381100ec481182f0456e8a2ada416ba8e2a87130 | |
parent | f3cbf2467e477dfbf49fc427985497426ba3a5bd (diff) | |
download | hangouts-xmpp-gateway-79740f1156f29a8940b93360242877fb7c828ad7.tar.gz |
hangupsthread: use hour timer to re-poll for presence
Google seems to forget to send us presence after a while, so if
nothing is heard in presence terms for an hour, repoll all the known
ids to retrigger google sending us presence notifications.
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r-- | hangupsthread.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/hangupsthread.py b/hangupsthread.py index 6708a36..ba78d55 100644 --- a/hangupsthread.py +++ b/hangupsthread.py @@ -21,6 +21,8 @@ class HangupsThread(threading.Thread): self.xmpp = xmpp self.remote = remote + self.presence_timer = None # filled in on first incoming presence + self.presence_timer_lock = threading.Lock() super().__init__(name='HangupsThread-{}'.format(remote)) @@ -39,6 +41,8 @@ class HangupsThread(threading.Thread): self.client.on_connect.fire() self.loop.run_until_complete(self.client.connect()) logging.info('Hangups thread stopped for {}.'.format(self.remote)) + if self.presence_timer is not None: + self.presence_timer.cancel() def _stop(self): yield from self.client.disconnect() @@ -49,7 +53,23 @@ class HangupsThread(threading.Thread): if self.loop is not None: self.loop.call_soon_threadsafe(asyncio.async, self._stop()) + def _presence_timer_run(self): + # if we haven't heard from google for a while, re-query all + # the presence states just to remind it that we exist + # without this, presence seems to get forgotten eventually + # by the server + logging.info('Presence Timer fired, requerying presence for {}'.format(self.remote)) + self.loop.call_soon_threadsafe(asyncio.async, self._on_connect_common()) + + def presence_timer_reset(self): + with self.presence_timer_lock: + if self.presence_timer is not None: + self.presence_timer.cancel() + self.presence_timer = threading.Timer(3600, self._presence_timer_run) + self.presence_timer.start() + def incoming_presence(self, user, pres): + self.presence_timer_reset() mood_message = '' for segment in pres.mood_message.mood_content.segment: mood_message += segment.text |