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

discore.js

v1.4.5

Published

Discord.js-based powerful node.js module to interact with Discord API.

Downloads

23

Readme

Based on discord.js

Examples

index.js structure:

const { Core } = require('discore.js');
new Core({
  // options
}).login('token');
  • Alternate login system
const { Core } = require('discore.js');
new Core({
  token: 'token',
});
  • All options (defaults)
const { Core } = require('discore.js');
new Core({
  folders: {
    inhibitors: 'inhibitors',
    commands: 'commands',
    monitors: 'monitors',
    triggers: 'triggers',
    events: 'events',
  },

  prefixOptions: {
    spaceSeparator: false, // Allow space after prefix
    ignoreCase: false, // Ignore prefix case
    mention: false, // Allow using @mention as prefix
  },

  commandOptions: {
    argsSeparator: ' ', // Regular expressions are allowed
    permLevels: new PermissionLevels(),
    ignoreCase: false,
    ignoreBots: true, // Prevents bots from using commands.
    ignoreSelf: true, // Prevents the bot from using commands on itself.
  },

  mainPath: '.',

  // Displays the bot as online from a mobile
  mobile: false,

  // Regular expressions and arrays (Strings, RegExps) are allowed.
  prefix: undefined,

  token: null,
  db: null,
});
  • Per-guild configuration.
this.client.config.guild.set('guild_id', {
  prefix: undefined,
  mentionPrefix: false,
  argsSeparator: ' ',
  ignoreCase: true,
  ignorePrefixCase: true,
  permLevels: new PermissionLevels(),
  ignoreSelf: true,
  ignoreBots: true,
});

// If you want to leave current default prefixes
// and add new one then you can use add() method.
this.client.config.guild.add('guild_id', {
  prefix: '.', // Example.
});

Events

