2019-05-02 18:17:27 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
class UserNotifications < ActionMailer::Base
|
2017-01-09 13:27:27 -05:00
|
|
|
include UserNotificationsHelper
|
2017-04-10 13:15:25 -04:00
|
|
|
include ApplicationHelper
|
2017-04-24 15:26:06 -04:00
|
|
|
helper :application, :email
|
2013-04-26 02:56:28 -04:00
|
|
|
default charset: "UTF-8"
|
2019-07-30 15:05:08 -04:00
|
|
|
layout "email_template"
|
2013-04-26 02:56:28 -04:00
|
|
|
|
2013-06-10 16:46:08 -04:00
|
|
|
include Email::BuildEmailHelper
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
|
|
def signup(user, opts = {})
|
2017-04-20 11:17:24 -04:00
|
|
|
build_user_email_token_by_template("user_notifications.signup", user, opts[:email_token])
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2019-04-10 10:53:52 -04:00
|
|
|
def activation_reminder(user, opts = {})
|
|
|
|
build_user_email_token_by_template(
|
|
|
|
"user_notifications.activation_reminder",
|
|
|
|
user,
|
|
|
|
opts[:email_token],
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2013-06-05 23:16:31 -04:00
|
|
|
def signup_after_approval(user, opts = {})
|
2018-09-05 05:44:26 -04:00
|
|
|
locale = user_locale(user)
|
|
|
|
tips =
|
|
|
|
I18n.t(
|
|
|
|
"system_messages.usage_tips.text_body_template",
|
|
|
|
base_url: Discourse.base_url,
|
|
|
|
locale: locale,
|
|
|
|
)
|
|
|
|
|
2013-06-10 16:46:08 -04:00
|
|
|
build_email(
|
|
|
|
user.email,
|
2013-06-12 16:35:46 -04:00
|
|
|
template: "user_notifications.signup_after_approval",
|
2018-09-05 05:44:26 -04:00
|
|
|
locale: locale,
|
|
|
|
new_user_tips: tips,
|
|
|
|
)
|
2013-06-05 23:16:31 -04:00
|
|
|
end
|
|
|
|
|
2021-04-12 11:08:23 -04:00
|
|
|
def post_approved(user, opts = {})
|
|
|
|
post_url = opts.dig(:notification_data_hash, :post_url)
|
|
|
|
|
|
|
|
return if post_url.nil?
|
|
|
|
|
|
|
|
locale = user_locale(user)
|
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.post_approved",
|
|
|
|
locale: locale,
|
|
|
|
base_url: Discourse.base_url,
|
|
|
|
post_url: post_url,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2021-01-14 17:43:26 -05:00
|
|
|
def signup_after_reject(user, opts = {})
|
|
|
|
locale = user_locale(user)
|
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.signup_after_reject",
|
|
|
|
locale: locale,
|
|
|
|
reject_reason: opts[:reject_reason],
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2018-10-25 05:45:31 -04:00
|
|
|
def suspicious_login(user, opts = {})
|
|
|
|
ipinfo = DiscourseIpInfo.get(opts[:client_ip])
|
2018-12-20 04:23:05 -05:00
|
|
|
location = ipinfo[:location]
|
2018-10-25 05:45:31 -04:00
|
|
|
browser = BrowserDetection.browser(opts[:user_agent])
|
|
|
|
device = BrowserDetection.device(opts[:user_agent])
|
|
|
|
os = BrowserDetection.os(opts[:user_agent])
|
|
|
|
|
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.suspicious_login",
|
|
|
|
locale: user_locale(user),
|
|
|
|
client_ip: opts[:client_ip],
|
|
|
|
location: location.present? ? location : I18n.t("staff_action_logs.unknown"),
|
|
|
|
browser: I18n.t("user_auth_tokens.browser.#{browser}"),
|
|
|
|
device: I18n.t("user_auth_tokens.device.#{device}"),
|
|
|
|
os: I18n.t("user_auth_tokens.os.#{os}"),
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2016-03-07 14:40:11 -05:00
|
|
|
def notify_old_email(user, opts = {})
|
2016-02-03 13:27:58 -05:00
|
|
|
build_email(
|
|
|
|
user.email,
|
2016-03-07 14:40:11 -05:00
|
|
|
template: "user_notifications.notify_old_email",
|
|
|
|
locale: user_locale(user),
|
|
|
|
new_email: opts[:new_email],
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2020-06-10 12:11:49 -04:00
|
|
|
def notify_old_email_add(user, opts = {})
|
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.notify_old_email_add",
|
|
|
|
locale: user_locale(user),
|
|
|
|
new_email: opts[:new_email],
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2016-03-07 14:40:11 -05:00
|
|
|
def confirm_old_email(user, opts = {})
|
2017-04-20 11:17:24 -04:00
|
|
|
build_user_email_token_by_template(
|
|
|
|
"user_notifications.confirm_old_email",
|
|
|
|
user,
|
|
|
|
opts[:email_token],
|
|
|
|
)
|
2016-03-07 14:40:11 -05:00
|
|
|
end
|
|
|
|
|
2020-06-10 12:11:49 -04:00
|
|
|
def confirm_old_email_add(user, opts = {})
|
|
|
|
build_user_email_token_by_template(
|
|
|
|
"user_notifications.confirm_old_email_add",
|
|
|
|
user,
|
|
|
|
opts[:email_token],
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2016-03-07 14:40:11 -05:00
|
|
|
def confirm_new_email(user, opts = {})
|
2017-04-20 11:17:24 -04:00
|
|
|
build_user_email_token_by_template(
|
2023-01-09 07:20:10 -05:00
|
|
|
(
|
2020-10-06 23:02:24 -04:00
|
|
|
if opts[:requested_by_admin]
|
|
|
|
"user_notifications.confirm_new_email_via_admin"
|
2023-01-09 07:20:10 -05:00
|
|
|
else
|
2020-10-06 23:02:24 -04:00
|
|
|
"user_notifications.confirm_new_email"
|
2023-01-09 07:20:10 -05:00
|
|
|
end
|
2020-10-06 23:02:24 -04:00
|
|
|
),
|
2017-04-20 11:17:24 -04:00
|
|
|
user,
|
|
|
|
opts[:email_token],
|
|
|
|
)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def forgot_password(user, opts = {})
|
2017-04-20 11:17:24 -04:00
|
|
|
build_user_email_token_by_template(
|
|
|
|
user.has_password? ? "user_notifications.forgot_password" : "user_notifications.set_password",
|
|
|
|
user,
|
|
|
|
opts[:email_token],
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def email_login(user, opts = {})
|
|
|
|
build_user_email_token_by_template("user_notifications.email_login", user, opts[:email_token])
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
2015-04-27 06:59:48 -04:00
|
|
|
|
|
|
|
def admin_login(user, opts = {})
|
2017-04-20 11:17:24 -04:00
|
|
|
build_user_email_token_by_template("user_notifications.admin_login", user, opts[:email_token])
|
2015-04-27 06:59:48 -04:00
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2014-09-11 12:47:17 -04:00
|
|
|
def account_created(user, opts = {})
|
2017-04-20 11:17:24 -04:00
|
|
|
build_user_email_token_by_template(
|
|
|
|
"user_notifications.account_created",
|
|
|
|
user,
|
|
|
|
opts[:email_token],
|
|
|
|
)
|
2014-09-11 12:47:17 -04:00
|
|
|
end
|
|
|
|
|
2017-11-13 13:41:36 -05:00
|
|
|
def account_silenced(user, opts = nil)
|
|
|
|
opts ||= {}
|
|
|
|
|
|
|
|
return unless user_history = opts[:user_history]
|
|
|
|
|
2021-07-20 06:42:08 -04:00
|
|
|
if user.silenced_forever?
|
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.account_silenced_forever",
|
|
|
|
locale: user_locale(user),
|
|
|
|
reason: user_history.details,
|
|
|
|
)
|
|
|
|
else
|
2024-04-12 10:53:44 -04:00
|
|
|
silenced_till = user.silenced_till.in_time_zone(user.user_option.timezone.presence || "UTC")
|
2021-07-20 06:42:08 -04:00
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.account_silenced",
|
|
|
|
locale: user_locale(user),
|
|
|
|
reason: user_history.details,
|
2022-05-27 05:58:54 -04:00
|
|
|
silenced_till: I18n.l(silenced_till, format: :long),
|
2021-07-20 06:42:08 -04:00
|
|
|
)
|
|
|
|
end
|
2017-11-13 13:41:36 -05:00
|
|
|
end
|
|
|
|
|
2017-09-13 14:43:36 -04:00
|
|
|
def account_suspended(user, opts = nil)
|
|
|
|
opts ||= {}
|
|
|
|
|
|
|
|
return unless user_history = opts[:user_history]
|
|
|
|
|
2021-07-20 06:42:08 -04:00
|
|
|
if user.suspended_forever?
|
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.account_suspended_forever",
|
|
|
|
locale: user_locale(user),
|
|
|
|
reason: user_history.details,
|
|
|
|
)
|
|
|
|
else
|
2024-04-12 10:53:44 -04:00
|
|
|
suspended_till = user.suspended_till.in_time_zone(user.user_option.timezone.presence || "UTC")
|
2021-07-20 06:42:08 -04:00
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.account_suspended",
|
|
|
|
locale: user_locale(user),
|
|
|
|
reason: user_history.details,
|
2022-05-27 05:58:54 -04:00
|
|
|
suspended_till: I18n.l(suspended_till, format: :long),
|
2021-07-20 06:42:08 -04:00
|
|
|
)
|
|
|
|
end
|
2017-09-13 14:43:36 -04:00
|
|
|
end
|
|
|
|
|
2017-10-03 14:08:37 -04:00
|
|
|
def account_exists(user, opts = {})
|
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.account_exists",
|
|
|
|
locale: user_locale(user),
|
|
|
|
email: user.email,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2017-12-21 20:18:12 -05:00
|
|
|
def account_second_factor_disabled(user, opts = {})
|
|
|
|
build_email(
|
|
|
|
user.email,
|
|
|
|
template: "user_notifications.account_second_factor_disabled",
|
|
|
|
locale: user_locale(user),
|
|
|
|
email: user.email,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2016-05-21 09:17:54 -04:00
|
|
|
def digest(user, opts = {})
|
|
|
|
build_summary_for(user)
|
2022-06-21 14:49:47 -04:00
|
|
|
@unsubscribe_key = UnsubscribeKey.create_key_for(@user, UnsubscribeKey::DIGEST_TYPE)
|
|
|
|
|
2024-05-27 11:33:41 -04:00
|
|
|
@since = opts[:since].presence
|
|
|
|
@since ||= [user.last_seen_at, user.user_stat&.digest_attempted_at, 1.month.ago].compact.max
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2016-12-30 15:18:05 -05:00
|
|
|
# Fetch some topics and posts to show
|
2016-12-19 14:53:53 -05:00
|
|
|
digest_opts = {
|
|
|
|
limit: SiteSetting.digest_topics + SiteSetting.digest_other_topics,
|
|
|
|
top_order: true,
|
|
|
|
}
|
2024-05-22 04:23:03 -04:00
|
|
|
topics_for_digest = Topic.for_digest(user, @since, digest_opts)
|
2016-12-19 14:53:53 -05:00
|
|
|
if topics_for_digest.empty? && !user.user_option.try(:include_tl0_in_digests)
|
2016-12-30 15:18:05 -05:00
|
|
|
# Find some topics from new users that are at least 24 hours old
|
2016-12-19 14:53:53 -05:00
|
|
|
topics_for_digest =
|
2024-05-22 04:23:03 -04:00
|
|
|
Topic.for_digest(user, @since, digest_opts.merge(include_tl0: true)).where(
|
2024-04-17 22:27:46 -04:00
|
|
|
"topics.created_at < ?",
|
|
|
|
24.hours.ago,
|
|
|
|
)
|
2016-12-19 14:53:53 -05:00
|
|
|
end
|
2014-04-17 16:04:26 -04:00
|
|
|
|
2016-11-10 18:16:24 -05:00
|
|
|
@popular_topics = topics_for_digest[0, SiteSetting.digest_topics]
|
2016-11-22 13:23:21 -05:00
|
|
|
|
2016-11-10 18:16:24 -05:00
|
|
|
if @popular_topics.present?
|
2017-01-09 13:27:27 -05:00
|
|
|
@other_new_for_you =
|
2023-01-09 07:20:10 -05:00
|
|
|
(
|
2017-01-09 13:27:27 -05:00
|
|
|
if topics_for_digest.size > SiteSetting.digest_topics
|
|
|
|
topics_for_digest[SiteSetting.digest_topics..-1]
|
2023-01-09 07:20:10 -05:00
|
|
|
else
|
2017-01-09 13:27:27 -05:00
|
|
|
[]
|
2023-01-09 07:20:10 -05:00
|
|
|
end
|
|
|
|
)
|
|
|
|
|
2017-01-09 13:27:27 -05:00
|
|
|
@popular_posts =
|
|
|
|
if SiteSetting.digest_posts > 0
|
|
|
|
Post
|
|
|
|
.order("posts.score DESC")
|
2024-05-22 04:23:03 -04:00
|
|
|
.for_mailing_list(user, @since)
|
2017-01-09 13:27:27 -05:00
|
|
|
.where("posts.post_type = ?", Post.types[:regular])
|
|
|
|
.where(
|
|
|
|
"posts.deleted_at IS NULL AND posts.hidden = false AND posts.user_deleted = false",
|
2017-04-12 14:39:59 -04:00
|
|
|
)
|
|
|
|
.where(
|
|
|
|
"posts.post_number > ? AND posts.score > ?",
|
|
|
|
1,
|
|
|
|
ScoreCalculator.default_score_weights[:like_score] * 5.0,
|
2023-01-09 07:20:10 -05:00
|
|
|
)
|
2017-08-14 12:47:33 -04:00
|
|
|
.where("posts.created_at < ?", (SiteSetting.editing_grace_period || 0).seconds.ago)
|
2017-01-09 13:27:27 -05:00
|
|
|
.limit(SiteSetting.digest_posts)
|
|
|
|
else
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
|
|
|
|
@excerpts = {}
|
|
|
|
|
2024-05-22 04:23:03 -04:00
|
|
|
@popular_topics.each do |t|
|
|
|
|
next if t.first_post.blank?
|
|
|
|
@excerpts[t.first_post.id] = email_excerpt(t.first_post.cooked, t.first_post)
|
2017-01-09 13:27:27 -05:00
|
|
|
end
|
|
|
|
|
2016-12-30 15:18:05 -05:00
|
|
|
# Try to find 3 interesting stats for the top of the digest
|
2024-05-22 04:23:03 -04:00
|
|
|
new_topics_count = Topic.for_digest(user, @since).count
|
|
|
|
# We used topics from new users instead, so count should match
|
|
|
|
new_topics_count = topics_for_digest.size if new_topics_count == 0
|
2016-12-30 15:18:05 -05:00
|
|
|
|
|
|
|
@counts = [
|
|
|
|
{
|
2023-05-09 13:19:26 -04:00
|
|
|
id: "new_topics",
|
2016-12-30 15:18:05 -05:00
|
|
|
label_key: "user_notifications.digest.new_topics",
|
|
|
|
value: new_topics_count,
|
|
|
|
href: "#{Discourse.base_url}/new",
|
|
|
|
},
|
|
|
|
]
|
|
|
|
|
2020-05-06 00:23:13 -04:00
|
|
|
# totalling unread notifications (which are low-priority only) and unread
|
|
|
|
# PMs and bookmark reminder notifications, so the total is both unread low
|
|
|
|
# and high priority PMs
|
|
|
|
value = user.unread_notifications + user.unread_high_priority_notifications
|
2016-12-30 15:18:05 -05:00
|
|
|
if value > 0
|
|
|
|
@counts << {
|
2023-05-09 13:19:26 -04:00
|
|
|
id: "unread_notifications",
|
2016-12-30 15:18:05 -05:00
|
|
|
label_key: "user_notifications.digest.unread_notifications",
|
|
|
|
value: value,
|
|
|
|
href: "#{Discourse.base_url}/my/notifications",
|
|
|
|
}
|
2023-01-09 07:20:10 -05:00
|
|
|
end
|
2016-12-30 15:18:05 -05:00
|
|
|
|
|
|
|
if @counts.size < 3
|
2024-05-22 04:23:03 -04:00
|
|
|
value = user.unread_notifications_of_type(Notification.types[:liked], since: @since)
|
2016-12-30 15:18:05 -05:00
|
|
|
if value > 0
|
|
|
|
@counts << {
|
2023-05-09 13:19:26 -04:00
|
|
|
id: "likes_received",
|
2016-12-30 15:18:05 -05:00
|
|
|
label_key: "user_notifications.digest.liked_received",
|
|
|
|
value: value,
|
|
|
|
href: "#{Discourse.base_url}/my/notifications",
|
|
|
|
}
|
2023-01-09 07:20:10 -05:00
|
|
|
end
|
2016-12-30 15:18:05 -05:00
|
|
|
end
|
|
|
|
|
2020-06-01 17:39:16 -04:00
|
|
|
if @counts.size < 3 && user.user_option.digest_after_minutes.to_i >= 1440
|
2024-05-22 04:23:03 -04:00
|
|
|
value = summary_new_users_count(@since)
|
2016-12-30 15:18:05 -05:00
|
|
|
if value > 0
|
|
|
|
@counts << {
|
2023-05-09 13:19:26 -04:00
|
|
|
id: "new_users",
|
2016-12-30 15:18:05 -05:00
|
|
|
label_key: "user_notifications.digest.new_users",
|
|
|
|
value: value,
|
|
|
|
href: "#{Discourse.base_url}/about",
|
|
|
|
}
|
2023-01-09 07:20:10 -05:00
|
|
|
end
|
2016-12-30 15:18:05 -05:00
|
|
|
end
|
|
|
|
|
2024-05-22 04:23:03 -04:00
|
|
|
@preheader_text = I18n.t("user_notifications.digest.preheader", since: @since)
|
2016-12-30 15:18:05 -05:00
|
|
|
|
2016-07-15 05:39:29 -04:00
|
|
|
opts = {
|
2019-01-04 10:08:06 -05:00
|
|
|
from_alias: I18n.t("user_notifications.digest.from", site_name: Email.site_title),
|
2017-03-21 09:11:15 -04:00
|
|
|
subject:
|
|
|
|
I18n.t(
|
|
|
|
"user_notifications.digest.subject_template",
|
|
|
|
email_prefix: @email_prefix,
|
|
|
|
date: short_date(Time.now),
|
2023-01-09 07:20:10 -05:00
|
|
|
),
|
2016-07-15 05:39:29 -04:00
|
|
|
add_unsubscribe_link: true,
|
|
|
|
unsubscribe_url: "#{Discourse.base_url}/email/unsubscribe/#{@unsubscribe_key}",
|
2024-04-17 22:27:46 -04:00
|
|
|
topic_ids: topics_for_digest.pluck(:id),
|
|
|
|
post_ids:
|
|
|
|
topics_for_digest.joins(:posts).where(posts: { post_number: 1 }).pluck("posts.id"),
|
2016-07-15 05:39:29 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
build_email(user.email, opts)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
end
|
2013-02-07 10:45:24 -05:00
|
|
|
|
2013-06-12 16:35:46 -04:00
|
|
|
def user_replied(user, opts)
|
|
|
|
opts[:allow_reply_by_email] = true
|
2014-09-29 01:16:55 -04:00
|
|
|
opts[:use_site_subject] = true
|
2014-10-03 07:44:08 -04:00
|
|
|
opts[:show_category_in_subject] = true
|
2018-07-10 22:24:07 -04:00
|
|
|
opts[:show_tags_in_subject] = true
|
2013-06-12 16:35:46 -04:00
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
|
|
|
def user_quoted(user, opts)
|
|
|
|
opts[:allow_reply_by_email] = true
|
2014-09-29 01:16:55 -04:00
|
|
|
opts[:use_site_subject] = true
|
2014-10-03 07:44:08 -04:00
|
|
|
opts[:show_category_in_subject] = true
|
2018-07-10 22:24:07 -04:00
|
|
|
opts[:show_tags_in_subject] = true
|
2013-06-12 16:35:46 -04:00
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
2016-02-16 12:29:23 -05:00
|
|
|
def user_linked(user, opts)
|
|
|
|
opts[:allow_reply_by_email] = true
|
|
|
|
opts[:use_site_subject] = true
|
|
|
|
opts[:show_category_in_subject] = true
|
2018-07-10 22:24:07 -04:00
|
|
|
opts[:show_tags_in_subject] = true
|
2016-02-16 12:29:23 -05:00
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
2013-06-12 16:35:46 -04:00
|
|
|
def user_mentioned(user, opts)
|
|
|
|
opts[:allow_reply_by_email] = true
|
2014-09-29 01:16:55 -04:00
|
|
|
opts[:use_site_subject] = true
|
2014-10-03 07:44:08 -04:00
|
|
|
opts[:show_category_in_subject] = true
|
2018-07-10 22:24:07 -04:00
|
|
|
opts[:show_tags_in_subject] = true
|
2013-06-12 16:35:46 -04:00
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
2015-11-30 20:12:55 -05:00
|
|
|
def group_mentioned(user, opts)
|
|
|
|
opts[:allow_reply_by_email] = true
|
|
|
|
opts[:use_site_subject] = true
|
|
|
|
opts[:show_category_in_subject] = true
|
2018-07-10 22:24:07 -04:00
|
|
|
opts[:show_tags_in_subject] = true
|
2015-11-30 20:12:55 -05:00
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
2013-06-12 16:35:46 -04:00
|
|
|
def user_posted(user, opts)
|
|
|
|
opts[:allow_reply_by_email] = true
|
2014-09-29 01:16:55 -04:00
|
|
|
opts[:use_site_subject] = true
|
|
|
|
opts[:add_re_to_subject] = true
|
2014-10-03 07:44:08 -04:00
|
|
|
opts[:show_category_in_subject] = true
|
2018-07-10 22:24:07 -04:00
|
|
|
opts[:show_tags_in_subject] = true
|
2013-06-12 16:35:46 -04:00
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
2013-08-07 13:02:49 -04:00
|
|
|
def user_private_message(user, opts)
|
|
|
|
opts[:allow_reply_by_email] = true
|
2014-09-29 01:16:55 -04:00
|
|
|
opts[:use_site_subject] = true
|
|
|
|
opts[:add_re_to_subject] = true
|
2014-10-03 07:44:08 -04:00
|
|
|
opts[:show_category_in_subject] = false
|
2018-07-10 22:24:07 -04:00
|
|
|
opts[:show_tags_in_subject] = false
|
2018-02-19 04:20:17 -05:00
|
|
|
opts[:show_group_in_subject] = true if SiteSetting.group_in_subject
|
2013-08-07 13:02:49 -04:00
|
|
|
|
|
|
|
# We use the 'user_posted' event when you are emailed a post in a PM.
|
2014-06-16 02:36:02 -04:00
|
|
|
opts[:notification_type] = "posted"
|
2013-08-07 13:02:49 -04:00
|
|
|
|
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
2015-04-07 02:21:38 -04:00
|
|
|
def user_invited_to_private_message(user, opts)
|
2016-03-25 08:26:52 -04:00
|
|
|
opts[:allow_reply_by_email] = false
|
|
|
|
opts[:use_invite_template] = true
|
2015-04-07 02:21:38 -04:00
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
2015-03-30 14:36:47 -04:00
|
|
|
def user_invited_to_topic(user, opts)
|
2016-03-25 08:26:52 -04:00
|
|
|
opts[:allow_reply_by_email] = false
|
|
|
|
opts[:use_invite_template] = true
|
2015-03-30 14:36:47 -04:00
|
|
|
opts[:show_category_in_subject] = true
|
2018-07-10 22:24:07 -04:00
|
|
|
opts[:show_tags_in_subject] = true
|
2015-03-30 14:36:47 -04:00
|
|
|
notification_email(user, opts)
|
|
|
|
end
|
|
|
|
|
2016-07-07 12:23:19 -04:00
|
|
|
def user_watching_first_post(user, opts)
|
|
|
|
user_posted(user, opts)
|
|
|
|
end
|
|
|
|
|
2014-02-06 19:06:35 -05:00
|
|
|
def mailing_list_notify(user, post)
|
2016-02-03 13:27:58 -05:00
|
|
|
opts = {
|
2014-02-06 19:06:35 -05:00
|
|
|
post: post,
|
|
|
|
allow_reply_by_email: true,
|
2014-09-29 01:16:55 -04:00
|
|
|
use_site_subject: true,
|
|
|
|
add_re_to_subject: true,
|
2014-10-03 07:44:08 -04:00
|
|
|
show_category_in_subject: true,
|
2018-07-10 22:24:07 -04:00
|
|
|
show_tags_in_subject: true,
|
2014-02-06 19:06:35 -05:00
|
|
|
notification_type: "posted",
|
2016-02-03 13:27:58 -05:00
|
|
|
notification_data_hash: {
|
|
|
|
original_username: post.user.username,
|
|
|
|
topic_title: post.topic.title,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
notification_email(user, opts)
|
2014-02-06 19:06:35 -05:00
|
|
|
end
|
|
|
|
|
2013-06-12 16:35:46 -04:00
|
|
|
protected
|
|
|
|
|
2016-02-09 18:54:13 -05:00
|
|
|
def user_locale(user)
|
2018-09-05 05:44:26 -04:00
|
|
|
user.effective_locale
|
2016-02-09 18:54:13 -05:00
|
|
|
end
|
|
|
|
|
2016-04-11 13:06:10 -04:00
|
|
|
def email_post_markdown(post, add_posted_by = false)
|
2020-09-09 19:50:16 -04:00
|
|
|
result = +"#{post.raw}\n\n"
|
2016-04-11 13:06:10 -04:00
|
|
|
if add_posted_by
|
|
|
|
result << "#{I18n.t("user_notifications.posted_by", username: post.username, post_date: post.created_at.strftime("%m/%d/%Y"))}\n\n"
|
|
|
|
end
|
2013-07-22 15:06:37 -04:00
|
|
|
result
|
|
|
|
end
|
|
|
|
|
2016-02-25 08:05:40 -05:00
|
|
|
def self.get_context_posts(post, topic_user, user)
|
2017-04-24 15:26:06 -04:00
|
|
|
if (user.user_option.email_previous_replies == UserOption.previous_replies_type[:never]) ||
|
|
|
|
SiteSetting.private_email?
|
2016-02-18 21:56:52 -05:00
|
|
|
return []
|
|
|
|
end
|
|
|
|
|
2016-02-12 06:10:30 -05:00
|
|
|
allowed_post_types = [Post.types[:regular]]
|
|
|
|
allowed_post_types << Post.types[:whisper] if topic_user.try(:user).try(:staff?)
|
|
|
|
|
2014-01-31 00:37:40 -05:00
|
|
|
context_posts =
|
|
|
|
Post
|
|
|
|
.where(topic_id: post.topic_id)
|
|
|
|
.where("post_number < ?", post.post_number)
|
|
|
|
.where(user_deleted: false)
|
|
|
|
.where(hidden: false)
|
2016-02-12 06:10:30 -05:00
|
|
|
.where(post_type: allowed_post_types)
|
2014-01-31 00:37:40 -05:00
|
|
|
.order("created_at desc")
|
|
|
|
.limit(SiteSetting.email_posts_context)
|
2023-01-09 07:20:10 -05:00
|
|
|
|
2016-02-25 08:05:40 -05:00
|
|
|
if topic_user && topic_user.last_emailed_post_number &&
|
|
|
|
user.user_option.email_previous_replies ==
|
|
|
|
UserOption.previous_replies_type[:unless_emailed]
|
2014-01-31 00:37:40 -05:00
|
|
|
context_posts = context_posts.where("post_number > ?", topic_user.last_emailed_post_number)
|
|
|
|
end
|
|
|
|
|
|
|
|
context_posts
|
|
|
|
end
|
|
|
|
|
2013-06-12 16:35:46 -04:00
|
|
|
def notification_email(user, opts)
|
2016-02-03 13:27:58 -05:00
|
|
|
notification_type = opts[:notification_type]
|
|
|
|
notification_data = opts[:notification_data_hash]
|
|
|
|
post = opts[:post]
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2016-01-26 20:19:49 -05:00
|
|
|
unless String === notification_type
|
|
|
|
notification_type = Notification.types[notification_type] if Numeric === notification_type
|
|
|
|
notification_type = notification_type.to_s
|
|
|
|
end
|
|
|
|
|
|
|
|
user_name = notification_data[:original_username]
|
|
|
|
|
|
|
|
if post && SiteSetting.enable_names && SiteSetting.display_name_on_email_from
|
2023-02-12 23:39:45 -05:00
|
|
|
name = User.where(id: notification_data[:original_user_id] || post.user_id).pick(:name)
|
2024-05-27 06:27:13 -04:00
|
|
|
user_name = name if name.present?
|
2014-10-21 10:06:55 -04:00
|
|
|
end
|
|
|
|
|
2014-05-06 15:01:19 -04:00
|
|
|
allow_reply_by_email = opts[:allow_reply_by_email] unless user.suspended?
|
2016-01-26 20:19:49 -05:00
|
|
|
original_username =
|
|
|
|
notification_data[:original_username] || notification_data[:display_username]
|
2014-02-06 19:06:35 -05:00
|
|
|
|
2019-01-18 04:52:48 -05:00
|
|
|
if user.staged && post
|
|
|
|
original_subject =
|
|
|
|
IncomingEmail
|
|
|
|
.joins(:post)
|
|
|
|
.where("posts.topic_id = ? AND posts.post_number = 1", post.topic_id)
|
|
|
|
.pluck(:subject)
|
|
|
|
.first
|
|
|
|
end
|
|
|
|
|
|
|
|
if original_subject
|
|
|
|
topic_title = original_subject
|
|
|
|
opts[:use_site_subject] = false
|
|
|
|
opts[:add_re_to_subject] = true
|
|
|
|
use_topic_title_subject = true
|
|
|
|
else
|
|
|
|
topic_title = notification_data[:topic_title]
|
|
|
|
use_topic_title_subject = false
|
|
|
|
end
|
|
|
|
|
2017-07-26 02:51:44 -04:00
|
|
|
email_options = {
|
2019-01-18 04:52:48 -05:00
|
|
|
title: topic_title,
|
2016-01-26 20:19:49 -05:00
|
|
|
post: post,
|
2015-03-30 14:36:47 -04:00
|
|
|
username: original_username,
|
2019-01-04 10:06:21 -05:00
|
|
|
from_alias: I18n.t("email_from", user_name: user_name, site_name: Email.site_title),
|
2014-02-06 19:06:35 -05:00
|
|
|
allow_reply_by_email: allow_reply_by_email,
|
2016-02-22 19:34:16 -05:00
|
|
|
use_site_subject: opts[:use_site_subject],
|
|
|
|
add_re_to_subject: opts[:add_re_to_subject],
|
|
|
|
show_category_in_subject: opts[:show_category_in_subject],
|
2018-07-10 22:24:07 -04:00
|
|
|
show_tags_in_subject: opts[:show_tags_in_subject],
|
2018-02-19 04:20:17 -05:00
|
|
|
show_group_in_subject: opts[:show_group_in_subject],
|
2014-02-06 19:06:35 -05:00
|
|
|
notification_type: notification_type,
|
2016-03-25 08:26:52 -04:00
|
|
|
use_invite_template: opts[:use_invite_template],
|
2019-01-18 04:52:48 -05:00
|
|
|
use_topic_title_subject: use_topic_title_subject,
|
2014-02-06 19:06:35 -05:00
|
|
|
user: user,
|
2017-07-26 02:51:44 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
if group_id = notification_data[:group_id]
|
|
|
|
email_options[:group_name] = Group.find_by(id: group_id)&.name
|
|
|
|
end
|
|
|
|
|
|
|
|
send_notification_email(email_options)
|
2014-02-06 19:06:35 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def send_notification_email(opts)
|
|
|
|
post = opts[:post]
|
|
|
|
title = opts[:title]
|
2017-04-24 15:26:06 -04:00
|
|
|
|
2014-02-06 19:06:35 -05:00
|
|
|
allow_reply_by_email = opts[:allow_reply_by_email]
|
2014-09-29 01:16:55 -04:00
|
|
|
use_site_subject = opts[:use_site_subject]
|
|
|
|
add_re_to_subject = opts[:add_re_to_subject] && post.post_number > 1
|
2019-01-18 04:52:48 -05:00
|
|
|
use_topic_title_subject = opts[:use_topic_title_subject]
|
2014-10-21 10:06:55 -04:00
|
|
|
username = opts[:username]
|
2014-02-06 19:06:35 -05:00
|
|
|
from_alias = opts[:from_alias]
|
|
|
|
notification_type = opts[:notification_type]
|
|
|
|
user = opts[:user]
|
2017-07-26 02:51:44 -04:00
|
|
|
group_name = opts[:group_name]
|
2016-02-09 18:54:13 -05:00
|
|
|
locale = user_locale(user)
|
2014-02-06 19:06:35 -05:00
|
|
|
|
2019-05-02 18:17:27 -04:00
|
|
|
template = +"user_notifications.user_#{notification_type}"
|
2017-03-10 14:07:41 -05:00
|
|
|
if post.topic.private_message?
|
|
|
|
template << "_pm"
|
2017-07-26 02:51:44 -04:00
|
|
|
|
|
|
|
if group_name
|
|
|
|
template << "_group"
|
|
|
|
elsif user.staged
|
|
|
|
template << "_staged"
|
|
|
|
end
|
2017-03-10 14:07:41 -05:00
|
|
|
end
|
|
|
|
|
2014-10-03 07:44:08 -04:00
|
|
|
# category name
|
2018-05-17 01:19:01 -04:00
|
|
|
category = Topic.find_by(id: post.topic_id)&.category
|
2015-06-01 01:43:16 -04:00
|
|
|
if opts[:show_category_in_subject] && post.topic_id && category && !category.uncategorized?
|
2014-10-03 07:44:08 -04:00
|
|
|
show_category_in_subject = category.name
|
|
|
|
|
|
|
|
# subcategory case
|
|
|
|
if !category.parent_category_id.nil?
|
2019-10-21 06:32:27 -04:00
|
|
|
show_category_in_subject =
|
2023-02-12 23:39:45 -05:00
|
|
|
"#{Category.where(id: category.parent_category_id).pick(:name)}/#{show_category_in_subject}"
|
2014-10-03 07:44:08 -04:00
|
|
|
end
|
|
|
|
else
|
|
|
|
show_category_in_subject = nil
|
|
|
|
end
|
|
|
|
|
2018-07-10 22:24:07 -04:00
|
|
|
# tag names
|
|
|
|
if opts[:show_tags_in_subject] && post.topic_id
|
2023-06-14 13:22:14 -04:00
|
|
|
max_tags =
|
|
|
|
if SiteSetting.enable_max_tags_per_email_subject
|
|
|
|
SiteSetting.max_tags_per_email_subject
|
|
|
|
else
|
|
|
|
SiteSetting.max_tags_per_topic
|
|
|
|
end
|
|
|
|
|
2022-11-29 11:35:41 -05:00
|
|
|
tags =
|
|
|
|
DiscourseTagging
|
|
|
|
.visible_tags(Guardian.new(user))
|
|
|
|
.joins(:topic_tags)
|
|
|
|
.where("topic_tags.topic_id = ?", post.topic_id)
|
2023-07-13 03:39:58 -04:00
|
|
|
.order("tags.public_topic_count DESC", "tags.name ASC")
|
2023-06-14 13:22:14 -04:00
|
|
|
.limit(max_tags)
|
2022-11-29 11:35:41 -05:00
|
|
|
.pluck(:name)
|
2018-07-10 22:38:11 -04:00
|
|
|
|
|
|
|
show_tags_in_subject = tags.any? ? tags.join(" ") : nil
|
2018-07-10 22:24:07 -04:00
|
|
|
end
|
|
|
|
|
2021-06-03 00:47:32 -04:00
|
|
|
group = post.topic.allowed_groups&.first
|
|
|
|
|
2018-02-19 04:20:17 -05:00
|
|
|
if post.topic.private_message?
|
|
|
|
subject_pm =
|
2021-06-03 00:47:32 -04:00
|
|
|
if opts[:show_group_in_subject] && group.present?
|
2018-03-11 08:22:11 -04:00
|
|
|
if group.full_name
|
|
|
|
"[#{group.full_name}] "
|
|
|
|
else
|
|
|
|
"[#{group.name}] "
|
2018-02-19 04:20:17 -05:00
|
|
|
end
|
|
|
|
else
|
|
|
|
I18n.t("subject_pm")
|
|
|
|
end
|
2018-05-03 18:50:06 -04:00
|
|
|
|
2022-04-20 12:05:17 -04:00
|
|
|
participants = self.class.participants(post, user)
|
2018-02-19 04:20:17 -05:00
|
|
|
end
|
|
|
|
|
2017-04-24 15:26:06 -04:00
|
|
|
if SiteSetting.private_email?
|
|
|
|
title = I18n.t("system_messages.private_topic_title", id: post.topic_id)
|
|
|
|
end
|
|
|
|
|
2019-05-13 02:31:20 -04:00
|
|
|
context = +""
|
2014-02-06 19:06:35 -05:00
|
|
|
tu = TopicUser.get(post.topic_id, user)
|
2016-02-25 08:05:40 -05:00
|
|
|
context_posts = self.class.get_context_posts(post, tu, user)
|
2013-12-29 21:02:12 -05:00
|
|
|
|
|
|
|
# make .present? cheaper
|
|
|
|
context_posts = context_posts.to_a
|
|
|
|
|
2013-07-22 15:06:37 -04:00
|
|
|
if context_posts.present?
|
2019-05-13 04:23:05 -04:00
|
|
|
context << +"-- \n*#{I18n.t("user_notifications.previous_discussion")}*\n"
|
2019-05-08 11:27:03 -04:00
|
|
|
context_posts.each { |cp| context << email_post_markdown(cp, true) }
|
2013-07-22 15:06:37 -04:00
|
|
|
end
|
|
|
|
|
2017-07-26 02:51:44 -04:00
|
|
|
translation_override_exists =
|
|
|
|
TranslationOverride.where(
|
|
|
|
locale: SiteSetting.default_locale,
|
|
|
|
translation_key: "#{template}.text_body_template",
|
|
|
|
).exists?
|
2016-03-23 00:08:34 -04:00
|
|
|
|
2016-03-25 08:26:52 -04:00
|
|
|
if opts[:use_invite_template]
|
2019-05-02 18:17:27 -04:00
|
|
|
invite_template = +"user_notifications.invited"
|
2019-05-08 11:27:03 -04:00
|
|
|
invite_template << "_group" if group_name
|
2017-07-26 02:51:44 -04:00
|
|
|
|
|
|
|
invite_template << if post.topic.private_message?
|
|
|
|
"_to_private_message_body"
|
|
|
|
else
|
|
|
|
"_to_topic_body"
|
|
|
|
end
|
|
|
|
|
2016-06-10 22:37:33 -04:00
|
|
|
topic_excerpt = post.excerpt.tr("\n", " ") if post.is_first_post? && post.excerpt
|
2019-10-16 03:20:30 -04:00
|
|
|
topic_url = post.topic&.url
|
|
|
|
|
|
|
|
if SiteSetting.private_email?
|
|
|
|
topic_excerpt = ""
|
|
|
|
topic_url = ""
|
|
|
|
end
|
2017-07-26 02:51:44 -04:00
|
|
|
|
|
|
|
message =
|
|
|
|
I18n.t(
|
|
|
|
invite_template,
|
|
|
|
username: username,
|
|
|
|
group_name: group_name,
|
|
|
|
topic_title: gsub_emoji_to_unicode(title),
|
|
|
|
topic_excerpt: topic_excerpt,
|
|
|
|
site_title: SiteSetting.title,
|
2019-10-16 02:56:36 -04:00
|
|
|
site_description: SiteSetting.site_description,
|
2019-10-16 03:20:30 -04:00
|
|
|
topic_url: topic_url,
|
2017-07-26 02:51:44 -04:00
|
|
|
)
|
2017-03-10 14:07:41 -05:00
|
|
|
|
2019-07-30 15:05:08 -04:00
|
|
|
html = PrettyText.cook(message, sanitize: false).html_safe
|
2015-04-07 02:21:38 -04:00
|
|
|
else
|
2017-03-10 14:07:41 -05:00
|
|
|
reached_limit = SiteSetting.max_emails_per_day_per_user > 0
|
2018-07-27 00:32:07 -04:00
|
|
|
reached_limit &&=
|
|
|
|
(EmailLog.where(user_id: user.id).where("created_at > ?", 1.day.ago).count) >=
|
2017-03-10 14:07:41 -05:00
|
|
|
(SiteSetting.max_emails_per_day_per_user - 1)
|
|
|
|
|
2016-02-25 08:05:40 -05:00
|
|
|
in_reply_to_post = post.reply_to_post if user.user_option.email_in_reply_to
|
2017-04-24 15:26:06 -04:00
|
|
|
if SiteSetting.private_email?
|
|
|
|
message = I18n.t("system_messages.contents_hidden")
|
|
|
|
else
|
2018-12-03 22:48:13 -05:00
|
|
|
message =
|
|
|
|
email_post_markdown(post) +
|
|
|
|
(
|
|
|
|
if reached_limit
|
|
|
|
"\n\n#{I18n.t "user_notifications.reached_limit", count: SiteSetting.max_emails_per_day_per_user}"
|
2023-01-09 07:20:10 -05:00
|
|
|
else
|
2018-12-03 22:48:13 -05:00
|
|
|
""
|
2023-01-09 07:20:10 -05:00
|
|
|
end
|
2018-12-03 22:48:13 -05:00
|
|
|
)
|
2017-04-24 15:26:06 -04:00
|
|
|
end
|
|
|
|
|
2021-06-25 12:05:50 -04:00
|
|
|
first_footer_classes = "highlight"
|
2018-06-11 18:54:39 -04:00
|
|
|
if (allow_reply_by_email && user.staged) || (user.suspended? || user.staged?)
|
|
|
|
first_footer_classes = ""
|
|
|
|
end
|
|
|
|
|
2017-03-10 14:07:41 -05:00
|
|
|
unless translation_override_exists
|
2019-10-09 17:50:48 -04:00
|
|
|
html =
|
|
|
|
UserNotificationRenderer.render(
|
2017-03-10 14:07:41 -05:00
|
|
|
template: "email/notification",
|
|
|
|
format: :html,
|
|
|
|
locals: {
|
|
|
|
context_posts: context_posts,
|
|
|
|
reached_limit: reached_limit,
|
|
|
|
post: post,
|
|
|
|
in_reply_to_post: in_reply_to_post,
|
2018-06-11 18:54:39 -04:00
|
|
|
classes: Rtl.new(user).css_class,
|
2021-06-27 20:42:06 -04:00
|
|
|
first_footer_classes: first_footer_classes,
|
|
|
|
reply_above_line: false,
|
2017-03-10 14:07:41 -05:00
|
|
|
},
|
|
|
|
)
|
|
|
|
end
|
2015-12-09 13:45:46 -05:00
|
|
|
end
|
2013-07-24 03:13:15 -04:00
|
|
|
|
2013-02-27 18:30:14 -05:00
|
|
|
email_opts = {
|
2017-07-21 14:24:28 -04:00
|
|
|
topic_title: Emoji.gsub_emoji_to_unicode(title),
|
2019-12-11 21:49:21 -05:00
|
|
|
topic_title_url_encoded: title ? UrlHelper.encode_component(title) : title,
|
2016-03-25 08:26:52 -04:00
|
|
|
message: message,
|
2017-04-24 15:26:06 -04:00
|
|
|
url: post.url(without_slug: SiteSetting.private_email?),
|
2014-02-06 19:06:35 -05:00
|
|
|
post_id: post.id,
|
|
|
|
topic_id: post.topic_id,
|
2013-07-22 15:06:37 -04:00
|
|
|
context: context,
|
2014-10-21 10:06:55 -04:00
|
|
|
username: username,
|
2017-07-26 02:51:44 -04:00
|
|
|
group_name: group_name,
|
2021-06-27 18:55:13 -04:00
|
|
|
add_unsubscribe_link: !user.staged,
|
2016-06-03 09:48:54 -04:00
|
|
|
mailing_list_mode: user.user_option.mailing_list_mode,
|
2016-06-16 21:27:52 -04:00
|
|
|
unsubscribe_url: post.unsubscribe_url(user),
|
2014-02-06 19:06:35 -05:00
|
|
|
allow_reply_by_email: allow_reply_by_email,
|
2016-02-26 17:56:56 -05:00
|
|
|
only_reply_by_email: allow_reply_by_email && user.staged,
|
2014-09-29 01:16:55 -04:00
|
|
|
use_site_subject: use_site_subject,
|
|
|
|
add_re_to_subject: add_re_to_subject,
|
2014-10-03 07:44:08 -04:00
|
|
|
show_category_in_subject: show_category_in_subject,
|
2018-07-10 22:24:07 -04:00
|
|
|
show_tags_in_subject: show_tags_in_subject,
|
2014-06-06 09:09:00 -04:00
|
|
|
private_reply: post.topic.private_message?,
|
2018-02-19 04:20:17 -05:00
|
|
|
subject_pm: subject_pm,
|
2018-05-03 18:50:06 -04:00
|
|
|
participants: participants,
|
2016-04-11 13:06:10 -04:00
|
|
|
include_respond_instructions: !(user.suspended? || user.staged?),
|
2024-05-13 14:59:15 -04:00
|
|
|
notification_type: notification_type,
|
2014-01-21 01:24:05 -05:00
|
|
|
template: template,
|
2019-01-18 04:52:48 -05:00
|
|
|
use_topic_title_subject: use_topic_title_subject,
|
2015-04-07 02:21:38 -04:00
|
|
|
site_description: SiteSetting.site_description,
|
|
|
|
site_title: SiteSetting.title,
|
2019-12-11 21:49:21 -05:00
|
|
|
site_title_url_encoded: UrlHelper.encode_component(SiteSetting.title),
|
2021-06-27 18:55:13 -04:00
|
|
|
locale: locale,
|
2013-02-27 18:30:14 -05:00
|
|
|
}
|
|
|
|
|
2017-03-10 14:07:41 -05:00
|
|
|
email_opts[:html_override] = html unless translation_override_exists
|
|
|
|
|
2013-02-27 18:30:14 -05:00
|
|
|
# If we have a display name, change the from address
|
2015-08-12 17:00:16 -04:00
|
|
|
email_opts[:from_alias] = from_alias if from_alias.present?
|
2013-02-27 18:30:14 -05:00
|
|
|
|
2014-02-06 19:06:35 -05:00
|
|
|
TopicUser.change(user.id, post.topic_id, last_emailed_post_number: post.post_number)
|
2013-12-29 21:02:12 -05:00
|
|
|
|
2013-06-10 16:46:08 -04:00
|
|
|
build_email(user.email, email_opts)
|
2013-02-07 10:45:24 -05:00
|
|
|
end
|
2016-05-21 09:17:54 -04:00
|
|
|
|
2022-04-20 12:05:17 -04:00
|
|
|
def self.participants(post, recipient_user, reveal_staged_email: false)
|
|
|
|
list = []
|
|
|
|
|
|
|
|
allowed_groups = post.topic.allowed_groups.order("user_count DESC")
|
|
|
|
|
|
|
|
allowed_groups.each do |g|
|
|
|
|
list.push("[#{g.name_full_preferred} (#{g.user_count})](#{g.full_url})")
|
|
|
|
break if list.size >= SiteSetting.max_participant_names
|
|
|
|
end
|
|
|
|
|
|
|
|
recent_posts_query =
|
|
|
|
post
|
|
|
|
.topic
|
|
|
|
.posts
|
|
|
|
.select("user_id, MAX(post_number) AS post_number")
|
|
|
|
.where(post_type: Post.types[:regular], post_number: ..post.post_number)
|
|
|
|
.where.not(user_id: recipient_user.id)
|
|
|
|
.group(:user_id)
|
|
|
|
.order("post_number DESC")
|
|
|
|
.limit(SiteSetting.max_participant_names)
|
|
|
|
.to_sql
|
2023-01-09 07:20:10 -05:00
|
|
|
|
2022-04-20 12:05:17 -04:00
|
|
|
allowed_users =
|
|
|
|
post
|
|
|
|
.topic
|
|
|
|
.allowed_users
|
|
|
|
.joins("LEFT JOIN (#{recent_posts_query}) pu ON topic_allowed_users.user_id = pu.user_id")
|
|
|
|
.order("post_number DESC NULLS LAST", :id)
|
|
|
|
.where.not(id: recipient_user.id)
|
|
|
|
.human_users
|
|
|
|
|
|
|
|
allowed_users.each do |u|
|
|
|
|
break if list.size >= SiteSetting.max_participant_names
|
|
|
|
|
|
|
|
if reveal_staged_email && u.staged?
|
|
|
|
list.push("#{u.email}")
|
|
|
|
else
|
|
|
|
list.push("[#{u.display_name}](#{u.full_url})")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
participants = list.join(I18n.t("word_connector.comma"))
|
|
|
|
others_count = allowed_groups.size + allowed_users.size - list.size
|
|
|
|
|
|
|
|
if others_count > 0
|
|
|
|
I18n.t(
|
|
|
|
"user_notifications.more_pm_participants",
|
|
|
|
participants: participants,
|
|
|
|
count: others_count,
|
|
|
|
)
|
|
|
|
else
|
|
|
|
participants
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-05-21 09:17:54 -04:00
|
|
|
private
|
|
|
|
|
2017-04-20 11:17:24 -04:00
|
|
|
def build_user_email_token_by_template(template, user, email_token)
|
|
|
|
build_email(user.email, template: template, locale: user_locale(user), email_token: email_token)
|
|
|
|
end
|
|
|
|
|
2016-05-21 09:17:54 -04:00
|
|
|
def build_summary_for(user)
|
2024-05-22 04:23:03 -04:00
|
|
|
@site_name = SiteSetting.email_prefix.presence || SiteSetting.title
|
2016-05-21 09:17:54 -04:00
|
|
|
@user = user
|
|
|
|
@date = short_date(Time.now)
|
|
|
|
@base_url = Discourse.base_url
|
2017-03-21 09:11:15 -04:00
|
|
|
@email_prefix = SiteSetting.email_prefix.presence || SiteSetting.title
|
2016-11-10 18:16:24 -05:00
|
|
|
@header_color = ColorScheme.hex_for_name("header_primary")
|
|
|
|
@header_bgcolor = ColorScheme.hex_for_name("header_background")
|
2016-05-21 09:17:54 -04:00
|
|
|
@anchor_color = ColorScheme.hex_for_name("tertiary")
|
|
|
|
@markdown_linker = MarkdownLinker.new(@base_url)
|
2019-07-30 15:05:08 -04:00
|
|
|
@disable_email_custom_styles = !SiteSetting.apply_custom_styles_to_digest
|
2016-06-21 11:12:30 -04:00
|
|
|
end
|
2019-10-25 16:33:05 -04:00
|
|
|
|
2024-05-22 04:23:03 -04:00
|
|
|
def summary_new_users_count(since)
|
|
|
|
date = since.is_a?(String) ? since : since.strftime("%Y-%m-%d")
|
|
|
|
key = "summary-new-users:#{date}"
|
|
|
|
Discourse.redis.get(key)&.to_i ||
|
|
|
|
User
|
|
|
|
.real
|
|
|
|
.activated
|
|
|
|
.not_staged
|
|
|
|
.not_suspended
|
|
|
|
.where("created_at > ?", date)
|
|
|
|
.count
|
|
|
|
.tap { Discourse.redis.setex(key, 1.day, _1) }
|
2019-10-25 16:33:05 -04:00
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|