Beispiel #1
0
    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()
Beispiel #2
0
    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")
Beispiel #3
0
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
Beispiel #4
0
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