def get_commands(reddit):
     commands = []
     try:
         messages = CommandHandler.get_dev_messages(reddit)
         for message in messages:
             subject, body = inbox.format_subject(message.subject.lower()), message.body.lower()
             if body in CommandHandler.run or subject in CommandHandler.run:
                 Logger.log('--------- Bot resumed by developer ---------', Color.GREEN)
                 message.reply('Bot will be resumed')
                 commands.append(CommandHandler.RUN)
                 message.mark_as_read()
             elif body in CommandHandler.pause or subject in CommandHandler.pause:
                 Logger.log('--------- Bot paused by developer ---------', Color.YELLOW)
                 message.reply('Bot will be paused')
                 commands.append(CommandHandler.PAUSE)
                 message.mark_as_read()
             elif body in CommandHandler.kill or subject in CommandHandler.kill:
                 Logger.log('--------- Bot killed by developer ---------', Color.RED)
                 message.reply('Bot will be killed')
                 commands.append(CommandHandler.KILL)
                 message.mark_as_read()
             elif body in CommandHandler.test or subject in CommandHandler.test:
                 Logger.log('--------- Bot is being tested ---------', Color.GREEN)
                 message.reply('Bot is being tested')
                 commands.append(CommandHandler.TEST)
                 message.mark_as_read()
     except:
         raise CommandHandlerException('Error occurred reading commands')
     return commands
Beispiel #2
0
 def parse_message(self):
     token, ttype, index = self.get_token()
     if ttype == TokenType.STATISTICS:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_STATISTICS
         token, ttype, index = self.get_token()
         if ttype != TokenType.EOF:
             raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
     elif ttype == TokenType.HELP:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_HELP
         token, ttype, index = self.get_token()
         if ttype != TokenType.EOF:
             raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
     elif ttype == TokenType.SUBSCRIPTIONS:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_GET_SUBSCRIPTIONS
         token, ttype, index = self.get_token()
         if ttype != TokenType.EOF:
             raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
     elif ttype == TokenType.UNSUBSCRIBE:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_UNSUBSCRIBE
         token, ttype, index = self.get_token()
         # Ignore the # symbol
         if ttype == TokenType.NUM_SYMBOL:
             token, ttype, index = self.get_token()
         if ttype == TokenType.ALL:
             self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_UNSUBSCRIBE_ALL
             token, ttype, index = self.get_token()
             if ttype != TokenType.EOF:
                 raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
         elif ttype == TokenType.NUM:
             self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_UNSUBSCRIBE_FROM_NUM
             self.data[MessageParser.KEY_PAYLOAD] = token
             token, ttype, index = self.get_token()
             if ttype != TokenType.EOF:
                 raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
         elif ttype != TokenType.EOF:
             raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
         else:
             self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_UNSUBSCRIBE
     elif ttype == TokenType.SUBSCRIBE:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_SUBSCRIBE
         token, ttype, index = self.get_token()
         if ttype == TokenType.EOF:
             subscription = SubscriptionParser(format_subject(self.message.subject))
             self.data[MessageParser.KEY_PAYLOAD] = subscription.get_data()
         else:
             token, ttype, index = self.unget_token()
             subscription = SubscriptionParser(self.message.body[index:])
             self.data[MessageParser.KEY_PAYLOAD] = subscription.get_data()
     elif ttype == TokenType.FEEDBACK:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_FEEDBACK
         self.data[MessageParser.KEY_PAYLOAD] = str(self.message.body)
     elif ttype == TokenType.EDIT:
         # edits = EditParser(self.message[index:])
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_EDIT
         # TODO Add edit stuff here
     else:
         print(traceback.format_exc())
         raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
 def parse_message(self):
     token, ttype, index = self.get_token()
     if ttype == TokenType.STATISTICS:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_STATISTICS
         token, ttype, index = self.get_token()
         if ttype != TokenType.EOF:
             raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
     elif ttype == TokenType.HELP:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_HELP
         token, ttype, index = self.get_token()
         if ttype != TokenType.EOF:
             raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
     elif ttype == TokenType.SUBSCRIPTIONS:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_GET_SUBSCRIPTIONS
         token, ttype, index = self.get_token()
         if ttype != TokenType.EOF:
             raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
     elif ttype == TokenType.UNSUBSCRIBE:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_UNSUBSCRIBE
         token, ttype, index = self.get_token()
         if ttype == TokenType.ALL:
             self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_UNSUBSCRIBE_ALL
             token, ttype, index = self.get_token()
             if ttype != TokenType.EOF:
                 raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
         elif ttype == TokenType.NUM:
             self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_UNSUBSCRIBE_FROM_NUM
             self.data[MessageParser.KEY_PAYLOAD] = token
             token, ttype, index = self.get_token()
             if ttype != TokenType.EOF:
                 raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
         elif ttype != TokenType.EOF:
             raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
         else:
             self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_UNSUBSCRIBE
     elif ttype == TokenType.SUBSCRIBE:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_SUBSCRIBE
         token, ttype, index = self.get_token()
         if ttype == TokenType.EOF:
             subscription = SubscriptionParser(format_subject(self.message.subject))
             self.data[MessageParser.KEY_PAYLOAD] = subscription.get_data()
         else:
             token, ttype, index = self.unget_token()
             subscription = SubscriptionParser(self.message.body[index:])
             self.data[MessageParser.KEY_PAYLOAD] = subscription.get_data()
     elif ttype == TokenType.FEEDBACK:
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_FEEDBACK
         self.data[MessageParser.KEY_PAYLOAD] = str(self.message.body)
     elif ttype == TokenType.EDIT:
         # edits = EditParser(self.message[index:])
         self.data[MessageParser.KEY_ACTION] = MessageParser.ACTION_EDIT
         # TODO Add edit stuff here
     else:
         print(traceback.format_exc())
         raise MessageParserException(MessageParserException.MALFORMED_REQUEST)
