job for fixing fa names
This commit is contained in:
@@ -193,6 +193,32 @@ class Domain::Fa::User < ReduxApplicationRecord
|
||||
similar_users_by(:for_followed, exclude_followed_by)
|
||||
end
|
||||
|
||||
def guess_user_page_log_entry
|
||||
for_path = proc { |uri_path|
|
||||
HttpLogEntry.where(
|
||||
uri_scheme: "https",
|
||||
uri_host: "www.furaffinity.net",
|
||||
uri_path: uri_path,
|
||||
).order(created_at: :desc).first
|
||||
}
|
||||
|
||||
for_hle_id = proc { |hle_id|
|
||||
hle_id && HttpLogEntry.find_by(id: hle_id)
|
||||
}
|
||||
|
||||
# older versions don't end in a trailing slash
|
||||
hle_id = self.log_entry_detail && self.log_entry_detail["last_user_page_id"]
|
||||
|
||||
# first try the last scanned user page (present on most fa user models)
|
||||
for_hle_id.call(hle_id) ||
|
||||
# if that's missing, see if there's an existing request logged to the user page
|
||||
for_path.call("/user/#{self.url_name}/") ||
|
||||
# and try the non-trailing-slash version as well
|
||||
for_path.call("/user/#{self.url_name}")
|
||||
|
||||
# TODO - maybe can look for posts as well, those might list an avatar
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def similar_users_by(factor_col, exclude_followed_by)
|
||||
|
||||
@@ -33,28 +33,6 @@ class Domain::Fa::UserAvatar < ReduxApplicationRecord
|
||||
end
|
||||
|
||||
def guess_user_page_log_entry
|
||||
for_path = proc { |uri_path|
|
||||
HttpLogEntry.where(
|
||||
uri_scheme: "https",
|
||||
uri_host: "www.furaffinity.net",
|
||||
uri_path: uri_path,
|
||||
).order(created_at: :desc).first
|
||||
}
|
||||
|
||||
for_hle_id = proc { |hle_id|
|
||||
hle_id && HttpLogEntry.find_by(id: hle_id)
|
||||
}
|
||||
|
||||
# older versions don't end in a trailing slash
|
||||
hle_id = user.log_entry_detail && user.log_entry_detail["last_user_page_id"]
|
||||
|
||||
# first try the last scanned user page (present on most fa user models)
|
||||
for_hle_id.call(hle_id) ||
|
||||
# if that's missing, see if there's an existing request logged to the user page
|
||||
for_path.call("/user/#{user.url_name}/") ||
|
||||
# and try the non-trailing-slash version as well
|
||||
for_path.call("/user/#{user.url_name}")
|
||||
|
||||
# TODO - maybe can look for posts as well, those might list an avatar
|
||||
user.guess_user_page_log_entry
|
||||
end
|
||||
end
|
||||
|
||||
25
rake/fa.rake
25
rake/fa.rake
@@ -1,4 +1,29 @@
|
||||
namespace :fa do
|
||||
desc "fix FurAffinity user name"
|
||||
task :fix_names => [:set_logger_stdout, :environment] do
|
||||
start_at = (ENV["start_at"] || 0).to_i
|
||||
Domain::Fa::User.find_each(start: start_at, batch_size: 100) do |user|
|
||||
page_log_entry = user.guess_user_page_log_entry
|
||||
unless page_log_entry
|
||||
Rails.logger.error("user #{user.id} / #{user.url_name} does not have a scanned user page")
|
||||
next
|
||||
end
|
||||
parser = Domain::Fa::Parser::Page.new(page_log_entry.response.contents, require_logged_in: false)
|
||||
unless parser.probably_user_page?
|
||||
Rails.logger.error("user #{user.id} / #{user.url_name} page #{page_log_entry.id} is not a user page")
|
||||
next
|
||||
end
|
||||
old_name = user.name
|
||||
new_name = parser.user_page.name
|
||||
user.name = new_name
|
||||
if old_name != new_name
|
||||
Rails.logger.info("updated #{user.id} / #{user.url_name} - #{old_name} -> #{new_name}")
|
||||
else
|
||||
Rails.logger.info("no change #{user.id} / #{user.url_name} - #{old_name}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc "dump FurAffinity users into json file, sorted by name"
|
||||
task :dump_users => [:set_logger_stdout, :environment] do
|
||||
out_file = ENV["out"] || raise("`out` file not specified (json)")
|
||||
|
||||
Reference in New Issue
Block a user