Atualização 0.8.0 - Novo visual e idiomas

Visual renovado, novo sistema de multi idioma na CLI e manipuladores de erro na base de bots

CLI
Bot Base
Atualizações
Novidades
Voltar

Essa versão altera o visual da CLI, melhorando em alguns pontos a experiência de utilização e a forma de visualizar as informações

Comando para executar a CLI

npx constatic@latest

🌐 Sistema multi idioma

Agora nas configurações da CLI, é possível alterar o idioma!

cli

O programa tentará identificar a idioma do seu sistema ao utilizar a CLI pela primeira vez

🎨 Novo visual

A CLI teve o seu estilo alterado, mas não é como se ela estivesse completamente diferente, apenas pequenos detalhes mudaram, se você utiliza com frequência já pode ter notado.

📚 Mudança de bibliotecas

O pacote de componentes interativos de CLI @clack/prompts foi substituído pelo @inquirer/prompts. O pacote clack era muito bonito e moderno, contudo, faltavam alguns recursos que deixariam a CLI muito mais intuitíva, então foi decidido que inquirer seria a melhor opção.

cli

🗒️ Listagem em tabela

A forma como dados listados são exibidos ficou um pouco mais interesssante na forma de uma tabela mais compacta e moderna

cli

🗃️ Multi seleção de itens

Alguns menus onde só era possível selecionar um item, ou selecionar apenas todos os itens de uma vez, agora permite que o usuário marque quais itens ele quer selecionar

cli

⌨️ Verificações de inputs

Alguns inputs agora tem uma verificação de acordo com a sua função, como por exemplo o input de caminho para uma pasta de arquivos de imagem no menu de emojis, o programa irá verificar se o caminho existe antes que você possa enviar.

cli

❇️ Alteração de simbolos

Alguns emojis foram substituídos por caracteres de ícones

cli

🤖 Base de Bot de discord

A base recebeu pequenas adições para se encaixar com a atualização passada da ferramenta de gerenciar emojis da aplicação

📑 Arquivos de configurações

Adicionado os arquivos emojis.json e emojis.dev.json na configuração de fileNesting no arquivo de configurações do vscode.

.vscode/settings.json
{
  // ...
  "explorer.fileNesting.patterns": {
    ".env": ".env*",
    "settings.json": "emojis.json, emojis.dev.json", 
    "package.json": "*lock.json, *.lock, *lock.yaml, *.lockb, tsconfig.json, .eslintrc.json, .gitignore, .discloudignore, biome.json, .nvmrc"
  }
  // ...
}

Foi adicionado também um atalho de caminho para o arquivo emojis.json no tsconfig.json

tsconfig.json
{
	"compilerOptions": {
        //...
		"baseUrl": "./src",
		"paths": {
			"#database": ["./database/index.ts"],
			"#base": ["./discord/base/index.ts"],
			"#functions": ["./functions/index.ts"],
			"#menus": ["./menus/index.ts"],
			"#settings": ["./settings/index.ts"],
			"#tools": ["./tools/index.ts"],
			"#server": ["./server/index.ts"],
			"#lib": ["./lib/index.ts"],
			"#emojis": ["../emojis.json"], 
			"@discordjs/builders/*": ["ignore"]
		}
	},
  // ...
}

▶️ BootstrapApp

Agora é muito fácil definir um Manipulador de erros para Comandos e Responders.

src/index.ts
import { bootstrapApp } from "#base";
 
await bootstrapApp({ 
    workdir: import.meta.dirname,
    commands: {
        onError(err, interaction){ } 
    },
    responders: {
        onError(err, interaction){ } 
    }
});

Você pode criar uma mensagem padrão para qualquer erro inesperado:

src/index.ts
import { bootstrapApp } from "#base";
import { log } from "#settings";
import { InteractionReplyOptions } from "discord.js";
 
await bootstrapApp({ 
    workdir: import.meta.dirname,
    commands: {
        onError(err, interaction){ 
            log.error(err); 
            
            const options = { 
                content: "Ocorreu um erro inesperado!"
            } satisfies InteractionReplyOptions; 
            
            interaction.reply(options) 
            .catch(() => interaction.followUp(options)); 
        } 
    }
});

É recomendado criar uma função separada para melhor organização:

src/functions/handlers/errors.ts
import { log } from "#settings";
import { CommandInteraction, InteractionReplyOptions } from "discord.js";
 
export function commandErrorHandler(err: unknown, interaction: CommandInteraction){
    log.error(err); 
            
    const options = { 
        content: "Ocorreu um erro inesperado!"
    } satisfies InteractionReplyOptions; 
    
    interaction.reply(options) 
    .catch(() => interaction.followUp(options)); 
}
src/index.ts
import { bootstrapApp } from "#base";
import { commandErrorHandler } from "#functions"
 
await bootstrapApp({ 
    workdir: import.meta.dirname,
    commands: {
        onError: commandErrorHandler
    }
});

Dica

Você pode lançar erros personalizados dentro dos comandos e responders de uma forma padronizada e tratar todos através do handler de erros

src/discord/commands/ping.ts
import { Command } from "#base";
import { CustomError } from "#functions"; 
import { ApplicationCommandType } from "discord.js";
 
new Command({
  name: "ping",
  description: "Replies with pong 🏓",
  type: ApplicationCommandType.ChatInput,
  run(interaction){
    const { member } = interaction;
    if (!member.permissions.has("Administrator")){ 
      throw new CustomError({ 
        message: "Você não tem permissão para fazer isso!", 
      }); 
    } 
    // Resto do comando ...
  }
});

Funciona da mesma forma tanto para os Comandos, quanto para os Responders. Agora depende de você criar seus próprios manipuladores de erro do jeito que você achar melhor.

Conclusão

Estes novos recursos da base estão em um estado experimental, pode haver bugs ou erros inesperados, caso encontre algum, reporte diretamente no discord Zunder Community.


Novidades, atualizações, alterações, dicas e muito mais será postado neste blog! Se você quiser ser notificado sempre que uma nova postagem for publicada, entre no discord Zunder Community ou Siga @rinckodev no twitter/x