diff --git a/reddit_place/activity.py b/reddit_place/activity.py new file mode 100644 index 0000000..dc9b854 --- /dev/null +++ b/reddit_place/activity.py @@ -0,0 +1,20 @@ +from r2.lib import amqp, baseplate_integration, websockets + +from reddit_place.controllers import PLACE_SUBREDDIT + + +@baseplate_integration.with_root_span("job.place_activity") +def broadcast_activity(): + activity = PLACE_SUBREDDIT.count_activity() + if activity and activity.logged_in: + websockets.send_broadcast( + namespace="/place", + type="activity", + payload={ + "count": activity.logged_in.count, + }, + ) + + # ensure the message we put on the amqp worker queue is flushed before we + # exit. + amqp.worker.join() diff --git a/reddit_place/controllers.py b/reddit_place/controllers.py index 4e4551d..1332e27 100644 --- a/reddit_place/controllers.py +++ b/reddit_place/controllers.py @@ -164,6 +164,10 @@ def GET_canvasse(self, is_embed, is_webview): "place_fullscreen": is_embed or is_webview, } + activity = PLACE_SUBREDDIT.count_activity() + if activity and activity.logged_in: + js_config["place_active_visitors"] = activity.logged_in.count + if is_embed: # ensure we're off the cookie domain before allowing embedding if request.host != g.media_domain: @@ -394,6 +398,10 @@ def add_place_config(config): config["place_canvas_height"] = CANVAS_HEIGHT config["place_cooldown"] = cooldown + activity = c.site.count_activity() + if activity and activity.logged_in: + config["place_active_visitors"] = activity.logged_in.count + @controller_hooks.on("extra_stylesheets") def add_place_stylesheet(extra_stylesheets): diff --git a/upstart/reddit-job-place_activity.conf b/upstart/reddit-job-place_activity.conf new file mode 100644 index 0000000..91f8fc5 --- /dev/null +++ b/upstart/reddit-job-place_activity.conf @@ -0,0 +1,10 @@ +description "periodically broadcast active visitors on the place canvas" + +task +manual +stop on reddit-stop or runlevel [016] + +script + . /etc/default/reddit + wrap-job paster run $REDDIT_INI -c 'from reddit_place import activity; activity.broadcast_activity()' +end script