Ejemplo n.º 1
0
 def setUpClass(cls):
     return
     print "Creating Reddit connection as", cfg.REDDIT_USERNAME
     print "user agent", cfg.REDDIT_USER_AGENT
     cls.r = praw.Reddit(user_agent=cfg.REDDIT_USER_AGENT)
     cls.r.login(cfg.REDDIT_USERNAME, cfg.REDDIT_PASSWORD)
     cls.comment_parser = MarkupParser()
Ejemplo n.º 2
0
 def __init__(self, params=None):
     self.f = firebase_db.FirebaseDb()
     self.r = praw.Reddit(user_agent=cfg.REDDIT_USER_AGENT)
     self.parser = MarkupParser()
     self.stat = OperatingStats()
     self.COMMENT_DB_DATA_PROPERTIES = ["id", "subreddit_id", "link_id"]
Ejemplo n.º 3
0
class ParenthesesBot(object):
    f = None
    r = None
    parser = None

    stat = None

    COMMENT_DB_DATA_PROPERTIES = None

    def __init__(self, params=None):
        self.f = firebase_db.FirebaseDb()
        self.r = praw.Reddit(user_agent=cfg.REDDIT_USER_AGENT)
        self.parser = MarkupParser()
        self.stat = OperatingStats()
        self.COMMENT_DB_DATA_PROPERTIES = ["id", "subreddit_id", "link_id"]

    def login(self):
        self.r.login(cfg.REDDIT_USERNAME, cfg.REDDIT_PASSWORD)

    def register_comment(self, comment):
        self.stat.unbalanced += 1

        # Check already processed
        if self.f.check_already_processed(comment.id):
            return ProcessingResult.ALREADY_PROCESSED

        # Check status
        status = self.f.get_record_status(comment.id)
        if status <> firebase_db.RECORD_STATUS_NEW:
            self.stat.already_registered += 1
            return ProcessingResult.ALREADY_REGISTERED

        # Register on firebase and send data
        self.f.set_record_status(comment.id,
                                 firebase_db.RECORD_STATUS_RESERVED)
        self.f.set_record_data(comment.id, self.build_comment_db_data(comment))

        if cfg.AUTO_CONFIRM:
            self.f.set_record_status(comment.id,
                                     firebase_db.RECORD_STATUS_CONFIRMED)
        else:
            self.f.set_record_status(comment.id,
                                     firebase_db.RECORD_STATUS_REGISTERED)

        self.stat.registered += 1
        return ProcessingResult.REGISTERED

    def analyze_comment(self, comment, stats=True):
        # Primary analisys
        if stats:
            self.stat.analyzed += 1

        if not helper.is_correctly_formatted(comment):
            return ProcessingResult.BAD_FORMAT

        if not helper.should_be_parsed(comment.body):
            return ProcessingResult.NOT_NEEDED

        if not helper.can_be_parsed(comment.body):
            return ProcessingResult.NOT_PARSABLE

        # Parse comment
        parsed = self.parser.parse(comment.body_html)
        if stats:
            self.stat.parsed += 1

        # Check complexity
        if cfg.CHECK_COMPLEXITY:
            complexity = helper.estimate_complexity(parsed.parsable)
            if complexity > cfg.MAX_COMPLEXITY:
                if stats:
                    self.stat.too_complex += 1
                return ProcessingResult.TOO_COMPLEX

        # Check unmatched parenthesis
        if not self.parser.detect_unbalance(parsed.parsable):
            return ProcessingResult.CORRECTLY_CLOSED

        # Check subreddit ban
        if str(comment.subreddit) in cfg.BANNED_FROM:
            return ProcessingResult.BANNED_FROM_SUBREDDIT

        # Check author
        if helper.comment_is_by_me(comment):
            return ProcessingResult.OWN_COMMENT

        if comment.author.name in cfg.IGNORE_USERS:
            return ProcessingResult.AUTHOR_BLOCKED

        if comment.author.name.lower().endswith("bot"):
            return ProcessingResult.AUTHOR_BLOCKED

        # Found unmatched
        return ProcessingResult.UNBALANCED

    def build_comment_db_data(self, comment):
        vs = helper.filter_object_properties(comment,
                                             self.COMMENT_DB_DATA_PROPERTIES)
        vs["subreddit"] = str(comment.subreddit)
        vs["sub_url"] = str(comment.submission.url)
        vs["sub_perma"] = str(comment.submission.permalink)
        return vs

    def send_comment(self, comment_id):
        c_data = self.f.get_record_data(comment_id)
        c_url = c_data["sub_perma"] + "" + c_data["id"]
        comments = self.r.get_submission(c_url).comments

        if not len(comments):
            self.stat.comment_aborted += 1
            self.f.delete_record(comment_id,
                                 firebase_db.RECORD_STATUS_CONFIRMED)
            return ProcessingResult.CORRECTION_ABORTED

        comment = comments[0]

        if self.analyze_comment(comment,
                                stats=False) <> ProcessingResult.UNBALANCED:
            self.stat.comment_aborted += 1
            self.f.delete_record(comment_id,
                                 firebase_db.RECORD_STATUS_CONFIRMED)
            return ProcessingResult.CORRECTION_ABORTED

        self.f.set_record_status(comment.id,
                                 firebase_db.RECORD_STATUS_PROCESSED)

        try:
            comment.reply(self.get_corrective_test(comment))
            self.stat.commented += 1
            self.f.delete_record(comment_id,
                                 firebase_db.RECORD_STATUS_CONFIRMED)
        except Exception as e:
            self.f.set_record_status(comment.id,
                                     firebase_db.RECORD_STATUS_ERROR)
            self.f.add_exception(comment.id, e)
            return ProcessingResult.ERROR

        return ProcessingResult.CORRECTED

    def get_corrective_test(self, comment):
        c_text = ")"

        tmpl = template.load("correction")
        tmpl["correction_text"] = c_text
        tmpl["xkcd_link_text"] = cfg.COMMENT_XKCD_COMIC_LINK_TEXT
        tmpl["xkcd_link"] = cfg.COMMENT_XKCD_COMIC_LINK
        tmpl["bottom_text"] = cfg.COMMENT_BOTTOM_TEXT
        tmpl["pre_link_text"] = cfg.COMMENT_PRE_LINK_TEXT

        return tmpl.built()
 def __init__(self, params=None):
     self.f = firebase_db.FirebaseDb()
     self.r = praw.Reddit(user_agent=cfg.REDDIT_USER_AGENT)
     self.parser = MarkupParser()
     self.stat = OperatingStats()
     self.COMMENT_DB_DATA_PROPERTIES = ["id", "subreddit_id", "link_id"]
