Учебник 4: анти-спам и автомодерация¶
Честная оговорка сразу: скрипты не видят текст чата (нет builtin'а для содержимого сообщения), поэтому фильтры по словам невозможны. Но всё, что зависит от времени, игрока и частоты, — возможно: кулдауны, лимиты, наказания.
Кулдаун чата 3 секунды¶
time() возвращает время мира в тиках (20 тиков = 1 секунда).
Логика: если с прошлого сообщения прошло меньше 60 тиков — отменить.
on chat:
let now = time()
if #last-chat is null:
#last-chat = now
stop
if now - #last-chat < 60:
message "Slow down! Wait 3 seconds."
cancel-event
stop
#last-chat = now
По строкам:
- Первое сообщение:
#last-chatещёnull— запоминаем время и выходим (stopзавершает обработчик, сообщение уходит). - Спам:
cancel-eventотменяет Bukkit-событие — сообщение не увидят. stopпослеcancel-eventне обязателен (дальше кода нет), но привычка полезная: обработчик не должен «проваливаться» дальше отмены.
Наказание за три нарушения¶
on chat:
let now = time()
if #last-chat is null:
#last-chat = now
stop
if now - #last-chat < 60:
cancel-event
if #warns is null:
#warns = 1
else:
#warns = #warns + 1
if #warns >= 3:
kick "Spamming. Come back later."
#warns = 0
else:
message "Warning " + #warns + "/3. Slow down!"
stop
#last-chat = now
#warns = 0
Паттерны здесь:
- Счётчик
#warnsсnull-инициализацией (см. учебник 2). - Сброс
#warns = 0при «хорошем» сообщении. kickдействует на игрока события.
Приветствие с задержкой? Нет — и вот почему¶
Частый вопрос: «как сделать message через 5 секунд после join?»
Ответ: никак в текущей версии — планировщик (Host.runLater) в DSL
не выведен. Обходных путей нет, это известное ограничение (см. Эксплуатацию).
Если задержка критична — нужен Java-плагин или другая версия FastScript.