Skip to content
Snippets Groups Projects
kick_users.py 3.08 KiB
Newer Older
  • Learn to ignore specific revisions
  • Kegan Dougal's avatar
    Kegan Dougal committed
    #!/usr/bin/env python
    
    Kegan Dougal's avatar
    Kegan Dougal committed
    import json
    import sys
    import urllib
    
    Kegan Dougal's avatar
    Kegan Dougal committed
    
    
    Amber Brown's avatar
    Amber Brown committed
    
    
    Kegan Dougal's avatar
    Kegan Dougal committed
    def _mkurl(template, kws):
        for key in kws:
            template = template.replace(key, kws[key])
        return template
    
    
    Amber Brown's avatar
    Amber Brown committed
    
    
    Kegan Dougal's avatar
    Kegan Dougal committed
    def main(hs, room_id, access_token, user_id_prefix, why):
        if not why:
            why = "Automated kick."
    
    Amber Brown's avatar
    Amber Brown committed
        print(
            "Kicking members on %s in room %s matching %s" % (hs, room_id, user_id_prefix)
        )
    
    Kegan Dougal's avatar
    Kegan Dougal committed
        room_state_url = _mkurl(
            "$HS/_matrix/client/api/v1/rooms/$ROOM/state?access_token=$TOKEN",
    
    Amber Brown's avatar
    Amber Brown committed
            {"$HS": hs, "$ROOM": room_id, "$TOKEN": access_token},
    
    Kegan Dougal's avatar
    Kegan Dougal committed
        )
    
        print("Getting room state => %s" % room_state_url)
    
    Kegan Dougal's avatar
    Kegan Dougal committed
        res = requests.get(room_state_url)
    
        print("HTTP %s" % res.status_code)
    
    Kegan Dougal's avatar
    Kegan Dougal committed
        state_events = res.json()
        if "error" in state_events:
    
            print("FATAL")
            print(state_events)
    
    Kegan Dougal's avatar
    Kegan Dougal committed
            return
    
        kick_list = []
        room_name = room_id
        for event in state_events:
            if not event["type"] == "m.room.member":
                if event["type"] == "m.room.name":
                    room_name = event["content"].get("name")
                continue
            if not event["content"].get("membership") == "join":
                continue
            if event["state_key"].startswith(user_id_prefix):
                kick_list.append(event["state_key"])
    
        if len(kick_list) == 0:
    
            print("No user IDs match the prefix '%s'" % user_id_prefix)
    
    Kegan Dougal's avatar
    Kegan Dougal committed
            return
    
    
        print("The following user IDs will be kicked from %s" % room_name)
    
    Kegan Dougal's avatar
    Kegan Dougal committed
        for uid in kick_list:
    
        doit = input("Continue? [Y]es\n")
    
    Amber Brown's avatar
    Amber Brown committed
        if len(doit) > 0 and doit.lower() == "y":
    
            print("Kicking members...")
    
    Kegan Dougal's avatar
    Kegan Dougal committed
            # encode them all
            kick_list = [urllib.quote(uid) for uid in kick_list]
            for uid in kick_list:
                kick_url = _mkurl(
                    "$HS/_matrix/client/api/v1/rooms/$ROOM/state/m.room.member/$UID?access_token=$TOKEN",
    
    Amber Brown's avatar
    Amber Brown committed
                    {"$HS": hs, "$UID": uid, "$ROOM": room_id, "$TOKEN": access_token},
    
    Kegan Dougal's avatar
    Kegan Dougal committed
                )
    
    Amber Brown's avatar
    Amber Brown committed
                kick_body = {"membership": "leave", "reason": why}
    
                print("Kicking %s" % uid)
    
    Kegan Dougal's avatar
    Kegan Dougal committed
                res = requests.put(kick_url, data=json.dumps(kick_body))
                if res.status_code != 200:
    
                    print("ERROR: HTTP %s" % res.status_code)
    
    Kegan Dougal's avatar
    Kegan Dougal committed
                if res.json().get("error"):
    
                    print("ERROR: JSON %s" % res.json())
    
    
    
    Kegan Dougal's avatar
    Kegan Dougal committed
    if __name__ == "__main__":
        parser = ArgumentParser("Kick members in a room matching a certain user ID prefix.")
    
    Amber Brown's avatar
    Amber Brown committed
        parser.add_argument("-u", "--user-id", help="The user ID prefix e.g. '@irc_'")
        parser.add_argument("-t", "--token", help="Your access_token")
        parser.add_argument("-r", "--room", help="The room ID to kick members in")
        parser.add_argument(
            "-s", "--homeserver", help="The base HS url e.g. http://matrix.org"
        )
        parser.add_argument("-w", "--why", help="Reason for the kick. Optional.")
    
    Kegan Dougal's avatar
    Kegan Dougal committed
        args = parser.parse_args()
        if not args.room or not args.token or not args.user_id or not args.homeserver:
            parser.print_help()
            sys.exit(1)
        else:
            main(args.homeserver, args.room, args.token, args.user_id, args.why)