summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@HansenPartnership.com>2017-08-17 12:31:00 -0700
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2017-08-20 13:52:40 +0100
commit79740f1156f29a8940b93360242877fb7c828ad7 (patch)
tree381100ec481182f0456e8a2ada416ba8e2a87130
parentf3cbf2467e477dfbf49fc427985497426ba3a5bd (diff)
downloadhangouts-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.py20
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