Hoy me encontré con este problema:
https://meta.discourse.org/t/required-tags-should-only-be-required-based-on-type-of-user/392238
pero por ahora, hasta que el equipo trabaje en ello (con suerte), decidí pedirle ayuda a Claude para crear un Componente que me permita tener un mensaje personalizado en el Compositor para recordarme agregar una etiqueta. Puedo agregar uno o más usuarios, por ID, y puedo limitarlo a ciertas categorías, también por ID.
Si el ID (usuario y categorías) NO está en la lista, veo esto:

Si el ID está en la lista, veo el mensaje:

Si esto es útil para otros, aquí está (solo crea un componente y agrega el script a la pestaña JS):
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer("0.8.31", (api) => {
// Configuración: Agregue sus IDs de usuario y IDs de categoría aquí
const TARGET_USER_IDS = [2]; // Reemplace con los IDs de usuario reales
const TARGET_CATEGORY_IDS = [4,49]; // Reemplace con los IDs de categoría reales
const REMINDER_MESSAGE = "🛑 ¡Agregue la etiqueta apropiada a esta publicación!";
let previousCategoryId = null;
let checkInterval = null;
function checkAndUpdateMessage() {
const composer = api.container.lookup("controller:composer");
if (!composer || !composer.model) {
// El compositor ha desaparecido, deja de verificar
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
return;
}
const currentUser = api.getCurrentUser();
if (!currentUser || !TARGET_USER_IDS.includes(currentUser.id)) return;
const model = composer.model;
const categoryId = model.categoryId;
// Solo actuar si la categoría ha cambiado
if (categoryId === previousCategoryId) return;
previousCategoryId = categoryId;
const currentReply = model.reply || "";
// Eliminar mensaje si fue agregado
if (currentReply.startsWith(REMINDER_MESSAGE)) {
model.set("reply", currentReply.replace(REMINDER_MESSAGE, "").trim());
}
// Agregar mensaje si está en la categoría objetivo y el compositor está vacío
if (categoryId && TARGET_CATEGORY_IDS.includes(categoryId)) {
const cleanReply = model.reply || "";
if (cleanReply.trim().length === 0) {
model.set("reply", REMINDER_MESSAGE);
}
}
}
// Verificar al abrir el compositor
api.onAppEvent("composer:opened", () => {
previousCategoryId = null;
checkAndUpdateMessage();
// Iniciar sondeo para cambios de categoría
if (checkInterval) clearInterval(checkInterval);
checkInterval = setInterval(checkAndUpdateMessage, 300);
});
// Dejar de verificar cuando el compositor se cierra
api.onAppEvent("composer:closed", () => {
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
previousCategoryId = null;
});
});