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
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)
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)
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)
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)