about summary refs log tree commit diff
path: root/app/lib
diff options
context:
space:
mode:
Diffstat (limited to 'app/lib')
-rw-r--r--app/lib/feed_manager.rb38
1 files changed, 38 insertions, 0 deletions
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