Make room joinable by members, improve logging

This commit is contained in:
Panoramic 2024-07-13 16:25:02 +03:00
parent 2ab0d2e93b
commit a11a3ea2ac
Signed by: Panoramic
GPG Key ID: 1630196630C6BE30
1 changed files with 54 additions and 12 deletions

View File

@ -53,6 +53,8 @@ class Command:
self.event = event self.event = event
self.args = self.command.split()[1:] self.args = self.command.split()[1:]
logger.info("Running command `%s` because of %s", command, event.sender)
async def process(self): async def process(self):
"""Process the command""" """Process the command"""
if self.command.startswith("echo"): if self.command.startswith("echo"):
@ -133,27 +135,56 @@ class Command:
) )
row = self.store.cursor.fetchone() row = self.store.cursor.fetchone()
if row is not None: if row is not None:
logger.warn("Vetting room already exists for %s", vetted_user_id)
text = f"A vetting room already exists for this user: https://matrix.to/#/{row[0]}" text = f"A vetting room already exists for this user: https://matrix.to/#/{row[0]}"
await send_text_to_room(self.client, self.room.room_id, text) await send_text_to_room(self.client, self.room.room_id, text)
return return
logger.info("Creating vetting room for %s", vetted_user_id)
# Get members to invite # Get members to invite
invitees = [ invitees = set([
user.user_id user.user_id
for user in self.room.users.values() for user in self.room.users.values()
if user.power_level >= self.config.power_level_invite if user.power_level >= self.config.power_level_invite
] ])
invitees.append(vetted_user_id) invitees.add(vetted_user_id) # Invite user to vet
invitees.add(self.event.sender) # Invite user that sent the command
invitees.remove(self.client.user_id) invitees.remove(self.client.user_id)
# Create new room # Create new room
random_string = hex(random.randrange(4096, 65535))[2:].upper() random_string = hex(random.randrange(4096, 65535))[2:].upper()
initial_state = [ initial_state = [
{ # Enable encryption # Enable encryption
{
"type": "m.room.encryption", "type": "m.room.encryption",
"content": {"algorithm": "m.megolm.v1.aes-sha2"}, "content": {"algorithm": "m.megolm.v1.aes-sha2"},
"state_key": "", "state_key": "",
} },
# Make room joinable by federation members
{
"type": "m.room.join_rules",
"state_key": "",
"content": {
"join_rule": "restricted",
"allow": [
{
"room_id": self.config.main_space_id,
"type": "m.room_membership",
},
{
"room_id": self.config.vetting_space_id,
"type": "m.room_membership",
},
],
},
},
# Show message history to new members
{
"type": "m.room.history_visibility",
"state_key": "",
"content": {"history_visibility": "shared"},
},
] ]
room_resp = await self.client.room_create( room_resp = await self.client.room_create(
name=f"Vetting {random_string}", name=f"Vetting {random_string}",
@ -164,7 +195,7 @@ class Command:
if isinstance(room_resp, RoomCreateError): if isinstance(room_resp, RoomCreateError):
text = f"Unable to create room: {room_resp}" text = f"Unable to create room: {room_resp}"
await send_text_to_room(self.client, self.room.room_id, text) await send_text_to_room(self.client, self.room.room_id, text)
logging.error(room_resp, stack_info=True) logging.error(text, stack_info=True)
return return
# Create new vetting entry # Create new vetting entry
@ -173,6 +204,8 @@ class Command:
(vetted_user_id, room_resp.room_id, time.time()), (vetted_user_id, room_resp.room_id, time.time()),
) )
logger.debug("Adding vetting room to space")
# Add newly created room to space # Add newly created room to space
space_child_content = { space_child_content = {
"suggested": False, "suggested": False,
@ -185,7 +218,15 @@ class Command:
state_key=room_resp.room_id, state_key=room_resp.room_id,
) )
if not isinstance(space_resp, RoomPutStateResponse): if not isinstance(space_resp, RoomPutStateResponse):
logging.error(space_resp, exc_info=True) logging.error("Failed to add room to space: %s", space_resp, exc_info=True)
vetted_user_server = vetted_user_id.split(":", maxsplit=1)[1]
vetting_room_link = f"https://matrix.to/#/{room_resp.room_id}?via={self.client.server}&via={vetted_user_server}"
text = f"Created vetting room for https://matrix.to/#/{vetted_user_id}: {vetting_room_link}"
await send_text_to_room(self.client, self.room.room_id, text)
logger.info("Vetting room set up for %s", vetted_user_id)
async def _start_vote(self): async def _start_vote(self):
"""Starts the vote""" """Starts the vote"""
@ -202,7 +243,8 @@ class Command:
# Check if vetting room exists for user and poll hasn't been started yet # Check if vetting room exists for user and poll hasn't been started yet
self.store.cursor.execute( self.store.cursor.execute(
"SELECT room_id, poll_event_id, room_id FROM vetting WHERE mxid=?", (vetted_user_id,) "SELECT room_id, poll_event_id, room_id FROM vetting WHERE mxid=?",
(vetted_user_id,),
) )
row = self.store.cursor.fetchone() row = self.store.cursor.fetchone()
if row is None: if row is None:
@ -268,7 +310,7 @@ class Command:
# Send link to vetting room # Send link to vetting room
vetted_user_server = vetted_user_id.split(":", maxsplit=1)[1] vetted_user_server = vetted_user_id.split(":", maxsplit=1)[1]
vetting_room_link = f"https://matrix.to/#/{vetting_room_id}?via={self.client.server}?via={vetted_user_server}" vetting_room_link = f"https://matrix.to/#/{vetting_room_id}?via={self.client.server}&via={vetted_user_server}"
msg_content = { msg_content = {
"m.relates_to": {"rel_type": "m.thread", "event_id": poll_resp.event_id}, "m.relates_to": {"rel_type": "m.thread", "event_id": poll_resp.event_id},