Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- LICENCE = "WTFPL", "http://www.wtfpl.net/about/"
- VERSION = "v0.1.5"
- print("Hello, Reddit!")
- print("VirtueTron9000 {0} (c) CrashARuntimeToday@outlook.com".format(VERSION))
- import pickle
- import praw
- from datetime import datetime, timedelta
- from math import ceil
- from time import sleep
- reddit = praw.Reddit(client_id="VirtueTron9000",
- client_secret="🤖🤡🍆💯™",
- username="SignalAVirtueToday",
- password="https://youtu.be/RCVJ7bujnSc",
- user_agent="VirtueTron 9000 {0}".format(VERSION))
- class Tracker:
- def __init__(self, name, good_karma, bad_karma):
- self.name = name
- self.smv = None
- self.scan_count = 0
- self.next_refresh = None
- self.update(good_karma, bad_karma)
- def update(self, good_karma, bad_karma):
- self.good_karma = good_karma
- self.bad_karma = bad_karma
- self.scan_count += 1
- self.next_refresh = datetime.now() + timedelta(minutes=15)
- delay = 2
- def praw_fucked_up():
- if delay > 128:
- delay = 2
- sleep(delay)
- delay *= 2
- def calc_score(name):
- NAUGHTY_LIST = "TheRedPill", "MarriedRedPill", "ChristianRedPill", "MGTOW", "Braincels", "AskTRP", "AskMRP", "RedPillWomen", "RedPillWives", "CringeAnarchy", "The_Donald", "RPChristians"
- good_karma, bad_karma, good_count, bad_count = 0, 0, 0, 0
- for comment in reddit.redditor(name).comments.new(limit=100):
- if comment.subreddit.display_name == "TheBluePill":
- good_karma += comment.score - 1
- good_count += 1
- elif comment.subreddit.display_name in NAUGHTY_LIST and comment.score > 1:
- bad_karma -= comment.score - 1
- bad_count += 1
- if good_count > 0:
- good_karma /= good_count
- if bad_count > 0:
- bad_karma /= bad_count
- if bad_count > 20 and not any(reddit.subreddit("TheBluePill").banned(redditor=name)):
- print("User: {0} is vexatious ({1} posts in NAUGHTY_LIST)".format(name, bad_count))
- reddit.subreddit("TheBluePill").flair.set(name, "VEXATIOUS LITIGANT", "vexatious")
- print("Scanned user: {0}, good_karma: {1} ({2} comments), bad_karma: {3} ({4} comments)".format(name, good_karma, good_count, bad_karma, bad_count))
- return good_karma, bad_karma
- def update_flairs():
- IMMUTABLE_FLAIRS = "vanguard", "vexatious", "endorsedflair", "alpha", "betaasfuck", "feeemale", "purged"
- print("Recalculating SMV")
- i = 0
- total = len(users)
- for user in sorted(users.values(), key=lambda x: x.good_karma + x.bad_karma):
- i += 1
- user.smv = ceil((i / total) * 10)
- current_flair = None
- try:
- for flair in reddit.subreddit("TheBluePill").flair(redditor=user.name):
- current_flair = flair["flair_css_class"]
- except praw.exceptions.PRAWException: #Not sure why Reddit doesn't like this API call and too lazy to run Wireshark
- praw_fucked_up()
- continue
- if any(reddit.subreddit("TheBluePill").banned(redditor=user.name)):
- if current_flair != "purged":
- print("Marking user: {0} purged".format(user.name))
- reddit.subreddit("TheBluePill").flair.set(user.name, "PURGED", "purged")
- else:
- print("User: {0} is purged".format(user.name))
- else:
- print("User: {0}, SMV: {1}, score: {2} (current flair {3})".format(user.name, user.smv, user.good_karma + user.bad_karma, current_flair))
- if current_flair in IMMUTABLE_FLAIRS:
- print("Not changing user: {0} (immutable flair {1})".format(user.name, current_flair))
- elif current_flair != "hb{0}".format(user.smv):
- print("Updating user: {0} flair to hb{1}".format(user.name, user.smv))
- reddit.subreddit("TheBluePill").flair.set(user.name, "Hβ{0}".format(user.smv), "hb{0}".format(user.smv))
- if user.smv > 7:
- if user.name not in reddit.subreddit("TheBluePill").contributor():
- print("Adding approved contributor: {0}".format(user.name))
- reddit.subreddit("TheBluePill").contributor.add(user.name)
- elif user.smv < 4:
- if user.name in reddit.subreddit("TheBluePill").contributor():
- print("Removing approved contributor: {0}".format(user.name))
- reddit.subreddit("TheBluePill").contributor.remove(user.name)
- else:
- print("User: {0} still an HB{1}".format(user.name, user.smv))
- pickle.dump(users, open("users.pickle", "wb"))
- def botloop():
- next_recalc = datetime.now() + timedelta(minutes=20)
- for comment in reddit.subreddit("TheBluePill").stream.comments():
- if datetime.now() > next_recalc:
- update_flairs()
- print("Next refresh: {0}".format(next_recalc))
- if comment.author != None:
- name = comment.author.name
- if not name in users.keys():
- good_karma, bad_karma = calc_score(name)
- users[name] = Tracker(name, good_karma, bad_karma)
- print("New user: {0}".format(name))
- elif datetime.now() > users[name].next_refresh:
- good_karma, bad_karma = calc_score(name)
- users[name].update(good_karma, bad_karma)
- print("User: {0} scanned {1} times".format(name, users[name].scan_count))
- else:
- print("Skipping user:{0}, next refresh {1}".format(name, users[name].next_refresh))
- try:
- users = pickle.load(open("users.pickle", "rb"))
- print("Re-loading database")
- except IOError:
- users = {}
- print("I/O error accessing database, starting fresh")
- try:
- botloop()
- except praw.exceptions.PRAWException:
- praw_fucked_up()
- botloop()
- except KeyboardInterrupt:
- print("VirtuteTron going off-line")
- pickle.dump(users, open("users.pickle", "wb"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement