diff --git a/source/modules/nsfw.rb b/source/modules/nsfw.rb new file mode 100644 index 0000000..f4c25c8 --- /dev/null +++ b/source/modules/nsfw.rb @@ -0,0 +1,81 @@ +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 a random image." + register :c_saucenao, "saucenao", "Queries SauceNao for an image." + @disallowed = info[:danbooru_filters] + @danbooru_login = info[:danbooru_login] + @danbooru_api_key = info[:danbooru_api_key] + @saucenao_api_key = info[:saucenao_api_key] + 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? + 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 +end + +## EOF