Reconnects the ongpoll chat server after a ReadTimeout or ConnectionError

This commit is contained in:
Manuel Cortez 2018-12-12 13:41:57 -06:00
parent ed624f5bf1
commit 0144a5787a
2 changed files with 33 additions and 10 deletions

View File

@ -2,6 +2,8 @@
import threading import threading
from vk_api.longpoll import VkLongPoll, VkEventType from vk_api.longpoll import VkLongPoll, VkEventType
from pubsub import pub from pubsub import pub
from requests.exceptions import ReadTimeout
from logging import getLogger from logging import getLogger
log = getLogger("controller.longpolThread") log = getLogger("controller.longpolThread")
@ -13,10 +15,13 @@ class worker(threading.Thread):
self.longpoll = VkLongPoll(self.session.vk.session_object) self.longpoll = VkLongPoll(self.session.vk.session_object)
def run(self): def run(self):
for event in self.longpoll.listen(): try:
if event.type == VkEventType.MESSAGE_NEW: for event in self.longpoll.listen():
pub.sendMessage("order-sent-message", obj=event) if event.type == VkEventType.MESSAGE_NEW:
elif event.type == VkEventType.USER_ONLINE: pub.sendMessage("order-sent-message", obj=event)
pub.sendMessage("user-online", event=event) elif event.type == VkEventType.USER_ONLINE:
elif event.type == VkEventType.USER_OFFLINE: pub.sendMessage("user-online", event=event)
pub.sendMessage("user-offline", event=event) elif event.type == VkEventType.USER_OFFLINE:
pub.sendMessage("user-offline", event=event)
except ReadTimeout:
pub.sendMessage("longpoll-read-timeout")

View File

@ -15,6 +15,7 @@ import output
import longpollthread import longpollthread
import selector import selector
from vk_api.exceptions import LoginRequired, VkApiError from vk_api.exceptions import LoginRequired, VkApiError
from requests.exceptions import ConnectionError
from pubsub import pub from pubsub import pub
from mysc.repeating_timer import RepeatingTimer from mysc.repeating_timer import RepeatingTimer
from mysc.thread_utils import call_threaded from mysc.thread_utils import call_threaded
@ -139,6 +140,7 @@ class Controller(object):
pub.subscribe(self.user_online, "user-online") pub.subscribe(self.user_online, "user-online")
pub.subscribe(self.user_offline, "user-offline") pub.subscribe(self.user_offline, "user-offline")
pub.subscribe(self.notify, "notify") pub.subscribe(self.notify, "notify")
pub.subscribe(self.handle_longpoll_read_timeout, "longpoll-read-timeout")
widgetUtils.connect_event(self.window, widgetUtils.CLOSE_EVENT, self.exit) widgetUtils.connect_event(self.window, widgetUtils.CLOSE_EVENT, self.exit)
widgetUtils.connect_event(self.window, widgetUtils.MENU, self.update_buffer, menuitem=self.window.update_buffer) widgetUtils.connect_event(self.window, widgetUtils.MENU, self.update_buffer, menuitem=self.window.update_buffer)
widgetUtils.connect_event(self.window, widgetUtils.MENU, self.check_for_updates, menuitem=self.window.check_for_updates) widgetUtils.connect_event(self.window, widgetUtils.MENU, self.check_for_updates, menuitem=self.window.check_for_updates)
@ -193,8 +195,7 @@ class Controller(object):
self.window.change_status(_(u"Loading items for {0}").format(i.name,)) self.window.change_status(_(u"Loading items for {0}").format(i.name,))
i.get_items() i.get_items()
self.window.change_status(_(u"Ready")) self.window.change_status(_(u"Ready"))
self.longpoll = longpollthread.worker(self.session) self.create_longpoll_thread()
self.longpoll.start()
self.status_setter = RepeatingTimer(900, self.set_online) self.status_setter = RepeatingTimer(900, self.set_online)
self.status_setter.start() self.status_setter.start()
self.set_online() self.set_online()
@ -202,6 +203,15 @@ class Controller(object):
wx.CallAfter(self.get_audio_albums, self.session.user_id) wx.CallAfter(self.get_audio_albums, self.session.user_id)
wx.CallAfter(self.get_video_albums, self.session.user_id) wx.CallAfter(self.get_video_albums, self.session.user_id)
def create_longpoll_thread(self, notify=False):
try:
self.longpoll = longpollthread.worker(self.session)
self.longpoll.start()
if notify:
self.notify(message=_(u"Chat server reconnected"))
except ConnectionError:
pub.sendMessage("longpoll-read-timeout")
def in_post(self, buffer): def in_post(self, buffer):
buffer = self.search(buffer) buffer = self.search(buffer)
buffer.get_items() buffer.get_items()
@ -628,3 +638,11 @@ class Controller(object):
self.session.soundplayer.play(sound) self.session.soundplayer.play(sound)
if message != "": if message != "":
output.speak(message) output.speak(message)
def handle_longpoll_read_timeout(self):
if hasattr(self, "longpoll"):
self.notify(message=_(u"Chat disconnected. Trying to connect in 60 seconds"))
time.sleep(60)
if hasattr(self, "longpoll"):
del self.longpoll
self.create_longpoll_thread(notify=True)