require 'json' require 'net/http' require 'uri' class Mod_NSFW < Vrobot4::Module::Module def self.type() "NSFW" end Vrobot4::Module.add_module_type self, server: "Discord" def initialize info super register :c_danbooru, "danbooru", "Queries Danbooru for an image." register :c_saucenao, "saucenao", "Queries SauceNao for an image." register :c_deletethis, "deletethis", "Deletes the last image by you." @disallowed = info[:danbooru_filters] @danbooru_login = info[:danbooru_login] @danbooru_api_key = info[:danbooru_api_key] @saucenao_api_key = info[:saucenao_api_key] @culling_cache = {} end def c_danbooru m, argv # due to Danbooru not allowing blacklists in API searches, we have to make # do with our own auto-immune system against Bad Tags disallow_regex = /\b(#{@disallowed.join("|")})\b/ if md = argv.match(disallow_regex) raise ArgumentError, "The tag #{md[1]} is disallowed." end parm = { random: true, limit: 50, login: @danbooru_login, api_key: @danbooru_api_key, } parm[:tags] = argv unless argv.empty? uri = URI "https://danbooru.donmai.us/posts.json" uri.query = URI.encode_www_form parm res = Net::HTTP.get_response(uri) if res.is_a? Net::HTTPSuccess json = JSON.parse(res.body).shuffle for obj in json tags = obj["tag_string"] url = obj["file_url"] src = obj["source"] src = "none provided" if src.empty? if !tags.match(disallow_regex) && url && !url.empty? @culling_cache[m.user.id] = m.reply "#{url}\n(source: <#{src}>)" return end end raise ArgumentError, "The query failed due to a tagging error." else m.reply "Couldn't process request. Error code: #{res}" end end def c_saucenao m, argv parm = { output_type: 2, numres: 1, api_key: @saucenao_api_key, url: argv, } uri = URI("https://saucenao.com/search.php") uri.query = URI.encode_www_form parm res = Net::HTTP.get_response(uri) if res.is_a? Net::HTTPSuccess json = JSON.parse res.body if results = json["results"] and results = results[0] and results = results["data"] and results = results["ext_urls"] m.reply "Results found: <#{results.join(">\n<")}>" else raise ArgumentError, "The query failed." end else raise ArgumentError, "Couldn't process request. Error code: #{res}" end end def c_deletethis m, argv if cull = @culling_cache[m.user.id] m.real.delete cull.delete else m.reply "No images to delete." end end end ## EOF