Event Streams
Processamento reativo de eventos em janelas de tempo
Event Streams permitem detectar padrões em eventos ao longo do tempo. Útil para detecção de spam, kill streaks, anti-cheat e mais.
Sintaxe
stream "nome":
collect: tipos_de_evento
group by: expressão
window: período
filter: condição
trigger when: condição_de_agregação
then: açãoCampos
| Campo | Descrição | Obrigatório |
|---|---|---|
collect | Tipos de evento a coletar | Sim |
group by | Agrupamento (player, all) | Não |
window | Janela de tempo | Sim |
filter | Filtro adicional | Não |
trigger when | Condição de disparo | Sim |
then | Ações ao disparar | Sim |
Tipos de Evento
| Tipo | Descrição |
|---|---|
player_join | Player entra |
player_quit | Player sai |
player_chat | Player envia mensagem |
player_death | Player morre |
pvp_death | Morte por PvP |
player_damage | Player toma dano |
player_attack | Player ataca |
block_break | Bloco quebrado |
block_place | Bloco colocado |
Condições de Trigger
# Contagem
trigger when: count >= 3
# Soma
trigger when: sum(damage) >= 100
# Média
trigger when: avg(damage) >= 25
# Min/Max
trigger when: max(damage) >= 50
# Distinct (únicos)
trigger when: distinct(player) >= 5
# Rate (por segundo)
trigger when: rate >= 2.0
# Sequência
trigger when: sequence(player_damage, player_damage, player_death)Janelas de Tempo
# Fixa - reseta após o período
window: 30 seconds
# Deslizante - sempre olha os últimos X segundos
window: sliding 30 seconds
# Por contagem - dispara após N eventos
window: count 10Exemplos
Detecção de Spam
stream "spam_detector":
collect: player_chat
group by: player
window: 10 seconds
trigger when: count >= 5
then:
mute player for 1 minute
send "&cYou've been muted for spamming!" to playerKill Streak
stream "kill_streak":
collect: pvp_death
group by: killer
window: sliding 60 seconds
trigger when: count >= 5
then:
broadcast "&6%killer% is on a 5 KILL STREAK!"
apply strength 2 to killer for 30 secondsAlerta de Dano
stream "damage_alert":
collect: player_damage
group by: player
window: 30 seconds
trigger when: sum(damage) >= 50
then:
send "&c⚠ You've taken a lot of damage!" to player
apply regeneration 2 to player for 10 secondsAnti-Cheat: Mining Rápido
stream "fast_miner":
collect: block_break
group by: player
window: 5 seconds
filter: block = "diamond_ore"
trigger when: count >= 10
then:
execute console command "kick %player% Suspicious mining activity"
log "[AntiCheat] %player% kicked for fast mining"Movimento em Grupo
stream "group_activity":
collect: player_join
group by: all
window: 1 minute
trigger when: count >= 10
then:
broadcast "&a&lServer is getting busy! %count% players joined recently!"Performance
Event Streams são processados de forma eficiente em background. Use janelas menores para detecção mais rápida, janelas maiores para padrões de longo prazo.
Configuração
Configure Event Streams no config.yml:
config.yml
streams:
enabled: true
tick_interval: 10 # Ticks entre processamentos
max_window_size: 1000 # Máximo de eventos por janela