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>&bull; <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">&lt;%s&gt;</span> %s</span>', 
                            cgi.escape(nick), 
                            replaceurls(cgi.escape(text)),
                            cls="privmsg")
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
 def tokenize(self, m):
     if ircmsgs.isAction(m):
         return ircmsgs.unAction(m).split()
     elif ircmsgs.isCtcp(m):
         return []
     else:
         return m.args[1].split()
Ejemplo n.º 4
0
 def tokenize(self, m):
     if ircmsgs.isAction(m):
         return ircmsgs.unAction(m).split()
     elif ircmsgs.isCtcp(m):
         return []
     else:
         return m.args[1].split()
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
 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))
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
 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
Ejemplo n.º 13
0
 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)
Ejemplo n.º 14
0
 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
Ejemplo n.º 16
0
    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)
Ejemplo n.º 17
0
    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])))
Ejemplo n.º 18
0
    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)
Ejemplo n.º 19
0
 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!
Ejemplo n.º 20
0
    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]))
Ejemplo n.º 21
0
    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
Ejemplo n.º 23
0
Archivo: plugin.py Proyecto: totte/aide
                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
Ejemplo n.º 24
0
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)
Ejemplo n.º 25
0
    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()
Ejemplo n.º 26
0
 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)
Ejemplo n.º 27
0
 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))
Ejemplo n.º 28
0
 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)
Ejemplo n.º 29
0
 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)
Ejemplo n.º 30
0
 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')
Ejemplo n.º 31
0
    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)
Ejemplo n.º 32
0
 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
Ejemplo n.º 33
0
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])
Ejemplo n.º 34
0
 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)
Ejemplo n.º 35
0
    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)
Ejemplo n.º 36
0
 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)
Ejemplo n.º 37
0
 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)
Ejemplo n.º 38
0
 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
Ejemplo n.º 39
0
 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)
Ejemplo n.º 40
0
Archivo: plugin.py Proyecto: HacDC/wopr
 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)
Ejemplo n.º 41
0
 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)
Ejemplo n.º 42
0
    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!
Ejemplo n.º 43
0
 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)
Ejemplo n.º 44
0
 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)
Ejemplo n.º 45
0
 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)
Ejemplo n.º 46
0
 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)
Ejemplo n.º 47
0
 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)
Ejemplo n.º 48
0
 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)
Ejemplo n.º 49
0
    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))
Ejemplo n.º 50
0
    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()
Ejemplo n.º 51
0
 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')
Ejemplo n.º 52
0
 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
Ejemplo n.º 53
0
 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)
Ejemplo n.º 54
0
 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)
Ejemplo n.º 55
0
 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)
Ejemplo n.º 56
0
    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\&amp;%_\./-~-]*)?"""
            # 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)))
Ejemplo n.º 57
0
 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