Advertisement
Guest User

VirtueTron9000 v0.2.1

a guest
Jun 28th, 2018
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.69 KB | None | 0 0
  1. #!/usr/bin/python
  2. LICENCE = "WTFPL", "http://www.wtfpl.net/about/"
  3. VERSION = "v0.2.1"
  4.  
  5. print("Hello, Reddit!")
  6. print("VirtueTron9000 {0} (c) CrashARuntimeToday@outlook.com".format(VERSION))
  7.  
  8. import pickle
  9. import praw, prawcore
  10. from datetime import datetime, timedelta
  11. from math import ceil
  12. from time import sleep
  13.  
  14.  
  15. reddit = praw.Reddit(client_id="VirtueTron9000",
  16.                      client_secret="🤖🤡🍆💯™",
  17.                      username="SignalAVirtueToday",
  18.                      password="https://youtu.be/RCVJ7bujnSc",
  19.                      user_agent="VirtueTron 9000 {0}".format(VERSION))
  20.  
  21. class Tracker:
  22.     def __init__(self, name, good_karma, bad_karma):
  23.         self.name = name
  24.         self.smv = None
  25.         self.scan_count = 0
  26.         self.next_refresh = None
  27.         self.update(good_karma, bad_karma)
  28.    
  29.     def update(self, good_karma, bad_karma):
  30.         self.good_karma = good_karma
  31.         self.bad_karma = bad_karma
  32.         self.scan_count += 1
  33.         self.next_refresh = datetime.now() + timedelta(minutes=15)
  34.  
  35. delay = 2
  36. def praw_fucked_up():
  37.     global delay
  38.     if delay > 128:
  39.         delay = 2
  40.     sleep(delay)
  41.     delay *= 2
  42.  
  43. def calc_score(name):
  44.     NAUGHTY_LIST = "TheRedPill", "MarriedRedPill", "ChristianRedPill", "MGTOW", "Braincels", "AskTRP", "AskMRP", "RedPillWomen", "RedPillWives", "CringeAnarchy", "The_Donald", "RPChristians"
  45.     good_karma, bad_karma, good_count, bad_count = 0, 0, 0, 0
  46.     for comment in reddit.redditor(name).comments.new(limit=100):
  47.         if comment.subreddit.display_name == "TheBluePill":
  48.             good_karma += comment.score - 1
  49.             good_count += 1
  50.         elif comment.subreddit.display_name in NAUGHTY_LIST and comment.score > 1:
  51.             bad_karma -= comment.score - 1
  52.             bad_count += 1
  53.     if good_count > 0:
  54.         good_karma /= good_count
  55.     if bad_count > 0:
  56.         bad_karma /= bad_count
  57.         if bad_count > 20 and not any(reddit.subreddit("TheBluePill").banned(redditor=name)):
  58.             print("User: {0} is vexatious ({1} posts in NAUGHTY_LIST)".format(name, bad_count))
  59.             reddit.subreddit("TheBluePill").flair.set(name, "VEXATIOUS LITIGANT", "vexatious")
  60.     print("Scanned user: {0}, good_karma: {1} ({2} comments), bad_karma: {3} ({4} comments)".format(name, good_karma, good_count, bad_karma, bad_count))
  61.     return good_karma, bad_karma
  62.  
  63. def update_flairs():
  64.     IMMUTABLE_FLAIRS = "vanguard", "vexatious", "endorsedflair", "alpha", "betaasfuck", "feeemale", "purged"
  65.     print("Recalculating SMV")
  66.     i = 0
  67.     total = len(users)
  68.     for user in sorted(users.values(), key=lambda x: x.good_karma + x.bad_karma):
  69.         i += 1
  70.         user.smv = ceil((i / total) * 10)
  71.         current_flair = None
  72.         try:
  73.             for flair in reddit.subreddit("TheBluePill").flair(redditor=user.name):
  74.                 current_flair = flair["flair_css_class"]
  75.         except prawcore.PrawcoreException:       #Not sure why Reddit doesn't like this API call and too lazy to run Wireshark
  76.             praw_fucked_up()
  77.             continue
  78.        
  79.  
  80.         if any(reddit.subreddit("TheBluePill").banned(redditor=user.name)):
  81.             if current_flair != "purged":
  82.                 print("Marking user: {0} purged".format(user.name))
  83.                 reddit.subreddit("TheBluePill").flair.set(user.name, "PURGED", "purged")
  84.             else:
  85.                 print("User: {0} is purged".format(user.name))
  86.         else:
  87.             print("User: {0}, SMV: {1}, score: {2} (current flair {3})".format(user.name, user.smv, user.good_karma + user.bad_karma, current_flair))
  88.  
  89.             if current_flair in IMMUTABLE_FLAIRS:
  90.                 print("Not changing user: {0} (immutable flair {1})".format(user.name, current_flair))
  91.             elif current_flair != "hb{0}".format(user.smv):
  92.                 print("Updating user: {0} flair to hb{1}".format(user.name, user.smv))
  93.                 reddit.subreddit("TheBluePill").flair.set(user.name, "Hβ{0}".format(user.smv), "hb{0}".format(user.smv))
  94.                 if user.smv > 7:
  95.                     if user.name not in reddit.subreddit("TheBluePill").contributor():
  96.                         print("Adding approved contributor: {0}".format(user.name))
  97.                         reddit.subreddit("TheBluePill").contributor.add(user.name)
  98.                 elif user.smv < 4:
  99.                     if user.name in reddit.subreddit("TheBluePill").contributor():
  100.                         print("Removing approved contributor: {0}".format(user.name))
  101.                         reddit.subreddit("TheBluePill").contributor.remove(user.name)
  102.             else:
  103.                 print("User: {0} still an HB{1}".format(user.name, user.smv))
  104.     pickle.dump(users, open("users.pickle", "wb"))
  105.  
  106. next_recalc = datetime.now() + timedelta(minutes=20)
  107. print("Next refresh: {0}".format(next_recalc))
  108. def botloop():
  109.     GOOD_FLAIRS = ["endorsedflair", "vanguard", "alpha", "betaasfuck", "feeemale"]
  110.     BAD_FLAIRS = ["purged", "vexatious"]
  111.     global next_recalc
  112.     for comment in reddit.subreddit("TheBluePill").stream.comments():
  113.         threat_level = comment.submission.link_flair_css_class
  114.         author_rank = comment.author_flair_css_class
  115.         if threat_level == "tllow" and author_rank not in GOOD_FLAIRS + ["hb{0}".format(x) for x in range(8,11)]:
  116.             #comment.remove()
  117.             print("Removing comment by {0} ({1}) on post '{2}' ({3}), SMV too low!".format(comment.author.name, comment.author_css_class, comment.submission.title, threat_level))
  118.         elif threat_level == "tlguarded" and author_rank not in GOOD_FLAIRS + ["hb{0}".format(x) for x in range(5,11)]:
  119.             #comment.remove()
  120.             print("Removing comment by {0} ({1}) on post '{2}' ({3}), SMV too low!".format(comment.author.name, comment.author_css_class, comment.submission.title, threat_level))
  121.         elif threat_level == "tlelevated" and author_rank in ["hb{0}".format(x) for x in range(1,4)] + BAD_FLAIRS:
  122.             #comment.remove()
  123.             print("Removing comment by {0} ({1}) on post '{2}' ({3}), SMV too low!".format(comment.author.name, comment.author_css_class, comment.submission.title, threat_level))
  124.         elif threat_level == "tlhigh" and comment.author_rank in BAD_FLAIRS:
  125.             #comment.remove()
  126.             print("Removing comment by {0} ({1}) on post '{2}' ({3}), SMV too low!".format(comment.author.name, comment.author_css_class, comment.submission.title, threat_level))
  127.  
  128.         if datetime.now() > next_recalc:
  129.             update_flairs()
  130.             next_recalc = datetime.now() + timedelta(minutes=20)
  131.             print("Next refresh: {0}".format(next_recalc))
  132.         if comment.author != None:
  133.             name = comment.author.name
  134.             if not name in users.keys():
  135.                 good_karma, bad_karma = calc_score(name)
  136.                 users[name] = Tracker(name, good_karma, bad_karma)
  137.                 print("New user: {0}".format(name))
  138.             elif datetime.now() > users[name].next_refresh:
  139.                 good_karma, bad_karma = calc_score(name)
  140.                 users[name].update(good_karma, bad_karma)
  141.                 print("User: {0} scanned {1} times".format(name, users[name].scan_count))
  142.             else:
  143.                 print("Skipping user:{0}, next refresh {1}".format(name, users[name].next_refresh))
  144.  
  145.  
  146. try:
  147.     users = pickle.load(open("users.pickle", "rb"))
  148.     print("Re-loading database")
  149. except IOError:
  150.     users = {}
  151.     print("I/O error accessing database, starting fresh")
  152.  
  153. try:
  154.     botloop()
  155. except prawcore.PrawcoreException:
  156.     praw_fucked_up()
  157.     botloop()
  158. except KeyboardInterrupt:
  159.     print("VirtuteTron going off-line")
  160.     pickle.dump(users, open("users.pickle", "wb"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement