mirror of
https://github.com/discourse/discourse.git
synced 2024-12-06 04:36:18 +08:00
b57b079ff2
This removes all custom controllers and redis/messagebus logic from discourse-presence, and replaces it with core's new PresenceChannel system.
All functionality should be retained. This implementation should scale much better to large numbers of users, reduce the number of HTTP requests made by clients, and reduce the volume of messages on the MessageBus.
For more information on PresenceChannel, see 31db8352
73 lines
2.7 KiB
Ruby
73 lines
2.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# name: discourse-presence
|
|
# about: Show which users are replying to a topic, or editing a post
|
|
# version: 2.0
|
|
# authors: André Pereira, David Taylor, tgxworld
|
|
# url: https://github.com/discourse/discourse/tree/main/plugins/discourse-presence
|
|
# transpile_js: true
|
|
|
|
enabled_site_setting :presence_enabled
|
|
hide_plugin if self.respond_to?(:hide_plugin)
|
|
|
|
register_asset 'stylesheets/presence.scss'
|
|
|
|
after_initialize do
|
|
|
|
register_presence_channel_prefix("discourse-presence") do |channel_name|
|
|
if topic_id = channel_name[/\/discourse-presence\/reply\/(\d+)/, 1]
|
|
topic = Topic.find(topic_id)
|
|
config = PresenceChannel::Config.new
|
|
|
|
if topic.private_message?
|
|
config.allowed_user_ids = topic.allowed_users.pluck(:id)
|
|
config.allowed_group_ids = topic.allowed_groups.pluck(:group_id) + [::Group::AUTO_GROUPS[:staff]]
|
|
elsif secure_group_ids = topic.secure_group_ids
|
|
config.allowed_group_ids = secure_group_ids
|
|
else
|
|
# config.public=true would make data available to anon, so use the tl0 group instead
|
|
config.allowed_group_ids = [ ::Group::AUTO_GROUPS[:trust_level_0] ]
|
|
end
|
|
|
|
config
|
|
elsif topic_id = channel_name[/\/discourse-presence\/whisper\/(\d+)/, 1]
|
|
Topic.find(topic_id) # Just ensure it exists
|
|
PresenceChannel::Config.new(allowed_group_ids: [::Group::AUTO_GROUPS[:staff]])
|
|
elsif post_id = channel_name[/\/discourse-presence\/edit\/(\d+)/, 1]
|
|
post = Post.find(post_id)
|
|
topic = Topic.find(post.topic_id)
|
|
|
|
config = PresenceChannel::Config.new
|
|
config.allowed_group_ids = [ ::Group::AUTO_GROUPS[:staff] ]
|
|
|
|
# Locked and whisper posts are staff only
|
|
next config if post.locked? || post.whisper?
|
|
|
|
config.allowed_user_ids = [ post.user_id ]
|
|
|
|
if topic.private_message? && post.wiki
|
|
# Ignore trust level and just publish to all allowed groups since
|
|
# trying to figure out which users in the allowed groups have
|
|
# the necessary trust levels can lead to a large array of user ids
|
|
# if the groups are big.
|
|
config.allowed_user_ids += topic.allowed_users.pluck(:id)
|
|
config.allowed_group_ids += topic.allowed_groups.pluck(:id)
|
|
elsif post.wiki
|
|
config.allowed_group_ids << Group::AUTO_GROUPS[:"trust_level_#{SiteSetting.min_trust_to_edit_wiki_post}"]
|
|
end
|
|
|
|
if !topic.private_message? && SiteSetting.trusted_users_can_edit_others?
|
|
config.allowed_group_ids << Group::AUTO_GROUPS[:trust_level_4]
|
|
end
|
|
|
|
if SiteSetting.enable_category_group_moderation? && group_id = topic.category&.reviewable_by_group_id
|
|
config.allowed_group_ids << group_id
|
|
end
|
|
|
|
config
|
|
end
|
|
rescue ActiveRecord::RecordNotFound
|
|
nil
|
|
end
|
|
end
|