privmsg (Irc::Keywords)

    # File rbot/keywords.rb, line 255
        def privmsg(m)
          if(m.address?)
            if(!(m.message =~ /\\\?\s*$/) && m.message =~ /^(.*\S)\s*\?\s*$/)
              keyword m, $1 if(@bot.auth.allow?("keyword", m.source, m.replyto))
            elsif(m.message =~ /^(.*?)\s+(is|are)\s+(.*)$/)
              keyword_command(m.sourcenick, m.replyto, $1, $2, $3) if(@bot.auth.allow?("keycmd", m.source, m.replyto))
            elsif (m.message =~ /^tell\s+(\S+)\s+about\s+(.+)$/)
              keyword_tell(m, $1, $2) if(@bot.auth.allow?("keyword", m.source, m.replyto))
            elsif (m.message =~ /^forget\s+(.*)$/)
              key = $1
              if((@bot.auth.allow?("keycmd", m.source, m.replyto)) && @keywords.has_key?(key))
                @keywords.delete(key)
                @bot.okay m.replyto
              end
            elsif (m.message =~ /^keywords$/)
              if(@bot.auth.allow?("keyword", m.source, m.replyto))
                m.reply "There are currently #{@keywords.length} keywords, #{@statickeywords.length} static facts defined."
              end
            end
          else
            # in channel message, not to me
            if(m.message =~ /^'(.*)$/)
              keyword m, $1, false if(@bot.auth.allow?("keyword", m.source))
            elsif(@bot.config["KEYWORD_LISTEN"] == "true" && (m.message =~ /^(.*?)\s+(is|are)\s+(.*)$/))
              # TODO MUCH more selective on what's allowed here
              keyword_command(m.sourcenick, m.replyto, $1, $2, $3, true) if(@bot.auth.allow?("keycmd", m.source))
            end
          end
        end