diff --git a/README.md b/README.md
index 0d0f9c8..1bb8299 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,19 @@
## CWHQ Discourse Bot
-This plugin adds extra functionality to the @system user on a Discourse forum.
+This plugin adds **extra** functionality to the @system user on a Discourse forum.
## Installing The Plugin
Follow this [guide](https://meta.discourse.org/t/install-plugins-in-discourse/19157) to install this plugin.
## Features
This plugin can:
- - Suggest users add links to their topic if they are missing one in certain categories
- - Suggest users remove links from their topic title
- - Allow Helpers to close topics
- - Allow Helpers to remove system message
- - Allow useful links to be displayed
+ - Suggest users **add** **links** to their topic if they are missing one in certain categories
+ - Suggest users **remove** **links** from their topic title
+ - Allow Helpers to **close** topics
+ - Allow Helpers to **remove** system message
+ - Allow useful **links** to be **displayed**
## Contributing
-All pull requests must be error free and working as intended.
+**All** pull requests must be error free and working as intended.
## License
MIT
diff --git a/plugin.rb b/plugin.rb
index 004b614..9822763 100644
--- a/plugin.rb
+++ b/plugin.rb
@@ -256,3 +256,245 @@ def send_pm_to_author(author_username, topic_id, message)
end
end
+after_initialize do
+ DiscourseEvent.on(:user_created) do |user|
+ system_user = Discourse.system_user
+ welcome_message = <<~TEXT
+ Hi #{user.username},
+
+ Welcome to the CWHQ Discourse Forum! We're glad to have you here. If you have any questions or need assistance, feel free to ask.
+
+ Best,
+ The CWHQ Team
+ TEXT
+
+ PostCreator.create!(
+ system_user,
+ target_user: user,
+ title: "Welcome to CWHQ!",
+ raw: welcome_message
+ )
+ end
+end
+after_initialize do
+ PROFANE_WORDS = [
+ "arse", "arsehead", "arsehole", "ass", "ass hole", "asshole", "bastard", "bitch", "bloody", "bollocks",
+ "brotherfucker", "bugger", "bullshit", "child-fucker", "Christ on a bike", "Christ on a cracker", "cock",
+ "cocksucker", "crap", "cunt", "dammit", "damn", "damned", "damn it", "dick", "dick-head", "dickhead",
+ "dumb ass", "dumb-ass", "dumbass", "dyke", "father-fucker", "fatherfucker", "frigger", "fuck", "fucker",
+ "fucking", "god dammit", "god damn", "goddammit", "God damn", "goddamn", "Goddamn", "goddamned",
+ "goddamnit", "godsdamn", "hell", "holy shit", "horseshit", "in shit", "jack-ass", "jackarse", "jackass",
+ "Jesus Christ", "Jesus fuck", "Jesus H. Christ", "Jesus Harold Christ", "Jesus, Mary and Joseph", "Jesus wept",
+ "kike", "mother fucker", "mother-fucker", "motherfucker", "nigga", "nigra", "pigfucker", "piss", "prick",
+ "pussy", "shit", "shit ass", "shite", "sibling fucker", "sisterfuck", "sisterfucker", "slut",
+ "son of a whore", "son of a bitch", "spastic", "sweet Jesus", "twat", "wanker"
+ ]
+
+ HELP_LINKS = "
+ [Forum Videos](https://forum.codewizardshq.com/t/informational-videos/8662)
+ [Rules Of The Forum](https://forum.codewizardshq.com/t/rules-of-the-codewizardshq-community-forum/43)
+ [Create Good Questions And Answers](https://forum.codewizardshq.com/t/create-good-questions-and-answers/69)
+ [Forum Guide](https://forum.codewizardshq.com/t/forum-new-user-guide/47)
+ [Meet Forum Helpers](https://forum.codewizardshq.com/t/meet-the-forum-helpers/5474)
+ [System Documentation](https://forum.codewizardshq.com/t/system-add-on-plugin-documentation/8742)
+ [Understanding Trust Levels](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/)
+ [Forum Information Category](https://forum.codewizardshq.com/c/official/information/69)"
+
+ DiscourseEvent.on(:post_created) do |post|
+ next if post.user_id == -1 # Ignore system posts
+
+ # Check for profanity
+ if PROFANE_WORDS.any? { |word| post.raw.downcase.include?(word) }
+ post.flag(Discourse.system_user, PostActionType.types[:inappropriate])
+ send_pm("Inappropriate Content Detected", "Your post contains inappropriate language and has been flagged for review.", post.user.username)
+ log_command("flagged for inappropriate content", "https://forum.codewizardshq.com/t/#{post.topic_id}", post.user.username)
+ end
+
+ # Check for spam (repeated links or posts)
+ if post.raw.scan(/https?:\/\//).count > 5 # Adjust the threshold as needed
+ post.flag(Discourse.system_user, PostActionType.types[:spam])
+ send_pm("Spam Detected", "Your post appears to be spam and has been flagged for review.", post.user.username)
+ log_command("flagged for spam", "https://forum.codewizardshq.com/t/#{post.topic_id}", post.user.username)
+ end
+
+ # Custom commands
+ if post.raw.downcase.include?("@system help advanced")
+ text = "Hello @#{post.user.username}, here are some advanced resources to help you on the forum:#{HELP_LINKS}"
+ create_post(post.topic_id, text)
+ log_command("sent advanced help", "https://forum.codewizardshq.com/t/#{post.topic_id}", post.user.username)
+ PostDestroyer.new(Discourse.system_user, post).destroy
+ end
+ end
+
+ DiscourseEvent.on(:user_created) do |user|
+ system_user = Discourse.system_user
+ welcome_message = <<~TEXT
+ Hi #{user.username},
+
+ Welcome to the CWHQ Discourse Forum! We're glad to have you here. If you have any questions or need assistance, feel free to ask.
+
+ Best,
+ The CWHQ Team
+ TEXT
+
+ PostCreator.create!(
+ system_user,
+ target_user: user,
+ title: "Welcome to CWHQ!",
+ raw: welcome_message
+ )
+ end
+
+ def post_summary
+ popular_topics = Topic.order('views DESC').limit(5) # Top 5 most viewed topics
+ summary = "Here are the top discussions:\n\n"
+ popular_topics.each do |topic|
+ summary += "* [#{topic.title}](https://forum.codewizardshq.com/t/#{topic.id}) - #{topic.views} views\n"
+ end
+
+ create_post(11303, summary) # Replace 11303 with the topic ID where you want to post the summary
+ end
+
+ # Schedule the summary to post daily or weekly
+ Jobs::Regular.schedule_every('1d') { post_summary } # '1d' for daily, '7d' for weekly
+end
+# plugin.rb
+# This plugin adds extra functionality to the @system user on a Discourse forum.
+
+# MIT License
+
+after_initialize do
+ # Define the onboarding tasks
+ ONBOARDING_TASKS = {
+ fill_out_profile: "Fill out your profile",
+ first_post: "Make your first post",
+ read_guidelines: "Read the community guidelines"
+ }
+
+ # Method to send a private message
+ def send_pm(title, text, user)
+ message = PostCreator.create!(
+ Discourse.system_user,
+ title: title,
+ raw: text,
+ archetype: Archetype.private_message,
+ target_usernames: user,
+ skip_validations: true
+ )
+ end
+
+ # Method to check user progress
+ def check_user_progress(user)
+ progress = {}
+ progress[:fill_out_profile] = !user.user_profile.bio_raw.blank?
+ progress[:first_post] = user.post_count > 0
+ progress[:read_guidelines] = user.custom_fields['read_guidelines'] == true
+ progress
+ end
+
+ # Method to notify user about their progress
+ def notify_user_about_progress(user, progress)
+ message = "Hi #{user.username},\n\nHere is your onboarding checklist:\n\n"
+ ONBOARDING_TASKS.each do |task, description|
+ status = progress[task] ? "✓" : "✗"
+ message += "#{status} #{description}\n"
+ end
+ message += "\nPlease complete these tasks to get the most out of our community.\n\nBest,\nThe CWHQ Team"
+ send_pm("Your Onboarding Checklist", message, user.username)
+ end
+
+ # Schedule progress checks and notifications
+ Jobs::Regular.schedule_every('1d') do
+ User.where(active: true).each do |user|
+ progress = check_user_progress(user)
+ notify_user_about_progress(user, progress)
+ end
+ end
+
+ # Listen for user activity to update progress
+ DiscourseEvent.on(:user_updated) do |user|
+ if user.custom_fields['read_guidelines'] == true
+ progress = check_user_progress(user)
+ notify_user_about_progress(user, progress)
+ end
+ end
+
+ DiscourseEvent.on(:post_created) do |post|
+ user = post.user
+ if user.post_count == 1
+ progress = check_user_progress(user)
+ notify_user_about_progress(user, progress)
+ end
+ end
+end
+
+
+# onboarding_checklist.rb
+# This plugin adds extra functionality to the @system user on a Discourse forum.
+
+# MIT License
+
+after_initialize do
+ # Define the onboarding tasks
+ ONBOARDING_TASKS = {
+ fill_out_profile: "Fill out your profile",
+ first_post: "Make your first post",
+ read_guidelines: "Read the community guidelines"
+ }
+
+ # Method to send a private message
+ def send_pm(title, text, user)
+ message = PostCreator.create!(
+ Discourse.system_user,
+ title: title,
+ raw: text,
+ archetype: Archetype.private_message,
+ target_usernames: user,
+ skip_validations: true
+ )
+ end
+
+ # Method to check user progress
+ def check_user_progress(user)
+ progress = {}
+ progress[:fill_out_profile] = !user.user_profile.bio_raw.blank?
+ progress[:first_post] = user.post_count > 0
+ progress[:read_guidelines] = user.custom_fields['read_guidelines'] == true
+ progress
+ end
+
+ # Method to notify user about their progress
+ def notify_user_about_progress(user, progress)
+ message = "Hi #{user.username},\n\nHere is your onboarding checklist:\n\n"
+ ONBOARDING_TASKS.each do |task, description|
+ status = progress[task] ? "✓" : "✗"
+ message += "#{status} #{description}\n"
+ end
+ message += "\nPlease complete these tasks to get the most out of our community.\n\nBest,\nThe CWHQ Team"
+ send_pm("Your Onboarding Checklist", message, user.username)
+ end
+
+ # Schedule progress checks and notifications
+ Jobs::Regular.schedule_every('1d') do
+ User.where(active: true).each do |user|
+ progress = check_user_progress(user)
+ notify_user_about_progress(user, progress)
+ end
+ end
+
+ # Listen for user activity to update progress
+ DiscourseEvent.on(:user_updated) do |user|
+ if user.custom_fields['read_guidelines'] == true
+ progress = check_user_progress(user)
+ notify_user_about_progress(user, progress)
+ end
+ end
+
+ DiscourseEvent.on(:post_created) do |post|
+ user = post.user
+ if user.post_count == 1
+ progress = check_user_progress(user)
+ notify_user_about_progress(user, progress)
+ end
+ end
+end