A solução sugerida funciona como esqueleto.
Dados de entrada (mais ricos que entrada/saída)
Em vez de um par (entrada, saída), o realista é um log de eventos por participante: [participante_id, tipo_evento, timestamp] onde tipo pode ser join, leave ou heartbeat. Isso porque numa live de 2h é comum a pessoa cair e reconectar varias vezes.
Também preciso de: inicio_evento, fim_evento, e um threshold (ex.: 0,9).
Verificação (com tolerância e clipping na janela do evento)
Para cada participante:
- Reconstruo os intervalos [entrada_n, saída_n] a partir do log.
- Recorto cada intervalo para dentro de [inicio_evento, fim_evento] - quem entrou antes ou ficou depois não ganha bônus.
- Somo as durações = tempo_ativo.
- Comparo tempo_ativo / duracao_evento >= threshold.
Ingina um evento das 19h00 às 20h00 (duração = 60min):
- Pessoa entra 18h50 (10min antes, esperando começar) e sai 19h55 (5min antes do fim).
- Permanência crua = 65min.
- Algoritmo: 65 ≥ 60 → envia o agradecimento.
- Mas ela só assistiu 55min reais — perdeu o encerramento. (por isso a necessidade de clipping, o "saguão" antes do evento não pode gerar crédito para sair antes)
- O intervalo [18h50, 19h55] é recortado para [19h00, 19h55] = 55min.
- 55 / 60 = 0,92 → passa no threshold de 90%, mas pelo motivo certo.
Threshold em vez de igualdade exata é o que Zoom, Webex e Teams Live Events usam. Igualdade quebra na primeira queda de Wi-Fi.
Decisão e ação (com idempotência)
para cada participante em lista:
tempo_ativo = soma_intervalos_recortados(log, inicio, fim)
se tempo_ativo / duracao_evento >= 0.9 ou 0,N:
se nao enviado_antes(participante_id, evento_id):
enviar_email(participante_id)
marcar_envio(participante_id, evento_id)
senao:
nao enviar
A tabela enviado_antes evita que rodar o script duas vezes mande dois e-mails
Um detalhe que escapa fácil: presença ativa ≠ conectado
O Zoom até teve o "attentiveness score" (depois removido por privacidade).
Dá vontade de cruzar tempo conectado com sinais como foco da aba, o Attention Tracking (2020), que sinalizava ao host quando o participante saía da janela do Zoom por mais de 30 segundos. A feature foi removida no mesmo ano dentro do "90-day plan" de privacidade da empresa, por dois motivos que se reforçam:
- Ética: virou símbolo de vigilância em ensino e trabalho remoto na pandemia, com FTC investigando práticas da Zoom.
- Técnica: foco da janela ≠ atenção. Anotar em outro app, abrir um link do chat ou usar segunda tela te marcava como desatento. O sinal media a coisa errada.
Medir tempo de conexão recortado é honesto não promete o que não pode entregar. Se quisermos sinais mais ricos no futuro, o caminho é engajamento voluntário (chat, poll, reações), o usuário escolhe sinalizar. podendo usar palavras chaves para sorteios ou direcionamentos para sites que registram entradas (para fazer dinâmicas), ou outras formas de "fazer o ouvinte se movimentar", durante a apresentação acabam sendo outras estratégias de engajamento que melhoram o grau de atenção na apresentação e que geram dados valiosos.