def join_global_rooms( self, client: GMatrixClient, available_servers: Sequence[str] = ()) -> None: """Join or create a global public room with given name on all available servers. If global rooms are not found, create a public room with the name on each server. Params: client: matrix-python-sdk client instance servers: optional: sequence of known/available servers to try to find the room in """ suffix = self.service_room_suffix room_alias_prefix = make_room_alias(self.chain_id, suffix) parsed_servers = [ urlparse(s).netloc for s in available_servers if urlparse(s).netloc not in {None, ""} ] for server in parsed_servers: room_alias_full = f"#{room_alias_prefix}:{server}" log.debug(f"Trying to join {suffix} room", room_alias_full=room_alias_full) try: broadcast_room = client.join_room(room_alias_full) log.debug(f"Joined {suffix} room", room=broadcast_room) self.broadcast_rooms.append(broadcast_room) except MatrixRequestError as ex: if ex.code != 404: log.debug( f"Could not join {suffix} room, trying to create one", room_alias_full=room_alias_full, ) try: broadcast_room = client.create_room(room_alias_full, is_public=True) log.debug(f"Created {suffix} room", room=broadcast_room) self.broadcast_rooms.append(broadcast_room) except MatrixRequestError: log.debug( f"Could neither join nor create a {suffix} room", room_alias_full=room_alias_full, ) raise TransportError( f"Could neither join nor create a {suffix} room") else: log.debug( f"Could not join {suffix} room", room_alias_full=room_alias_full, _exception=ex, ) raise
def join_global_room(client: GMatrixClient, name: str, servers: Sequence[str] = ()) -> Room: """Join or create a global public room with given name First, try to join room on own server (client-configured one) If can't, try to join on each one of servers, and if able, alias it in our server If still can't, create a public room with name in our server Params: client: matrix-python-sdk client instance name: name or alias of the room (without #-prefix or server name suffix) servers: optional: sequence of known/available servers to try to find the room in Returns: matrix's Room instance linked to client """ our_server_name = urlparse(client.api.base_url).netloc assert our_server_name, 'Invalid client\'s homeserver url' servers = [our_server_name] + [ # client's own server first urlparse(s).netloc for s in servers if urlparse(s).netloc not in {None, '', our_server_name} ] our_server_global_room_alias_full = f'#{name}:{servers[0]}' # try joining a global room on any of the available servers, starting with ours for server in servers: global_room_alias_full = f'#{name}:{server}' try: global_room = client.join_room(global_room_alias_full) except MatrixRequestError as ex: if ex.code not in (403, 404, 500): raise log.debug( 'Could not join global room', room_alias_full=global_room_alias_full, _exception=ex, ) else: if our_server_global_room_alias_full not in global_room.aliases: # we managed to join a global room, but it's not aliased in our server global_room.add_room_alias(our_server_global_room_alias_full) global_room.aliases.append(our_server_global_room_alias_full) break else: log.debug('Could not join any global room, trying to create one') for _ in range(JOIN_RETRIES): try: global_room = client.create_room(name, is_public=True) except MatrixRequestError as ex: if ex.code not in (400, 409): raise try: global_room = client.join_room( our_server_global_room_alias_full, ) except MatrixRequestError as ex: if ex.code not in (404, 403): raise else: break else: break else: raise TransportError('Could neither join nor create a global room') return global_room