diff --git a/kickbot/bot.py b/kickbot/bot.py index cdff91e..764c8cd 100644 --- a/kickbot/bot.py +++ b/kickbot/bot.py @@ -274,6 +274,98 @@ class KickBot(Plugin): await evt.reply("lol you don't have permission to do that") + @activity.subcommand("ban", help='kick and ban a specific user from the community and all rooms') + @command.argument("mxid", "full matrix ID", required=True) + async def ban_user(self, evt: MessageEvent, mxid: UserID) -> None: + await evt.mark_read() + if evt.sender in self.config["admins"]: + user = mxid + msg = await evt.respond("starting the ban...") + roomlist = await self.get_space_roomlist() + # don't forget to kick from the space itself + roomlist.append(self.config["master_room"]) + ban_list = {} + error_list = {} + + ban_list[user] = [] + for room in roomlist: + try: + roomname = None + roomnamestate = await self.client.get_state_event(room, 'm.room.name') + roomname = roomnamestate['name'] + + await self.client.get_state_event(room, EventType.ROOM_MEMBER, user) + await self.client.ban_user(room, user, reason='banned') + if roomname: + ban_list[user].append(roomname) + else: + ban_list[user].append(room) + time.sleep(0.5) + except MNotFound: + pass + except Exception as e: + self.log.warning(e) + error_list[user] = [] + error_list[user].append(roomname or room) + + + results = "the following users were kicked and banned:

{ban_list}

the following errors were \ + recorded:

{error_list}

".format(ban_list=ban_list, error_list=error_list) + await evt.respond(results, allow_html=True, edits=msg) + + # sync our database after we've made changes to room memberships + await self.do_sync() + + else: + await evt.reply("lol you don't have permission to do that") + + + @activity.subcommand("unban", help='unban a specific user from the community and all rooms') + @command.argument("mxid", "full matrix ID", required=True) + async def unban_user(self, evt: MessageEvent, mxid: UserID) -> None: + await evt.mark_read() + if evt.sender in self.config["admins"]: + user = mxid + msg = await evt.respond("starting the unban...") + roomlist = await self.get_space_roomlist() + # don't forget to kick from the space itself + roomlist.append(self.config["master_room"]) + unban_list = {} + error_list = {} + + unban_list[user] = [] + for room in roomlist: + try: + roomname = None + roomnamestate = await self.client.get_state_event(room, 'm.room.name') + roomname = roomnamestate['name'] + + await self.client.get_state_event(room, EventType.ROOM_MEMBER, user) + await self.client.unban_user(room, user, reason='unbanned') + if roomname: + unban_list[user].append(roomname) + else: + unban_list[user].append(room) + time.sleep(0.5) + except MNotFound: + pass + except Exception as e: + self.log.warning(e) + error_list[user] = [] + error_list[user].append(roomname or room) + + + results = "the following users were unbanned:

{unban_list}

the following errors were \ + recorded:

{error_list}

".format(unban_list=unban_list, error_list=error_list) + await evt.respond(results, allow_html=True, edits=msg) + + # sync our database after we've made changes to room memberships + await self.do_sync() + + else: + await evt.reply("lol you don't have permission to do that") + + #need to somehow regularly fetch and update the list of room ids that are associated with a given space diff --git a/maubot.yaml b/maubot.yaml index 4da95cc..21af9fd 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,6 +1,6 @@ maubot: 0.1.0 id: org.jobmachine.kickbot -version: 0.0.11 +version: 0.0.12 license: MIT modules: - kickbot