From 0077fc26df2982720e5fb278af6540a47859386f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 10 Sep 2016 18:36:48 +0200 Subject: Merge and unmerge timelines on follow/unfollow, solves #21, #22 --- app/lib/feed_manager.rb | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'app/lib') diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index a0c480b94..230e0789d 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -13,4 +13,42 @@ class FeedManager replied_to_user = status.reply? ? status.thread.account : nil (status.reply? && !(follower.id = replied_to_user.id || follower.following?(replied_to_user))) end + + def push(timeline_type, account, status) + redis.zadd(key(timeline_type, account.id), status.id, status.id) + trim(timeline_type, account.id) + ActionCable.server.broadcast("timeline:#{account.id}", type: 'update', timeline: timeline_type, message: inline_render(account, status)) + end + + def trim(type, account_id) + return unless redis.zcard(key(type, account_id)) > FeedManager::MAX_ITEMS + last = redis.zrevrange(key(type, account_id), FeedManager::MAX_ITEMS - 1, FeedManager::MAX_ITEMS - 1) + redis.zremrangebyscore(key(type, account_id), '-inf', "(#{last.last}") + end + + private + + def redis + $redis + end + + def inline_render(target_account, status) + rabl_scope = Class.new do + include RoutingHelper + + 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(target_account)).render + end end -- cgit