catstodon/app/services/react_service.rb
Essem 089cccfcc0
Apply recent emoji reactions PR changes to Catstodon:
- Normalize emojis with variant selectors
- Make name of like content parser function more general
2024-01-14 03:57:44 +01:00

49 lines
1.4 KiB
Ruby

# frozen_string_literal: true
class ReactService < BaseService
include Authorization
include Payloadable
def call(account, status, emoji)
authorize_with account, status, :react?
name, domain = emoji.split('@')
return unless domain.nil? || status.local?
normalized = "#{name}\uFE0F"
name = normalized if StatusReactionValidator::SUPPORTED_EMOJIS.include?(normalized)
custom_emoji = CustomEmoji.find_by(shortcode: name, domain: domain)
reaction = StatusReaction.find_by(account: account, status: status, name: name, custom_emoji: custom_emoji)
return reaction unless reaction.nil?
reaction = StatusReaction.create!(account: account, status: status, name: name, custom_emoji: custom_emoji)
Trends.statuses.register(status)
create_notification(reaction)
increment_statistics
reaction
end
private
def create_notification(reaction)
status = reaction.status
if status.account.local?
LocalNotificationWorker.perform_async(status.account_id, reaction.id, 'StatusReaction', 'reaction')
elsif status.account.activitypub?
ActivityPub::DeliveryWorker.perform_async(build_json(reaction), reaction.account_id, status.account.inbox_url)
end
end
def increment_statistics
ActivityTracker.increment('activity:interactions')
end
def build_json(reaction)
Oj.dump(serialize_payload(reaction, ActivityPub::EmojiReactionSerializer))
end
end