otwarchive-symphonyarchive/script/get_user_data.rb

215 lines
6.2 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
#!script/rails runner
# usage:
# bundle exec rails c
# load "#{Rails.root}/script/get_user_data.rb"
include Rails.application.routes.url_helpers
# Base URL
default_url_options[:host] = ArchiveConfig.APP_URL
# Prompt for the username
print "Enter username: "
login = gets.chomp.downcase
# Find the user
u = User.find_by(login: login)
# Names of user's favorite tags
favorite_tags = u.favorite_tags.joins(:tag).pluck(:name)
# URLs of all comments
comment_urls = []
u.comments.pluck(:id)&.map do |id|
comment_urls << comment_url(id)
end
# URLs of all works user has kudosed
# Kudos can only be on works now, but there is a pull request for admin posts
kudosed_item_urls = []
u.kudos.pluck(:commentable_type, :commentable_id)&.map do |type, id|
kudosed_item_urls << "#{ArchiveConfig.APP_URL}/#{type.underscore.downcase}s/#{id}"
end
# URLs of all nominations made in tag sets
tag_set_nomination_urls = []
TagSetNomination.where(pseud_id: u.pseuds.pluck(:id)).pluck(:id, :owned_tag_set_id)&.map do |id, tag_set_id|
tag_set_nomination_urls << tag_set_nomination_url(tag_set_id: tag_set_id, id: id)
end
# Name of user's Fannish Next of Kin
if u.fannish_next_of_kin
next_of_kin = User.find(u.fannish_next_of_kin.pluck(:user_id)).login
end
# Names of people listing user as their FNOK
next_of_kin_for = []
FannishNextOfKin.where(kin_id: u.id).pluck(:user_id)&.map do |id|
next_of_kin_for << User.find(id).login
end
# List of roles in collections
collection_roles = []
u.pseuds.each do |pseud|
pseud.collection_participants.pluck(:participant_role, :collection_id)&.map do |role, collection_id|
collection_roles << "Role of #{role} in #{collection_url(Collection.find(collection_id).name)}"
end
end
# List of IP addresses
# We handle IPs from the audits table below
ips = []
u.comments.pluck(:ip_address)&.map { |ip| ips << ip unless ip.blank? }
u.works.pluck(:ip_address)&.map { |ip| ips << ip unless ip.blank? }
# List of user agents
user_agents = []
u.comments.pluck(:user_agent)&.map { |ua| user_agents << ua unless ua.blank? }
# Lists of IP addresses and previous email addresses and usernames
# Actions that are or may be taken by admins, e.g. account activation, are
# excluded to avoid revealing admins' IP addresses
# We migrated to Devise on 27 December, 2018
previous_usernames = []
previous_emails = []
audits = u.audits.pluck(:action, :audited_changes, :remote_address)
audits.map do |audit|
action = audit[0]
changes = audit[1]
ip = audit[2]
# Created account
if action == "create"
ips << ip unless ip.blank?
# Other account changes
elsif action == "update"
changes.each do |k, v|
case k
when "accepted_tos_version"
ips << ip unless ip.blank?
# Changed email address
when "email"
ips << ip unless ip.blank?
previous_emails << v[0] unless v[0].blank?
# Changed password, post-Devise
when "encrypted_password"
ips << ip unless ip.blank?
# Failed login attempt, post-Devise
# This is currently only recorded after a password reset or after the
# account is locked and unlocked
when "failed_attempts"
ips << ip unless ip.blank?
# Failed login attempt, pre-Devise
when "failed_login_count"
ips << ip unless ip.blank?
# Failed login attempt that resulted in account being locked, post-Devise
when "locked_at"
ips << ip unless ip.blank?
# Changed username
when "login"
ips << ip unless ip.blank?
previous_usernames << v[0] unless v[0].blank?
# Requested password reset email, pre-Devise
when "recently_reset"
ips << ip unless ip.blank?
# Submitted login form with "Remember me" checked, post-Devise
# This is recorded whether the login attempt was successful or not
when "remember_created_at"
ips << ip unless ip.blank?
# Requested password reset email, post-Devise
when "reset_password_sent_at"
ips << ip unless ip.blank?
# Logged in, post-Devise
when "sign_in_count"
ips << ip unless ip.blank?
end
end
end
end
puts "Data for #{u.login} (#{u.email})"
unless previous_usernames.empty?
puts
puts "Previous Usernames: #{previous_usernames.to_sentence}"
end
unless previous_emails.empty?
puts
puts "Previous Email Addresses: #{previous_emails.to_sentence}"
end
unless ips.empty?
puts
puts "IP Addresses:"
ips.uniq.map do |ip|
puts " #{ip}"
end
end
unless user_agents.empty?
puts
puts "User Agents:"
user_agents.uniq.map do |user_agent|
puts " #{user_agent}"
end
end
if u.fannish_next_of_kin || !next_of_kin_for.empty?
puts
puts "Fannish Next of Kin: #{next_of_kin}" if u.fannish_next_of_kin
puts "Fannish Next of Kin For: #{next_of_kin_for.to_sentence}" unless next_of_kin_for.empty?
end
puts
puts "Pseuds: #{user_pseuds_url(u)}"
puts "Profile: #{user_profile_url(u)}"
puts "Preferences: #{user_preferences_url(u)}"
puts
puts "Works: #{user_works_url(u)}"
puts "Drafts: #{drafts_user_works_url(u)}"
puts "Series: #{user_series_index_url(u)}"
puts "Bookmarks: #{user_bookmarks_url(u)}"
puts
puts "Collections: #{user_collections_url(u)}"
unless collection_roles.empty?
puts "Collection Roles: "
collection_roles.map do |role|
puts " #{role}"
end
end
puts
puts "Tag Sets: #{user_tag_sets_url(u)}"
unless tag_set_nomination_urls.empty?
puts "Tag Set Nominations: "
tag_set_nomination_urls.map do |url|
puts " #{url}"
end
end
puts
puts "Challenge Sign-ups: #{user_signups_url(u)}"
puts "Gift Exchange Assignments: #{user_assignments_url(u)}"
puts "Prompt Meme Claims: #{user_claims_url(u)}"
puts
puts "History and Marked for Later: #{user_readings_url(u)}"
puts "Subscriptions: #{user_subscriptions_url(u)}"
puts
puts "Gifts: #{user_gifts_url(u)}"
puts "Related Works: #{user_related_works_url(u)}"
puts
puts "Skins: #{user_skins_url(u)}"
puts
puts "Invitations: #{user_invitations_url(u)}"
unless favorite_tags.empty?
puts
puts "Favorite Tags: #{favorite_tags.to_sentence}"
end
unless comment_urls.empty?
puts
puts "Comments Left: "
comment_urls.map do |url|
puts " #{url}"
end
end
unless kudosed_item_urls.empty?
puts
puts "Kudos Given To: "
kudosed_item_urls.map do |url|
puts " #{url}"
end
end