vrobot4/source/modules/nsfw.rb

95 lines
2.9 KiB
Ruby

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