Ir para o conteúdo principal

Sharding

O Discord impede que a aplicação de seu bot faça login sem fazer sharding uma vez que você chega numa escala de 2.500 servidores. Se você não planeja criar um bot público, então você pode ir em frente e ignorar esta seção. No entanto, se você estiver criando um bot público, Seria sensato manter o sharding em mente, pois isso pode aumentar a complexidade de sua aplicação devido à forma como funciona um processo fragmentado.

warning

Se você estiver executando o bot como parte de um servidor web dentro do NestJS, então para implementar o compartilhamento você deve entender que inicializar o necord dentro do processo do servidor HTTP não vai ser uma opção viável. Então vamos ter que dividir os dois em seus próprios processos independentes. Isso não significa que você não pode compartilhar o código entre os dois, então eles serão executados em processos diferentes. Você poderia considerar sua aplicação "bot" como um microsserviço.

  1. No diretório src, crie um arquivo bot.ts, esse arquivo será usado para instanciar o bot como uma aplicação autônoma com algumas pequenas diferenças. O DiscordModule não pode ser importado dentro do seu AppModule. Isso porque não queremos nenhum processo bot em processos não compartilhados, então se você precisa compartilhar o código entre os dois, você deve importar os módulos necessários para o seu DiscordModule ou como alternativa, crie um SharedModule que é importado para o seu AppModule e DiscordModule.
import { NestFactory } from '@nestjs/core';
import { DiscordModule } from './discord/discord.module';

async function bootstrap() {
await NestFactory.createApplicationContext(DiscordModule);
}

bootstrap();
info

You may also need to add a webpack.config.js file to your root directory which exports the bot.ts file as it's not automatically exported with the application due to how the bot.ts file is used within another process which webpack is unable to detect. You can use the following snippet to achieve this:

const Path = require('path');

module.exports = function (options) {
return {
...options,
entry: {
main: options.entry,
bot: Path.join(__dirname, 'src', 'bot.ts')
},
output: {
filename: '[name].js'
}
};
};
  1. Modifique o seu arquivo main.ts para criar uma instância de ShardingManager que chama o arquivo bot.js (não a extensão .ts), especificando uma extensão .ts causará erros, pois ela é executada somente depois que seu código for transpilado em JavaScript. Você pode usar o snippet abaixo como um exemplo:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as Path from 'path';

export async function bootstrap() {
const app = await NestFactory.create(AppModule);
const port = 80;

await app.listen(port);

const manager = new ShardingManager(Path.join(__dirname, 'bot.js'), {
token: 'secret'
});

manager.spawn();

manager.on('shardCreate', shard => {
shard.on('reconnecting', () => {
console.log(`Reconectando shard: [${shard.id}]`);
});

shard.on('spawn', () => {
console.log(`Criando shard: [${shard.id}]`);
});

shard.on('ready', () => {
console.log(` Shard [${shard.id}] está pronto`);
});

shard.on('death', () => {
console.log(`Shard: [${shard.id}] morreu`);
});

shard.on('error', err => {
console.log(`Erro em [${shard.id}] com: ${err} `);
shard.respawn();
});
});
}
bootstrap();
  1. Agora quando você inicia sua aplicação, seu contexto bot.ts é criado em um processo compartilhado.
tip

Se você estiver enfrentando problemas adicionais e exija que seu aplicativo de hospedagem cruzada, então basta trocar o ShardingManager para outros pacotes de compartilhamento, como o [discord-hybrid-sharding](https://github. om/meister03/discord-hybrid-sharding) que é necessário para o pacote discord-cross-hosting.