Attempt to speed up the initial buffer loading on socializer
This commit is contained in:
parent
ead54fce3f
commit
64799d2e14
@ -105,12 +105,12 @@ class baseBuffer(object):
|
|||||||
if self.tab.list.get_count() > 0 and num > 0:
|
if self.tab.list.get_count() > 0 and num > 0:
|
||||||
v = [i for i in self.session.db[self.name]["items"][:num]]
|
v = [i for i in self.session.db[self.name]["items"][:num]]
|
||||||
v.reverse()
|
v.reverse()
|
||||||
[self.insert(i, True) for i in v]
|
[wx.CallAfter(self.insert, i, True) for i in v]
|
||||||
else:
|
else:
|
||||||
[self.insert(i) for i in self.session.db[self.name]["items"][:num]]
|
[wx.CallAfter(self.insert, i) for i in self.session.db[self.name]["items"][:num]]
|
||||||
else:
|
else:
|
||||||
if num > 0:
|
if num > 0:
|
||||||
[self.insert(i, False) for i in self.session.db[self.name]["items"][-num:]]
|
[wx.CallAfter(self.insert, i, False) for i in self.session.db[self.name]["items"][-num:]]
|
||||||
return retrieved
|
return retrieved
|
||||||
|
|
||||||
def get_more_items(self):
|
def get_more_items(self):
|
||||||
@ -417,12 +417,12 @@ class feedBuffer(baseBuffer):
|
|||||||
if self.tab.list.get_count() > 0 and num > 0:
|
if self.tab.list.get_count() > 0 and num > 0:
|
||||||
v = [i for i in self.session.db[self.name]["items"][:num]]
|
v = [i for i in self.session.db[self.name]["items"][:num]]
|
||||||
v.reverse()
|
v.reverse()
|
||||||
[self.insert(i, True) for i in v]
|
[wx.CallAfter(self.insert, i, True) for i in v]
|
||||||
else:
|
else:
|
||||||
[self.insert(i) for i in self.session.db[self.name]["items"][:num]]
|
[wx.CallAfter(self.insert, i) for i in self.session.db[self.name]["items"][:num]]
|
||||||
else:
|
else:
|
||||||
if num > 0:
|
if num > 0:
|
||||||
[self.insert(i, False) for i in self.session.db[self.name]["items"][-num:]]
|
[wx.CallAfter(self.insert, i, False) for i in self.session.db[self.name]["items"][-num:]]
|
||||||
return retrieved
|
return retrieved
|
||||||
|
|
||||||
def remove_buffer(self, mandatory=False):
|
def remove_buffer(self, mandatory=False):
|
||||||
@ -1519,9 +1519,9 @@ class requestsBuffer(peopleBuffer):
|
|||||||
if self.tab.list.get_count() > 0 and num > 0:
|
if self.tab.list.get_count() > 0 and num > 0:
|
||||||
v = [i for i in self.session.db[self.name]["items"][:num]]
|
v = [i for i in self.session.db[self.name]["items"][:num]]
|
||||||
v.reverse()
|
v.reverse()
|
||||||
[self.insert(i, True) for i in v]
|
[wx.CallAfter(self.insert, i, True) for i in v]
|
||||||
else:
|
else:
|
||||||
[self.insert(i) for i in self.session.db[self.name]["items"][:num]]
|
[wx.CallAfter(self.insert, i) for i in self.session.db[self.name]["items"][:num]]
|
||||||
return retrieved
|
return retrieved
|
||||||
|
|
||||||
def accept_friendship(self, *args, **kwargs):
|
def accept_friendship(self, *args, **kwargs):
|
||||||
|
@ -3,6 +3,7 @@ import time
|
|||||||
import os
|
import os
|
||||||
import webbrowser
|
import webbrowser
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import functools
|
||||||
import logging
|
import logging
|
||||||
import wx
|
import wx
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
@ -13,6 +14,7 @@ import views
|
|||||||
import config
|
import config
|
||||||
import paths
|
import paths
|
||||||
import win32gui
|
import win32gui
|
||||||
|
from concurrent import futures
|
||||||
from vk_api.exceptions import LoginRequired, VkApiError
|
from vk_api.exceptions import LoginRequired, VkApiError
|
||||||
from requests.exceptions import ConnectionError
|
from requests.exceptions import ConnectionError
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
@ -33,6 +35,30 @@ from . import selector
|
|||||||
|
|
||||||
log = logging.getLogger("controller.main")
|
log = logging.getLogger("controller.main")
|
||||||
|
|
||||||
|
thread_pool_executor = futures.ThreadPoolExecutor(max_workers=1)
|
||||||
|
|
||||||
|
def wx_call_after(target):
|
||||||
|
@functools.wraps(target)
|
||||||
|
def wrapper(self, *args, **kwargs):
|
||||||
|
args = (self,) + args
|
||||||
|
wx.CallAfter(target, *args, **kwargs)
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
def submit_to_pool_executor(executor):
|
||||||
|
def decorator(target):
|
||||||
|
@functools.wraps(target)
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
result = executor.submit(target, *args, **kwargs)
|
||||||
|
result.add_done_callback(executor_done_call_back)
|
||||||
|
return result
|
||||||
|
return wrapper
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
def executor_done_call_back(future):
|
||||||
|
exception = future.exception()
|
||||||
|
if exception:
|
||||||
|
raise exception
|
||||||
|
|
||||||
class Controller(object):
|
class Controller(object):
|
||||||
|
|
||||||
### utils
|
### utils
|
||||||
@ -144,8 +170,6 @@ class Controller(object):
|
|||||||
log.error("Error in setting offline status for the current user")
|
log.error("Error in setting offline status for the current user")
|
||||||
|
|
||||||
def create_unread_messages(self):
|
def create_unread_messages(self):
|
||||||
if self.session.settings["chat"]["open_unread_conversations"] == False:
|
|
||||||
return
|
|
||||||
try:
|
try:
|
||||||
log.debug("Getting possible unread messages.")
|
log.debug("Getting possible unread messages.")
|
||||||
msgs = self.session.vk.client.messages.getConversations(count=200)
|
msgs = self.session.vk.client.messages.getConversations(count=200)
|
||||||
@ -153,8 +177,7 @@ class Controller(object):
|
|||||||
if ex.code == 6:
|
if ex.code == 6:
|
||||||
log.exception("Something went wrong when getting messages. Waiting a second to retry")
|
log.exception("Something went wrong when getting messages. Waiting a second to retry")
|
||||||
for i in msgs["items"]:
|
for i in msgs["items"]:
|
||||||
call_threaded(self.chat_from_id, i["last_message"]["peer_id"], setfocus=False, unread=False)
|
self.chat_from_id(i["last_message"]["peer_id"], setfocus=False, unread=False)
|
||||||
time.sleep(0.6)
|
|
||||||
|
|
||||||
def get_audio_albums(self, user_id=None, create_buffers=True, force_action=False):
|
def get_audio_albums(self, user_id=None, create_buffers=True, force_action=False):
|
||||||
if self.session.settings["load_at_startup"]["audio_albums"] == False and force_action == False:
|
if self.session.settings["load_at_startup"]["audio_albums"] == False and force_action == False:
|
||||||
@ -168,8 +191,7 @@ class Controller(object):
|
|||||||
self.session.audio_albums = albums
|
self.session.audio_albums = albums
|
||||||
if create_buffers:
|
if create_buffers:
|
||||||
for i in albums:
|
for i in albums:
|
||||||
wx.CallAfter(pub.sendMessage, "create_buffer", buffer_type="audioAlbum", buffer_title=_("Album: {0}").format(i["title"],), parent_tab="audio_albums", loadable=True, kwargs=dict(parent=self.window.tb, name="{0}_audio_album".format(i["id"],), composefunc="render_audio", session=self.session, endpoint="get", parent_endpoint="audio", owner_id=user_id, album_id=i["id"]))
|
pub.sendMessage("create_buffer", buffer_type="audioAlbum", buffer_title=_("Album: {0}").format(i["title"],), parent_tab="audio_albums", loadable=True, kwargs=dict(parent=self.window.tb, name="{0}_audio_album".format(i["id"],), composefunc="render_audio", session=self.session, endpoint="get", parent_endpoint="audio", owner_id=user_id, album_id=i["id"]))
|
||||||
time.sleep(0.6)
|
|
||||||
|
|
||||||
def get_video_albums(self, user_id=None, create_buffers=True, force_action=False):
|
def get_video_albums(self, user_id=None, create_buffers=True, force_action=False):
|
||||||
if self.session.settings["load_at_startup"]["video_albums"] == False and force_action == False:
|
if self.session.settings["load_at_startup"]["video_albums"] == False and force_action == False:
|
||||||
@ -179,8 +201,7 @@ class Controller(object):
|
|||||||
self.session.video_albums = albums["items"]
|
self.session.video_albums = albums["items"]
|
||||||
if create_buffers:
|
if create_buffers:
|
||||||
for i in albums["items"]:
|
for i in albums["items"]:
|
||||||
wx.CallAfter(pub.sendMessage, "create_buffer", buffer_type="videoAlbum", buffer_title=_("Album: {0}").format(i["title"],), parent_tab="video_albums", loadable=True, kwargs=dict(parent=self.window.tb, name="{0}_video_album".format(i["id"],), composefunc="render_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"], user_id=user_id, album_id=i["id"]))
|
pub.sendMessage("create_buffer", buffer_type="videoAlbum", buffer_title=_("Album: {0}").format(i["title"],), parent_tab="video_albums", loadable=True, kwargs=dict(parent=self.window.tb, name="{0}_video_album".format(i["id"],), composefunc="render_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"], user_id=user_id, album_id=i["id"]))
|
||||||
time.sleep(0.15)
|
|
||||||
|
|
||||||
def get_communities(self, user_id=None, create_buffers=True, force_action=False):
|
def get_communities(self, user_id=None, create_buffers=True, force_action=False):
|
||||||
if self.session.settings["vk"]["invited_to_group"] == False:
|
if self.session.settings["vk"]["invited_to_group"] == False:
|
||||||
@ -208,8 +229,8 @@ class Controller(object):
|
|||||||
if create_buffers:
|
if create_buffers:
|
||||||
for i in self.session.groups:
|
for i in self.session.groups:
|
||||||
self.session.db["group_info"][i["id"]*-1] = i
|
self.session.db["group_info"][i["id"]*-1] = i
|
||||||
wx.CallAfter(pub.sendMessage, "create_buffer", buffer_type="communityBuffer", buffer_title=i["name"], parent_tab="communities", loadable=True, get_items=True, kwargs=dict(parent=self.window.tb, name="{0}_community".format(i["id"],), composefunc="render_status", session=self.session, endpoint="get", parent_endpoint="wall", extended=1, count=self.session.settings["buffers"]["count_for_wall_buffers"], owner_id=-1*i["id"]))
|
pub.sendMessage("create_buffer", buffer_type="communityBuffer", buffer_title=i["name"], parent_tab="communities", loadable=True, get_items=True, kwargs=dict(parent=self.window.tb, name="{0}_community".format(i["id"],), composefunc="render_status", session=self.session, endpoint="get", parent_endpoint="wall", extended=1, count=self.session.settings["buffers"]["count_for_wall_buffers"], owner_id=-1*i["id"]))
|
||||||
time.sleep(0.15)
|
|
||||||
|
|
||||||
def login(self):
|
def login(self):
|
||||||
self.window.change_status(_("Logging in VK"))
|
self.window.change_status(_("Logging in VK"))
|
||||||
@ -221,7 +242,7 @@ class Controller(object):
|
|||||||
self.window.change_status(_("Loading items for {0}").format(i.name,))
|
self.window.change_status(_("Loading items for {0}").format(i.name,))
|
||||||
i.get_items()
|
i.get_items()
|
||||||
self.window.change_status(_("Ready"))
|
self.window.change_status(_("Ready"))
|
||||||
self.create_unread_messages()
|
call_threaded(self.create_unread_messages)
|
||||||
self.status_setter = RepeatingTimer(280, self.set_online)
|
self.status_setter = RepeatingTimer(280, self.set_online)
|
||||||
self.status_setter.start()
|
self.status_setter.start()
|
||||||
self.set_online(notify=True)
|
self.set_online(notify=True)
|
||||||
@ -365,7 +386,7 @@ class Controller(object):
|
|||||||
elif user_id > 2000000000:
|
elif user_id > 2000000000:
|
||||||
chat = self.session.vk.client.messages.getChat(chat_id=user_id-2000000000)
|
chat = self.session.vk.client.messages.getChat(chat_id=user_id-2000000000)
|
||||||
name = chat["title"]
|
name = chat["title"]
|
||||||
wx.CallAfter(pub.sendMessage, "create_buffer", buffer_type="chatBuffer", buffer_title=name, parent_tab="chats", get_items=True, kwargs=dict(parent=self.window.tb, name="{0}_messages".format(user_id,), composefunc="render_message", parent_endpoint="messages", endpoint="getHistory", session=self.session, unread=unread, count=200, peer_id=user_id, rev=0, extended=True, fields="id, user_id, date, read_state, out, body, attachments, deleted"))
|
pub.sendMessage("create_buffer", buffer_type="chatBuffer", buffer_title=name, parent_tab="chats", get_items=True, kwargs=dict(parent=self.window.tb, name="{0}_messages".format(user_id,), composefunc="render_message", parent_endpoint="messages", endpoint="getHistory", session=self.session, unread=unread, count=200, peer_id=user_id, rev=0, extended=True, fields="id, user_id, date, read_state, out, body, attachments, deleted"))
|
||||||
# if setfocus:
|
# if setfocus:
|
||||||
# pos = self.window.search(buffer.name)
|
# pos = self.window.search(buffer.name)
|
||||||
# self.window.change_buffer(pos)
|
# self.window.change_buffer(pos)
|
||||||
@ -451,7 +472,7 @@ class Controller(object):
|
|||||||
if hasattr(self, "longpoll"):
|
if hasattr(self, "longpoll"):
|
||||||
del self.longpoll
|
del self.longpoll
|
||||||
self.create_longpoll_thread(notify=True)
|
self.create_longpoll_thread(notify=True)
|
||||||
|
@wx_call_after
|
||||||
def create_buffer(self, buffer_type="baseBuffer", buffer_title="", parent_tab=None, loadable=False, get_items=False, kwargs={}):
|
def create_buffer(self, buffer_type="baseBuffer", buffer_title="", parent_tab=None, loadable=False, get_items=False, kwargs={}):
|
||||||
""" Create and insert a buffer in the specified place.
|
""" Create and insert a buffer in the specified place.
|
||||||
@buffer_type str: name of the buffer type to be created. This should be a class in the buffers.py module.
|
@buffer_type str: name of the buffer type to be created. This should be a class in the buffers.py module.
|
||||||
@ -905,7 +926,7 @@ class Controller(object):
|
|||||||
commonMessages.community_no_items()
|
commonMessages.community_no_items()
|
||||||
return
|
return
|
||||||
new_name = current_buffer.name+"_audios"
|
new_name = current_buffer.name+"_audios"
|
||||||
wx.CallAfter(pub.sendMessage, "create_buffer", buffer_type="audioBuffer", buffer_title=_("Audios"), parent_tab=current_buffer.tab.name, get_items=True, kwargs=dict(parent=self.window.tb, name=new_name, composefunc="render_audio", session=self.session, endpoint="get", parent_endpoint="audio", owner_id=current_buffer.kwargs["owner_id"]))
|
pub.sendMessage("create_buffer", buffer_type="audioBuffer", buffer_title=_("Audios"), parent_tab=current_buffer.tab.name, get_items=True, kwargs=dict(parent=self.window.tb, name=new_name, composefunc="render_audio", session=self.session, endpoint="get", parent_endpoint="audio", owner_id=current_buffer.kwargs["owner_id"]))
|
||||||
|
|
||||||
def load_community_videos(self, *args, **kwargs):
|
def load_community_videos(self, *args, **kwargs):
|
||||||
""" Load community videos if they are not loaded already."""
|
""" Load community videos if they are not loaded already."""
|
||||||
@ -918,7 +939,7 @@ class Controller(object):
|
|||||||
commonMessages.community_no_items()
|
commonMessages.community_no_items()
|
||||||
return
|
return
|
||||||
new_name = current_buffer.name+"_videos"
|
new_name = current_buffer.name+"_videos"
|
||||||
wx.CallAfter(pub.sendMessage, "create_buffer", buffer_type="videoBuffer", buffer_title=_("Videos"), parent_tab=current_buffer.tab.name, get_items=True, kwargs=dict(parent=self.window.tb, name=new_name, composefunc="render_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"], owner_id=current_buffer.kwargs["owner_id"]))
|
pub.sendMessage("create_buffer", buffer_type="videoBuffer", buffer_title=_("Videos"), parent_tab=current_buffer.tab.name, get_items=True, kwargs=dict(parent=self.window.tb, name=new_name, composefunc="render_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"], owner_id=current_buffer.kwargs["owner_id"]))
|
||||||
|
|
||||||
def load_community_topics(self, *args, **kwargs):
|
def load_community_topics(self, *args, **kwargs):
|
||||||
""" Load community topics."""
|
""" Load community topics."""
|
||||||
@ -931,7 +952,7 @@ class Controller(object):
|
|||||||
commonMessages.community_no_items()
|
commonMessages.community_no_items()
|
||||||
return
|
return
|
||||||
new_name = current_buffer.name+"_topics"
|
new_name = current_buffer.name+"_topics"
|
||||||
wx.CallAfter(pub.sendMessage, "create_buffer", buffer_type="topicBuffer", buffer_title=_("Topics"), parent_tab=current_buffer.tab.name, get_items=True, kwargs=dict(parent=self.window.tb, name=new_name, composefunc="render_topic", session=self.session, endpoint="getTopics", parent_endpoint="board", count=100, group_id=-1*current_buffer.kwargs["owner_id"], extended=1))
|
pub.sendMessage("create_buffer", buffer_type="topicBuffer", buffer_title=_("Topics"), parent_tab=current_buffer.tab.name, get_items=True, kwargs=dict(parent=self.window.tb, name=new_name, composefunc="render_topic", session=self.session, endpoint="getTopics", parent_endpoint="board", count=100, group_id=-1*current_buffer.kwargs["owner_id"], extended=1))
|
||||||
|
|
||||||
def load_community_documents(self, *args, **kwargs):
|
def load_community_documents(self, *args, **kwargs):
|
||||||
current_buffer = self.get_current_buffer()
|
current_buffer = self.get_current_buffer()
|
||||||
@ -943,7 +964,7 @@ class Controller(object):
|
|||||||
commonMessages.community_no_items()
|
commonMessages.community_no_items()
|
||||||
return
|
return
|
||||||
new_name = current_buffer.name+"_documents"
|
new_name = current_buffer.name+"_documents"
|
||||||
wx.CallAfter(pub.sendMessage, "create_buffer", buffer_type="documentCommunityBuffer", buffer_title=_("Documents"), parent_tab=current_buffer.tab.name, get_items=True, kwargs=dict(parent=self.window.tb, name=new_name, composefunc="render_document", session=self.session, endpoint="get", parent_endpoint="docs", owner_id=current_buffer.kwargs["owner_id"]))
|
pub.sendMessage("create_buffer", buffer_type="documentCommunityBuffer", buffer_title=_("Documents"), parent_tab=current_buffer.tab.name, get_items=True, kwargs=dict(parent=self.window.tb, name=new_name, composefunc="render_document", session=self.session, endpoint="get", parent_endpoint="docs", owner_id=current_buffer.kwargs["owner_id"]))
|
||||||
|
|
||||||
def load_community_buffers(self, *args, **kwargs):
|
def load_community_buffers(self, *args, **kwargs):
|
||||||
""" Load all community buffers regardless of the setting present in optional buffers tab of the preferences dialog."""
|
""" Load all community buffers regardless of the setting present in optional buffers tab of the preferences dialog."""
|
||||||
|
Loading…
Reference in New Issue
Block a user