Merge pull request #357 from carpedm20/fixed-listening

Fixed listening
This commit is contained in:
Mads Marquart
2018-12-09 19:23:33 +01:00
committed by GitHub

View File

@@ -1956,48 +1956,32 @@ class Client(object):
LISTEN METHODS LISTEN METHODS
""" """
def _ping(self, sticky, pool): def _ping(self):
data = { data = {
'channel': self.user_channel, 'channel': self.user_channel,
'clientid': self.client_id, 'clientid': self.client_id,
'partition': -2, 'partition': -2,
'cap': 0, 'cap': 0,
'uid': self.uid, 'uid': self.uid,
'sticky_token': sticky, 'sticky_token': self.sticky,
'sticky_pool': pool, 'sticky_pool': self.pool,
'viewer_uid': self.uid, 'viewer_uid': self.uid,
'state': 'active', 'state': 'active',
} }
self._get(self.req_url.PING, data, fix_request=True, as_json=False) self._get(self.req_url.PING, data, fix_request=True, as_json=False)
def _fetchSticky(self): def _pullMessage(self, markAlive=True):
"""Call pull api to get sticky and pool parameter, newer api needs these parameters to work"""
data = {
"msgs_recv": 0,
"channel": self.user_channel,
"clientid": self.client_id
}
j = self._get(self.req_url.STICKY, data, fix_request=True, as_json=True)
if j.get('lb_info') is None:
raise FBchatException('Missing lb_info: {}'.format(j))
return j['lb_info']['sticky'], j['lb_info']['pool']
def _pullMessage(self, sticky, pool, markAlive=True):
"""Call pull api with seq value to get message data.""" """Call pull api with seq value to get message data."""
data = { data = {
"msgs_recv": 0, "msgs_recv": 0,
"sticky_token": sticky, "sticky_token": self.sticky,
"sticky_pool": pool, "sticky_pool": self.pool,
"clientid": self.client_id, "clientid": self.client_id,
'state': 'active' if markAlive else 'offline', 'state': 'active' if markAlive else 'offline',
} }
j = self._get(ReqUrl.STICKY, data, fix_request=True, as_json=True) j = self._get(self.req_url.STICKY, data, fix_request=True, as_json=True)
self.seq = j.get('seq', '0') self.seq = j.get('seq', '0')
return j return j
@@ -2005,6 +1989,14 @@ class Client(object):
def _parseMessage(self, content): def _parseMessage(self, content):
"""Get message and author name from content. May contain multiple messages in the content.""" """Get message and author name from content. May contain multiple messages in the content."""
if 'lb_info' in content:
self.sticky = content['lb_info']['sticky']
self.pool = content['lb_info']['pool']
if 'batches' in content:
for batch in content['batches']:
self._parseMessage(batch)
if 'ms' not in content: return if 'ms' not in content: return
for m in content["ms"]: for m in content["ms"]:
@@ -2350,7 +2342,6 @@ class Client(object):
:raises: FBchatException if request failed :raises: FBchatException if request failed
""" """
self.listening = True self.listening = True
self.sticky, self.pool = self._fetchSticky()
def doOneListen(self, markAlive=True): def doOneListen(self, markAlive=True):
""" """
@@ -2364,8 +2355,8 @@ class Client(object):
""" """
try: try:
if markAlive: if markAlive:
self._ping(self.sticky, self.pool) self._ping()
content = self._pullMessage(self.sticky, self.pool, markAlive) content = self._pullMessage(markAlive)
if content: if content:
self._parseMessage(content) self._parseMessage(content)
except KeyboardInterrupt: except KeyboardInterrupt: