Сегодня, после очередного косячка, меня осенило, что ты чувак врешь. Это реально сделать, и как сказал будда - это сделать довольно просто.
Короче, модератор шепчет /mute в эфир, команда плывёт сквозь валидные волны. Система ласково спрашивает PlayerService: «Эй, кто этот Gamer123?» - и тот отвечает числом, player_id из таблицы players. Потом мы тихо, не спеша, без суеты записываем в базу:
INSERT в punishments:
player_id - душа нарушителя (ID)
banned_by - тот, кто пальцем указал (ID модератора)
cause - причина, типа 2.4
expires_on - сейчас плюс пару часов, как рассвет после ночи
type - mute
Потом делаем дубль в punishments_history, чтобы память о поступке не растворилась - на случай проверок, пунктов 9.3 и прочих реалий.
Когда игрок нажимает Enter, плагин чата ловит волну. Запускается ритуал проверки в сервисе наказаний. Система смотрит, есть ли активный мут - в кэше или в таблице punishments, где expires_on > NOW(). Если мут живой - сообщение замирает, и игроку шепчут:
Твой чат затихнет до {date}
А вот где можно включить настоящую магию автоматизации. У нас уже был механизм флагов, - когда сообщение о наказании не разлетается по всем уголкам, а только туда, где светится персонал. Сейчас модератор ловит лог, выбирает сообщение. Мы можем каждому лог-сообщению дать тэг, как #A14, как метку на бутылке с посланием. Тогда модератор сможет писать:
/mute -e <id/link>
Сервер читает флаг -e, идёт по этому #ID, PlayerLoggerService вытягивает нужный текст. И в cause или в отдельное поле ложится не просто сухая причина, а связка типа:
Флуд (2.4) [Доказательство: Gamer77: куплю золото!!1 (id: #A12)]
А игроку мягко прилетает письмо через MailService.sendMail(...), чтоб даже если он офлайн, душа его узнала о решении.
Псевдокод -
Java:
public void processMute(CommandSender moder, Player target, String time, String reason, String evidenceFlag) {
String evidenceText = "";
if (evidenceFlag != null) {
if (evidenceFlag.startsWith("#")) {
// Если указан ID лога, достаем его из базы логов
evidenceText = playerLoggerService.getMessageById(target.getUniqueId(), evidenceFlag);
} else {
// Если указана просто ссылка или текст
evidenceText = evidenceFlag;
}
}
Punishment m = new Punishment(target, moder, reason, time, evidenceText);
punishmentDao.save(m);
String mailBody = String.format(
"Вы были замучены модератором %s.\nПричина: %s\nДоказательства: %s",
moder.getName(), reason, (evidenceText.isEmpty() ? "Не указаны" : evidenceText)
);
mailService.sendMail(target.getId(), "Наказание", mailBody);
}
А теперь выныриваем из фантазий в грубую правду, братцы: если такую систему запилить - минусов будет больше, чем плюсов. Раньше мы уже прикрыли наказания в общем чате, потом ещё ввели правило: не называть имени модератора, что дал мут. На АСК отвечать проще - «пиши на форум», а на форуме твой мут будут обсуждать две недели; даже если модератор ошибся, от куратора ему ничего не прилетит. Раньше можно было напрямую написать модеру или его куратору - теперь этого нет. В итоге мы выстроили систему бюрократического издевательства вместо расслабленной прозрачности.
Получается, чтобы донести до модераса вопрос по муту - надо пройти семь кругов ада. Такая автоматизация почти избавила бы от этих кругов: вместо десяти вопросов в АСК «за что мут?» ты бы сразу оформлял жалобу на модератора за неверный мут. Но нам это невыгодно - покрывать своих у нас святой принцип, понимаешь?