How do admins find censored posts/ is there a count of censored words per User?

I am trying to get my community to self-regulate and hence chucked most swear words/sensitive information (RegEx phrases) into the censored watched words.

However, I noticed, it does not notify admins when posts are censored. Ideally we want to make a count of the number of times a User has used a bad word/phrase so we can silence them if need be for too many inappropriate postings.

Does discourse count censored posts per User/ how can admins get pinged for censored posts?



Or from another angle, is it possible to use advanced search filters to list censored or flagged posts?

And yes, we did our search first:

We compiled our own list of what (kinda) works:

More cool tips for listing topics

List all archived topics:

List all closed topics:

List all deleted topics:

List all bumped topics:

List all deferred topics:

List all unlisted topics:

List all assigned topics:

List all unanswered topics:

? visible or invisible?


This can be used in the Search box:
You can do this in search with in:pinned and status:archived

Even more:

How to search/filter untagged topics

advanced_filter(/^status:open$/) do |posts|
advanced_filter(/^status:closed$/) do |posts|
advanced_filter(/^status:archived$/) do |posts|
advanced_filter(/^status:noreplies$/) do |posts|
advanced_filter(/^status:single_user$/) do |posts|
advanced_filter(/^in:first|^f$/) do |posts|
advanced_filter(/^in:pinned$/) do |posts|
advanced_filter(/^in:unpinned$/) do |posts|
advanced_filter(/^in:(likes|bookmarks)$/) do |posts, match|
advanced_filter(/^in:posted$/) do |posts|
advanced_filter(/^in:seen$/) do |posts|
advanced_filter(/^in:unseen$/) do |posts|
advanced_filter(/^in:wiki$/) do |posts, match|
advanced_filter(/^posts_count:(\d+)$/) do |posts, match|
advanced_filter(/^min_post_count:(\d+)$/) do |posts, match|
advanced_filter(/^badge:(.)$/) do |posts, match|
advanced_filter(/^with:images$/) do |posts|
advanced_filter(/^#([\p{L}0-9-:=]+)$/) do |posts, match|
advanced_filter(/^group:(.+)$/) do |posts, match|
advanced_filter(/^user:(.+)$/) do |posts, match|
advanced_filter(/^@([a-zA-Z0-9_-.]+)$/) do |posts, match|
)$/) do |posts, match|
advanced_filter(/^after:(.*)$/) do |posts, match|
advanced_filter(/^tags?:([\p{L}0-9,-+]+)$/) do |posts, match|
+]+)$/) do |posts, match|
advanced_filter(/^filetypes?:([a-zA-Z0-9,-_]+)$/) do |posts, match|


FYI: We constructed a relatively simple query which is at the moment good enough for our needs:

id, user_id, topic_id, post_number, cooked, raw
FROM posts p
WHERE cooked ~* ‘.*■’

With results:

One of SQL Wizzzards of Ours is constructing a far more sophisticated query, that finds exact position of censored word. It kinda works, but he keeps on grumbling that raw and cooked are not of the same length…which gives us a new appreciation of just how difficult is to store and especially to manage the results of what was found by watched words.


Did you manage to refine this in the end?

Nah, I think it was just too much of a nightmare to find the censored word in the markdown version vs the live version and it was just easier to scan with your eyes (at the moment for our new platform). If someone else has found a way, do let me know!

1 Like