Merge branch 'instance_only_statuses' of https://github.com/masto-donte-com-br/mastodon into hometown-dev
This commit is contained in:
@ -50,9 +50,13 @@ class ActivityPub::DeliveryWorker
|
||||
end
|
||||
end
|
||||
|
||||
light.with_threshold(STOPLIGHT_FAILURE_THRESHOLD)
|
||||
.with_cool_off_time(STOPLIGHT_COOLDOWN)
|
||||
.run
|
||||
begin
|
||||
light.with_threshold(STOPLIGHT_FAILURE_THRESHOLD)
|
||||
.with_cool_off_time(STOPLIGHT_COOLDOWN)
|
||||
.run
|
||||
rescue Stoplight::Error::RedLight => e
|
||||
raise e.class, e.message, e.backtrace.first(3)
|
||||
end
|
||||
end
|
||||
|
||||
def failure_tracker
|
||||
|
||||
@ -7,7 +7,7 @@ class MoveWorker
|
||||
@source_account = Account.find(source_account_id)
|
||||
@target_account = Account.find(target_account_id)
|
||||
|
||||
if @target_account.local?
|
||||
if @target_account.local? && @source_account.local?
|
||||
rewrite_follows!
|
||||
else
|
||||
queue_follow_unfollows!
|
||||
@ -21,13 +21,17 @@ class MoveWorker
|
||||
def rewrite_follows!
|
||||
@source_account.passive_relationships
|
||||
.where(account: Account.local)
|
||||
.where.not(account: @target_account.followers.local)
|
||||
.where.not(account_id: @target_account.id)
|
||||
.in_batches
|
||||
.update_all(target_account_id: @target_account.id)
|
||||
end
|
||||
|
||||
def queue_follow_unfollows!
|
||||
bypass_locked = @target_account.local?
|
||||
|
||||
@source_account.followers.local.select(:id).find_in_batches do |accounts|
|
||||
UnfollowFollowWorker.push_bulk(accounts.map(&:id)) { |follower_id| [follower_id, @source_account.id, @target_account.id] }
|
||||
UnfollowFollowWorker.push_bulk(accounts.map(&:id)) { |follower_id| [follower_id, @source_account.id, @target_account.id, bypass_locked] }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
22
app/workers/publish_announcement_reaction_worker.rb
Normal file
22
app/workers/publish_announcement_reaction_worker.rb
Normal file
@ -0,0 +1,22 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class PublishAnnouncementReactionWorker
|
||||
include Sidekiq::Worker
|
||||
include Redisable
|
||||
|
||||
def perform(announcement_id, name)
|
||||
announcement = Announcement.find(announcement_id)
|
||||
|
||||
reaction, = announcement.announcement_reactions.where(name: name).group(:announcement_id, :name, :custom_emoji_id).select('name, custom_emoji_id, count(*) as count, false as me')
|
||||
reaction ||= announcement.announcement_reactions.new(name: name)
|
||||
|
||||
payload = InlineRenderer.render(reaction, nil, :reaction).tap { |h| h[:announcement_id] = announcement_id.to_s }
|
||||
payload = Oj.dump(event: :'announcement.reaction', payload: payload)
|
||||
|
||||
FeedManager.instance.with_active_accounts do |account|
|
||||
redis.publish("timeline:#{account.id}", payload) if redis.exists("subscribed:timeline:#{account.id}")
|
||||
end
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
true
|
||||
end
|
||||
end
|
||||
19
app/workers/publish_scheduled_announcement_worker.rb
Normal file
19
app/workers/publish_scheduled_announcement_worker.rb
Normal file
@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class PublishScheduledAnnouncementWorker
|
||||
include Sidekiq::Worker
|
||||
include Redisable
|
||||
|
||||
def perform(announcement_id)
|
||||
announcement = Announcement.find(announcement_id)
|
||||
|
||||
announcement.publish! unless announcement.published?
|
||||
|
||||
payload = InlineRenderer.render(announcement, nil, :announcement)
|
||||
payload = Oj.dump(event: :announcement, payload: payload)
|
||||
|
||||
FeedManager.instance.with_active_accounts do |account|
|
||||
redis.publish("timeline:#{account.id}", payload) if redis.exists("subscribed:timeline:#{account.id}")
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -7,15 +7,18 @@ class RefollowWorker
|
||||
|
||||
def perform(target_account_id)
|
||||
target_account = Account.find(target_account_id)
|
||||
return unless target_account.protocol == :activitypub
|
||||
return unless target_account.activitypub?
|
||||
|
||||
target_account.passive_relationships.where(account: Account.where(domain: nil)).includes(:account).reorder(nil).find_each do |follow|
|
||||
reblogs = follow.show_reblogs?
|
||||
|
||||
target_account.followers.where(domain: nil).reorder(nil).find_each do |follower|
|
||||
# Locally unfollow remote account
|
||||
follower = follow.account
|
||||
follower.unfollow!(target_account)
|
||||
|
||||
# Schedule re-follow
|
||||
begin
|
||||
FollowService.new.call(follower, target_account)
|
||||
FollowService.new.call(follower, target_account, reblogs: reblogs)
|
||||
rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, HTTP::Error, OpenSSL::SSL::SSLError
|
||||
next
|
||||
end
|
||||
|
||||
@ -6,14 +6,38 @@ class Scheduler::ScheduledStatusesScheduler
|
||||
sidekiq_options unique: :until_executed, retry: 0
|
||||
|
||||
def perform
|
||||
publish_scheduled_statuses!
|
||||
publish_scheduled_announcements!
|
||||
unpublish_expired_announcements!
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def publish_scheduled_statuses!
|
||||
due_statuses.find_each do |scheduled_status|
|
||||
PublishScheduledStatusWorker.perform_at(scheduled_status.scheduled_at, scheduled_status.id)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def due_statuses
|
||||
ScheduledStatus.where('scheduled_at <= ?', Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET)
|
||||
end
|
||||
|
||||
def publish_scheduled_announcements!
|
||||
due_announcements.find_each do |announcement|
|
||||
PublishScheduledAnnouncementWorker.perform_at(announcement.scheduled_at, announcement.id)
|
||||
end
|
||||
end
|
||||
|
||||
def due_announcements
|
||||
Announcement.unpublished.where('scheduled_at IS NOT NULL AND scheduled_at <= ?', Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET)
|
||||
end
|
||||
|
||||
def unpublish_expired_announcements!
|
||||
expired_announcements.in_batches.update_all(published: false, scheduled_at: nil)
|
||||
end
|
||||
|
||||
def expired_announcements
|
||||
Announcement.published.where('ends_at IS NOT NULL AND ends_at <= ?', Time.now.utc)
|
||||
end
|
||||
end
|
||||
|
||||
@ -5,12 +5,15 @@ class UnfollowFollowWorker
|
||||
|
||||
sidekiq_options queue: 'pull'
|
||||
|
||||
def perform(follower_account_id, old_target_account_id, new_target_account_id)
|
||||
def perform(follower_account_id, old_target_account_id, new_target_account_id, bypass_locked = false)
|
||||
follower_account = Account.find(follower_account_id)
|
||||
old_target_account = Account.find(old_target_account_id)
|
||||
new_target_account = Account.find(new_target_account_id)
|
||||
|
||||
FollowService.new.call(follower_account, new_target_account)
|
||||
follow = follower_account.active_relationships.find_by(target_account: old_target_account)
|
||||
reblogs = follow&.show_reblogs?
|
||||
|
||||
FollowService.new.call(follower_account, new_target_account, reblogs: reblogs, bypass_locked: bypass_locked)
|
||||
UnfollowService.new.call(follower_account, old_target_account, skip_unmerge: true)
|
||||
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
|
||||
true
|
||||
|
||||
14
app/workers/unpublish_announcement_worker.rb
Normal file
14
app/workers/unpublish_announcement_worker.rb
Normal file
@ -0,0 +1,14 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class UnpublishAnnouncementWorker
|
||||
include Sidekiq::Worker
|
||||
include Redisable
|
||||
|
||||
def perform(announcement_id)
|
||||
payload = Oj.dump(event: :'announcement.delete', payload: announcement_id.to_s)
|
||||
|
||||
FeedManager.instance.with_active_accounts do |account|
|
||||
redis.publish("timeline:#{account.id}", payload) if redis.exists("subscribed:timeline:#{account.id}")
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user