diff --git a/Gemfile b/Gemfile index 98f7c7c67..9a86e1b40 100644 --- a/Gemfile +++ b/Gemfile @@ -14,7 +14,6 @@ gem 'ruby-vips' gem 'net-sftp' gem 'diff-lcs', :require => "diff/lcs/array" gem 'bcrypt', :require => "bcrypt" -gem 'statistics2' gem 'capistrano', '~> 3.10' gem 'capistrano-rails' gem 'capistrano-rbenv' diff --git a/Gemfile.lock b/Gemfile.lock index e5036ca3f..4b18fb70e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -361,7 +361,6 @@ GEM net-scp (>= 1.1.2) net-ssh (>= 2.8.0) stackprof (0.2.15) - statistics2 (0.54) streamio-ffmpeg (3.0.2) multi_json (~> 1.8) stripe (5.14.0) @@ -466,7 +465,6 @@ DEPENDENCIES simplecov sinatra stackprof - statistics2 streamio-ffmpeg stripe unicorn diff --git a/app/logical/danbooru_math.rb b/app/logical/danbooru_math.rb deleted file mode 100644 index d7f1238c8..000000000 --- a/app/logical/danbooru_math.rb +++ /dev/null @@ -1,11 +0,0 @@ -class DanbooruMath - def self.ci_lower_bound(pos, n, confidence = 0.95) - if n == 0 - return 0 - end - - z = Statistics2.pnormaldist(1 - (1 - confidence) / 2) - phat = 1.0 * pos / n - 100 * (phat + z * z / (2 * n) - z * Math.sqrt((phat * (1 - phat) + z * z / (4 * n)) / n)) / (1 + z * z / n) - end -end diff --git a/app/logical/upload_limit.rb b/app/logical/upload_limit.rb index 2bdce1f47..014706210 100644 --- a/app/logical/upload_limit.rb +++ b/app/logical/upload_limit.rb @@ -11,7 +11,23 @@ class UploadLimit end def limited? - used_upload_slots >= upload_slots + if user.can_upload_free? + false + elsif user.created_at > 1.week.ago + true + else + used_upload_slots >= upload_slots + end + end + + def limit_reason + if user.created_at > 1.week.ago + "cannot upload during your first week of registration" + elsif limited? + "have reached your upload limit" + else + nil + end end def used_upload_slots diff --git a/app/models/post.rb b/app/models/post.rb index bdcfa2632..01fc2c887 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -27,6 +27,7 @@ class Post < ApplicationRecord validate :has_enough_tags validate :post_is_not_its_own_parent validate :updater_can_change_rating + validate :uploader_is_not_limited, on: :create before_save :update_tag_post_counts before_save :set_tag_counts before_create :autoban @@ -1280,7 +1281,7 @@ class Post < ApplicationRecord give_favorites_to_parent(options) if options[:move_favorites] is_automatic = (reason == "Unapproved in three days") - uploader.new_upload_limit.update_limit!(self, incremental: is_automatic) + uploader.upload_limit.update_limit!(self, incremental: is_automatic) unless options[:without_mod_action] ModAction.log("deleted post ##{id}, reason: #{reason}", :post_delete) @@ -1648,6 +1649,10 @@ class Post < ApplicationRecord end end + def uploader_is_not_limited + errors[:uploader] << uploader.upload_limit.limit_reason if uploader.upload_limit.limited? + end + def added_tags_are_valid new_tags = added_tags.select { |t| t.post_count <= 0 } new_general_tags = new_tags.select { |t| t.category == Tag.categories.general } diff --git a/app/models/post_approval.rb b/app/models/post_approval.rb index df65375f5..ddf658a7e 100644 --- a/app/models/post_approval.rb +++ b/app/models/post_approval.rb @@ -32,7 +32,7 @@ class PostApproval < ApplicationRecord post.update(approver: user, is_flagged: false, is_pending: false, is_deleted: false) ModAction.log("undeleted post ##{post_id}", :post_undelete) if is_undeletion - post.uploader.new_upload_limit.update_limit!(post, incremental: !is_undeletion) + post.uploader.upload_limit.update_limit!(post, incremental: !is_undeletion) end def self.search(params) diff --git a/app/models/upload.rb b/app/models/upload.rb index ae6628e61..9d0f0bcc4 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -60,7 +60,6 @@ class Upload < ApplicationRecord before_validation :initialize_attributes, on: :create before_validation :assign_rating_from_tags - validate :uploader_is_not_limited, on: :create # validates :source, format: { with: /\Ahttps?/ }, if: ->(record) {record.file.blank?}, on: :create validates :rating, inclusion: { in: %w(q e s) }, allow_nil: true validates :md5, confirmation: true, if: ->(rec) { rec.md5_confirmation.present? } @@ -235,12 +234,6 @@ class Upload < ApplicationRecord extend SearchMethods include SourceMethods - def uploader_is_not_limited - if !uploader.can_upload? - errors.add(:uploader, uploader.upload_limited_reason) - end - end - def assign_rating_from_tags if rating = Tag.has_metatag?(tag_string, :rating) self.rating = rating.downcase.first diff --git a/app/models/user.rb b/app/models/user.rb index c81987325..4f040511b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -417,26 +417,6 @@ class User < ApplicationRecord end end - def can_upload? - if can_upload_free? - true - elsif is_admin? - true - elsif created_at > 1.week.ago - false - else - upload_limit > 0 - end - end - - def upload_limited_reason - if created_at > 1.week.ago - "cannot upload during your first week of registration" - else - "have reached your upload limit for the day" - end - end - def can_comment? if is_gold? true @@ -469,38 +449,8 @@ class User < ApplicationRecord (is_moderator? && flag.not_uploaded_by?(id)) || flag.creator_id == id end - def new_upload_limit - @new_upload_limit ||= UploadLimit.new(self) - end - def upload_limit - [max_upload_limit - used_upload_slots, 0].max - end - - def used_upload_slots - uploaded_count = posts.where("created_at >= ?", 23.hours.ago).count - uploaded_comic_count = posts.tag_match("comic").where("created_at >= ?", 23.hours.ago).count / 3 - uploaded_count - uploaded_comic_count - end - memoize :used_upload_slots - - def max_upload_limit - [(base_upload_limit * upload_limit_multiplier).ceil, 10].max - end - - def upload_limit_multiplier - (1 - (adjusted_deletion_confidence / 15.0)) - end - - def adjusted_deletion_confidence - [deletion_confidence(60.days.ago), 15].min - end - memoize :adjusted_deletion_confidence - - def deletion_confidence(date) - deletions = posts.deleted.where("created_at >= ?", date).count - total = posts.where("created_at >= ?", date).count - DanbooruMath.ci_lower_bound(deletions, total) + @upload_limit ||= UploadLimit.new(self) end def base_upload_limit @@ -624,7 +574,6 @@ class User < ApplicationRecord forum_post_count comment_count favorite_group_count appeal_count flag_count positive_feedback_count neutral_feedback_count negative_feedback_count upload_limit - max_upload_limit ] end diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb index 48c04953a..dabe583d8 100644 --- a/app/presenters/user_presenter.rb +++ b/app/presenters/user_presenter.rb @@ -43,22 +43,6 @@ class UserPresenter Post.tag_match("search:#{category}").limit(10) end - def upload_limit(template) - if user.can_upload_free? - return "none" - end - - slots_tooltip = "Next free slot: #{template.time_ago_in_words(user.next_free_upload_slot)}" - limit_tooltip = <<-EOS.strip_heredoc - Base: #{user.base_upload_limit} - Del. Rate: #{format("%.2f", user.adjusted_deletion_confidence)} - Multiplier: (1 - (#{format("%.2f", user.adjusted_deletion_confidence)} / 15)) = #{user.upload_limit_multiplier} - Upload Limit: #{user.base_upload_limit} * #{format("%.2f", user.upload_limit_multiplier)} = #{user.max_upload_limit} - EOS - - %{#{user.used_upload_slots} / #{user.max_upload_limit}}.html_safe - end - def uploads Post.tag_match("user:#{user.name}").limit(6) end diff --git a/app/views/uploads/new.html.erb b/app/views/uploads/new.html.erb index 10144ff66..a09e3e1dc 100644 --- a/app/views/uploads/new.html.erb +++ b/app/views/uploads/new.html.erb @@ -2,11 +2,13 @@
Upload limit: <%= CurrentUser.user.presenter.upload_limit(self) %>.
++ Upload Limit: <%= render "users/upload_limit", user: CurrentUser.user %> +
<% end %> <%= render "image" %> @@ -80,7 +82,7 @@ <%= render "related_tags/container" %> <% end %> <% else %> -