matrix: Add option to fetch members only when we switch to the buffer.
This commit is contained in:
parent
0710b7f77d
commit
d896962b19
4 changed files with 58 additions and 3 deletions
31
main.py
31
main.py
|
@ -461,6 +461,35 @@ class WeechatHandler(StreamHandler):
|
||||||
W.prnt(buf, item)
|
W.prnt(buf, item)
|
||||||
|
|
||||||
|
|
||||||
|
def lazy_fetch_members_signal(_, _signal, buffer_ptr):
|
||||||
|
""" Fetch room members on a buffer switch signal.
|
||||||
|
This function is called every time we switch a buffer. The pointer of
|
||||||
|
the new buffer is given to us by weechat. If it is one of our room buffers
|
||||||
|
we check if the members for the room aren't fetched and fetch them now if
|
||||||
|
they aren't.
|
||||||
|
"""
|
||||||
|
for server in SERVERS.values():
|
||||||
|
if buffer_ptr == server.server_buffer:
|
||||||
|
return W.WEECHAT_RC_OK
|
||||||
|
|
||||||
|
if buffer_ptr not in server.buffers.values():
|
||||||
|
continue
|
||||||
|
|
||||||
|
room_buffer = server.find_room_from_ptr(buffer_ptr)
|
||||||
|
if not room_buffer:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if room_buffer.members_fetched:
|
||||||
|
return W.WEECHAT_RC_OK
|
||||||
|
|
||||||
|
room_id = room_buffer.room.room_id
|
||||||
|
server.get_joined_members(room_id)
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
return W.WEECHAT_RC_OK
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if W.register(WEECHAT_SCRIPT_NAME, WEECHAT_SCRIPT_AUTHOR,
|
if W.register(WEECHAT_SCRIPT_NAME, WEECHAT_SCRIPT_AUTHOR,
|
||||||
WEECHAT_SCRIPT_VERSION, WEECHAT_SCRIPT_LICENSE,
|
WEECHAT_SCRIPT_VERSION, WEECHAT_SCRIPT_LICENSE,
|
||||||
|
@ -483,6 +512,8 @@ if __name__ == "__main__":
|
||||||
init_bar_items()
|
init_bar_items()
|
||||||
init_completion()
|
init_completion()
|
||||||
|
|
||||||
|
hook = W.hook_signal("buffer_switch", "lazy_fetch_members_signal", "")
|
||||||
|
|
||||||
if not SERVERS:
|
if not SERVERS:
|
||||||
create_default_server(G.CONFIG)
|
create_default_server(G.CONFIG)
|
||||||
|
|
||||||
|
|
|
@ -805,6 +805,7 @@ class RoomBuffer(object):
|
||||||
self.prev_batch = prev_batch
|
self.prev_batch = prev_batch
|
||||||
self.joined = True
|
self.joined = True
|
||||||
self.leave_event_id = None # type: Optional[str]
|
self.leave_event_id = None # type: Optional[str]
|
||||||
|
self.members_fetched = False
|
||||||
self.unhandled_users = [] # type: List[str]
|
self.unhandled_users = [] # type: List[str]
|
||||||
|
|
||||||
buffer_name = "{}.{}".format(server_name, room.room_id)
|
buffer_name = "{}.{}".format(server_name, room.room_id)
|
||||||
|
|
|
@ -385,6 +385,17 @@ class MatrixConfig(WeechatConfig):
|
||||||
"off",
|
"off",
|
||||||
("Use a separate buffer for debug logs."),
|
("Use a separate buffer for debug logs."),
|
||||||
),
|
),
|
||||||
|
Option(
|
||||||
|
"lazy_load_room_users",
|
||||||
|
"boolean",
|
||||||
|
"",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
"off",
|
||||||
|
("If on, room users wont be loaded background proactively "
|
||||||
|
"they will be loaded when the buffer becomes active. This "
|
||||||
|
"only affects non encrypted rooms."),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
color_options = [
|
color_options = [
|
||||||
|
|
|
@ -252,6 +252,7 @@ class MatrixServer(object):
|
||||||
# type: DefaultDict[str, Deque[EncrytpionQueueItem]]
|
# type: DefaultDict[str, Deque[EncrytpionQueueItem]]
|
||||||
self.backlog_queue = dict() # type: Dict[str, str]
|
self.backlog_queue = dict() # type: Dict[str, str]
|
||||||
|
|
||||||
|
self.member_request_list = [] # type: List[str]
|
||||||
self.rooms_with_missing_members = [] # type: List[str]
|
self.rooms_with_missing_members = [] # type: List[str]
|
||||||
self.lazy_load_hook = None # type: Optional[str]
|
self.lazy_load_hook = None # type: Optional[str]
|
||||||
self.partial_sync_hook = None # type: Optional[str]
|
self.partial_sync_hook = None # type: Optional[str]
|
||||||
|
@ -483,6 +484,7 @@ class MatrixServer(object):
|
||||||
|
|
||||||
self.send_buffer = b""
|
self.send_buffer = b""
|
||||||
self.transport_type = None
|
self.transport_type = None
|
||||||
|
self.member_request_list.clear()
|
||||||
|
|
||||||
if self.client:
|
if self.client:
|
||||||
try:
|
try:
|
||||||
|
@ -733,6 +735,10 @@ class MatrixServer(object):
|
||||||
self.send_or_queue(request)
|
self.send_or_queue(request)
|
||||||
|
|
||||||
def get_joined_members(self, room_id):
|
def get_joined_members(self, room_id):
|
||||||
|
if room_id in self.member_request_list:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.member_request_list.append(room_id)
|
||||||
_, request = self.client.joined_members(room_id)
|
_, request = self.client.joined_members(room_id)
|
||||||
self.send(request)
|
self.send(request)
|
||||||
|
|
||||||
|
@ -928,7 +934,11 @@ class MatrixServer(object):
|
||||||
self.keys_query()
|
self.keys_query()
|
||||||
|
|
||||||
for room_buffer in self.room_buffers.values():
|
for room_buffer in self.room_buffers.values():
|
||||||
|
# It's our initial sync, we need to fetch room members, so add
|
||||||
|
# the room to the missing members queue.
|
||||||
if not self.next_batch:
|
if not self.next_batch:
|
||||||
|
if (not G.CONFIG.network.lazy_load_room_users
|
||||||
|
or room_buffer.room.encrypted):
|
||||||
self.rooms_with_missing_members.append(
|
self.rooms_with_missing_members.append(
|
||||||
room_buffer.room.room_id
|
room_buffer.room.room_id
|
||||||
)
|
)
|
||||||
|
@ -1023,12 +1033,14 @@ class MatrixServer(object):
|
||||||
self.keys_queried = False
|
self.keys_queried = False
|
||||||
|
|
||||||
elif isinstance(response, JoinedMembersResponse):
|
elif isinstance(response, JoinedMembersResponse):
|
||||||
|
self.member_request_list.remove(response.room_id)
|
||||||
room_buffer = self.room_buffers[response.room_id]
|
room_buffer = self.room_buffers[response.room_id]
|
||||||
users = [user.user_id for user in response.members]
|
users = [user.user_id for user in response.members]
|
||||||
|
|
||||||
# Don't add the users directly use the lazy load hook.
|
# Don't add the users directly use the lazy load hook.
|
||||||
room_buffer.unhandled_users += users
|
room_buffer.unhandled_users += users
|
||||||
self._hook_lazy_user_adding()
|
self._hook_lazy_user_adding()
|
||||||
|
room_buffer.members_fetched = True
|
||||||
|
|
||||||
# Fetch the users for the next room.
|
# Fetch the users for the next room.
|
||||||
if self.rooms_with_missing_members:
|
if self.rooms_with_missing_members:
|
||||||
|
|
Loading…
Reference in a new issue