Spraxium logoSpraxium

Rotação e Shards

Rode atividades em rotação por timer e personalize a presença por shard com placeholders customizados. Aprenda startRotation, stopRotation, setShardActivity, configuração por shard no boot e variáveis de interpolação próprias.

Rotação de atividades

Quando o seu bot tem mais de uma mensagem para mostrar, você pode alternar activities em um intervalo fixo. O método startRotation recebe um array de activities e um intervalo em milissegundos. Ele aplica a primeira activity imediatamente e, a cada disparo do timer, avança para a próxima. Quando chega ao fim da lista, a rotação volta para o começo.

src/listeners/ready.listener.ts
import { Events, Listener, Once } from '@spraxium/common';
import { PresenceManager } from '@spraxium/core';

@Listener(Events.ClientReady)
export class ReadyListener {
  @Once()
  onReady(): void {
    PresenceManager.startRotation(
      [
        { name: '{{totalServers}} servers', type: 'Watching' },
        { name: '/help for commands', type: 'Playing' },
        { name: 'feedback from users', type: 'Listening' },
      ],
      30_000,
    );
  }
}

Chamar startRotation interrompe qualquer rotação anterior antes de iniciar a nova. O timer é criado com unref, então ele não impede o processo Node.js de encerrar corretamente durante o shutdown. Placeholders usados nos nomes das activities são resolvidos de novo a cada ciclo, então valores como {{totalServers}} continuam sempre atualizados.

Você também pode configurar essa rotação já no boot definindo rotateInterval na configuração de presence e fornecendo mais de uma activity. Basta declarar isso dentro de config/ e passar o objeto para initPresence em main.ts. O framework inicia a rotação automaticamente depois da conexão do client, sem exigir código de listener.

import type { PresenceOptions } from '@spraxium/core';

export const presenceConfig: PresenceOptions = {
  status: 'online',
  activities: [
    { name: '{{totalServers}} servers', type: 'Watching' },
    { name: '/help', type: 'Playing' },
    { name: '{{ping}}ms latency', type: 'Competing' },
  ],
  rotateInterval: 20_000,
};

Parando a rotação

O método stopRotation limpa o timer do intervalo. A última activity aplicada continua visível até você definir outra ou chamar reset. Isso é útil para congelar a presence durante uma manutenção ou quando o bot entra num estado excepcional.

src/commands/freeze.command.ts
import { PresenceManager } from '@spraxium/core';

PresenceManager.stopRotation();
PresenceManager.setActivity({
  name: 'maintenance in progress',
  type: 'Playing',
});

Presença por shard no boot

Quando o bot roda em vários shards, cada processo resolve os placeholders internos de forma independente. Um único {{totalServers}} mostra números diferentes em shards diferentes porque cada um só conhece as guilds que atende. Isso acontece automaticamente, sem configuração especial.

Se você quiser personalização mais profunda, o objeto PresenceOptions aceita um registro perShard. Cada chave representa o ID de um shard, e o valor sobrescreve a presence global para aquele shard específico. Os overrides são mesclados com a configuração global, então você só precisa declarar o que deseja alterar.

import type { PresenceOptions } from '@spraxium/core';

export const presenceConfig: PresenceOptions = {
  status: 'online',
  activities: [
    { name: 'Shard {{shardNumber}}/{{totalShards}}', type: 'Playing' },
  ],
  perShard: {
    0: {
      status: 'dnd',
      activities: [
        { name: 'Primary shard · {{totalServers}} guilds', type: 'Watching' },
      ],
    },
  },
};

Overrides de shard em runtime

Os métodos estáticos setShardPresence, setShardActivity, clearShardPresence e clearShardActivity permitem alterar a presence de shards específicos em runtime. Esses overrides têm prioridade sobre a presence global daquele shard em todas as chamadas seguintes de applyPresence.

setShardPresence recebe o ID do shard e um objeto parcial de presence com status e activities opcionais. Ele se mescla com qualquer override já existente para aquele shard. Já setShardActivity é um atalho que altera apenas a activity do shard, com opção de injetar placeholders customizados.

src/services/shard-status.service.ts
import { Injectable } from '@spraxium/core';
import { PresenceManager } from '@spraxium/core';

@Injectable()
export class ShardStatusService {
  updateShardActivity(shardId: number, version: string) {
    PresenceManager.setShardActivity(
      shardId,
      {
        name: 'v{{version}} · {{totalServers}} guilds on shard {{shardNumber}}',
        type: 'Playing',
      },
      { version },
    );
  }

  resetShard(shardId: number) {
    PresenceManager.clearShardPresence(shardId);
  }
}

O terceiro argumento de setShardActivity é um registro com placeholders customizados. Eles são mesclados sobre os placeholders internos, então {{version}} no exemplo acima assume o valor da string que você passar. Placeholders nativos como {{totalServers}} e {{shardNumber}} continuam sempre disponíveis e não precisam ser enviados manualmente.

Referência da API

MétodoDescrição
setActivity(activity)

Substitui a activity atual sem mexer no status.

setStatus(status)

Atualiza só o indicador de status, como online, idle, dnd e invisible.

setPresence(options)Define status e activities numa única chamada.
startRotation(activities, intervalMs)

Inicia a troca automática de activities. Interrompe rotação anterior.

stopRotation()

Limpa o intervalo da rotação. A última activity continua ativa.

reset()

Restaura a presence definida no boot. Não limpa overrides de shard.

setShardPresence(shardId, options)Aplica override de presence para um shard específico em runtime.
setShardActivity(shardId, activity, customProps?)

Define a activity de um shard com placeholders customizados opcionais.

clearShardPresence(shardId)

Remove todos os overrides do shard, voltando para a configuração global.

clearShardActivity(shardId)

Remove apenas o override da activity, preservando override de status.