75 lines
2.8 KiB
Python
75 lines
2.8 KiB
Python
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
|
|
|
|
<room> can be a room ID or alias.
|
|
"""
|
|
room = room or ctx.room.room_id
|
|
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]
|
|
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)
|