def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(','): if irc.isChannel(channel) and not self.logging_disabled.get(channel): noLogPrefix = self.registryValue('noLogPrefix', channel) if ((noLogPrefix and text.startswith(noLogPrefix)) or (text.startswith('@on')) or (text.startswith('mb-chat-logger: on')) or (text.startswith('mb-chat-logger, on'))): return nick = msg.nick or irc.nick if ircmsgs.isAction(msg): self.doLog(irc, channel, 'log', '* %s %s', nick, ircmsgs.unAction(msg)) self.doLog(irc, channel, 'html', '<span>• <span class="nick">%s</span> %s</span>', cgi.escape(nick), replaceurls(cgi.escape(ircmsgs.unAction(msg))), cls="action privmsg") else: self.doLog(irc, channel, 'log', '<%s> %s', nick, text) self.doLog(irc, channel, 'html', '<span><span class="nick"><%s></span> %s</span>', cgi.escape(nick), replaceurls(cgi.escape(text)), cls="privmsg")
def doPrivmsg(self, irc, msg): if (ircmsgs.isAction(msg) and irc.isChannel(msg.args[0])): self.log.debug("Trying to match against '%s'", ircmsgs.unAction(msg)) matches = re.match('^(hands|tosses|throws|gives)\s+(.+?)\s+(.+)', ircmsgs.unAction(msg)) if (matches): (verb, person, thing) = matches.groups() self.log.debug("Matches: %s", matches.groups()) if (person.lower() == irc.nick.lower()): dropped = self._addItem(plugins.getChannel(msg.args[0]),thing) if (len(dropped) == 0): irc.reply("picked up %s."%thing, action = True) elif (len(dropped) == 1): irc.reply("picked up %s, but dropped %s."%(thing, dropped[0]), action = True) else: irc.reply("picked up %s, but dropped %s, and %s."%(thing, ', '.join(dropped[0:-1]), dropped[-1]), action = True)
def tokenize(self, m): if ircmsgs.isAction(m): return ircmsgs.unAction(m).split() elif ircmsgs.isCtcp(m): return [] else: return m.args[1].split()
def tokenize(self, m): if ircmsgs.isAction(m): return ircmsgs.unAction(m).split() elif ircmsgs.isCtcp(m): return [] else: return m.args[1].split()
def doPrivmsg(self, irc, msg): """check regular IRC chat for votes""" # check for a regular channel message if ircmsgs.isCtcp(msg) and not ircmsgs.isAction(msg): return channel = msg.args[0] if not irc.isChannel(channel): return # is there an active vote in the channel? if not (channel in self._voter_decision): return # get the text of the vote if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] # is it a vote? if not text in VALID_VOTE: return # get the voter voter = msg.prefix # update the cache self._voter_decision[channel][voter] = text
def assertActionRegexp(self, query, regexp, flags=re.I, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: raise TimeoutError, query self.failUnless(ircmsgs.isAction(m)) s = ircmsgs.unAction(m) self.failUnless(re.search(regexp, s, flags), "%r does not match %r" % (s, regexp))
def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(','): if irc.isChannel(channel): noLogPrefix = self.registryValue('noLogPrefix', channel) cap = ircdb.makeChannelCapability(channel, 'logChannelMessages') try: logChannelMessages = ircdb.checkCapability( msg.prefix, cap, ignoreOwner=True) except KeyError: logChannelMessages = True nick = msg.nick or irc.nick if msg.tagged('ChannelLogger__relayed'): (nick, text) = text.split(' ', 1) nick = nick[1:-1] msg.args = (recipients, text) if (noLogPrefix and text.startswith(noLogPrefix)) or \ not logChannelMessages: text = '-= THIS MESSAGE NOT LOGGED =-' if ircmsgs.isAction(msg): self.doLog(irc, channel, '* %s %s\n', nick, ircmsgs.unAction(msg)) else: self.doLog(irc, channel, '<%s> %s\n', nick, text)
def _formatPrivmsg(self, nick, network, msg): channel = msg.args[0] if self.registryValue("includeNetwork", channel): network = "@" + network else: network = "" # colorize nicks color = self.registryValue("color", channel) # Also used further down. if color: nick = ircutils.IrcString(nick) newnick = ircutils.mircColor(nick, *ircutils.canonicalColor(nick)) colors = ircutils.canonicalColor(nick, shift=4) nick = newnick if ircmsgs.isAction(msg): if color: t = ircutils.mircColor("*", *colors) else: t = "*" s = format("%s %s%s %s", t, nick, network, ircmsgs.unAction(msg)) else: if color: lt = ircutils.mircColor("<", *colors) gt = ircutils.mircColor(">", *colors) else: lt = "<" gt = ">" s = format("%s%s%s%s %s", lt, nick, network, gt, msg.args[1]) return s
def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(','): if irc.isChannel(channel): noLogPrefix = self.registryValue('noLogPrefix', channel) cap = ircdb.makeChannelCapability(channel, 'logChannelMessages') try: logChannelMessages = ircdb.checkCapability(msg.prefix, cap, ignoreOwner=True) except KeyError: logChannelMessages = True nick = msg.nick or irc.nick if msg.tagged('LogsToDB__relayed'): (nick, text) = text.split(' ', 1) nick = nick[1:-1] msg.args = (recipients, text) if (noLogPrefix and text.startswith(noLogPrefix)) or \ not logChannelMessages: text = '-= THIS MESSAGE NOT LOGGED =-' if ircmsgs.isAction(msg): self.doLog(irc, channel, '* %s %s\n', nick, ircmsgs.unAction(msg)) else: self.doLog(irc, channel, '<%s> %s\n', nick, text) message = msg.args[1] self.logViewerDB.add_message(msg.nick, msg.prefix, message, channel) self.logViewerFile.write_message(msg.nick, message)
def _formatPrivmsg(self, nick, network, msg): channel = msg.args[0] if self.registryValue('includeNetwork', channel): network = '@' + network else: network = '' # colorize nicks color = self.registryValue('color', channel) # Also used further down. if color: nick = ircutils.IrcString(nick) newnick = ircutils.mircColor(nick, *ircutils.canonicalColor(nick)) colors = ircutils.canonicalColor(nick, shift=4) nick = newnick if ircmsgs.isAction(msg): if color: t = ircutils.mircColor('*', *colors) else: t = '*' s = format('%s %s%s %s', t, nick, network, ircmsgs.unAction(msg)) else: if color: lt = ircutils.mircColor('<', *colors) gt = ircutils.mircColor('>', *colors) else: lt = '<' gt = '>' s = format('%s%s%s%s %s', lt, nick, network, gt, msg.args[1]) return s
def msgtotext(msg): """ Returns only the message text from an IrcMsg (<msg>). """ isaction = ircmsgs.isAction(msg) text = ircmsgs.unAction(msg) if isaction else msg.args[1] return ircutils.stripFormatting(text), isaction
def _formatPrivmsg(self, nick, network, msg): channel = msg.channel # colorize nicks color = self.registryValue('color', channel) # Also used further down. if color: nick = ircutils.IrcString(nick) newnick = ircutils.mircColor(nick, *ircutils.canonicalColor(nick)) colors = ircutils.canonicalColor(nick, shift=4) nick = newnick if ircmsgs.isAction(msg): if color: t = ircutils.mircColor('*', *colors) else: t = '*' displayName = self._formatDisplayName(nick, network, msg.channel) s = format('%s %s %s', t, displayName, ircmsgs.unAction(msg)) else: if color: lt = ircutils.mircColor('<', *colors) gt = ircutils.mircColor('>', *colors) else: lt = '<' gt = '>' displayName = self._formatDisplayName(nick, network, msg.channel) s = format('%s%s%s %s', lt, displayName, gt, msg.args[1]) return s
def doPrivmsg(self, irc, msg): channel = msg.args[0] self.timeout(irc, channel) if ircmsgs.isCtcp(msg) and not ircmsgs.isAction(msg): return #channel = msg.args[0] if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] if 'ping' in text.lower(): text = text.replace('!','')\ .replace(',','')\ .replace(':','')\ .replace('?','') if len(text.split()) == 2: if text.lower().startswith('ping'): self.ping(irc, msg, channel, text, inverse=True) elif text.lower().endswith('ping'): self.ping(irc, msg, channel, text) elif 'pong' in text.lower(): text = text.replace(',','')\ .replace(':','')\ .replace('!','')\ .replace('?','') if len(text.split()) == 2: if text.lower().startswith('pong'): self.pong(irc, msg, channel, text, inverse=True) elif text.lower().endswith('pong'): self.pong(irc, msg, channel, text)
def doPrivmsg(self, irc, msg): if ircmsgs.isCtcp(msg) and not ircmsgs.isAction(msg): return channel = msg.args[0] if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] for url in utils.web.httpUrlRe.findall(text): if not utils.web.getDomain(url).lower() in self.pastebins: continue pastebin = self.pastebins[utils.web.getDomain(url).lower()] if pastebin: pbCode = pastebin['regex'].search(url).group(1) newURL = pastebin['url'] % pbCode cmd = self.registryValue("curl") % newURL cmd += "|" + self.registryValue("cpaste") proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) o, e = proc.communicate() if proc.returncode == 0: irc.reply("Paste has been copied to " + o.decode('ascii').strip())
def outFilter(self, irc, msg): if msg.command == 'PRIVMSG': if ircmsgs.isAction(msg): s = ircmsgs.unAction(msg) else: s = msg.args[1] reply = [] bananaProb = 0.1 maybeBanana = False chance = random.random() self.log.debug("bananchance: "+str(chance)+" "+str(bananaProb)+" "+s) if chance < bananaProb: for word in s.split(): if maybeBanana: maybeBanana = False chance = random.random() reply.append("banana") else: reply.append(word) if word == "the": maybeBanana = True if ircmsgs.isAction(msg): msg = ircmsgs.action(msg.args[0], " ".join(reply), msg=msg) else: msg = ircmsgs.IrcMsg(msg = msg, args=(msg.args[0], " ".join(reply))) return msg
def doPrivmsg(self, irc, msg): if callbacks.addressed(irc.nick, msg): #message is direct command return (channel, text) = msg.args if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) learn = self.registryValue('learn', channel) reply = self.registryValue('reply', channel) replyOnMention = self.registryValue('replyOnMention', channel) replyWhenSpokenTo = self.registryValue('replyWhenSpokenTo', channel) mention = irc.nick.lower() in text.lower() spokenTo = msg.args[1].lower().startswith('%s: ' % irc.nick.lower()) if replyWhenSpokenTo and spokenTo: reply = 100 text = text.replace('%s: ' % irc.nick, '') text = text.replace('%s: ' % irc.nick.lower(), '') if replyOnMention and mention: if not replyWhenSpokenTo and spokenTo: reply = 0 else: reply = 100 if randint(0, 99) < reply: self.reply(irc, msg, text) if learn: self.learn(irc, msg, text)
def doPrivmsg(self, irc, msg): channel = msg.args[0] linkapi = LinkDBApi() if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] usrmsg = safe_unicode(text) for url in utils.web.urlRe.findall(usrmsg): if re.search(badurls, url) is not None: continue uid = linkapi.insert_and_get_uid(msg.nick) urlseen = linkapi.get_url_and_timestamp(url) if urlseen is "": titlename = get_url_title(url) if len(titlename) > 0: linkid = linkapi.insert_and_get_linkid(uid, \ titlename, url) irc.reply("Title: %s" % (titlename)) else: if linkapi.is_link_old(url): linkapi.updateLinkLastseen(url) irc.reply("Title: %s [title updated: %s]" % (urlseen[0], \ time.ctime(urlseen[1])))
def doPrivmsg(self, irc, msg): if callbacks.addressed(irc.nick, msg): #message is direct command return (channel, text) = msg.args if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) learn = self.registryValue('learn', channel) reply = self.registryValue('reply', channel) replyOnMention = self.registryValue('replyOnMention', channel) replyWhenSpokenTo = self.registryValue('replyWhenSpokenTo', channel) mention = irc.nick.lower() in text.lower() spokenTo = msg.args[1].lower().startswith('%s: ' % irc.nick.lower()) if replyWhenSpokenTo and spokenTo: reply = 1000 text = text.replace('%s: ' % irc.nick, '') text = text.replace('%s: ' % irc.nick.lower(), '') if replyOnMention and mention: if not replyWhenSpokenTo and spokenTo: reply = 0 else: reply = 1000 if randint(0, 999) < reply: self.reply(irc, msg, text) if learn: self.learn(irc, msg, text)
def doPrivmsg(self, irc, msg): (channel, message) = msg.args if callbacks.addressed(irc.nick, msg) or ircmsgs.isCtcp( msg) or not irc.isChannel(channel) or not self.registryValue( 'enable', channel): return if msg.nick.lower() in self.registryValue('ignoreNicks', channel): log.debug("Cobe: nick %s in ignoreNicks for %s" % (msg.nick, channel)) return if ircmsgs.isAction(msg): # If the message was an action...we'll learn it anyways! message = ircmsgs.unAction(msg) if irc.nick.lower() in message.lower(): # Were we addressed in the channel? probability = self.registryValue('probabilityWhenAddressed', channel) else: # Okay, we were not addressed, but what's the probability we should reply? probability = self.registryValue('probability', channel) #if self.registryValue('stripNicks'): # removenicks = '|'.join(item + '\W.*?\s' for item in irc.state.channels[channel].users) # text = re.sub(r'' + removenicks + '', 'MAGIC_NICK', text) self._learn(irc, msg, channel, message, probability) # Now we can pass this to our learn function!
def doPrivmsg(self, irc, msg): global BADURLS channel = msg.args[0] linkapi = LinkDBApi() if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] for url in utils.web.urlRe.findall(text): if re.search(BADURLS, url) is not None: continue url = unicode(url, "utf-8") urlseen = linkapi.getByLink(url) if urlseen is "": titlename = self.title(url) if len(titlename) > 0: linkapi.insertLink(msg.nick, titlename, url) try: irc.reply("%s [%s]" % (titlename, url)) except UnicodeDecodeError: irc.reply("%s [%s]" % (titlename.encode("utf-8"), url)) else: linkapi.updateLinkLastseen(url) irc.reply("%s [%s]" % (urlseen[2], urlseen[3]))
def replacer(self, irc, msg, regex): if not self.registryValue('enable', msg.args[0]): return None iterable = reversed(irc.state.history) msg.tag('Replacer') target = regex.group('nick') or '' if target: checkNick = target prefix = '%s thinks %s' % (msg.nick, target) else: checkNick = msg.nick prefix = msg.nick try: message = 's' + msg.args[1][len(target):].split('s', 1)[-1] (pattern, replacement, count) = self._unpack_sed(message) except ValueError as e: self.log.warning(_("Replacer error: %s"), e) if self.registryValue('displayErrors', msg.args[0]): irc.error(_("Replacer error: %s" % e), Raise=True) return None next(iterable) for m in iterable: if m.nick == checkNick and \ m.args[0] == msg.args[0] and \ m.command == 'PRIVMSG': if ircmsgs.isAction(m): text = ircmsgs.unAction(m) tmpl = 'do' else: text = m.args[1] tmpl = 'say' try: if not self._regexsearch(text, pattern): continue except TimeoutError as e: # Isn't working for some reason self.log.error('TIMEOUT ERROR CAUGHT!!') break except Exception as e: self.log.error('Replacer: %s' % type(e).__name__) break if self.registryValue('ignoreRegex', msg.args[0]) and \ m.tagged('Replacer'): continue irc.reply(_("%s meant to %s “ %s ”") % (prefix, tmpl, pattern.sub(replacement, text, count)), prefixNick=False) return None self.log.debug(_("""Replacer: Search %r not found in the last %i messages."""), regex, len(irc.state.history)) if self.registryValue("displayErrors", msg.args[0]): irc.error(_("Search not found in the last %i messages.") % len(irc.state.history), Raise=True) return None
def outFilter(self, irc, msg): if msg.command == 'PRIVMSG': if ircmsgs.isAction(msg): s = ircmsgs.unAction(msg) else: s = msg.args[1] reply = [] bananaProb = 0.1 maybeBanana = False chance = random.random() self.log.debug("bananchance: " + str(chance) + " " + str(bananaProb) + " " + s) if chance < bananaProb: for word in s.split(): if maybeBanana: maybeBanana = False chance = random.random() reply.append("banana") else: reply.append(word) if word == "the": maybeBanana = True if ircmsgs.isAction(msg): msg = ircmsgs.action(msg.args[0], " ".join(reply), msg=msg) else: msg = ircmsgs.IrcMsg(msg=msg, args=(msg.args[0], " ".join(reply))) return msg
def f(m, arg=arg): def f1(s, arg): """Since we can't enqueue match objects into the multiprocessing queue, we'll just wrap the function to return bools.""" if arg.search(s) is not None: return True else: return False if ircmsgs.isAction(m): m1 = ircmsgs.unAction(m) #return arg.search(ircmsgs.unAction(m)) else: m1 = m.args[1] #return arg.search(m.args[1]) try: # use a subprocess here, since specially crafted regexps can # take exponential time and hang up the bot. # timeout of 0.1 should be more than enough for any normal regexp. v = commands.process(f1, m1, arg, timeout=0.1, pn=self.name(), cn='last') return v except commands.ProcessTimeoutError: return False
def combine(msgs, reverse=True, stamps=False, nicks=True, compact=True, joiner=r' \ ', nocolor=False): """ Formats and returns a list of IrcMsg objects (<msgs>) as a string. <reverse>, if True, prints messages from last to first. <stamps>, if True, appends timestamps to messages. <reverse>, if True, orders messages by earliest to most recent. <compact>, if False, append nicks to consecutive messages <joiner>, the character joining lines together (default: ' \ '). <nocolor>, if True, strips color from messages. Sample output: <bigman> DUNK \ <bigbitch> \ bluh \ bluh """ output = [] lastnick = '' for msg in reversed(msgs) if reverse else msgs: isaction = ircmsgs.isAction(msg) if isaction: text = '[%s %s]' % (msg.nick, ircmsgs.unAction(msg)) else: if compact and ircutils.nickEqual(msg.nick, lastnick) or not nicks: text = msg.args[1] else: lastnick = msg.nick text = '<%s> %s' % (msg.nick, msg.args[1]) if stamps: stampfmt = '%d-%m-%y %H:%M:%S' stamp = time.strftime(stampfmt, time.localtime(msg.receivedAt)) text = '[{0}] {1}'.format(stamp, text) output.append(ircutils.stripFormatting(text)) return joiner.join(output)
def _replacer_process(self, irc, msg, target, pattern, replacement, count, messages): for m in messages: if m.command in ('PRIVMSG', 'NOTICE') and \ ircutils.strEqual(m.args[0], msg.args[0]) and m.tagged('receivedBy') == irc: if target and m.nick != target: continue # Don't snarf ignored users' messages unless specifically # told to. if ircdb.checkIgnored(m.prefix) and not target: continue # When running substitutions, ignore the "* nick" part of any actions. action = ircmsgs.isAction(m) if action: text = ircmsgs.unAction(m) else: text = m.args[1] # Test messages sent before SedRegex was activated. Mark them all as seen # so we only need to do this check once per message. if not m.tagged(TAG_SEEN): m.tag(TAG_SEEN) if SED_REGEX.match(m.args[1]): m.tag(TAG_IS_REGEX) # Ignore messages containing a regexp if ignoreRegex is on. if self.registryValue('ignoreRegex', msg.channel, irc.network) and m.tagged(TAG_IS_REGEX): self.log.debug( "Skipping message %s because it is tagged as isRegex", m.args[1]) continue if m.nick == msg.nick: messageprefix = msg.nick else: messageprefix = '%s thinks %s' % (msg.nick, m.nick) try: replace_result = pattern.search(text) if replace_result: if self.registryValue('boldReplacementText', msg.channel, irc.network): replacement = ircutils.bold(replacement) subst = pattern.sub(replacement, text, count) if action: # If the message was an ACTION, prepend the nick back. subst = '* %s %s' % (m.nick, subst) subst = axe_spaces(subst) return _("%s meant to say: %s") % \ (messageprefix, subst) except Exception as e: self.log.warning(_("SedRegex error: %s"), e, exc_info=True) raise self.log.debug( _("SedRegex: Search %r not found in the last %i messages of %s."), msg.args[1], len(irc.state.history), msg.args[0]) raise SearchNotFoundError()
def p(messages): for m in messages: if ircmsgs.isAction(m): s = ircmsgs.unAction(m) else: s = m.args[1] if reobj.search(s): q.put(m)
def assertActionRegexp(self, query, regexp, flags=re.I, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: raise TimeoutError, query self.failUnless(ircmsgs.isAction(m)) s = ircmsgs.unAction(m) self.failUnless(re.search(regexp, s, flags), '%r does not match %r' % (s, regexp))
def doPrivmsg(self, irc, msg): if not self._autoRollEnabled(irc, msg.args[0]): return if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] self._process(irc, text)
def doPrivmsg(self, irc, msg): if not self._autoRollEnabled(irc, msg.args[0]): return if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] self._process(irc, text)
def f(m, arg=arg): if ircmsgs.isAction(m): m1 = ircmsgs.unAction(m) else: m1 = m.args[1] return regexp_wrapper(m1, reobj=arg, timeout=0.1, plugin_name=self.name(), fcn_name='last')
def replacer(self, irc, msg, regex): if not self.registryValue('enable', msg.args[0]): return iterable = reversed(irc.state.history) msg.tag('Replacer') try: (pattern, replacement, count) = self._unpack_sed(msg.args[1]) except (ValueError, re.error) as e: self.log.warning(_("Replacer error: %s"), e) if self.registryValue('displayErrors', msg.args[0]): irc.error(_("Replacer error: %s" % e), Raise=True) return next(iterable) for m in iterable: if m.command in ('PRIVMSG', 'NOTICE') and \ m.args[0] == msg.args[0]: target = regex.group('nick') if not ircutils.isNick(str(target), strictRfc=True): return if target and m.nick != target: continue # Don't snarf ignored users' messages unless specifically # told to. if ircdb.checkIgnored(m.prefix) and not target: continue # When running substitutions, ignore the "* nick" part of any actions. action = ircmsgs.isAction(m) if action: text = ircmsgs.unAction(m) else: text = m.args[1] if self.registryValue('ignoreRegex', msg.args[0]) and \ m.tagged('Replacer'): continue if m.nick == msg.nick: messageprefix = msg.nick else: messageprefix = '%s thinks %s' % (msg.nick, m.nick) if regexp_wrapper(text, pattern, timeout=0.05, plugin_name=self.name(), fcn_name='replacer'): if self.registryValue('boldReplacementText', msg.args[0]): replacement = ircutils.bold(replacement) subst = process(pattern.sub, replacement, text, count, timeout=0.05) if action: # If the message was an ACTION, prepend the nick back. subst = '* %s %s' % (m.nick, subst) irc.reply(_("%s meant to say: %s") % (messageprefix, subst), prefixNick=False) return self.log.debug(_("Replacer: Search %r not found in the last %i messages of %s."), msg.args[1], len(irc.state.history), msg.args[0]) if self.registryValue("displayErrors", msg.args[0]): irc.error(_("Search not found in the last %i messages.") % len(irc.state.history), Raise=True)
def assertAction(self, query, expectedResponse=None, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: raise TimeoutError, query self.failUnless(ircmsgs.isAction(m), "%r is not an action." % m) if expectedResponse is not None: s = ircmsgs.unAction(m) self.assertEqual(s, expectedResponse, "%r != %r" % (s, expectedResponse)) return m
def formatmsg(msg): """ Formats and returns an IrcMsg (<msg>) as a string. Sample output: <bigman> ahlly'yoop """ if ircmsgs.isAction(msg): return '[%s %s]' % (msg.nick, ircmsgs.unAction(msg)) return '<%s> %s' % (msg.nick, msg.args[1])
def doPrivmsg(self, irc, msg): if irc.isChannel(msg.args[0]): channel = msg.args[0] sender = msg.nick if ircmsgs.isAction(msg): message = ircmsgs.unAction(msg) else: message = msg.args[1] self.instances[irc.network].onMessage(channel, sender, message)
def doPrivmsg(self, irc, msg): channel = msg.args[0].lower() if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] self._checkUrl(irc, text, msg.nick, channel)
def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(','): if irc.isChannel(channel): nick = msg.nick or irc.nick if ircmsgs.isAction(msg): self.doLog(irc, channel, '* %s %s', nick, ircmsgs.unAction(msg)) else: self.doLog(irc, channel, '<%s> %s', nick, text)
def doPrivmsg(self, irc, msg): channel = msg.args[0].lower() if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] self._checkUrl(irc, text, msg.nick, channel)
def assertAction(self, query, expectedResponse=None, **kwargs): m = self._feedMsg(query, **kwargs) if m is None: raise TimeoutError, query self.failUnless(ircmsgs.isAction(m), '%r is not an action.' % m) if expectedResponse is not None: s = ircmsgs.unAction(m) self.assertEqual(s, expectedResponse, '%r != %r' % (s, expectedResponse)) return m
def doPrivmsg(self, irc, msg): if ircmsgs.isCtcp(msg) and not ircmsgs.isAction(msg): return channel = msg.args[0] if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] for info in present_links(text, color=True): irc.reply(info, prefixNick=False)
def doPrivmsg(self, irc, msg): if ircmsgs.isCtcp(msg) and not ircmsgs.isAction(msg): return channel = msg.args[0] if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] for url in utils.web.urlRe.findall(text): self.fetch_url(irc, channel, url)
def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(','): if irc.isChannel(channel): nick = msg.nick or irc.nick if ircmsgs.isAction(msg): self.doLog(irc, channel, '* %s %s\n' % (nick, ircmsgs.unAction(msg))) else: self.doLog(irc, channel, '<%s> %s\n' % (nick, text)) self._sendReviews(irc, msg)
def doPrivmsg(self, irc, msg): (channel, text) = msg.args if (callbacks.addressed(irc.nick, msg) or ircmsgs.isCtcp(msg) or not irc.isChannel(channel) or not (None == re.match( self.registryValue('ignoreRegex'), text))): # Was the message a CTCP command, a command to the bot, is this message supposed to be ignored, or are we not in a channel?? self.log.debug( "The method 'callbacks.addressed(irc.nick, msg)' returns {0}!". format(True == callbacks.addressed(irc.nick, msg))) self.log.debug( "The method 'ircmsgs.isCtcp(msg)' returns {0}!".format( True == ircmsgs.isCtcp(msg))) self.log.debug( "The method 'irc.isChannel(channel)' returns {0}!".format( False == irc.isChannel(channel))) self.log.debug( "The method 're.match(self.registryValue('ignoreRegex'), text)' returns {0}!" .format(False == (None == re.match( self.registryValue('ignoreRegex'), text)))) return if ircmsgs.isAction(msg): # If the message was an action...we'll learn it anyways! text = ircmsgs.unAction(msg) if self.registryValue('stripUrls'): # strip URLs text = re.sub(r'(http[^\s]*)', '', text) # strip › text = re.sub(r'›', '', text) if irc.nick.lower() in text.lower(): # Were we addressed in the channel? probability = self.registryValue('probabilityWhenAddressed', channel) else: # Okay, we were not addressed, but what's the probability we should reply? probability = self.registryValue('probability', channel) #if self.registryValue('stripNicks'): # removenicks = '|'.join(item + '\W.*?\s' for item in irc.state.channels[channel].users) # text = re.sub(r'' + removenicks + '', 'MAGIC_NICK', text) self._learn(irc, msg, channel, text, probability) # Now we can pass this to our learn function!
def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(","): if irc.isChannel(channel): noLogPrefix = self.registryValue("noLogPrefix", channel) if noLogPrefix and text.startswith(noLogPrefix): text = "-= THIS MESSAGE NOT LOGGED =-" nick = msg.nick or irc.nick if ircmsgs.isAction(msg): self.doLog(irc, channel, "* %s %s\n", nick, ircmsgs.unAction(msg)) else: self.doLog(irc, channel, "<%s> %s\n", nick, text)
def doPrivmsg(self, irc, msg): irc = callbacks.SimpleProxy(irc, msg) channel = msg.args[0] if (not msg.isError and channel in irc.state.channels and not msg.from_telegram): text = msg.args[1] if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg).decode("utf8", "replace") line = "* %s %s" % (msg.nick, text) else: line = "%s> %s" % (msg.nick, text.decode("utf8", "replace")) line = line.encode("utf8", "replace") self._sendToChat(line)
def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(','): if irc.isChannel(channel): noLogPrefix = self.registryValue('noLogPrefix', channel) if noLogPrefix and text.startswith(noLogPrefix): text = '-= THIS MESSAGE NOT LOGGED =-' nick = msg.nick or irc.nick if ircmsgs.isAction(msg): self.doLog(irc, channel, '* %s %s\n', nick, ircmsgs.unAction(msg)) else: self.doLog(irc, channel, '<%s> %s\n', nick, text)
def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(','): if irc.isChannel(channel): nick = msg.nick or irc.nick if ircmsgs.isAction(msg): self.logger.getLog(irc, channel).doAction(nick, ircmsgs.unAction(msg)) else: noLogPrefix = self.registryValue('noLogPrefix', channel) if noLogPrefix and text.startswith(noLogPrefix): self.logger.getLog(irc, channel).doMessage(nick, text, True) else: self.logger.getLog(irc, channel).doMessage(nick, text, False)
def doPrivmsg(self, irc, msg): channel = msg.args[0] if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] for url in utils.web.urlRe.findall(text): r = self.registryValue('nonSnarfingRegexp', channel) if r and r.search(url): self.log.debug('Skipping adding %u to db.', url) continue self.log.debug('Adding %u to db.', url) self.db.add(channel, url, msg)
def doPrivmsg(self, irc, msg): if not msg.fromSshd: (recipients, text) = msg.args for channel in recipients.split(','): nick = msg.nick or irc.nick command = 'privmsg' importance = 3 if ircutils.isChannel(channel): importance = 2 if ircmsgs.isAction(msg): command = 'action' text = ircmsgs.unAction(msg) self.doBounce(irc, text, channel, command=command, nick=nick, importance=importance)
def doPrivmsg(self, irc, msg): (channels, text) = msg.args if msg.nick == irc.nick: return if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) try: t = unicode(text, 'utf-8') t = t.encode('utf-8') t = t.replace('`', '').replace('`', '') t = t.replace('|', '') t = t.replace('>', '') t = t.replace('$', '') except: return for channel in channels.split(','): if irc.isChannel(channel): users = [] for user in irc.state.channels[channel].users: users.append(user) learn = self.registryValue('learn', channel=channel) reply = self.registryValue('reply', channel=channel) if text.startswith(irc.nick): o = '-r' if learn and reply != 0: out = self._hailo(irc, '-L', t) if out and out != t and out != msg.nick and not out.startswith( 'DBD::SQLite::db'): t = self._formatReply(msg.nick, users, out) if t != msg.nick: irc.queueMsg(ircmsgs.privmsg(channel, t)) elif reply != 0: out = self._hailo(irc, '-r', t) if out and out != t and out != msg.nick and not out.startswith( 'DBD::SQLite::db'): t = self._formatReply(msg.nick, users, out) if t != msg.nick: irc.queueMsg(ircmsgs.privmsg(channel, t)) else: if learn: self._hailo(irc, '-l', t) if randint(1, 99) < reply: out = self._hailo(irc, '-r', t) if out and out != msg.nick and out != t and not out.startswith( 'DBD::SQLite::db'): t = self._formatReply(msg.nick, users, out) if t != msg.nick: irc.queueMsg(ircmsgs.privmsg(channel, t))
def _replacer_process(self, irc, msg, target, pattern, replacement, count, messages): for m in messages: if m.command in ('PRIVMSG', 'NOTICE') and \ ircutils.strEqual(m.args[0], msg.args[0]) and m.tagged('receivedBy') == irc: if target and m.nick != target: continue # Don't snarf ignored users' messages unless specifically # told to. if ircdb.checkIgnored(m.prefix) and not target: continue # When running substitutions, ignore the "* nick" part of any actions. action = ircmsgs.isAction(m) if action: text = ircmsgs.unAction(m) else: text = m.args[1] if self.registryValue('ignoreRegex', msg.channel, irc.network) and \ m.tagged('Replacer'): continue if m.nick == msg.nick: messageprefix = msg.nick else: messageprefix = '%s thinks %s' % (msg.nick, m.nick) try: replace_result = pattern.search(text) if replace_result: if self.registryValue('boldReplacementText', msg.channel, irc.network): replacement = ircutils.bold(replacement) subst = pattern.sub(replacement, text, count) if action: # If the message was an ACTION, prepend the nick back. subst = '* %s %s' % (m.nick, subst) subst = axe_spaces(subst) return _("%s meant to say: %s") % \ (messageprefix, subst) except Exception as e: self.log.warning(_("SedRegex error: %s"), e, exc_info=True) raise self.log.debug( _("SedRegex: Search %r not found in the last %i messages of %s."), msg.args[1], len(irc.state.history), msg.args[0]) raise SearchNotFound()
def f(m, arg=arg): def f1(s, arg): """Since we can't enqueue match objects into the multiprocessing queue, we'll just wrap the function to return bools.""" if arg.search(s) is not None: return True else: return False if ircmsgs.isAction(m): m1 = ircmsgs.unAction(m) else: m1 = m.args[1] return regexp_wrapper(m1, reobj=arg, timeout=0.1, plugin_name=self.name(), fcn_name='last')
def outFilter(self, irc, msg): if msg.command == 'PRIVMSG': if msg.args[0] in self.outFilters: if ircmsgs.isAction(msg): s = ircmsgs.unAction(msg) else: s = msg.args[1] methods = self.outFilters[msg.args[0]] for filtercommand in methods: myIrc = MyFilterProxy() filtercommand(myIrc, msg, [s]) s = myIrc.s if ircmsgs.isAction(msg): msg = ircmsgs.action(msg.args[0], s, msg=msg) else: msg = ircmsgs.IrcMsg(msg=msg, args=(msg.args[0], s)) return msg
def doPrivmsg(self, irc, msg): if ircmsgs.isCtcp(msg) and not ircmsgs.isAction(msg): return channel = msg.args[0] if callbacks.addressed(irc.nick, msg): return if self.registryValue('titleSnarfer', channel): if irc.isChannel(channel): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] for info in present_links(text, color=True): irc.reply(info, prefixNick=False, private=False, notice=False)
def doPrivmsg(self, irc, msg): if ircmsgs.isAction(msg): text = ircmsgs.unAction(msg) else: text = msg.args[1] channel = msg.args[0].lower() for longurl in utils.web.urlRe.findall(text): if not len(longurl) > self.registryValue('length', channel): continue longurl = urllib.parse.quote(longurl) isgdurl = "http://is.gd/api.php?longurl=" + longurl try: req = urllib.request.Request(isgdurl) f = urllib.request.urlopen(req) shorturl = f.read() irc.reply("Short url: " + shorturl) except: self.log.warning("Failed to shorten url: " + longurl)
def doPrivmsg(self, irc, msg): if not msg.fromSshd: (recipients, text) = msg.args for channel in recipients.split(','): nick = msg.nick or irc.nick command = 'privmsg' importance = 3 if ircutils.isChannel(channel): importance = 2 if ircmsgs.isAction(msg): command = 'action' text = ircmsgs.unAction(msg) self.doBounce(irc, text, channel, command=command, nick=nick, importance=importance)
def doPrivmsg(self, irc, msg): channel = msg.args[0] # channel, if any. # user = msg.nick # nick of user. # linkdb = LinkDB() # disable for now. # linkdb.add(url, title, channel, user) # first, check if we should be 'disabled' in this channel. if self.registryValue('disableChannel', channel): return # don't react to non-ACTION based messages. if ircmsgs.isCtcp(msg) and not ircmsgs.isAction(msg): return if irc.isChannel(channel): # must be in channel. if ircmsgs.isAction(msg): # if in action, remove. text = ircmsgs.unAction(msg) else: text = msg.args[1] # find all urls pasted. #urlpattern = """(((http|ftp|https|ftps|sftp)://)|(www\.))+(([a-zA-Z # 0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\. # [0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9\&%_\./-~-]*)?""" # extracts links in text and stores in an iterator. #matches = re.finditer(urlpattern, text.strip(), re.IGNORECASE + re.VERBOSE) for url in utils.web.urlRe.findall(text): #for url in matches: self.log.info("FOUND URL: {0}".format(url)) url = url.decode('utf-8') url = unicode(url) url = self.iri2uri(url) self.log.info("after iri to uri: {0}".format(url)) # url = self._tidyurl(url) # should we tidy them? output = self._titler(url, channel) # now, with gd, we must check what output is. if output: # if we did not get None back. if isinstance(output, dict): # came back a dict. # output. if 'desc' in output and 'title' in output and output['desc'] is not None and output['title'] is not None: irc.sendMsg(ircmsgs.privmsg(channel, "{0}".format(output['title']))) irc.sendMsg(ircmsgs.privmsg(channel, "{0}".format(output['desc']))) elif 'title' in output and output['title'] is not None: irc.sendMsg(ircmsgs.privmsg(channel, "{0}".format(output['title']))) else: # no desc. irc.sendMsg(ircmsgs.privmsg(channel, "{0}".format(output)))
def doPrivmsg(self, irc, msg): (recipients, text) = msg.args for channel in recipients.split(','): if irc.isChannel(channel): noLogPrefix = self.registryValue('noLogPrefix', channel) if noLogPrefix and text.startswith(noLogPrefix): text = '-= THIS MESSAGE NOT LOGGED =-' nick = msg.nick or irc.nick if ircmsgs.isAction(msg): self.doLog(irc, channel, '* %s %s\n', nick, ircmsgs.unAction(msg)) else: self.doLog(irc, channel, '<%s> %s\n', nick, text) if not self.registryValue('enable', channel): return self.count += 1 if self.count > self.registryValue('lineslimit'): irc.queueMsg( ircmsgs.privmsg(channel, self.registryValue('spammsg'))) self.count = 0