Pular para o conteúdo

Webhooks na ficha

A ficha não acessa a internet. A única saída são os webhooks: a ficha manda dados com um nome (“rolagens”), e o mestre da mesa decide para onde eles vão, colando o endereço de um webhook do Zapier, do Make ou do IFTTT. Assim a ficha nunca escolhe o destino, e o endereço não aparece para os jogadores.

No manifesto:

"webhooks": [
{ "name": "rolagens", "description": "Cada rolagem da ficha", "example": { "total": 17, "rolagem":
"1d20+5" } } ]
  • name: minúsculas, números, - e _. A ficha usa esse nome para mandar.
  • description: o que o webhook manda, para o mestre saber o que está ligando.
  • example (opcional): um exemplo dos dados, até 4 KB.
  • Até 20 webhooks por plugin.

Ao instalar, o RPG Desk mostra os webhooks ao mestre, que liga os endereços em Configurações da mesa → Plugins → Integrações. Veja Integrações.

const r = await RPGDesk.webhooks.send('rolagens', { total: 17, rolagem: '1d20+5' });
if (!r.ok) RPGDesk.ui.toast(`O webhook não foi: ${r.error}`, 'error');

O resultado é { ok, status, body, error }:

error Quando
null deu certo; body é a resposta do serviço
'not-found' o manifesto não declara um webhook com esse nome
'not-configured' o mestre ainda não ligou um endereço para esse webhook
'forbidden' o webhook é Só mestres, e quem disparou é jogador
'bad-request' os dados passam de 16 KB
'rate-limited' envios demais em pouco tempo na mesa
'timeout' o serviço não respondeu em 10 segundos
'failed' o serviço respondeu com erro, ou não deu para chegar nele

O RPG Desk manda os seus dados em data, junto com o plugin, o webhook, a mesa, quem disparou e a hora. O formato está em Integrações.

<button id="atacar">Atacar</button>
<script>
document.getElementById('atacar').addEventListener('click', async () => {
const r = await RPGDesk.dice.roll('1d20+5', { label: 'Ataque' });
await RPGDesk.webhooks.send('rolagens', { personagem: RPGDesk.doc.get('nome'), total: r.total });
});
</script>

Do outro lado, um Zap com o gatilho Catch Hook e a ação de mandar uma mensagem num canal do Discord, usando data.personagem e data.total.