1
0
Fork 0
forked from gitea/nas

Merge branch 'kb_development' into kb_migration

This commit is contained in:
KMY 2023-04-10 14:14:00 +09:00
commit 139030f230
16 changed files with 61 additions and 25 deletions

View file

@ -16,14 +16,15 @@ class Api::V1::Statuses::EmojiReactionedByAccountsController < Api::BaseControll
def load_accounts
scope = default_accounts
# scope = scope.where.not(account_id: current_account.excluded_from_timeline_account_ids) unless current_account.nil?
scope = scope.where.not(account_id: current_account.excluded_from_timeline_account_ids) unless current_account.nil?
scope.merge(paginated_emoji_reactions).to_a
end
def default_accounts
EmojiReaction
.where(status_id: @status.id)
#.where(account: { suspended_at: nil })
.includes(:account)
.where(account: { suspended_at: nil })
end
def paginated_emoji_reactions

View file

@ -6,7 +6,7 @@ class PotentialFriendshipTracker
WEIGHTS = {
reply: 1,
emoji_reaction: 2,
emoji_reaction: 3,
favourite: 10,
reblog: 20,
}.freeze

View file

@ -27,6 +27,10 @@ module HasUserSettings
settings['default_sensitive']
end
def setting_public_post_to_unlisted
settings['public_post_to_unlisted']
end
def setting_unfollow_modal
settings['web.unfollow_modal']
end

View file

@ -28,6 +28,8 @@ class EmojiReaction < ApplicationRecord
has_one :notification, as: :activity, dependent: :destroy
validate :status_emoji_reactions_count
after_create :refresh_cache
after_destroy :refresh_cache
after_destroy :invalidate_cleanup_info
@ -50,4 +52,10 @@ class EmojiReaction < ApplicationRecord
query = query.where(arel_table[:id].gt(since_id)) if since_id.present?
query
end
def status_emoji_reactions_count
if status && account && status.emoji_reactions.where(account: account).count >= EMOJI_REACTION_PER_ACCOUNT_LIMIT
raise Mastodon::ValidationError, I18n.t('reactions.errors.limit_reached')
end
end
end

View file

@ -336,8 +336,8 @@ class Status < ApplicationRecord
end
def refresh_emoji_reactions_grouped_by_name!
generate_emoji_reactions_grouped_by_name.tap do |emoji_reactions|
update_status_stat!(emoji_reactions: emoji_reactions)
generate_emoji_reactions_grouped_by_name.tap do |emoji_reactions_json|
update_status_stat!(emoji_reactions: emoji_reactions_json, emoji_reactions_count: emoji_reactions.size)
end
end

View file

@ -4,14 +4,15 @@
#
# Table name: status_stats
#
# id :bigint(8) not null, primary key
# status_id :bigint(8) not null
# replies_count :bigint(8) default(0), not null
# reblogs_count :bigint(8) default(0), not null
# favourites_count :bigint(8) default(0), not null
# created_at :datetime not null
# updated_at :datetime not null
# emoji_reactions :string
# id :bigint(8) not null, primary key
# status_id :bigint(8) not null
# replies_count :bigint(8) default(0), not null
# reblogs_count :bigint(8) default(0), not null
# favourites_count :bigint(8) default(0), not null
# created_at :datetime not null
# updated_at :datetime not null
# emoji_reactions :string
# emoji_reactions_count :integer default(0), not null
#
class StatusStat < ApplicationRecord
@ -35,6 +36,10 @@ class StatusStat < ApplicationRecord
attributes['emoji_reactions'] || ''
end
def emoji_reactions_count
[attributes['emoji_reactions_count'], 0].max
end
private
def reset_parent_cache

View file

@ -97,7 +97,7 @@ class Trends::Statuses < Trends::Base
def calculate_scores(statuses, at_time)
items = statuses.map do |status|
expected = 1.0
observed = (status.reblogs_count + status.favourites_count).to_f
observed = (status.reblogs_count + status.favourites_count + status.emoji_reactions_count * 0.3).to_f
score = if expected > observed || observed < options[:threshold]
0

View file

@ -16,6 +16,7 @@ class UserSettings
setting :default_sensitive, default: false
setting :default_privacy, default: nil
setting :default_searchability, default: :private
setting :public_post_to_unlisted, default: false
namespace :web do
setting :crop_images, default: true

