2013-09-12 17:46:43 -04:00
class ComposerMessagesFinder
def initialize ( user , details )
@user = user
@details = details
end
def find
2014-03-12 10:44:08 -04:00
check_reviving_old_topic ||
2013-09-12 17:46:43 -04:00
check_education_message ||
2013-12-19 13:45:55 -05:00
check_new_user_many_replies ||
2013-09-13 13:49:34 -04:00
check_avatar_notification ||
2013-09-17 14:38:39 -04:00
check_sequential_replies ||
check_dominating_topic
2013-09-12 17:46:43 -04:00
end
# Determines whether to show the user education text
def check_education_message
if creating_topic?
count = @user . created_topic_count
education_key = :education_new_topic
else
2013-09-14 00:32:18 -04:00
count = @user . post_count
2013-09-12 17:46:43 -04:00
education_key = :education_new_reply
end
2013-09-17 12:11:17 -04:00
if count < SiteSetting . educate_until_posts
2013-09-12 17:46:43 -04:00
education_posts_text = I18n . t ( 'education.until_posts' , count : SiteSetting . educate_until_posts )
return { templateName : 'composer/education' ,
wait_for_typing : true ,
body : PrettyText . cook ( SiteContent . content_for ( education_key , education_posts_text : education_posts_text ) ) }
end
nil
end
2013-12-19 13:45:55 -05:00
# New users have a limited number of replies in a topic
def check_new_user_many_replies
return unless replying? && @user . posted_too_much_in_topic? ( @details [ :topic_id ] )
{ templateName : 'composer/education' , body : PrettyText . cook ( I18n . t ( 'education.too_many_replies' , newuser_max_replies_per_topic : SiteSetting . newuser_max_replies_per_topic ) ) }
end
2013-09-12 17:46:43 -04:00
# Should a user be contacted to update their avatar?
def check_avatar_notification
# A user has to be basic at least to be considered for an avatar notification
return unless @user . has_trust_level? ( :basic )
# We don't notify users who have avatars or who have been notified already.
return if @user . user_stat . has_custom_avatar? || UserHistory . exists_for_user? ( @user , :notified_about_avatar )
# Finally, we don't check users whose avatars haven't been examined
return unless UserHistory . exists_for_user? ( @user , :checked_for_custom_avatar )
# If we got this far, log that we've nagged them about the avatar
UserHistory . create! ( action : UserHistory . actions [ :notified_about_avatar ] , target_user_id : @user . id )
# Return the message
{ templateName : 'composer/education' , body : PrettyText . cook ( I18n . t ( 'education.avatar' , profile_path : " /users/ #{ @user . username_lower } " ) ) }
end
2013-09-13 13:49:34 -04:00
# Is a user replying too much in succession?
def check_sequential_replies
# We only care about replies to topics
return unless replying? && @details [ :topic_id ] &&
2013-09-14 00:32:18 -04:00
# And who have posted enough
2013-09-17 12:11:17 -04:00
( @user . post_count > = SiteSetting . educate_until_posts ) &&
2013-09-13 13:49:34 -04:00
# And who haven't been notified about sequential replies already
2013-09-17 14:38:39 -04:00
! UserHistory . exists_for_user? ( @user , :notified_about_sequential_replies , topic_id : @details [ :topic_id ] )
2013-09-13 13:49:34 -04:00
# Count the topics made by this user in the last day
recent_posts_user_ids = Post . where ( topic_id : @details [ :topic_id ] )
. where ( " created_at > ? " , 1 . day . ago )
. order ( 'created_at desc' )
. limit ( SiteSetting . sequential_replies_threshold )
. pluck ( :user_id )
# Did we get back as many posts as we asked for, and are they all by the current user?
return if recent_posts_user_ids . size != SiteSetting . sequential_replies_threshold ||
recent_posts_user_ids . detect { | u | u != @user . id }
# If we got this far, log that we've nagged them about the sequential replies
2013-09-17 14:38:39 -04:00
UserHistory . create! ( action : UserHistory . actions [ :notified_about_sequential_replies ] ,
target_user_id : @user . id ,
topic_id : @details [ :topic_id ] )
2013-09-13 13:49:34 -04:00
{ templateName : 'composer/education' ,
wait_for_typing : true ,
2014-03-06 15:35:47 -08:00
extraClass : 'urgent' ,
2013-09-13 13:49:34 -04:00
body : PrettyText . cook ( I18n . t ( 'education.sequential_replies' ) ) }
end
2013-09-17 14:38:39 -04:00
def check_dominating_topic
# We only care about replies to topics for a user who has posted enough
return unless replying? &&
@details [ :topic_id ] &&
( @user . post_count > = SiteSetting . educate_until_posts ) &&
2014-02-07 05:49:45 +05:30
! UserHistory . exists_for_user? ( @user , :notified_about_dominating_topic , topic_id : @details [ :topic_id ] )
2013-09-17 14:38:39 -04:00
2014-05-06 14:41:59 +01:00
topic = Topic . find_by ( id : @details [ :topic_id ] )
2013-09-17 14:38:39 -04:00
return if topic . blank? ||
topic . user_id == @user . id ||
2014-02-07 05:49:45 +05:30
topic . posts_count < SiteSetting . summary_posts_required ||
topic . archetype == Archetype . private_message
2013-09-17 14:38:39 -04:00
posts_by_user = @user . posts . where ( topic_id : topic . id ) . count
ratio = ( posts_by_user . to_f / topic . posts_count . to_f )
return if ratio < ( SiteSetting . dominating_topic_minimum_percent . to_f / 100 . 0 )
# Log the topic notification
2014-02-07 05:49:45 +05:30
UserHistory . create! ( action : UserHistory . actions [ :notified_about_dominating_topic ] ,
2013-09-17 14:38:39 -04:00
target_user_id : @user . id ,
topic_id : @details [ :topic_id ] )
{ templateName : 'composer/education' ,
wait_for_typing : true ,
2014-03-06 15:35:47 -08:00
extraClass : 'urgent' ,
2013-09-17 14:38:39 -04:00
body : PrettyText . cook ( I18n . t ( 'education.dominating_topic' , percent : ( ratio * 100 ) . round ) ) }
end
2014-03-12 10:44:08 -04:00
def check_reviving_old_topic
return unless @details [ :topic_id ]
2014-05-06 14:41:59 +01:00
topic = Topic . find_by ( id : @details [ :topic_id ] )
2014-03-12 10:44:08 -04:00
2014-03-19 17:04:42 -07:00
return unless replying?
2014-03-12 10:44:08 -04:00
return if topic . nil? ||
SiteSetting . warn_reviving_old_topic_age < 1 ||
topic . last_posted_at > SiteSetting . warn_reviving_old_topic_age . days . ago
{ templateName : 'composer/education' ,
wait_for_typing : false ,
extraClass : 'urgent' ,
body : PrettyText . cook ( I18n . t ( 'education.reviving_old_topic' , days : ( Time . zone . now - topic . last_posted_at ) . round / 1 . day ) ) }
end
2013-09-12 17:46:43 -04:00
private
def creating_topic?
return @details [ :composerAction ] == " createTopic "
end
def replying?
return @details [ :composerAction ] == " reply "
end
2014-02-07 05:49:45 +05:30
end