-
Notifications
You must be signed in to change notification settings - Fork 0
/
redditmonitor.py
88 lines (78 loc) · 3.41 KB
/
redditmonitor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import threading
from sys import exit
from time import sleep
import praw
import imagedownloader
from textdetector import TextDetector
class RedditMonitor:
__slots__ = ["reddit", "config", "posts_thread", "inbox_thread"]
def __init__(self, config):
self.config = config
self.reddit = praw.Reddit()
def _safe_thread(self, target):
while True:
try:
target()
except:
self.config.logger.exception("Error occured in safe thread!")
sleep(30)
# Safe as in just logs exceptions and restarts
# (won't crash when reddit goes down, etc)
def start_safe_thread(self, target):
thread = threading.Thread(target=self._safe_thread,
kwargs={'target': target})
thread.start()
return thread
def start_monitors(self):
self.config.logger.debug("Starting monitors!")
if self.config.remove:
self.posts_thread = self.start_safe_thread(self.posts_monitor_loop)
if self.config.human_review:
self.inbox_thread = self.start_safe_thread(self.inbox_monitor_loop)
self.config.logger.debug("Monitors started!")
def inbox_monitor_loop(self):
stream = praw.models.util.stream_generator(self.reddit.inbox.unread)
for reply in stream:
self.config.logger.debug(f"Messaged by {reply.author}!")
if not isinstance(reply, praw.models.Comment):
continue
# Because reply.is_submitter is not avaiable from inbox.
if reply.submission.author != reply.author:
continue
if not reply.parent().stickied:
continue
self.config.logger.info(f"{reply.submission.id} removal disputed!")
report = str(self.config.human_review_report).format(
username=reply.author.name)
reply.parent().report(report[:100])
reply.mark_read()
self.config.logger.debug("Reported.")
self.config.logger.warn("Inbox monitor loop has ended!")
def posts_monitor_loop(self):
subreddit = self.reddit.subreddit("mod")
for post in subreddit.stream.submissions():
self.config.logger.debug("New post: " + post.permalink)
if post.is_self or post.approved:
continue
image = imagedownloader.DownloadImage(post.url)
if image is None:
self.config.logger.debug(f"Got no image from: {post.url}")
continue
textdetector = TextDetector(image)
if not textdetector.has_text():
self.config.logger.debug("Text not found in image.")
continue
self.config.logger.info(
"Removing {0}, text found: {1}".format(
post.permalink, textdetector.get_text()))
self.config.logger.debug(textdetector._image_data)
post.mod.remove()
reason = str(self.config.removal_reason).format(
username=post.author.name,
subreddit=post.subreddit.display_name,
post_id=post.id,
text=", ".join(textdetector.get_text()))
reply = post.reply(reason)
reply.mod.distinguish(sticky=True)
self.config.logger.debug(post.permalink + " has been removed!")
self.config.logger.warn("Posts monitor loop has ended!")