diff --git a/app/logical/moderator/ip_addr_search.rb b/app/logical/moderator/ip_addr_search.rb index 70231f23f..da9f604ce 100644 --- a/app/logical/moderator/ip_addr_search.rb +++ b/app/logical/moderator/ip_addr_search.rb @@ -19,11 +19,46 @@ module Moderator end end + def find_common_users + user = User.find_by_name(params[:user_name]) + ip_addrs = Set.new + user_ids = {} + + ip_addrs.merge(find_distinct_ip_addrs("comments", "ip_addr", "creator_id", user.id)) + ip_addrs.merge(find_distinct_ip_addrs("post_versions", "updater_ip_addr", "updater_id", user.id)) + ip_addrs.merge(find_distinct_ip_addrs("note_versions", "updater_ip_addr", "updater_id", user.id)) + ip_addrs.merge(find_distinct_ip_addrs("pool_versions", "updater_ip_addr", "updater_id", user.id)) + ip_addrs.merge(find_distinct_ip_addrs("wiki_page_versions", "updater_ip_addr", "updater_id", user.id)) + ip_addrs.merge(find_distinct_ip_addrs("dmails", "creator_ip_addr", "from_id", user.id)) + + ip_addrs.each do |ip_addr| + find_distinct_user_ids(user_ids, "comments", "ip_addr", "creator_id", ip_addrs.to_a) + find_distinct_user_ids(user_ids, "post_versions", "updater_ip_addr", "updater_id", ip_addrs.to_a) + find_distinct_user_ids(user_ids, "note_versions", "updater_ip_addr", "updater_id", ip_addrs.to_a) + find_distinct_user_ids(user_ids, "pool_versions", "updater_ip_addr", "updater_id", ip_addrs.to_a) + find_distinct_user_ids(user_ids, "wiki_page_versions", "updater_ip_addr", "updater_id", ip_addrs.to_a) + find_distinct_user_ids(user_ids, "dmails", "creator_ip_addr", "from_id", ip_addrs.to_a) + end + + user_ids + end + private def select_all_sql(sql, *params) ActiveRecord::Base.select_all_sql(sql, *params) end + def find_distinct_ip_addrs(table_name, ip_field_name, user_field_name, user_id) + select_all_sql("select #{ip_field_name} from #{table_name} where updated_at >= ? and #{user_field_name} = ? group by #{ip_field_name}", 3.months.ago, user_id).rows.flatten + end + + def find_distinct_user_ids(user_ids, table_name, ip_field_name, user_field_name, ip_addrs) + select_all_sql("select #{user_field_name}, count(*) from #{table_name} where updated_at >= ? and #{ip_field_name} in (?) group by #{user_field_name}", 3.months.ago, ip_addrs).rows.each do |user_id, count| + user_ids[user_id] ||= 0 + user_ids[user_id] += count.to_i + end + end + def search_by_ip_addr(ip_addrs) sums = Hash.new {|h, k| h[k] = 0} diff --git a/app/views/moderator/ip_addrs/index.html.erb b/app/views/moderator/ip_addrs/index.html.erb index bca873222..3b02561ab 100644 --- a/app/views/moderator/ip_addrs/index.html.erb +++ b/app/views/moderator/ip_addrs/index.html.erb @@ -2,11 +2,24 @@
The following users share IP addresses used by <%= params[:user_name] %>. This searches across comments, post changes, note changes, pool changes, wiki changes, and dmails over the past 3 months.
+ +| User | +Count | +
|---|---|
| <%= link_to User.id_to_name(user_id), users_path(user_id) %> | +<%= count %> | +