View file

@ -67,6 +67,7 @@ class PostStatusService < BaseService
@text = @options.delete(:spoiler_text) if @text.blank? && @options[:spoiler_text].present?
@visibility = @options[:visibility] || @account.user&.setting_default_privacy
@visibility = :unlisted if (@visibility&.to_sym == :public || @visibility&.to_sym == :public_unlisted) && @account.silenced?
@visibility = :public_unlisted if @visibility&.to_sym == :public && !@options[:application]&.superapp && @account.user&.setting_public_post_to_unlisted
@searchability= searchability
@scheduled_at = @options[:scheduled_at]&.to_datetime
@scheduled_at = nil if scheduled_in_the_past?
@ -81,9 +82,10 @@ class PostStatusService < BaseService
when :unlisted
case @visibility&.to_sym when :public, :public_unlisted, :unlisted then :unlisted when :private then :private else :direct end
when :private
case @visibility&.to_sym when :public, :public_unlisted, :unlisted, :private then :private else :direct end
# direct message also can be searched by receiver
:private
when nil
@account.searchability
@account.user&.setting_default_searchability || @account.searchability
else
:direct
end

View file

@ -25,6 +25,8 @@ class SearchService < BaseService
private
MIN_SCORE = 0.7
def perform_accounts_search!
AccountSearchService.new.call(
@query,
@ -36,22 +38,22 @@ class SearchService < BaseService
end
def perform_statuses_search!
privacy_definition = parsed_query.apply(StatusesIndex.filter(term: { searchable_by: @account.id }))
privacy_definition = parsed_query.apply(StatusesIndex.filter(term: { searchable_by: @account.id }).min_score(MIN_SCORE))
# 'private' searchability posts are NOT in here because it's already added at previous line.
case @searchability
when 'public'
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'public' }))
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'unlisted' }).filter(terms: { account_id: following_account_ids })) unless following_account_ids.empty?
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'direct' }).filter(term: { account_id: @account.id }))
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'public' }).min_score(MIN_SCORE))
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'unlisted' }).filter(terms: { account_id: following_account_ids }).min_score(MIN_SCORE)) unless following_account_ids.empty?
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'direct' }).filter(term: { account_id: @account.id }).min_score(MIN_SCORE))
when 'unlisted', 'private'
privacy_definition = privacy_definition.or(StatusesIndex.filter(terms: { searchability: %w(public unlisted) }).filter(terms: { account_id: following_account_ids })) unless following_account_ids.empty?
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'direct' }).filter(term: { account_id: @account.id }))
privacy_definition = privacy_definition.or(StatusesIndex.filter(terms: { searchability: %w(public unlisted) }).filter(terms: { account_id: following_account_ids }).min_score(MIN_SCORE)) unless following_account_ids.empty?
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'direct' }).filter(term: { account_id: @account.id }).min_score(MIN_SCORE))
when 'direct'
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'direct' }).filter(term: { account_id: @account.id }))
privacy_definition = privacy_definition.or(StatusesIndex.filter(term: { searchability: 'direct' }).filter(term: { account_id: @account.id }).min_score(MIN_SCORE))
end
definition = parsed_query.apply(StatusesIndex).order(id: :desc)
definition = parsed_query.apply(StatusesIndex.min_score(MIN_SCORE).track_scores(true)).order(id: :desc)
definition = definition.filter(term: { account_id: @options[:account_id] }) if @options[:account_id].present?
definition = definition.and(privacy_definition)

View file

@ -26,6 +26,9 @@
.fields-group
= ff.input :default_searchability, collection: Status.selectable_searchabilities, wrapper: :with_label, include_blank: false, label_method: lambda { |searchability| safe_join([I18n.t("statuses.searchabilities.#{searchability}"), I18n.t("statuses.searchabilities.#{searchability}_long")], ' - ') }, required: false, hint: false, label: I18n.t('simple_form.labels.defaults.setting_default_searchability')
.fields-group
= ff.input :public_post_to_unlisted, wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_public_post_to_unlisted'), hint: I18n.t('simple_form.hints.defaults.setting_public_post_to_unlisted')
.fields-group
= ff.input :default_sensitive, wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_default_sensitive'), hint: I18n.t('simple_form.hints.defaults.setting_default_sensitive')