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

sphinx-tools

v2.0.1

Published

Very powerful and advanced tools all made by Sphinx (3yl) for Arabs in specific, to help them manage their Discord bots with ease. Features include advanced broadcasting/multicasting, auto-reactions, leveling system, voice stay, Quran and Ahadith fetching

Readme

Sphinx Tools , made by Sphinx (3yl)

A powerful Discord automation package with selfbot and bot features.

Installation

npm install sphinx-tools

Classes

1. User Class (Selfbot - discord.js-selfbot-v13)

const { Client } = require('discord.js-selfbot-v13');
const { User } = require('sphinx-tools');

const client = new Client();
const user = new User(client);

client.login('YOUR_TOKEN');

autoreaction()

Auto-react to giveaways and handle button interactions.

await user.autoreaction({
  customBotID: ['bot-id-1', 'bot-id-2'],
  timeout: 3000,
  blacklistedwords: ['fake', 'test'],
  ownerId: 'your-user-id'
});

Options:

  • customBotID - Array of bot IDs to monitor
  • timeout - Delay before reacting (ms, default: 5000)
  • blacklistedwords - Words to ignore in embeds
  • ownerId - Your user ID for tracking

Events:

user.on('giveawayCreated', (data) => {
  console.log(data.url);    // Message URL
  console.log(data.embed);  // Embed data
  console.log(data.bot);    // Bot ID
});

user.on('wins', (data) => {
  console.log(data.inv);    // Server invite
  console.log(data.data);   // Win message
});

leveling()

Send messages automatically for ranking up.

await user.leveling({
  channel: 'channel-id',
  time: 15000,
  type: 'eng',
  randomLetters: false
});

Options:

  • channel - Channel ID (required)
  • time - Interval between messages (ms, default: 15000)
  • type - Language: 'eng' or 'ar' (default: 'eng')
  • randomLetters - Generate random text (default: false)

Methods:

user.stopLeveling();     // Stop sending messages
user.restartLeveling();  // Restart with previous options

VoiceStay()

Stay connected to a voice channel.

await user.VoiceStay({
  guild: 'guild-id',
  channel: 'voice-channel-id'
});

Options:

  • guild - Guild ID (required)
  • channel - Voice channel ID (required)

Features:

  • Auto-reconnects if disconnected
  • Checks connection every 30 seconds

2. BotBroadcaster Class (Bot - Eris)

const Eris = require('eris');
const { BotBroadcaster } = require('sphinx-tools');

const client = new Eris('BOT_TOKEN');
const broadcaster = new BotBroadcaster(client);

client.connect();

broadcast()

Send DMs to guild members using one bot.

const result = await broadcaster.broadcast({
  guildID: 'guild-id',
  message: 'Hello everyone!',
  timeout: 2000,
  mention: true,
  skipBots: true,
  onlineOnly: false
});

Options:

  • guildID - Guild ID (required)
  • message - Message to send (required)
  • timeout - Delay between DMs (ms, default: 2000)
  • mention - Mention users in DMs (default: true)
  • logInfo - Log each DM (default: false)
  • speedMode - No delays (default: false)
  • skipBots - Skip bot accounts (default: true)
  • skipRoles - Array of role IDs to skip (default: [])
  • maxRetries - Retry failed DMs (default: 1)
  • onlineOnly - Only target online/dnd/idle users (default: false)

Events:

broadcaster.on('broadcastStarted', (data) => {
  console.log(data.targetCount); // Total members
});

broadcaster.on('broadcastProgress', (data) => {
  console.log(data.progress);    // Percentage
  console.log(data.sent);        // Sent count
  console.log(data.failed);      // Failed count
});

broadcaster.on('dmSent', (data) => {
  console.log(data.member);      // Username
});

broadcaster.on('dmFailed', (data) => {
  console.log(data.error);       // Error message
});

broadcaster.on('broadcastComplete', (result) => {
  console.log(result.successCount);
  console.log(result.failureCount);
  console.log(result.duration);
});

Result:

{
  guildID: 'guild-id',
  guildName: 'Server Name',
  successCount: 150,
  failureCount: 10,
  duration: 45000,
  targetCount: 160,
  successRate: 93,
  timestamp: Date
}

multiCast()

Send DMs using multiple bots.

const bot1 = new Eris('TOKEN_1');
const bot2 = new Eris('TOKEN_2');
const bot3 = new Eris('TOKEN_3');

const result = await broadcaster.multiCast({
  guildID: 'guild-id',
  message: 'Hello everyone!',
  bots: [bot1, bot2, bot3],
  timeout: 1000,
  randomDistribution: true,
  maxDMsPerHour: 50,
  onlineOnly: false
});

Options:

  • Same as broadcast() plus:
  • bots - Array of Eris clients (required, min: 2)
  • randomDistribution - Distribute randomly (default: true)
  • maxDMsPerHour - Rate limit per bot (default: 40)

Events:

broadcaster.on('multicastStarted', (data) => {
  console.log(data.botCount);    // Number of bots
});

broadcaster.on('multicastProgress', (data) => {
  console.log(data.botsUsed);    // Bots count
});

broadcaster.on('multicastComplete', (result) => {
  console.log(result.botsUsed);
  console.log(result.averageDMsPerBot);
  console.log(result.botStats);  // Per-bot statistics
});

Result:

{
  guildID: 'guild-id',
  guildName: 'Server Name',
  successCount: 150,
  failureCount: 10,
  duration: 30000,
  botsUsed: 3,
  averageDMsPerBot: 50,
  botStats: [
    { botID: 'id', botUsername: 'Bot1', successCount: 50, failureCount: 3 },
    { botID: 'id', botUsername: 'Bot2', successCount: 52, failureCount: 4 },
    { botID: 'id', botUsername: 'Bot3', successCount: 48, failureCount: 3 }
  ]
}

Utility Methods

// Configure broadcaster
broadcaster.setConfig({
  speedMode: false,
  delayBetweenDMs: 3000,
  maxDMsPerHour: 50
});

// Get current config
const config = broadcaster.getConfig();

// Get statistics
const stats = broadcaster.getStats();
console.log(stats.totalDmsSent);
console.log(stats.successRate);

// Get history
const history = broadcaster.getHistory(10); // Last 10 broadcasts

// Clear history
broadcaster.clearHistory(true); // true = clear stats too

3. Islam Class

const { Islam } = require('sphinx-tools');
const islam = new Islam();

Quran Methods

// Get all suras
const suras = islam.returnAllSuras();

// Play sura in voice channel
await islam.play('Al-Fatiha', voiceConnection);
await islam.play(1, voiceConnection); // By number

// Stop playback
await islam.stop(voiceConnection);

Islamic Content

// Get random quiz question
const quiz = islam.quiz();
console.log(quiz.name);     // Question
console.log(quiz.answers);  // Array of answers with correct/wrong flag

// Get random zekr
const zekr = islam.getRandomZekr();

// Get random hadith
const hadith = islam.getRandomHadith();

// Convert to Hijri date
const hijri = islam.convertToHejri(new Date());
console.log(hijri.year);       // Hijri year
console.log(hijri.month);      // Hijri month number
console.log(hijri.day);        // Hijri day
console.log(hijri.monthName);  // Month name in English

Examples

Giveaway Bot

const { Client } = require('discord.js-selfbot-v13');
const { User } = require('sphinx-tools');

const client = new Client();
const user = new User(client);

client.on('ready', async () => {
  await user.autoreaction({
    customBotID: ['294882584201003009'],
    timeout: 2000
  });

  user.on('giveawayCreated', (data) => {
    console.log('New giveaway:', data.url);
  });

  user.on('wins', (data) => {
    console.log('You won! Join:', data.inv);
  });
});

client.login('TOKEN');

Mass DM Bot

const Eris = require('eris');
const { BotBroadcaster } = require('sphinx-tools');

const client = new Eris('BOT_TOKEN');
const broadcaster = new BotBroadcaster(client);

client.on('ready', async () => {
  const result = await broadcaster.broadcast({
    guildID: '123456789',
    message: 'Important announcement!',
    timeout: 3000,
    skipBots: true,
    onlineOnly: true
  });

  console.log(`Sent to ${result.successCount} members`);
});

client.connect();

Multicast DM

const Eris = require('eris');
const { BotBroadcaster } = require('sphinx-tools');

const bots = [
  new Eris('TOKEN_1'),
  new Eris('TOKEN_2'),
  new Eris('TOKEN_3')
];

const broadcaster = new BotBroadcaster(bots[0]);

Promise.all(bots.map(bot => bot.connect())).then(async () => {
  const result = await broadcaster.multiCast({
    guildID: '123456789',
    message: 'Hello from multiple bots!',
    bots: bots,
    timeout: 1000,
    randomDistribution: true
  });

  console.log(`${result.botsUsed} bots sent ${result.successCount} DMs`);
});

Notes

  • User class uses discord.js-selfbot-v13 (selfbot)
  • BotBroadcaster uses Eris (bot)
  • Selfbots violate Discord ToS - use at your own risk
  • Keep tokens secure
  • Rate limits apply to broadcasting

License

GPL-3.0-only

Author

Sphinx (3yl)

Support

Issues: Support Server