Beispiel #4
0
 def handle_messages(self, unread_messages):
     for message in unread_messages:
         subject = inbox.format_subject(message.subject).lower()
         author = str(message.author).lower()
         if author == 'reddit':
             self.handle_reddit_message(message)
         if subject == 'username mention':
             self.handle_username_mention(message)
         elif subject == 'post reply':
             self.handle_post_reply(message)
         else:
             self.handle_normal_message(message)
Beispiel #5
0
 def get_commands(reddit, bot_name):
     commands = []
     try:
         messages = CommandHandler.get_dev_messages(reddit)
         for message in messages:
             subject, body = inbox.format_subject(
                 message.subject.lower()), message.body.lower()
             if body in CommandHandler.run or subject in CommandHandler.run:
                 Logger.log('--------- Bot resumed by developer ---------',
                            Color.GREEN)
                 message.reply('Bot will be resumed')
                 commands.append(CommandHandler.RUN)
                 message.mark_read()
             elif body in CommandHandler.pause or subject in CommandHandler.pause:
                 Logger.log('--------- Bot paused by developer ---------',
                            Color.YELLOW)
                 message.reply('Bot will be paused')
                 commands.append(CommandHandler.PAUSE)
                 message.mark_read()
             elif body in CommandHandler.kill or subject in CommandHandler.kill:
                 Logger.log('--------- Bot killed by developer ---------',
                            Color.RED)
                 message.reply('Bot will be killed')
                 commands.append(CommandHandler.KILL)
                 message.mark_read()
             elif body in CommandHandler.test or subject in CommandHandler.test:
                 Logger.log('--------- Bot is being tested ---------',
                            Color.GREEN)
                 message.reply('Bot is being tested')
                 commands.append(CommandHandler.TEST)
                 message.mark_read()
             elif body in CommandHandler.mark_read or subject in CommandHandler.mark_read:
                 Logger.log(
                     '--------- Errors being marked as read ---------',
                     Color.GREEN)
                 message.reply('Messages will be marked as read')
                 mark_read = MarkRead(bot_name)
                 num_read = mark_read.mark_read()
                 commands.append(CommandHandler.MARKREAD)
                 message.reply(
                     str(num_read) + ' messaged were marked as read')
                 message.mark_read()
     except:
         Logger.log(traceback.format_exc(), Color.RED)
         raise CommandHandlerException('Error occurred reading commands')
     return commands
