diff --git a/sample.config.yaml b/sample.config.yaml index 816d01f..9839dc1 100644 --- a/sample.config.yaml +++ b/sample.config.yaml @@ -46,6 +46,8 @@ vetting: # Requirements for getting accepted min_yes_votes: 1 max_no_votes: 0 + # Minimum power level to automatically invite users from vetting room + power_level_invite: 10 # Logging setup logging: diff --git a/vetting_bot/bot_commands.py b/vetting_bot/bot_commands.py index 8ff4aef..e0aa98a 100644 --- a/vetting_bot/bot_commands.py +++ b/vetting_bot/bot_commands.py @@ -138,7 +138,11 @@ class Command: return # Get members to invite - invitees = [member_id for member_id in self.room.users.keys()] + invitees = [ + user.user_id + for user in self.room.users.values() + if user.power_level >= self.config.power_level_invite + ] invitees.append(vetted_user_id) invitees.remove(self.client.user_id) @@ -198,7 +202,7 @@ class Command: # Check if vetting room exists for user and poll hasn't been started yet self.store.cursor.execute( - "SELECT room_id, poll_event_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() if row is None: @@ -207,11 +211,11 @@ class Command: return if row[1] is not None: event_link = f"https://matrix.to/#/{self.config.vetting_room_id}/{row[1]}?via={self.client.server}" - text = ( - f"A poll has already been started for this user: {event_link}" - ) + text = f"A poll has already been started for this user: {event_link}" await send_text_to_room(self.client, self.room.room_id, text) return + + vetting_room_id = row[2] poll_text = f"Accept {vetted_user_id} into the Federation?" choices = ["yes", "no", "blank"] @@ -246,7 +250,7 @@ class Command: if isinstance(poll_resp, RoomSendError): logging.error(poll_resp, stack_info=True) - text = "Failed to send poll." + text = f"Failed to send poll: {poll_resp}" await send_text_to_room(self.client, self.room.room_id, text) return @@ -262,6 +266,28 @@ class Command: vetted_user_id, poll_resp.event_id, voting_start_time ) + # Send link to vetting room + 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}" + + msg_content = { + "m.relates_to": {"rel_type": "m.thread", "event_id": poll_resp.event_id}, + "msgtype": "m.text", + "body": f"Vetting room: {vetting_room_link}", + } + + msg_resp = await self.client.room_send( + self.room.room_id, + message_type="m.room.message", + content=msg_content, + ) + + if isinstance(msg_resp, RoomSendError): + logging.error(msg_resp, stack_info=True) + text = f"Failed to send vetting room link: {msg_resp}" + await send_text_to_room(self.client, self.room.room_id, text) + return + async def _unknown_command(self): await send_text_to_room( self.client, diff --git a/vetting_bot/config.py b/vetting_bot/config.py index 74d4cc6..60fbf1d 100644 --- a/vetting_bot/config.py +++ b/vetting_bot/config.py @@ -133,6 +133,10 @@ class Config: self.max_no_votes = int( self._get_cfg(["vetting", "max_no_votes"], required=True) ) + + self.power_level_invite = int( + self._get_cfg(["vetting", "power_level_invite"], required=True) + ) def _get_cfg( self,