From 4c54e18c6d1adc4d8be554ddb77903f1eeefa32b Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 4 Aug 2017 22:30:11 -0500 Subject: [PATCH 1/2] mentions: factor out mention parsing to DText.parse_mentions. --- app/logical/d_text.rb | 11 ++++++++++- app/logical/mentionable.rb | 7 +------ app/models/comment.rb | 1 - app/models/forum_post.rb | 1 - 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/logical/d_text.rb b/app/logical/d_text.rb index ea3a9c8d9..81e2d3573 100644 --- a/app/logical/d_text.rb +++ b/app/logical/d_text.rb @@ -9,6 +9,16 @@ class DText "[quote]\n#{creator_name} said:\n\n#{stripped_body}\n[/quote]\n\n" end + def self.parse_mentions(text) + text = strip_blocks(text.to_s, "quote") + + names = text.scan(MENTION_REGEXP).map do |mention| + mention.gsub(/(?:^\s*@)|(?:[:;,.!?\)\]<>]$)/, "") + end + + names.uniq + end + def self.strip_blocks(string, tag) n = 0 stripped = "" @@ -91,4 +101,3 @@ class DText excerpt end end - diff --git a/app/logical/mentionable.rb b/app/logical/mentionable.rb index c4e1306eb..44bb7fba7 100644 --- a/app/logical/mentionable.rb +++ b/app/logical/mentionable.rb @@ -17,13 +17,8 @@ module Mentionable end def queue_mention_messages - from_id = read_attribute(self.class.mentionable_option(:user_field)) text = read_attribute(self.class.mentionable_option(:message_field)) - text = DText.strip_blocks(text, "quote") - - names = text.scan(DText::MENTION_REGEXP).map do |mention| - mention.gsub!(/(?:^\s*@)|(?:[:;,.!?\)\]<>]$)/, "") - end + names = DText.parse_mentions(text) names.uniq.each do |name| body = self.instance_exec(name, &self.class.mentionable_option(:body)) diff --git a/app/models/comment.rb b/app/models/comment.rb index 0a7d13008..60daac47e 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -22,7 +22,6 @@ class Comment < ApplicationRecord attr_accessible :is_sticky, :as => [:moderator, :admin] mentionable( :message_field => :body, - :user_field => :creator_id, :title => lambda {|user_name| "#{creator_name} mentioned you in a comment on post ##{post_id}"}, :body => lambda {|user_name| "@#{creator_name} mentioned you in a \"comment\":/posts/#{post_id}#comment-#{id} on post ##{post_id}:\n\n[quote]\n#{DText.excerpt(body, "@"+user_name)}\n[/quote]\n"}, ) diff --git a/app/models/forum_post.rb b/app/models/forum_post.rb index 78e3c7c13..38c4fffe8 100644 --- a/app/models/forum_post.rb +++ b/app/models/forum_post.rb @@ -27,7 +27,6 @@ class ForumPost < ApplicationRecord end mentionable( :message_field => :body, - :user_field => :creator_id, :title => lambda {|user_name| %{#{creator_name} mentioned you in topic ##{topic_id} (#{topic.title})}}, :body => lambda {|user_name| %{@#{creator_name} mentioned you in topic ##{topic_id} ("#{topic.title}":[/forum_topics/#{topic_id}?page=#{forum_topic_page}]):\n\n[quote]\n#{DText.excerpt(body, "@"+user_name)}\n[/quote]\n}}, ) From 69d47127085f4a67d1d74f934de81eb39bb4d67f Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 4 Aug 2017 23:48:53 -0500 Subject: [PATCH 2/2] mentions: process mentions added in an edit (fix #2736) --- app/logical/mentionable.rb | 10 +++++++--- test/unit/comment_test.rb | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/app/logical/mentionable.rb b/app/logical/mentionable.rb index 44bb7fba7..290c42baf 100644 --- a/app/logical/mentionable.rb +++ b/app/logical/mentionable.rb @@ -8,7 +8,8 @@ module Mentionable def mentionable(options = {}) @mentionable_options = options - after_create :queue_mention_messages + message_field = mentionable_option(:message_field) + after_save :queue_mention_messages, if: :"#{message_field}_changed?" end def mentionable_option(key) @@ -17,8 +18,11 @@ module Mentionable end def queue_mention_messages - text = read_attribute(self.class.mentionable_option(:message_field)) - names = DText.parse_mentions(text) + message_field = self.class.mentionable_option(:message_field) + text = send(message_field) + text_was = send("#{message_field}_was") + + names = DText.parse_mentions(text) - DText.parse_mentions(text_was) names.uniq.each do |name| body = self.instance_exec(name, &self.class.mentionable_option(:body)) diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb index 47541cb09..fa8df48d7 100644 --- a/test/unit/comment_test.rb +++ b/test/unit/comment_test.rb @@ -20,6 +20,21 @@ class CommentTest < ActiveSupport::TestCase Danbooru.config.stubs(:member_comment_time_threshold).returns(1.week.from_now) end + context "added in an edit" do + should "dmail the added user" do + @user1 = FactoryGirl.create(:user) + @user2 = FactoryGirl.create(:user) + @comment = FactoryGirl.create(:comment, :post_id => @post.id, :body => "@#{@user1.name}") + + assert_no_difference("@user1.dmails.count") do + assert_difference("@user2.dmails.count") do + @comment.body = "@#{@user1.name} @#{@user2.name}" + @comment.save + end + end + end + end + context "in a quote block" do setup do @user2 = FactoryGirl.create(:user, :created_at => 2.weeks.ago)