def read_inbox():
    global reddit
    i = 0

    unread_messages = []
    try:
        unread_messages = reddit.get_unread(limit=None)
    except:
        reddit.send_message(accountinfo.developerusername, "SALES__BOT Exception - Read Inbox", traceback.format_exc())

    for unread_message in unread_messages:
        username, message_id, subject, body = (
            str(unread_message.author).lower(),
            unread_message.id,
            inbox.format_subject(unread_message.subject.lower()),
            unread_message.body.lower(),
        )
        Logger.log("message from " + username)
        if subject == "username mention":
            unread_message.mark_as_read()
            reddit.send_message(
                accountinfo.developerusername, "SALES__BOT - Username Mention", "username: "******"\n\n" + body
            )

        elif subject == "post reply":
            unread_message.mark_as_read()
            reddit.send_message(
                accountinfo.developerusername, "SALES__BOT - Post Reply", "username: "******"\n\n" + body
            )
        else:
            try:
                Logger.log("sending message to " + username)
                text = compose_message(username)
                Logger.log("TEXT: " + text)
                unread_message.reply(text)
                Logger.log("message sent")
                unread_message.mark_as_read()
            except:
                Logger.log("message failed to send - " + traceback.format_exc())
                reddit.send_message(
                    accountinfo.developerusername, "SALES__BOT Exception - Default", traceback.format_exc()
                )
        sleep(2)
    def read_inbox(database, reddit):
        Logger.log('Reading inbox...', Color.GREEN)
        unread = []
        try:
            unread = reddit.get_unread()
        except:
            unread = []

        num_messages = 0
        for message in unread:
            num_messages += 1
            username = str(message.author).lower()
            subject  = inbox.format_subject(str(message.subject).lower())
            body     = str(message.body).lower()
            try:
                if username == 'reddit':
                    InboxHandler.handle_message_from_reddit(reddit, message)
                elif subject == 'username mention':
                    InboxHandler.handle_username_mention_message(reddit, message)
                elif subject == 'post reply':
                    InboxHandler.handle_post_reply_message(reddit, message)
                elif subject in MessageLexer.feedback_keywords:
                    InboxHandler.handle_feedback_message(reddit, message)
                elif subject in MessageLexer.help_keywords:
                    InboxHandler.handle_help_message(database, message)
                else:
                    m = MessageParser(message)
                    valid = m.data[MessageParser.KEY_VALID]
                    action = m.data[MessageParser.KEY_ACTION]
                    payload = m.get_payload()

                    Logger.log(json.dumps(m.data, 2), Color.MAGENTA)

                    if valid and action == MessageParser.ACTION_STATISTICS:
                        InboxHandler.handle_statistics_message(database, message)
                    elif valid and action == MessageParser.ACTION_GET_SUBSCRIPTIONS:
                        InboxHandler.handle_get_subscriptions_message(database, message)
                    elif valid and action == MessageParser.ACTION_UNSUBSCRIBE_ALL:
                        InboxHandler.handle_unsubscribe_all_message(database, message)
                    elif valid and action == MessageParser.ACTION_UNSUBSCRIBE:
                        InboxHandler.handle_unsubscribe_message(reddit, database, message)
                    elif valid and action == MessageParser.ACTION_UNSUBSCRIBE_FROM_NUM:
                        InboxHandler.handle_unsubscribe_from_num_message(database, message, payload)
                    elif valid and action == MessageParser.ACTION_SUBSCRIBE:
                        InboxHandler.handle_subscription_message(database, reddit, message, payload)
                    elif valid and action == MessageParser.ACTION_EDIT:
                        InboxHandler.handle_edit_message(database, message, payload)
                    elif valid and action == MessageParser.ACTION_HELP:
                        InboxHandler.handle_help_message(database, message)
                    elif valid and action == MessageParser.ACTION_FEEDBACK:
                        InboxHandler.handle_feedback_message(reddit, message)
                    else:
                        Logger.log('VALID: ' + str(valid))
                        Logger.log('REJECT:\nSubject:\t' + str(message.subject) + '\nBODY:\t\t' + str(message.body))
                        InboxHandler.handle_reject_message(reddit, message)

            except DatabaseHandlerException as ex:
                Logger.log(traceback.format_exc(), Color.RED)
                if ex.errorArgs == DatabaseHandlerException.INTEGRITY_ERROR:
                    message.mark_as_read()
                    reddit.send_message(accountinfo.developerusername,
                                        'Integrity Error',
                                        'SUBJECT: ' + str(inbox.format_subject(message.subject)) + '\n\n' +
                                        'BODY:\n' + str(message.body))
            except:
                Logger.log(traceback.format_exc(), Color.RED)
                reddit.send_message(accountinfo.developerusername,
                                    'ERROR HANDLING MESSAGE - POTENTIALLY STUCK IN INBOX',
                                    'SUBJECT: ' + str(message.subject) + '\n\n' +
                                    'BODY:\n' + str(message.body))
            SleepHandler.sleep(2)
        Logger.log(str(num_messages) + ' unread messages handled', Color.CYAN)
Beispiel #8
0
    def read_inbox(database, reddit):
        Logger.log('Reading inbox...', Color.GREEN)
        unread = []
        try:
            unread = reddit.get_unread()
        except:
            unread = []

        num_messages = 0
        for message in unread:
            num_messages += 1
            username = str(message.author).lower()
            subject = inbox.format_subject(str(message.subject).lower())
            body = str(message.body).lower()
            try:
                if username == 'reddit':
                    InboxHandler.handle_message_from_reddit(reddit, message)
                elif subject == 'username mention':
                    InboxHandler.handle_username_mention_message(
                        reddit, message)
                elif subject == 'post reply':
                    InboxHandler.handle_post_reply_message(reddit, message)
                elif subject in MessageLexer.feedback_keywords:
                    InboxHandler.handle_feedback_message(reddit, message)
                elif subject in MessageLexer.help_keywords:
                    InboxHandler.handle_help_message(database, message)
                else:
                    m = MessageParser(message)
                    action = m.data[MessageParser.KEY_ACTION]
                    error = m.data[MessageParser.KEY_ERROR]
                    payload = m.get_payload()

                    Logger.log(json.dumps(m.data, 2), Color.MAGENTA)

                    if error:
                        Logger.log('REJECT:\n' + 'Error:\t' + str(error) +
                                   '\n' + 'Subject:\t' + str(message.subject) +
                                   '\n' + 'Body:\t\t' + str(message.body))
                        InboxHandler.handle_reject_message(
                            reddit, message, error)
                    elif action == MessageParser.ACTION_STATISTICS:
                        InboxHandler.handle_statistics_message(
                            database, message)
                    elif action == MessageParser.ACTION_GET_SUBSCRIPTIONS:
                        InboxHandler.handle_get_subscriptions_message(
                            database, message)
                    elif action == MessageParser.ACTION_UNSUBSCRIBE_ALL:
                        InboxHandler.handle_unsubscribe_all_message(
                            database, message)
                    elif action == MessageParser.ACTION_UNSUBSCRIBE:
                        InboxHandler.handle_unsubscribe_message(
                            reddit, database, message)
                    elif action == MessageParser.ACTION_UNSUBSCRIBE_FROM_NUM:
                        InboxHandler.handle_unsubscribe_from_num_message(
                            database, message, payload)
                    elif action == MessageParser.ACTION_SUBSCRIBE:
                        InboxHandler.handle_subscription_message(
                            database, reddit, message, payload)
                    elif action == MessageParser.ACTION_EDIT:
                        InboxHandler.handle_edit_message(
                            database, message, payload)
                    elif action == MessageParser.ACTION_HELP:
                        InboxHandler.handle_help_message(database, message)
                    elif action == MessageParser.ACTION_FEEDBACK:
                        InboxHandler.handle_feedback_message(reddit, message)

            except DatabaseHandlerException as ex:
                Logger.log(traceback.format_exc(), Color.RED)
                if ex.errorArgs == DatabaseHandlerException.INTEGRITY_ERROR:
                    message.mark_read()
                    reddit.send_message(
                        accounts['developer']['username'], 'Integrity Error',
                        'SUBJECT: ' +
                        str(inbox.format_subject(message.subject)) + '\n\n' +
                        'BODY:\n' + str(message.body))
            except:
                Logger.log(traceback.format_exc(), Color.RED)
                reddit.send_message(
                    accounts['developer']['username'],
                    'ERROR HANDLING MESSAGE - POTENTIALLY STUCK IN INBOX',
                    'Should NOT be seeing this message anymore hopefully...\t \n'
                    + 'AUTHOR: /u/' + str(message.author) + '\t \n' +
                    'SUBJECT: ' + str(message.subject) + '\t \n' + 'BODY:\n' +
                    str(message.body))
            SleepHandler.sleep(2)
        Logger.log(str(num_messages) + ' unread messages handled', Color.CYAN)