2023-07-08 05:55:48 -04:00
import subprocess
import json
import time
import os
import csv
2023-07-14 15:34:10 -04:00
import requests
2023-07-08 05:55:48 -04:00
import hardcoded_variables
def parse_username ( username ) :
tail_end = ' : ' + hardcoded_variables . base_url
username = username . replace ( ' @ ' , ' ' )
username = username . replace ( tail_end , ' ' )
return username
2023-07-26 15:39:48 -04:00
def get_room_details ( preset_internal_ID ) :
2023-07-08 05:55:48 -04:00
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of the room you wish to query (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
elif preset_internal_ID != ' ' :
internal_ID = preset_internal_ID
2023-07-14 15:34:10 -04:00
url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/rooms/ { internal_ID } "
headers = { " Authorization " : f " Bearer { hardcoded_variables . access_token } " }
2023-07-25 09:52:08 -04:00
#print("\n" + url + "\n")
2023-07-14 15:34:10 -04:00
response = requests . get ( url , headers = headers , verify = True )
2023-07-22 16:21:50 -04:00
room_details_dict = json . loads ( response . text )
return room_details_dict
2023-07-08 05:55:48 -04:00
# Example
# $ curl -kXGET 'https://matrix.perthchat.org/_synapse/admin/v1/rooms/!OeqILBxiHahidSQQoC:matrix.org?access_token=ACCESS_TOKEN'
2023-07-25 09:52:08 -04:00
def get_room_members ( preset_internal_ID , local_only ) :
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of the room you wish to query (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
elif preset_internal_ID != ' ' :
internal_ID = preset_internal_ID
url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/rooms/ { internal_ID } /members "
headers = { " Authorization " : f " Bearer { hardcoded_variables . access_token } " }
response = requests . get ( url , headers = headers , verify = True )
room_members_dict = json . loads ( response . text )
# Print room_members_dict for debugging
#print("room_members_dict: " + json.dumps(room_members_dict, indent=4, sort_keys=True))
# Check if the 'members' key is in the response
if ' members ' in room_members_dict :
# List of all members
room_members = room_members_dict [ ' members ' ]
if local_only :
# Filter to get only local members
room_members = [ member for member in room_members if member . split ( ' : ' ) [ 1 ] == hardcoded_variables . base_url ]
else :
# If 'members' key is not found, return an empty dictionary
room_members = { }
# Print room_members for debugging
#print("room_members: " + str(room_members))
return room_members
# Example
# $ curl -kXGET 'https://matrix.perthchat.org/_synapse/admin/v1/rooms/!OeqILBxiHahidSQQoC:matrix.org/members?access_token=ACCESS_TOKEN'
# This function returns the state of a room as output and optionally writes it to a json file
def export_room_state ( preset_internal_ID , preset_directory , save_to_file ) :
2023-07-08 05:55:48 -04:00
# record the current directory location
current_directory = os . getcwd ( )
2023-07-22 16:21:50 -04:00
2023-07-08 05:55:48 -04:00
if preset_internal_ID == ' ' :
2023-07-14 15:34:10 -04:00
internal_ID = input ( " \n Enter the internal id of the room with which to export the ' state ' of (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
2023-07-08 05:55:48 -04:00
elif preset_internal_ID != ' ' :
internal_ID = preset_internal_ID
2023-07-22 16:21:50 -04:00
if preset_directory == ' ' :
room_dir = os . path . join ( current_directory , " state_events " )
elif preset_directory != ' ' :
room_dir = preset_directory
2023-07-14 15:34:10 -04:00
url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/rooms/ { internal_ID } /state "
headers = { " Authorization " : f " Bearer { hardcoded_variables . access_token } " }
2023-07-25 09:52:08 -04:00
#print("\n" + url + "\n")
2023-07-14 15:34:10 -04:00
response = requests . get ( url , headers = headers , verify = True )
2023-07-22 16:21:50 -04:00
state_events_dict = json . loads ( response . text )
2023-07-25 09:52:08 -04:00
# If save_to_file is True, write the output to a file
if save_to_file == True :
if " Room not found " not in state_events_dict . get ( ' error ' , ' ' ) :
# If save_to_file is True, create the directory if it doesn't exist
os . makedirs ( room_dir , exist_ok = True )
# Define the filename and write to it
unix_time = int ( time . time ( ) )
filename = os . path . join ( room_dir , f " { internal_ID } _state_ { unix_time } .json " )
#print(f"Writing room state events to {filename}")
with open ( filename , ' w ' ) as f :
f . write ( json . dumps ( state_events_dict , indent = 4 , sort_keys = True ) )
elif " Room not found " in state_events_dict . get ( ' error ' , ' ' ) :
print ( " Room not found, skipping write to file... " )
2023-07-22 16:21:50 -04:00
return state_events_dict
2023-07-08 05:55:48 -04:00
# Example
# $ curl -kXGET 'https://matrix.perthchat.org/_synapse/admin/v1/rooms/!OeqILBxiHahidSQQoC:matrix.org/state?access_token=ACCESS_TOKEN'
# See
# https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#room-state-api
2023-07-27 17:15:46 -04:00
def export_multiple_room_states ( preset_internal_IDs = None , preset_directory = ' ' ) :
print ( " Export multiple room states selected " )
if preset_internal_IDs is None :
room_list_location = input ( " \n Please enter the path of the file containing a JSON array of rooms: " )
with open ( room_list_location , ' r ' ) as f :
room_ids = json . load ( f )
else :
room_ids = preset_internal_IDs
print ( " \n " + str ( room_ids ) + " \n " )
export_confirmation = input ( " \n Are you sure you want to export the state of all of these rooms? y/n? \n " )
if export_confirmation in [ " y " , " yes " , " Y " , " Yes " ] :
for room_id in room_ids :
export_room_state ( room_id , preset_directory , True )
elif export_confirmation in [ " n " , " no " , " N " , " No " ] :
print ( " Export canceled by user. " )
2023-07-25 09:52:08 -04:00
def public_directory_rooms ( ) :
url = f " https:// { hardcoded_variables . homeserver_url } /_matrix/client/r0/publicRooms "
headers = { " Authorization " : f " Bearer { hardcoded_variables . access_token } " }
#print("\n" + url + "\n")
response = requests . get ( url , headers = headers , verify = True )
output = response . text
output = output . replace ( ' \" room_id \" : \" ' , ' \n ' )
output = output . replace ( ' \" , \" name ' , ' \n \" , \" name ' )
2023-07-14 15:34:10 -04:00
2023-07-25 09:52:08 -04:00
print ( json . dumps ( output , indent = 4 , sort_keys = True ) )
2023-07-14 15:34:10 -04:00
2023-07-25 09:52:08 -04:00
public_room_directories_dict = json . loads ( response . text )
2023-07-22 16:21:50 -04:00
2023-07-25 09:52:08 -04:00
return public_room_directories_dict
2023-07-08 05:55:48 -04:00
# Example
# $ curl -kXGET https://matrix.perthchat.org/_matrix/client/r0/publicRooms?access_token=ACCESS_TOKEN
def remove_room_from_directory ( preset_internal_ID ) :
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of the room you wish to remove from the directory (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
elif preset_internal_ID != ' ' :
internal_ID = preset_internal_ID
2023-07-14 15:34:10 -04:00
url = f " https:// { hardcoded_variables . homeserver_url } /_matrix/client/r0/directory/list/room/ { internal_ID } "
headers = { " Authorization " : f " Bearer { hardcoded_variables . access_token } " }
data = { " visibility " : " private " }
2023-07-25 09:52:08 -04:00
#print("\n" + url + "\n")
2023-07-14 15:34:10 -04:00
response = requests . put ( url , headers = headers , json = data , verify = True )
print ( response . text )
2023-07-08 05:55:48 -04:00
# Example
# $ curl -kX PUT -H 'Content-Type: application/json' -d '{"visibility": "private"}' 'https://matrix.perthchat.org/_matrix/client/r0/directory/list/room/!DwUPBvNapIVecNllgt:perthchat.org?access_token=ACCESS_TOKEN'
def remove_multiple_rooms_from_directory ( ) :
print ( " Remove multiple rooms from directory selected " )
purge_list_location = input ( " \n Please enter the path of the file containing a newline seperated list of room ids: " )
with open ( purge_list_location , newline = ' ' ) as f :
reader = csv . reader ( f )
data = list ( reader )
x = 0
while x < = ( len ( data ) - 1 ) :
print ( data [ x ] [ 0 ] )
remove_room_from_directory ( data [ x ] [ 0 ] )
x + = 1
#print(x)
time . sleep ( 1 )
2023-07-14 15:34:10 -04:00
def list_and_download_media_in_room ( preset_internal_ID , preset_print_file_list_choice , preset_download_files_choice , base_directory ) :
headers = {
' Authorization ' : f " Bearer { hardcoded_variables . access_token } "
}
2023-07-08 05:55:48 -04:00
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of the room you want to get a list of media for (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
2023-07-14 15:34:10 -04:00
else :
2023-07-08 05:55:48 -04:00
internal_ID = preset_internal_ID
2023-07-14 15:34:10 -04:00
url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/room/ { internal_ID } /media "
2023-07-25 09:52:08 -04:00
#print("\n" + url + "\n")
2023-07-14 15:34:10 -04:00
response = requests . get ( url , headers = headers , verify = True )
media_list_output = response . text
print ( " Full media list: \n " + media_list_output )
2023-07-08 05:55:48 -04:00
if preset_print_file_list_choice == ' ' :
2023-07-14 15:34:10 -04:00
print_file_list_choice = input ( " \n Do you want to write this list to a file? y/n? " )
else :
2023-07-08 05:55:48 -04:00
print_file_list_choice = preset_print_file_list_choice
2023-07-14 15:34:10 -04:00
if print_file_list_choice . lower ( ) in [ " y " , " yes " , " Y " , " Yes " ] :
2023-07-08 05:55:48 -04:00
print_file_list_choice = " true "
2023-07-14 15:34:10 -04:00
elif print_file_list_choice . lower ( ) in [ " n " , " no " , " N " , " No " ] :
2023-07-08 05:55:48 -04:00
print_file_list_choice = " false "
else :
print ( " Input invalid! Defaulting to ' No ' . " )
print_file_list_choice = " false "
2023-07-14 15:34:10 -04:00
room_dir = os . path . join ( base_directory , internal_ID . replace ( ' ! ' , ' ' ) . replace ( ' : ' , ' - ' ) )
os . makedirs ( room_dir , exist_ok = True )
2023-07-08 05:55:48 -04:00
if print_file_list_choice == " true " :
2023-07-14 15:34:10 -04:00
media_list_filename_location = os . path . join ( room_dir , " media_list.txt " )
with open ( media_list_filename_location , " w+ " ) as media_list_filename :
media_list_filename . write ( media_list_output )
2023-07-08 05:55:48 -04:00
if preset_download_files_choice == ' ' :
2023-07-14 15:34:10 -04:00
download_files_choice = input ( " \n Do you also want to download a copy of these media files? y/n? " )
else :
2023-07-08 05:55:48 -04:00
download_files_choice = preset_download_files_choice
2023-07-14 15:34:10 -04:00
if download_files_choice . lower ( ) in [ " y " , " yes " , " Y " , " Yes " ] :
2023-07-08 05:55:48 -04:00
download_files_choice = " true "
2023-07-14 15:34:10 -04:00
elif download_files_choice . lower ( ) in [ " n " , " no " , " N " , " No " ] :
2023-07-08 05:55:48 -04:00
download_files_choice = " false "
else :
print ( " Input invalid! Defaulting to ' No ' . " )
download_files_choice = " false "
if download_files_choice == " true " :
2023-07-14 15:34:10 -04:00
media_files_dir = os . path . join ( room_dir , " media-files " )
os . makedirs ( media_files_dir , exist_ok = True )
media_list_output = json . loads ( media_list_output )
for key in [ ' local ' , ' remote ' ] :
for media in media_list_output . get ( key , [ ] ) :
media_url = media . replace ( ' mxc:// ' , f " https:// { hardcoded_variables . homeserver_url } /_matrix/media/r0/download/ " )
media_response = requests . get ( media_url , stream = True , headers = headers , verify = True )
if media_response . status_code == 200 :
media_file_path = os . path . join ( media_files_dir , media . split ( ' / ' ) [ - 1 ] )
with open ( media_file_path , ' wb ' ) as media_file :
media_file . write ( media_response . content )
print ( f " Downloaded { media_url } to { media_file_path } " )
else :
print ( f " Failed to download { media_url } , status code: { media_response . status_code } " )
2023-07-08 05:55:48 -04:00
# Example
# $ curl -kXGET https://matrix.perthchat.org/_synapse/admin/v1/room/<room_id>/media?access_token=ACCESS_TOKEN
# To access via web:
# https://matrix.perthchat.org/_matrix/media/r0/download/ + server_name + "/" + media_id
def download_media_from_multiple_rooms ( ) :
print ( " Download media from multiple rooms selected " )
download_media_list_location = input ( " \n Please enter the path of the file containing a newline seperated list of room ids: " )
with open ( download_media_list_location , newline = ' ' ) as f :
reader = csv . reader ( f )
data = list ( reader )
preset_print_file_list_choice = input ( " \n Do you want to print list files of all the media in these rooms? y/n? " )
preset_download_files_choice = input ( " \n Do you want to download all the media in these rooms? y/n? " )
os . mkdir ( " ./media_download " )
os . chdir ( " ./media_download " )
pwd_process = subprocess . run ( [ " pwd " ] , shell = True , stdout = subprocess . PIPE , universal_newlines = True )
base_directory = pwd_process . stdout
base_directory = base_directory . replace ( ' \n ' , ' ' )
print ( base_directory )
print ( " Beginning download of media from all rooms in list... " )
x = 0
while x < = ( len ( data ) - 1 ) :
print ( data [ x ] [ 0 ] )
list_and_download_media_in_room ( data [ x ] [ 0 ] , preset_print_file_list_choice , preset_download_files_choice , base_directory )
x + = 1
#print(x)
time . sleep ( 1 )
2023-07-14 15:34:10 -04:00
def redact_room_event ( ) :
internal_ID = input ( " \n Enter the internal id of the room the event is in (Example: !rapAelwZkajRyeZIpm:perthchat.org): " )
event_ID = input ( " \n Enter the event id of the event you wish to redact (Example: $lQT7NYYyVvwoVpZWcj7wceYQqeOzsJg1N6aXIecys4s): " )
redaction_reason = input ( " \n Enter the reason you ' re redacting this content: " )
url = f " https:// { hardcoded_variables . homeserver_url } /_matrix/client/v3/rooms/ { internal_ID } /redact/ { event_ID } "
print ( f " \n Requesting: { url } \n " )
output = requests . post ( url , headers = { ' Authorization ' : f " Bearer { hardcoded_variables . access_token } " } , json = { ' reason ' : redaction_reason } , verify = True ) . text
print ( output )
# $ curl -X POST --header "Authorization: Bearer syt_..." --data-raw '{"reason": "Indecent material"}' 'https://matrix.perthchat.org/_matrix/client/v3/rooms/!fuYHAYyXqNLDxlKsWP:perthchat.org/redact/$nyjgZguQGadRRy8MdYtIgwbAeFcUAPqOPiaj_E60XZs'
# {"event_id":"$_m1gFtPg-5DiTyCvGfeveAX2xaA8gAv0BYLpjC8xe64"}
2023-07-08 05:55:48 -04:00
def quarantine_media_in_room ( ) :
internal_ID = input ( " \n Enter the internal id of the room you want to quarantine, this makes local and remote data inaccessible (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
2023-07-14 15:34:10 -04:00
url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/room/ { internal_ID } /media/quarantine "
print ( f " \n Requesting: { url } \n " )
headers = { ' Authorization ' : f ' Bearer { hardcoded_variables . access_token } ' }
response = requests . post ( url , headers = headers , verify = True )
print ( response . text )
2023-07-08 05:55:48 -04:00
# Example
# $ curl -X POST 'https://matrix.perthchat.org/_synapse/admin/v1/room/!DwUPBvNapIVecNllgt:perthchat.org/media/quarantine?access_token=ACCESS_TOKEN'
def shutdown_room ( preset_internal_ID , preset_user_ID , preset_new_room_name , preset_message , preset_purge_choice , preset_block_choice ) :
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of the room you want shutdown (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
elif preset_internal_ID != ' ' :
internal_ID = preset_internal_ID
if preset_user_ID == ' ' :
user_ID = input ( " \n Please enter the local username that will create a ' muted violation room ' for your users (Example: michael): " )
elif preset_user_ID != ' ' :
user_ID = preset_user_ID
if preset_new_room_name == ' ' :
new_room_name = input ( " \n Please enter the room name of the muted violation room your users will be sent to: " )
elif preset_new_room_name != ' ' :
new_room_name = preset_new_room_name
2023-07-22 16:21:50 -04:00
if preset_message == ' ' :
2023-07-08 05:55:48 -04:00
message = input ( " \n Please enter the shutdown message that will be displayed to users: " )
elif preset_message != ' ' :
message = preset_message
if preset_purge_choice == ' ' :
purge_choice = input ( " \n Do you want to purge the room? (This deletes all the room history from your database.) y/n? " )
elif preset_purge_choice != ' ' :
purge_choice = preset_purge_choice
if preset_block_choice == ' ' :
block_choice = input ( " \n Do you want to block the room? (This prevents your server users re-entering the room.) y/n? " )
elif preset_block_choice != ' ' :
block_choice = preset_block_choice
username = parse_username ( user_ID )
2023-07-25 09:52:08 -04:00
if purge_choice == " y " or purge_choice == " Y " or purge_choice == " yes " or purge_choice == " Yes " or purge_choice == True :
2023-07-08 05:55:48 -04:00
purge_choice = " true "
2023-07-25 09:52:08 -04:00
elif purge_choice == " n " or purge_choice == " N " or purge_choice == " no " or purge_choice == " No " or purge_choice == False :
2023-07-08 05:55:48 -04:00
purge_choice = " false "
else :
print ( " Input invalid! exiting. " )
return
2023-07-25 09:52:08 -04:00
if block_choice == " y " or block_choice == " Y " or block_choice == " yes " or block_choice == " Yes " or block_choice == True :
2023-07-08 05:55:48 -04:00
block_choice = " true "
2023-07-25 09:52:08 -04:00
elif block_choice == " n " or block_choice == " N " or block_choice == " no " or block_choice == " No " or block_choice == False :
2023-07-08 05:55:48 -04:00
block_choice = " false "
else :
print ( " Input invalid! exiting. " )
return
2023-07-25 09:52:08 -04:00
headers = { " Authorization " : f " Bearer { hardcoded_variables . access_token } " }
data = {
" new_room_user_id " : f " @ { username } : { hardcoded_variables . base_url } " ,
" room_name " : new_room_name ,
" message " : message ,
" block " : bool ( block_choice ) ,
" purge " : bool ( purge_choice )
}
delete_room_url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v2/rooms/ { internal_ID } "
response = requests . delete ( delete_room_url , headers = headers , json = data , verify = True )
#print(response.text)
status = " null "
count = 0
sleep_time = 1
2023-07-26 15:39:48 -04:00
list_kicked_users = [ ]
2023-07-25 09:52:08 -04:00
while status != " complete " and count < 8 :
time . sleep ( sleep_time )
count + = 1
sleep_time * = 2
check_status_url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v2/rooms/ { internal_ID } /delete_status "
status_response = requests . get ( check_status_url , headers = headers , verify = True )
#print(f"status_response: {status_response.text}")
output_json = status_response . json ( )
#print(f"output_json: {output_json}")
status = output_json [ " results " ] [ 0 ] [ " status " ]
#print(f"status: {status}")
if status != " complete " :
print ( f " Sleeping for { sleep_time } seconds... " )
if status == " complete " :
print ( f " { internal_ID } has been successfully shutdown! " )
if str ( output_json [ " results " ] [ 0 ] [ " shutdown_room " ] [ " kicked_users " ] ) != ' [] ' :
print ( " List of kicked users: " )
for entry in output_json [ " results " ] [ 0 ] [ " shutdown_room " ] [ " kicked_users " ] :
list_kicked_users . append ( entry )
print ( entry )
2023-07-14 16:36:40 -04:00
else :
2023-07-25 09:52:08 -04:00
print ( f " Failed to shutdown { internal_ID } ! " )
return list_kicked_users
2023-07-08 05:55:48 -04:00
# Example:
#$ curl -H "Authorization: Bearer ACCESS_TOKEN" --data '{ "new_room_user_id": "@PC-Admin:perthchat.org", "room_name": "VIOLATION ROOM", "message": "YOU HAVE BEEN NAUGHTY!", "block": true, "purge": true }' -X DELETE 'https://matrix.perthchat.org/_synapse/admin/v2/rooms/!yUykDcYIEtrbSxOyPD:perthchat.org'
# {"delete_id":"efphJOtAxlBNtkGD"}
# Then check with:
# $ curl -H "Authorization: Bearer ACCESS_TOKEN" -kX GET 'https://matrix.perthchat.org/_synapse/admin/v2/rooms/!yUykDcYIEtrbSxOyPD:perthchat.org/delete_status'
# {"results":[{"delete_id":"yRjYjwoTOXOnRQPa","status":"complete","shutdown_room":{"kicked_users":["@michael:perthchat.org"],"failed_to_kick_users":[],"local_aliases":[],"new_room_id":"!AXTUBcSlehQuCidiZu:perthchat.org"}}]}
def shutdown_multiple_rooms ( ) :
print ( " Shutdown multiple rooms selected " )
purge_list_location = input ( " \n Please enter the path of the file or directory containing a newline seperated list of room ids: " )
file_list = [ ]
# check if the input path is a directory or a file
if os . path . isdir ( purge_list_location ) :
# iterate over all files in the directory
for filename in os . listdir ( purge_list_location ) :
# construct full file path
file_path = os . path . join ( purge_list_location , filename )
# add it to the list
file_list . append ( file_path )
else :
# it's a single file
file_list . append ( purge_list_location )
preset_user_ID = input ( " \n Please enter the local username that will create a ' muted violation room ' for your users (Example: michael): " )
preset_new_room_name = input ( " \n Please enter the room name of the muted violation room your users will be sent to: " )
preset_message = input ( " \n Please enter the shutdown message that will be displayed to users: " )
preset_purge_choice = input ( " \n Do you want to purge these rooms? (This deletes all the room history from your database.) y/n? " )
2023-07-25 09:52:08 -04:00
if preset_purge_choice . lower ( ) in [ " y " , " yes " , " Y " , " Yes " ] :
preset_purge_choice = True
elif preset_purge_choice . lower ( ) in [ " n " , " no " , " N " , " No " ] :
preset_purge_choice = False
2023-07-08 05:55:48 -04:00
preset_block_choice = input ( " \n Do you want to block these rooms? (This prevents your server users re-entering the room.) y/n? " )
2023-07-25 09:52:08 -04:00
if preset_block_choice . lower ( ) in [ " y " , " yes " , " Y " , " Yes " ] :
preset_block_choice = True
elif preset_block_choice . lower ( ) in [ " n " , " no " , " N " , " No " ] :
preset_block_choice = False
2023-07-08 05:55:48 -04:00
# Get the directory of the current script
script_dir = os . path . dirname ( os . path . realpath ( __file__ ) )
2023-07-22 16:21:50 -04:00
room_list_data = [ ]
2023-07-08 05:55:48 -04:00
for file in file_list :
print ( " Processing file: " + file )
# Change the current working directory
os . chdir ( script_dir )
with open ( file , newline = ' ' ) as f :
reader = csv . reader ( f )
data = list ( reader )
room_list_data = room_list_data + data
# Deduplicate the room_list_data
room_list_data = [ list ( item ) for item in set ( tuple ( row ) for row in room_list_data ) ]
shutdown_confirmation = input ( " \n " + str ( room_list_data ) + " \n \n Number of rooms being shutdown: " + str ( len ( room_list_data ) ) + " \n \n Are you sure you want to shutdown these rooms? y/n? " )
if shutdown_confirmation . lower ( ) in [ " y " , " yes " ] :
for room_id in room_list_data :
shutdown_room ( room_id [ 0 ] , preset_user_ID , preset_new_room_name , preset_message , preset_purge_choice , preset_block_choice )
time . sleep ( 10 )
elif shutdown_confirmation . lower ( ) in [ " n " , " no " ] :
print ( " \n Skipping these files... \n " )
else :
print ( " \n Invalid input, skipping these files... \n " )
# Example:
# See shutdown_room()
def delete_room ( preset_internal_ID ) :
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of the room you want to delete (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
2023-07-14 16:36:40 -04:00
else :
2023-07-08 05:55:48 -04:00
internal_ID = preset_internal_ID
2023-07-14 16:36:40 -04:00
headers = { " Authorization " : " Bearer " + hardcoded_variables . access_token }
data = { " block " : False , " purge " : True }
url = f ' https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v2/rooms/ { internal_ID } '
response = requests . delete ( url , headers = headers , data = json . dumps ( data ) )
print ( " \n " , response . text , " \n " )
2023-07-08 05:55:48 -04:00
status = " null "
count = 0
sleep_time = 0.5
while status != " complete " and count < 8 :
time . sleep ( sleep_time )
2023-07-14 16:36:40 -04:00
count + = 1
sleep_time * = 2
url_status = f ' https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v2/rooms/ { internal_ID } /delete_status '
response = requests . get ( url_status , headers = headers , verify = True )
response_json = response . json ( )
status = response_json [ " results " ] [ 0 ] [ " status " ]
2023-07-08 05:55:48 -04:00
print ( " status: " + status )
if status != " complete " :
2023-07-14 16:36:40 -04:00
print ( f " Sleeping for { sleep_time } seconds... " )
2023-07-08 05:55:48 -04:00
if status == " complete " :
2023-07-14 16:36:40 -04:00
print ( f " { internal_ID } has been successfully deleted! " )
kicked_users = response_json [ " results " ] [ 0 ] [ " shutdown_room " ] [ " kicked_users " ]
if kicked_users :
2023-07-08 05:55:48 -04:00
print ( " List of kicked users: " )
2023-07-14 16:36:40 -04:00
for user in kicked_users :
print ( user )
2023-07-08 05:55:48 -04:00
print ( " " )
# Example:
#$ curl -H "Authorization: Bearer ACCESS_TOKEN" --data '{ "block": false, "purge": true }' -X DELETE 'https://matrix.perthchat.org/_synapse/admin/v2/rooms/!yUykDcYIEtrbSxOyPD:perthchat.org'
# {"delete_id":"efphJOtAxlBNtkGD"}
# Then check with:
# $ curl -H "Authorization: Bearer ACCESS_TOKEN" -kX GET 'https://matrix.perthchat.org/_synapse/admin/v2/rooms/!yUykDcYIEtrbSxOyPD:perthchat.org/delete_status'
# {"results":[{"delete_id":"efphJOtAxlBNtkGD","status":"complete","shutdown_room":{"kicked_users":[],"failed_to_kick_users":[],"local_aliases":[],"new_room_id":null}}]}
def delete_multiple_rooms ( ) :
print ( " Delete multiple rooms selected " )
purge_list_location = input ( " \n Please enter the path of the file containing a newline seperated list of room ids: " )
with open ( purge_list_location , newline = ' ' ) as f :
reader = csv . reader ( f )
data = list ( reader )
delete_confirmation = input ( " \n " + str ( data ) + " \n \n Are you sure you want to delete these rooms? y/n? " )
#print("len(data[0]) - " + str(len(data[0])))
#print("data[0][0] - " + data[0][0])
if delete_confirmation == " y " or delete_confirmation == " Y " or delete_confirmation == " yes " or delete_confirmation == " Yes " :
x = 0
while x < = ( len ( data ) - 1 ) :
print ( " data[x][0] - " + data [ x ] [ 0 ] )
delete_room ( data [ x ] [ 0 ] )
x + = 1
#print(x)
#time.sleep(2) # deleting a room is quicker then a full shutdown
if delete_confirmation == " n " or delete_confirmation == " N " or delete_confirmation == " no " or delete_confirmation == " No " :
print ( " \n Exiting... \n " )
# Example:
# See delete_room()
def purge_room_to_timestamp ( preset_internal_ID , preset_timestamp ) :
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of the room you want to delete (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
2023-07-14 16:36:40 -04:00
else :
2023-07-08 05:55:48 -04:00
internal_ID = preset_internal_ID
2023-07-14 16:36:40 -04:00
2023-07-08 05:55:48 -04:00
if preset_timestamp == ' ' :
2023-07-14 16:36:40 -04:00
timestamp = input ( " \n Enter the epoch timestamp in microseconds (Example: 1661058683000): " )
else :
2023-07-08 05:55:48 -04:00
timestamp = preset_timestamp
2023-07-22 16:21:50 -04:00
2023-07-14 16:36:40 -04:00
headers = { " Authorization " : " Bearer " + hardcoded_variables . access_token , " Content-Type " : " application/json " }
data = { " delete_local_events " : False , " purge_up_to_ts " : int ( timestamp ) }
url = f ' https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/purge_history/ { internal_ID } '
2023-07-22 16:21:50 -04:00
2023-07-14 16:36:40 -04:00
response = requests . post ( url , headers = headers , data = json . dumps ( data ) )
print ( " \n " , response . text , " \n " )
2023-07-08 05:55:48 -04:00
2023-07-14 16:36:40 -04:00
response_json = response . json ( )
if " errcode " in response_json :
print ( f " Error: { response_json [ ' error ' ] } " )
return
2023-07-08 05:55:48 -04:00
2023-07-14 16:36:40 -04:00
purge_id = response_json . get ( " purge_id " )
2023-07-08 05:55:48 -04:00
status = " null "
count = 0
sleep_time = 0.5
while status != " complete " and count < 8 :
time . sleep ( sleep_time )
2023-07-14 16:36:40 -04:00
count + = 1
sleep_time * = 2
2023-07-22 16:21:50 -04:00
2023-07-14 16:36:40 -04:00
url_status = f ' https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/purge_history_status/ { purge_id } '
response = requests . get ( url_status , headers = headers )
response_json = response . json ( )
status = response_json . get ( " status " )
2023-07-08 05:55:48 -04:00
print ( " status: " + status )
2023-07-14 16:36:40 -04:00
2023-07-08 05:55:48 -04:00
if status != " complete " :
2023-07-14 16:36:40 -04:00
print ( f " Sleeping for { sleep_time } seconds... " )
2023-07-08 05:55:48 -04:00
if status == " complete " :
2023-07-14 16:36:40 -04:00
print ( f " { internal_ID } has successfully had its history purged! " )
2023-07-08 05:55:48 -04:00
print ( " " )
# Example:
#$ curl --header "Authorization: Bearer syt_bW..." -X POST -H "Content-Type: application/json" -d '{ "delete_local_events": false, "purge_up_to_ts": 1661058683000 }' 'https://matrix.perthchat.org/_synapse/admin/v1/purge_history/!OnWgVbeuALuOEZowed:perthchat.org'
#{"purge_id":"rfWgHeCWWyDoOJZn"}
# Then check with:
#$ curl -H "Authorization: Bearer syt_bW..." -kX GET 'https://matrix.perthchat.org/_synapse/admin/v1/purge_history_status/rfWgHeCWWyDoOJZn'
#{"status":"complete"}
def purge_multiple_rooms_to_timestamp ( ) :
print ( " Purge the event history of multiple rooms to a specific timestamp selected " )
purge_list_location = input ( " \n Please enter the path of the file containing a newline seperated list of room ids: " )
with open ( purge_list_location , newline = ' ' ) as f :
reader = csv . reader ( f )
data = list ( reader )
preset_timestamp = input ( " \n Please enter the epoche timestamp in milliseconds you wish to purge too (for example 1661058683000): " )
purge_confirmation = input ( " \n " + str ( data ) + " \n \n Are you sure you want to purge the history of these rooms? y/n? " )
print ( " len(data[0]) - " + str ( len ( data [ 0 ] ) ) )
print ( " data[0][0] - " + data [ 0 ] [ 0 ] )
if purge_confirmation == " y " or purge_confirmation == " Y " or purge_confirmation == " yes " or purge_confirmation == " Yes " :
x = 0
while x < = ( len ( data ) - 1 ) :
print ( " data[x][0] - " + data [ x ] [ 0 ] )
purge_room_to_timestamp ( data [ x ] [ 0 ] , preset_timestamp )
x + = 1
#print(x)
if purge_confirmation == " n " or purge_confirmation == " N " or purge_confirmation == " no " or purge_confirmation == " No " :
print ( " \n Exiting... \n " )
# Example:
# See purge_room_to_timestamp()
2023-07-26 15:39:48 -04:00
def get_block_status ( preset_internal_ID ) :
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of a room to examine if it ' s blocked (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
else :
internal_ID = preset_internal_ID
url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/rooms/ { internal_ID } /block "
headers = { " Authorization " : f " Bearer { hardcoded_variables . access_token } " }
response = requests . get ( url , headers = headers , verify = True )
# Ensure the request was successful
if response . status_code == 200 :
block_status = json . loads ( response . text ) [ ' block ' ]
else :
print ( f " Error: Unable to fetch block status for room { internal_ID } " )
block_status = None
return block_status
# Example:
# $ curl -X GET -H 'Authorization: Bearer ACCESS_TOKEN' 'https://matrix.perthchat.org/_synapse/admin/v1/rooms/!IdieserRBwPdaCGYuKk:matrix.org/block'
# {"block":false}
def set_block_status ( preset_internal_ID , block ) :
if preset_internal_ID == ' ' :
internal_ID = input ( " \n Enter the internal id of a room to block/unblock (Example: !OLkDvaYjpNrvmwnwdj:matrix.org): " )
else :
internal_ID = preset_internal_ID
url = f " https:// { hardcoded_variables . homeserver_url } /_synapse/admin/v1/rooms/ { internal_ID } /block "
headers = { " Authorization " : f " Bearer { hardcoded_variables . access_token } " , " Content-Type " : " application/json " }
data = { " block " : block }
response = requests . put ( url , headers = headers , json = data , verify = True )
# Ensure the request was successful
if response . status_code == 200 :
block_status = json . loads ( response . text ) [ ' block ' ]
if block_status == block and block == True :
print ( f " Successfully blocked room { internal_ID } " )
elif block_status == block and block == False :
print ( f " Successfully unblocked room { internal_ID } " )
else :
print ( f " Failed to set block status for room { internal_ID } to { block } " )
else :
print ( f " Error: Unable to set block status for room { internal_ID } " )
# Example:
#$ curl -X PUT -H 'Authorization: Bearer ACCESS_TOKEN' -H 'Content-Type: application/json' -d '{"block": true}' 'https://matrix.perthchat.org/_synapse/admin/v1/rooms/!UQEvAyhSqHxohkIyvm:perthchat.org/block'
#{"block":true}