Custom_filter working on status_reference

This commit is contained in:
KMY 2023-08-30 17:42:26 +09:00
parent ff06b04e91
commit 76013b10b4
5 changed files with 23 additions and 3 deletions

View file

@ -12,6 +12,9 @@ class InlineRenderer
when :status
serializer = REST::StatusSerializer
preload_associations_for_status
when :status_internal
serializer = REST::StatusInternalSerializer
preload_associations_for_status
when :notification
serializer = REST::NotificationSerializer
when :emoji_reaction

View file

@ -101,7 +101,10 @@ class CustomFilter < ApplicationRecord
next if filter.exclude_follows && following
next if filter.exclude_localusers && status.account.local?
match = rules[:keywords].match(status.proper.searchable_text) if rules[:keywords].present?
if rules[:keywords].present?
match = rules[:keywords].match(status.proper.searchable_text)
match = rules[:keywords].match(status.proper.references.pluck(:text).join("\n\n")) if match.nil? && status.proper.references.exists?
end
keyword_matches = [match.to_s] unless match.nil?
status_matches = [status.id, status.reblog_of_id].compact & rules[:status_ids] if rules[:status_ids].present?

View file

@ -0,0 +1,9 @@
# frozen_string_literal: true
class REST::StatusInternalSerializer < REST::StatusSerializer
attributes :reference_texts
def reference_texts
object.references.pluck(:text)
end
end

View file

@ -195,7 +195,7 @@ class FanOutOnWriteService < BaseService
end
def rendered_status
@rendered_status ||= InlineRenderer.render(@status, nil, :status)
@rendered_status ||= InlineRenderer.render(@status, nil, :status_internal)
end
def update?

View file

@ -763,6 +763,11 @@ const startServer = async () => {
const listener = message => {
const { event, payload } = message;
// reference_texts property is not working if ProcessReferencesWorker is
// used on PostStatusService and so on. (Asynchronous processing)
const reference_texts = payload.reference_texts || [];
delete payload.reference_texts;
// Streaming only needs to apply filtering to some channels and only to
// some events. This is because majority of the filtering happens on the
// Ruby on Rails side when producing the event for streaming.
@ -908,7 +913,7 @@ const startServer = async () => {
if (req.cachedFilters) {
const status = payload;
// TODO: Calculate searchableContent in Ruby on Rails:
const searchableContent = ([status.spoiler_text || '', status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
const searchableContent = ([status.spoiler_text || '', status.content, ...(reference_texts || [])].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
const searchableTextContent = JSDOM.fragment(searchableContent).textContent;
const now = new Date();