Add support for group mentions
This commit is contained in:
parent
209daf7801
commit
f3347b0a92
|
@ -14,7 +14,7 @@ class DiscourseChat::Rule < DiscourseChat::PluginModel
|
||||||
validates :filter, :inclusion => { :in => %w(watch follow mute),
|
validates :filter, :inclusion => { :in => %w(watch follow mute),
|
||||||
:message => "%{value} is not a valid filter" }
|
:message => "%{value} is not a valid filter" }
|
||||||
|
|
||||||
validates :type, :inclusion => { :in => %w(normal group_message),
|
validates :type, :inclusion => { :in => %w(normal group_message group_mention),
|
||||||
:message => "%{value} is not a valid filter" }
|
:message => "%{value} is not a valid filter" }
|
||||||
|
|
||||||
validate :channel_valid?, :category_valid?, :group_valid?, :tags_valid?
|
validate :channel_valid?, :category_valid?, :group_valid?, :tags_valid?
|
||||||
|
@ -80,6 +80,7 @@ class DiscourseChat::Rule < DiscourseChat::PluginModel
|
||||||
super(val.to_i)
|
super(val.to_i)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Mock foreign key
|
# Mock foreign key
|
||||||
|
|
|
@ -27,9 +27,18 @@ module DiscourseChat
|
||||||
return if group_ids_with_access.empty?
|
return if group_ids_with_access.empty?
|
||||||
matching_rules = DiscourseChat::Rule.with_type('group_message').with_group_ids(group_ids_with_access)
|
matching_rules = DiscourseChat::Rule.with_type('group_message').with_group_ids(group_ids_with_access)
|
||||||
else
|
else
|
||||||
matching_rules = DiscourseChat::Rule.with_category_id(topic.category_id)
|
matching_rules = DiscourseChat::Rule.with_type('normal').with_category_id(topic.category_id)
|
||||||
if topic.category # Also load the rules for the wildcard category
|
if topic.category # Also load the rules for the wildcard category
|
||||||
matching_rules += DiscourseChat::Rule.with_category_id(nil)
|
matching_rules += DiscourseChat::Rule.with_type('normal').with_category_id(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# If groups are mentioned, check for any matching rules and append them
|
||||||
|
mentions = post.raw_mentions
|
||||||
|
if mentions && mentions.length > 0
|
||||||
|
groups = Group.where('LOWER(name) IN (?)', mentions)
|
||||||
|
if groups.exists?
|
||||||
|
matching_rules += DiscourseChat::Rule.with_type('group_mention').with_group_ids(groups.map(&:id))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,19 @@ RSpec.describe DiscourseChat::Rule do
|
||||||
expect(DiscourseChat::Rule.with_group_ids([group2.id]).length).to eq(1)
|
expect(DiscourseChat::Rule.with_group_ids([group2.id]).length).to eq(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'can be filtered by type' do
|
||||||
|
group1 = Fabricate(:group)
|
||||||
|
|
||||||
|
rule2 = DiscourseChat::Rule.create!(channel: channel, type: 'group_message', group_id: group1.id)
|
||||||
|
rule3 = DiscourseChat::Rule.create!(channel: channel, type: 'group_mention', group_id: group1.id)
|
||||||
|
|
||||||
|
expect(DiscourseChat::Rule.all.length).to eq(3)
|
||||||
|
|
||||||
|
expect(DiscourseChat::Rule.with_type('group_message').length).to eq(1)
|
||||||
|
expect(DiscourseChat::Rule.with_type('group_mention').length).to eq(1)
|
||||||
|
expect(DiscourseChat::Rule.with_type('normal').length).to eq(1)
|
||||||
|
end
|
||||||
|
|
||||||
it 'can be sorted by precedence' do
|
it 'can be sorted by precedence' do
|
||||||
rule2 = DiscourseChat::Rule.create(channel:channel, filter:'mute')
|
rule2 = DiscourseChat::Rule.create(channel:channel, filter:'mute')
|
||||||
rule3 = DiscourseChat::Rule.create(channel:channel, filter:'follow')
|
rule3 = DiscourseChat::Rule.create(channel:channel, filter:'follow')
|
||||||
|
|
|
@ -134,6 +134,17 @@ RSpec.describe DiscourseChat::Manager do
|
||||||
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id, chan2.id)
|
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id, chan2.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should work for group mentions" do
|
||||||
|
third_post = Fabricate(:post, topic: topic, post_number: 3, raw: "let's mention @#{group.name}")
|
||||||
|
|
||||||
|
DiscourseChat::Rule.create!(channel: chan1, filter: 'watch') # Wildcard watch
|
||||||
|
DiscourseChat::Rule.create!(channel: chan2, type: 'group_message', filter: 'watch', group_id: group.id)
|
||||||
|
DiscourseChat::Rule.create!(channel: chan3, type: 'group_mention', filter: 'watch', group_id: group.id)
|
||||||
|
|
||||||
|
manager.trigger_notifications(third_post.id)
|
||||||
|
expect(provider.sent_to_channel_ids).to contain_exactly(chan1.id, chan3.id)
|
||||||
|
end
|
||||||
|
|
||||||
it "should not notify about posts the chat_user cannot see" do
|
it "should not notify about posts the chat_user cannot see" do
|
||||||
DiscourseChat::Rule.create!(channel: chan1, filter: 'follow', category_id: nil ) # Wildcard watch
|
DiscourseChat::Rule.create!(channel: chan1, filter: 'follow', category_id: nil ) # Wildcard watch
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue