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 🙏

© 2026 – Pkg Stats / Ryan Hefner

seven-discord

v2.7.5

Published

A simplified, zero-dependency Discord library for Bun with interactive UI and economy system.

Readme

Seven-Discord (v2.7.0)

Framework para criação de bots de Discord usando Bun ou Node.js, com interpretador de macros baseado em AST e banco de dados SQLite embutido.


📢 Por que o projeto ficou parado e por que apagamos tudo?

O desenvolvimento do Seven-Discord ficou abandonado por bastante tempo devido à falta de tempo livre, trabalho e compromissos da vida pessoal dos mantenedores.

Ao voltarmos para o projeto, a decisão honesta foi apagar 100% do código antigo e recomeçar do zero. O código anterior era um emaranhado confuso (código espaguete), impossível de escalar, com um banco de dados instável e um sistema de macros que quebrava constantemente.

Abaixo está a comparação real do que mudou para você entender o motivo desse recomeço:

🔄 Comparação: Versão Antiga vs. Versão Nova (v2.7.0)

| Recurso | Versão Antiga | Nova Versão (v2.7.0) | Por que mudamos? | | :--- | :--- | :--- | :--- | | Leitura de Macros | Feita com Regex (Expressões Regulares). | Parser de AST real (Árvore de Sintaxe Abstrata). | O método antigo quebrava sempre que você tentava colocar uma macro dentro de outra (ex: s.if[s.eq[...]]). O novo parser processa o código caractere por caractere com precisão total. | | Banco de Dados | Arquivo JSON cru (seven_db.json). | SQLite Nativo (SevenDB). | Gravar dados em arquivos JSON gerava lentidão e corrompia os arquivos com facilidade se o bot caísse. O SQLite é um banco de dados relacional real, rápido e imune a corrupções. | | Organização | Arquivo único gigante e confuso. | Estrutura Modular e TypeScript. | O código antigo era impossível de estender ou corrigir bugs. Agora, cada macro e gerenciador (Gateway, Rest, DB) tem seu próprio arquivo isolado. | | Quantidade de Macros | Dezenas de macros instáveis e quebradas. | 5 macros essenciais e otimizadas. | Preferimos entregar apenas 5 macros que funcionam perfeitamente do que manter dezenas de macros de moderação e economia que falhavam na metade da execução. |


📦 Instalação

bun add seven-discord
# ou
npm install seven-discord

🚀 Exemplo de Uso

import { SevenClient } from "seven-discord";

const client = new SevenClient({
    prefix: "!",
    databaseName: "database.db",
    // Configuração moderna de intents usando strings
    intents: ["Guilds", "GuildMessages", "MessageContent"]
});

// 1. Resposta Simples
client.command("ping", "Pong! s.ping ms");

// 2. Registro com Aliases
client.command({
    name: "status",
    aliases: ["info", "check"],
    code: `
        s.db.set[ultimo; s.username]
        s.if[s.eq[s.username; admin];
            s.reply[Bem-vindo, admin.];
            s.reply[Olá s.username. O último a usar este comando foi: s.db.get[ultimo]]
        ]
    `
});

// 3. Carregar todos os comandos de uma pasta dinamicamente (recursivo)
// Suporta arquivos exporting default { name, aliases, code } ou mapeamento { nome: código }
await client.loadCommands("./commands");

// 4. Comando Slash (Compatível com Apps instaláveis no usuário - "User Apps")
client.slashCommand({
    name: "ola",
    description: "Retorna uma mensagem de boas-vindas",
    code: "s.reply[Olá de um comando Slash, s.username!]",
    // Pode ser instalado tanto em servidores quanto na conta do usuário
    integration_types: ["USER_INSTALL", "GUILD_INSTALL"],
    // Onde o comando pode ser executado (Servidores, DMs com o Bot, Canais Privados/Grupos)
    contexts: ["GUILD", "BOT_DM", "PRIVATE_CHANNEL"]
});

// Dashboard na porta 3000 (Opcional)
client.startDashboard(3000);

// Inicialização
client.start("SEU_TOKEN_DO_DISCORD");

📘 Macros Disponíveis (v2.7.0)

O interpretador de AST executa apenas as seguintes macros essenciais e otimizadas:

📢 Mensagens e Respostas

  • s.reply[conteúdo; ephemeral?]: Envia uma resposta ao autor ou interação. Em comandos Slash, passar true no segundo parâmetro torna a mensagem efêmera (visível apenas para quem usou).
  • s.mention[userId?]: Menciona um usuário (<@userId>). Se omitido, menciona o autor da mensagem/interação.
  • s.channelMention[channelId?]: Menciona um canal (<#channelId>). Se omitido, menciona o canal atual.
  • s.roleMention[roleId]: Menciona um cargo (<@&roleId>).

🧠 Lógica e Controle

  • s.if[condição; verdadeiro; falso?]: Avalia a condição e executa apenas a ramificação correspondente (lazy evaluation).
  • s.eq[valor1; valor2; caseSensitive?]: Retorna "true" se os valores forem iguais. O terceiro parâmetro controla se diferencia maiúsculas/minúsculas (padrão: true).

💾 Banco de Dados (SQLite)

  • s.db.set[chave; valor; escopo?]: Grava uma chave/valor no SQLite. O escopo pode ser global (padrão), guild (isolado por servidor) ou user (isolado por usuário dentro do servidor).
  • s.db.get[chave; escopo?]: Resgata o valor correspondente no SQLite usando o escopo especificado.

📊 Dashboard Web

O painel é ativado ao chamar client.startDashboard(porta). Ele exibe estatísticas básicas do bot (Uptime, Ping, Comandos) e permite consultar ou gerenciar chaves no banco de dados SQLite via navegador.

🛠️ Testes

Para executar os testes unitários da suíte do parser:

bun test