Merge pull request #2899 from evazion/fix-mention-dmails
Send @mention dmails from DanbooruBot
This commit is contained in:
@@ -381,5 +381,12 @@ class DText
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -39,29 +39,18 @@ module Mentionable
|
|||||||
end
|
end
|
||||||
|
|
||||||
def queue_mention_messages
|
def queue_mention_messages
|
||||||
title = self.class.mentionable_option(:title)
|
|
||||||
from_id = read_attribute(self.class.mentionable_option(:user_field))
|
from_id = read_attribute(self.class.mentionable_option(:user_field))
|
||||||
text = strip_quote_blocks(read_attribute(self.class.mentionable_option(:message_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*@)|(?:[:;,.!?\)\]<>]$)/, "")
|
mention.gsub!(/(?:^\s*@)|(?:[:;,.!?\)\]<>]$)/, "")
|
||||||
bodies[mention] = self.class.mentionable_option(:body).call(self, mention)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
bodies.each do |name, text|
|
names.uniq.each do |name|
|
||||||
user = User.find_by_name(name)
|
body = self.instance_exec(name, &self.class.mentionable_option(:body))
|
||||||
|
title = self.instance_exec(name, &self.class.mentionable_option(:title))
|
||||||
|
|
||||||
if user
|
Dmail.create_automated(to_name: name, title: title, body: body)
|
||||||
dmail = Dmail.new(
|
|
||||||
from_id: from_id,
|
|
||||||
to_id: user.id,
|
|
||||||
title: title,
|
|
||||||
body: text
|
|
||||||
)
|
|
||||||
dmail.owner_id = user.id
|
|
||||||
dmail.save
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ class Comment < ActiveRecord::Base
|
|||||||
mentionable(
|
mentionable(
|
||||||
:message_field => :body,
|
:message_field => :body,
|
||||||
:user_field => :creator_id,
|
:user_field => :creator_id,
|
||||||
:title => "You were mentioned in a comment",
|
:title => lambda {|user_name| "#{creator_name} mentioned you in a comment on post ##{post_id}"},
|
||||||
: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)}"}
|
: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
|
module SearchMethods
|
||||||
|
|||||||
@@ -61,7 +61,10 @@ class Dmail < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_automated(params)
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ class ForumPost < ActiveRecord::Base
|
|||||||
mentionable(
|
mentionable(
|
||||||
:message_field => :body,
|
:message_field => :body,
|
||||||
:user_field => :creator_id,
|
:user_field => :creator_id,
|
||||||
:title => "You were mentioned in a forum topic",
|
:title => lambda {|user_name| %{#{creator_name} mentioned you in topic ##{topic_id} (#{topic.title})}},
|
||||||
: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)}"}
|
: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
|
module SearchMethods
|
||||||
|
|||||||
@@ -57,7 +57,13 @@ class CommentTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
dmail = Dmail.last
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -147,5 +147,26 @@ class DmailTest < ActiveSupport::TestCase
|
|||||||
recipient.reload
|
recipient.reload
|
||||||
assert(!recipient.has_mail?)
|
assert(!recipient.has_mail?)
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -51,7 +51,13 @@ class ForumPostTest < ActiveSupport::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
dmail = Dmail.last
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -31,12 +31,11 @@ class UserTest < ActiveSupport::TestCase
|
|||||||
bot = FactoryGirl.create(:user)
|
bot = FactoryGirl.create(:user)
|
||||||
Danbooru.config.stubs(:system_user).returns(bot)
|
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)
|
@user.promote_to!(User::Levels::GOLD)
|
||||||
end
|
end
|
||||||
|
|
||||||
assert(@user.dmails.exists?(from: bot, to: @user, title: "You have been promoted"))
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user