From 9663b2b00b17276a1e70d752cf5356c91b1b30de Mon Sep 17 00:00:00 2001 From: whynotisnotavail <152118232+whynotisnotavail@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:34:03 -0400 Subject: [PATCH 1/5] warm_welcome.rb --- plugin.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/plugin.rb b/plugin.rb index 004b614..e7bfedc 100644 --- a/plugin.rb +++ b/plugin.rb @@ -256,3 +256,24 @@ 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 + From 7a58b8789a8e674ec8fc9af8a5bf8a1421f148bd Mon Sep 17 00:00:00 2001 From: whynotisnotavail <152118232+whynotisnotavail@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:52:50 -0400 Subject: [PATCH 2/5] auto_flag.rb Implemented enhanced moderation tools, user engagement features, and custom commands to improve the CWHQ Discourse Bot: 1. Enhanced Moderation Tools: - Profanity Filter: - Detects and flags posts containing explicit language using an extensive list of profane words. - Sends a private message to the user notifying them of the inappropriate content and flags the post for moderators. - Spam Detection: - Flags posts containing more than five links as potential spam. - Sends a private message to the user and flags the post for moderators. 2. User Engagement: - Daily/Weekly Summary: - Automatically generates and posts a summary of the top 5 most viewed discussions. - Keeps the community informed and engaged with popular topics. 3. Custom Commands: - Advanced Help Command: - Adds a custom command `@system help advanced` to provide advanced resources and help links to users. - Responds with a detailed list of useful forum resources when triggered. Benefits: - Improved Moderation: Helps maintain a respectful and spam-free community by automatically flagging inappropriate content. - Increased Engagement: Keeps users informed about popular discussions and makes new users feel welcome, potentially increasing their participation. - Enhanced User Support: Provides quick access to advanced help resources through custom commands. # Testing: - All new features have been tested locally to ensure they work as expected. - The profanity filter was tested with various profane words to confirm it flags posts correctly. - Spam detection was tested by creating posts with multiple links. - The daily/weekly summary feature was tested to ensure summaries are generated and posted correctly. - The welcome message and custom commands were tested by creating new user accounts and posting commands. --- plugin.rb | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/plugin.rb b/plugin.rb index e7bfedc..721c0a9 100644 --- a/plugin.rb +++ b/plugin.rb @@ -276,4 +276,87 @@ def send_pm_to_author(author_username, topic_id, 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 + From 12ae04ebd938f10476bc174970b0934acd43117e Mon Sep 17 00:00:00 2001 From: whynotisnotavail <152118232+whynotisnotavail@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:27:25 -0400 Subject: [PATCH 3/5] onboarding_checklist.rb Implemented a user onboarding checklist feature to help new users get started on the forum. ### Changes Introduced: 1. **User Onboarding Checklist**: - **Onboarding Tasks**: - Fill out profile - Make first post - Read community guidelines - **Progress Tracking**: - Tracks the completion of each task. - Uses user profile bio, post count, and a custom field for reading guidelines. - **Notifications**: - Sends reminders to users about their onboarding progress. - Uses private messages to inform users about their progress and remaining tasks. ### Benefits: - **Improved User Experience**: - Helps new users get acquainted with the forum and encourages them to complete important tasks. - **Increased Engagement**: - Ensures that new users are actively participating and getting the most out of the community. - Personalized messages make users feel welcomed and guided through their initial steps. ### Testing: - **Checklist Creation and Progress Tracking**: - Tested by creating new user accounts and performing the tasks. - Verified that users receive notifications about their onboarding progress. - **User Activity Listeners**: - Listeners for user updates and post creations to update and notify users about their progress. - **Scheduled Notifications**: - Daily scheduled job to check user progress and send reminders. ### How It Works: 1. **Define Onboarding Tasks**: - A list of tasks such as filling out their profile, making their first post, and reading community guidelines. 2. **Track User Progress**: - Implement logic to check which tasks a user has completed. 3. **Notify Users**: - Send private messages to users with their progress and remaining tasks. 4. **Schedule Progress Checks**: - Daily job to check user progress and send notifications. This feature provides new users with a clear path to getting started on the forum, ensuring they complete essential tasks and engage with the community effectively. --- plugin.rb | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/plugin.rb b/plugin.rb index 721c0a9..952d303 100644 --- a/plugin.rb +++ b/plugin.rb @@ -358,5 +358,74 @@ def post_summary # 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 From c3c9807297f59aa4571d97dd6555f119e48abd81 Mon Sep 17 00:00:00 2001 From: whynotisnotavail <152118232+whynotisnotavail@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:29:35 -0400 Subject: [PATCH 4/5] onboarding_checklist.rb Implemented a user onboarding checklist feature to help new users get started on the forum. ### Changes Introduced: 1. **User Onboarding Checklist**: - **Onboarding Tasks**: - Fill out profile - Make first post - Read community guidelines - **Progress Tracking**: - Tracks the completion of each task. - Uses user profile bio, post count, and a custom field for reading guidelines. - **Notifications**: - Sends reminders to users about their onboarding progress. - Uses private messages to inform users about their progress and remaining tasks. ### Benefits: - **Improved User Experience**: - Helps new users get acquainted with the forum and encourages them to complete important tasks. - **Increased Engagement**: - Ensures that new users are actively participating and getting the most out of the community. - Personalized messages make users feel welcomed and guided through their initial steps. ### Testing: - **Checklist Creation and Progress Tracking**: - Tested by creating new user accounts and performing the tasks. - Verified that users receive notifications about their onboarding progress. - **User Activity Listeners**: - Listeners for user updates and post creations to update and notify users about their progress. - **Scheduled Notifications**: - Daily scheduled job to check user progress and send reminders. ### How It Works: 1. **Define Onboarding Tasks**: - A list of tasks such as filling out their profile, making their first post, and reading community guidelines. 2. **Track User Progress**: - Implement logic to check which tasks a user has completed. 3. **Notify Users**: - Send private messages to users with their progress and remaining tasks. 4. **Schedule Progress Checks**: - Daily job to check user progress and send notifications. This feature provides new users with a clear path to getting started on the forum, ensuring they complete essential tasks and engage with the community effectively. --- plugin.rb | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/plugin.rb b/plugin.rb index 952d303..9822763 100644 --- a/plugin.rb +++ b/plugin.rb @@ -429,3 +429,72 @@ def notify_user_about_progress(user, progress) 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 From 0ea2696faccac3e569dd8d9837ece058e0690341 Mon Sep 17 00:00:00 2001 From: importstring <152118232+importstring@users.noreply.github.com> Date: Tue, 3 Sep 2024 20:20:12 -0400 Subject: [PATCH 5/5] Bold important information --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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