123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- import requests, sys
- from logger import Logger
- from event import Event
- if sys.version_info > (3, 0, 0):
- try:
- from .basemodule import BaseModule
- except (ImportError, SystemError):
- from modules.basemodule import BaseModule
- else:
- try:
- from basemodule import BaseModule
- except (ImportError, SystemError):
- from modules.basemodule import BaseModule
- class Replace(BaseModule):
- def post_init(self):
- if not 'replace' in self.bot.mem_store:
- self.bot.mem_store['replace'] = {}
- replace = Event("__.r__")
- replace.define(msg_definition=".*")
- replace.subscribe(self)
- self.bot.register_event(replace, self)
- self.help = ".r <search string> | <replacement text> OR s/<search string>/<replacement string>"
- self.MAX_BUFFER_SIZE = 300
- self.MAX_HISTORY_SIZE = 10
- def add_buffer(self, event=None, debug=False):
- """Takes a channel name and line passed to it and stores them in the bot's mem_store dict
- for future access. The dict will have channel as key. The value to that key will be a list
- of formatted lines of activity.
- If the buffer size is not yet exceeded, lines are just added. If the buffer
- is maxed out, the oldest line is removed and newest one inserted at the beginning.
- """
- if debug:
- print("Line: " + event.line)
- print("Verb: " + event.verb)
- print("Channel: " + event.channel)
- print("")
- if not event:
- return
-
-
-
-
-
-
- if not event.channel:
-
- if event.verb not in ["QUIT", "NICK"]:
- return
- try:
- for chan in list(self.bot.mem_store['replace'].keys()):
- if len(self.bot.mem_store['replace'][chan]) >= self.MAX_BUFFER_SIZE:
- self.bot.mem_store['replace'][chan].pop()
- line = self.format_line(event)
- if line:
- self.bot.mem_store['replace'][chan].insert(0, line)
- except (KeyError, IndexError):
- self.bot.logger.write(Logger.WARNING, line="couldn't find channel in modules.replace")
- self.bot.logger.write(Logger.WARNING, line="Replace add_buffer() error when no event channel")
-
-
-
- else:
- if event.channel not in self.bot.mem_store['replace']:
- self.bot.mem_store['replace'][event.channel] = []
- try:
-
- if len(self.bot.mem_store['replace'][event.channel]) >= self.MAX_BUFFER_SIZE:
- self.bot.mem_store['replace'][event.channel].pop()
-
-
- line = self.format_line(event)
- if line:
- self.bot.mem_store['replace'][event.channel].insert(0, line)
- except IndexError:
- self.bot.logger.write(Logger.WARNING, line="Replace add_buffer() error. Couldn't access the list index.")
- def format_line(self, event):
- """Takes an event and formats a string appropriate for quotation from it"""
-
- if event.verb == "":
- return ''
- elif event.verb == "PRIVMSG":
-
- if event.msg.startswith('\001ACTION'):
-
- return ' * %s %s\n' % (event.user, event.msg[7:])
- else:
- return '<%s> %s\n' % (event.user, event.msg)
- else:
-
- return ''
- def get_replacement_message(self, channel=None, find_msg=''):
- """Looks through the mem_store to find the most recent message containing find_msg"""
- if not channel:
- self.bot.logger.write(Logger.WARNING, line="couldn't find channel")
- return None
-
- if len(find_msg) == 0 or not channel:
- self.bot.logger.write(Logger.WARNING, line="find_msg is empty")
- return None
-
-
- found_index = -1
- for index, line in enumerate(self.bot.mem_store['replace'][channel]):
- message = line
- msg_index = message.find(">")
- message = message[msg_index:]
-
- if sys.version_info < (3, 0, 0):
- if find_msg.decode('utf-8','ignore') in message:
- found_index = index
- break
- else:
- if find_msg in message:
- found_index = index
- break
-
- if found_index == -1 :
- return None
-
- submission = self.bot.mem_store['replace'][channel][found_index]
- return submission
- def handle(self, event):
-
- if event.msg.startswith(".r "):
-
- string_token = event.msg[3:].split('|', 1)
- find_msg = string_token[0].rstrip()
- try:
- replace_msg = string_token[1].lstrip()
- except IndexError as e:
- self.bot.logger.write(Logger.WARNING, line=e)
- return
-
- newString = self.get_replacement_message(event.channel, find_msg)
-
-
- msg_index = newString.find(">")
- message = newString[msg_index + 2:]
- message = message.replace(find_msg, replace_msg)
- user = newString[1:msg_index]
-
- self.say(event.channel, user + " MEANT to say: " + message)
-
- if event.msg.startswith("s/"):
- self.bot.logger.write(Logger.WARNING, line="i am a log entry from within s/ in modules.replace")
-
- string_token = event.msg[2:].split('/', 1)
- find_msg = string_token[0]
- try:
- replace_msg = string_token[1]
- except IndexError:
- return
-
- newString = self.get_replacement_message(event.channel, find_msg)
-
-
- msg_index = newString.find(">")
- message = newString[msg_index + 2:]
- message = message.replace(find_msg, replace_msg)
- user = newString[1:msg_index]
-
- self.say(event.channel, user + " MEANT to say: " + message)
- if event.user != self.bot.NICK :
- self.add_buffer(event)
|