def test_presence_listener(): client = MatrixClient("http://example.com") accumulator = [] def dummy_callback(event): accumulator.append(event) presence_events = [ { "content": { "avatar_url": "mxc://*****:*****@example:localhost" }, "event_id": "$WLGTSEFSEF:localhost", "type": "m.presence" }, { "content": { "avatar_url": "mxc://*****:*****@example2:localhost" }, "event_id": "$CIGTXEFREF:localhost", "type": "m.presence" }, { "content": { "avatar_url": "mxc://*****:*****@example3:localhost" }, "event_id": "$ZEGASEDSEF:localhost", "type": "m.presence" }, ] sync_response = deepcopy(response_examples.example_sync) sync_response["presence"]["events"] = presence_events response_body = json.dumps(sync_response) sync_url = HOSTNAME + MATRIX_V2_API_PATH + "/sync" responses.add(responses.GET, sync_url, body=response_body) callback_uid = client.add_presence_listener(dummy_callback) client._sync() assert accumulator == presence_events responses.add(responses.GET, sync_url, body=response_body) client.remove_presence_listener(callback_uid) accumulator = [] client._sync() assert accumulator == []
class Bot: def __init__(self, hs_url, username, password): self.cli = MatrixClient(hs_url) self.cli.login_with_password(username=username, password=password) self.shelf = shelve.open(data_file, writeback=True) signal.signal(signal.SIGTERM, self.close_shelf) signal.signal(signal.SIGINT, self.close_shelf) self.cli.add_invite_listener(self.on_invite) self.joined_rooms = self.cli.get_rooms() logger.info( f'Joined to {[r.display_name for r in self.joined_rooms.values()]}' ) self.add_room_listeners() def run(self): self.cli.listen_forever(exception_handler=self.sync_exception_handler) logger.info('Bot started.') def add_room_listeners(self): for room in self.joined_rooms.values(): self.add_local_bot(room) def on_invite(self, room_id, state): room = self.cli.join_room(room_id) # Force a sync in order not to process previous room messages self.cli._sync() self.add_local_bot(room) self.joined_rooms[room_id] = room room.send_notice( f'Hi! I\'m a list keeping bot. Send {LocalBot.prefix}help' ' to learn how to use me.') logger.info( f'Received an invite for room {room.display_name}, and joined.') def add_local_bot(self, room): lbot = LocalBot(room, self.cli.api, self.shelf) room.add_listener(lbot.on_message, event_type='m.room.message') def close_shelf(self, *args): logger.info('Closing shelf...') self.shelf.close() logger.info('Shelf is closed.') sys.exit() @staticmethod def sync_exception_handler(exception): logger.warning(exception)
def test_one_time_keys_sync(): client = MatrixClient(HOSTNAME, encryption=True) sync_url = HOSTNAME + MATRIX_V2_API_PATH + "/sync" sync_response = deepcopy(response_examples.example_sync) payload = {'dummy': 1} sync_response["device_one_time_keys_count"] = payload sync_response['rooms']['join'] = {} class DummyDevice: def update_one_time_key_counts(self, payload): self.payload = payload device = DummyDevice() client.olm_device = device responses.add(responses.GET, sync_url, json=sync_response) client._sync() assert device.payload == payload
def test_cache(): m_none = MatrixClient("http://example.com", cache_level=CACHE.NONE) m_some = MatrixClient("http://example.com", cache_level=CACHE.SOME) m_all = MatrixClient("http://example.com", cache_level=CACHE.ALL) sync_url = HOSTNAME + MATRIX_V2_API_PATH + "/sync" room_id = "!726s6s6q:example.com" room_name = "The FooBar" sync_response = deepcopy(response_examples.example_sync) with pytest.raises(ValueError): MatrixClient("http://example.com", cache_level=1) MatrixClient("http://example.com", cache_level=5) MatrixClient("http://example.com", cache_level=0.5) MatrixClient("http://example.com", cache_level=-5) MatrixClient("http://example.com", cache_level="foo") MatrixClient("http://example.com", cache_level=0.0) sync_response["rooms"]["join"][room_id]["state"]["events"].append({ "sender": "@alice:example.com", "type": "m.room.name", "state_key": "", "content": { "name": room_name }, }) responses.add(responses.GET, sync_url, json.dumps(sync_response)) m_none._sync() responses.add(responses.GET, sync_url, json.dumps(sync_response)) m_some._sync() responses.add(responses.GET, sync_url, json.dumps(sync_response)) m_all._sync() assert m_none.rooms[room_id].name is None assert m_some.rooms[room_id].name == room_name assert m_all.rooms[room_id].name == room_name assert m_none.rooms[room_id]._members == m_some.rooms[ room_id]._members == [] assert len(m_all.rooms[room_id]._members) == 2 assert m_all.rooms[room_id]._members[0].user_id == "@alice:example.com"