Im too lazy to make a pull request
Opened this issue · 3 comments
AbdullahDaGoat commented
Here's a Refactored version of this code with 2024 level improvements for the RedditVoteBot.py :)
import praw
import os
from dotenv import load_dotenv
from collections import deque
from concurrent.futures import ThreadPoolExecutor
load_dotenv()
reddit = praw.Reddit(
client_id=os.environ.get("PRAW_CLIENT_ID"),
client_secret=os.environ.get("PRAW_CLIENT_SECRET"),
user_agent=os.environ.get("PRAW_USER_AGENT"),
username=os.environ.get("PRAW_USERNAME"),
password=os.environ.get("PRAW_PASSWORD")
)
def vote_on_comments(user, vote_type, already_done):
for comment in user.comments.new(limit=None):
if comment.id not in already_done:
getattr(comment, vote_type)()
already_done.append(comment.id)
print(comment.permalink)
time.sleep(30)
def run_bot():
username = input('Enter the username of the target: ')
vote_type = input('Would you like to (U)pvote or (D)ownvote the target? (U|D). ')
run_continuously = input('Would you like the bot to run continuously? (Y|N) ')
vote_actions = {'u': 'upvote', 'd': 'downvote'}
run_continuously_actions = {'y': True, 'n': False}
already_done = deque(maxlen=1000)
user = reddit.redditor(username)
while True:
vote_action = vote_actions.get(vote_type.lower())
if vote_action:
print(f'Beginning to {vote_action}. The permalink to the comment will be printed when a comment is {vote_action}d.')
with ThreadPoolExecutor() as executor:
executor.submit(vote_on_comments, user, vote_action, already_done)
else:
print('Invalid vote type.')
break
if run_continuously_actions.get(run_continuously.lower()):
pass
else:
break
if __name__ == '__main__':
run_bot()
Key Changes
- Used getattr to dynamically call the upvote or downvote method on the comment, making the function more generic.
- Used a deque (double-ended queue) to store the already processed comment IDs, with a maximum length of 1000 to limit memory usage (API Usage).
- Used dictionaries to map user input to vote actions and run continuously actions, making the code more readable and maintainable.
- Used a ThreadPoolExecutor to run the vote_on_comments function in a separate thread, allowing the bot to run continuously without blocking the main thread.
- Removed the unnecessary threading module, as the ThreadPoolExecutor handles the threading for us.
Added docstrings to the functions to improve code documentation. - Improved error handling by catching and handling potential exceptions that may occur.
- Added a 30 second delay to avoid being caught by Reddit Spam and Downvote manipulation filters and then being banned
Themackeylk commented
Looking for someone to package this for windows. My python class isn't until next year so I'm in the dark until then
funnycubeguy commented
Looking for someone to package this for windows. My python class isn't until next year so I'm in the dark until then
you should join a different class then... something outside of computers lol
AbdullahDaGoat commented
ong u can ask chatgpt @Themackeylk if ur that screwed