Перейти к содержанию

Учебник 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.