def perform_actions(self, item, data): """Execute all the rule's actions against the item.""" for key, target in self.targets.iteritems(): target_item = self.get_target_item(item, data, key) target.perform_actions(target_item, data) if self.comment: comment = self.build_message(self.comment, item, data, disclaimer=True) # TODO: shouldn't have to do all this manually if isinstance(item, Comment): link = data["link"] parent_comment = item else: link = item parent_comment = None new_comment, inbox_rel = Comment._new( ACCOUNT, link, parent_comment, comment, None) new_comment.distinguished = "yes" new_comment._commit() queries.queue_vote(ACCOUNT, new_comment, True, None) queries.new_comment(new_comment, inbox_rel) g.stats.simple_event("automoderator.comment") if self.modmail: message = self.build_message(self.modmail, item, data, permalink=True) subject = replace_placeholders( self.modmail_subject, data, self.matches) subject = subject[:100] new_message, inbox_rel = Message._new(ACCOUNT, data["subreddit"], subject, message, None) new_message.distinguished = "yes" new_message._commit() queries.new_message(new_message, inbox_rel) g.stats.simple_event("automoderator.modmail") if self.message and not data["author"]._deleted: message = self.build_message(self.message, item, data, disclaimer=True, permalink=True) subject = replace_placeholders( self.message_subject, data, self.matches) subject = subject[:100] new_message, inbox_rel = Message._new(ACCOUNT, data["author"], subject, message, None) queries.new_message(new_message, inbox_rel) g.stats.simple_event("automoderator.message") PerformedRulesByThing.mark_performed(item, self)
def apply_to_item(self, item): # fetch supplemental data to use throughout data = {} data["item"] = item data["subreddit"] = item.subreddit_slow author = item.author_slow if not author._deleted: data["author"] = author else: data["author"] = DeletedUser() if isinstance(item, Comment): data["link"] = Link._byID(item.link_id, data=True) link_author = data["link"].author_slow if not link_author._deleted: data["link_author"] = link_author else: data["link_author"] = DeletedUser() data["is_submitter"] = author == link_author # get the list of rule IDs that have already been performed already_performed = PerformedRulesByThing.get_already_performed(item) # stop checking removal rules as soon as one triggers for rule in self.removal_rules: if rule.is_unrepeatable and rule.unique_id in already_performed: continue if rule.check_item(item, data): rule.perform_actions(item, data) break # check all other rules, regardless of how many trigger for rule in self.nonremoval_rules: if rule.is_unrepeatable and rule.unique_id in already_performed: continue if rule.check_item(item, data): rule.perform_actions(item, data)