Events are placed in .\events\(CoreOptions#folders#events option). For instance, creating .\events\Main\ready.js will be an event named ready in the Main category. Subcategories are also allowed and will have second and greater folder levels.

Their structure (options argument defined with default configuration):

All Custom Events

  • load (Store).

  • load:{type}s (Store).

  • voiceChannelJoin (oldState: VoiceState, newState: VoiceState)

  • voiceChannelSwitch (oldState: VoiceState, newState: VoiceState)

  • voiceChannelLeave (oldState: VoiceState, newState: VoiceState)

  • dbConnect

  • dbError

  • dbDisconnect

const { Event } = require('discore.js');

module.exports = class extends Event {
  get options() {
    return {
      enabled: true,
      name: null, // Event name.
      once: false, // Unloads after first use.
      id: undefined, // Used to get the event.
    };
    // If name is not defined then it will be defined as file name.
    // For example, ready.js will be 'ready'
  }

  get customOptions() {
    return {
      // You can put any options you want.
      // And use it via this.custom
    };
  }

  get cOptions() {
    return {
      // Same as customOptions property.
      /*
        If you define both customOptions and cOptions
        then customOptions becomes more priority
      */
    };
  }

  // Params of the event
  run(...params) {
    // Event code.
    // Runs only if enabled.
  }

  disabledRun(...params) {
    // Same as run but runs only if disabled.
  }

  init() {
    // Optional method. Runs on 'ready'
    // event so you are able to use discord
    // data via this.client
  }
};

Methods

  • toggle()
  • enable()
  • disable()
  • unload()
  • reload()
  • toString()

Properties

  • categories

Commands

Commands are placed in .\commands\ (CoreOptions#folders#commands option). For instance, creating .\events\Main\help.js will be a command named help in the Main category. Subcategories are also allowed and will have second and greater folder levels.

Their structure (options argument defined with default configuration):

const { Command } = require('discore.js');

module.exports = class extends Command {
  get options() {
    return {
      enabled: true,
      name: null, // Command name.
      id: undefined, // Used to get the command.
      cooldown: 0, // In milliseconds
      aliases: [],
      permLevel: 0, // Runs noPermsRun() method if tests not passed.
      once: false, // Unloads after first use.
      requiredRoles: [], // Accepts string and string array
      requiredPerms: [], // Accepts number, string and array of strings and numbers
    };
    // If name is not defined then it will be defined as file name.
    // For example, test.js will be 'test'
  }

  get customOptions() {
    return {
      // You can put any options you want.
      // And use it via this.custom
    };
  }

  get cOptions() {
    return {
      // Same as customOptions property.
      /*
        If you define both customOptions and cOptions
        then customOptions becomes more priority.
      */
    };
  }

  run(message, args, { usedPrefix, usedCommand }) {
    // Command code.
    // runs only if enabled.
  }

  disabledRun(message, args, { usedPrefix, usedCommand }) {
    // runs only if disabled.
  }

  noPermsRun(message, args, { usedPrefix, usedCommand }) {
    // runs if Permission Level test hasn't passed.
  }

  noRequiredRolesRun(message, args, { usedPrefix, usedCommand }) {}
  noRequiredPermsRun(message, args, { usedPrefix, usedCommand }) {}

  cdRun(message, args, { usedPrefix, usedCommand }) {
    // runs if user have active cooldown on his id
  }

  init() {
    // runs on 'ready'
    // event so you are able to use discord
    // data via this.client
  }
};

Methods

  • toggle()
  • enable()
  • disable()
  • unload()
  • reload()
  • toString()

Properties

  • categories

Monitors

Monitors are placed in .\monitors\(CoreOptions#folders#monitors option). Runs on any message and receives message as first argument. For instance, creating .\monitors\Main\filter.js will be a monitor named filter in the Main category. Subcategories are also allowed and will have second and greater folder levels.

Their structure (options argument defined with default configuration):

const { Monitor } = require('discore.js');

module.exports = class extends Monitor {
  get options() {
    return {
      enabled: true,
      name: null, // Monitor name.
      id: undefined, // Used to get the command.
      once: false, // Unloads after first use.
    };
    // If name is not defined then it will be defined as file name.
    // For example, filter.js will be 'filter'
  }

  get customOptions() {
    return {
      // You can put any options you want.
      // And use it via this.custom
    };
  }

  get cOptions() {
    return {
      // Shortcut for customOptions property.
      /*
        If you define both customOptions and cOptions
        then customOptions becomes more priority
      */
    };
  }

  run(message) {
    // Monitor code.
    // Runs only if enabled.
  }

  disabledRun(message) {
    // Same as run but runs only if disabled.
  }

  init() {
    // Optional method. Runs on 'ready'
    // event so you are able to use discord
    // data via this.client
  }
};

Methods

  • toggle()
  • enable()
  • disable()
  • unload()
  • reload()
  • toString()

Properties

  • categories

Triggers

Triggers are placed in .\triggers\(CoreOptions#folders#triggers option). Runs on any message if it is not a command and receives message as first argument. For instance, creating .\triggers\Main\xp.js will be a trigger named xp in the Main category. Subcategories are also allowed and will have second and greater folder levels.

Their structure (options argument defined with default configuration):

const { Trigger } = require('discore.js');

module.exports = class extends Trigger {
  get options() {
    return {
      enabled: true,
      name: null, // Trigger name.
      id: undefined, // Used to get the command.
      once: false, // Unloads after first use.
    };
    // If name is not defined then it will be defined as file name.
    // For example, xp.js will be 'xp'
  }

  get customOptions() {
    return {
      // You can put any options you want.
      // And use it via this.custom
    };
  }

  get cOptions() {
    return {
      // Shortcut for customOptions property.
      /*
        If you define both customOptions and cOptions
        then customOptions becomes more priority
      */
    };
  }

  run(message) {
    // Trigger code.
    // Runs only if enabled.
  }

  disabledRun(message) {
    // Same as run but runs only if disabled.
  }

  init() {
    // Optional method. Runs on 'ready'
    // event so you are able to use discord
    // data via this.client
  }
};

Methods

  • toggle()
  • enable()
  • disable()
  • unload()
  • reload()
  • toString()

Properties

  • categories

Inhibitors

Inhibitors are placed in .\inhibitors\(CoreOptions#folders#inhibitors option). Runs on any message if it is a command and receives message as first argument and command as second argument. For instance, creating .\inhibitors\Main\inhibit.js will be an inhibitor named inhibit in the Main category. Subcategories are also allowed and will have second and greater folder levels.

Their structure (options argument defined with default configuration):

const { Inhibitor } = require('discore.js');

module.exports = class extends Inhibitor {
  get options() {
    return {
      enabled: true,
      name: null, // Inhibitor name.
      id: undefined, // Used to get the command.
      once: false, // Unloads after first use.
    };
    // If name is not defined then it will be defined as file name.
    // For example, server.js will be 'server'
  }

  get customOptions() {
    return {
      // You can put any options you want.
      // And use it via this.custom
    };
  }

  get cOptions() {
    return {
      // Shortcut for customOptions property.
      /*
        If you define both customOptions and cOptions
        then customOptions becomes more priority
      */
    };
  }

  run(cmd, message, args, { usedPrefix, usedCommand }) {
    // Inhibitor code.
    // Runs only if enabled.
    // Should return true in the end.
    // Doesn't run commands if return false or undefined.
  }

  disabledRun(cmd, message, args, { usedPrefix, usedCommand }) {
    // Same as run but runs only if disabled.
  }

  init() {
    // Optional method. Runs on 'ready'
    // event so you are able to use discord
    // data via this.client
  }
};

Methods

  • toggle()
  • enable()
  • disable()
  • unload()
  • reload()
  • toString()

Properties

  • categories

Finalizers

Finalizers are placed in .\finalizers\(CoreOptions#folders#finalizers option). Runs after a command. Receives message as first argument, message response as second one, and a boolean, which is true wheather if command is enabled, as third argument. For instance, creating .\finalizers\Main\reply.js will be a finalizer named reply in the Main category. Subcategories are also allowed and will have second and greater folder levels.

Their structure (options argument defined with default configuration):

const { Finalizer } = require('discore.js');

module.exports = class extends Finalizer {
  get options() {
    return {
      enabled: true,
      name: null, // Inhibitor name.
      id: undefined, // Used to get the command.
      once: false, // Unloads after first use.
    };
    // If name is not defined then it will be defined as file name.
    // For example, server.js will be 'server'
  }

  get customOptions() {
    return {
      // You can put any options you want.
      // And use it via this.custom
    };
  }

  get cOptions() {
    return {
      // Shortcut for customOptions property.
      /*
        If you define both customOptions and cOptions
        then customOptions becomes more priority
      */
    };
  }

  run(message, res, enabled) {
    // Inhibitor code.
    // Runs only if enabled.
    // Should return true in the end.
    // Doesn't run commands if return false or undefined.
  }

  disabledRun(message, res, enabled) {
    // Same as run but runs only if disabled.
  }

  init() {
    // Optional method. Runs on 'ready'
    // event so you are able to use discord
    // data via this.client
  }
};

Methods

  • toggle()
  • enable()
  • disable()
  • unload()
  • reload()
  • toString()

Properties

  • categories

Store

Do you want to load event or command in live mode? You can use load() method!

.\ is gonna be your main file's root folder.

Methods

  • load()
  • get()
  • search()
Method Examples
this.client.events.load('./events/event');
this.client.commands.load('./commands/command');

this.client.events.get('event_id');
this.client.events.get('event_name'); // Same as previous example

this.client.commands.get('command_id');
this.client.commands.get('command_name'); // Same as previous example
this.client.commands.get('command_alias'); // Same as previous example

this.client.commands.search('hlp');
this.client.commands.search('hlep');

Permission Levels

Their structure:

const { PermissionLevels } = require('discore.js');

const permLevels = new PermissionLevels();
permLevels
  .add(0, true, (msg) => msg.author.id === '1')

  // Permissions Level 1 gives access only if message author id is equal to '1'
  .add(1, false, (msg) => msg.author.id === '1')

  // Permissions Level 2 gives access only to the bot
  .addLevel(2, false, (msg, client) => {
    return msg.author.id === client.user.id;
  });

// Tests for a role.
permLevels.add(3, true, (msg) => msg.member.roles.has('roleid'));

// Testing. Returns boolean.
permLevels.test(3, msg);

// You can define client as third argument if needed.
permLevels.test(2, msg, this.client);

Methods

  • addLevel()
  • add()
  • test()

Properties

  • length

Pages

Their structure:

const { Pages, Embed } = require('discore.js');

const pages = new Pages(this.client, {
  prevPage: '⏮', // Emoji which is used to switch to the previous page.
  nextPage: '⏭', // Emoji which is used to switch to the next page.
  filter: (reaction, user) => user.id === message.author.id, // Example.
});

const embed = new Embed()
  .setTitle('Embedded Page!')
  .setDescription('Yay! You can add embedded page!')
  .setFooter('Page: 2');

pages
  // AddPage method adds only one page.
  .addPage('Hey! You are on the first page!')
  // With add method you can add one page.
  .add(embed)
  // Or tons of pages!
  .add('`Third page.`', '`Fourth and the last page.`');

const msg = await pages.send(message.channel);

const timeout = 5000; // 5000 milliseconds = 5 seconds.
// To turn off pages just delete the message!
// Example:
msg.delete(timeout);
// or
setTimeout(() => msg.delete(), timeout);

Methods

  • addPage()
  • add()
  • send()

Properties

  • client
  • options
  • emojis
  • pages
  • filter

Databases

DBs you use but much faster, powerful and object-oriented

Document

Methods

  • save()
  • populate()
  • json()

Examples

const doc = await db.getCollection('users').findOne({ id: 'some id' });

doc.someProp = 'some value';

doc.save().then(() => console.log('Saved!'));

Global Model Events

MongoDB

Structure:

const { Core, Mongo } = require('discore.js');

const db = new Mongo('url', {
  /* Options */
});

new Core({
  db,
});

Methods

  • addModel()
  • open() ( Open connection )
  • close() ( Close connection )
  • getCollection()

Properties

  • collections
  • connection

DB Models

Their structure:

// If default value is not defined, it will be set to undefined.
// You can leave values as undefined.
const data = {
  id: Mongo.Types.String,
  messageCount: { type: Mongo.Types.Number, default: 0 },
};

db.addModel('modelName', data);

Types

  • Number
  • Double
  • String
  • Object
  • Array
  • ObjectId
  • Boolean
  • Date
  • RegExp

Methods

  • fetch()
  • getData()
  • filterKeys()
  • filter()
  • findKey()
  • findOne()
  • getOne()
  • insertOne()
  • insertMany()
  • deleteOne()
  • deleteMany()
  • updateOne()
  • upsertOne()
fetch()
// Fetches all documents from the database.
// Returns Promise<Collection<string, MongoDocument>>

const collection = db.getCollection('name');

const data = await collection.fetch();
getData()
// Returns data from local storage.
// Returns Promise<Collection<string, MongoDocument>>

const collection = db.getCollection('name');

const data = await collection.getData();
filterKeys()
// Filters the collection and returns only keys.
// Returns Promise<string[]>

const collection = db.getCollection('name');

const keys = await collection.filterKeys(
  (value) => value.username === 'zargovv'
);
filter()
// Filters the collection.
// Returns Promise<Collection<string, MongoDocument>>

const collection = db.getCollection('name');

const newCollection = await collection.filter(
  (value) => value.username === 'zargovv'
);
findKey()
// Finds document and returns key.
// Returns Promise<string | undefined>

const collection = db.getCollection('name');

const result = await collection.findKey(
  (value) => value.username === 'zargovv'
);
findOne()
// Finds document.
// Returns Promise<Document | undefined>

const collection = db.getCollection('name');

const result = await collection.findOne(
  (value) => value.username === 'zargovv'
);
getOne()
// Gets document
// (Searches for it, if there is no one, then returns default values).
// Returns Promise<Document | undefined>

const collection = db.getCollection('name');

const document = await collection.getOne(
  (value) => value.username === 'zargovv'
);
insertOne()
// Creates new document
// Returns Document

const collection = db.getCollection('name');

const result = collection.insertOne({ id: '1', username: 'zargovv' });
insertMany()
// Creates new documents
// Returns Document[]

const collection = db.getCollection('name');

const result = collection.insertMany([
  { id: '1', username: 'zargovv' },
  { id: '2', username: 'discore.js' },
]);
deleteOne()
// Deletes document
// Returns Promise<Document | undefined>

const collection = db.getCollection('name');

const result = await collection.deleteOne({ username: 'zargovv' });
deleteMany()
// Deletes document
// Returns Promise<Document[]>

const collection = db.getCollection('messages');

const result = collection.deleteMany((doc) => doc.messageCount < 1);
updateOne()
// Updates document. Returns undefined if document wasn't found.
// Returns Promise<Document | undefined>

const collection = db.getCollection('name');

const result = await collection.updateOne({ username: 'zargovv' }, { id: '0' });
upsertOne()
// Updates document. Creates new one if not found.
// Returns Promise<Document>

const collection = db.getCollection('name');

const result = await collection.updateOne({ username: 'zargovv' }, { id: '0' });

MySQL

Structure:

const { Core, MySql } = require('discore.js');

const db = new MySql(/* connection url(string) or connection options(object) */);

new Core({
  db,
});

Events

  • dbConnect
  • dbError
  • dbDisconnect

Methods

  • addModel()
  • open() ( Open connection )
  • close() ( Close connection )
  • getCollection()

Properties

  • collections

DB Models

Their structure:

// If default value is not defined, it will be set to undefined.
// You can leave values as undefined.
const data = {
  id: MySql.Types.VarChar(18),
  messageCount: { type: MySql.Types.Int, default: 0 },
  rowId: {
    type: MySql.Types.Int(null, 'NOT NULL', 'AUTO_INCREMENT', 'PRIMARY'),
    default: 0,
  },
};

db.addModel('modelName', data);

Types

  • Double
  • Boolean
  • Date
  • VarChar
  • TinyText
  • Text
  • Blob
  • MediumText
  • LongText
  • LongBlob
  • TinyInt
  • SmallInt
  • MediumInt
  • Int
  • BigInt
  • Float
  • Decimal
  • DateTime
  • Timestamp
  • Time
  • Enum
  • Set

Methods

  • fetch()
  • getData()
  • filterKeys()
  • filter()
  • findKey()
  • findOne()
  • getOne()
  • insertOne()
  • insertMany()
  • deleteOne()
  • deleteMany()
  • updateOne()
  • upsertOne()
fetch()
// Fetches all documents from the database.
// Returns Promise<Collection<string, MongoDocument>>

const collection = db.getCollection('name');

collection.fetch().then((data) => {});
getData()
// Returns data from local storage.
// Returns Promise<Collection<string, MongoDocument>>

const collection = db.getCollection('name');

const data = await collection.getData();
filterKeys()
// Filters the collection and returns only keys.
// Returns Promise<string[]>

const collection = db.getCollection('name');

const keys = await collection.filterKeys(
  (value) => value.username === 'zargovv'
);
filter()
// Filters the collection.
// Returns Promise<Collection<string, MongoDocument>>

const collection = db.getCollection('name');

const newCollection = await collection.filter(
  (value) => value.username === 'zargovv'
);
findKey()
// Finds document and returns key.
// Returns Promise<string | undefined>

const collection = db.getCollection('name');

const result = await collection.findKey(
  (value) => value.username === 'zargovv'
);
findOne()
// Finds document.
// Returns Promise<Document | undefined>

const collection = db.getCollection('name');

const result = await collection.findOne(
  (value) => value.username === 'zargovv'
);
getOne()
// Gets document
// (Searches for it, if there is no one, then returns default values).
// Returns Promise<Document | undefined>

const collection = db.getCollection('name');

const document = await collection.getOne(
  (value) => value.username === 'zargovv'
);
insertOne()
// Creates new document
// Returns Document

const collection = db.getCollection('name');

const result = collection.insertOne({ id: '1', username: 'zargovv' });
insertMany()
// Creates new documents
// Returns Document[]

const collection = db.getCollection('name');

const result = collection.insertMany([
  { id: '1', username: 'zargovv' },
  { id: '2', username: 'discore.js' },
]);
deleteOne()
// Deletes document
// Returns Promise<Document | undefined>

const collection = db.getCollection('name');

const result = collection.deleteOne({ username: 'zargovv' });
deleteMany()
// Deletes document
// Returns Promise<Document[]>

const collection = db.getCollection('messages');

const result = collection.deleteMany((doc) => doc.messageCount < 1);
updateOne()
// Updates document. Returns undefined if document wasn't found.
// Returns Promise<Document | undefined>

const collection = db.getCollection('name');

const result = await collection.updateOne({ username: 'zargovv' }, { id: '0' });
upsertOne()
// Updates document. Creates new one if not found.
// Returns Promise<Document>

const collection = db.getCollection('name');

const result = await collection.updateOne({ username: 'zargovv' }, { id: '0' });

Json

Structure:

const { Core, Json } = require('discore.js');

const db = new Json(/* path to the directory */);

new Core({
  db,
});

Methods

  • addModel()
  • getCollection()
  • save()

Properties

  • collections

DB Models

Their structure:

// Default values.
// You can leave values as undefined.
const data = {
  id: undefined,
  messageCount: 0,
  rowId: 0,
};

db.addModel('modelName', data);

Methods

  • fetch()
  • getData()
  • filterKeys()
  • filter()
  • findKey()
  • findOne()
  • getOne()
  • insertOne()
  • insertMany()
  • deleteOne()
  • deleteMany()
  • updateOne()
  • upsertOne()
fetch()
// Fetches all documents from the database.
// Returns Promise<Collection<string, Document>>

const collection = db.getCollection('name');

collection.fetch().then((data) => {});
getData()
// Returns data from local storage.
// Returns Promise<Collection<string, MongoDocument>>

const collection = db.getCollection('name');

const data = await collection.getData();
filterKeys()
// Filters the collection and returns only keys.
// Returns string[]

const collection = db.getCollection('name');

const keys = collection.filterKeys((value) => value.username === 'zargovv');
filter()
// Filters the collection.
// Returns Collection<string, Document>

const collection = db.getCollection('name');

const newCollection = collection.filter(
  (value) => value.username === 'zargovv'
);
findKey()
// Finds document and returns key.
// Returns string | undefined

const collection = db.getCollection('name');

const result = collection.findKey((value) => value.username === 'zargovv');
findOne()
// Finds document.
// Returns Document | undefined

const collection = db.getCollection('name');

const result = collection.findOne((value) => value.username === 'zargovv');
getOne()
// Gets document
// (Searches for it, if there is no one, then returns default values).
// Returns Document | undefined

const collection = db.getCollection('name');

const document = collection.getOne((value) => value.username === 'zargovv');
insertOne()
// Creates new document
// Returns Document

const collection = db.getCollection('name');

const result = collection.insertOne({ id: '1', username: 'zargovv' });
insertMany()
// Creates new documents
// Returns Document[]

const collection = db.getCollection('name');

const result = collection.insertMany([
  { id: '1', username: 'zargovv' },
  { id: '2', username: 'discore.js' },
]);
deleteOne()
// Deletes document
// Returns Document | undefined

const collection = db.getCollection('name');

const result = collection.deleteOne({ username: 'zargovv' });
deleteMany()
// Deletes document
// Returns Promise<Document[]>

const collection = db.getCollection('messages');

const result = collection.deleteMany((doc) => doc.messageCount < 1);
updateOne()
// Updates document. Returns undefined if document wasn't found.
// Returns Document | undefined

const collection = db.getCollection('name');

const result = collection.updateOne({ username: 'zargovv' }, { id: '0' });
upsertOne()
// Updates document. Creates new one if not found.
// Returns Document

const collection = db.getCollection('name');

const result = collection.updateOne({ username: 'zargovv' }, { id: '0' });

License

FOSSA Status