コード例 #1
0
ファイル: ircbot.py プロジェクト: dkess/ircbot
    def on_pubmsg(self, conn, event):
        if event.target in self.channels:
            is_oper = False
            # event.source is like '[email protected]'
            assert event.source.count('!') == 1
            user = NickMask(event.source).nick

            # Don't respond to other create bots to avoid loops
            if user.startswith('create'):
                return

            if user in self.channels[event.target].opers():
                is_oper = True

            assert len(event.arguments) == 1
            raw_text = event.arguments[0]

            def respond(raw_text, ping=True):
                fmt = '{user}: {raw_text}' if ping else '{raw_text}'
                full_raw_text = fmt.format(user=user, raw_text=raw_text)
                self.say(event.target, full_raw_text)

            was_mentioned = raw_text.startswith((IRC_NICKNAME + ' ', IRC_NICKNAME + ': '))

            for listener in self.listeners:
                text = raw_text
                if listener.require_mention:
                    if was_mentioned:
                        # Chop off the bot nickname.
                        text = text.split(' ', 1)[1]
                    else:
                        continue

                if (
                    (listener.require_oper or listener.require_privileged_oper) and
                    not is_oper
                ):
                    continue

                # Prevent people from creating a channel, becoming oper,
                # inviting the bot, and approving/rejecting accounts without
                # "real" oper privilege.
                if listener.require_privileged_oper and event.target not in IRC_CHANNELS_OPER:
                    continue

                match = listener.pattern.search(text)
                if match is not None:
                    msg = MatchedMessage(
                        channel=event.target,
                        text=text,
                        raw_text=raw_text,
                        match=match,
                        is_oper=is_oper,
                        nick=user,
                        respond=respond,
                    )
                    listener.fn(self, msg)

            # everything gets logged
            self.recent_messages.appendleft((user, raw_text))
コード例 #2
0
    def on_pubmsg(self, conn, event):
        if event.target in self.channels:
            user = NickMask(event.source).nick

            # Don't respond to other create bots to avoid loops
            if user.startswith('create'):
                return

            raw_text, = event.arguments

            def respond(raw_text, ping=True):
                fmt = '{user}: {raw_text}' if ping else '{raw_text}'
                full_raw_text = fmt.format(user=user, raw_text=raw_text)
                self.say(event.target, full_raw_text)

            self.handle_chat(
                raw_text=raw_text,
                user=user,
                channel=event.target,
                is_oper=user in self.channels[event.target].opers(),
                is_privileged_channel=event.target in IRC_CHANNELS_OPER,
                respond=respond,
            )
コード例 #3
0
ファイル: ircbot.py プロジェクト: willtunnels/ircbot
    def on_pubmsg(self, conn, event):
        if event.target in self.channels:
            is_oper = False
            # event.source is like '[email protected]'
            assert event.source.count('!') == 1
            user = NickMask(event.source).nick

            # Don't respond to other create bots to avoid loops
            if user.startswith('create'):
                return

            if user in self.channels[event.target].opers():
                is_oper = True

            assert len(event.arguments) == 1
            raw_text = event.arguments[0]

            def respond(raw_text, ping=True):
                fmt = '{user}: {raw_text}' if ping else '{raw_text}'
                full_raw_text = fmt.format(user=user, raw_text=raw_text)
                self.say(event.target, full_raw_text)

            was_mentioned = raw_text.lower().startswith(
                (IRC_NICKNAME.lower() + ' ', IRC_NICKNAME.lower() + ': '))

            for listener in self.listeners:
                text = raw_text
                if listener.require_mention:
                    if was_mentioned:
                        # Chop off the bot nickname.
                        text = text.split(' ', 1)[1]
                    else:
                        continue

                if ((listener.require_oper or listener.require_privileged_oper)
                        and not is_oper):
                    continue

                # Prevent people from creating a channel, becoming oper,
                # inviting the bot, and approving/rejecting accounts without
                # "real" oper privilege.
                if listener.require_privileged_oper and event.target not in IRC_CHANNELS_OPER:
                    continue

                match = listener.pattern.search(text)
                if match is not None:
                    msg = MatchedMessage(
                        channel=event.target,
                        text=text,
                        raw_text=raw_text,
                        match=match,
                        is_oper=is_oper,
                        nick=user,
                        respond=respond,
                    )
                    try:
                        listener.fn(self, msg)
                    except Exception as ex:
                        error_msg = 'ircbot exception in {module}/{function}: {exception}'.format(
                            module=listener.fn.__module__,
                            function=listener.fn.__name__,
                            exception=ex,
                        )
                        msg.respond(error_msg, ping=False)
                        # don't send emails when running as dev
                        if not TESTING:
                            send_problem_report(
                                dedent("""
                                {error}

                                {traceback}

                                Message:
                                  * Channel: {channel}
                                  * Nick: {nick}
                                  * Oper?: {oper}
                                  * Text: {text}
                                  * Raw text: {raw_text}
                                  * Match groups: {groups}
                                """).format(
                                    error=error_msg,
                                    traceback=format_exc(),
                                    channel=msg.channel,
                                    nick=msg.nick,
                                    oper=msg.is_oper,
                                    text=msg.text,
                                    raw_text=msg.raw_text,
                                    groups=msg.match.groups(),
                                ))

            # everything gets logged except commands
            if raw_text[0] != '!':
                self.recent_messages[event.target].appendleft((user, raw_text))