157 lines
5.5 KiB
Python
Executable File
157 lines
5.5 KiB
Python
Executable File
# discord_tools/scripts/message_deletor.py
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
import time
|
|
|
|
# Add the parent directory to the Python path
|
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
project_root = os.path.dirname(os.path.dirname(script_dir))
|
|
sys.path.insert(0, project_root)
|
|
|
|
from discord_tools.config.settings import MAX_MESSAGES_PER_REQUEST, ERROR_MESSAGES
|
|
from discord_tools.utils.api_utils import make_discord_request, get_user_id
|
|
|
|
def search_messages_in_channel(channel_id, user_id):
|
|
"""
|
|
Search for messages from a specific user in a channel.
|
|
|
|
:param channel_id: The ID of the channel to search
|
|
:param user_id: The ID of the user whose messages to search for
|
|
:return: List of message objects
|
|
"""
|
|
messages = []
|
|
offset = 0
|
|
while True:
|
|
endpoint = f'/channels/{channel_id}/messages/search?author_id={user_id}&offset={offset}'
|
|
response = make_discord_request('GET', endpoint)
|
|
|
|
if not response:
|
|
print(f"Failed to search messages in channel {channel_id}")
|
|
break
|
|
|
|
data = response.json()
|
|
total_results = data.get('total_results', 0)
|
|
messages.extend(msg for msg_group in data.get('messages', []) for msg in msg_group)
|
|
print(f"Found {len(messages)} messages. Total: {len(messages)}/{total_results}")
|
|
|
|
if len(messages) >= total_results or not data.get('messages'):
|
|
break
|
|
|
|
offset += MAX_MESSAGES_PER_REQUEST
|
|
time.sleep(1) # Small delay between searches
|
|
|
|
return messages
|
|
|
|
def delete_message(channel_id, message_id):
|
|
"""
|
|
Delete a specific message.
|
|
|
|
:param channel_id: The ID of the channel containing the message
|
|
:param message_id: The ID of the message to delete
|
|
:return: True if deletion was successful, False otherwise
|
|
"""
|
|
endpoint = f'/channels/{channel_id}/messages/{message_id}'
|
|
response = make_discord_request('DELETE', endpoint)
|
|
|
|
if response:
|
|
print(f"Successfully deleted message {message_id} in channel {channel_id}")
|
|
return True
|
|
else:
|
|
print(f"Failed to delete message {message_id} in channel {channel_id}")
|
|
return False
|
|
|
|
def delete_messages_search_method(channel_id, user_id):
|
|
"""
|
|
Delete all messages from a specific user in a channel using the search method.
|
|
|
|
:param channel_id: The ID of the channel to delete messages from
|
|
:param user_id: The ID of the user whose messages to delete
|
|
:return: Number of messages deleted
|
|
"""
|
|
print(f"Deleting messages using search method in channel {channel_id}")
|
|
messages = search_messages_in_channel(channel_id, user_id)
|
|
messages_deleted = 0
|
|
|
|
for message in messages:
|
|
if delete_message(channel_id, message['id']):
|
|
messages_deleted += 1
|
|
|
|
print(f"Deleted {messages_deleted} messages in channel {channel_id}")
|
|
return messages_deleted
|
|
|
|
def delete_messages_bulk_method(channel_id, user_id):
|
|
"""
|
|
Delete all messages from a specific user in a channel using the bulk method.
|
|
|
|
:param channel_id: The ID of the channel to delete messages from
|
|
:param user_id: The ID of the user whose messages to delete
|
|
:return: Number of messages deleted
|
|
"""
|
|
print(f"Deleting messages using bulk method in channel {channel_id}")
|
|
messages_deleted = 0
|
|
last_message_id = None
|
|
|
|
while True:
|
|
endpoint = f'/channels/{channel_id}/messages?limit=100'
|
|
if last_message_id:
|
|
endpoint += f'&before={last_message_id}'
|
|
|
|
response = make_discord_request('GET', endpoint)
|
|
|
|
if not response:
|
|
print(f"Failed to fetch messages in channel {channel_id}")
|
|
break
|
|
|
|
messages = response.json()
|
|
if not messages:
|
|
print(f"No more messages to delete in channel {channel_id}")
|
|
break
|
|
|
|
user_messages = [msg for msg in messages if msg['author']['id'] == user_id]
|
|
for message in user_messages:
|
|
if delete_message(channel_id, message['id']):
|
|
messages_deleted += 1
|
|
|
|
last_message_id = messages[-1]['id']
|
|
time.sleep(1) # Small delay between bulk fetches
|
|
|
|
print(f"Deleted {messages_deleted} messages in channel {channel_id}")
|
|
return messages_deleted
|
|
|
|
def main():
|
|
user_id = get_user_id()
|
|
if not user_id:
|
|
print(ERROR_MESSAGES["api_error"])
|
|
return
|
|
|
|
print(f"User ID: {user_id}")
|
|
|
|
while True:
|
|
print("\nChoose a deletion method:")
|
|
print("1. Search method (more thorough, but slower)")
|
|
print("2. Bulk method (faster, but might miss some messages in large channels)")
|
|
print("3. Exit")
|
|
|
|
choice = input("Enter your choice (1, 2, or 3): ").strip()
|
|
|
|
if choice == '3':
|
|
print("Exiting the program.")
|
|
break
|
|
elif choice not in ['1', '2']:
|
|
print("Invalid choice. Please enter 1, 2, or 3.")
|
|
continue
|
|
|
|
delete_method = delete_messages_search_method if choice == '1' else delete_messages_bulk_method
|
|
|
|
while True:
|
|
channel_id = input("Enter a channel ID to delete messages from (or press Enter to go back to method selection): ").strip()
|
|
if not channel_id:
|
|
break
|
|
delete_method(channel_id, user_id)
|
|
|
|
print("Message deletion process completed.")
|
|
|
|
if __name__ == "__main__":
|
|
main() |