Merge branch 'master' into glitch-soc/merge-upstream

Conflicts:
- `app/models/public_feed.rb`:
  Upstream refactored a bit, glitch-soc had specific code for local-only
  statuses.
  Updated glitch-soc's specific code accordingly.
This commit is contained in:
Claire
2021-01-11 11:55:42 +01:00
44 changed files with 195 additions and 119 deletions

View File

@@ -387,15 +387,17 @@ class Account < ApplicationRecord
end
class Field < ActiveModelSerializers::Model
attributes :name, :value, :verified_at, :account, :errors
attributes :name, :value, :verified_at, :account
def initialize(account, attributes)
@account = account
@attributes = attributes
@name = attributes['name'].strip[0, string_limit]
@value = attributes['value'].strip[0, string_limit]
@verified_at = attributes['verified_at']&.to_datetime
@errors = {}
@original_field = attributes
string_limit = account.local? ? 255 : 2047
super(
account: account,
name: attributes['name'].strip[0, string_limit],
value: attributes['value'].strip[0, string_limit],
verified_at: attributes['verified_at']&.to_datetime,
)
end
def verified?
@@ -417,22 +419,12 @@ class Account < ApplicationRecord
end
def mark_verified!
@verified_at = Time.now.utc
@attributes['verified_at'] = @verified_at
self.verified_at = Time.now.utc
@original_field['verified_at'] = verified_at
end
def to_h
{ name: @name, value: @value, verified_at: @verified_at }
end
private
def string_limit
if account.local?
255
else
2047
end
{ name: name, value: value, verified_at: verified_at }
end
end
@@ -518,7 +510,7 @@ class Account < ApplicationRecord
def from_text(text)
return [] if text.blank?
text.scan(MENTION_RE).map { |match| match.first.split('@', 2) }.uniq.map do |(username, domain)|
text.scan(MENTION_RE).map { |match| match.first.split('@', 2) }.uniq.filter_map do |(username, domain)|
domain = begin
if TagManager.instance.local_domain?(domain)
nil
@@ -527,7 +519,7 @@ class Account < ApplicationRecord
end
end
EntityCache.instance.mention(username, domain)
end.compact
end
end
private

View File

@@ -83,7 +83,7 @@ module StatusThreadingConcern
def find_statuses_from_tree_path(ids, account, promote: false)
statuses = Status.with_accounts(ids).to_a
account_ids = statuses.map(&:account_id).uniq
domains = statuses.map(&:account_domain).compact.uniq
domains = statuses.filter_map(&:account_domain).uniq
relations = relations_map_for_account(account, account_ids, domains)
statuses.reject! { |status| StatusFilter.new(status, account, relations).filtered? }

View File

@@ -46,7 +46,7 @@ class CustomFilter < ApplicationRecord
private
def clean_up_contexts
self.context = Array(context).map(&:strip).map(&:presence).compact
self.context = Array(context).map(&:strip).filter_map(&:presence)
end
def remove_cache

View File

@@ -2,12 +2,11 @@
class HomeFeed < Feed
def initialize(account)
@type = :home
@id = account.id
@account = account
super(:home, account.id)
end
def regenerating?
redis.exists?("account:#{@id}:regeneration")
redis.exists?("account:#{@account.id}:regeneration")
end
end

View File

@@ -2,7 +2,6 @@
class ListFeed < Feed
def initialize(list)
@type = :list
@id = list.id
super(:list, list.id)
end
end

View File

@@ -92,7 +92,7 @@ class Notification < ApplicationRecord
end
def reload_stale_associations!(cached_items)
account_ids = (cached_items.map(&:from_account_id) + cached_items.map { |item| item.target_status&.account_id }.compact).uniq
account_ids = (cached_items.map(&:from_account_id) + cached_items.filter_map { |item| item.target_status&.account_id }).uniq
return if account_ids.empty?

View File

@@ -73,10 +73,12 @@ class Poll < ApplicationRecord
attributes :id, :title, :votes_count, :poll
def initialize(poll, id, title, votes_count)
@poll = poll
@id = id
@title = title
@votes_count = votes_count
super(
poll: poll,
id: id,
title: title,
votes_count: votes_count,
)
end
end

View File

@@ -1,6 +1,6 @@
# frozen_string_literal: true
class PublicFeed < Feed
class PublicFeed
# @param [Account] account
# @param [Hash] options
# @option [Boolean] :with_replies
@@ -35,36 +35,38 @@ class PublicFeed < Feed
private
attr_reader :account, :options
def allow_local_only?
local_account? && (local_only? || @options[:allow_local_only])
local_account? && (local_only? || options[:allow_local_only])
end
def with_reblogs?
@options[:with_reblogs]
options[:with_reblogs]
end
def with_replies?
@options[:with_replies]
options[:with_replies]
end
def local_only?
@options[:local]
options[:local]
end
def remote_only?
@options[:remote]
options[:remote]
end
def account?
@account.present?
account.present?
end
def local_account?
@account&.local?
account&.local?
end
def media_only?
@options[:only_media]
options[:only_media]
end
def public_scope
@@ -96,9 +98,9 @@ class PublicFeed < Feed
end
def account_filters_scope
Status.not_excluded_by_account(@account).tap do |scope|
scope.merge!(Status.not_domain_blocked_by_account(@account)) unless local_only?
scope.merge!(Status.in_chosen_languages(@account)) if @account.chosen_languages.present?
Status.not_excluded_by_account(account).tap do |scope|
scope.merge!(Status.not_domain_blocked_by_account(account)) unless local_only?
scope.merge!(Status.in_chosen_languages(account)) if account.chosen_languages.present?
end
end
end

View File

@@ -387,7 +387,7 @@ class Status < ApplicationRecord
def from_text(text)
return [] if text.blank?
text.scan(FetchLinkCardService::URL_PATTERN).map(&:first).uniq.map do |url|
text.scan(FetchLinkCardService::URL_PATTERN).map(&:first).uniq.filter_map do |url|
status = begin
if TagManager.instance.local_url?(url)
ActivityPub::TagManager.instance.uri_to_resource(url, Status)
@@ -396,7 +396,7 @@ class Status < ApplicationRecord
end
end
status&.distributable? ? status : nil
end.compact
end
end
end

View File

@@ -13,9 +13,8 @@ class TagFeed < PublicFeed
# @option [Boolean] :remote
# @option [Boolean] :only_media
def initialize(tag, account, options = {})
@tag = tag
@account = account
@options = options
@tag = tag
super(account, options)
end
# @param [Integer] limit
@@ -41,15 +40,15 @@ class TagFeed < PublicFeed
private
def tagged_with_any_scope
Status.group(:id).tagged_with(tags_for(Array(@tag.name) | Array(@options[:any])))
Status.group(:id).tagged_with(tags_for(Array(@tag.name) | Array(options[:any])))
end
def tagged_with_all_scope
Status.group(:id).tagged_with_all(tags_for(@options[:all]))
Status.group(:id).tagged_with_all(tags_for(options[:all]))
end
def tagged_with_none_scope
Status.group(:id).tagged_with_none(tags_for(@options[:none]))
Status.group(:id).tagged_with_none(tags_for(options[:none]))
end
def tags_for(names)