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