Files
danbooru/app/models/saved_search.rb
2015-12-04 17:34:30 -08:00

150 lines
5.1 KiB
Ruby

class SavedSearch < ActiveRecord::Base
module ListbooruMethods
extend ActiveSupport::Concern
module ClassMethods
def refresh_listbooru(user_id)
return unless Danbooru.config.listbooru_auth_key
user = User.find(user_id)
return unless user.is_gold?
params = {
:user_id => user_id,
:key => Danbooru.config.listbooru_auth_key
}
uri = URI.parse("#{Danbooru.config.listbooru_server}/users")
uri.query = URI.encode_www_form(params)
Net::HTTP.get_response(uri)
end
def reset_listbooru(user_id)
return unless Danbooru.config.listbooru_auth_key
uri = URI.parse("#{Danbooru.config.listbooru_server}/searches")
Net::HTTP.start(uri.host, uri.port) do |http|
req = Net::HTTP::Delete.new("/searches")
req.set_form_data("user_id" => user_id, "all" => "true", "key" => Danbooru.config.listbooru_auth_key)
http.request(req)
end
user = User.find(user_id)
user.saved_searches.each do |saved_search|
update_listbooru_on_create(user_id, saved_search.category, saved_search.tag_query)
end
end
def update_listbooru_on_create(user_id, name, query)
return unless Danbooru.config.listbooru_auth_key
uri = URI.parse("#{Danbooru.config.listbooru_server}/searches")
Net::HTTP.post_form(uri, {"user_id" => user_id, "name" => name.try(:downcase), "query" => query, "key" => Danbooru.config.listbooru_auth_key})
end
def update_listbooru_on_destroy(user_id, name, query)
return unless Danbooru.config.listbooru_auth_key
uri = URI.parse("#{Danbooru.config.listbooru_server}/searches")
Net::HTTP.start(uri.host, uri.port) do |http|
req = Net::HTTP::Delete.new("/searches")
req.set_form_data("user_id" => user_id, "name" => name.try(:downcase), "query" => query, "key" => Danbooru.config.listbooru_auth_key)
http.request(req)
end
end
def update_listbooru_on_update(user_id, old_name, old_query, new_name, new_query)
return unless Danbooru.config.listbooru_auth_key
uri = URI.parse("#{Danbooru.config.listbooru_server}/searches")
Net::HTTP.start(uri.host, uri.port) do |http|
req = Net::HTTP::Put.new("/searches")
req.set_form_data(
"user_id" => user_id,
"old_name" => old_name.try(:downcase),
"old_query" => old_query,
"new_name" => new_name.try(:downcase),
"new_query" => new_query,
"key" => Danbooru.config.listbooru_auth_key
)
http.request(req)
end
end
end
def update_listbooru_on_create
return unless Danbooru.config.listbooru_auth_key
SavedSearch.delay(:queue => "default").update_listbooru_on_create(user_id, category, tag_query)
end
def update_listbooru_on_destroy
return unless Danbooru.config.listbooru_auth_key
SavedSearch.delay(:queue => "default").update_listbooru_on_destroy(user_id, category, tag_query)
end
def update_listbooru_on_update
return unless Danbooru.config.listbooru_auth_key
SavedSearch.delay(:queue => "default").update_listbooru_on_update(user_id, category_was, tag_query_was, category, tag_query)
end
end
include ListbooruMethods
belongs_to :user
validates :tag_query, :presence => true
validate :validate_count
attr_accessible :tag_query, :category
before_create :update_user_on_create
before_update :update_listbooru_on_update
after_destroy :update_user_on_destroy
after_create :update_listbooru_on_create
after_destroy :update_listbooru_on_destroy
validates_uniqueness_of :tag_query, :scope => :user_id
before_validation :normalize
def self.tagged(tags)
where(:tag_query => SavedSearch.normalize(tags)).first
end
def self.normalize(tag_query)
Tag.scan_query(tag_query).join(" ")
end
def self.post_ids(user_id, name = nil)
params = {
"key" => Danbooru.config.listbooru_auth_key,
"user_id" => user_id,
"name" => name
}
uri = URI.parse("#{Danbooru.config.listbooru_server}/users")
uri.query = URI.encode_www_form(params)
Net::HTTP.start(uri.host, uri.port) do |http|
resp = http.request_get(uri.request_uri)
if resp.is_a?(Net::HTTPSuccess)
resp.body.scan(/\d+/).map(&:to_i)
else
raise "HTTP error code: #{resp.code} #{resp.message}"
end
end
end
def normalize
self.category = category.strip.gsub(/\s+/, "_").downcase if category
self.tag_query = SavedSearch.normalize(tag_query)
end
def validate_count
if user.saved_searches.count + 1 > user.max_saved_searches
self.errors[:user] << "can only have up to #{user.max_saved_searches} " + "saved search".pluralize(user.max_saved_searches)
end
end
def update_user_on_create
if !user.has_saved_searches?
user.update_attribute(:has_saved_searches, true)
end
end
def update_user_on_destroy
if user.saved_searches.count == 0
user.update_attribute(:has_saved_searches, false)
end
end
end