import niobot import thefuzz class InfoModule(niobot.Module): @niobot.command(name="room-info") async def room_info(self, ctx: niobot.Context, room: str = None): """ Dumps information about a room in a human readable format can be a room ID or alias. """ if room.startswith("#"): x = await ctx.respond("Resolving room...") resolved = await ctx.bot.room_resolve_alias(room) if not isinstance(resolved, niobot.RoomResolveAliasResponse): resolved: niobot.RoomResolveAliasError await x.edit( "Sorry, I was unable to resolve that room alias.", override={ "uk.co.nexy7574.nonsensebot.error": str(resolved).replace( self.bot.access_token, "[REDACTED]" ) } ) room = resolved.room_id await x.delete("Room resolved to " + room) elif room.startswith("!"): pass else: # Search for the room matches: list[tuple[niobot.MatrixRoom, float]] = [] for room_id, room_obj in ctx.bot.rooms.items(): if ctx.event.sender not in room_obj.users: continue ratio = thefuzz.ratio(room, room_obj.display_name) matches.append((room_obj, ratio)) matches.sort( key=lambda _, ratio: ratio, reverse=True ) if not matches: return await ctx.respond( "[room] was not a room ID or alias, and I do not know of any mutual rooms that have" " a similar name." ) room = matches[0].room_id if room not in ctx.bot.rooms: return await ctx.respond( "Unknown room %r." % room ) room_obj: niobot.MatrixRoom = ctx.bot.rooms[room_obj] lines = [ "Name: {obj.display_name!r} (is explicitly named: {obj.is_named!s})", "ID: `{obj.room_id}`", "Version: {obj.room_version!s}", "Federated? {obj.federate!s}", "Encrypted? {obj.encrypted!s}", "Guest access: {obj.guest_access!r}", "Join rule: {obj.join_rule!r}", "History visibility: {obj.history_visibility!r}", "User count: {user_count:,} ({invited_count:,} invited)", "Avatar URL: `{obj.room_avatar_url!s}`", "Canonical alias: {obj.canonical_alias}" ] body = "\n".join(lines).format( obj=room_obj, user_count=len(room_obj.users), invited_count=len(room_obj.invited_count) ) return await ctx.respond(body)