class ParenthesesBot(object):
    f = None
    r = None
    parser = None
    
    stat = None
    
    COMMENT_DB_DATA_PROPERTIES = None
    
    def __init__(self, params=None):
        self.f = firebase_db.FirebaseDb()
        self.r = praw.Reddit(user_agent=cfg.REDDIT_USER_AGENT)
        self.parser = MarkupParser()
        self.stat = OperatingStats()
        self.COMMENT_DB_DATA_PROPERTIES = ["id", "subreddit_id", "link_id"]
        
    def login(self):
        self.r.login(cfg.REDDIT_USERNAME, cfg.REDDIT_PASSWORD)
        
    def register_comment(self, comment):
        self.stat.unbalanced += 1
        
        # Check already processed
        if self.f.check_already_processed(comment.id):
            return ProcessingResult.ALREADY_PROCESSED
        
        # Check status
        status = self.f.get_record_status(comment.id)
        if status <> firebase_db.RECORD_STATUS_NEW:
            self.stat.already_registered += 1
            return ProcessingResult.ALREADY_REGISTERED
        
        # Register on firebase and send data
        self.f.set_record_status(comment.id, firebase_db.RECORD_STATUS_RESERVED)
        self.f.set_record_data(comment.id, self.build_comment_db_data(comment))
        
        if cfg.AUTO_CONFIRM:
            self.f.set_record_status(comment.id, firebase_db.RECORD_STATUS_CONFIRMED)
        else:
            self.f.set_record_status(comment.id, firebase_db.RECORD_STATUS_REGISTERED)
        
        self.stat.registered += 1
        return ProcessingResult.REGISTERED
        
    def analyze_comment(self, comment, stats=True):
        # Primary analisys
        if stats:
            self.stat.analyzed += 1
        
        if not helper.is_correctly_formatted(comment):
            return ProcessingResult.BAD_FORMAT
        
        if not helper.should_be_parsed(comment.body):
            return ProcessingResult.NOT_NEEDED
        
        if not helper.can_be_parsed(comment.body):
            return ProcessingResult.NOT_PARSABLE
        
        # Parse comment
        parsed = self.parser.parse(comment.body_html)   
        if stats:
            self.stat.parsed += 1     
        
        # Check complexity
        if cfg.CHECK_COMPLEXITY:
            complexity = helper.estimate_complexity(parsed.parsable)
            if complexity > cfg.MAX_COMPLEXITY:
                if stats:
                    self.stat.too_complex += 1
                return ProcessingResult.TOO_COMPLEX
        
        # Check unmatched parenthesis
        if not self.parser.detect_unbalance(parsed.parsable):
            return ProcessingResult.CORRECTLY_CLOSED

        # Check subreddit ban
        if str(comment.subreddit) in cfg.BANNED_FROM:
            return ProcessingResult.BANNED_FROM_SUBREDDIT

        # Check author
        if helper.comment_is_by_me(comment):
            return ProcessingResult.OWN_COMMENT
        
        if comment.author.name in cfg.IGNORE_USERS:
            return ProcessingResult.AUTHOR_BLOCKED
        
        if comment.author.name.lower().endswith("bot"):
            return ProcessingResult.AUTHOR_BLOCKED

        # Found unmatched
        return ProcessingResult.UNBALANCED

    def build_comment_db_data(self, comment):
        vs = helper.filter_object_properties(comment, self.COMMENT_DB_DATA_PROPERTIES)
        vs["subreddit"] = str(comment.subreddit)
        vs["sub_url"] = str(comment.submission.url)
        vs["sub_perma"] = str(comment.submission.permalink)
        return vs
    
    def send_comment(self, comment_id):
        c_data = self.f.get_record_data(comment_id)
        c_url = c_data["sub_perma"] + "" + c_data["id"]
        comments = self.r.get_submission(c_url).comments
        
        if not len(comments):
            self.stat.comment_aborted += 1
            self.f.delete_record(comment_id, firebase_db.RECORD_STATUS_CONFIRMED)
            return ProcessingResult.CORRECTION_ABORTED

        comment = comments[0]

        if self.analyze_comment(comment, stats=False) <> ProcessingResult.UNBALANCED:
            self.stat.comment_aborted += 1
            self.f.delete_record(comment_id, firebase_db.RECORD_STATUS_CONFIRMED)
            return ProcessingResult.CORRECTION_ABORTED
        
        self.f.set_record_status(comment.id, firebase_db.RECORD_STATUS_PROCESSED)
        
        try:
            comment.reply(self.get_corrective_test(comment))
            self.stat.commented += 1
            self.f.delete_record(comment_id, firebase_db.RECORD_STATUS_CONFIRMED)
        except Exception as e:
            self.f.set_record_status(comment.id, firebase_db.RECORD_STATUS_ERROR)
            self.f.add_exception(comment.id, e)
            return ProcessingResult.ERROR
        
        return ProcessingResult.CORRECTED
    
    def get_corrective_test(self, comment):
        c_text = ")"
        
        tmpl = template.load("correction")
        tmpl["correction_text"] = c_text
        tmpl["xkcd_link_text"] = cfg.COMMENT_XKCD_COMIC_LINK_TEXT
        tmpl["xkcd_link"] = cfg.COMMENT_XKCD_COMIC_LINK
        tmpl["bottom_text"] = cfg.COMMENT_BOTTOM_TEXT
        tmpl["pre_link_text"] = cfg.COMMENT_PRE_LINK_TEXT
        
        return tmpl.built()