Skip to content
Snippets Groups Projects
kick_users.py 3.08 KiB
Newer Older
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)