npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

kita

v1.1.4

Published

A Discord.JS wrapper to speed up development process by getting the basics readily done. A revision of the monorepo 'yor' renamed to Kita.

Downloads

93

Readme

Kita

A Discord.JS wrapper to speed up development process by getting the basics readily done. A revision of the monorepo 'yor' renamed to Kita.

Kita was made with TypeScript in mind and is best used while coding in TypeScript for developer experience.

Further recommendation:

  • Install ts-node
  • Install nodemon
  • Set up a dev script to run npx nodemon src/index.ts.

Getting Started

To create a Kita client to connect to a Discord application as a bot, simply import it, fill in the necessary constructor parameters and use the login method:

import { KitaClient } from 'kita';

const client = new KitaClient({
  root: __dirname,
  defaults: {
    events: {
      interactionCreate: { enabled: true },
      messageCreate: { enabled: true },
      ready: {
        enabled: true,
        slashCommands: { register: true, guildId: 'guild_id' }
      }
    },
    helpCommand: {
      enabled: true
    }
  },
  intents: ['Guilds', 'GuildMessages', 'MessageContent', 'GuildMembers']
});

client.login('bot_token');

You do not need to export the client instance as the it is automatically exposed to all commands and events you create.

KitaClient constructor properties

KitaClient comes with a custom constructor parameter that extends the default ClientOptions constructor parameter. This means that any options that work in the default client from Discord.JS will also work on KitaClient.

Root

The root property is required and must always be set to __dirname. This is used as a way to scan your project structure.

Prefix

The prefix property is optional and it overwrites the default prefix > for classic message commands to whichever you set this property to. You can always access the value of the prefix through the client instance: client.prefix.

Defaults

The defaults property allows you to enable or disable pre-made commands or events (disabled by default).

If you enable defaults and you have your own commands or events with the same name, the defaults will be ignored.

events.interactionCreate: This will enable the default interactionCreate event and handle command execution only. Useful if you only need this event to handle command execution. If you need more control over this event to handle other types of interaction, leave this disabled.

events.messageCreate: This will enable the default messageCreate event and handle command execution only. Useful if you only need this event to handle command execution. If you need more control over this event to handle messages, leave this disabled.

events.ready: This will enable the default ready event. Useful if you only need this event to notify that the bot is ready and to register a slash commands. If you need more control over this event, leave this disabled.

events.ready.slashCommands.guildId: Optional. If provided, slash commands will be registered for this guild only. If not provided, slash commands will be registered globally.

helpCommand: This will enable the default help command. Useful if you do not want to code your own help command. This is a classic message command and NOT a slash command. This will automatically sort commands by category. Slash commands will not be listed in the list of commands.

Project Structure

Your project structure is important in order to be scanned to load commands and events you create.

Here's an example of your project structure should look like:

my-bot/
├── node_modules/
├── src/
│   ├── commands/
│   ├── events/
│   └── index.ts
├── .env
├── .gitignore
├── .prettierrc
├── package.json
├── tsconfig.json
└── yarn.lock

Commands folder

This is where all your commands you create reside in. Any sub-folders created inside will be considered a category for your command. This means that in the command info, the category will be automatically set to the sub-folder's name if it was not set when creating the command. Category is used by the default help command.

In the following example, ban.ts will be categorised as a moderation command:

src/
├── commands/
│   └── moderation/
│       └── ban.ts
├── events/
└── index.ts

If your bot contains both classic message commands and slash commands simultaneously, it is recommended to create a slash folder where you store your slash commands.

Events folder

This is where all your events you create reside in. You may categorise your events into sub-folders and they will still be scanned.

Creating Commands

All command classes should be exported as default. After execution of a command, always return a boolean where true signifies the command was executed successfully and false signifies that something went wrong while executing the command.

If a command execution returns false, the default messageCreate event will send a detailed help embed for that command.

You may return true if you handled the error within the command execution itself.

The KitaClient instance can be accessed by adding it to the constructor of the command. See the example in the next section.

Classic message commands

To create a classic message command, your command class must extend the Command class:

import { Command, Message, KitaClient, EmbedBuilder } from 'kita';

export default class extends Command {
  constructor(private client: KitaClient) {
    super({
      name: 'test',
      description: 'A test command that replies with "Hello World" in an embed.',
      aliases: ['t'],
      usage: [
        {
          argument: 'custom',
          required: false,
          description: 'Reply with the argument instead.'
        }
      ]
    });
  }

  async execute(message: Message, args: string[]): Promise<boolean> {
    if (!this.client.user) return true;

    const avatar = this.client.user.displayAvatarURL({ size: 1024 });
    const embed = new EmbedBuilder()
      .setColor('Random')
      .setAuthor({ name: 'Test Command', iconURL: avatar })
      .setDescription(args.join(' ') || 'Hello World')
      .setTimestamp();

    message.reply({ embeds: [embed] });
    return true;
  }
}

Slash commands

To create aslash command, your command class must extend the SlashCommand class:

import { CommandInteraction, SlashCommand, SlashCommandBuilder } from 'kita';

export default class extends SlashCommand {
  constructor() {
    super({
      ...new SlashCommandBuilder()
        .setName('test')
        .setDescription('Very simple test slash command replying with "Hello World"')
        .setDMPermission(false)
        .toJSON(),
      custom: { data: 'some custom data' }
    });
  }

  async execute(interaction: CommandInteraction): Promise<boolean> {
    interaction.reply('Hello World');
    return true;
  }
}

In addition, you can see that the constructor can take a property called custom. This is useful for any additional data that your slash command may require. For example, you can set a guild id custom data so that this command can only be registered for that guild. You will need to write your own custom register commands function instead of using the one provided.

Creating Events

All command classes should be exported as default and should extend the Listener class:

import { Listener } from 'kita';

export default class extends Listener {
  constructor() {
    super('ready');
  }

  async execute(): Promise<any> {}
}

The KitaClient instance can be accessed by adding it to the constructor of the event. See the example in the next section.

Register slash commands manually

If you do not wish to use the default ready event, slash commands will not be registered. Instead, in your custom ready event, import the registerCommand function in order to register them manually:

import { KitaClient, Listener, registerCommands } from 'kita';

export default class extends Listener {
  constructor(private client: KitaClient) {
    super('ready');
  }

  async execute(): Promise<any> {
    if (this.client.user) {
      console.log(`${this.client.user.username} is now ready!`);
    }
    return registerCommands(this.client, 'guildId');
  }
}

The registerCommands function takes an optional guildId parameter:

export declare const registerCommands: (
  client: KitaClient,
  guildId?: string
) => Promise<void>;