Getting Started
Welcome
Welcome to the OpenBot API Documentation. We hope everything on this page is clear, but if you dont understand something, want to suggest a change, addition, etc, you can go to the OpenBot Support discord server and talk us.
Prerequirements
OpenBot and its API use quite a few technologies in order to work. You don't need to know all of them in order to make commands, but there are some which you do need to know.
Required Knowledge:
- node.js
- discord.js
Helpful Knowledge:
- rethinkdb
Things OpenBot uses that you don't need to know
- express.js
- php
- html5/css3
- child_process
We are happy to help you with problems you have while using OpenBot, but if your problems are from lack of required knowledge we will send you to other documentation/tutorials relating to that framework/language, we won't write your commands for you. It is up to you to learn what you need to learn.
Creating a command
Here are the steps to create a command on the OpenBot website that you can start writing code for.
- Go to the website
- Login
- Click "Profile" in the upper right corner
- Click "Settings" under your avatar
- Enable the slider labeled "Developer Mode"
- Click "Commands" under your avatar
- Click "Create Command"
- Click "Edit" on the command that appears in the list.
Command Editor
MetaData Box
In the top left of the command editor, there is a box which contains the metadata of your command, including its Icon, Permissions, and Support link. These control how people can see and interact with your command.
Icon
Your command's icon is displayed next to it in help menus, searches and more. It should relate to your command so that people can tell what it does at a glance. The icon can be any discord emoji. If it is a default emoji, it must be entered into the editor like :smile:
. If it is a custom emoji, it must be entered in like <:AddCommand:634475978000695316>
To find the ID of a custom emoji, right click it in discord and click copy link. The number in the link is the ID of your emoji. (If you are using discord in your browser, you will click copy image address instead of copy link)
Support Link
The support link is displayed under your command in information menus. You can set it to a link to the discord server you want people to go to when your command breaks.
The support link must be formatted https://discordapp.com/invite/abcdef
where abcdef is the invite code.
Bot Perms
The Bot Perms are the permissions that OpenBot needs in order to run your command. It will prevent your command from running when permissions aren't met, so that you dont need to handle it inside your command. You can calculate the permissions number at the Discord Permissions Calculator
User Perms
The User Perms are the permissions that a user needs in order to run your command. It will prevent your command from being used by the wrong people. You can calculate the permissions number at the Discord Permissions Calculator
Open Source
If your command is marked as open source, other users will be able to view its code on the website and see how you work your magic.
Pull Requests
If your command is marked as allowing pull requests, other users will be able to edit its code on the website. You will be notified of all edits, with the option to accept or deny them.
Private
If your command is marked as private, nobody will be able to add it to a server or see it in search results except for you.
Language Support Box
In the top right of the command editor, there is a box which contains the language data of your command, including its Names, Callnames, Descriptions, and more. These let you translate your command into multiple languages!
Name
The name of your command is... well... its name. It defines how users search for your command, and how it appears in the help menu.
Callname
The callname of your command is what people use to execute it. For example, a command with a callname of "Help" is executed using -Open Help
. Your callname should generally be pretty short, to make typing it easy.
Command Description
The description is a place to let your inner author roam free, and tell the world the intracies of your command.
Command Syntax
The syntax of your command is displayed after its name in help menus, searches, etc. It should tell users what arguments your command accepts. For example, the syntax for a kick command would be similar to [@Mention]
. The square brackets indicate a required parameter which is a mention of a user.
Formatting:
[Param] - Required parameter
{Param} - Optional parameter
Param - Literall text (write Param)
(Note) - Note (ie you can use (No Arguments)
to indicate that your command doesnt expect any parameters
Translation Strings
Example: How to use translation strings
//Send String 0
Message.channel.send(this.Languages[LibOpenBot.LanguageIndex(this,BotContext.User.Settings.Language].Strings[0]);
//Make a reference to the strings for cleaner code
var Strings=this.Languages[LibOpenBot.LanguageIndex(this,BotContext.User.Settings.Language].Strings;
//Later...
Message.channel.send(Strings[0]);
Translation strings allow the text inside your command to be translated. You can have as many as you want, and you can access them from your code.
Event Box
Your command can have multiple events, or just one. These are where you put your code. You can find a description of what the different events do below.
To add an event, click the green "Add" button. You can add all the default events once, and as many custom events as you need.
To edit the parameters of a custom event, click the + to add, - to remove, and use the textfields to edit parameters. You cannot have duplicate or empty parameters.
To delete an event, click the "x" next to its name
Settings Box
Your command can have custom settings which guild admins will edit on the dashboard. When your command accesses its settings, they will be represented by an object.
Example: Access the settings for your command
//Create a variable with the command's settings
var Settings=await LibOpenBot.GetCommandSettings(this,BotContext.Guild);
//Print the setting
Message.chanenl.send('My setting is set to '+Settings.ExampleText);
Fields
Fields are the meat of settings. There are several different types of fields, which can store different types of data and can be selected in different ways. All settings have a Name and Default value.
Name: The name to access the field by, and the name displayed in the guild dashboard
Type: The type of data stored in the field. Can be Bool, Text, or Set
Default: The value that is set when the bot joins a server, or when this setting is added
Description: The description of the field, displayed in the guild dashboard
Condition: The visibility condition of the field. This is evaluated when people view the setting in the dashboard. It is given the variables "Settings" and "SettingsRoot". Setting is the category that the setting is in, and SettingsRoot is the top level category. For example, if you have a bool field named "Enable Feature", you could have the condition for "Feature Setting X" be Settings["Enable Feature"]
, and "Feature Setting X" will only be shown when "Enable Feature" is turned on.
Field Types
There are several different field types that can be used, each can hold a different type of data.
Bool:
The bool type holds a boolean value (true or false). On the guild dashboard, it is chosen using a toggle switch.
Category:
The category type is a container for other fields. It allows you to organize your data for easy access.
List:
A list is like an array. You define a template for the objects that go inside the list, and users can add as many as they want (up to the limit you set). It is accessed like an array (ie: Settings.MyList[0].SomeProperty accesses the first element in MyList)
Text:
The text type holds a string. On the guild dashboard, it is chosen using a text field. It has a special option called RegEx. The RegEx option allows you to set a regular expression which the user's input must match up with.
Set:
The set type holds any javascript data type. On the guild dashboard, it is chosen using a dropdown list. It has a special option called Set. The Set option allows you to specify the fields in the dropdown menu. The Set option must be javascripit. It is evaluated on the Bot, with a global variable "Guild" representing the guild that the setting is in. Here are some example Sets.
[0,1,2]
- Choose 0, 1, or 2,
[{name:'Zero',value:0},{name:'One',value:1},{name:'Two',value:2}]
- Choose 0, 1, or 2. They are displayed on the dropdown as "Zero" "One" and "Two".
Guild.channels.cache.array().filter(c=>c.type=='text').map(c=>{return {name:c.name,value:c.id}})
- Choose from the channels in the current guild.
Events
Example: Log to the console
console.log('This event was called!');
Events are among the most important things in OpenBot. They define the actions that the bot takes. Every event is actually a function which gets passed several variables and has scope to an OpenBot shard. You don't need to write the function, you can treat the code block as if it is directly executed. Ie this code would log to the console every time it was executed.
Universal
All events receive certain variables, regardless of their type. Here they are:
Example: Print some information about where the command was called
Message.channel.send('Current Guild: '+Context.guild.name);
if(Context.channel) Message.channel.send('Current Channel: '+Context.channel.name);
if(Context.user) Message.channel.send('Requested by: '+Context.user.username);
Context
Type: Object
Description: The context contains discord.js objects relevent to the event.
Children: guild, channel*, user*
*May be null
Example: Print some statistics about where the command was called
Message.channel.send('Messages sent in guild: '+BotContext.Guild.Stats.Messages);
if(BotContext.User) Message.channel.send('Messages sent by user: '+BotContext.User.Stats.Messages);
BotContext
Type: Object
Description: The BotContext contains OpenBot objects relevent to the event
*May be null
Example: Print whether the current command is open source
Message.channel.send(this.Permissions.Viewable);
this
Type: Command
Description: When in an event, this
refers to the command whose event is being executed
Call
Example: A simple Say Command which says whatever the user requests.
Message.channel.send(Arguments);
The Call event is executed whenever a message matches Prefix+Callname. For example, when someone sends "-Open Help" on a server where the prefix is "-Open ", the command with the callname "Help" runs its Call event.
It receives these variables:
Message
Type: Message
Description: The message that was sent to activate the command.
Arguments
Type: String
Description: The content of the message, excluding the prefix and callname. For example, if message.content is "-Open Add SomeCommand", Arguments will be "SomeCommand"
ChannelCreate
Example: Be the first message in a channel!
Context.channel.send('First!');
The ChannelCreate event is executed when a channel is created.
It receives no special variables.
ChannelDelete
Example: Be a bad bot and recreate a channel when it's deleted
Context.guild.channels.create(Context.channel.name);
The ChannelDelete event is executed when a channel is deleted.
It receives no special variables.
ChannelPinsUpdate
Example: Send a message when someone pins or unpins a message.
Context.channel.send('Someone is messing with the pins here...');
The ChannelPinsUpdate event is executed when the pins of a channel are changed.
It receives no special variables.
ChannelUpdate
Example: Send a message when a channel's name is changed
if(OldChannel.name!=NewChannel.name)
NewChannel.send('This channel's name has been changed from '+OldChannel.name+' to '+NewChannel.name);
The ChannelUpdate event is executed when a channel is updated (eg. Name changed, Permissions changed, etc.)
It receives these variables:
OldChannel
Type: Channel
Description: The channel before the update
NewChannel
Type: Channel
Description: The channel after the update
CommandAdded
Example: Send a dm to the person who added the command thanking them. (And probably making them remove the command)
Context.user.send('Thank you for adding '+this.Languages[LibOpenBot.LanguageIndex(this,BotContext.User.Settings.Language)].Name)+' to your server');
The CommandAdded event is executed when your command is added to a server.
It recieves no special variables.
CommandRemoved
Example: Send a dm to the person who removed your command. (Like any good windows freeware when you uninstall it)
Context.user.send('We are sorry to see you stop using '+this.Languages[LibOpenBot.LanguageIndex(this,BotContext.User.Settings.Language)].Name);
The CommandRemoved event is executed when your command is removed from a server.
It receives no special variables.
CommandUpdated
Example: dm yourself when your command is approved (Because the default notification isnt enough?)
//Note: this will dm once per guild your command is in, which is spam and API abuse. Don't do this, your command will not be accepted.
LibOpenBot.ExecUser(this.Author,'User.send("Your command been approved! Good job!")');
The CommandUpdated event is executed when your edit request is approved, and your command is integrated into OpenBot. You can use it to update command data if you change formats, or anything else that needs updated. It is run once per guild that your command is in.
EmojiCreate
Example: Send the new emoji in a random channel in the guild
//Note: sending a message unprovoked in a random channel isnt a good idea. Don't do this. In fact, don't do any of these examples, they are just to show how the events work.
var Channels=Context.guild.channels.cache.array().filter(c=>c.type=='text');
Channels[parseInt(Math.random()*Channels.length)].send('I like this new emoji <:'+Emoji.name+':'+Emoji.id+>');
The EmojiCreate event is executed when an emoji is added to the guild.
It receives these variables:
Emoji
Type: Emoji
Description: The emoji that was added.
EmojiDelete
Example: Be salty about an emoji being removed from a guild
//Note: also don't do this...
var Channels=Context.guild.channels.cache.array().filter(c=>c.type=='text');
Channels[parseInt(Math.random()*Channels.length)].send('YALL REMOVED '+Emoji.name+'! I DEMAND JUSTICE FOR EMOJIS!');
The EmojiDelete event is executed when an emoji is deleted from the guild.
It receives these variables:
Emoji
Type: Emoji
Description: The emoji that was deleted
EmojiUpdate
Example: Change your command's icon to a frankenstein combination of the edited emoji (Don't do this please)
//I'm running out of ideas for these examples, ok?
this.Icon='<:'+OldEmoji.name+':'+NewEmoji.id+'>';
The EmojiUpdate event is executed when an emoji in the guild is updated (eg. Name changed, Icon changed, etc.)
It receives these variables:
OldEmoji
Type: Emoji
Description: The emoji before the update
NewEmoji
Type: Emoji
Description: The emoji after the update
GuildBanAdd
Example: Attempt to dm the banned user letting them know that they were banned (Don't do this)
Context.user.send('You have been banned from '+Context.guild.name);
The GuildBanAdd event is executed when a user is banned from the guild.
It receives no special variables.
GuildBanRemove
Example: Attempt to dm the unbanned user letting them know that they were unbanned (Don't do this)
Context.user.send('You have been unbanned from '+Context.guild.name);
The GuildBanRemove event is executed when a user is unbanned from the guild.
It receives no special variables.
GuildIntegrationsUpdate
Example: I don't even know... This only exists here because OpenBot supports every discord.js event.
console.log('Somebody did a thing');
The GuildIntegrationsUpdate event is executed when a guild's integrations are updated.
It receives no special variables.
GuildMemberAdd
Example: Greet a user when they join
Member.user.send('Welcome to '+Context.guild.name);
The GuildMemberAdd event is executed when a user joins a guild.
It receives these variables:
Member
Type: Member
Description: The member that joined
GuildMemberRemove
Example: Attempt to dm a user when they leave (Don't do this, its not ok)
Member.user.send('Sorry that you left '+Context.guild.name+'. We hope you enjoyed your time here.');
The GuildMemberRemove event is executed when a user leaves or is kicked from a guild.
It receives these variables:
Member
Type: Member
Description: The member that left
GuildMemberSpeaking
Example: Attempt to join the voice channel that they user is in when they start speaking
if(Speaking) Member.voice.channel.join();
The GuildMemberSpeaking event is executed when a user starts/stops speaking.
It receives these variables:
Member
Type: Member
Description: The member that started/stopped speaking
Speaking
Type: Boolean
Description: Whether they are speaking.
GuildMemberUpdate
Example: Pretend to forget who a user is and dm them asking. (Please don't do this, these examples are worng on many levels)
if(OldMember.displayName!=NewMember.displayName)
NewMember.user.send('I can't recognize u with ur new nickname... U used to be '+OldMember.displayName+' but now ur '+NewMember.displayName);
The GuildMemberUpdate event is executed when a member is updated (eg. Nickname changed, Roles changed, etc.)
It receives these variables:
OldMember
Type: Member
Description: The member before the update
NewMember
Type: Member
Description: The member after the update
GuildUpdate
Example: If there is a channel named #logs, log to it when the guild name is changed
var Channel=Context.guild.channels.cache.array().filter(c=>c.name=='logs'&&c.type=='text')[0];
if(Channel&&OldGuild.name!=NewGuild.name)
Channel.send('This guild has been renamed from '+OldGuild.name+' to '+NewGuild.name);
The GuildUpdate event is executed when a guild is updated (eg. Name changed, region changed, etc.)
It receives these variables:
OldGuild
Type: Guild
Description: The guild before the update
NewGuild
Type: Guild
Description: The guild after the update
Message
Example: Be a classic first bot and say "pong" when anyone says "ping"
if(Message.content=='ping')
Message.channel.send('pong!');
The Message event is executed whenever a message is sent, regardless of whether a command has been called.
It receives these variables:
Message
Type: Message
Description: The message that was sent
MessageDelete
Example: Snipe that deleted message like an annoying bot
Message.channel.send('Someone deleted '+Message.author.username+'\'s message which said "'+Message.content+'"');
The MessageDelete event is executed when a message is deleted.
It receives these variables:
Message
Type: Message
Description: The message that was deleted
MessageReactionAdd
Example: Ask if you are being summoned any time someone reacts with your command's icon
//Note: please don't do this
var IconReaction=await LibOpenBot.EmojiToReaction(this.Icon);
if(Reaction.emoji.name==IconReaction||Reaction.emoji.id==IconReaction)
Reaction.message.channel.send('Whoms\'t has summoned the ancient one?!?!?!?');
The MessageReactionAdd event is executed when a reaction is added to a message.
It receives these variables:
Reaction
Type: MessageReaction
Description: The reaction that was added
MessageReactionRemove
Example: Return to your slumber when someone removes a reaction which was your command's icon.
//Note: please don't do this
if(Reaction.emoji.name==await LibOpenBot.EmojiToReaction(this.Icon))
Reaction.message.channel.send('And so i return to my slumber...');
The MessageReactionRemove event is executed when a reaction is removed from a message
It receives these variables:
Reaction
Type: MessageReaction
Description: The reaction that was removed
MessageReactionRemoveAll
Example: Delete a message if someone removes every reaction from it at once
//What am i even doing with these examples anymore...
Message.delete();
The MessageReactionRemoveAll event is executed when all the reactions are removed from a message
It receives these variables:
Message
Type: Message
Description: The message from which the reactions were removed
MessageUpdate
Example: Thanks people for editing their message instead of making 5 messages with spelling corrections
//Once again, don't do this
NewMessage.author.send('Thank you for editing your message instead of being *that guy* who makes 5 new messages to correct their spelling');
The MessageUpdate event is executed when a message is edited
It receives these variables:
OldMessage
Type: Message
Description: The message before the edit
NewMessage
Type: Message
Description: The message after the edit
RoleCreate
Example: Be a boss and give the bot a new role when it is created
//Why do i do this...
(await Context.guild.members.fetch(ObjDiscordClient.user.id)).roles.add(Role.id);
The RoleCreate event is executed when a role is created
It receives these variables:
Role
Type: Role
Description: The role that was created
RoleDelete
Example: Be that bot that logs everything in DBL
var Channel=Context.guild.channels.cache.array().filter(c=>c.type=='text'&&c.name=='testing-1')[0];
if(Channel)
Channel.send('The role '+Role.name+' has been deleted');
The RoleDelete event is executed when a role is deleted
It receives these variables:
Role
Type: Role
Description: The role that was deleted
RoleUpdate
Example: Do absolutely nothing when a role's name is changed
if(OldRole.name!=NewRole.name) {
//Hah you thought there would be an action in every example!
}
The RoleUpdate event is executed when a role is updated (eg. Change name, Change permissions, etc.)
It receives these variables:
OldRole
Type: Role
Description: The role before the update
NewRole
Type: Role
Description: The role after the update
SettingsUpdated
Example: DN yourself the old and new settings
LibOpenBot.ExecUser(this.Author,'Message.channel.send(`Settings have been updated from '+JSON.stringify(OldSettings)+' to '+JSON.stringify(NewSettings)+'`);');
The SettingsUpdated event is executed when your command's guild settings are edited.
It received these variables:
OldSettings
Type: Object
Description: The settings object before the edit occurred
NewSettings
Type: Object
Description: The settings object after the edit occurred
VoiceStateUpdate
Example: Stalk bob in the vc.
if(NewMember.displayName.toUpperCase()=='BOB')
if(NewMember.voice.channel)
NewMember.voice.channel.join();
The VoiceStateUpdate event is executed when a user joins or leaves a voice channel, and when they move between voice channel.
It receives these variables:
OldMember
Type: Member
Description: The member before the update
NewMember
Type: Member
Description: The member after the update
Classes
ChannelSetting
Example: Print the global setting for the current channel
Message.channel.send('The current channel is '+(BotContext.Guild.Settings.Channels.filter(c=>c.id==Context.channel.id&&c.enabled==false).length?'disabled':'enabled')+' by default.');
The ChannelSetting Class stores information about the settings in a channel. It can either be related to a guild (Guild.Settings.Channels) or a command (Guild.Settings.Commands[x].Channels). It controls whether commands can be used in that Channel.
Member | Type | Description |
---|---|---|
enabled | Bool | Whether commands can be used in this channel |
id | Number | The id of the channel |
Command
Example: Print the Icon of the current command
Message.channel.send(this.Icon);
The Command Class stores information about a command, so that it can be executed by a user.
Member | Type | Description |
---|---|---|
Author | Number | The ID of the author of the command |
Certification | Number | The certification level of the command |
Events | Object | The Events of the command |
Frozen | Number | The freeze level of the command |
Icon | String | The Icon of the command |
Languages | Array(Object) | The Languages of the command |
Permissions | Object | The Permissions of the command |
Support | String | The Support link of the command |
id | Number | The ID of the command |
Command.Events
The Events member of the Command Class contains the code for whichever events are used by the command. For example, in a command which uees the Call and Message events, the Events member will have two members: Call, and Message.
Command.Languages
The Languages member of the Command Class contains the strings used by any languages that the command supports. It is an array of Objects that follow this template:
Member | Type | Description |
---|---|---|
Callname | String | The Callname of the command |
Description | String | The Description of the command |
Language | String | The language that this object defines |
Name | String | The Name of the command |
Strings | String | The Translation Strings of the command |
Syntax | String | The Syntax of the command |
Command.Permissions
The Permissions member of the Command Class has these members:
Member | Type | Description |
---|---|---|
Bot | Number | The permissions the bot must have to run the command |
CoreCommand | Bool | Whether the command is a core command |
DevsOnly | Bool | Whether the command is locked to developers |
Editable | Bool | Whether the command can be edited by others |
Private | Bool | Whether the command is private |
User | Bool | The permissions a user needs to run the command |
Viewable | Bool | Whether the command can be viewed by others |
CommandEdit
Example: Print how many verification requests there are in the queue
var Requests=await LibOpenBot.GetUnverifiedEdits();
Message.channel.send(Requests.length);
Member | Type | Description |
---|---|---|
Author | Number | The author of the edit |
Command | Command | The edited command |
Note | String | The note the author left with the edits |
Type | String | The type of edit |
id | Number | The id of the edits |
CommandEdit.Type
The Type member of the CommandEdit Class can be one of the following:
Value | Description |
---|---|
save | Edits saved in editor for editing again later, not submitted |
pr | A pull request submitted to the author of a command from someone else |
review | A pull request submitted to the verification team from the author of a command |
Emoji
Example: Print the discord emoji version of a utf character
var Emoji=(await LibOpenBot.GetEmojis()).filter(e=>e.utf==Arguments)[0];
if(Emoji)
Message.channel.send(':'+Emoji.tag+':');
The Emoji class contains information about an emoji, usefull for displaying it on a website as well as in discord.
Member | Type | Description |
---|---|---|
id | Number | The id of the emoji |
tag | String | The tag of the emoji in discord |
url | String | The url of the emoji on twemoji |
utf | String | The utf/unicode character of the emoji |
tag
To use the tag member in discord, you will have to add ":" to each side. For example, the tag might be "arrow_right_hook", so to display it you would do ":"+Emoji.tag+":", which would send ":arrow_right_hook" and be recognized by discord as an emoji.
url
To use the url member on a page or link, you will have to add the base twemoji url around it. For example, the url member might be "21aa", so you would have to do "https://twemoji.maxcdn.com/2/72.72/"+Emoji.url+".png" to use a 72x72 png. There are also other sizes, as well as svg. You can find them at twemoji's docs.
utf
To use the utf member in discord or on a page, just print it as a string.
Guild
Example: Print the number of messages OpenBot has seen in this guild
Message.channel.send(BotContext.Guild.Stats.Messages);
The Guild Class contains data relating to a guild that OpenBot is in.
Member | Type | Description |
---|---|---|
Icon | String | The URL to the icon of the guild |
Name | String | The Name of the guild |
Settings | Object | The Settings of the guild |
Stats | Object | The Stats of the guild |
id | Number | The id of the guild |
Guild.Settings
The Settings member of the Guild class contains its settings, along with the settings of the commands in it.
Member | Type | Description |
---|---|---|
Admins | Array(Number) | The IDs of the people in the guild who can manage OpenBot |
Channels | Array(ChannelSetting) | The Settings for the channels in the guild |
Commands | Array(Object) | The Commands that are in the guild |
Prefix | String | OpenBot's Prefix in this guild |
Searchable | Bool | Whether this guild can be searched on the website |
Guild.Settings.Commands
The Commands member of the Settings object contains the Commands in the guild, as well as their settings.
Member | Type | Description |
---|---|---|
Channels | Array(ChannelSetting) | Command specific settings for the channels in the guild |
Data | Object | Data that this command stores about the guild |
Settings | Object | The settings for this command. |
id | Number | The id of the command |
Guild.Stats
The Stats member of the guild object contains some stats about the guild.
Member | Type | Description |
---|---|---|
Messages | Number | The number of messages OpenBot has processed in this guild |
Owner | Number | The Discord UserID of the owner of this guild (Equivilant to guild.owner in discord.js) |
Users | Number | The number of users in this guild |
Locale
Example: Print the icon for a language code
var Locale=await LibOpenBot.GetLocales()).filter(l=>l.code==Arguments)[0];
if(Locale) Message.channel.send(Locale.icon);
else Message.channel.send('There is no language with that code');
The Locale Class represents a Language that OpenBot supports.
Member | Type | Description |
---|---|---|
code | String | The Locale Code |
icon | String | The Locale Icon |
name | String | The Language name |
Pager
Example: Get the number of pages in a pager
javascript Message.channel.send(Pager.Pages);
The Pager Class represents a message pager, which allows developers to easily make a paged message using reaction.
Member | Type | Description |
---|---|---|
Channel | Number | The ID of the channel the pager is in |
Command | Number | The ID of the Command which spawned the pager |
CurrentPage | Number | The Page that the pager is currently on (Zero indexed) |
Options | Object | The reactions used for the pager |
Pages | Number | The Number of pages in the pager |
Timeout | Number | The ID of the timeout which will delete the pager |
User | Number | The ID of the User which spawned the pager |
id | Number | The ID of the pager |
Pager.Options
The reaction used for the pager
Member | Type | Description |
---|---|---|
deleteMessage | String | The emoji tag to delete the pager message |
firstPage | String | The emoji tag to go to the first page |
lastPage | String | The emoji tag to go to the last page |
nextPage | String | The emoji tag to go to the next page |
prevPage | String | The emoji tag to go to the previous page |
PatreonData
Example: Do nothing since you don't need to use this class
//Insert cool code here
The PatreonData class represents a patreon of OpenBot
Member | Type | Description |
---|---|---|
access | String | The access token of the patreon |
expires | Number | The timestamp at which the token expires |
id | Number | The discord id of the user |
refresh | String | The refresh token of the patreon |
tier | String | The tier of a patreon |
Relay
Example: Perform some math on the express server using a relay
Message.channel.send('1+1 is '+await LibOpenBot.sendRelay('Express Server',{type:'eval',data:'1+1'}));
The Relay class represents a relay to another process
Member | Type | Description |
---|---|---|
type | String | The type of relay |
data | Object | The data in the relay |
Relay.type
There are several types of relays available:
Name | Data | Description |
---|---|---|
api | Javascript Evaluates javascript asyncrounously with scope for OpenBot API | |
async | Javascript | Evaluates javascript and returns callback |
dbUpdate | Object | Clears old data from cache |
eval | Javascript | Evaluates javascript syncronously |
restart | Null | Restarts process |
stat | Null | Fetches performance information |
Review
Example: Get the rating of a command manually
javascript var Reviews=await LibOpenBot.GetCommandReviews(this.id); var Rating=Reviews.reduce((Total,Current)=>Total+Current.Rating,0)/Reviews.length; Message.channel.send(Rating);
The Review class stores reviews for commands.
Member | Type | Description |
---|---|---|
Author | Number | The id of the user who wrote the review |
Command | Number | The id of the command that the review is for |
Rating | Number | The number of stars that the user rated the command |
Text | String | The text of the review |
id | Number | The id of the review |
Timeout
Example: Create a timeout and print its id
var Timeout=new LibOpenBot.Timeout(1000,()=>{(await LibOpenBot.users.fetch(Argument.user)).send('Hello sir')},{user:Context.user.id});
Message.channel.send('Your greeting has been created and has the id '+Timeout.id);
The Timeout class stores timeouts for commands and other services, so that they can be called even if the bot restarts.
Member | Type | Description |
---|---|---|
Argument | String | Argument to pass to the timeout upon running it (JSON Object) |
Code | String | Code to run (In the form of a function body) |
Proc | String | The name of the process which requested the timeout |
Time | Number | The time to run the timeout at |
id | Number | The id of the timeout |
User
Example: Print the user's preferred language
Message.channel.send('Your language code is '+BotContext.User.Settings.Language);
The User Class contains data relating to a user of OpenBot.
Member | Type | Description |
---|---|---|
Avatar | String | The link to the user's avatar |
Settings | Object | The user's settings |
Stats | Object | Some stats about the user |
Username | String | The user's username |
id | Number | The user's id |
User.Settings
The Settings member of the User Class contains settings relating to a user.
Member | Type | Description |
---|---|---|
DeveloperMode | Bool | Whether the user has Developer Mode enabled on the website |
Language | String | The language the user uses |
ShowGuilds | Bool | Whether the user shows their guilds on their profile |
User.Stats
The Stats member of the User Class contains some stats relating to a user
Member | Type | Description |
---|---|---|
CommandsUsed | Number | The number of commands the user has used |
Messages | Number | The number of messages the user has sent |
UserData
Example: Dm a user their private storage (Why though?)
Context.user.send(JSON.stringify((await LibOpenBot.GetUserData(Context.user.id)).Private);
The UserData Class contains data stored by commands, or about commands, relating to a user. It is kept seperate from the User class so that when a User is requested for a profile or something similar, their data is not exposed.
Member | Type | Description |
---|---|---|
Commands | Array(Object) | Data stored by commands |
Private | Object | Private storage of the user |
id | Number | The id of the user |
UserData.Commands
The Commands member of the UserData Class contains an array of all the data stored by various commands relating to that user, sorted by author.
Member | Type | Description |
---|---|---|
Author | Number | The author of the command storing the data |
Data | Object | The data being stored |
UserData.Private
The Private member of the UserData Class contains all of the Key/Value pairs that a User set on their website. These are used for putting private information in a public command (Like an API key for a music command). It has no defined members, its members are whatever the user defines them to be.
Functions
LibOpenBot.Command
Example: Create a new command for a user
//Don't do this, use the website instead
var NewCommand=LibOpenBot.Command(Context.user.id);
The LibOpenBot.Command function creates a new Command in the database
Argument | Type | Description |
---|---|---|
Author | Number | The ID of the author of the command |
Return Type: Command
LibOpenBot.DeleteCommand
Example: Delete the command being called
//Uh.... i guess if you really want to?
LibOpenBot.DeleteCommand(this.id);
The LibOpenBot.DeleteCommand function deletes a Command from the database
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the command to delete |
LibOpenBot.DeleteCommandEdit
Example: Delete all of a users saved edits
//Please dont
var Edits=await LibOpenBot.GetSavedEdits(Context.user.id);
for(var Edit of Edits) LibOpenBot.DeleteCommandEdit(Edit.id);
The LibOpenBot.DeleteCommandEdit function deletes a CommandEdit from the database
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the commandedit to delete |
LibOpenBot.DeletePager
Example: Delete the pager when a certain error happens loading a page
//Really you shuold just display the error and let them try again, not just delete it
try {
Load.something.forThePager();
} catch(e) {
LibOpenBot.DeletePager(Pager);
Message.edit('Sorry, an error occured loading this page');
}
The LibOpenBot.DeletePager function deletes a Pager from the database
Argument | Type | Description |
---|---|---|
Pager | Pager | The pager to delete |
LibOpenBot.DeleteReview
Example: If you left a review on your command, delete it
//Now TECHNICALLY u shouldnt have a review on your own command
var Reviews=await LibOpenBot.GetCommandReviews(this.id);
var MyReview=Reviews.filter(r=>r.Author==Context.user.id)[0];
if(MyReview) LibOpenBot.DeleteReview(MyReview.id);
The LibOpenBot.DeleteReview function deletes a Review from the database
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the review to delete |
LibOpenBot.DeleteTimeout
Example: Start a timeout and then cancel it
var Timeout=LibOpenBot.Timeout(1000,()=>{/*Do something*/},null);
//Several bad life choices later
LibOpenBot.DeleteTimeout(Timeout.id);
The LibOpenBot.DeleteTimeout function deletes a timeout from the database
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the timeout to delete |
LibOpenBot.EmojiToReaction
Example: React with a certain emoji without dealing with unicode
Message.react(await LibOpenBot.EmojiToReaction(':white_check_mark:'));
The LibOpenBot.EmojiToReaction function returns the unicode of built in emojis, and the id of custom emojis. This is useful for reacting to messages, and determining what emoji a reaction is using.
Argument | Type | Description |
---|---|---|
Tag | String | The Tag of the emoji |
LibOpenBot.EmojiToURL
Example: Print your command's icon as an image
Message.channel.send(await LibOpenBot.EmojiToURL(this.Icon));
The LibOpenBot.EmojiToURL function returns a url to an image of the discord emoji you pass to it (For example, you would pass ":smile:" or "<:CoolEmoji:12345>")
Argument | Type | Description |
---|---|---|
Tag | String | The Tag of the emoji |
LibOpenBot.ExecUser
Example: DM yourself when an error happens
try {
Message.channel.send(TyP0.Lol);
} catch(Error) {
LibOpenBot.ExecUser(Command.Author,'User.send(`'+Error+'`);');
}
The LibOpenBot.ExecUser function allows you to interact with a user who may not be in the same shard as your code is running in.
Argument | Type | Description |
---|---|---|
User | Number | The ID of the user you want |
Exec | String | The Code to execute |
Exec
The Exec parameter is evaluated as javascript, with the global variable User as the user you requestsed. If the user is not found, the code will not be executed.
Return Type: Whatever your javascript returns
LibOpenBot.ExecGuild
Example: Print the name of a guild by id
Message.channel.send(await LibOpenBot.ExecGuild(Arguments,'Guild.name'));
The LibOpenBot.ExecGuild function allows you to interact with a guild which may not be in the same shard as your code is running in.
Argument | Type | Description |
---|---|---|
Guild | Number | The ID of the guild you want |
Exec | String | The Code to execute |
Exec
The Exec parameter is evaluated as javascript, with the global variable Guild as the user you requestsed. If the guild is not found, the code will not be executed.
Return Type: Whatever your javascript returns
LibOpenBot.GetCommand
Example: List the events that a command has
var Command=await LibOpenBot.GetCommand(Arguments);
if(Command) {
Message.channel.send(Object.keys(Command.Events).join(', '));
}
The LibOpenBot.GetCommand function returns a Command from its ID
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the command to get |
LibOpenBot.GetCommandData
Example: Store the arguments that a user used to call the command
var Data=await LibOpenBot.GetCommandData(this,Context.user.id);
Data.Arguments=Arguments;
LibOpenBot.WriteCommandData(Data);
The LibOpenBot.GetCommandData function returns the data a command has stored about a User. (You can get Guild data directly from the BotContext.Guild Object)
Argument | Type | Description |
---|---|---|
Command | Command | The Command whose data you want to get |
User | Number | The ID of the user whose data you want to get |
LibOpenBot.GetCommandPrefix
Example: Print the message content needed to activate your command
var Prefix=LibOpenBot.GetCommandPrefix(this,BotContext.Guild)
Message.channel.send(Prefix+this.Languages[0].Callname);
The LibOpenBot.GetCommandPrefix function returns the prefi used for a command. If there is no custom prefix, it returns the guild default prefix.
Argument | Type | Description |
---|---|---|
Command | Command | The Command whose prefix you want to get |
Guild | Guild | The Guild whose prefix you want to get |
Return Type: String
LibOpenBot.GetCommandTempData
Example: Store a voice connection in temporary data
LibOpenBot.GetCommandTempData(this).VoiceConnection=await VoiceChannel.join();
The LibOpenBot.GetCommandTempData function returns an object that is cleared every time the bot restarts, but can store things that cant be converted to JSON. Since it is volitile, you do not need to use a write function, just modify the object given by the Get function.
Argument | Type | Description |
---|---|---|
Command | Command | The Command whose temp data you want to get |
Return Type: Object
LibOpenBot.GetCommandGuilds
Example: Print how many guilds your command is in
Message.channel.send((await LibOpenBot.GetCommandGuilds(this.id)).length);
The LibOpenBot.GetCommandGuilds function returns a list of guilds ids which a command is in.
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the command whose guilds you want to get |
Return Type: Promise(Array(Number))
LibOpenBot.GetCommandRating
Example: Print your command's rating
Message.channel.send(await LibOpenBot.GetCommandRating(this.id));
The LibOpenBot.GetCommandRating function returns the rating of a command.
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the command whose rating you want to get |
LibOpenBot.GetCommandReviews
Example: Print how many reviews your command has
Message.channel.send((await LibOpenBot.GetCommandReview(this.id)).length);
The LibOpenBot.GetCommandReviews function returns all the reviews for a command.
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the command whose reviews you want to get |
LibOpenBot.GetCommandSettings
Example: Send a configurable greeting
var Settings=await LibOpenBot.GetCommandSettings(this,BotContext.Guild);
Message.channel.send(Settings.Greeting);
The LibOpenBot.GetCommandSettings function returns the settings for a command.
Argument | Type | Description |
---|---|---|
Command | Command | The Command whose setting you want to get |
Guild | Guild | The Guild whose setting you want to get |
Return Type: Object
LibOpenBot.GetCommands
Example: Fetch all of the commands in the current guild
var CommandIDs=BotContext.Guild.Settings.Commands.map(c=>c.id);
var Commands=await LibOpenBot.GetCommands(CommandIDs);
The LibOpenBot.GetCommands function returns an array of Commands from an array of IDs.
Argument | Type | Description |
---|---|---|
IDs | Array(Number) | The IDs of the commands to get |
Return Type: Promise(Array(Command))
LibOpenBot.GetDevs
Example: Test if the user is a dev
if((await LibOpenBot.GetDevs()).filter(d=>d==Context.user.id).length) {
Message.channel.send('You\'re a dev!');
} else {
Message.channel.send('You\'re a normal person!');
}
The LibOpenBot.GetDevs function returns the IDs of all of the Users with Developer Permissions
Return Type: Promise(Array(Number))
LibOpenBot.GetEdit
Example: Print the note for a edit id provided by user
javascript Message.channel.send((await LibOpenBot.GetEdit(Arguments)).Note);
The LibOpenBot.GetEdit function returns a CommandEdit from its id
Argument | Type | Description |
---|---|---|
ID | Number | The id of the CommandEdit to get |
Return Type: Promise(CommandEdit)
LibOpenBot.GetEmojis
Example: Brag on how many emojis OpenBot supports
var Emojis=await LibOpenBot.GetEmojis();
Message.channel.send(Emojis.lenth);
The LibOpenBot.GetEmojis function returns all of the Emojis indexed by OpenBot
Return Type: Promise(Array(Emoji))
LibOpenBot.GetFlakeStamp
Example: Sort two commands by their creation date
Commands.sort((c1,c2)=>LibOpenBot.GetFlakeStamp(c1)-LibOpenBot.GetFlakeStamp(c2));
The LibOpenBot.GetFlakeStamp function returns the timestamp of a snowflake
Argument | Type | Description |
---|---|---|
Flake | String | The snowflake to get the timestamp of |
Return Type: String
LibOpenBot.GetGuildData
Example: Store the name of a guild in its data
//Because you definately can't just access the name directly later...
var Data=await LibOpenBot.GetGuildData(this,BotContext.Guild)
Data.Name=BotContext.Guild.Name
LibOpenBot.WriteGuild(BotContext.Guild)
The LibOpenBot.GetGuildData function returns your command's stored data on a guild. If there is none, it returns a blank object which you can edit. To write the guild data simply write the guild which you passed to the function (the function returns a reference).
Argument | Type | Description |
---|---|---|
Command | Command | The Command whos data you want to access. |
Guild | Guild | The Guild whos data you want to access. |
LibOpenBot.GetHoistedUsers
Example: Output whether the current user is hoisted on the web search
var Hoisted=await LibOpenBot.GetHoistedUsers();
if(Hoisted.filter(u=>u==Context.user.id).length) {
Message.channel.send('You are hoisted!');
} else {
Message.channel.send('You are a normal boi.');
}
The LibOpenBot.GetHoistedUsers function returns a list of all users with a role or status which hoists them in the user search.
Return Type: Promise(Array(Number))
LibOpenBot.GetIncomingEdits
Example: Print the number of incoming edits a user has
var Edits=await LibOpenBot.GetIncomingEdits(Context.user.id);
Message.channel.send(Edits.length);
The LibOpenBot.GetIncomingEdits function reutrns a list of all the incoming pull requests a user has
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the User whose incoming edits you want to get. |
Return Type: Promise(Array(CommandEdit))
LibOpenBot.GetLocales
Example: Print the user's language in their own language
var Locales=await LibOpenBot.GetLocales();
var Locale=Locales.filter(l=>l.code==BotContext.User.Settings.Language)[0];
if(Locale) {
Message.channel.send(Locale.name);
}
The LibOpenBot.GetLocales function returns all of the Locales supported by OpenBot
Return Type: Promise(Array(Locale))
LibOpenBot.GetOutgoingEdits
Example: Print the number of outgoing edits a user has
var Edits=await LibOpenBot.GetOutgoingEdits(Context.user.id);
Message.channel.send(Edits.length);
The LibOpenBot.GetOutgoingEdits function returns a list of all the outgoing pull request and verification requests a user has
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the User whose outgoing edits you want to get. |
Return Type: Promise(Array(CommandEdit))
LibOpenBot.GetPager
Example: Check if a user has a pager on the message they reacted to
//You won't need to do this manually, it is handled automatically by the Page event
var Pager=await LibOpenBot.GetPager(BotContext.User.id,Reaction.message.id);
if(Pager) {
Reaction.message.channel.send('You have reacted to a pager with '+Pager.Pages+' pages!');
}
The LibOpenBot.GetPager function returns a pager (if it exists) that a user owns on a message.
Argument | Type | Description |
---|---|---|
User | Number | The id of the user |
Message | Number | The id of the message |
LibOpenBot.GetPatreon
Example: Print a user's patreon tier
//Note: this might provide out of date data. To ensure up to date data, you need to use LibOpenBot.UpdatePatreonTier
var Patreon=await LibOpenBot.GetPatreon(Context.user.id);
Message.channel.send(Patreon.tier);
The LibOpenBot.GetPatreon function returns the patreon data for a user in OpenBot
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the User whose patreon data you want to get |
Return Type: Promise(PatreonData)
LibOpenBot.GetPatreons
Example: Brag on how many patreon's OpenBot has
var Patreons=await LibOpenBot.GetPatreons();
Message.channel.send(Patreons.length);
The LibOpenBot.GetPatreons function returns all of the patreons of OpenBot
Return Type: Promise(Array(PatreonData))
LibOpenBot.GetPrivateStorage
Example: Retrieve an api key from your private storage
var APIKey=await LibOpenBot.GetPrivateStorage(this.Author,'YoutubeAPI');
The LibOpenBot.GetPrivateStorage function returns all or some of your private storage. Your private storage can be configured in your user settings on the OpenBot website.
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the User whose private storage you want to get. |
Key | String | The Key of the private storage you want to get |
Key
If Key is null, then it will return all of the private storage. If key is a string, it will return the private storage entry that has that Key as its Name.
Return Type: Promise(Object/String)
LibOpenBot.GetSavedEdits
Example: Print the number of saved edits a user has
var Edits=await LibOpenBot.GetSavedEdits(Context.user.id);
Message.channel.send(Edits.length);
The LibOpenBot.GetSavedEdits function returns all of the CommandEdits that a user has stashed
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the User whose saved edits you want to get. |
Return Type: Promise(Array(CommandEdit))
LibOpenBot.GetTimeouts
Example: Print the number of timeouts in the active shard
var Timeouts=await LibOpenBot.GetTimeouts();
Message.channel.send(Timeouts.length);
The LibOpenBot.GetTimeouts function returns all Timeouts for the current process.
LibOpenBot.GetUnverifiedEdits
Example: Print the number of verification requests
var Edits=await LibOpenBot.GetUnverifiedEdits();
Message.channel.send(Edits.length);
The LibOpenBot.GetUnverifiedEdits function returns all of the incoming verification requests
Return Type: Promise(Array(CommandEdit))
LibOpenBot.GetUser
Example: Print the number of messages that a user has sent
var User=await LibOpenBot.GetUser(Arguments);
if(User) {
Message.channel.send(User.Stats.Messages);
}
The LibOpenBot.GetUser function returns a User from an ID
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the User to get |
LibOpenBot.GetUserClass
Example: Print whether the current user is a founder
if(await LibOpenBot.GetUserClass(BotContext.User)==0) {
Message.channel.send('You are a founder');
} else {
Message.channel.send('You are not a founder');
}
The LibOpenBot.UserClass function returns a user's class.
Argument | Type | Description |
---|---|---|
User | User | The user whose class you want |
The function returns the highest class the user has. For example, if a user is an Admin and a Dev, it will return Admin.
Return Value | Class |
---|---|
0 | Founder |
1 | Admin |
2 | Mod |
3 | Dev |
4 | Translator |
5 | Patreon |
6 | Voter |
7 | None |
LibOpenBot.GetUserCommands
Example: Print how many commands a user has created
var Commands=await LibOpenBot.GetUserCommands(Context.user.id);
Message.channel.send(Commands.length);
The LibOpenBot.GetUserCommands function returns all of the Commands that a User has made
Argument | Type | Description |
---|---|---|
UserID | Number | The ID of the User whose Commands you want to get |
Return Type: Promise(Array(Command))
LibOpenBot.GetUserData
Example: Dm a user their private storage (Why though?)
Context.user.send(JSON.stringify((await LibOpenBot.GetUserData(Context.user.id)).Private);
The LibOpenBot.GetUserData function returns the User Data of a user (Including Private Storage and Command Data).
Argument | Type | Description |
---|---|---|
ID | Number | The ID of the User whose data you want to get |
Return Type: Promise(Array(Command))
LibOpenBot.GetVerifiers
Example: List the OpenBot verifiers
var VerifierIDs=await LibOpenBot.GetVerifiers();
var Verifiers=[];
for(var ID of VerifierIDs)
Verifiers.push(await LibOpenBot.GetUser(ID));
Message.channel.send(Verifiers.map(v=>v.Username).join(', '));
The LibOpenBot.GetVerifiers function returns the IDs of all of the Users who have Verifier Permissions
Return Type: Promise(Array(Number))
LibOpenBot.GetWebLocales
Example: Tell a user if their language is supported on the website
var Locales=await LibOpenBot.GetWebLocales();
if(Locales.filter(l=>l==BotContext.User.Settings.Language).length)
Message.channel.send('Your language is supported');
else
Message.channel.send('Your language is not supported');
The LibOpenBot.GetWebLocales function returns all of the locale codes supported on OpenBot's Website
Return Type: Promise(Array(String))
LibOpenBot.Guild
Example: Create a new guild in the database if the current one is invalid
//Honestly this would never happen, this is just an example
if((!BotContext.Guild)&&Context.guild)
var Guild=new LibOpenBot.Guild(Context.guild);
The LibOpenBot.Guild function creates a new guild in the database
Argument | Type | Description |
---|---|---|
DiscordGuild | guild | A discord.js guild |
Return Type: Guild
LibOpenBot.HasPermissions
Example: Check if the bot has admin permissions in the current server
var Member=await Context.guild.members.fetch(ObjDiscordClient.user.id);
if(Member) {
if(LibOpenBot.HasPermissions(Member.permissions.bitfield,8))
Message.channel.send('I am an admin');
else
Message.channel.send('I am not an admin');
}
The LibOpenBot.HasPermissions function compares two permissions bitfields to see whether they include eachother. It returns true if the user/entity has the permissions that it needs.
Argument | Type | Description |
---|---|---|
Has | Number | The Permissions that the user/entity has |
Needs | Number | The Permissions that the user/entity needs |
Return Type: Bool
LibOpenBot.LanguageIndex
Example: Get the strings of your command in the user's language
var Strings=this.Languages[LibOpenBot.LanguageIndex(this,BotContext.User.Settings.Language)].Strings;
Message.channel.send(Strings[0]);
The LibOpenBot.LanguageIndex function returns the index in which a language is found in a command.
Argument | Type | Description |
---|---|---|
Command | Command | The command to search |
Language | String | The language to find |
Return type: Number
LibOpenBot.Pager
Example: Create a pager with 3 pages and all possible buttons
javascript var Buttons={firstPage:':track_previous:', prevPage:':arrow_backward:', nextPage:':arrow_forward:', lastPage:':track_next:', deleteMessage:':wastebasket:'}; var Pager=new LibOpenBot.Pager(this,Context.user,Context.channel,5,0,Buttons);
The LibOpenBot.Pager function creates a new pager. When a pager is created, the Page event will be called on whichever page you specify in the constructor. The Page event will also be called whenever a user reacts with one of the Buttons you provided with the corresponding page.
Argument | Type | Description |
---|---|---|
Command | Command | The Command which created the pager |
User | user | The user who triggered the pager |
Channel | channel | The channel the pager is in |
Pages | Number | The number of pages in the pager |
DisplayPage | Number | The page to display initially (zero-indexed) |
Options | Object | The buttons to show on the pager |
Return Type: Pager
Options
The Options argument defines which emojis are used for the pager buttons. Passing null/undefined for a button disables that button. Emoji format is :emoji:
or <:emoji:id>
. Emojis will show from left to right in the order defined.
Here is a simple example:
{nextPage:':abc:',prevPage:':def:'}
will show the nextPage button to the left of the prevPage bbutton, while {prevPage:':def:',nextPage:':abc:'}
will show the nextPage button to the right of the prevPage button.
Member | Type | Description |
---|---|---|
firstPage | String | The emoji to use to go to the first page |
prevPage | String | The emoji to use to go to the previous page |
nextPage | String | The emoji to use to go to the next page |
lastPage | String | The emoji to use to go to the last page |
deleteMessage | String | The emoji to use to delete the pager message |
LibOpenBot.RegSearch
Example: Search for commands from user input
var Commands=await LibOpenBot.SearchCommands(Command=>Command.match(LibOpenBot.RegSearch(Arguments)));
Message.channel.send(Commands.length+' commands found');
The LibOpenBot.RegSearch function turns a search query into a valid reqular expression. This would be used when using String.match in the ReQL language to search for part of a string instead of a whole string (.eq) or regular expression (.match without using LibOpenBot.RegSearch).
Argument | Type | Description |
---|---|---|
Query | String | The Query to search for |
Return Type: String
LibOpenBot.Review
Example: Leave a review on your own command
//Don't do this, you will get denied
var Review=new LibOpenBot.Review(this.id,Context.user.id,5,'Best command ever');
The LibOpenBot.Review function creates a new review for a command.
Argument | Type | Description |
---|---|---|
Command | Number | The id of the command to create a review for |
Author | Number | The id of the user who wrote the review |
Rating | Number | The number of stars to rate the command |
Text | String | The text to leave as a review |
Return Type: Review
LibOpenBot.SearchCommands
Example: Search for commands from user input
var Commands=await LibOpenBot.SearchCommands(Command=>Command.match(LibOpenBot.RegSearch(Arguments)));
Message.channel.send(Commands.length+' commands found');
The LibOpenBot.SearchCommands function searches in the database for commands that match the search.
Argument | Type | Description |
---|---|---|
Search | Object or Function | The Search Criteria. |
Search
OpenBot supports using an Object {Icon:":DopeIcon:"}
or an Anonymous Function (Command)=>Command('Icon').eq(':DopeIcon:')
. You can learn how these parameters work here.
Return Type: Promise(Array(Command))
LibOpenBot.SearchGuilds
Example: Search for guilds from user input
var Guilds=await LibOpenBot.SearchGuilds(Guild=>Guild.match(LibOpenBot.RegSearch(Arguments)));
Message.channel.send(Guilds.length+' guilds found');
The LibOpenBot.SearchGuilds function searches in the database for guilds that match the search.
Argument | Type | Description |
---|---|---|
Search | Object or Function | The Search Criteria |
Search
OpenBot supports using an Object {Icon:":DopeIcon:"}
or an Anonymous Function (Command)=>Command('Icon').eq(':DopeIcon:')
. You can learn how these parameters work here.
Return Type: Promise(Array(Guild))
LibOpenBot.SearchUsers
Example: Search for users from user input
var Users=await LibOpenBot.SearchUsers(User=>User.match(LibOpenBot.RegSearch(Arguments)));
Message.channel.send(Users.length+' users found');
The LibOpenBot.SearchUsers function searches in the dtabase for users that match the search.
Argument | Type | Description |
---|---|---|
Search | Object or Function | The Search Criteria |
Search
OpenBot supports using an Object {Icon:":DopeIcon:"}
or an Anonymous Function (Command)=>Command('Icon').eq(':DopeIcon:')
. You can learn how these parameters work here.
Return Type: Promise(Array(User))
LibOpenBot.Timeout
Example: Respond after 10 seconds
var Timeout=new LibOpenBot.Timeout(10000,()=>{
ObjDiscordClient.channels.cache.array().filter(c=>c.id==Argument.channel)[0].send('Super lag')
},{channel:Message.channel.id});
The LibOpenBot.Timeout function creates a new timeout. (Must be called with "new" keyword, ie new LibOpenBot.Timeout(x,y,z)
)
The function provided, if it contains arguments, will always rename the arguments to Argument, so make sure your code accesses Argument under the variable name Argument. For example, the function (Number)=>{return Number+1}
will be executed as (Argument)=>{return Number+1}
, so make sure you name your argument "Argument"
The argument provided must not contain circular references. (So no discord.js objects, etc.). It must be possible to convert the argument to JSON.
Argument | Type | Description |
---|---|---|
Time | Number | The time (in milliseconds) until the code should be run |
Func | Function | The function to run |
Argument | Object | An argument to pass to the function |
Return Type: Timeout
LibOpenBot.UpdatePatreonTier
Example: Update a patreon's tier before using it
var Patreon=await LibOpenBot.GetPatreon(Context.user.id);
//Method 1: Update in place and then print
await LibOpenBot.UpdatePatreonTier(Patreon);
Message.channel.send(Patreon.tier);
//Method 2: Print immediately
Message.channel.send(await LibOpenBot.UpdatePatreonTier(Patreon));
The LibOpenBot.UpdatePatreonTier fetches a patreon's tier from the Patreon API to ensure it is correct, returns it, and updates the db. You should run this before doing mission critical things with a patreon's data.
Argument | Type | Description |
---|---|---|
PatreonData | PatreonData | The PatreonData that you want to update the tier of |
Return Type: String
LibOpenBot.User
Example: Create a user if they are missing
//This would never happen
if(Context.user&&!BotContext.User)
BotContext.User=new LibOpenBot.User(Context.user);
The LibOpenBot.User function creates a new user in the database.
Argument | Type | Description |
---|---|---|
DiscordUser | user | A discord.js user |
Return Type: User
LibOpenBot.UserData
Example: Do i really need to make examples for stuff you don't need to use?
var Data=await LibOpenBot.GetUserData(Context.user.id);
if(!Data) {
//Note: this would never get run, since LibOpenBot.GetUserData creates data if it doesnt exist
Data=new LibOpenBot.UserData(Context.user.id);
}
The LibOpenBot.UserData function creates a new UserData entry in the database
Argument | Type | Description |
---|---|---|
User | Number | The id of the user whose data this is |
Return Type: UserData
LibOpenBot.WriteCommand
Example: Bypass verification to edit your command's icon
//Note: don't do this, your command will get denied
this.Icon=':smile:';
LibOpenBot.WriteCommand(this);
The LibOpenBot.WriteCommand function writes a command to the database, saving any changes that may have been made.
Argument | Type | Descrpition |
---|---|---|
Command | Command | The Command to save |
LibOpenBot.WriteCommandData
Example: Save a note on a user for later
var Data=await LibOpenBot.GetCommandData(this,Context.user.id);
Data.note=Arguments;
LibOpenBot.WriteCommandData(this,Context.user.id,Data);
The LibOpenBot.WriteCommandData function writes a CommandData object to the database
Argument | Type | Description |
---|---|---|
Command | Command | The Command that the data belongs to |
User | Number | The ID of the user that the data is about |
Data | Object | The Data to write |
LibOpenBot.WriteCommandEdit
Example: Reset the note for a CommandEdit
//Why though?
var Edit=await LibOpenBot.GetCommandEdit(Arguments);
Edit.Note='';
LibOpenBot.WriteCommandEdit(Edit);
The LibOpenBot.WriteCommandEdit function writes a commandedit to the database, saving any changes that may have been made.
Argument | Type | Descrpition |
---|---|---|
CommandEdit | CommandEdit | The CommandEdit to save |
LibOpenBot.WriteGuild
Example: Add yourself as an admin to a guild
//Note: obviously, don't do this
BotContext.Guild.Settings.Admins.push(this.Author);
LibOpenBot.WriteGuild(BotContext.Guild);
The LibOpenBot.WriteGuild function writes a guild to the database, saving any changes that may have been made.
Argument | Type | Description |
---|---|---|
Guild | Guild | The Guild to save |
LibOpenBot.WritePager
Example: Add an extra page to a pager from the page event
//Note: Pager is the pager passed in pager event, hence why i am not using GetPager
Pager.Pages++;
LibOpenBot.WritePager(Pager);
The LibOpenBot.WritePager function writes a pager to the database, saving any changes that may have been made.
Argument | Type | Description |
---|---|---|
Pager | Pager | The Pager to save |
LibOpenBot.WritePrivateStorage
Example: Add a key to your private storage
var Storage=await LibOpenBot.GetPrivateStorage(this.Author);
Storage['Top Secret']='Grandma\'s cookie recipe';
LibOpenBot.WritePrivateStorage(this.Author,Storage);
The LibOpenBot.WritePrivateStorage function writes a PrivateStorage object to the database, saving any changes that may have been made.
Argument | Type | Description |
---|---|---|
ID | Number | The User ID that the storage belongs to |
Value | Object | The value of the private storage |
LibOpenBot.WriteReview
Example: Make a review, then change its rating
var Review=new LibOpenBot.Review(this.id,Context.user.id,1,'Bad command');
Review.Rating=5;
Review.Text='Good command';
LibOpenBot.WriteReview(Review);
The LibOpenBot.WriteReview function writes a Review object to the database
Argument | Type | Description |
---|---|---|
Review | Review | The review to write |
LibOpenBot.WriteTimeout
Example: Change the argument of a timeout after you create it
var Timeout=new LibOpenBot.Timeout(1000,()=>console.log(Argument.log));
Timeout.Argument={log:'Hello world!'};
LibOpenBot.WriteTimeout(Timeout);
The LibOpenBot.WriteTimeout function writes a timeout to the database, saving any changes that may have been made.
Argument | Type | Description |
---|---|---|
Timeout | Timeout | The Timeout to save |
LibOpenBot.WriteUser
Example: Reset your message count to 0
//But why?
BotContext.User.Stats.Messages=0;
LibOpenBot.WriteUser(BotContext.User);
The LibOpenBot.WriteUser function writes a user to the database, saving any changes that may have been made.
Argument | Type | Description |
---|---|---|
User | User | The User to save |
LibOpenBot.WriteUserData
Example: Clear a user's command data, and break all of the commands
var Data=await LibOpenBot.GetUserData(Context.user.id);
Data.Commands=[];
LibOpenBot.WriteUserData(Data);
The LibOpenBot.WriteUserData function writes a UserData object to the database, saving any changes that may have been made
Argument | Type | Description |
---|---|---|
UserData | UserData | The UserData to save |
LibOpenBot.sendRelay
Example: Do math on the master process instead of on the shard cuz why not
var OnePlusOne=await LibOpenBot.sendRelay('Master',{type:'script',data:'return 1+1'});
Message.channel.send(OnePlusOne);
The LibOpenBot.sendRelay function sends a message to another process, and retrieves the result.
Argument | Type | Description |
---|---|---|
Proc | String | The Name of the process to send a relay to |
Data | Relay | The Relay to send |
LibOpenBot.sendRelayShards
Example: Make sure that math works right on all the shards
var Results=await LibOpenBot.sendRelayShards({type:'script',data:'return 1+1'});
var Correct=1+1;
var Broken=false;
for(var Result of Results)
if(Result!=Correct)
Broken=true;
if(Broken)
Message.channel.send('Math is broken somewhere!');
else
Message.channel.send('Math is working fine everywhere');
The LibOpenBot.sendRelayShards function sends a message to all of the shards and retrieves the result.
Argument | Type | Description |
---|---|---|
Data | Relay | The Relay to send |
Return Type: Promise(Array(Object))
LibOpenBot.sendRelayAll
Example: Make sure that math works right on all the processes
var Results=await LibOpenBot.sendRelayAll({type:'script',data:'return 1+1'},true);
var Correct=1+1;
var Broken=false;
for(var Result of Results)
if(Result!=Correct)
Broken=true;
if(Broken)
Message.channel.send('Math is broken somewhere!');
else
Message.channel.send('Math is working fine everywhere');
The LibOpenBot.sendRelayAll function sends a message to all of the processes and retrieves the result
Argument | Type | Description |
---|---|---|
Data | Relay | The Relay to send |
Master | Bool | Whether to send it to the master process |
Return Type: Promise(Array(Object))
ReportCommandCrash
Example: Use the built in crash reporting when catching a promise
Message.channel.send('Test').catch(reason=>{
//You could put whatever you want for the event, if you want a more specific indicator of where things went wrong
//Also you could put whatever you want for Arguments to get a more specific indicator of how things went wrong
ReportCommandCrash(this,'Call',reason,Context,BotContext,Message,Arguments);
});
The ReportCommandCrash function reports a command crash to the command's author. You can pass as many or as few arguments as you like. They will be included in a .json file attached to the crash report.
Argument | Type | Description |
---|---|---|
Command | Command | The command which crashed |
Event | String | The event which crashed |
Error | String | The error which occurred |
Arguments | Object... | The arguments passed to the event which crashed. |
RunEvent
Example: Execute a custom event
var Result=await RunEvent(this,'MyEvent',Context,BotContext,'Super good argument');
The RunEvent function runs an event of a command.
Argument | Type | Description |
---|---|---|
Command | Command | The Command to run |
Event | String | The Event to run |
Context | Object | The Context object to pass the event |
BotContext | Object | The BotContext object to pass the event |
Arg1 | Anything | The First argument to pass to the event |
Arg2 | Anything | The Second argument to pass to the event |
Globals
There are some global variables that commands can access in order to do things.
ObjDiscordClient
ObjDiscordClient is the discord.js client.
Type: Client
Libraries
OpenBot provides access to multiple libraries that you can use in your command. If you need a library that is not on this list, you can contact the developers at the OpenBot Support discord server and they will consider adding it.
You do not need to use the require function in order to include libraries. All libraries are included when OpenBot loads, and are available through the constants below.
LibDiscord
LibDiscord references a fork of the discord.js
npm package. (The changes in the fork are not relavant to commands, they are for sharding purposes)
NPM Page: discord.js
Docs: discord.js.org
Version: 12.0
LibHTTPS
LibHTTPS references the https
npm package. It is used for making http requests.
NPM Page: https
Version: 1.0.0
LibOpenBot
LibOpenBot references the OpenBot API. It is used for interacting with OpenBot's database.
Docs: docs.openbot.ga
Version: 2.7.1
LibJuration
LibJuration references the juration
npm package. It is used for converting seconds to a human readable time format.
NPM Page: juration
Version: 0.1.1
LibSnekfetch
LibSnekfetch references the snekfetch
npm package. It is used for making http requests.
NPM Page: snekfetch
Version: 4.0.4
LibYTDL
LibYTDL references the ytdl-core
npm package. It is used for streaming youtube songs into a voice channel.
NPM Page: ytdl-core
Version: 4.1.4
LibYTPlaylist
LibYTPlaylist references the youtube-playlist
npm package. It is used for getting the songs in a youtube playlist.
NPM Page: youtube-playlist
Version: 1.0.4
LibYTSearch
LibYTSearch references the yt-search
npm package. It is used for searching for videos on youtube.
NPM Page: yt-search
Version: 2.5.1
Legal
Here is the legal information on what OpenBot collects and what you are allowed to do with your commands.
Privacy Policy
What we store:
Usernames and Avatars:
Collection: Discord API
Stored for: All users
Deletion: Deleted after 90 days of inactivity
Purpose: Displaying information on your profile and when people view your commands.
Guild Names, Icons, and Member Counts:
Collection: Discord API
Stored for: All guilds
Deletion: Deleted upon bot leaving a guild
Purpose: Displaying information for guild settings, guild information, and search.
Message Counts:
Collection: OpenBot Core
Stored for: Guilds and Users
Deletion: Deleted upon parent resource (Guild or User) being deleted
Purpose: Sorting by activity in search, and displaying on guild/user profiles
Other Data:
Some commands may store additional data. The data that they store will follow the guidelines below in the terms of service. If a command stores data on a guild, it is deleted upon the bot leaving the guild or the command being removed from the guild.
Why we store:
All the data stored by OpenBot is used solely for improving the website and bot experience. No data is sold or given away to third parties. The only people who have access to the data above are the core developers of OpenBot, and Command Developers. Command Developers are bound by the terms of service below when using the data, and their usage is reviewed by the core developers when they create their commands.
Contacting us
You can contact us with any questions or concerns at our support server
Terms of Service
By creating a command, you agree to follow all of the terms below. These terms are subject to change as needed by the OpenBot Core Developers.
Discord API Terms of Service
You must follow all terms of service set by discord here in relation to using discord's api (through discord.js or other libraries) and using data acquired from discord.
Using OpenBot's API and Data
All data collection must be directly related to the purpose of your command. For example, a music command can monitor voice channels for activity to improve its service, but it should not monitor users joining and leaving the server.
No data collected from OpenBot's API may be sent to a third party without first notifying and receiving express consent from the user who it belongs to.
d14a6649860f98c9fdb9564bb393da8a694776fc