diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2016-09-10 18:36:48 +0200 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2016-09-10 18:36:48 +0200 |
commit | 0077fc26df2982720e5fb278af6540a47859386f (patch) | |
tree | c7de413748f9a235779cd354f06d291f84498183 /app/services/fan_out_on_write_service.rb | |
parent | 35b6c4b36aa483e9936315cb72c2cf1fd2f477f6 (diff) |
Merge and unmerge timelines on follow/unfollow, solves #21, #22
Diffstat (limited to 'app/services/fan_out_on_write_service.rb')
-rw-r--r-- | app/services/fan_out_on_write_service.rb | 41 |
1 files changed, 3 insertions, 38 deletions
diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index 973451e33..b8e2f5c22 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -10,13 +10,13 @@ class FanOutOnWriteService < BaseService private def deliver_to_self(status) - push(:home, status.account, status) + FeedManager.instance.push(:home, status.account, status) end def deliver_to_followers(status) status.account.followers.each do |follower| next if !follower.local? || FeedManager.instance.filter_status?(status, follower) - push(:home, follower, status) + FeedManager.instance.push(:home, follower, status) end end @@ -24,42 +24,7 @@ class FanOutOnWriteService < BaseService status.mentions.each do |mention| mentioned_account = mention.account next unless mentioned_account.local? - push(:mentions, mentioned_account, status) + FeedManager.instance.push(:mentions, mentioned_account, status) end end - - def push(type, receiver, status) - redis.zadd(FeedManager.instance.key(type, receiver.id), status.id, status.id) - trim(type, receiver) - ActionCable.server.broadcast("timeline:#{receiver.id}", type: 'update', timeline: type, message: inline_render(receiver, status)) - end - - def trim(type, receiver) - return unless redis.zcard(FeedManager.instance.key(type, receiver.id)) > FeedManager::MAX_ITEMS - - last = redis.zrevrange(FeedManager.instance.key(type, receiver.id), FeedManager::MAX_ITEMS - 1, FeedManager::MAX_ITEMS - 1) - redis.zremrangebyscore(FeedManager.instance.key(type, receiver.id), '-inf', "(#{last.last}") - end - - def redis - $redis - end - - def inline_render(receiver, status) - rabl_scope = Class.new(BaseService) do - def initialize(account) - @account = account - end - - def current_user - @account.user - end - - def current_account - @account - end - end - - Rabl::Renderer.new('api/statuses/show', status, view_path: 'app/views', format: :json, scope: rabl_scope.new(receiver)).render - end end |