def disconnect(self, reconnect=True): # type: (bool) -> None if self.fd_hook: W.unhook(self.fd_hook) self._close_socket() self.fd_hook = None self.socket = None self.connected = False self.access_token = "" self.send_queue.clear() self.receive_queue.clear() self.send_buffer = b"" self.current_message = None self.reset_parser() self.lag = 0 W.bar_item_update("lag") self.reconnect_delay = 0 self.reconnect_time = None if self.server_buffer: message = ("{prefix}matrix: disconnected from server").format( prefix=W.prefix("network")) server_buffer_prnt(self, message) if reconnect: self.schedule_reconnect()
def execute(self): room = self.server.rooms[self.room_id] buff = self.server.buffers[self.room_id] tags = tags_for_message("backlog") for event in self.events: event.execute(self.server, room, buff, list(tags)) room.prev_batch = self.end_token MatrixBacklogEvent.buffer_sort_messages(buff) room.backlog_pending = False W.bar_item_update("buffer_modes")
def matrix_fetch_old_messages(server, room_id): room = server.rooms[room_id] if room.backlog_pending: return prev_batch = room.prev_batch if not prev_batch: return message = MatrixBacklogMessage(server.client, room_id=room_id, token=prev_batch, limit=OPTIONS.backlog_limit) room.backlog_pending = True W.bar_item_update("buffer_modes") server.send_or_queue(message) return
def matrix_timer_cb(server_name, remaining_calls): server = SERVERS[server_name] current_time = time.time() if ((not server.connected) and server.reconnect_time and current_time >= (server.reconnect_time + server.reconnect_delay)): server.reconnect() return W.WEECHAT_RC_OK if not server.connected: return W.WEECHAT_RC_OK # check lag, disconnect if it's too big if server.receive_queue: message = server.receive_queue.popleft() server.lag = (current_time - message.send_time) * 1000 server.receive_queue.appendleft(message) server.lag_done = False W.bar_item_update("lag") # TODO print out message, make timeout configurable if server.lag > 300000: server.disconnect() return W.WEECHAT_RC_OK while server.send_queue: message = server.send_queue.popleft() prnt_debug(DebugType.MESSAGING, server, ("Timer hook found message of type {t} in queue. Sending " "out.".format(t=message.__class__.__name__))) if not server.send(message): # We got an error while sending the last message return the message # to the queue and exit the loop server.send_queue.appendleft(message) break return W.WEECHAT_RC_OK