diff --git a/app/logical/d_text.rb b/app/logical/d_text.rb index 269812418..e80591443 100644 --- a/app/logical/d_text.rb +++ b/app/logical/d_text.rb @@ -381,5 +381,12 @@ class DText }) ) end + + # extract the first paragraph `needle` occurs in. + def self.excerpt(dtext, needle) + dtext = dtext.gsub(/\r\n|\r|\n/, "\n") + excerpt = ActionController::Base.helpers.excerpt(dtext, needle, separator: "\n\n", radius: 1, omission: "") + excerpt + end end diff --git a/app/logical/mentionable.rb b/app/logical/mentionable.rb index ea777d2e8..daf8f2374 100644 --- a/app/logical/mentionable.rb +++ b/app/logical/mentionable.rb @@ -39,29 +39,18 @@ module Mentionable end def queue_mention_messages - title = self.class.mentionable_option(:title) from_id = read_attribute(self.class.mentionable_option(:user_field)) text = strip_quote_blocks(read_attribute(self.class.mentionable_option(:message_field))) - bodies = {} - text.scan(DText::MENTION_REGEXP).each do |mention| + names = text.scan(DText::MENTION_REGEXP).map do |mention| mention.gsub!(/(?:^\s*@)|(?:[:;,.!?\)\]<>]$)/, "") - bodies[mention] = self.class.mentionable_option(:body).call(self, mention) end - bodies.each do |name, text| - user = User.find_by_name(name) + names.uniq.each do |name| + body = self.instance_exec(name, &self.class.mentionable_option(:body)) + title = self.instance_exec(name, &self.class.mentionable_option(:title)) - if user - dmail = Dmail.new( - from_id: from_id, - to_id: user.id, - title: title, - body: text - ) - dmail.owner_id = user.id - dmail.save - end + Dmail.create_automated(to_name: name, title: title, body: body) end end end diff --git a/app/models/comment.rb b/app/models/comment.rb index 8418c41b8..b4652eb7c 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -23,8 +23,8 @@ class Comment < ActiveRecord::Base mentionable( :message_field => :body, :user_field => :creator_id, - :title => "You were mentioned in a comment", - :body => lambda {|rec, user_name| "You were mentioned in a \"comment\":/posts/#{rec.post_id}#comment-#{rec.id}\n\n---\n\n[i]#{rec.creator.name} said:[/i]\n\n#{ActionController::Base.helpers.excerpt(rec.body, user_name)}"} + :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"}, ) module SearchMethods diff --git a/app/models/dmail.rb b/app/models/dmail.rb index d6263d1d6..977a63e18 100644 --- a/app/models/dmail.rb +++ b/app/models/dmail.rb @@ -61,7 +61,10 @@ class Dmail < ActiveRecord::Base end def create_automated(params) - create_split(from: Danbooru.config.system_user, **params) + dmail = Dmail.new(from: Danbooru.config.system_user, **params) + dmail.owner = dmail.to + dmail.save + dmail end end diff --git a/app/models/forum_post.rb b/app/models/forum_post.rb index 89d9f8e41..5e299b75e 100644 --- a/app/models/forum_post.rb +++ b/app/models/forum_post.rb @@ -28,8 +28,8 @@ class ForumPost < ActiveRecord::Base mentionable( :message_field => :body, :user_field => :creator_id, - :title => "You were mentioned in a forum topic", - :body => lambda {|rec, user_name| "You were mentioned in the forum topic \"#{rec.topic.title}\":/forum_topics/#{rec.topic_id}?page=#{rec.forum_topic_page}\n\n---\n\n[i]#{rec.creator.name} said:[/i]\n\n#{ActionController::Base.helpers.excerpt(rec.body, user_name)}"} + :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}}, ) module SearchMethods diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb index b62f2fb5e..f55573b12 100644 --- a/test/unit/comment_test.rb +++ b/test/unit/comment_test.rb @@ -57,7 +57,13 @@ class CommentTest < ActiveSupport::TestCase end dmail = Dmail.last - assert_equal("You were mentioned in a \"comment\":/posts/#{@comment.post_id}#comment-#{@comment.id}\n\n---\n\n[i]#{CurrentUser.name} said:[/i]\n\nHey @#{@user2.name} check this out!", dmail.body) + assert_equal(<<-EOS.strip_heredoc, dmail.body) + @#{CurrentUser.name} mentioned you in a \"comment\":/posts/#{@comment.post_id}#comment-#{@comment.id} on post ##{@comment.post_id}: + + [quote] + Hey @#{@user2.name} check this out! + [/quote] + EOS end end end diff --git a/test/unit/dmail_test.rb b/test/unit/dmail_test.rb index f7d220277..05644707c 100644 --- a/test/unit/dmail_test.rb +++ b/test/unit/dmail_test.rb @@ -147,5 +147,26 @@ class DmailTest < ActiveSupport::TestCase recipient.reload assert(!recipient.has_mail?) end + + context "that is automated" do + setup do + @bot = FactoryGirl.create(:user) + Danbooru.config.stubs(:system_user).returns(@bot) + end + + should "only create a copy for the recipient" do + Dmail.create_automated(to: @user, title: "test", body: "test") + + assert @user.dmails.exists?(from: @bot, title: "test", body: "test") + assert !@bot.dmails.exists?(from: @bot, title: "test", body: "test") + end + + should "fail gracefully if recipient doesn't exist" do + assert_nothing_raised do + dmail = Dmail.create_automated(to_name: "this_name_does_not_exist", title: "test", body: "test") + assert_equal(["can't be blank"], dmail.errors[:to_id]) + end + end + end end end diff --git a/test/unit/forum_post_test.rb b/test/unit/forum_post_test.rb index 714d41098..2b60d66d5 100644 --- a/test/unit/forum_post_test.rb +++ b/test/unit/forum_post_test.rb @@ -51,7 +51,13 @@ class ForumPostTest < ActiveSupport::TestCase end dmail = Dmail.last - assert_equal("You were mentioned in the forum topic \"#{@topic.title}\":/forum_topics/#{@topic.id}?page=1\n\n---\n\n[i]#{@user.name} said:[/i]\n\nHey @#{@user2.name} check this out!", dmail.body) + assert_equal(<<-EOS.strip_heredoc, dmail.body) + @#{CurrentUser.name} mentioned you in topic ##{@topic.id} (\"#{@topic.title}\":[/forum_topics/#{@topic.id}?page=1]): + + [quote] + Hey @#{@user2.name} check this out! + [/quote] + EOS end end end diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index 523ff75e8..f9f4f2a3d 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -31,12 +31,11 @@ class UserTest < ActiveSupport::TestCase bot = FactoryGirl.create(:user) Danbooru.config.stubs(:system_user).returns(bot) - assert_difference("Dmail.count", 2) do + assert_difference("Dmail.count", 1) do @user.promote_to!(User::Levels::GOLD) end assert(@user.dmails.exists?(from: bot, to: @user, title: "You have been promoted")) - assert(bot.dmails.exists?(from: bot, to: @user, title: "You have been promoted")) end end