private
def process_status
- status_params = process_status_params
+ @tags = []
+ @mentions = []
+ @params = {}
- ApplicationRecord.transaction do
- @status = Status.create!(status_params)
+ process_status_params
+ process_tags
- process_tags(@status)
+ ApplicationRecord.transaction do
+ @status = Status.create!(@params)
+ attach_tags(@status)
end
resolve_thread(@status)
end
def process_status_params
- {
- uri: @object['id'],
- url: object_url || @object['id'],
- account: @account,
- text: text_from_content || '',
- language: detected_language,
- spoiler_text: text_from_summary || '',
- created_at: @object['published'],
- override_timestamps: @options[:override_timestamps],
- reply: @object['inReplyTo'].present?,
- sensitive: @object['sensitive'] || false,
- visibility: visibility_from_audience,
- thread: replied_to_status,
- conversation: conversation_from_uri(@object['conversation']),
- media_attachment_ids: process_attachments.take(4).map(&:id),
- }
- end
-
- def process_tags(status)
+ @params = begin
+ {
+ uri: @object['id'],
+ url: object_url || @object['id'],
+ account: @account,
+ text: text_from_content || '',
+ language: detected_language,
+ spoiler_text: text_from_summary || '',
+ created_at: @object['published'],
+ override_timestamps: @options[:override_timestamps],
+ reply: @object['inReplyTo'].present?,
+ sensitive: @object['sensitive'] || false,
+ visibility: visibility_from_audience,
+ thread: replied_to_status,
+ conversation: conversation_from_uri(@object['conversation']),
+ media_attachment_ids: process_attachments.take(4).map(&:id),
+ }
+ end
+ end
+
+ def attach_tags(status)
+ @tags.each do |tag|
+ status.tags << tag
+ TrendingTags.record_use!(hashtag, status.account, status.created_at) if status.public_visibility?
+ end
+
+ @mentions.each do |mention|
+ mention.status = status
+ mention.save
+ end
+ end
+
+ def process_tags
return if @object['tag'].nil?
as_array(@object['tag']).each do |tag|
if equals_or_includes?(tag['type'], 'Hashtag')
- process_hashtag tag, status
+ process_hashtag tag
elsif equals_or_includes?(tag['type'], 'Mention')
- process_mention tag, status
+ process_mention tag
elsif equals_or_includes?(tag['type'], 'Emoji')
- process_emoji tag, status
+ process_emoji tag
end
end
end
- def process_hashtag(tag, status)
+ def process_hashtag(tag)
return if tag['name'].blank?
hashtag = tag['name'].gsub(/\A#/, '').mb_chars.downcase
hashtag = Tag.where(name: hashtag).first_or_create(name: hashtag)
- return if status.tags.include?(hashtag)
+ return if @tags.include?(hashtag)
- status.tags << hashtag
- TrendingTags.record_use!(hashtag, status.account, status.created_at) if status.public_visibility?
+ @tags << hashtag
rescue ActiveRecord::RecordInvalid
nil
end
- def process_mention(tag, status)
+ def process_mention(tag)
return if tag['href'].blank?
account = account_from_uri(tag['href'])
account = ::FetchRemoteAccountService.new.call(tag['href'], id: false) if account.nil?
+
return if account.nil?
- account.mentions.create(status: status)
+
+ @mentions << Mention.new(account: account)
end
- def process_emoji(tag, _status)
+ def process_emoji(tag)
return if skip_download?
return if tag['name'].blank? || tag['icon'].blank? || tag['icon']['url'].blank?