├── commands ├── Automation │ ├── Awaited │ │ ├── refreshmembercache.js │ │ ├── pre-release-modedecider.js │ │ ├── deletealluserapps.js │ │ ├── levelingresets.js │ │ ├── autolist-types.js │ │ ├── messageditlog-modes.js │ │ ├── leavemessages.js │ │ ├── welcomermessages.js │ │ └── game-timeouts.js │ ├── Others │ │ ├── Systems │ │ │ ├── resetonleavetrigger.js │ │ │ ├── levelup.js │ │ │ └── userappsupport.js │ │ └── Bot specific │ │ │ ├── auto respond.js │ │ │ └── startup-messages.js │ ├── Events │ │ ├── error-logs.js │ │ ├── integration-logs.js │ │ ├── member-logs.js │ │ ├── message-logs.js │ │ ├── Bot Invitation Message.js │ │ └── moderation-logs.js │ └── Interactions │ │ ├── Buttons │ │ ├── shutdown-prompts.js │ │ ├── coinflip-interactions.js │ │ ├── rps-oneplayer-interactions.js │ │ ├── wyr-interactions.js │ │ ├── findtheflag-interactions.js │ │ ├── userinfo-interactions.js │ │ ├── credits-interactions.js │ │ ├── version-interactions.js │ │ └── viewbuttons.js │ │ └── Buttons & SelectMenus │ │ ├── helpmenu.js │ │ └── settingsmenu-interactions.js ├── Slash │ ├── owoify.js │ ├── reverse.js │ ├── randomcolor.js │ ├── ping.js │ ├── invite.js │ ├── 8ball.js │ ├── report.js │ ├── avatar.js │ ├── about.js │ └── banner.js ├── Developer │ ├── eval.js │ ├── exec.js │ ├── jseval.js │ ├── serverlist.js │ ├── readfile.js │ ├── refreshmembercache.js │ ├── deleteuserapps.js │ ├── refreshuserapps.js │ ├── update.js │ ├── shutdown.js │ ├── setcustomstatus.js │ └── dev-panel.js ├── Entertainment │ ├── text │ │ ├── owoify.js │ │ ├── randomtopic.js │ │ ├── yesorno.js │ │ ├── whoasked.js │ │ ├── fact.js │ │ ├── howgamer.js │ │ ├── 8ball.js │ │ ├── clap.js │ │ ├── mock.js │ │ ├── reverse.js │ │ ├── lulcat.js │ │ ├── joke.js │ │ └── say.js │ ├── games │ │ ├── coinflip.js │ │ ├── ftf.js │ │ ├── wordle.js │ │ ├── 2048.js │ │ ├── minesweeper.js │ │ ├── snake.js │ │ ├── matchpairs.js │ │ ├── findemoji.js │ │ ├── c4.js │ │ ├── wyr.js │ │ ├── ttt.js │ │ ├── flood.js │ │ ├── trivia.js │ │ ├── hangman.js │ │ ├── gtp.js │ │ └── rps.js │ └── images │ │ ├── whereiseveryone.js │ │ ├── ad.js │ │ ├── invert.js │ │ ├── drip.js │ │ ├── gun.js │ │ ├── jail.js │ │ ├── pet.js │ │ ├── nokia.js │ │ ├── wanted.js │ │ ├── clown.js │ │ ├── couldread.js │ │ └── comment.js ├── Main │ ├── ping.js │ ├── invite.js │ ├── report.js │ ├── about.js │ ├── help.js │ ├── credits.js │ ├── settings.js │ ├── perms.js │ ├── canary.js │ ├── stats.js │ ├── commandinfo.js │ └── version.js ├── Misc │ ├── morse.js │ ├── avatar.js │ ├── randomcolor.js │ ├── banner.js │ └── periodic-table.js ├── Util │ ├── setup-logs.js │ ├── leave.js │ ├── welcomer.js │ ├── prefix-commands.js │ ├── suggestion-commands.js │ └── poll-commands.js ├── Leveling │ ├── rank.js │ ├── leveling-system.js │ └── lb.js └── Info │ ├── userinfo.js │ └── serverinfo.js ├── config.js ├── .gitignore ├── .github └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── package.json ├── handlers ├── variables.js └── functions.js ├── index.js ├── README.md └── LICENSE /commands/Automation/Awaited/refreshmembercache.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "refreshmembercache", 3 | type: "awaited", 4 | code: `$cacheMembers[$guildID;false]` 5 | } 6 | -------------------------------------------------------------------------------- /commands/Automation/Others/Systems/resetonleavetrigger.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "(Leveling) Reset on Leave trigger", 3 | type: "leave", 4 | channel: "$randomChannelID[$guildID;all]", 5 | code: `$ifAwaited[$getGuildVar[levelleaveonreset]==on;{execute:resetonleave}] 6 | $onlyIf[$getGuildVar[levelsystem]==on;] 7 | $onlyIf[$guildID==$guildID;]` 8 | } 9 | -------------------------------------------------------------------------------- /commands/Slash/owoify.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "owoify", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Makes text OWOifed.", 7 | }, 8 | code: `$interactionReply[$owoify[$slashOption[text]];users;true] 9 | 10 | $onlyIf[$getVar[userapps]==true;User apps are currently unavailable. 11 | {ephemeral} 12 | {interaction} 13 | ] 14 | ` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Slash/reverse.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "reverse", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Let's you reverse text!." 7 | }, 8 | code: `$interactionReply[$nonEscape[$reverse[$slashOption[text]]];users;true] 9 | 10 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 11 | {ephemeral} 12 | {interaction} 13 | ] 14 | ` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Automation/Others/Bot specific/auto respond.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "$alwaysExecute", 3 | code: `Hello! My Prefix in this server is \`$getGuildVar[prefix]\`. 4 | $cooldown[2s;] 5 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;viewchannel;sendmessages]==true;] 6 | $onlyIf[$stringStartsWith[$message;<@$clientID>;<@!$clientID>]==true;] 7 | $onlyIf[$getGuildVar[autopingreply]==on;] 8 | ` 9 | } 10 | -------------------------------------------------------------------------------- /commands/Developer/eval.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "eval", 3 | info: { 4 | description: "Executes codes for testing (in aoi.js only).", 5 | usage: "`eval `", 6 | perms: ["`SendMessages`"], 7 | dev: "true" 8 | }, 9 | aliases: "e", 10 | code: ` 11 | $eval[$message] 12 | $onlyIf[$message!=;You need to provide a code.] 13 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 14 | ` 15 | } 16 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | prefix: "d!", 3 | BotToken: "", 4 | MobileStatus: false, 5 | Embedcolor: "#2A3759", 6 | DBsecurityKey: "a-32-characters-long-string-here", 7 | EnableUserApps: false, 8 | DisableAllErrors: false, 9 | EnableDebugMode: false, 10 | LogCommands: false, 11 | respondOnEdit: { 12 | Enabled: false, 13 | RespondUntil: 20000 14 | }, 15 | } 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /commands/Slash/randomcolor.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "randomcolor", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Returns a random color that you can use." 7 | }, 8 | code: `$interactionReply[{newEmbed:{title:Random Color}{field:**Hex Code**:#$randomColor}{color:#$randomColor}};all;true] 9 | 10 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 11 | {ephemeral} 12 | {interaction} 13 | ] 14 | ` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Entertainment/text/owoify.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "owoify", 3 | info: { 4 | description: "Makes text OWOifed.", 5 | usage: "`owoify `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | code: `$owoify[$message] 9 | $onlyIf[$message!=;Please provide a text.] 10 | $cooldown[3s; Slow down! Don't spam the command! 11 | Time remaining: ] 12 | $disableMentionType[all]` 13 | } 14 | -------------------------------------------------------------------------------- /commands/Main/ping.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "ping", 3 | info: { 4 | description: "Returns the bot's Latency.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: ` 8 | Pong! 🏓 9 | $editIn[3s;Ping: $pingms 10 | Message Ping: $messagePingms 11 | Database Ping: $roundTenth[$databasePing;1] 12 | Last Restart: 13 | ] 14 | $cooldown[3s;Slow down! Don't spam the command! 15 | Time remaining: ]` 16 | } 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | .npm 3 | logs 4 | *.log 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | lerna-debug.log* 9 | .pnpm-debug.log* 10 | 11 | # Code editors 12 | .idea/ 13 | .vscode/ 14 | .history/ 15 | 16 | # Env configs 17 | .env 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | .env.production 22 | .env.local 23 | .env.keys 24 | .env.missing 25 | 26 | 27 | # Main stuff to ignore 28 | database/ 29 | package-lock.json 30 | yarn.lock 31 | config.js 32 | node_modules/ 33 | .yarn-integrity 34 | .node_repl_history 35 | *.sh 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /commands/Entertainment/text/randomtopic.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "randomtopic", 3 | info: { 4 | description: "Start a random topic in this server.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: ["newtopic", "topic"], 8 | code: `$title[Random topic] 9 | $description[$randomTopic] 10 | $footer[Started by $username;$authorAvatar] 11 | $color[$getVar[embedcolor]] 12 | $addTimestamp 13 | $cooldown[2s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Slash/ping.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "ping", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Returns the bot's Latency.", 7 | }, 8 | code: ` 9 | $InteractionEdit[Ping: $pingms 10 | Message Ping: $interactionPingms 11 | Database Ping: $roundTenth[$databasePing;1] 12 | Last Restart: 13 | ] 14 | $wait[3s] 15 | $interactionReply[Pong! 🏓;all;true] 16 | 17 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 18 | {ephemeral} 19 | {interaction} 20 | ] 21 | ` 22 | } 23 | -------------------------------------------------------------------------------- /commands/Developer/exec.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "execute", 3 | info: { 4 | description: "Runs terminal commands directly in Discord.", 5 | usage: "`execute `", 6 | perms: ["`SendMessages`"], 7 | dev: "true" 8 | }, 9 | $if: "old", 10 | aliases: "exec", 11 | code: `$if[$charCount[$exec[$message]]>=2000] 12 | $createFile[$exec[$message];result.txt] 13 | $else 14 | \`\`\`$exec[$message]\`\`\` 15 | $endif 16 | $onlyIf[$message!=;Please send a terminal command to be executed.] 17 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 18 | 19 | ` 20 | } 21 | -------------------------------------------------------------------------------- /commands/Slash/invite.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "invite", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Returns a link to invite the bot." 7 | }, 8 | code: `$interactionReply[{newEmbed:{title:invite Dodo-Bot}{description:To invite the bot into a server, press the button below.}{color:$getVar[embedcolor]}}{actionRow:{button:Invite:5:$nonEscape[$getClientInvite[sendmessages;viewchannel;addreactions;attachfiles;viewauditlog]]:false}};all;true] 9 | 10 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 11 | {ephemeral} 12 | {interaction} 13 | ] 14 | ` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Entertainment/text/yesorno.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "yesorno", 3 | info: { 4 | description: "Randomly returns either `yes` or `no`.", 5 | usage: "`yesorno `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | code: `> $message 9 | *$randomText[yes;no]* 10 | $onlyIf[$charCount[$message]<=200;Your question can't be longer than 200 characters] 11 | $onlyIf[$message!=;Please Type something.] 12 | $disableMentionType[all] 13 | $cooldown[2s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Entertainment/text/whoasked.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "whoasked", 3 | info: { 4 | description: "Searches for Askers (which never finds one).", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: `Searching for Askers... (0%) 8 | $editIn[5s;Searching for Askers... (5%);Searching for Askers... (15%);Searching for Askers... (40%);Searching for Askers... (60%);Searching for Askers... (90%);Searching for Askers... (100%);No askers has been found.] 9 | $cooldown[3s; Slow down! Don't spam the command! 10 | Time remaining: ] 11 | ` 12 | } 13 | -------------------------------------------------------------------------------- /commands/Entertainment/text/fact.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "fact", 3 | info: { 4 | description: "Returns random facts.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: `$getObjectProperty[api;fact] 8 | $createObject[api;$nonEscape[$get[jsonresponse]]] 9 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 10 | $let[jsonresponse;$httpRequest[https://api.popcat.xyz/v2/fact;GET;;;$get[error]]] 11 | $let[error;Unable to fetch data for fact. Please try again later.] 12 | $cooldown[3s; Slow down! Don't spam the command! 13 | Time remaining: ]` 14 | } 15 | -------------------------------------------------------------------------------- /commands/Entertainment/text/howgamer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "howgamer", 3 | info: { 4 | description: "Check on how much gamer you're or the user mentioned.", 5 | usage: "`howgamer (user)`", 6 | perms: ["`SendMessages`"] 7 | }, 8 | code: `$title[HowGamer machine] 9 | $description[$get[target] $random[0;100]% Gamer] 10 | $color[#$randomColor] 11 | $let[target;$advancedReplaceText[$checkCondition[$mentioned[1;true]==$authorID];true;You're;false;$username[$mentioned[1;true]] is]] 12 | $cooldown[2s; Slow down! Don't spam the command! 13 | Time remaining: ] 14 | ` 15 | } 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[IDEA]" 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /commands/Slash/8ball.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "8ball", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Ask a question to 8ball and it will answer it." 7 | }, 8 | code: `$interactionReply[{newEmbed:{title:8ball}{field:Question:$slashOption[question]}{field:Answer:$8ballanswers}{thumbnail:https#COLON#//us-east-1.tixte.net/uploads/dodo-bot.wants.solutions/black8ball.png}{color:$getVar[embedcolor]}};all;true] 9 | 10 | $onlyIf[$slashOption[question]<=200;Your question can't be longer than 200 characters. 11 | {ephemeral} 12 | {interaction} 13 | ] 14 | 15 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 16 | {ephemeral} 17 | {interaction} 18 | ] 19 | ` 20 | } 21 | -------------------------------------------------------------------------------- /commands/Developer/jseval.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "jseval", 3 | info: { 4 | description: "Executes codes for testing (in discord.js only).", 5 | usage: "`jseval `", 6 | perms: ["`SendMessages`"], 7 | flags: ["`--return`"], 8 | dev: "true" 9 | }, 10 | aliases: ["jse", "djseval", "djse"], 11 | $if: "old", 12 | code: ` 13 | $if[$checkContains[$message;--return;—return]==true] 14 | $djsEval[$get[content];true] 15 | $else 16 | $djsEval[$message] 17 | $endif 18 | $let[content;$removeContains[$message;--return;—return]] 19 | $onlyIf[$message!=;You need to provide a code.] 20 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 21 | ` 22 | } 23 | -------------------------------------------------------------------------------- /commands/Developer/serverlist.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "serverlist", 3 | info: { 4 | description: "Returns list of servers the bot is in.", 5 | perms: ["`SendMessages`"], 6 | dev: "true" 7 | }, 8 | aliases: "guildlist", 9 | code: ` 10 | $editMessage[$get[id];{file:allservers.md:$autoList[$nonEscape[$guildIDs[, ]];, ;autoListServers]}] 11 | $wait[2s] 12 | $let[id;$sendMessage[Please wait.. Getting the list..;true]] 13 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 14 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 15 | ` 16 | } 17 | -------------------------------------------------------------------------------- /commands/Automation/Awaited/pre-release-modedecider.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "Set Pre-release mode", 3 | type: "clientReady", 4 | code: ` 5 | $ifAwaited[$getVar[pre_release]==on;{execute:Enable-pre-release};{execute:Disable-pre-release}] 6 | 7 | 8 | ` 9 | },{ 10 | name: "Enable-pre-release", 11 | type: "awaited", 12 | code: ` 13 | 14 | $setVar[release_type;$getVar[DevReleaseTypeToSet]] 15 | $onlyIf[$checkContains[$getVar[release_type];$getVar[DevReleaseTypeToSet]]==false]` 16 | },{ 17 | name: "Disable-pre-release", 18 | type: "awaited", 19 | code: ` 20 | 21 | $deleteVar[release_type;;main] 22 | $onlyIf[$checkContains[$getVar[release_type];Stable]==false]` 23 | }] 24 | -------------------------------------------------------------------------------- /commands/Developer/readfile.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "readfile", 3 | info: { 4 | description: "Returns the contents of the file specified.", 5 | usage: "`readfile `", 6 | perms: ["`SendMessages`"], 7 | dev: "true" 8 | }, 9 | aliases: ["viewfile", "readcontent", "viewcontent"], 10 | $if: "old", 11 | code: `$if[$charCount[$readFile[$message]]>=2000] 12 | $createFile[$readFile[$message];output.js] 13 | $else 14 | \`\`\`$readFile[$message]\`\`\` 15 | $endif 16 | $onlyIf[$fileExists[$message]==true;This file doesn't seem to exist.] 17 | $onlyIf[$message!=;You need to specify a path of the file to view.] 18 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 19 | ` 20 | } 21 | -------------------------------------------------------------------------------- /commands/Entertainment/text/8ball.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "8ball", 3 | info: { 4 | description: "Ask a question to 8ball and it will answer it.", 5 | usage: "`8ball `", 6 | perms: "`SendMessages`" 7 | }, 8 | code: ` 9 | $title[8ball] 10 | $addField[Answer;$8ballanswers] 11 | $addField[Question;$message] 12 | $thumbnail[https://us-east-1.tixte.net/uploads/dodo-bot.wants.solutions/black8ball.png] 13 | $color[$getVar[embedcolor]] 14 | $footer[Feel free to ask me more questions!] 15 | $onlyIf[$charCount[$message]<=200;Your question can't be longer than 200 characters.] 16 | $onlyIf[$message!=;Please provide a text.] 17 | $cooldown[3s; Slow down! Don't spam the command! 18 | Time remaining: ] 19 | ` 20 | } 21 | -------------------------------------------------------------------------------- /commands/Entertainment/games/coinflip.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "coinflip", 3 | info: { 4 | description: "Starts a game of Coin Flip.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: "cf", 8 | code: ` 9 | $awaitComponents[$channelID;$get[messageID];$authorID;headsbutton,tailsbutton;headsinteraction,tailsinteraction;coinfliptimeout;1;30s] 10 | 11 | 12 | $let[messageID;$sendMessage[{newEmbed:{title:🪙 | Coin Flip}{description:The coin is in the air, choose Heads or Tails below.}{color:$getVar[embedcolor]}} 13 | 14 | {actionRow:{button:Heads:2:headsbutton:false}{button:Tails:2:tailsbutton:false}};true]] 15 | $cooldown[3s; Slow down! Don't spam the command! 16 | Time remaining: ] 17 | ` 18 | } 19 | -------------------------------------------------------------------------------- /commands/Entertainment/text/clap.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "clap", 3 | info: { 4 | description: "Makes 👏 the 👏 text 👏 look 👏 like 👏 this.", 5 | usage: "`clap `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | code: `$ifAwaited[$checkContains[$noMentionMessage; ]==true;{execute:spaceclap};{execute:nonspaceclap}] 9 | $onlyIf[$noMentionMessage!=;Please provide a text.] 10 | $cooldown[3s; Slow down! Don't spam the command! 11 | Time remaining: ]` 12 | },{ 13 | name: "spaceclap", 14 | type: "awaited", 15 | code: ` 16 | $replaceText[$noMentionMessage; ; 👏 ] 17 | ` 18 | }, 19 | { 20 | name: "nonspaceclap", 21 | type: "awaited", 22 | code: ` 23 | $replaceText[$noMentionMessage;; 👏 ] 24 | ` 25 | }] 26 | -------------------------------------------------------------------------------- /commands/Developer/refreshmembercache.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "refreshmembercache", 3 | info: { 4 | description: "Updates member cache (useful to fix incorrect count).", 5 | perms: ["`SendMessages`"], 6 | dev: "true" 7 | }, 8 | aliases: ["refreshusercache", "refreshguildcache", "refreshservercache"], 9 | code: ` 10 | $editMessage[$get[messageID];Successfully refreshed member cache!] 11 | $forEachGuild[2s;{};refreshmembercache;] 12 | $wait[2s] 13 | $let[messageID;$sendMessage[Refreshing member cache...;true]] 14 | $cooldown[2s;Slow down! Don't spam the command! 15 | Time remaining: ] 16 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 17 | ` 18 | } 19 | -------------------------------------------------------------------------------- /commands/Entertainment/games/ftf.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name:"findtheflag", 3 | info: { 4 | description: "Starts a game of Find the flag.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases:"ftf", 8 | code:` 9 | $awaitComponents[$channelID;$get[messageID];$authorID;ftf1,ftf2,ftf3;ftfresults1,ftfresults2,ftfresults3;ftftimeout;1;30s] 10 | 11 | $let[messageID;$sendMessage[{newEmbed:{title:🚩 | Find the flag!}{description:There is a hidden flag somewhere around 1-3, where you think the flag is on?}{color:$getVar[embedcolor]}} 12 | 13 | {actionRow:{button: :2:ftf1:false:1️⃣}{button: :2:ftf2:false:2️⃣}{button: :2:ftf3:false:3️⃣}} 14 | ;true]] 15 | $cooldown[3s; Slow down! Don't spam the command! 16 | Time remaining: ]` 17 | }] 18 | -------------------------------------------------------------------------------- /commands/Developer/deleteuserapps.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "deleteuserapps", 3 | info: { 4 | description: "Deletes user apps for good until they're recreated again.", 5 | perms: ["`SendMessages`"], 6 | dev: "true" 7 | }, 8 | aliases: ["destroyuserapps", "destroyslash", "destroyapps"], 9 | code: ` 10 | 11 | $editMessage[$get[messageID];Successfully deleted user apps!] 12 | $awaitExecute[deleteuserapps] 13 | $wait[2s] 14 | $deleteVar[isuserappsalreadysetup;;main] 15 | $let[messageID;$sendMessage[Deleting user apps...;true]] 16 | $cooldown[2s;Slow down! Don't spam the command! 17 | Time remaining: ] 18 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;]` 19 | 20 | } 21 | -------------------------------------------------------------------------------- /commands/Entertainment/text/mock.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "mock", 3 | info: { 4 | description: "Makes a text seem like mockery.", 5 | usage: "`mock `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | code: `$getObjectProperty[api;text] 9 | $createObject[api;$nonEscape[$get[jsonresponse]]] 10 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 11 | $let[jsonresponse;$httpRequest[https://api.popcat.xyz/v2/mock?text=$uri[$message;encode];GET;;;$get[error]]] 12 | $let[error;Unable to generate the output. Please try again later.] 13 | $onlyIf[$message!=;Please provide a text.] 14 | $cooldown[3s; Slow down! Don't spam the command! 15 | Time remaining: ] 16 | $disableMentionType[all]` 17 | } 18 | -------------------------------------------------------------------------------- /commands/Entertainment/text/reverse.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "reverse", 3 | info: { 4 | description: "Reverses provided text.", 5 | usage: "`reverse `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | code: `$getObjectProperty[api;text] 9 | $createObject[api;$nonEscape[$get[jsonresponse]]] 10 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 11 | $let[jsonresponse;$httpRequest[https://api.popcat.xyz/v2/reverse?text=$uri[$message;encode];GET;;;$get[error]]] 12 | $let[error;Unable to generate the output. Please try again later.] 13 | $onlyIf[$message!=;Please provide a text.] 14 | $cooldown[3s; Slow down! Don't spam the command! 15 | Time remaining: ] 16 | $disableMentionType[all]` 17 | } 18 | -------------------------------------------------------------------------------- /commands/Misc/morse.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "morse", 3 | info: { 4 | description: "Converts provided text to morse code!", 5 | usage: "`morse `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | code: `$getObjectProperty[api;morse] 9 | $createObject[api;$nonEscape[$get[jsonresponse]]] 10 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 11 | $let[jsonresponse;$httpRequest[https://api.popcat.xyz/v2/texttomorse?text=$uri[$message;encode];GET;;;$get[error]]] 12 | $let[error;Unable to generate the output. Please try again later.] 13 | $onlyIf[$message!=;Please provide a text.] 14 | $cooldown[3s; Slow down! Don't spam the command! 15 | Time remaining: ] 16 | $disableMentionType[all]` 17 | } 18 | -------------------------------------------------------------------------------- /commands/Entertainment/images/whereiseveryone.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "whereiseveryone", 3 | info: { 4 | description: "Starts a short recreation of cut-scene from Shrek movie.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: `$title["It's quiet..."] 8 | $image[https://us-east-1.tixte.net/uploads/dodogames.wants.solutions/whereiseveryone-part1.png] 9 | $editIn[5s;{newEmbed:{title:"Too quiet..."}{image:https#COLON#//us-east-1.tixte.net/uploads/dodogames.wants.solutions/whereiseveryone-part2.jpg}};{newEmbed:{title:"Where is Everyone?"}{image:https#COLON#//us-east-1.tixte.net/uploads/dodogames.wants.solutions/whereiseveryone-part3.jpg}}] 10 | $cooldown[3s; Slow down! Don't spam the command! 11 | Time remaining: ] 12 | ` 13 | } 14 | -------------------------------------------------------------------------------- /commands/Entertainment/games/wordle.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "wordle", 3 | info: { 4 | description: "Starts a game of wordle.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: ` 8 | $djsEval[const { Wordle } = require("discord-gamecord"); 9 | 10 | const Game = new Wordle({ 11 | message: message, 12 | isSlashGame: false, 13 | embed: { 14 | title: "Wordle", 15 | color: "$getVar[embedcolor]", 16 | }, 17 | customWord: null, 18 | timeoutTime: 60000, 19 | winMessage: "You won! The word was {word}.", 20 | loseMessage: "You lost! The word was {word}.", 21 | playerOnlyMessage: "Only {player} can use these buttons." 22 | }); 23 | 24 | Game.startGame(); 25 | ] 26 | $cooldown[3s; Slow down! Don't spam the command! 27 | Time remaining: ] 28 | 29 | ` 30 | } 31 | -------------------------------------------------------------------------------- /commands/Entertainment/text/lulcat.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "lulcat", 3 | info: { 4 | description: "Makes your text look cursed using lul cat language.", 5 | usage: "`lulcat `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | aliases: "lolcat", 9 | code: `$getObjectProperty[api;text] 10 | $createObject[api;$nonEscape[$get[jsonresponse]]] 11 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 12 | $let[jsonresponse;$httpRequest[https://api.popcat.xyz/v2/lulcat?text=$uri[$message;encode];GET;;;$get[error]]] 13 | $let[error;Unable to generate the output. Please try again later.] 14 | $onlyIf[$message!=;Please provide a text.] 15 | $cooldown[3s; Slow down! Don't spam the command! 16 | Time remaining: ] 17 | $disableMentionType[all]` 18 | } 19 | -------------------------------------------------------------------------------- /commands/Slash/report.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "report", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Returns a link to report issues on Dodo-Bot's GitHub repo." 7 | }, 8 | code: `$interactionReply[{newEmbed:{title:Reporting bugs}{description:Even though the bot might not appear to be buggy, it is worth noting that it may contain bugs, and as such, it is recommended to report bugs through the Github repo. 9 | 10 | To get started, be sure to have a Github account first, then press the button below to open an issue.}{color:$getVar[embedcolor]}} 11 | 12 | {actionRow:{button:Open a issue:5:https#COLON#//github.com/ddodogames/Dodo-Bot/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=%5BBUG%5D:false}};all;true] 13 | 14 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 15 | {ephemeral} 16 | {interaction} 17 | ] 18 | ` 19 | } 20 | -------------------------------------------------------------------------------- /commands/Entertainment/games/2048.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "2048", 3 | info: { 4 | description: "Starts a random game of 2048.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: `$djsEval[const { TwoZeroFourEight } = require('discord-gamecord'); 8 | 9 | const Game = new TwoZeroFourEight({ 10 | message: message, 11 | isSlashGame: false, 12 | embed: { 13 | title: '2048', 14 | color: '$getVar[embedcolor]' 15 | }, 16 | emojis: { 17 | up: '⬆️', 18 | down: '⬇️', 19 | left: '⬅️', 20 | right: '➡️', 21 | }, 22 | timeoutTime: 60000, 23 | buttonStyle: 'SECONDARY', 24 | playerOnlyMessage: 'Only {player} can use these buttons.' 25 | }); 26 | 27 | Game.startGame(); 28 | ] 29 | $cooldown[3s; Slow down! Don't spam the command! 30 | Time remaining: ] 31 | ` 32 | } 33 | -------------------------------------------------------------------------------- /commands/Main/invite.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "invite", 3 | info: { 4 | description: "Returns a link to invite the bot.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | $if: "old", 8 | code: `$title[invite Dodo-Bot] 9 | $description[To invite the bot into a server, press the button below.] 10 | $color[$getVar[embedcolor]] 11 | $if[$getVar[userapps]==true] 12 | $footer[Or add the bot to your account by pressing the second button] 13 | $addButton[1;Add me to your account;5;https://discord.com/oauth2/authorize?client_id=$clientID&integration_type=1&scope=applications.commands;false] 14 | $endif 15 | $addButton[1;Invite;5;$nonEscape[$getClientInvite[sendmessages;viewchannel;addreactions;attachfiles;viewauditlog]];false] 16 | $cooldown[2s; Slow down! Don't spam the command! 17 | Time remaining: ] 18 | ` 19 | } 20 | -------------------------------------------------------------------------------- /commands/Util/setup-logs.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "setup-logs", 3 | info: { 4 | description: "Setup Logs available of the bot.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: `$title[Setup Logs] 8 | $description[Select the log you want to setup using the dropdown menu below!] 9 | $color[$getVar[embedcolor]] 10 | $addSelectMenu[1;string;setuplogsmenu_$authorID;Select a log type;1;1;false;Message Delete:Setup Message Delete logs:msgdeletelog:false;Message Edit:Setup Message Edit logs:msgeditlog:false;Ban:Setup Ban logs:banlogs:false;Unban:Setup Unban logs:unbanlogs:false;Integration:Setup Integration logs:integration:false] 11 | $onlyPerms[managechannels;You do not have \`ManageChannels\` permission to use this.] 12 | $cooldown[3s; Slow down! Don't spam the command! 13 | Time remaining: ] 14 | ` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Automation/Events/error-logs.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "Error logger", 3 | type: "functionError", 4 | channel: "$getVar[errorchannel]", 5 | code: `$author[Error detected!;$clientAvatar] 6 | $description[**Error code**: 7 | \`\`\`$handleError[error]\`\`\` 8 | ] 9 | $addField[**Information**; 10 | Function name: \`$handleError[function]\` 11 | Command name: \`$get[commandname]\` 12 | Server: \`$guildName\` (\`$guildID\`) 13 | ] 14 | $color[Yellow] 15 | $footer[Occurred on] 16 | $addTimestamp 17 | 18 | $let[commandname;$advancedReplaceText[$checkCondition[$handleError[command]==];true;undefined;false;$handleError[command]]] 19 | $onlyIf[$hasPermsInChannel[$getVar[errorchannel];$clientID;sendmessages;viewchannel]==true;] 20 | $onlyIf[$channelExists[$getVar[errorchannel]]==true;] 21 | $onlyIf[$getVar[errorsdisabled]==false;] 22 | $onlyIf[$getVar[errorchannel]!=none;] 23 | $onlyIf[$getVar[errorsystem]==on;] 24 | 25 | ` 26 | } 27 | -------------------------------------------------------------------------------- /commands/Slash/avatar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "avatar", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Returns your/users profile picture." 7 | }, 8 | code: `$interactionReply[{newEmbed:{title:$get[username]'s Avatar}{image:$userAvatar[$get[user]]}{color:$getVar[embedcolor]}} 9 | 10 | {actionRow:{button:PNG:5:$nonEscape[$userAvatar[$get[user];4096;true;png]]:false}{button:JPG:5:$nonEscape[$userAvatar[$get[user];4096;true;jpg]]:false}{button:WEBP:5:$nonEscape[$userAvatar[$get[user];4096;true;webp]]:false}};all;true] 11 | 12 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$get[user]]==false];true;$username[$get[user]];false;$userTag[$get[user]]]] 13 | $let[user;$advancedReplaceText[$checkCondition[$slashOption[user]==];true;$authorID;false;$slashOption[user]]] 14 | 15 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 16 | {ephemeral} 17 | {interaction} 18 | ] 19 | ` 20 | } 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | ### **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | ### **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 16 | ### **Expected behavior** 17 | A clear and concise description of what you expected to happen. 18 | 19 | ### **Attachments (optional)** 20 | If applicable, add attachments to help explain your problem (like screenshots). 21 | 22 | ### **Build information (please complete the following information):** 23 | - Build number: [e.g. 2164] 24 | - Github Branch: [e.g. v2, canary, rebase] 25 | - Release type: [e.g. Stable, Pre-release, Canary] 26 | - Version [e.g. 2.1.9] 27 | 28 | #### Specifying "Build number" is optional if using a stable release 29 | 30 | ### **Additional context** 31 | Add any other context about the problem here. 32 | -------------------------------------------------------------------------------- /commands/Automation/Awaited/deletealluserapps.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "deleteuserapps", 3 | type: "awaited", 4 | code: ` 5 | $deleteApplicationCommand[global;$getApplicationCommandID[avatar;global]] 6 | $deleteApplicationCommand[global;$getApplicationCommandID[8ball;global]] 7 | $deleteApplicationCommand[global;$getApplicationCommandID[about;global]] 8 | $deleteApplicationCommand[global;$getApplicationCommandID[banner;global]] 9 | $deleteApplicationCommand[global;$getApplicationCommandID[report;global]] 10 | $deleteApplicationCommand[global;$getApplicationCommandID[ping;global]] 11 | $deleteApplicationCommand[global;$getApplicationCommandID[randomcolor;global]] 12 | $deleteApplicationCommand[global;$getApplicationCommandID[reverse;global]] 13 | $deleteApplicationCommand[global;$getApplicationCommandID[owoify;global]] 14 | $deleteApplicationCommand[global;$getApplicationCommandID[invite;global]] 15 | ` 16 | } 17 | -------------------------------------------------------------------------------- /commands/Main/report.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "report", 3 | info: { 4 | description: "Returns a link to report issues on Dodo-Bot's GitHub repo.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: "bugreport", 8 | code: `$title[Reporting bugs] 9 | $description[Even though the bot might not appear to be buggy, it is worth noting that it may contain bugs, and as such, it is recommended to report bugs through the Github repo. 10 | 11 | To get started, be sure to have a Github account first, then press the button below to open an issue. 12 | ] 13 | $color[$getVar[embedcolor]] 14 | $addButton[1;Open a issue;5;https://github.com/ddodogames/Dodo-Bot/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=%5BBUG%5D;false] 15 | $cooldown[2s; Slow down! Don't spam the command! 16 | Time remaining: ] 17 | ` 18 | } 19 | -------------------------------------------------------------------------------- /commands/Misc/avatar.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "avatar", 3 | info: { 4 | description: "Returns your/users profile picture.", 5 | usage: "`avatar (user)`", 6 | perms: ["`SendMessages`"] 7 | }, 8 | aliases: ["av","userav"], 9 | code: `$title[$get[username]'s Avatar] 10 | $image[$userAvatar[$get[user]]] 11 | $color[$getVar[embedcolor]] 12 | $addButton[1;WEBP;5;$nonEscape[$userAvatar[$get[user];4096;true;webp]];false] 13 | $addButton[1;JPG;5;$nonEscape[$userAvatar[$get[user];4096;true;jpg]];false] 14 | $addButton[1;PNG;5;$nonEscape[$userAvatar[$get[user];4096;true;png]];false] 15 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$get[user]]==false];true;$username[$get[user]];false;$userTag[$get[user]]]] 16 | $let[user;$findUser[$message[1];true]] 17 | $cooldown[3s; Slow down! Don't spam the command! 18 | Time remaining: ] 19 | ` 20 | } 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dodo-Bot", 3 | "version": "2.2.6", 4 | "description": "A personal bot project made in aoi.js v6 aiming to both entertain and provide users some features to use.", 5 | "main": "index.js", 6 | "homepage": "https://github.com/ddodogames/Dodo-Bot", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "setup": "npm install", 10 | "start": "node index.js", 11 | "startWithoutDeprecations": "node index.js -- --no-deprecation", 12 | "UpdateandStart": "git pull && node index.js" 13 | }, 14 | "engines": { 15 | "node": ">=20.x" 16 | }, 17 | "keywords": [], 18 | "author": "dodoGames", 19 | "license": "Apache-2.0", 20 | "dependencies": { 21 | "aoi.js": "^6.11.1", 22 | "@aoijs/aoi.db": "^0.0.0", 23 | "discord-gamecord": "^4.4.2", 24 | "@dotenvx/dotenvx": "^1.51.1" 25 | }, 26 | "devDependencies": { 27 | "chalk": "^4.1.2" 28 | } 29 | } 30 | 31 | -------------------------------------------------------------------------------- /commands/Slash/about.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "about", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Returns information about Dodo-Bot." 7 | }, 8 | code: `$interactionReply[{newEmbed:{title:About Dodo-Bot}{description:Dodo-Bot is a personal project aiming to be an entertainment bot while at the same time providing a couple of useful features (e.g, the Welcomer feature)! It is basically a bot made in aoi.js v6! 9 | 10 | The project has existed since late 2021 and to this day, it continues to be developed with new improvements along with other type of updates as well!}{thumbnail:https#COLON#//us-east-1.tixte.net/uploads/dodogames.wants.solutions/dodo-bot-logo.png}{color:$getVar[embedcolor]}} 11 | 12 | {actionRow:{button:Source Code:5:https#COLON#//github.com/ddodogames/Dodo-Bot:false}};all;true] 13 | 14 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 15 | {ephemeral} 16 | {interaction} 17 | ] 18 | ` 19 | } 20 | -------------------------------------------------------------------------------- /commands/Entertainment/images/ad.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "ad", 3 | info: { 4 | description: "Make someone's avatar (or yours) a ad.", 5 | usage: "`ad (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];ad.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/ad?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Entertainment/images/invert.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "invert", 3 | info: { 4 | description: "Adds invert effect to a image.", 5 | usage: "`invert (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];invert.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/invert?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Main/about.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "about", 3 | info: { 4 | description: "Returns information about Dodo-Bot.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: "info", 8 | code: ` 9 | $title[About Dodo-Bot] 10 | $description[Dodo-Bot is a personal project aiming to be an entertainment bot while at the same time providing a couple of useful features (e.g, the Welcomer feature)! It is basically a bot made in aoi.js v6! 11 | 12 | The project has existed since late 2021 and to this day, it continues to be developed with new improvements along with other type of updates as well! 13 | ] 14 | $color[$getVar[embedcolor]] 15 | $addButton[1;Source Code;5;https://github.com/ddodogames/Dodo-Bot;false] 16 | $thumbnail[https://us-east-1.tixte.net/uploads/dodogames.wants.solutions/dodo-bot-logo.png] 17 | $cooldown[2s;Slow down! Don't spam the command! 18 | Time remaining: ] 19 | ` 20 | } 21 | -------------------------------------------------------------------------------- /commands/Entertainment/images/drip.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "drip", 3 | info: { 4 | description: "Puts your/user's profile picture on a joke image.", 5 | usage: "`drip (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];drip.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/drip?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Entertainment/images/gun.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "gun", 3 | info: { 4 | description: "Adds a hand holding gun into user's profile picture.", 5 | usage: "`gun (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];gun.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/gun?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Entertainment/images/jail.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "jail", 3 | info: { 4 | description: "Puts your/user's profile picture behind the bars.", 5 | usage: "`jail (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];jail.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/jail?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Automation/Awaited/levelingresets.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "resetonleave", 3 | type: "awaited", 4 | code: `$deleteVar[level;$authorID_$guildID;main] 5 | $deleteVar[previouslevel;$authorID_$guildID;main] 6 | $deleteVar[xp;$authorID_$guildID;main] 7 | $deleteVar[xpLimit;$authorID_$guildID;main]` 8 | },{ 9 | name: "resetleveling", 10 | type: "awaited", 11 | code: `$resetUserVar[level;$guildID] 12 | $resetUserVar[xp;$guildID] 13 | $resetUserVar[xpLimit;$guildID] 14 | $resetUserVar[previouslevel;$guildID] 15 | $setGuildVar[islevelingreset;yes] 16 | `}] 17 | 18 | /* Maybe at some point in the future... 19 | 20 | { 21 | name: "forEachMemberID", 22 | type: "awaited", 23 | code: ` 24 | $deleteVar[level;{value}_$guildID;main] 25 | $deleteVar[previouslevel;{value}_$guildID;main] 26 | $deleteVar[xp;{value}_$guildID;main] 27 | $deleteVar[xpLimit;{value}_$guildID;main]` 28 | } 29 | */ 30 | -------------------------------------------------------------------------------- /commands/Entertainment/images/pet.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "pet", 3 | info: { 4 | description: "Creates a pet GIF meme using user's profile picture.", 5 | usage: "`pet (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];pet.gif;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/pet?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Automation/Awaited/autolist-types.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "autoListText", 3 | type: "awaited", 4 | code: ` 5 | $if[{value}==none;none;* {value}] 6 | ` 7 | },{ 8 | name: "autoListServers", 9 | type: "awaited", 10 | code: ` 11 | * $guildName[{value}] - {value} 12 | ` 13 | },{ 14 | name: "autoListChannels", 15 | type: "awaited", 16 | code: `$if[{value}==none;none;$get[channels]] 17 | 18 | $let[channels;$if[$guildChannelExists[$guildID;{value}]==true;* <#{value}>;* \`Deleted Channel\`]]` 19 | },{ 20 | name: "autoListCategories", 21 | $if: "old", 22 | type: "awaited", 23 | code: ` 24 | $if[{value}==none] 25 | none 26 | $else 27 | $advancedReplaceText[$checkCondition[$guildChannelExists[$guildID;{value}]==true];true;* **$djsEval[const data = d.util.aoiFunc(d); 28 | const channel = d.util.getChannel(d, "{value}",true) 29 | channel.name 30 | ;true]**;false;* \`Deleted Category\`] 31 | $endif 32 | ` 33 | }] 34 | -------------------------------------------------------------------------------- /commands/Entertainment/images/nokia.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "nokia", 3 | info: { 4 | description: "Puts your/user's profile picture on a nokia phone.", 5 | usage: "`nokia (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];nokia.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/nokia?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Entertainment/images/wanted.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "wanted", 3 | info: { 4 | description: "Adds a wanted poster into user's profile picture.", 5 | usage: "`wanted (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];wanted.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/wanted?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Slash/banner.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "banner", 3 | type: "interaction", 4 | prototype: "slash", 5 | info: { 6 | description: "Returns your/users profile banner." 7 | }, 8 | code: `$interactionReply[{newEmbed:{title:$get[username]'s Banner}{image:$userBanner[$get[user]]}{color:$getVar[embedcolor]}} 9 | 10 | {actionRow:{button:Download:5:$nonEscape[$userBanner[$get[user]]]:false}};all;true] 11 | 12 | $onlyIf[$userBanner[$get[user]]!=null;This user does not have a banner attached to their profile. 13 | {ephemeral} 14 | {interaction} 15 | ] 16 | 17 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$get[user]]==false];true;$username[$get[user]];false;$userTag[$get[user]]]] 18 | $let[user;$advancedReplaceText[$checkCondition[$slashOption[user]==];true;$authorID;false;$slashOption[user]]] 19 | 20 | $onlyIf[$getVar[userapps]==true;User apps are currently disabled. 21 | {ephemeral} 22 | {interaction} 23 | ] 24 | ` 25 | } 26 | -------------------------------------------------------------------------------- /commands/Leveling/rank.js: -------------------------------------------------------------------------------- 1 | module.exports ={ 2 | name: "rank", 3 | info: { 4 | description: "View your or someone's current level.", 5 | usage: "`rank (user)`", 6 | perms: ["`SendMessages`"] 7 | }, 8 | aliases: ["level", "lvl"], 9 | code: ` 10 | $title[$username[$get[user]]'s Rank] 11 | $addField[Progress; 12 | Level: \`$getUserVar[level;$get[user]]\` 13 | Experience: \`$getUserVar[xp;$get[user]]\`/\`$getUserVar[xpLimit;$get[user]]\` 14 | \`($createProgressBar[$getUserVar[xp;$get[user]];$getUserVar[xpLimit;$get[user]]])\` 15 | ] 16 | $thumbnail[$userAvatar[$get[user]]] 17 | $color[$getVar[embedcolor]] 18 | 19 | $onlyIf[$isBot[$get[user]]==false;Bots do not have Levels.] 20 | $let[user;$findMember[$message;true]] 21 | $onlyIf[$getGuildVar[levelsystem]==on;Leveling is not enabled currently.] 22 | $cooldown[2s;Slow down! Don't spam the command! 23 | Time remaining: ] 24 | ` 25 | } 26 | -------------------------------------------------------------------------------- /commands/Entertainment/images/clown.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "clown", 3 | info: { 4 | description: "Puts your/user's profile picture on a cutscene from Teen Titans Go.", 5 | usage: "`clown (user)`", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];clown.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 11 | $let[apilink;https://api.popcat.xyz/v2/clown?image=$get[pfphandler]] 12 | $let[pfphandler;$advancedReplaceText[$userAvatar[$mentioned[1;true]];.webp;.png;.gif;.png]] 13 | $cooldown[5s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | } 16 | -------------------------------------------------------------------------------- /commands/Util/leave.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "leave", 3 | info: { 4 | description: "Setup and manage Leave feature.", 5 | perms: ["`SendMessages`", "`ManageChannels`"] 6 | }, 7 | code: `$title[Leave] 8 | $description[Leave just like Welcomer is a way to setup an channel where the bot says goodbye to members leaving your server! 9 | 10 | To get started, click on the "Toggle" button! To manage the settings regarding the said feature, press the "Settings" button. 11 | 12 | **Current Setup** 13 | * $get[leavesystem] 14 | ] 15 | $color[$getVar[embedcolor]] 16 | $addButton[1;Settings;1;leavesettings_$authorID;false] 17 | $addButton[1;Toggle;2;toggleleave_$authorID;false;🔄] 18 | 19 | $let[leavesystem;$advancedReplaceText[$getGuildVar[leavesystem];off;Disabled;on;Enabled]] 20 | $onlyPerms[managechannels;You do not have \`ManageChannels\` permission to use this.] 21 | $cooldown[3s; Slow down! Don't spam the command! 22 | Time remaining: ] 23 | ` 24 | } 25 | -------------------------------------------------------------------------------- /commands/Misc/randomcolor.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "randomcolor", 3 | info: { 4 | description: "Returns a random color that you can use.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: ["randomhex", "randomrgb"], 8 | code: `$author[Random Color;https://us-east-1.tixte.net/uploads/dodogames.wants.solutions/paintlarger.png] 9 | $title[There you go!] 10 | $addField[**RGB code**;$getObjectProperty[api;rgb]] 11 | $addField[**Hex code**;$getObjectProperty[api;hex]] 12 | $color[$getObjectProperty[api;hex]] 13 | $thumbnail[$getObjectProperty[api;color_image]] 14 | $createObject[api;$nonEscape[$get[jsonresponse]]] 15 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 16 | $let[jsonresponse;$httpRequest[https://api.popcat.xyz/v2/color/$randomColor;GET;;;$get[error]]] 17 | $let[error;Unable to generate a random color. Please try again later.] 18 | $cooldown[5s;Slow down! Don't spam the command! 19 | Time remaining: ] 20 | ` 21 | } 22 | -------------------------------------------------------------------------------- /commands/Entertainment/games/minesweeper.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "minesweeper", 3 | info: { 4 | description: "Starts a random minesweeper game.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: `$djsEval[const { Minesweeper } = require('discord-gamecord'); 8 | 9 | const Game = new Minesweeper({ 10 | message: message, 11 | isSlashGame: false, 12 | embed: { 13 | title: 'Minesweeper', 14 | color: '$getVar[embedcolor]', 15 | description: 'Click on the buttons to reveal the blocks except mines.' 16 | }, 17 | emojis: { flag: '🚩', mine: '💣' }, 18 | mines: 5, 19 | timeoutTime: 60000, 20 | winMessage: 'You won the Game! You successfully avoided all the mines.', 21 | loseMessage: 'You lost the Game! Be aware of the mines next time.', 22 | playerOnlyMessage: 'Only {player} can use these buttons.' 23 | }); 24 | 25 | Game.startGame(); 26 | ] 27 | $cooldown[3s; Slow down! Don't spam the command! 28 | Time remaining: ]` 29 | } 30 | -------------------------------------------------------------------------------- /commands/Developer/refreshuserapps.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "refreshuserapps", 3 | info: { 4 | description: "Updates user apps to the latest change done to them.", 5 | perms: ["`SendMessages`"], 6 | dev: "true" 7 | }, 8 | aliases: ["restartslash", "refreshslash", "refreshapps", "restartuserapps", "restartapps"], 9 | code: ` 10 | $editMessage[$get[messageID];Successfully refreshed user apps!] 11 | $awaitExecute[createuserapps] 12 | $wait[2s] 13 | $deleteVar[isuserappsalreadysetup;;main] 14 | $let[messageID;$sendMessage[Refreshing user apps...;true]] 15 | $onlyIf[$getVar[isuserappsalreadysetup]==yes;Make sure user apps are created already.] 16 | $onlyIf[$getVar[userapps]==true;You must have the setup option \`EnableUserApps\` enabled in order to use this.] 17 | $cooldown[2s;Slow down! Don't spam the command! 18 | Time remaining: ] 19 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 20 | ` 21 | } 22 | -------------------------------------------------------------------------------- /commands/Main/help.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "help", 3 | info: { 4 | description: "View all available commands of the bot.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: ["h"], 8 | code: `$title[Help Menu] 9 | $description[To view commands, select one of the modules from the dropdown menu below!] 10 | $footer[Made with ❤️ by $username[632607624742961153]] 11 | $color[$getVar[embedcolor]] 12 | $addSelectMenu[1;string;helpmenu_$authorID;Select a module;1;1;false;Main:Explore commands from Main module:main:false;Entertainment:Explore commands from Entertainment module:entertainment:false;Leveling:Explore commands from Leveling module:leveling:false;Util:Explore commands from Util module:util:false$nonEscape[$get[devmodule]]] 13 | 14 | $let[devmodule;$if[$checkContains[$clientOwnerIDs[| ];$authorID]==true;#SEMI#Developer#COLON#Explore commands from Developer module#COLON#dev#COLON#false;]] 15 | $cooldown[2s; Slow down! Don't spam the command! 16 | Time remaining: ]` 17 | } 18 | -------------------------------------------------------------------------------- /commands/Misc/banner.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "banner", 3 | info: { 4 | description: "Returns your/users profile banner.", 5 | usage: "`banner (user)`", 6 | perms: ["`SendMessages`"] 7 | }, 8 | aliases: ["userbanner","usrbanner"], 9 | code: `$title[$get[username]'s Banner] 10 | $image[$userBanner[$get[user]]] 11 | $color[$getVar[embedcolor]] 12 | $addButton[1;Download;5;$nonEscape[$userBanner[$get[user]]];false] 13 | $onlyIf[$userBanner[$get[user]]!=null;$get[error]] 14 | 15 | $let[error;$advancedReplaceText[$checkCondition[$get[user]==$authorID];true;You don't have a banner.;false;This user does not have a banner attached to their profile.]] 16 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$get[user]]==false];true;$username[$get[user]];false;$userTag[$get[user]]]] 17 | $let[user;$findUser[$message[1];true]] 18 | 19 | $cooldown[3s; Slow down! Don't spam the command! 20 | Time remaining: ] 21 | ` 22 | } 23 | -------------------------------------------------------------------------------- /commands/Entertainment/images/couldread.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "couldread", 3 | info: { 4 | description: "Make your own meme of a King of the Hill cutscene.", 5 | usage: "`couldread `", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | code: `$attachment[$get[apilink];couldread.png;URL] 9 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 10 | $onlyIf[$charCount[$message]<=86;Your message can't be longer than 86 characters!] 11 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 12 | $let[apilink;https://api.popcat.xyz/v2/couldread?text=$uri[$message;encode]] 13 | $onlyIf[$message!=;Please Type something.] 14 | $cooldown[5s; Slow down! Don't spam the command! 15 | Time remaining: ]` 16 | } 17 | -------------------------------------------------------------------------------- /commands/Entertainment/text/joke.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "joke", 3 | info: { 4 | description: "Returns random jokes.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: "jokes", 8 | code: `$ifAwaited[$getObjectProperty[api;joke]==;{execute:twopart};{execute:single}] 9 | $createObject[api;$nonEscape[$get[jsonresponse]]] 10 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 11 | $let[jsonresponse;$httpRequest[https://v2.jokeapi.dev/joke/Any?blacklistFlags=nsfw,religious,political,racist,sexist,explicit&safe-mode;GET;;;$get[error]]] 12 | $let[error;Unable to fetch data for jokes. Please try again later.] 13 | $cooldown[3s; Slow down! Don't spam the command! 14 | Time remaining: ]` 15 | },{ 16 | name: "twopart", 17 | type: "awaited", 18 | code: ` 19 | Setup: $getObjectProperty[api;setup] 20 | Delivery: $getObjectProperty[api;delivery] 21 | ` 22 | },{ 23 | name: "single", 24 | type: "awaited", 25 | code: ` 26 | $getObjectProperty[api;joke] 27 | ` 28 | }] 29 | -------------------------------------------------------------------------------- /commands/Util/welcomer.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "welcomer", 3 | info: { 4 | description: "Setup and manage Welcomer feature.", 5 | perms: ["`SendMessages`", "`ManageChannels`"] 6 | }, 7 | aliases: "welcome", 8 | code: `$title[Welcomer] 9 | $description[Welcomer is an way to greet new members of your server with your own choice of the message you're going to use it for the server! 10 | 11 | To get started, click on the "Toggle" button! To manage the settings regarding the said feature, press the "Settings" button. 12 | 13 | **Current Setup** 14 | * $get[welcomersystem] 15 | ] 16 | $color[$getVar[embedcolor]] 17 | $addButton[1;Settings;1;welsettings_$authorID;false] 18 | $addButton[1;Toggle;2;togglewel_$authorID;false;🔄] 19 | 20 | $let[welcomersystem;$advancedReplaceText[$getGuildVar[welcomesystem];off;Disabled;on;Enabled]] 21 | $onlyPerms[managechannels;You do not have \`ManageChannels\` permission to use this.] 22 | $cooldown[3s;Slow down! Don't spam the command! 23 | Time remaining: ] 24 | ` 25 | } 26 | -------------------------------------------------------------------------------- /commands/Leveling/leveling-system.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "leveling", 3 | info: { 4 | description: "Setup and manage Leveling feature.", 5 | perms: ["`SendMessages`", "`ManageChannels`"] 6 | }, 7 | code: ` 8 | $title[Leveling] 9 | $description[Leveling is a feature that let's members of the server have their levels and xp based on how much they have been active in the server. 10 | 11 | To get started, click on the "Toggle" button! To manage the settings regarding the said feature, press the "Settings" button. 12 | 13 | **Current Setup** 14 | * $get[levelingsystem] 15 | ] 16 | $color[$getVar[embedcolor]] 17 | $addButton[1;Settings;1;levelingsettings_$authorID;false] 18 | $addButton[1;Toggle;2;toggleleveling_$authorID;false;🔄] 19 | 20 | $let[levelingsystem;$advancedReplaceText[$getGuildVar[levelsystem];off;Disabled;on;Enabled]] 21 | $onlyPerms[managechannels;You do not have \`ManageChannels\` permission to use this.] 22 | $cooldown[3s;Slow down! Don't spam the command! 23 | Time remaining: ] 24 | ` 25 | } 26 | -------------------------------------------------------------------------------- /commands/Main/credits.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "credits", 3 | info: { 4 | description: "Returns a list of credits for things that were introduced in Dodo-Bot.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | code: `$title[Dodo-Bot Credits] 8 | $description[ 9 | * $username[632607624742961153] - Developer of the bot 10 | * $username[431749535656837130] - Inspiration to improve some commands 11 | * $username[738856854892839022] - For Leveling setup 12 | * $username[769525910164471821] - For \`guess-the-pokemon\` code (and some ideas as well) 13 | * aoi.js server - For a lot of help 14 | * [discotools.xyz](https://discotools.xyz/icons-editor) - For most of the icons used in commands 15 | ] 16 | $color[$getVar[embedcolor]] 17 | $addButton[1;Use of source code;2;useofsource_$authorID;false] 18 | $addButton[1;Packages used;2;packagesused_$authorID;false] 19 | $addButton[1;Main Credits;2;maincredits_$authorID;true] 20 | $cooldown[2s; Slow down! Don't spam the command! 21 | Time remaining: ] 22 | ` 23 | } 24 | -------------------------------------------------------------------------------- /commands/Developer/update.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "update", 3 | info: { 4 | description: "Restarts commands to latest changes.", 5 | perms: ["`SendMessages`"], 6 | dev: "true" 7 | }, 8 | aliases: ["restartcmds", "reloadcmds", "reload"], 9 | code: `$author[Commands has been reloaded!;$clientAvatar] 10 | $addField[Commands; 11 | * **Prefix:** $commandsCount 12 | * **Awaited:** $commandsCount[awaited] 13 | * **Interactions:** $get[interactions] 14 | * **Slash:** $commandsCount[slash] 15 | ] 16 | $addButton[1;Total: $get[total];2;unimportantcustomid;true] 17 | $let[total;$sum[$commandsCount;$commandsCount[awaited];$commandsCount[button];$commandsCount[selectMenu];$commandsCount[modal];$commandsCount[slash]]] 18 | $let[interactions;$sum[$commandsCount[button];$commandsCount[selectMenu];$commandsCount[modal]]] 19 | $color[$getVar[embedcolor]] 20 | $updateCommands 21 | $cooldown[4s;Slow down! Don't spam the command! 22 | Time remaining: ] 23 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 24 | ` 25 | } 26 | -------------------------------------------------------------------------------- /commands/Entertainment/games/snake.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "snake", 3 | info: { 4 | description: "Starts a snake game.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: "snek", 8 | code: `$djsEval[const { Snake } = require('discord-gamecord'); 9 | 10 | const Game = new Snake({ 11 | message: message, 12 | isSlashGame: false, 13 | embed: { 14 | title: 'Snake Game', 15 | overTitle: 'Game Over', 16 | color: '$getVar[embedcolor]' 17 | }, 18 | emojis: { 19 | board: '⬛', 20 | food: '🍎', 21 | up: '👆', 22 | down: '👇', 23 | left: '👈', 24 | right: '👉', 25 | }, 26 | snake: { head: '🟢', body: '🟩', tail: '🟢', over: '💀' }, 27 | foods: ['🍎', '🍇', '🍊', '🫐', '🥕', '🥝', '🌽', '🍏'], 28 | buttonStyle: "SECONDARY", 29 | stopButton: 'Stop', 30 | timeoutTime: 60000, 31 | playerOnlyMessage: 'Only {player} can use these buttons.' 32 | }); 33 | 34 | Game.startGame(); 35 | ] 36 | $cooldown[3s; Slow down! Don't spam the command! 37 | Time remaining: ]` 38 | } 39 | -------------------------------------------------------------------------------- /commands/Main/settings.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "settings", 3 | info: { 4 | description: "Let's you manage some options of Dodo-Bot.", 5 | perms: ["`SendMessages`", "`ManageGuild`"] 6 | }, 7 | aliases: ["panel", "guildsettings", "serversettings"], 8 | code: `$title[Settings] 9 | $description[Welcome to settings! Here, you can change things the bot usually operates. 10 | 11 | To change any option, use the dropdown menu below to manage each one accordingly. 12 | ] 13 | $addSelectMenu[1;string;settingsmenu_$authorID;Select a option;1;1;false;Auto reply:Automatically reply to pings!:autoreply:false;Include bots:Whether or not to include bots in message logs.:includebots:false;Anonymous:Hide moderator names being revealed:anonymous:false] 14 | $color[$getVar[embedcolor]] 15 | $thumbnail[https://us-east-1.tixte.net/uploads/dodogames.wants.solutions/yellowgear.png] 16 | $onlyPerms[manageguild;You do not have \`ManageGuild\` permission to use this.] 17 | $cooldown[2s; Slow down! Don't spam the command! 18 | Time remaining: ]` 19 | } 20 | -------------------------------------------------------------------------------- /commands/Automation/Awaited/messageditlog-modes.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "msgeditlogfilemode", 3 | type: "awaited", 4 | code: `$createFile[ 5 | Member: <#$authorID> 6 | Channel: <#$channelID> 7 | Message link: $messageURL[$messageID;$channelID] 8 | Message ID: $messageID 9 | 10 | Before: 11 | $oldMessage 12 | 13 | After: 14 | $message 15 | 16 | $if[$messageAttachments!=; ;Attachments: 17 | 18 | $messageAttachments[ 19 | 20 | 21 | ]] 22 | ;msgedit-logs.txt] 23 | 24 | $useChannel[$getGuildVar[msglogeditchannel]]` 25 | },{ 26 | name: "msgeditlogembedmode", 27 | type: "awaited", 28 | code: `$author[Message Updated!;$authorAvatar] 29 | $description[ 30 | **Member:** <@$authorID> 31 | **Channel:** <#$channelID> 32 | **Message:** $messageURL[$messageID;$channelID] ([Jump]($messageURL[$messageID;$channelID]))$if[$messageAttachments!=; 33 | **Attachments:** $messageAttachments 34 | ] 35 | 36 | **Before** 37 | $oldMessage 38 | **After** 39 | $message 40 | ] 41 | $footer[Message ID: $messageID] 42 | $color[Blue] 43 | $addTimestamp 44 | 45 | $useChannel[$getGuildVar[msglogeditchannel]]` 46 | }] 47 | -------------------------------------------------------------------------------- /commands/Entertainment/games/matchpairs.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "match-pairs", 3 | info: { 4 | description: "Starts a random matchpairs game.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: "matchpairs", 8 | code: `$djsEval[const { MatchPairs } = require('discord-gamecord'); 9 | 10 | const Game = new MatchPairs({ 11 | message: message, 12 | isSlashGame: false, 13 | embed: { 14 | title: 'Match Pairs', 15 | color: '$getVar[embedcolor]', 16 | description: '**Click on the buttons to match emojis with their pairs.**' 17 | }, 18 | timeoutTime: 60000, 19 | emojis: ['🍉', '🍇', '🍊', '🥭', '🍎', '🍏', '🥝', '🥥', '🍓', '🫐', '🍍', '🥕', '🥔'], 20 | winMessage: '**You won the Game! You turned a total of \`{tilesTurned}\` tiles.**', 21 | loseMessage: '**You lost the Game! You turned a total of \`{tilesTurned}\` tiles.**', 22 | playerOnlyMessage: 'Only {player} can use these buttons.' 23 | }); 24 | 25 | Game.startGame(); 26 | ] 27 | $cooldown[3s; Slow down! Don't spam the command! 28 | Time remaining: ] 29 | ` 30 | } 31 | -------------------------------------------------------------------------------- /commands/Main/perms.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "perms", 3 | info: { 4 | description: "Shows permissions the bot requires.", 5 | perms: "`SendMessages`" 6 | }, 7 | aliases: ["botperms"], 8 | code: ` 9 | $title[Permissions] 10 | $description[Confused on what perms the bot should have? This list should help you decide the right permissions for the bot! 11 | 12 | For safety reasons, do not give the bot administrator permission under any circumstances. 13 | ] 14 | $addField[\`ViewAuditLog\`;Required for logs such as moderation and Integration.] 15 | $addField[\`AttachFiles\`;Required for image commands such as \`gun\`.] 16 | $addField[\`AddReactions\`;Required for commands that use reactions.] 17 | $addField[\`SendMessages\`;The most basic permission needed.] 18 | $addField[\`ViewChannel\`;Required so the bot can read the user's messages executing it's command.] 19 | $color[$getVar[embedcolor]] 20 | $addButton[1;Why this exists?;2;whynoadminperm_$authorID;false;❓] 21 | $cooldown[2s; Slow down! Don't spam the command! 22 | Time remaining: ] 23 | 24 | ` 25 | } 26 | -------------------------------------------------------------------------------- /commands/Entertainment/images/comment.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "comment", 3 | info: { 4 | description: "Generates a parody image of YouTube comment with your username and profile picture.", 5 | usage: "`comment `", 6 | perms: ["`SendMessages`", "`AttachFiles`"] 7 | }, 8 | aliases: "ytcomment", 9 | code: `$attachment[$get[apilink];comment.png;URL] 10 | $onlyIf[$IsValidImageLink[$get[apilink]]==true;Looks like there are issues with processing the image. Please try again later if possible.] 11 | $onlyIf[$charCount[$message]<=56;Your comment can't be longer than 56 characters!] 12 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;attachfiles]==true;I must have \`AttachFiles\` permission in order to proceed in this channel. Please grant me the permission and try again.] 13 | $let[apilink;https://some-random-api.com/canvas/misc/youtube-comment?username=$uri[$username;encode]&avatar=$get[pfphandler]&comment=$uri[$message;encode]] 14 | $let[pfphandler;$advancedReplaceText[$authorAvatar;.webp;.png;.gif;.png]] 15 | $onlyIf[$message!=;Please Type something.] 16 | $cooldown[5s; Slow down! Don't spam the command! 17 | Time remaining: ] 18 | ` 19 | } 20 | -------------------------------------------------------------------------------- /commands/Entertainment/games/findemoji.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "findemoji", 3 | info: { 4 | description: "Starts a game of Find Emoji.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: "find-emoji", 8 | code: `$djsEval[const { FindEmoji } = require('discord-gamecord'); 9 | 10 | const Game = new FindEmoji({ 11 | message: message, 12 | isSlashGame: false, 13 | embed: { 14 | title: 'Find Emoji', 15 | color: '$getVar[embedcolor]', 16 | description: 'Remember the emojis from the board below.', 17 | findDescription: 'Find the {emoji} emoji before the time runs out.' 18 | }, 19 | timeoutTime: 60000, 20 | hideEmojiTime: 5000, 21 | buttonStyle: 'SECONDARY', 22 | emojis: ['🍉', '🍇', '🍊', '🍋', '🥭', '🍎', '🍏', '🥝'], 23 | winMessage: 'You won! You selected the correct emoji. {emoji}', 24 | loseMessage: 'You lost! You selected the wrong emoji. {emoji}', 25 | timeoutMessage: 'You lost! You ran out of time. The emoji is {emoji}', 26 | playerOnlyMessage: 'Only {player} can use these buttons.' 27 | }); 28 | 29 | Game.startGame(); 30 | ] 31 | $cooldown[3s;Slow down! Don't spam the command! 32 | Time remaining: ] 33 | ` 34 | } 35 | -------------------------------------------------------------------------------- /commands/Developer/shutdown.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "shutdown", 3 | info: { 4 | description: "Brings up a confirmation before shutting down the bot.", 5 | usage: "`shutdown (flag)`", 6 | perms: ["`SendMessages`"], 7 | flags: ["`--now`"], 8 | dev: "true" 9 | }, 10 | code: `$ifAwaited[$checkContains[$message;--now;—now]==true;{execute:shutdownbyforce};{execute:shutdownwithconfirmation}] 11 | 12 | $cooldown[2s;Slow down! Don't spam the command! 13 | Time remaining: ] 14 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 15 | ` 16 | },{ 17 | name: "shutdownbyforce", 18 | type: "awaited", 19 | code: `$shutdown` 20 | },{ 21 | name: "shutdownwithconfirmation", 22 | type: "awaited", 23 | code: `$title[Shutdown] 24 | $description[Do you really want to shutdown the bot? This will simply stop your bot from running. To turn on the bot, you need to go through your host to start it again.] 25 | $color[Red] 26 | $thumbnail[https://us-east-1.tixte.net/uploads/dodo-bot.wants.solutions/warning.png] 27 | $addButton[1;No;2;shutdowndeny_$authorID;false] 28 | $addButton[1;Yes;2;shutdownconfirm_$authorID;false]` 29 | }] 30 | -------------------------------------------------------------------------------- /commands/Main/canary.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "canary", 3 | info: { 4 | description: "Returns information about Pre-release builds and how to try them.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: ["devbuilds", "canarybuilds"], 8 | code: `$title[About Canary] 9 | $addField[How to test?;For those who want to host them on their bots. You can download the files from the [canary](https://github.com/ddodogames/Dodo-Bot/tree/canary) branch on Github. 10 | 11 | Alternatively, you can invite Dodo Canary (using the button below) to a server to directly test latest pre-release build (prefix: \`d?\`). 12 | ] 13 | $addField[Introduction;Canary is a way to test pre-release builds of upcoming versions of Dodo-Bot before they released as a stable version. 14 | 15 | Builds released in this state are incomplete and may have bugs as a result, so it is not recommended to use them for production purposes. 16 | ] 17 | $addButton[1;Invite Dodo Canary;5;https://discord.com/api/oauth2/authorize?client_id=970481494797738016&scope=bot+applications.commands&permissions=36032;false] 18 | $color[$getVar[embedcolor]] 19 | $cooldown[2s;Slow down! Don't spam the command! 20 | Time remaining: ] 21 | ` 22 | 23 | } 24 | -------------------------------------------------------------------------------- /commands/Developer/setcustomstatus.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "setcustomstatus", 3 | info: { 4 | description: "Sets a custom status for the bot.", 5 | usage: "`setcustomstatus or (flag)`", 6 | perms: ["`SendMessages`"], 7 | flags: ["`--reset`"], 8 | dev: "true" 9 | }, 10 | aliases: ["scs", "customstatus"], 11 | $if: "old", 12 | code: ` 13 | $if[$stringStartsWith[$tolowercase[$message];--reset;—reset]==true] 14 | $setStatus[;custom;online] 15 | Status has been reset! You can set a status again if you would like to do so. 16 | $onlyIf[$userCustomStatus[$guildID;$clientID]!=none;There is no status to reset.] 17 | $else 18 | $setStatus[$message;custom] 19 | Status has been set! You can remove it by passing the flag \`--reset\` at the start of your message. 20 | $onlyIf[$charCount[$message]<=128;You can only have up to 128 characters for each custom status you set.] 21 | $endif 22 | $onlyIf[$message!=;Please enter an text. You can also reset the current status by passing the flag \`--reset\` as first argument of the cmd.] 23 | $cooldown[2s;Slow down! Don't spam the command! 24 | Time remaining: ] 25 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;]` 26 | 27 | } 28 | -------------------------------------------------------------------------------- /commands/Automation/Events/integration-logs.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "Integration Logs", 3 | type: "join", 4 | channel: "$getGuildVar[Integrationchannel]", 5 | code: ` 6 | $author[New bot has been added!;$userAvatar] 7 | $description[ 8 | * **Name:** $username <@$authorID> 9 | * **Tag:** $userTag 10 | * **Added by:** $get[getstaffinfo] 11 | * **Added on:** 12 | * **Verified:** $get[verified] 13 | * **Created on:** 14 | ] 15 | $color[Blue] 16 | $addButton[1;View Permissions;2;viewbotpermsbutton_$authorID;false] 17 | 18 | $useChannel[$getGuildVar[Integrationchannel]] 19 | $let[getstaffinfo;$username[$get[staffID]] <@$get[staffID]>] 20 | $let[verified;$advancedReplaceText[$checkCondition[$isBotVerified[$authorID]==true];true;Yes;false;No]] 21 | $let[staffID;$getAuditLogs[$guildID;;1;80;{executor.id}]] 22 | $onlyIf[$hasPerms[$guildID;$clientID;viewauditlog]==true;In order to have Integration logs work, i must have \`ViewAuditLog\` permission!] 23 | $onlyIf[$hasPermsInChannel[$getGuildVar[Integrationchannel];$clientID;viewchannel;sendmessages]==true;] 24 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[Integrationchannel]]==true;] 25 | $onlyIf[$getGuildVar[Integrationchannel]!=none;] 26 | $onlyIf[$isBot==true;] 27 | ` 28 | } 29 | -------------------------------------------------------------------------------- /commands/Main/stats.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "stats", 3 | info: { 4 | description: "Returns statistics about the bot.", 5 | perms: "`SendMessages`" 6 | }, 7 | aliases: "botstats", 8 | code: `$title[$username[$clientID]'s Stats] 9 | $addField[**Dodo-Bot**;$get[dodobotversion];true] 10 | $addField[**Node.js**;\`$nodeVersion\`;true] 11 | $addField[**Aoi.js**;$get[aoijsversion];true] 12 | $addField[**Servers**;$guildCount;true] 13 | $addField[**Uptime**;$get[uptime];true] 14 | $addField[**Ping**;$pingms;true] 15 | $addField[**CPU Usage**;$roundTenth[$get[cpu];2];true] 16 | $addField[**RAM Usage**;$round[$ram]MB;true] 17 | $addField[**Users**;$numberSeparator[$allMembersCount;,];true] 18 | $thumbnail[$clientAvatar] 19 | $color[$getVar[embedcolor]] 20 | 21 | $let[cpu;$sum[$cpu[process];$cpu[os]]] 22 | $let[uptime;] 23 | $let[aoijsversion;$advancedReplaceText[$checkCondition[$getVar[libraryversiondevcheck]==on];true;\`v$advancedTextSplit[$packageVersion;-;1]\` (Dev);false;\`v$packageVersion\`]] 24 | $let[dodobotversion;$advancedReplaceText[$checkCondition[$getVar[pre_release]==on];true;\`v$getVar[version]\` (Dev);false;\`v$getVar[version]\`]] 25 | $cooldown[2s; Slow down! Don't spam the command! 26 | Time remaining: ] 27 | ` 28 | } 29 | -------------------------------------------------------------------------------- /commands/Entertainment/games/c4.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "connect4", 3 | info: { 4 | description: "Play connect4 with your opponent!", 5 | usage: "`connect4 `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | aliases: ["c4", "connectfour"], 9 | code: `$djsEval[const { Connect4 } = require('discord-gamecord'); 10 | 11 | const Game = new Connect4({ 12 | message: message, 13 | isSlashGame: false, 14 | opponent: message.mentions.users.first(), 15 | embed: { 16 | title: 'Connect4 Game', 17 | statusTitle: 'Status', 18 | color: '$getVar[embedcolor]' 19 | }, 20 | emojis: { 21 | board: '⚪', 22 | player1: '🔴', 23 | player2: '🟡' 24 | }, 25 | mentionUser: true, 26 | timeoutTime: 60000, 27 | buttonStyle: 'SECONDARY', 28 | turnMessage: '{emoji} | Its turn of player **{player}**.', 29 | winMessage: '{emoji} | **{player}** won the Connect4 Game.', 30 | tieMessage: 'The Game tied! No one won the Game!', 31 | timeoutMessage: 'The Game went unfinished! No one won the Game!', 32 | playerOnlyMessage: 'Only {player} and {opponent} can use these buttons.' 33 | }); 34 | Game.startGame(); 35 | ] 36 | $onlyIf[$isBot[$mentioned[1;true]]==false;You cannot play with bots!] 37 | $onlyIf[$mentioned[1;true]!=$authorID;Please mention a opponent to play with!] 38 | $cooldown[3s;Slow down! Don't spam the command! 39 | Time remaining: ] 40 | ` 41 | } 42 | -------------------------------------------------------------------------------- /commands/Automation/Events/member-logs.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "Welcomer message", 3 | type: "join", 4 | channel: "$getGuildVar[welcomechannel]", 5 | code: `$ifAwaited[$charCount[$getGuildVar[welcomemessage]]>=2000||$getGuildVar[welcometype]==embed;{execute:welcomerembedmode};{execute:welcomertextmode}] 6 | 7 | 8 | $onlyIf[$hasPermsInChannel[$getGuildVar[welcomechannel];$clientID;viewchannel;sendmessages]==true;] 9 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[welcomechannel]]==true;] 10 | $onlyIf[$getGuildVar[welcomechannel]!=none;] 11 | 12 | $let[content;$welcomerMessage[$getGuildVar[welcomemessage]]] 13 | 14 | $onlyIf[$getGuildVar[welcomesystem]==on;] 15 | $disableMentionType[roles] 16 | $disableMentionType[everyone] 17 | $onlyIf[$guildID==$guildID;]` 18 | },{ 19 | name: "Leave message", 20 | type: "leave", 21 | channel: "$getGuildVar[leavechannel]", 22 | code: `$ifAwaited[$charCount[$getGuildVar[leavemessage]]>=2000||$getGuildVar[leavetype]==embed;{execute:leaveembedmode};{execute:leavetextmode}] 23 | 24 | 25 | $onlyIf[$hasPermsInChannel[$getGuildVar[leavechannel];$clientID;viewchannel;sendmessages]==true;] 26 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[leavechannel]]==true;] 27 | $onlyIf[$getGuildVar[leavechannel]!=none;] 28 | 29 | $let[content;$leaveMessage[$getGuildVar[leavemessage]]] 30 | 31 | $onlyIf[$getGuildVar[leavesystem]==on;] 32 | $disableMentionType[roles] 33 | $disableMentionType[everyone] 34 | $onlyIf[$guildID==$guildID;]` 35 | }] 36 | -------------------------------------------------------------------------------- /commands/Misc/periodic-table.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "periodic-table", 3 | info: { 4 | description: "Returns random periodic table.", 5 | perms: "`SendMessages`" 6 | }, 7 | aliases: ["pt"], 8 | code: ` 9 | 10 | $title[$getObjectProperty[api;message.name]] 11 | $description[ 12 | **About $getObjectProperty[api;message.name]** 13 | $getObjectProperty[api;message.summary] 14 | ] 15 | $addField[Other; 16 | * **Symbol**: $getObjectProperty[api;message.symbol] 17 | * **Period**: $getObjectProperty[api;message.period] 18 | * **Discovered by**: $getObjectProperty[api;message.discovered_by] 19 | ;true] 20 | $addField[General; 21 | * **Phase**: $getObjectProperty[api;message.phase] 22 | * **atomic number**: $getObjectProperty[api;message.atomic_number] 23 | * **atomic mass**: $getObjectProperty[api;message.atomic_mass] 24 | ;true] 25 | $thumbnail[$getObjectProperty[api;message.image]] 26 | $color[$getVar[embedcolor]] 27 | 28 | $createObject[api;$nonEscape[$get[jsonresponse]]] 29 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 30 | $let[jsonresponse;$httpRequest[https://api.popcat.xyz/v2/periodic-table/random;GET;;;$get[error]]] 31 | $let[error;Unable to fetch data for periodic-table. Please try again later.] 32 | 33 | $cooldown[3s; Slow down! Don't spam the command! 34 | Time remaining: ] 35 | ` 36 | } 37 | -------------------------------------------------------------------------------- /commands/Entertainment/games/wyr.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "would-you-rather", 3 | info: { 4 | description: "Starts a game of two options to choose from.", 5 | usage: "`would-you-rather (flag)`", 6 | perms: ["`SendMessages`", "`AddReactions` (if using `--usereactions` flag)"], 7 | flags: ["`--usereactions`"] 8 | }, 9 | $if: "old", 10 | aliases: "wyr", 11 | code: `$title[Would you rather...] 12 | $addField[**Option 2**;$getObjectProperty[api;message.ops2]] 13 | $addField[**Option 1**;$getObjectProperty[api;message.ops1]] 14 | $color[$getVar[embedcolor]] 15 | 16 | $if[$checkContains[$message;--usereactions;—usereactions]==true] 17 | $addClientReactions[1️⃣;2️⃣] 18 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;addreactions]==true; 19 | I do not have permissions to add reactions to my message in this channel. Please either grant me \`AddReactions\` permission or use buttons instead. 20 | ] 21 | $else 22 | $addButton[1;0;2;wyr2-votebutton;false;2️⃣] 23 | $addButton[1;0;2;wyr1-votebutton;false;1️⃣] 24 | $endif 25 | 26 | $createObject[api;$nonEscape[$get[jsonresponse]]] 27 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 28 | $let[jsonresponse;$httpRequest[https://api.popcat.xyz/v2/wyr;GET;;;$get[error]]] 29 | $let[error;Unable to fetch data for wyr. Please try again later.] 30 | $cooldown[4s; Slow down! Don't spam the command! 31 | Time remaining: ] 32 | ` 33 | } 34 | -------------------------------------------------------------------------------- /commands/Info/userinfo.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "userinfo", 3 | info: { 4 | description: "Returns your/user's information.", 5 | usage: "`userinfo (user)`", 6 | perms: ["`SendMessages`"] 7 | }, 8 | $if: "old", 9 | aliases: ["user", "user-info"], 10 | code: `$title[Information for $get[username];$userURL[$get[user]]] 11 | $addField[**Other**; 12 | * **Avatar:** [link]($userAvatar[$get[user]]) 13 | * **DMs:** $get[userdms] 14 | ;true] 15 | $addField[**General**; 16 | * **Joined Discord on:** 17 | * **Bot account:** $get[botchecker] 18 | * **ID:** $get[user] 19 | ;true] 20 | $color[$getVar[embedcolor]] 21 | $thumbnail[$userAvatar[$get[user]]] 22 | $if[$memberExists[$findUser[$message[1;true]];$guildID]==true] 23 | $addButton[1;Member's Server info;2;memberservinfo_$authorID_$get[user];false] 24 | $addButton[1;General info;2;mainmeminfo_$authorID_$get[user];true] 25 | $endif 26 | 27 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$get[user]]==false];true;$username[$get[user]];false;$userTag[$get[user]]]] 28 | $let[botchecker;$advancedReplaceText[$checkCondition[$isBot[$get[user]]==true];true;Yes;false;No]] 29 | $let[userdms;$advancedReplaceText[$checkCondition[$isUserDmEnabled[$get[user]]==true];true;Enabled;false;Disabled]] 30 | $let[user;$findUser[$message[1];true]] 31 | $cooldown[2s; Slow down! Don't spam the command! 32 | Time remaining: ] 33 | ` 34 | } 35 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/shutdown-prompts.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | type: "interaction", 3 | prototype: "button", 4 | code: ` 5 | $shutdown 6 | $wait[2s] 7 | $interactionFollowUp[Done!] 8 | $wait[3s] 9 | $interactionUpdate[{newEmbed:{title:Please wait}{description:$username[$clientID] is shutting down...}{color:Green}}] 10 | 11 | 12 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 13 | {ephemeral} 14 | {interaction} 15 | ] 16 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==shutdownconfirm;] 17 | ` 18 | },{ 19 | type: "interaction", 20 | prototype: "button", 21 | code: ` 22 | $interactionFollowUp[The bot will continue to operate then.] 23 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{thumbnail:https#COLON#//us-east-1.tixte.net/uploads/dodo-bot.wants.solutions/warning.png}{color:Red}}{actionRow:{button:Yes:2:shutdownconfirm_$authorID:true}{button:No:2:shutdowndeny$authorID:true}}] 24 | 25 | 26 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 27 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 28 | 29 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 30 | {ephemeral} 31 | {interaction} 32 | ] 33 | 34 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==shutdowndeny;] 35 | ` 36 | }] 37 | -------------------------------------------------------------------------------- /commands/Entertainment/games/ttt.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "tictactoe", 3 | info: { 4 | description: "Play tictactoe with your opponent!", 5 | usage: "`tictactoe `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | aliases: "ttt", 9 | code: `$djsEval[const { TicTacToe } = require('discord-gamecord'); 10 | 11 | const Game = new TicTacToe({ 12 | message: message, 13 | isSlashGame: false, 14 | opponent: message.mentions.users.first(), 15 | embed: { 16 | title: 'Tic Tac Toe', 17 | color: '$getVar[embedcolor]', 18 | statusTitle: 'Status', 19 | overTitle: 'Game Over' 20 | }, 21 | emojis: { 22 | xButton: '❌', 23 | oButton: '🔵', 24 | blankButton: '➖' 25 | }, 26 | mentionUser: true, 27 | timeoutTime: 60000, 28 | xButtonStyle: 'SECONDARY', 29 | oButtonStyle: 'SECONDARY', 30 | turnMessage: '{emoji} | Its turn of player **{player}**.', 31 | winMessage: '{emoji} | **{player}** won the TicTacToe Game.', 32 | tieMessage: 'The Game tied! No one won the Game!', 33 | timeoutMessage: 'The Game went unfinished! No one won the Game!', 34 | playerOnlyMessage: 'Only {player} and {opponent} can use these buttons.' 35 | }); 36 | 37 | Game.startGame(); 38 | ] 39 | $onlyIf[$isBot[$mentioned[1;true]]==false;You cannot play with bots!] 40 | $onlyIf[$mentioned[1;true]!=$authorID;Please mention a opponent to play with!] 41 | $cooldown[3s; Slow down! Don't spam the command! 42 | Time remaining: ] 43 | ` 44 | } 45 | -------------------------------------------------------------------------------- /commands/Developer/dev-panel.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "dev-panel", 3 | info: { 4 | description: "Special settings dedicated to devs. Allows the user to change stuff!", 5 | perms: ["`SendMessages`"], 6 | dev: "true" 7 | }, 8 | aliases: ["developer-panel", "dev-settings", "devpanel"], 9 | code: `$title[Developer panel] 10 | $description[This panel allows you to change some things the bot operates behind the scenes. 11 | 12 | To change a option, use the select menu below to do so.] 13 | $color[Yellow] 14 | $thumbnail[https://us-east-1.tixte.net/uploads/dodo-bot.wants.solutions/devsettings.png] 15 | $addSelectMenu[1;string;devmenu_$authorID;Select a option;1;1;false;Bot Invitation Message:Whether or not the bot should greet new servers.:botwelcome:false:👋;Error Logging:Send errors to specific channel.:errorlog:false:📢;Embed color:Change the current embed color used in all commands.:botembedcolor:false:🎨;Pre-release:Whether or not to enable Pre-release mode.:botdevmode:false:🚧;Startup:Choose a channel for bot's startup msgs to be sent.:botstartup:false:🚦;Show build info:Whether or not to display build info in version cmd:showbuildinfo:false:🛠️;Member requirement:How much members are required for new servers:memberrequirement:false:📋] 16 | $addButton[2;Leave a server;2;leaveserverbutton_$authorID;false] 17 | $cooldown[2s;Slow down! Don't spam the command! 18 | Time remaining: ] 19 | $onlyIf[$checkContains[$clientOwnerIDs[| ];$authorID]==true;] 20 | ` 21 | } 22 | -------------------------------------------------------------------------------- /commands/Automation/Others/Systems/levelup.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "$alwaysExecute", 3 | code: ` 4 | $levelUpMessage[$getGuildVar[levelupmessage]] 5 | $useChannel[$getGuildVar[levelupmessagechannel]] 6 | 7 | $onlyIf[$hasPermsInChannel[$getGuildVar[levelupmessagechannel];$clientID;viewchannel;sendmessages]==true;] 8 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[levelupmessagechannel]]==true;] 9 | $onlyIf[$getGuildVar[levelupmessagechannel]!=none;] 10 | $onlyIf[$getGuildVar[levelupmessagefeature]==on;] 11 | 12 | $setUserVar[xpLimit;$sum[$getUserVar[xpLimit;$authorID;$guildID];20];$authorID;$guildID] 13 | $setUserVar[level;$sum[$getUserVar[level;$authorID;$guildID];1];$authorID;$guildID] 14 | $setUserVar[previouslevel;$sum[$getUserVar[previouslevel;$authorID;$guildID];1];$authorID;$guildID] 15 | 16 | $disableMentionType[roles] 17 | $disableMentionType[everyone] 18 | $onlyIf[$isBot==false;] 19 | $onlyIf[$getUserVar[xp]==$getUserVar[xpLimit];] 20 | $onlyIf[$getGuildVar[levelsystem]==on;] 21 | ` 22 | },{ 23 | name: "$alwaysExecute", 24 | code: ` 25 | $setUserVar[xp;$sum[$getUserVar[xp];1];$authorID;$guildID] 26 | $setGuildVar[islevelingreset;no] 27 | 28 | $onlyIf[$checkContains[$getGuildVar[levelingexcludedchannels];$channelID]==false;] 29 | $onlyIf[$checkContains[$getGuildVar[levelingexcludedcategories];$get[channelcategory]]==false;] 30 | $let[channelcategory;$advancedReplaceText[$checkCondition[$channelCategoryID==];true;Nothing;false;$channelCategoryID]] 31 | 32 | $cooldown[2s;] 33 | $onlyIf[$isBot==false;] 34 | $onlyIf[$getGuildVar[levelsystem]==on;]` 35 | }] 36 | -------------------------------------------------------------------------------- /commands/Entertainment/text/say.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "say", 3 | info: { 4 | description: "Makes the bot say whatever you want (alongside with optional embed mode).", 5 | usage: "`say (flag)`\n\n-# Execute the command first before specifying parameters.", 6 | perms: ["`SendMessages`"], 7 | flags: ["`--embed`"] 8 | }, 9 | aliases: ["talk","repeat"], 10 | code: `$awaitMessages[$channelID;$authorID;30s;everything;awaitedsay;Time ran out! You didn't make me say anything!] 11 | What do you want me to say? 12 | 13 | **Tip:** To use embed mode, make sure your message contains the flag \`--embed\` to do so. 14 | $cooldown[3s; Slow down! Don't spam the command! 15 | Time remaining: ] 16 | ` 17 | },{ 18 | name: "awaitedsay", 19 | $if: "old", 20 | type: "awaited", 21 | code: ` 22 | $if[$checkContains[$message;--embed;—embed]==true||$charCount[$message]>=2000] 23 | $author[$username;$userAvatar;$userURL[$authorID]] 24 | $title[Say Cmd!;$nonEscape[$get[links]]] 25 | $description[$get[content]] 26 | $color[#$randomColor] 27 | $addTimeStamp 28 | $else 29 | $message 30 | 31 | - From [\`$username\`](<$userURL[$authorID]>) 32 | $endif 33 | $disableMentionType[all] 34 | $onlyIf[$get[content]!=;You cannot activate embed mode without providing a text first.] 35 | $let[content;$removeContains[$message;--embed;—embed]] 36 | $let[links;$randomText[$getClientInvite[sendmessages;viewchannel;addreactions;attachfiles;viewauditlog];https://www.youtube.com/watch?v=dQw4w9WgXcQ]] 37 | ` 38 | }] 39 | -------------------------------------------------------------------------------- /commands/Automation/Events/message-logs.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "Message delete Logs", 3 | type: "messageDelete", 4 | $if: "old", 5 | channel: "$getGuildVar[msglogdeletedchannel]", 6 | code: `$author[Message Deleted!;$authorAvatar] 7 | $description[ 8 | **Member:** <@$authorID> 9 | **Channel:** <#$channelUsed> 10 | $message 11 | ] 12 | $addTimestamp 13 | $color[Yellow] 14 | $if[$getGuildVar[includebots]==false] 15 | $onlyIf[$isBot==false;] 16 | $endif 17 | $onlyIf[$message!=;] 18 | $onlyIf[$authorID!=$clientID;] 19 | $onlyIf[$hasPermsInChannel[$getGuildVar[msglogdeletedchannel];$clientID;viewchannel;sendmessages]==true;] 20 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[msglogdeletedchannel]]==true;] 21 | $onlyIf[$getGuildVar[msglogdeletedchannel]!=none;] 22 | $onlyIf[$guildID==$guildID;] 23 | 24 | ` 25 | },{ 26 | name: "Message update Logs", 27 | type: "messageUpdate", 28 | $if: "old", 29 | channel: "$getGuildVar[msglogeditchannel]", 30 | code: ` 31 | $ifAwaited[$charCount[$message]>=4096||$charCount[$oldMessage]>=4096;{execute:msgeditlogfilemode};{execute:msgeditlogembedmode}] 32 | 33 | $if[$getGuildVar[includebots]==false] 34 | $onlyIf[$isBot==false;] 35 | $endif 36 | $onlyIf[$oldMessage!=||$message!=;] 37 | $onlyIf[$oldMessage!=$message;] 38 | $onlyIf[$hasEmbeds[$messageID;$channelID]==false;] 39 | $onlyIf[$authorID!=$clientID;] 40 | $onlyIf[$hasPermsInChannel[$getGuildVar[msglogeditchannel];$clientID;viewchannel;sendmessages]==true;] 41 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[msglogeditchannel]]==true;] 42 | $onlyIf[$getGuildVar[msglogeditchannel]!=none;] 43 | $onlyIf[$guildID==$guildID;] 44 | 45 | ` 46 | }] 47 | -------------------------------------------------------------------------------- /commands/Automation/Events/Bot Invitation Message.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "Bot Invitation Message", 3 | type: "guildJoin", 4 | channel: "$randomChannelID[$guildID;all]", 5 | code: ` 6 | $ifAwaited[$membersCount[$guildID;all;true]>=$getVar[servermemberrequirement];{execute:invitationgreeting};{execute:failedmemberrequirement}] 7 | 8 | ` 9 | },{ 10 | name: "invitationgreeting", 11 | type: "awaited", 12 | code: ` 13 | $title[Welcome to Dodo-Bot!] 14 | $description[Dodo-Bot is a personal bot project made in aoi.js v6 aiming to both entertain and provide users some features to use.] 15 | $addField[Confused?;If you need information about commands in the bot then use the command \`$getGuildVar[prefix]commandinfo \` to do so!] 16 | $addField[Getting started;To explore the bot, use the command \`$getGuildVar[prefix]help\`. This let's you view all of the commands of the bot in a selectmenu as modules!] 17 | $thumbnail[https://us-east-1.tixte.net/uploads/dodogames.wants.solutions/dodo-bot-logo.png] 18 | $footer[Made with ❤️ by $username[632607624742961153]!] 19 | $color[$getVar[embedcolor]] 20 | $addButton[1;Source code;5;https://github.com/ddodogames/Dodo-Bot;false] 21 | 22 | $useChannel[$get[channelselector]] 23 | $onlyIf[$hasPermsInChannel[$get[channelselector];$clientID;sendmessages;viewchannel]==true;] 24 | $let[channelselector;$advancedReplaceText[$checkCondition[$guildSystemChannelID[$guildID]==];true;$randomChannelID[$guildID;Text];false;$guildSystemChannelID[$guildID]]] 25 | $onlyIf[$getVar[botinvitationmessage]==on;]` 26 | },{ 27 | name: "failedmemberrequirement", 28 | type: "awaited", 29 | code: `$let[hidetext;$clientLeave[$guildID]]` 30 | }] 31 | -------------------------------------------------------------------------------- /commands/Automation/Others/Bot specific/startup-messages.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "Startup Message (Console)", 3 | type: "clientReady", 4 | channel: "", 5 | code: ` 6 | $djsEval[const chalk = require('chalk') 7 | 8 | console.log(chalk.cyan("Invite Your bot using this link: $getClientInvite[sendmessages;viewchannel;addreactions;attachfiles;viewauditlog]")) 9 | ] 10 | $djsEval[const chalk = require('chalk') 11 | 12 | console.log(chalk.yellow("Tip: Found an issue? Report it here: https://github.com/ddodogames/Dodo-Bot/issues/new/choose")) 13 | ] 14 | $log[Dodo-Bot v$getVar[version]$if[$getVar[pre_release]==on; (build $getVar[buildNumber])]$if[$getVar[buildRevision]!=0; (Revision $getVar[buildRevision])] is ready to be used on the client $userTag[$clientID]!] 15 | $wait[2s] 16 | $ifAwaited[$getVar[pre_release]==on;{execute:showdevwarning}] 17 | ` 18 | },{ 19 | name: "Startup Message (Channel)", 20 | type: "clientReady", 21 | channel: "", 22 | code: ` 23 | $title[Ready!] 24 | $description[$username[$clientID] is now running!] 25 | $color[DarkGreen] 26 | $useChannel[$getVar[startupchannel]] 27 | 28 | $onlyIf[$hasPermsInChannel[$getVar[startupchannel];$clientID;sendmessages;viewchannel]==true;] 29 | $onlyIf[$channelExists[$getVar[startupchannel]]==true;] 30 | $onlyIf[$getVar[startupchannel]!=none;] 31 | $onlyIf[$getVar[startupchannelsystem]==on;] 32 | ` 33 | },{ 34 | name: "showdevwarning", 35 | type: "awaited", 36 | code: `$djsEval[const chalk = require('chalk') 37 | 38 | console.log(chalk.red.bold("Development build detected!\\nUsing Development builds are not recommended for public usage as they may contain bugs and as such, it is advised to try them for testing purposes only!"))] 39 | ` 40 | }] 41 | -------------------------------------------------------------------------------- /commands/Automation/Awaited/leavemessages.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "leavetextmodetest", 3 | type: "awaited", 4 | code: ` 5 | **This is a test Leave message! Please, ignore this.** 6 | $get[content] 7 | 8 | 9 | $useChannel[$getGuildVar[leavechannel]] 10 | $disableMentionType[roles] 11 | $disableMentionType[everyone]` 12 | },{ 13 | name: "leaveembedmodetest", 14 | type: "awaited", 15 | code: ` 16 | **This is a test Leave message! Please, ignore this.** 17 | $author[Member left;$get[serverimage]] 18 | $description[ 19 | $get[content] 20 | ] 21 | $thumbnail[$authorAvatar] 22 | $color[$getGuildVar[leavemessageembedcolor]] 23 | 24 | $let[serverimage;$advancedReplaceText[$checkCondition[$guildIcon==];false;$guildIcon;true;$userDefaultAvatar[$clientID]]] 25 | 26 | $useChannel[$getGuildVar[leavechannel]] 27 | $disableMentionType[roles] 28 | $disableMentionType[everyone] 29 | ` 30 | },{ 31 | name: "leavetextmode", 32 | type: "awaited", 33 | code: ` 34 | $get[content] 35 | 36 | 37 | $useChannel[$getGuildVar[leavechannel]] 38 | $disableMentionType[roles] 39 | $disableMentionType[everyone]` 40 | },{ 41 | name: "leaveembedmode", 42 | type: "awaited", 43 | code: ` 44 | $author[Member left;$get[serverimage]] 45 | $description[ 46 | $get[content] 47 | ] 48 | $thumbnail[$authorAvatar] 49 | $color[$getGuildVar[leavemessageembedcolor]] 50 | 51 | $let[serverimage;$advancedReplaceText[$checkCondition[$guildIcon==];false;$guildIcon;true;$userDefaultAvatar[$clientID]]] 52 | 53 | $useChannel[$getGuildVar[leavechannel]] 54 | $disableMentionType[roles] 55 | $disableMentionType[everyone] 56 | ` 57 | }] 58 | -------------------------------------------------------------------------------- /commands/Leveling/lb.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "leaderboard", 3 | info: { 4 | description: `Returns Leveling's leaderboard for this server (if enabled).`, 5 | usage: "`leaderboard (page)`", 6 | perms: ["`SendMessages`"] 7 | }, 8 | aliases: ["lb", "leveling-lb", "level-leaderboard"], 9 | code: ` 10 | $author[$guildName;$get[serverimage]] 11 | $title[Leaderboard] 12 | $description[$get[leaderboard]] 13 | $footer[Page $get[page]/20] 14 | $addTimeStamp 15 | $color[$getVar[embedcolor]] 16 | 17 | $onlyIf[$get[leaderboard]!=;Leaderboard is currently not available. The reasons are being: 18 | * Members do not have level 2 and higher. Please wait for someone to level up first then try again. 19 | * The specified page still didn't register members yet. Wait for a couple of members to level up then try again. 20 | ] 21 | 22 | $let[leaderboard;$advancedReplaceText[$userLeaderBoard[$guildID;level;desc;&{top} - {username} - Level {value};20;$get[page];main];&1 -;🥇 1 -;&2 -;🥈 2 -;&3 -;🥉 3 -;&;]] 23 | $let[serverimage;$advancedReplaceText[$checkCondition[$guildIcon==];false;$guildIcon;true;$userDefaultAvatar[$clientID]]] 24 | $onlyIf[$get[page]>=1;You can't go less than page 1.] 25 | $onlyIf[$get[page]<=20;You can only switch up to page 20.] 26 | $onlyIf[$isInteger[$get[page]]==true;A invalid page has been entered. Please specify a existing page.] 27 | $onlyIf[$isNumber[$get[page]]==true;Please, be sure to enter a actual number.] 28 | 29 | $let[page;$advancedReplaceText[$checkCondition[$message==];true;1;false;$excludeSpecialChars[$message]]] 30 | $onlyIf[$getGuildVar[levelsystem]==on;Leveling is not enabled currently.] 31 | $cooldown[3s;Slow down! Don't spam the command! 32 | Time remaining: ] 33 | ` 34 | } 35 | -------------------------------------------------------------------------------- /commands/Automation/Awaited/welcomermessages.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "welcomertextmodetest", 3 | type: "awaited", 4 | code: ` 5 | **This is a test welcome message! Please, ignore this.** 6 | $get[content] 7 | 8 | 9 | $useChannel[$getGuildVar[welcomechannel]] 10 | $disableMentionType[roles] 11 | $disableMentionType[everyone]` 12 | },{ 13 | name: "welcomerembedmodetest", 14 | type: "awaited", 15 | code: ` 16 | **This is a test welcome message! Please, ignore this.** 17 | $author[Member joined;$get[serverimage]] 18 | $description[ 19 | $get[content] 20 | ] 21 | $thumbnail[$authorAvatar] 22 | $color[$getGuildVar[welcomemessageembedcolor]] 23 | 24 | $let[serverimage;$advancedReplaceText[$checkCondition[$guildIcon==];false;$guildIcon;true;$userDefaultAvatar[$clientID]]] 25 | 26 | $useChannel[$getGuildVar[welcomechannel]] 27 | $disableMentionType[roles] 28 | $disableMentionType[everyone] 29 | ` 30 | },{ 31 | name: "welcomertextmode", 32 | type: "awaited", 33 | code: ` 34 | $get[content] 35 | 36 | 37 | $useChannel[$getGuildVar[welcomechannel]] 38 | $disableMentionType[roles] 39 | $disableMentionType[everyone]` 40 | },{ 41 | name: "welcomerembedmode", 42 | type: "awaited", 43 | code: ` 44 | $author[Member joined;$get[serverimage]] 45 | $description[ 46 | $get[content] 47 | ] 48 | $thumbnail[$authorAvatar] 49 | $color[$getGuildVar[welcomemessageembedcolor]] 50 | 51 | $let[serverimage;$advancedReplaceText[$checkCondition[$guildIcon==];false;$guildIcon;true;$userDefaultAvatar[$clientID]]] 52 | 53 | $useChannel[$getGuildVar[welcomechannel]] 54 | $disableMentionType[roles] 55 | $disableMentionType[everyone] 56 | ` 57 | }] 58 | -------------------------------------------------------------------------------- /commands/Entertainment/games/flood.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "flood", 3 | info: { 4 | description: "Starts a game of Flood (pass the flag \`--settings\` to open up the settings).", 5 | usage: "`flood (flag)`", 6 | perms: ["`SendMessages`"], 7 | flags: ["`--settings`"] 8 | }, 9 | code: `$ifAwaited[$checkContains[$message;--settings;—settings]==true;{execute:floodsettings};{execute:floodstart}] 10 | 11 | 12 | $cooldown[3s; Slow down! Don't spam the command! 13 | Time remaining: ]` 14 | },{ 15 | name: "floodstart", 16 | type: "awaited", 17 | code: ` 18 | $djsEval[const { Flood } = require('discord-gamecord'); 19 | 20 | const Game = new Flood({ 21 | message: message, 22 | isSlashGame: false, 23 | embed: { 24 | title: 'Flood', 25 | color: '$getVar[embedcolor]', 26 | }, 27 | difficulty: $getGlobalUserVar[flood_difficulty], 28 | timeoutTime: 60000, 29 | buttonStyle: 'SECONDARY', 30 | emojis: ['🟥', '🟦', '🟧', '🟪', '🟩'], 31 | winMessage: 'You won! You took **{turns}** turns.', 32 | loseMessage: 'You lost! You took **{turns}** turns.', 33 | playerOnlyMessage: 'Only {player} can use these buttons.' 34 | }); 35 | 36 | Game.startGame(); 37 | ] 38 | ` 39 | },{ 40 | name: "floodsettings", 41 | type: "awaited", 42 | code: `$title[Flood Settings] 43 | $description[Welcome to Flood settings! To select a option to change, use the dropdown menu below!] 44 | $addField[**Current Setup**; 45 | **Difficulty#COLON#** \`$get[type]\` 46 | ] 47 | $color[$getVar[embedcolor]] 48 | $addSelectMenu[1;string;floodsettings_$authorID;Select a option;1;1;false;Difficulty:How hard the game will be?:flooddifficulty:false] 49 | $let[type;$advancedReplaceText[$getGlobalUserVar[flood_difficulty];18;\`Hard\`;13;\`Normal\`;8;\`Easy\`]] 50 | ` 51 | }] 52 | -------------------------------------------------------------------------------- /commands/Util/prefix-commands.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "prefix", 3 | info: { 4 | description: "View or change current prefix of the bot in this server.", 5 | usage: "`prefix (new prefix)`", 6 | perms: ["`SendMessages`", "`ManageGuild` (when changing prefix)"], 7 | }, 8 | code: ` 9 | $setGuildVar[prefix;$nonEscape[$get[newprefix]]] 10 | Changed prefix from \`$get[oldprefix]\` to \`$get[newprefix]\`. 11 | $onlyIf[$getGuildVar[prefix]!=$nonEscape[$get[newprefix]];This prefix is already in use.] 12 | $onlyIf[$charCount[$nonEscape[$get[newprefix]]]<=5;Prefix can't be longer than 5 characters.] 13 | $let[newprefix;$message] 14 | $let[oldprefix;$getGuildVar[prefix]] 15 | $onlyPerms[manageguild;You do not have \`ManageGuild\` permission to use this.] 16 | $onlyIf[$checkContains[$message;<@;<@!;<@&;<#;@;<#!]==false;Why would i do that? I don't want to disturb people! o(TヘTo)] 17 | $onlyIf[$message!=;Prefix: \`$getGuildVar[prefix]\` 18 | Usage to change prefix: \`$getGuildVar[prefix]$nonEscape[$commandInfo[prefix;info.usage]]\`] 19 | $cooldown[2s; Slow down! Don't spam the command! 20 | Time remaining: ] 21 | ` 22 | },{ 23 | name: "prefix-reset", 24 | info: { 25 | description: "Resets the prefix back to it's default state in this server.", 26 | perms: ["`SendMessages`", "`ManageGuild`"] 27 | }, 28 | aliases: "reset-prefix", 29 | code: `$deleteVar[prefix;$guildID;main] 30 | The prefix has been successfully reset. <3 31 | $onlyIf[$getGuildVar[prefix]!=$getVar[originalprefix];Cannot reset when the prefix is default.] 32 | $onlyPerms[manageguild;You do not have \`ManageGuild\` permission to use this.] 33 | $cooldown[2s; Slow down! Don't spam the command! 34 | Time remaining: ] 35 | ` 36 | }] 37 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/coinflip-interactions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "headsinteraction", 3 | type: "interaction", 4 | $if: "old", 5 | prototype: "button", 6 | code: `$if[$random[1;100]>=38&&$random[1;100]<89] 7 | 8 | $interactionFollowUp[GG, **$username**! The coin landed on **Heads**!] 9 | 10 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button:Heads:3:headsbutton:true}{button:Tails:2:tailsbutton:true}}] 11 | $else 12 | $interactionFollowUp[You lost! The coin landed on **Tails**!] 13 | 14 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button:Heads:4:headsbutton:true}{button:Tails:2:tailsbutton:true}}] 15 | $endif 16 | 17 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 18 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 19 | 20 | 21 | ` 22 | },{ 23 | name: "tailsinteraction", 24 | type: "interaction", 25 | $if: "old", 26 | prototype: "button", 27 | code: `$if[$random[1;100]>=38&&$random[1;100]<89] 28 | 29 | $interactionFollowUp[GG, **$username**! The coin landed on **Tails**!] 30 | 31 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button:Heads:2:headsbutton:true}{button:Tails:3:tailsbutton:true}}] 32 | $else 33 | $interactionFollowUp[You lost! The coin landed on **Hands**!] 34 | 35 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button:Heads:2:headsbutton:true}{button:Tails:4:tailsbutton:true}}] 36 | $endif 37 | 38 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 39 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 40 | 41 | 42 | ` 43 | }] 44 | -------------------------------------------------------------------------------- /commands/Info/serverinfo.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "serverinfo", 3 | info: { 4 | description: "Returns information about this server.", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: ["server", "si", "guild", "guildinfo"], 8 | $if: "old", 9 | code: ` 10 | $author[$guildName;$nonEscape[$get[serverimage]];$nonEscape[$get[serverimage]]] 11 | $title[Server Info] 12 | $addField[Verification Level;$get[verifylevel]] 13 | $addField[Other; 14 | **Created on:** 15 | **Content Filter:** $get[content] 16 | **Server ID:** $guildID 17 | ] 18 | $addField[General; 19 | **Roles:** $roleCount[$guildID;true] 20 | **Emojis:** $emojiCount[$guildID] 21 | **Server Boosts:** $guildBoostCount[$guildID] 22 | **Server owner:** $username[$guildOwnerID] (\`$guildOwnerID\`) 23 | ] 24 | $addField[Channels; 25 | **Total:** $channelCount[$guildID;all] 26 | **Text:** $channelCount[$guildID;Text] 27 | **Voice:** $channelCount[$guildID;Voice] 28 | **Announcement:** $channelCount[$guildID;Announcement] 29 | **Forum:** $channelCount[$guildID;Forum] 30 | **Categories:** $channelCount[$guildID;Category] 31 | ] 32 | $addField[Members; 33 | **Total:** $membersCount[$guildID;all;true] 34 | **Humans:** $membersCount[$guildID;all;false] 35 | **Bots:** $guildBotCount[$guildID] 36 | ] 37 | $thumbnail[$get[serverimage]] 38 | $color[$getVar[embedcolor]] 39 | $if[$guildDescription!=] 40 | $addButton[1;Description;2;viewserverdescription_$authorID;false] 41 | $endif 42 | $cooldown[2s;Slow down! Don't spam the command! 43 | Time remaining: ] 44 | 45 | $let[verifylevel;$advancedReplaceText[$guildVerificationLevel;1;Low;2;Medium;3;High;4;Highest;0;None]] 46 | $let[content;$advancedReplaceText[$guildContentFilter[$guildID];0;Disabled;1;Medium;2;High]] 47 | $let[serverimage;$advancedReplaceText[$checkCondition[$guildIcon==];false;$guildIcon;true;$userDefaultAvatar[$clientID]]] 48 | ` 49 | } 50 | -------------------------------------------------------------------------------- /commands/Main/commandinfo.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | name: "commandinfo", 3 | info: { 4 | description: "The command says it all. What else do you expect?", 5 | usage: "`commandinfo `", 6 | perms: "`SendMessages`" 7 | }, 8 | $if: "old", 9 | aliases: ["cmdinfo", "ci"], 10 | code: `$author[Command info looker;https://us-east-1.tixte.net/uploads/dodo-bot.wants.solutions/search.png] 11 | $title[$commandInfo[$get[cmdname];name]] 12 | $description[$commandInfo[$get[cmdname];info.description]] 13 | $addField[Aliases;$get[aliases]] 14 | $addField[Permission(s);$arrayJoin[perms;, ]] 15 | $addField[Usage;$get[usagechecker]] 16 | $color[$getVar[embedcolor]] 17 | $footer[<> - required parameter | () - optional parameter] 18 | $if[$commandInfo[$toLowerCase[$message];info.flags]!=] 19 | $addButton[1;Flags;2;viewcommandflags_$authorID_$commandInfo[$nonEscape[$get[cmdname]];name];false] 20 | $endif 21 | 22 | $let[aliases;$advancedReplaceText[$checkCondition[$arrayJoin[aliases;, ]==];true;No aliases exists for this command.;false;$arrayJoin[aliases;, ]]] 23 | $createArray[aliases;$nonEscape[$get[aliaseschecker]]] 24 | $let[aliaseschecker;$advancedReplaceText[$nonEscape[$commandInfo[$get[cmdname];aliases]];,;#SEMI#]] 25 | 26 | $createArray[perms;$nonEscape[$get[permschecker]]] 27 | $let[permschecker;$advancedReplaceText[$nonEscape[$commandInfo[$get[cmdname];info.perms]];,;#SEMI#]] 28 | 29 | $let[usagechecker;$advancedReplaceText[$checkCondition[$commandInfo[$get[cmdname];info.usage]==];true;Has no parameters.;false;$commandInfo[$get[cmdname];info.usage]]] 30 | 31 | $onlyIf[$commandInfo[$get[cmdname];info.dev]==;Viewing Developer commands is unsupported.] 32 | $onlyIf[$commandExists[$get[cmdname]]==true;The command specified does not appear to exist. Try entering a command that exists within the bot itself.] 33 | $let[cmdname;$toLowerCase[$message]] 34 | $onlyIf[$message!=;Enter a command name to view it's information about.] 35 | $cooldown[2s;Slow down! Don't spam the command! 36 | Time remaining: ]` 37 | } 38 | -------------------------------------------------------------------------------- /commands/Entertainment/games/trivia.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "trivia", 3 | info: { 4 | description: "Starts a random Trivia game (pass the flag \`--settings\` to open up the settings).", 5 | usage: "`trivia (flag)`", 6 | perms: ["`SendMessages`"], 7 | flags: ["`--settings`"] 8 | }, 9 | aliases: "triv", 10 | code: `$ifAwaited[$checkContains[$message;--settings;—settings]==true;{execute:triviasettings};{execute:triviastart}] 11 | 12 | $cooldown[4s; Slow down! Don't spam the command! 13 | Time remaining: ]` 14 | },{ 15 | name: "triviastart", 16 | type: "awaited", 17 | code: `$djsEval[const { Trivia } = require('discord-gamecord'); 18 | 19 | const Game = new Trivia({ 20 | message: message, 21 | isSlashGame: false, 22 | embed: { 23 | title: 'Trivia', 24 | color: '$getVar[embedcolor]', 25 | description: 'You have 60 seconds to guess the answer.' 26 | }, 27 | timeoutTime: 60000, 28 | buttonStyle: 'SECONDARY', 29 | trueButtonStyle: 'SUCCESS', 30 | falseButtonStyle: 'DANGER', 31 | mode: '$getGlobalUserVar[trivia_type]', 32 | difficulty: '$getGlobalUserVar[trivia_difficulty]', 33 | winMessage: 'You won! The correct answer is {answer}.', 34 | loseMessage: 'You lost! The correct answer is {answer}.', 35 | errMessage: 'Unable to fetch question data! Please try again.', 36 | playerOnlyMessage: 'Only {player} can use these buttons.' 37 | }); 38 | 39 | Game.startGame(); 40 | ]` 41 | },{ 42 | name: "triviasettings", 43 | type: "awaited", 44 | code: `$title[Trivia Settings] 45 | $description[Welcome to Trivia settings! To select a option to change, use the dropdown menu below!] 46 | $addField[**Current Setup**; 47 | **Type#COLON#** \`$toLocaleUpperCase[$getGlobalUserVar[trivia_type]]\` 48 | **Difficulty#COLON#** \`$toLocaleUpperCase[$getGlobalUserVar[trivia_difficulty]]\` 49 | ] 50 | $color[$getVar[embedcolor]] 51 | $addSelectMenu[1;string;triviasettings_$authorID;Select a option;1;1;false;Type:How the game should start?:triviatype:false;Difficulty:How hard the game will be?:triviadifficulty:false]` 52 | }] 53 | 54 | -------------------------------------------------------------------------------- /commands/Entertainment/games/hangman.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "hangman", 3 | info: { 4 | description: "Starts a hangman game (pass the flag \`--themes\` to change the current theme).", 5 | usage: "`hangman (flag)`", 6 | perms: ["`SendMessages`"], 7 | flags: ["`--themes`", "`--settings` (alias)"] 8 | }, 9 | aliases: "hm", 10 | code: `$ifAwaited[$checkContains[$message;--themes;—themes;--settings;—settings]==true;{execute:hangmansettings};{execute:hangmanstart}] 11 | 12 | $cooldown[4s; Slow down! Don't spam the command! 13 | Time remaining: ] 14 | ` 15 | },{ 16 | name: "hangmanstart", 17 | type: "awaited", 18 | code: ` 19 | $djsEval[const { Hangman } = require('discord-gamecord'); 20 | 21 | const Game = new Hangman({ 22 | message: message, 23 | isSlashGame: false, 24 | embed: { 25 | title: 'Hangman', 26 | color: '$getVar[embedcolor]' 27 | }, 28 | hangman: { hat: '🎩', head: '😟', shirt: '👕', pants: '🩳', boots: '👞👞' }, 29 | customWord: null, 30 | timeoutTime: 60000, 31 | theme: '$getGlobalUserVar[hangman_theme]', 32 | winMessage: 'You won! The word was {word}.', 33 | loseMessage: 'You lost! The word was {word}.', 34 | playerOnlyMessage: 'Only {player} can use these buttons.' 35 | }); 36 | 37 | Game.startGame(); 38 | ]` 39 | },{ 40 | name: "hangmansettings", 41 | type: "awaited", 42 | code: `$title[Hangman Themes] 43 | $description[Welcome to Hangman Themes! To select a theme to use, use the dropdown menu below!] 44 | $addField[**Current theme**; 45 | * \`$toLocaleUpperCase[$getGlobalUserVar[hangman_theme]]\` 46 | ] 47 | $color[$getVar[embedcolor]] 48 | $addSelectMenu[1;string;hangmansettings_$authorID;Select a theme;1;1;false;Nature:Sets the theme to Nature-related:nature:false;Sport:Sets the theme to Sport-related:sport:false;Color:Sets the theme to Color-related:color:false;Camp:Sets the theme to Camp-related:camp:false;Fruit:Sets the theme to Fruit-related:fruit:false;Discord:Sets the theme to Discord-related:discord:false;Winter:Sets the theme to Winter-related:winter:false;Pokemon:Sets the theme to Pokemon-related:pokemon:false]` 49 | }] 50 | -------------------------------------------------------------------------------- /commands/Entertainment/games/gtp.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "guess-the-pokemon", 3 | info: { 4 | description: "Starts a game of guessing a Pokemon character. (currently disabled)", 5 | perms: ["`SendMessages`"] 6 | }, 7 | aliases: "gtp", 8 | code: `$awaitMessages[$channelID;$authorID;60s;everything;gtpawaited;{execute:gtptimeout}] 9 | $editMessage[$get[id];{attachment:question-image.png:$getObjectProperty[api;data.questionImage]} 10 | {newEmbed:{author:$username:$authorAvatar}{title: Who's the Pokemon?}{field:Types:$djsEval[$getObjectProperty[api;data.types].join(", ");true]:true}{field:Abilities:$djsEval[$getObjectProperty[api;data.abilities].join(", ");true]:true}{image:attachment://question-image.png}{color:$getVar[embedcolor]}}] 11 | 12 | $createObject[api;$nonEscape[$get[jsonresponse]]] 13 | $let[id;$sendMessage[Please wait...;true]] 14 | $onlyIf[$isValidObject[$nonEscape[$get[jsonresponse]]]==true;$get[error]] 15 | $let[jsonresponse;$httpRequest[https://api.gamecord.xyz/pokemon;GET;;;$get[error]]] 16 | $let[error;Unable to fetch Pokemon data. Please try again later.] 17 | $onlyIf[disabled!=disabled;This command has been temporarily disabled due to issues.] 18 | $cooldown[5s; Slow down! Don't spam the command! 19 | Time remaining: ] 20 | ` 21 | }, 22 | { 23 | name: "gtptimeout", 24 | type: "awaited", 25 | code: ` 26 | $editMessage[$get[id];Better luck next time! It was a $getObjectProperty[api;data.name].] 27 | ` 28 | }, 29 | { 30 | name: "gtpawaited", 31 | type: "awaited", 32 | $if: "old", 33 | code: ` 34 | $if[$message[1]==$getObjectProperty[api;data.name]] 35 | $editMessage[$get[id];You guessed it right! It was a $getObjectProperty[api;data.name]. {attachment:answer-image.png:$getObjectProperty[api;data.answerImage]} 36 | {newEmbed:{author:$username:$authorAvatar}{title: Who's the Pokemon?}{field:Types:$djsEval[$getObjectProperty[api;data.types].join(", ");true]:true}{field:Abilities:$djsEval[$getObjectProperty[api;data.abilities].join(", ");true]:true}{image:attachment://answer-image.png}{color:$getVar[embedcolor]}}] 37 | $else 38 | $editMessage[$get[id];Better luck next time! It was a $getObjectProperty[api;data.name].] 39 | $endif 40 | ` 41 | }] 42 | -------------------------------------------------------------------------------- /commands/Main/version.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "version", 3 | info: { 4 | description: "Returns the current version of Dodo-Bot (with it's changelog).", 5 | usage: "`version (flag)`", 6 | perms: "`SendMessages`", 7 | flags: ["`--buildinfo`"] 8 | }, 9 | aliases: ["ver", "changelog", "updates"], 10 | $if: "old", 11 | code: `$ifAwaited[$checkContains[$message;--buildinfo;—buildinfo]==true;{execute:versionbuildinfo};{execute:currentversion}] 12 | 13 | 14 | $cooldown[2s; Slow down! Don't spam the command! 15 | Time remaining: ] 16 | ` 17 | },{ 18 | name: "currentversion", 19 | $if: "old", 20 | type: "awaited", 21 | code: `$title[Dodo-Bot version] 22 | $description[ 23 | * **Version**: $getVar[version]$get[Revision] 24 | * **Release type**: $getVar[release_type] 25 | * **$get[releasedatetype]**: 26 | ] 27 | $color[$getVar[embedcolor]] 28 | $if[$getVar[pre_release]==on] 29 | $footer[Testing is recommended;https://us-east-1.tixte.net/uploads/dodogames.wants.solutions/refreshedredwarning2.png] 30 | $endif 31 | $addButton[2;Changelog history;5;https://github.com/ddodogames/Dodo-Bot/releases;false;📜] 32 | $addButton[1;Other;2;versionother_$authorID;false] 33 | $addButton[1;Bug Fixes;2;versionbugfixes_$authorID;false] 34 | $addButton[1;Changes;2;versionchanges_$authorID;false] 35 | 36 | $let[Revision;$advancedReplaceText[$checkCondition[$getVar[buildRevision]!=0];true; (Revision $getVar[buildRevision]);false; ]] 37 | $let[releasedatetype;$advancedReplaceText[$checkCondition[$getVar[showbuildinfo]==on];true;Last updated on;false;Released on]] 38 | ` 39 | },{ 40 | name: "versionbuildinfo", 41 | type: "awaited", 42 | code: `$title[Build Info] 43 | $addField[Progress; 44 | $getVar[buildStatus] 45 | ;true] 46 | $addField[General; 47 | * **Dodo-Bot**: v$getVar[version] 48 | * **Codename**: $getVar[versionCodename] 49 | * **Build Branch**: [**$getVar[buildBranch]**](https://github.com/ddodogames/Dodo-Bot/tree/$getVar[buildBranch]) 50 | * **Build number**: $getVar[buildNumber] 51 | * **Revision**: $getVar[buildRevision] 52 | ;true] 53 | $color[$getVar[embedcolor]] 54 | 55 | $onlyIf[$getVar[showbuildinfo]==on;Viewing build information is currently unavailable.] 56 | ` 57 | }] 58 | -------------------------------------------------------------------------------- /commands/Automation/Awaited/game-timeouts.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "rpstimeout", 3 | type: "awaited", 4 | code: ` 5 | 6 | $editMessage[$get[messageID]; 7 | Game has been ended due to inactivity. 8 | {newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}} 9 | 10 | {actionRow:{button:Rock:2:rpsrockbutton:true:🌑}{button:Paper:2:rpspaperbutton:true:📰}{button:Scissors:2:rpsscissorsbutton:true:✂️}};$channelID] 11 | 12 | $let[embeddescription;$getEmbed[$channelID;$get[messageID];1;description]] 13 | $let[embedtitle;$getEmbed[$channelID;$get[messageID];1;title]] 14 | 15 | $onlyIf[$messageExists[$get[messageID];$channelID]==true;] 16 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;sendmessages;viewchannel]==true;] 17 | $onlyIf[$guildChannelExists[$guildID;$channelID]==true;] 18 | ` 19 | },{ 20 | name: "ftftimeout", 21 | type: "awaited", 22 | code: ` 23 | 24 | $editMessage[$get[messageID]; 25 | Game has been ended due to inactivity. 26 | {newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}} 27 | 28 | {actionRow:{button::2:ftf1:true:1️⃣}{button::2:ftf2:true:2️⃣}{button::2:ftf3:true:3️⃣}};$channelID] 29 | 30 | $let[embeddescription;$getEmbed[$channelID;$get[messageID];1;description]] 31 | $let[embedtitle;$getEmbed[$channelID;$get[messageID];1;title]] 32 | 33 | $onlyIf[$messageExists[$get[messageID];$channelID]==true;] 34 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;sendmessages;viewchannel]==true;] 35 | $onlyIf[$guildChannelExists[$guildID;$channelID]==true;] 36 | ` 37 | },{ 38 | name: "coinfliptimeout", 39 | type: "awaited", 40 | code: ` 41 | 42 | $editMessage[$get[messageID]; 43 | Game has been ended due to inactivity. 44 | {newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}} 45 | 46 | {actionRow:{button:Heads:2:headsbutton:true}{button:Tails:2:tailsbutton:true}};$channelID] 47 | 48 | 49 | $let[embeddescription;$getEmbed[$channelID;$get[messageID];1;description]] 50 | $let[embedtitle;$getEmbed[$channelID;$get[messageID];1;title]] 51 | 52 | $onlyIf[$messageExists[$get[messageID];$channelID]==true;] 53 | $onlyIf[$hasPermsInChannel[$channelID;$clientID;sendmessages;viewchannel]==true;] 54 | $onlyIf[$guildChannelExists[$guildID;$channelID]==true;] 55 | ` 56 | }] 57 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/rps-oneplayer-interactions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "rpsgameresults1", 3 | type:"interaction", 4 | prototype: "button", 5 | code:` 6 | $interactionFollowUp[{newEmbed:{title:Results!}{description:You choose Rock 🌑! I choose $get[botchosenoption]!}{color:Yellow}}] 7 | 8 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button:Rock:2:rpsrockbutton:true:🌑}{button:Paper:2:rpspaperbutton:true:📰}{button:Scissors:2:rpsscissorsbutton:true:✂️}}] 9 | 10 | 11 | $let[botchosenoption;$randomText[Rock 🌑;Paper 📰;Scissors ✂️]] 12 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 13 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 14 | 15 | ` 16 | },{ 17 | name: "rpsgameresults2", 18 | type:"interaction", 19 | prototype: "button", 20 | code:` 21 | 22 | $interactionFollowup[{newEmbed:{title:Results!}{description:You choose Paper 📰! I choose $get[botchosenoption]!}{color:Yellow}}] 23 | 24 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button:Rock:2:rpsrockbutton:true:🌑}{button:Paper:2:rpspaperbutton:true:📰}{button:Scissors:2:rpsscissorsbutton:true:✂️}}] 25 | 26 | 27 | $let[botchosenoption;$randomText[Rock 🌑;Paper 📰;Scissors ✂️]] 28 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 29 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 30 | ` 31 | },{ 32 | name: "rpsgameresults3", 33 | type:"interaction", 34 | prototype: "button", 35 | code:` 36 | 37 | $interactionFollowup[{newEmbed:{title:Results!}{description:You choose Scissors ✂️! I choose $get[botchosenoption]!}{color:Yellow}}] 38 | 39 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button:Rock:2:rpsrockbutton:true:🌑}{button:Paper:2:rpspaperbutton:true:📰}{button:Scissors:2:rpsscissorsbutton:true:✂️}}] 40 | 41 | 42 | $let[botchosenoption;$randomText[Rock 🌑;Paper 📰;Scissors ✂️]] 43 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 44 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 45 | 46 | 47 | ` 48 | }] 49 | -------------------------------------------------------------------------------- /commands/Automation/Others/Systems/userappsupport.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "Userapps support", 3 | type: "clientReady", 4 | code: `$ifAwaited[$getVar[userapps]==true;{execute:createuserapps}]` 5 | },{ 6 | name: "createuserapps", 7 | type: "awaited", 8 | code: ` 9 | $createApplicationCommand[global;randomcolor;Returns a random color that you can use.;sendmessages;user;all;slash] 10 | $createApplicationCommand[global;invite;Returns a link to invite the bot;sendmessages;user;all;slash] 11 | $createApplicationCommand[global;report;Returns a link to report issues on Dodo-Bot's GitHub repo;sendmessages;user;all;slash] 12 | $createApplicationCommand[global;about;Returns information about Dodo-Bot;sendmessages;user;all;slash] 13 | $createApplicationCommand[global;ping;Returns the bot's Latency;sendmessages;user;all;slash] 14 | 15 | 16 | $createApplicationCommand[global;banner;Returns your/users profile banner.;sendmessages;user;all;slash;[ 17 | { 18 | "type": 6, 19 | "name": "user", 20 | "description": "User to select to view banner", 21 | "required": false 22 | } 23 | ]] 24 | 25 | 26 | $createApplicationCommand[global;avatar;Returns your/users profile picture.;sendmessages;user;all;slash;[ 27 | { 28 | "type": 6, 29 | "name": "user", 30 | "description": "User to select to view avatar", 31 | "required": false 32 | } 33 | ]] 34 | 35 | 36 | $createApplicationCommand[global;reverse;Let's you reverse text!;sendmessages;user;all;slash;[ 37 | { 38 | "type": 3, 39 | "name": "text", 40 | "description": "Text to reverse", 41 | "required": true 42 | } 43 | ]] 44 | 45 | $createApplicationCommand[global;owoify;Makes text OWOifed;sendmessages;user;all;slash;[ 46 | { 47 | "type": 3, 48 | "name": "text", 49 | "description": "Text to owoify", 50 | "required": true 51 | } 52 | ]] 53 | 54 | $createApplicationCommand[global;8ball;Ask a question to 8ball;sendmessages;user;all;slash;[ 55 | { 56 | "type": 3, 57 | "name": "question", 58 | "description": "The question to ask 8ball about", 59 | "required": true 60 | } 61 | ]] 62 | 63 | $djsEval[const chalk = require('chalk') 64 | 65 | console.log(chalk.green("Successfully created user apps! Add the bot to your Discord account to see them!")) 66 | ] 67 | 68 | $setVar[isuserappsalreadysetup;yes] 69 | $onlyIf[$getVar[isuserappsalreadysetup]==no;]` 70 | }] 71 | -------------------------------------------------------------------------------- /handlers/variables.js: -------------------------------------------------------------------------------- 1 | const config = require("../config.js"); 2 | 3 | module.exports = { 4 | "main": { // This is "table" name, tables can be managed by checking index.js under "tables:" line 5 | // Game variables 6 | trivia_type: "multiple", 7 | trivia_difficulty: "medium", 8 | flood_difficulty: 13, 9 | wyr: {upvotes: 0, downvotes: 0}, 10 | hangman_theme: "nature", 11 | // Main variables (do not touch) 12 | autopingreply: "off", 13 | includebots: "on", 14 | version: "2.2.6", 15 | versionCodename: "Fiery Stars", 16 | libraryversiondevcheck: "off", 17 | buildStatus: "Complete", 18 | buildDate: "1764781801179", 19 | buildBranch: "v2", 20 | buildRevision: "0", 21 | showbuildinfo: "off", 22 | buildNumber: "2223", 23 | embedcolor: config.Embedcolor, 24 | originalembedcolor: config.Embedcolor, 25 | release_type: "Stable", 26 | DevReleaseTypeToSet: "Canary", 27 | prefix: config.prefix, 28 | originalprefix: config.prefix, 29 | // Feature variables 30 | suggestionchannel: "none", 31 | pollchannel: "none", 32 | welcomemessage: "Welcome to the server, !", 33 | welcomechannel: "none", 34 | welcometype: "text", 35 | welcomemessageembedcolor: "#1F8B4C", 36 | welcomesystem: "off", 37 | leavechannel: "none", 38 | leavesystem: "off", 39 | leavetype: "text", 40 | leavemessageembedcolor: "#ED4245", 41 | leavemessage: "Goodbye ! We now have members left!", 42 | msglogdeletedchannel: "none", 43 | msglogeditchannel: "none", 44 | banneduserschannel: "none", 45 | unbanneduserschannel: "none", 46 | Integrationchannel: "none", 47 | anonymous: "off", 48 | levelsystem: "off", 49 | level: "1", 50 | previouslevel: "0", 51 | xp: "0", 52 | xpLimit: "10", 53 | levelupmessage: " has leveled UP! Their level is now !", 54 | levelupmessagechannel: "none", 55 | levelupmessagefeature: "off", 56 | levelleaveonreset: "off", 57 | islevelingreset: "no", 58 | levelingexcludedchannels: "none", 59 | levelingexcludedcategories: "none", 60 | // Developer & other variables 61 | errorchannel: "none", 62 | errorsystem: "off", 63 | startupchannel: "none", 64 | startupchannelsystem: "off", 65 | pre_release: "off", 66 | botinvitationmessage: "on", 67 | servermemberrequirement: "0", 68 | userapps: config.EnableUserApps, 69 | isuserappsalreadysetup: "no", 70 | errorsdisabled: config.DisableAllErrors 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /commands/Entertainment/games/rps.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "rock-paper-scissors", 3 | info: { 4 | description: "Play rps with your opponent (or optionally play against yourself)!", 5 | usage: "`rock-paper-scissors `", 6 | perms: ["`SendMessages`"] 7 | }, 8 | aliases: "rps", 9 | code: `$ifAwaited[$mentioned[1;false]==$authorID;{execute:rpsoneplayer};{execute:rpstwoplayer}] 10 | 11 | 12 | $onlyIf[$isBot[$mentioned[1;true]]==false;You cannot play with bots!] 13 | $onlyIf[$mentioned[1;false]!=undefined;Please mention a opponent to play with! 14 | 15 | **Tip:** Want to play against yourself? Mention yourself to do so! 16 | ] 17 | $cooldown[3s; Slow down! Don't spam the command! 18 | Time remaining: ] 19 | ` 20 | },{ 21 | name: "rpsoneplayer", 22 | type: "awaited", 23 | code: ` 24 | $awaitComponents[$channelID;$get[messageID];$authorID;rpsrockbutton,rpspaperbutton,rpsscissorsbutton;rpsgameresults1,rpsgameresults2,rpsgameresults3;rpstimeout;1;30s] 25 | 26 | $let[messageID;$sendMessage[{newEmbed:{title:Rock Paper Scissors}{description:The game has started!, What will you choose?}{color:$getVar[embedcolor]}} 27 | 28 | {actionRow:{button:Rock:2:rpsrockbutton:false:🌑}{button:Paper:2:rpspaperbutton:false:📰}{button:Scissors:2:rpsscissorsbutton:false:✂️}} 29 | ;true]] 30 | ` 31 | },{ 32 | name: "rpstwoplayer", 33 | type: "awaited", 34 | code: `$djsEval[const { RockPaperScissors } = require('discord-gamecord'); 35 | 36 | const Game = new RockPaperScissors({ 37 | message: message, 38 | isSlashGame: false, 39 | opponent: message.mentions.users.first(), 40 | embed: { 41 | title: "Rock Paper Scissors", 42 | color: "$getVar[embedcolor]", 43 | description: "Press a button below to make a choice." 44 | }, 45 | buttons: { 46 | rock: "Rock", 47 | paper: "Paper", 48 | scissors: "Scissors" 49 | }, 50 | emojis: { 51 | rock: "🌑", 52 | paper: "📰", 53 | scissors: "✂️" 54 | }, 55 | mentionUser: true, 56 | timeoutTime: 60000, 57 | buttonStyle: "SECONDARY", 58 | pickMessage: "You choose {emoji}.", 59 | winMessage: "**{player}** won the Game! Congratulations!", 60 | tieMessage: "The Game tied! No one won the Game!", 61 | timeoutMessage: "The Game went unfinished! No one won the Game!", 62 | playerOnlyMessage: "Only {player} and {opponent} can use these buttons." 63 | }); 64 | 65 | Game.startGame() 66 | ]` 67 | }] 68 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { AoiClient } = require("aoi.js"); // Define aoi.js client 2 | const config = require("./config.js"); // Load the setup options from config 3 | require('@dotenvx/dotenvx').config({path: ['.env.local', '.env'], ignore: ['MISSING_ENV_FILE'], strict: false, quiet: true, opsOff: true}) // Enable env support in local hosting 4 | 5 | // Needed for variables handler 6 | const vars = require('./handlers/variables.js'); 7 | 8 | 9 | // Setting up Client 10 | const client = new AoiClient({ 11 | token: process.env.BotToken || config.BotToken, // Enter the bot token either via env or config 12 | prefix: "$getGuildVar[prefix]", // By default, it uses custom prefix system (default prefix used: d!). 13 | intents: ["MessageContent", "Guilds", "GuildMessages", "GuildMembers", "GuildPresences", "GuildModeration", "GuildEmojisAndStickers"], // Discord.js intents (v14) 14 | events: ["onMessage", "onInteractionCreate", "onJoin", "onLeave", "onMessageDelete", "onMessageUpdate", "onBanAdd", "onBanRemove", "onGuildJoin", "onFunctionError"], // Setup aoi.js events 15 | aoiLogs: false, // Don't show aoi.js default console message 16 | aoiWarning: false, // Disable aoi.js update warning 17 | aoiAutoUpdate: false, // Do not autoupdate aoi.js (this is dealt with via new Dodo-Bot releases instead) 18 | database: { // Use aoi.db as the default database for storing data 19 | type: "aoi.db", 20 | db: require("@aoijs/aoi.db"), 21 | dbType: "KeyValue", 22 | tables: ["main"], // Tables for the database, "main" is used for everything by default. 23 | securityKey: config.DBsecurityKey || process.env.DBsecurityKey // Security Key with either config or env 24 | }, 25 | disableFunctions: ["$clientToken"], // For safety reasons 26 | mobilePlatform: config.MobileStatus, // Whether or not to enable mobile status 27 | debugs: { 28 | interpreter: config.EnableDebugMode // Whether or not to enable aoi.js debug mode 29 | }, 30 | respondOnEdit: { 31 | commands: config.respondOnEdit.Enabled, // Whether or not to enable responding to edited messages 32 | time: config.respondOnEdit.RespondUntil // Time limit for responding to edited messages before they become ignored. 33 | }, 34 | suppressAllErrors: config.DisableAllErrors // Whether or not to disable errors from aoi.js 35 | }); 36 | 37 | 38 | // Handlers 39 | client.loadCommands("./commands/", config.LogCommands); 40 | 41 | Object.keys(vars).forEach((t) => 42 | client.variables(vars[t], t) 43 | ) 44 | 45 | client.functionManager.createFunction(...require('./handlers/functions.js')) 46 | 47 | 48 | -------------------------------------------------------------------------------- /commands/Automation/Events/moderation-logs.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "Ban Logs", 3 | type: "banAdd", 4 | channel: "$getGuildVar[banneduserschannel]", 5 | code: ` 6 | $author[Member banned!;$userAvatar;$userAvatar] 7 | $description[ 8 | **$get[accounttype]:** $username <@$authorID> 9 | **Moderator:** $get[moderatorchecker] 10 | **Reason:** $get[reason] 11 | ] 12 | $footer[ID: $authorID] 13 | $addTimeStamp 14 | $color[Red] 15 | $let[moderatorchecker;$advancedReplaceText[$checkCondition[$isBot[$get[staff]]==false&&$getGuildVar[anonymous]==on];true;Unknown;false;$username[$get[staff]] <@$get[staff]>]] 16 | $let[reason;$advancedReplaceText[$checkCondition[$getAuditLogs[$guildID;;1;22;{reason}]==null];true;none;false;$getAuditLogs[$guildID;;1;22;{reason}]]] 17 | $let[staff;$getAuditLogs[$guildID;;1;22;{executor.id}]] 18 | $let[accounttype;$advancedReplaceText[$checkCondition[$isBot==true];true;Bot;false;User]] 19 | $onlyIf[$hasPerms[$guildID;$clientID;viewauditlog]==true;In order to have ban logs work, i must have \`ViewAuditLog\` permission!] 20 | $onlyIf[$hasPermsInChannel[$getGuildVar[banneduserschannel];$clientID;viewchannel;sendmessages]==true;] 21 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[banneduserschannel]]==true;] 22 | $onlyIf[$getGuildVar[banneduserschannel]!=none;] 23 | $onlyIf[$guildID==$guildID;] 24 | ` 25 | },{ 26 | name: "Un-Ban Logs", 27 | type: "banRemove", 28 | channel: "$getGuildVar[unbanneduserschannel]", 29 | code: `$author[Member unbanned!;$userAvatar;$userAvatar] 30 | $description[ 31 | **$get[accounttype]:** $username <@$authorID> 32 | **Moderator:** $get[moderator] $if[$getAuditLogs[$guildID;;1;23;{reason}]!=null; 33 | **Reason:** $getAuditLogs[$guildID;;1;23;{reason}] 34 | ] 35 | ] 36 | $footer[ID: $authorID] 37 | $addTimeStamp 38 | $color[DarkGreen] 39 | $let[moderator;$username[$get[staff]] <@$get[staff]>] 40 | $let[staff;$getAuditLogs[$guildID;;1;23;{executor.id}]] 41 | $let[accounttype;$advancedReplaceText[$checkCondition[$isBot==true];true;Bot;false;User]] 42 | $onlyIf[$hasPerms[$guildID;$clientID;viewauditlog]==true;In order to have un-ban logs work, i must have \`ViewAuditLog\` permission!] 43 | $onlyIf[$hasPermsInChannel[$getGuildVar[unbanneduserschannel];$clientID;viewchannel;sendmessages]==true;] 44 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[unbanneduserschannel]]==true;] 45 | $onlyIf[$getGuildVar[unbanneduserschannel]!=none;] 46 | $onlyIf[$guildID==$guildID;] 47 | 48 | ` 49 | }] 50 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/wyr-interactions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "wyr1-votebutton", 3 | type: "interaction", 4 | $if: "old", 5 | prototype: "button", 6 | code: `$interactionUpdate[{newEmbed:{title:Would you rather...}{field:**Option 1**:$get[question1]}{field:**Option 2**:$get[question2]}{color:$getVar[embedcolor]}}{actionRow:{button:$getObjectProperty[wyrdata;upvotes]:2:wyr1-votebutton:false:1️⃣}{button:$getObjectProperty[wyrdata;downvotes]:2:wyr2-votebutton:false:2️⃣}}] 7 | 8 | 9 | $setMessageVar[wyr;$getObject[wyrdata];$interactionData[message.id]] 10 | $setObjectProperty[wyrdata;upvotes;$sum[$getObjectProperty[wyrdata;upvotes];1]] 11 | $createObject[wyrdata;$getMessageVar[wyr;$interactionData[message.id]]] 12 | 13 | $setMessageVar[wyr_hasuservoted_$authorID;true;$interactionData[message.id]] 14 | 15 | $onlyIf[$getMessageVar[wyr_hasuservoted_$authorID;$interactionData[message.id]]==false; 16 | You have already voted. 17 | {interaction} 18 | {ephemeral} 19 | ] 20 | 21 | $let[question2;$getEmbed[$channelID;$interactionData[message.id];1;field2.value]] 22 | $let[question1;$getEmbed[$channelID;$interactionData[message.id];1;field1.value]] 23 | $if[$isVariableExist[wyr_hasuservoted_$authorID;main]==false] 24 | $createTemporaryVar[main;wyr_hasuservoted_$authorID:false] 25 | $endif` 26 | },{ 27 | name: "wyr2-votebutton", 28 | type: "interaction", 29 | $if: "old", 30 | prototype: "button", 31 | code: `$interactionUpdate[{newEmbed:{title:Would you rather...}{field:**Option 1**:$get[question1]}{field:**Option 2**:$get[question2]}{color:$getVar[embedcolor]}}{actionRow:{button:$getObjectProperty[wyrdata;upvotes]:2:wyr1-votebutton:false:1️⃣}{button:$getObjectProperty[wyrdata;downvotes]:2:wyr2-votebutton:false:2️⃣}}] 32 | 33 | 34 | $setMessageVar[wyr;$getObject[wyrdata];$interactionData[message.id]] 35 | $setObjectProperty[wyrdata;downvotes;$sum[$getObjectProperty[wyrdata;downvotes];1]] 36 | $createObject[wyrdata;$getMessageVar[wyr;$interactionData[message.id]]] 37 | 38 | $setMessageVar[wyr_hasuservoted_$authorID;true;$interactionData[message.id]] 39 | 40 | $onlyIf[$getMessageVar[wyr_hasuservoted_$authorID;$interactionData[message.id]]==false; 41 | You have already voted. 42 | {interaction} 43 | {ephemeral} 44 | ] 45 | 46 | $let[question2;$getEmbed[$channelID;$interactionData[message.id];1;field2.value]] 47 | $let[question1;$getEmbed[$channelID;$interactionData[message.id];1;field1.value]] 48 | $if[$isVariableExist[wyr_hasuservoted_$authorID]==false] 49 | $createTemporaryVar[main;wyr_hasuservoted_$authorID:false] 50 | $endif` 51 | }] 52 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/findtheflag-interactions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "ftfresults1", 3 | type:"interaction", 4 | prototype: "button", 5 | $if: "old", 6 | code:` 7 | $if[$random[1;100]>=38&&$random[1;100]<89] 8 | $interactionFollowUp[{newEmbed:{title:You found the flag!}{description:Nice guess, the flag was on zone 1! 🏳️}{color:DarkGreen}}] 9 | 10 | 11 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button::3:ftf1:true:🏳️}{button::2:ftf2:true:2️⃣}{button::2:ftf3:true:3️⃣}}] 12 | 13 | $else 14 | $interactionFollowUp[{newEmbed:{title:Aww.. miss!}{description:Wrong guess... the flag was on zone $randomText[2;3]. 🏴}{color:Red}}] 15 | 16 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button::4:ftf1:true:1️⃣}{button::2:ftf2:true:2️⃣}{button::2:ftf3:true:3️⃣}}] 17 | 18 | $endif 19 | 20 | 21 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 22 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 23 | 24 | ` 25 | },{ 26 | name: "ftfresults2", 27 | type:"interaction", 28 | prototype: "button", 29 | $if: "old", 30 | code:` 31 | $if[$random[1;100]>=38&&$random[1;100]<89] 32 | 33 | $interactionFollowup[{newEmbed:{title:You found the flag!}{description:Nice guess, the flag was on zone 2! 🏳️}{color:DarkGreen}}] 34 | 35 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button::2:ftf1:true:1️⃣}{button::3:ftf2:true:🏳️}{button::2:ftf3:true:3️⃣}}] 36 | 37 | $else 38 | 39 | $interactionFollowup[{newEmbed:{title:Aww.. miss!}{description:Wrong guess... the flag was on zone $randomText[1;3]. 🏴}{color:Red}}] 40 | 41 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button::2:ftf1:true:1️⃣}{button::4:ftf2:true:2️⃣}{button::2:ftf3:true:3️⃣}}] 42 | 43 | 44 | $endif 45 | 46 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 47 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 48 | ` 49 | },{ 50 | name: "ftfresults3", 51 | type:"interaction", 52 | prototype: "button", 53 | $if: "old", 54 | code:` 55 | $if[$random[1;100]>=38&&$random[1;100]<89] 56 | 57 | $interactionFollowup[{newEmbed:{title:You found the flag!}{description:Nice guess, the flag was on zone 3! 🏳️}{color:DarkGreen}}] 58 | 59 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button::2:ftf1:true:1️⃣}{button::2:ftf2:true:2️⃣}{button::3:ftf3:true:🏳️}}] 60 | 61 | $else 62 | 63 | $interactionFollowup[{newEmbed:{title:Aww.. miss!}{description:Wrong guess... the flag was on zone $randomText[1;2]. 🏴}{color:Red}}] 64 | 65 | $interactionUpdate[{newEmbed:{title:$get[embedtitle]}{description:$get[embeddescription]}{color:$getVar[embedcolor]}}{actionRow:{button::2:ftf1:true:1️⃣}{button::2:ftf2:true:2️⃣}{button::4:ftf3:true:3️⃣}}] 66 | 67 | 68 | $endif 69 | 70 | $let[embeddescription;$getEmbed[$channelID;$interactionData[message.id];1;description]] 71 | $let[embedtitle;$getEmbed[$channelID;$interactionData[message.id];1;title]] 72 | 73 | 74 | ` 75 | }] 76 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/userinfo-interactions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | type: "interaction", 3 | prototype: "button", 4 | code: ` 5 | $interactionUpdate[{newEmbed:{author:Server information:$nonEscape[$get[serverimage]]}{title:Information for $get[username]}{url:$nonEscape[$userURL[$get[user]]]}{field:**General**: 6 | * **Joined the server on#COLON#** 7 | * **Booster#COLON#** $get[boosterchecker] 8 | * **Status#COLON#** $userStatus[$guildID;$get[user]] 9 | :true}{field:**Roles**: 10 | * **Total amount of roles#COLON#** $userRolesCount[$get[user];$guildID] 11 | * **Highest Role#COLON#** $get[highestrole] 12 | * **Lowest Role#COLON#** $get[lowestrole] 13 | :true}{thumbnail:$userAvatar[$get[user]]}{color:$getVar[embedcolor]}}{actionRow:{button:General info:2:mainmeminfo_$authorID_$get[user]:false}{button:Member's Server info:2:memberservinfo_$authorID_$get[user]:true}}] 14 | 15 | 16 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$get[user]]==false];true;$username[$get[user]];false;$userTag[$get[user]]]] 17 | $let[lowestrole;$advancedReplaceText[$checkCondition[$userLowestRole[$get[user];$guildID]==$guildID];true;None;false;$roleName[$userLowestRole[$get[user];$guildID]]]] 18 | $let[highestrole;$advancedReplaceText[$checkCondition[$userHighestRole[$get[user];$guildID;id]==$guildID];true;None;false;$userHighestRole[$get[user];$guildID;name]]] 19 | $let[serverimage;$advancedReplaceText[$checkCondition[$guildIcon==];false;$guildIcon;true;$userDefaultAvatar[$clientID]]] 20 | $let[boosterchecker;$advancedReplaceText[$checkCondition[$isBoosting[$get[user];$guildID]==true];true;Yes;false;No]] 21 | 22 | $onlyIf[$memberExists[$get[user];$guildID]==true; 23 | The user appears to have left the server. The ablity to view their server information has been temporarily disabled until they re-join again 24 | {ephemeral} 25 | {interaction} 26 | ] 27 | 28 | $let[user;$advancedTextSplit[$interactionData[customId];_;3]] 29 | 30 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 31 | {ephemeral} 32 | {interaction} 33 | ] 34 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==memberservinfo;] 35 | 36 | ` 37 | },{ 38 | type: "interaction", 39 | prototype: "button", 40 | code: ` 41 | $interactionUpdate[{newEmbed:{title:Information for $get[username]}{url:$nonEscape[$userURL[$get[user]]]}{field:**General**: 42 | * **Joined Discord on#COLON#** 43 | * **Bot account#COLON#** $get[botchecker] 44 | * **ID#COLON#** $get[user] 45 | :true}{field:**Other**: 46 | * **Avatar#COLON#** [link]($userAvatar[$get[user]]) 47 | * **DMs#COLON#** $get[userdms] 48 | :true}{thumbnail:$userAvatar[$get[user]]}{color:$getVar[embedcolor]}}{actionRow:{button:General info:2:mainmeminfo_$authorID_$get[user]:true}{button:Member's Server info:2:memberservinfo_$authorID_$get[user]:false}}] 49 | 50 | 51 | 52 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$get[user]]==false];true;$username[$get[user]];false;$userTag[$get[user]]]] 53 | $let[botchecker;$advancedReplaceText[$checkCondition[$isBot[$get[user]]==true];true;Yes;false;No]] 54 | $let[userdms;$advancedReplaceText[$checkCondition[$isUserDmEnabled[$get[user]]==true];true;Enabled;false;Disabled]] 55 | 56 | $let[user;$advancedTextSplit[$interactionData[customId];_;3]] 57 | 58 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 59 | {ephemeral} 60 | {interaction} 61 | ] 62 | 63 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==mainmeminfo;] 64 | 65 | ` 66 | }] 67 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/credits-interactions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | type: "interaction", 3 | prototype: "button", 4 | code: `$interactionUpdate[{newEmbed:{title:Packages used}{description: 5 | Some stuff in Dodo-Bot were made possible using certain packages. This page aims to credit all of the packages to respect their owners.}{field:Packages: 6 | * **aoi.js** - The entire bot basically. Dodo-Bot is made using aoi.js! 7 | * **@aoijs/aoi.db** - Database used in the bot 8 | * **discord-gamecord** - Mostly used in game commands such as \`minesweeper\`, \`snake\`, etc. 9 | * **chalk** - For colored texts on console especially the bot's custom message 10 | * **@dotenvx/dotenvx** - Adds support for environment variables in local hosting 11 | }{color:$getVar[embedcolor]}}{actionRow:{button:Main Credits:2:maincredits_$authorID:false}{button:Packages used:2:packagesused_$authorID:true}{button:Use of source code:2:useofsource_$authorID:false}}] 12 | 13 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 14 | {ephemeral} 15 | {interaction} 16 | ] 17 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==packagesused;] 18 | ` 19 | },{ 20 | type: "interaction", 21 | prototype: "button", 22 | code: `$interactionUpdate[{newEmbed:{title:Dodo-Bot Credits}{description: 23 | * $username[632607624742961153] - Developer of the bot 24 | * $username[431749535656837130] - Inspiration to improve some commands 25 | * $username[738856854892839022] - For Leveling setup 26 | * $username[769525910164471821] - For \`guess-the-pokemon\` code (and some ideas as well) 27 | * aoi.js server - For a lot of help 28 | * [discotools.xyz](https#COLON#//discotools.xyz/icons-editor) - For most of the icons used in commands 29 | }{color:$getVar[embedcolor]}}{actionRow:{button:Main Credits:2:maincredits_$authorID:true}{button:Packages used:2:packagesused_$authorID:false}{button:Use of source code:2:useofsource_$authorID:false}}] 30 | 31 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 32 | {ephemeral} 33 | {interaction} 34 | ] 35 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==maincredits;] 36 | ` 37 | },{ 38 | type: "interaction", 39 | prototype: "button", 40 | code: `$interactionUpdate[{newEmbed:{title:Use of source code}{description: 41 | When using the source code for development purposes, it is recommended to give credits to the original work done on the bot itself, which can be done by including the username \`dodogames\` in your project. 42 | 43 | **For public bots** 44 | It is not recommended to claim that you fully made the bot yourself and even advertise it to the public. It is fine if you used the source code but then made it different that doesn't result in being too smiliar to the original bot. 45 | 46 | A modified instance of Dodo-Bot should be normally allowed as long as the credit for the original work is included (or when permission is given to do so). 47 | 48 | **For private bots** 49 | The rule of using the source code is not strict in this case. If it's used to try the bot then you do not need to do anything. You may give credit if the said private bot was designed for a server in case of modifying it. 50 | }{color:$getVar[embedcolor]}}{actionRow:{button:Main Credits:2:maincredits_$authorID:false}{button:Packages used:2:packagesused_$authorID:false}{button:Use of source code:2:useofsource_$authorID:true}}] 51 | 52 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 53 | {ephemeral} 54 | {interaction} 55 | ] 56 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==useofsource;] 57 | ` 58 | }] 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dodo-bot 2 | A personal bot project made in aoi.js v6 aiming to both entertain and provide users some features to use. 3 | 4 | # What does it include? 5 | * Simple leveling system 6 | * Fun commands (Text, Images and Games like tictactoe for example) 7 | * Welcomer/Leave system 8 | * Suggestion and Polls 9 | * Logging Setup (like ban logs) 10 | 11 | # It's no longer multi-purpose? 12 | When I first started the Dodo-Bot Project, I thought everything was easy, but I was wrong. Maintaining Dodo-Bot v1 was absolutely painful, since you have to fix the APIs not working in the commands most of the time, which can be pretty annoying if there is only one person working on a huge bot project. 13 | 14 | As time went on, I began to lose interest in maintaining the bot since I was busy with school and such. Eventually, I discontinued v1, meaning that it won't be updated anymore. However, as days went on, I began to think about changing the purpose of the bot to be much easier for my development. And so, this is how v2 was officially brought back to life—started from scratch and no longer being multi-purpose but at least a fun bot. 15 | 16 | One of the main reasons for the inevitable death of v1 is that too many features were planned at the time. I did not know how to create them in the right way, which resulted in the first version of the bot for Aoi getting buggier and buggier with each new update eventually giving up on maintaining it. This also includes creating commands using APIs without figuring out how to handle some errors, along with many other reasons. 17 | 18 | # History of v2 19 | v2 was supposed to be based on discord.js, but due to some issues, it has been made to use aoi.js v6. Even though almost every release of Dodo-Bot was bugged with a lot of bugs (including early releases of v1). This version aims to make everything as simple as it was before. 20 | 21 | This version of the bot is likely made for you to learn as well as enjoy it; it's probably the first aoi.js v6 bot to be open-sourced here. Note that I'm trying my best to make this a stable release as much as possible, but at least you get to try the new stuff v2 has in store for you! 22 | 23 | # Versions 24 | * **[V1](https://github.com/ddodogames/Dodo-Bot/tree/v1)**: The discontinued version of Dodo-Bot. It had a bad start with bunch of bugs due to me being newbie in aoi.js at the time. 25 | * **[V2 (current)](https://github.com/ddodogames/Dodo-Bot/tree/v2)**: The current version of the bot, maintained with lot of bug fixes and has alright features. 26 | * **[V3](https://github.com/ddodogames/Dodo-Bot/tree/v3)**: Intended to try out aoi.js v7. Currently on pause. 27 | * **[canary](https://github.com/ddodogames/Dodo-Bot/tree/canary)**: Development builds of v2. Not recommended for public use. More information can be found [here](https://ddodogames.github.io/dodo-bot-site/advanced/canary/). 28 | * **[canary-rebase](https://github.com/ddodogames/Dodo-Bot/tree/canary-rebase)**: Development builds of Rebase. Not recommended for public use just like pre-release builds of v2. 29 | * **[rebase](https://github.com/ddodogames/Dodo-Bot/tree/rebase)**: ForgeScript version of the bot. It's mostly made as a emergency build. 30 | # Requirements 31 | You can host Dodo-Bot on any hosting as long as the following Requirements are met: 32 | * Node.js v20 and later is required as older versions are not supported 33 | * A host ready to handle Bot's Features (obviously) 34 | 35 | # Configuration 36 | Dodo-Bot allows you to change some options before turning it on. To do this, check out the `config.js` file present in the source code itself which contains available options to change from! 37 | 38 | # Credits 39 | Most of code belongs to me (besides the ones credited in credits command). You can also credit me using my discord username: "dodogames". 40 | 41 | In case of using my code for development purposes, you may agree to not claim that you made the bot; otherwise, I may ask you for credit. Further information about the use of source code is explained in the credits command. 42 | -------------------------------------------------------------------------------- /commands/Util/suggestion-commands.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "suggest-set", 3 | info: { 4 | description: "Setup suggestions.", 5 | usage: "`suggest-set `", 6 | perms: ["`SendMessages`", "`ManageChannels`"], 7 | }, 8 | aliases: "suggestion-set", 9 | code: ` 10 | $setGuildVar[suggestionchannel;$get[channeltarget]] 11 | Successfully set <#$get[channeltarget]> as the suggestion channel! 12 | $onlyIf[$hasPermsInChannel[$get[channeltarget];$clientID;sendmessages;viewchannel;addreactions]==true;Hmm. Seems like i don't have permissions there, please ensure that i have the following for this channel: 13 | \`ViewChannel\` 14 | \`SendMessages\` 15 | \`AddReactions\` 16 | ] 17 | $onlyIf[$get[channeltarget]!=$getGuildVar[suggestionchannel];You already have set this channel for Suggestions. Please mention a different one instead.] 18 | $onlyIf[$checkContains[$channelType[$get[channeltarget]];text;announcement]==true;You must set either Text or Announcement channel as a Suggestion channel to use Suggestions feature.] 19 | $onlyIf[$guildChannelExists[$guildID;$get[channeltarget]]==true;Either you have not specified a channel, or the channel exists outside of this server. Please mention a valid channel.] 20 | 21 | $let[channeltarget;$findGuildChannel[$message;false]] 22 | $onlyIf[$message!=;Please set an channel. 23 | Usage: $commandInfo[suggest-set;info.usage] 24 | ] 25 | $onlyPerms[managechannels;You do not have \`ManageChannels\` permission to use this.] 26 | $cooldown[3s; Slow down! Don't spam the command! 27 | Time remaining: ] 28 | ` 29 | },{ 30 | name: "suggest-reset", 31 | info: { 32 | description: "Reset current channel used for suggestions.", 33 | perms: ["`SendMessages`", "`ManageChannels`"] 34 | }, 35 | code: `$deleteVar[suggestionchannel;$guildID;main] 36 | Successfully reset suggestion channel! Run \`suggest-set\` to set a channel again. 37 | $onlyIf[$getGuildVar[suggestionchannel]!=none;There is no channel set to reset.] 38 | $onlyPerms[managechannels;You do not have \`ManageChannels\` permission to use this.] 39 | $cooldown[3s; Slow down! Don't spam the command! 40 | Time remaining: ]` 41 | },{ 42 | name: "suggest", 43 | info: { 44 | description: "Starts a suggestion in this server (if the feature is setup).", 45 | usage: "`suggest `", 46 | perms: ["`SendMessages`", "`AddReactions`"] 47 | }, 48 | code: ` 49 | $author[Suggestion by $username;$userAvatar;$userURL[$authorID]] 50 | $title[$splitText[1]] 51 | $description[$splitText[2]] 52 | $footer[Suggestion created since] 53 | $addTimestamp 54 | $color[$getVar[embedcolor]] 55 | $addClientReactions[⬆️;⬇️] 56 | $sendMessage[Successfully sent your suggestion to <#$getGuildVar[suggestionchannel]>!] 57 | $useChannel[$getGuildVar[suggestionchannel]] 58 | $onlyIf[$hasPermsInChannel[$getGuildVar[suggestionchannel];$clientID;sendmessages;viewchannel;addreactions]==true;Hmm. Seems like i don't have the right permissions there. For server staff members, please ensure that i have the following for the channel <#$getGuildVar[suggestionchannel]>: 59 | \`ViewChannel\` 60 | \`SendMessages\` 61 | \`AddReactions\` 62 | ] 63 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[suggestionchannel]]==true;Hmm. the channel set for the Suggestion system seems to be deleted. The system will not function until a new channel is set from \`suggest-set\`.] 64 | $onlyIf[$getGuildVar[suggestionchannel]!=none;Hmm. There is no channel used to send Suggestion currently. 65 | For staff server, please run \`suggest-set\` to set a channel. 66 | ] 67 | $onlyIf[$charCount[$splitText[1]]<=160||$charCount[$splitText[2]]<=3950;You can only add up to 160 characters for a title and 3950 characters for a description of the suggestion.] 68 | $onlyIf[$or[$splitText[1]==;$splitText[2]==]==false;Hey there! Your usage seems to be wrong. Make sure it's correct 69 | 70 | A example of usage should be something like $commandInfo[suggest;info.usage].] 71 | $textSplit[$message;/] 72 | $cooldown[4s;Slow down! Don't spam the command! 73 | Time remaining: <t:$truncate[$divide[$sum[$getCooldownTime[4s;user;suggest;$authorID];$dateStamp];1000]]:R>] 74 | ` 75 | }] 76 | -------------------------------------------------------------------------------- /commands/Util/poll-commands.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "poll-set", 3 | info: { 4 | description: "Setup polls.", 5 | usage: "`poll-set <channel-name/channel ID or mention>`", 6 | perms: ["`SendMessages`", "`ManageChannels`"] 7 | }, 8 | aliases: ["set-poll", "setpoll", "pollset"], 9 | code: ` 10 | $setGuildVar[pollchannel;$get[channeltarget]] 11 | Successfully set <#$get[channeltarget]> as the Poll channel! 12 | 13 | $onlyIf[$hasPermsInChannel[$get[channeltarget];$clientID;sendmessages;viewchannel;addreactions]==true;Hmm. Seems like i don't have permissions there, please ensure that i have the following for this channel: 14 | \`ViewChannel\` 15 | \`SendMessages\` 16 | \`AddReactions\` 17 | ] 18 | $onlyIf[$get[channeltarget]!=$getGuildVar[pollchannel];You already have set this channel for Polls. Please mention a different one instead.] 19 | $onlyIf[$checkContains[$channelType[$get[channeltarget]];text;announcement]==true;You must set either Text or Announcement channel as a Poll channel to use Polls feature.] 20 | 21 | $onlyIf[$guildChannelExists[$guildID;$get[channeltarget]]==true; 22 | Either you have not specified a channel, or the channel exists outside of this server. Please mention a valid channel. 23 | ] 24 | 25 | $let[channeltarget;$findGuildChannel[$message;false]] 26 | $onlyIf[$message!=;Mention an channel or enter the channel id.] 27 | $onlyPerms[managechannels;You do not have \`ManageChannels\` permission to use this.] 28 | $cooldown[5s; Slow down! Don't spam the command! 29 | Time remaining: <t:$truncate[$divide[$sum[$getCooldownTime[5s;user;poll-set;$authorID];$dateStamp];1000]]:R>] 30 | ` 31 | },{ 32 | name: "poll-reset", 33 | info: { 34 | description: "Reset current channel used for Polls.", 35 | perms: ["`SendMessages`", "`ManageChannels`"] 36 | }, 37 | aliases: ["reset-pollchannel", "resetpoll", "reset-poll", "pollreset"], 38 | code: `$deleteVar[pollchannel;$guildID;main] 39 | Successfully reset Poll channel! Run \`suggest-set\` to set a channel again. 40 | $onlyIf[$getGuildVar[pollchannel]!=none;There is no channel to reset currently.] 41 | $onlyPerms[managechannels;You do not have \`ManageChannels\` permission to use this.] 42 | $cooldown[2s; Slow down! Don't spam the command! 43 | Time remaining: <t:$truncate[$divide[$sum[$getCooldownTime[2s;user;poll-reset;$authorID];$dateStamp];1000]]:R>] 44 | ` 45 | },{ 46 | name: "poll", 47 | info: { 48 | description: "Start a poll in this server (if setup).", 49 | usage: "`poll content/choice 1/choice 2`", 50 | perms: ["`SendMessages`", "`ManageMessages`", "`AddReactions`"], 51 | }, 52 | aliases: ["createpoll", "startpoll"], 53 | code: ` 54 | 55 | $author[Poll by $username;$userAvatar;$userURL[$authorID]] 56 | $description[$splitText[1] 57 | 58 | 1️⃣: **$splitText[2]** 59 | 60 | 2️⃣: **$splitText[3]** 61 | ] 62 | $footer[Poll started since] 63 | $addTimestamp 64 | $color[$getVar[embedcolor]] 65 | $addClientReactions[1️⃣;2️⃣] 66 | $sendMessage[Successfully sent your Poll to <#$getGuildVar[pollchannel]>!] 67 | $useChannel[$getGuildVar[pollchannel]] 68 | $onlyIf[$hasPermsInChannel[$getGuildVar[pollchannel];$clientID;sendmessages;viewchannel;addreactions]==true;Hmm. Seems like i don't have the right permissions there. For server staff members, please ensure that i have the following for the channel <#$getGuildVar[pollchannel]>: 69 | \`ViewChannel\` 70 | \`SendMessages\` 71 | \`AddReactions\` 72 | ] 73 | $onlyIf[$guildChannelExists[$guildID;$getGuildVar[pollchannel]]==true;Hmm. The channel set for the Poll system seems to be deleted. The system will not function until a new channel is set through the \`poll-set\` command.] 74 | $onlyIf[$getGuildVar[pollchannel]!=none;Hmm. There is no channel used to start a new Poll currently. 75 | For staff server, please run \`poll-set\` to set a channel. 76 | ] 77 | $onlyIf[$charCount[$splitText[1]]<=3570||$charCount[$splitText[2]]<=200||$charCount[$splitText[3]]<=200;Your Poll content cannot be longer than 3570 characters. Choice 1 and Choice 2 cannot also be longer than 200 characters] 78 | $onlyIf[$or[$splitText[1]==;$splitText[2]==;$splitText[3]==]==false;Hey there! Your usage seems to be incorrect. 79 | 80 | A example of a usage should be $commandInfo[poll;info.usage]] 81 | $textSplit[$message;/] 82 | $onlyPerms[managemessages;You need to have \`ManageMessages\` permission to use this.] 83 | $cooldown[5s; Slow down! Don't spam the command! 84 | Time remaining: <t:$truncate[$divide[$sum[$getCooldownTime[5s;user;poll;$authorID];$dateStamp];1000]]:R>] 85 | ` 86 | }] 87 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/version-interactions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | type: "interaction", 3 | prototype: "button", 4 | code: ` 5 | $interactionUpdate[{newEmbed:{title:Changes}{description: 6 | * Added \`couldread\` command 7 | * (Devs only) Added a way to easily refresh member cache of all servers 8 | * (Devs only) Allow deleting user apps directly through a command 9 | * Added alias \`h\` for \`help\` 10 | }{color:$getVar[embedcolor]}$nonEscape[$get[devbuild]]}{actionRow:{button:Home:2:homebutton_$authorID:false:🏠}{button:Changes:2:versionchanges_$authorID:true}{button:Bug Fixes:2:versionbugfixes_$authorID:false}{button:Other:2:versionother_$authorID:false}}{actionRow:{button:Changelog history:5:https#COLON#//github.com/ddodogames/Dodo-Bot/releases:false:📜}}] 11 | 12 | $let[devbuild;$if[$getVar[pre_release]==on;{footer:Testing is recommended:https#COLON#//us-east-1.tixte.net/uploads/dodogames.wants.solutions/refreshedredwarning2.png};]] 13 | 14 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 15 | {ephemeral} 16 | {interaction} 17 | ] 18 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==versionchanges;] 19 | ` 20 | },{ 21 | type: "interaction", 22 | prototype: "button", 23 | code: ` 24 | $interactionUpdate[{newEmbed:{title:Bug Fixes}{description: 25 | * (Devs only) Fixed inconsistent description of "Show build info" option in \`dev-panel\` 26 | * Made \`wyr\` command work again 27 | * The error message when the command fails is also now less confusing 28 | }{color:$getVar[embedcolor]}$nonEscape[$get[devbuild]]}{actionRow:{button:Home:2:homebutton_$authorID:false:🏠}{button:Changes:2:versionchanges_$authorID:false}{button:Bug Fixes:2:versionbugfixes_$authorID:true}{button:Other:2:versionother_$authorID:false}}{actionRow:{button:Changelog history:5:https#COLON#//github.com/ddodogames/Dodo-Bot/releases:false:📜}}] 29 | 30 | $let[devbuild;$if[$getVar[pre_release]==on;{footer:Testing is recommended:https#COLON#//us-east-1.tixte.net/uploads/dodogames.wants.solutions/refreshedredwarning2.png};]] 31 | 32 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 33 | {ephemeral} 34 | {interaction} 35 | ] 36 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==versionbugfixes;] 37 | ` 38 | },{ 39 | type: "interaction", 40 | prototype: "button", 41 | code: `$interactionUpdate[{newEmbed:{title:Other}{description: 42 | * Temporarily disable \`guess-the-pokemon\` command (as it stopped working) 43 | * The "Cpu" part in \`stats\` command now also counts host's cpu resources 44 | * (Source code) Bumped \`@dotenvx/dotenvx\` to version \`1.51.1\` 45 | }{color:$getVar[embedcolor]}$nonEscape[$get[devbuild]]}{actionRow:{button:Home:2:homebutton_$authorID:false:🏠}{button:Changes:2:versionchanges_$authorID:false}{button:Bug Fixes:2:versionbugfixes_$authorID:false}{button:Other:2:versionother_$authorID:true}}{actionRow:{button:Changelog history:5:https#COLON#//github.com/ddodogames/Dodo-Bot/releases:false:📜}}] 46 | 47 | $let[devbuild;$if[$getVar[pre_release]==on;{footer:Testing is recommended:https#COLON#//us-east-1.tixte.net/uploads/dodogames.wants.solutions/refreshedredwarning2.png};]] 48 | 49 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 50 | {ephemeral} 51 | {interaction} 52 | ] 53 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==versionother;] 54 | 55 | 56 | ` 57 | },{ 58 | type: "interaction", 59 | prototype: "button", 60 | code: `$interactionUpdate[{newEmbed:{title:Dodo-Bot version}{description: 61 | * **Version**#COLON# $getVar[version]$get[Revision] 62 | * **Release type**#COLON# $getVar[release_type] 63 | * **$get[releasedatetype]**#COLON# <t:$truncate[$divide[$getVar[buildDate];1000]]:f> 64 | }{color:$getVar[embedcolor]}$nonEscape[$get[devbuild]]}{actionRow:{button:Changes:2:versionchanges_$authorID:false}{button:Bug Fixes:2:versionbugfixes_$authorID:false}{button:Other:2:versionother_$authorID:false}}{actionRow:{button:Changelog history:5:https#COLON#//github.com/ddodogames/Dodo-Bot/releases:false:📜}}] 65 | 66 | $let[Revision;$advancedReplaceText[$checkCondition[$getVar[buildRevision]!=0];true; (Revision $getVar[buildRevision]);false; ]] 67 | $let[releasedatetype;$advancedReplaceText[$checkCondition[$getVar[showbuildinfo]==on];true;Last updated on;false;Released on]] 68 | $let[devbuild;$if[$getVar[pre_release]==on;{footer:Testing is recommended:https#COLON#//us-east-1.tixte.net/uploads/dodogames.wants.solutions/refreshedredwarning2.png};]] 69 | 70 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 71 | {ephemeral} 72 | {interaction} 73 | ] 74 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==homebutton;] 75 | 76 | 77 | ` 78 | }] 79 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons/viewbuttons.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | type: "interaction", 3 | prototype: "button", 4 | code: `$interactionReply[{newEmbed:{title:Flags of this command}{description:The following flags are available for this command#COLON# 5 | 6 | $arrayJoin[flags;, ] 7 | }{color:$getVar[embedcolor]}};all;true] 8 | 9 | $createArray[flags;$nonEscape[$get[flagschecker]]] 10 | $let[flagschecker;$advancedReplaceText[$nonEscape[$commandInfo[$get[cmdname];info.flags]];,;#SEMI#]] 11 | 12 | $let[cmdname;$advancedTextSplit[$interactionData[customId];_;3]] 13 | 14 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 15 | {ephemeral} 16 | {interaction} 17 | ] 18 | 19 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==viewcommandflags;] 20 | ` 21 | },{ 22 | type: "interaction", 23 | prototype: "button", 24 | code: `$interactionReply[{newEmbed:{title:Description}{description:This server's description reads#COLON# 25 | 26 | $guildDescription 27 | }{color:$getVar[embedcolor]}};all;true] 28 | 29 | $onlyIf[$guildDescription!=; 30 | No description has been found for this server. 31 | {ephemeral} 32 | {interaction} 33 | ] 34 | 35 | 36 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 37 | {ephemeral} 38 | {interaction} 39 | ] 40 | 41 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==viewserverdescription;] 42 | ` 43 | },{ 44 | type: "interaction", 45 | prototype: "button", 46 | code: `$interactionReply[{newEmbed:{title:Permissions of this bot}{description:**$username[$get[botID]]** has the following permissions#COLON# 47 | 48 | \`\`\`$toLocaleUpperCase[$userPerms[$get[botID];, ;$guildID]]\`\`\` 49 | }{color:$getVar[embedcolor]}} 50 | 51 | {actionRow:{button:Uncompact:2:permsuncompactbutton_$get[botID]:false}};all;true] 52 | 53 | $onlyIf[$userPerms[$get[botID];, ;$guildID]!=; 54 | This bot does not seem to have any permissions added to it. 55 | {ephemeral} 56 | {interaction} 57 | ] 58 | 59 | $onlyIf[$memberExists[$get[botID];$guildID]==true; 60 | This bot is no longer in this server. 61 | {ephemeral} 62 | {interaction} 63 | ] 64 | 65 | $let[botID;$advancedTextSplit[$interactionData[customId];_;2]] 66 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==viewbotpermsbutton;] 67 | ` 68 | },{ 69 | type: "interaction", 70 | prototype: "button", 71 | code: `$interactionUpdate[{newEmbed:{title:Permissions of this bot}{description:**$username[$get[botID]]** has the following permissions#COLON# 72 | 73 | 74 | $autoList[$nonEscape[$get[permslist]];, ;autoListText] 75 | }{color:$getVar[embedcolor]}} 76 | 77 | {actionRow:{button:Compact:2:permscompactbutton_$get[botID]:false}}] 78 | 79 | $let[permslist;$toLocaleUpperCase[$userPerms[$get[botID];, ;$guildID]]] 80 | 81 | $onlyIf[$userPerms[$get[botID];, ;$guildID]!=; 82 | This bot does not seem to have any permissions added to it. 83 | {ephemeral} 84 | {interaction} 85 | ] 86 | 87 | $onlyIf[$memberExists[$get[botID];$guildID]==true; 88 | This bot is no longer in this server. 89 | {ephemeral} 90 | {interaction} 91 | ] 92 | 93 | $let[botID;$advancedTextSplit[$interactionData[customId];_;2]] 94 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==permsuncompactbutton;] 95 | ` 96 | },{ 97 | type: "interaction", 98 | prototype: "button", 99 | code: `$interactionUpdate[{newEmbed:{title:Permissions of this bot}{description:**$username[$get[botID]]** has the following permissions#COLON# 100 | 101 | 102 | \`\`\`$toLocaleUpperCase[$userPerms[$get[botID];, ;$guildID]]\`\`\` 103 | }{color:$getVar[embedcolor]}} 104 | 105 | {actionRow:{button:Uncompact:2:permsuncompactbutton_$get[botID]:false}}] 106 | 107 | $onlyIf[$userPerms[$get[botID];, ;$guildID]!=; 108 | This bot does not seem to have any permissions added to it. 109 | {ephemeral} 110 | {interaction} 111 | ] 112 | 113 | $onlyIf[$memberExists[$get[botID];$guildID]==true; 114 | This bot is no longer in this server. 115 | {ephemeral} 116 | {interaction} 117 | ] 118 | 119 | $let[botID;$advancedTextSplit[$interactionData[customId];_;2]] 120 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==permscompactbutton;] 121 | ` 122 | },{ 123 | type: "interaction", 124 | prototype: "button", 125 | code: `$interactionReply[{newEmbed:{title:Why this exists?}{description:Administrator permission is generally dangerous and should only be given to people you trust. It is always a good idea to only select the required permissions, which is why \`perms\` command exists to raise awareness about this. 126 | 127 | This is also to reduce the chances of raiding in case the bot gets hacked by having less dangerous permissions. 128 | }{color:$getVar[embedcolor]}};all;true] 129 | 130 | 131 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 132 | {ephemeral} 133 | {interaction} 134 | ] 135 | 136 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==whynoadminperm;] 137 | ` 138 | }] 139 | 140 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons & SelectMenus/helpmenu.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | type: "interaction", 3 | prototype: "selectMenu", 4 | code: `$interactionUpdate[{newEmbed:{title:Main}{field:**General commands**:\`ping\`, \`commandinfo\`, \`perms\`, \`settings\`}{field:**Bot related**:\`stats\`, \`version\`, \`invite\`, \`credits\`, \`about\`, \`report\`, \`canary\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:helpmenu_$authorID:Select a module:1:1:false:{stringInput:Main:main:Explore commands from Main module:false}{stringInput:Entertainment:entertainment:Explore commands from Entertainment module:false}{stringInput:Leveling:leveling:Explore commands from Leveling module:false}{stringInput:Util:util:Explore commands from Util module:false}$nonEscape[$get[devmodule]]}}] 5 | 6 | $let[devmodule;$if[$checkContains[$clientOwnerIDs[| ];$authorID]==true;{stringInput:Developer:dev:Explore commands from Developer module:false};]] 7 | 8 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 9 | {ephemeral} 10 | {interaction} 11 | ] 12 | $onlyIf[$getSelectMenuValues[all]==main;] 13 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==helpmenu;]` 14 | },{ 15 | type: "interaction", 16 | prototype: "selectMenu", 17 | code: `$interactionUpdate[{newEmbed:{title:Entertainment}{field:**Games**:\`ftf\`, \`rps\`, \`snake\`, \`matchpairs\`, \`2048\`, \`flood\`, \`minesweeper\`, \`trivia\`, \`c4\`, \`findemoji\`, \`coinflip\`, \`gtp\`, \`wordle\`, \`hangman\`}{field:**Text**:\`say\`, \`howgamer\`, \`fact\`, \`yesorno\`, \`whoasked\`, \`owoify\`, \`mock\`, \`lulcat\`, \`reverse\`, \`randomtopic\`, \`clap\`, \`8ball\`, \`joke\`}{field:**Images**:\`ad\`, \`comment\`, \`clown\`, \`couldread\`, \`gun\`, \`nokia\`, \`pet\`, \`jail\`, \`drip\`, \`invert\`, \`wanted\`, \`whereiseveryone\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:helpmenu_$authorID:Select a module:1:1:false:{stringInput:Main:main:Explore commands from Main module:false}{stringInput:Entertainment:entertainment:Explore commands from Entertainment module:false}{stringInput:Leveling:leveling:Explore commands from Leveling module:false}{stringInput:Util:util:Explore commands from Util module:false}$nonEscape[$get[devmodule]]}}] 18 | 19 | $let[devmodule;$if[$checkContains[$clientOwnerIDs[| ];$authorID]==true;{stringInput:Developer:dev:Explore commands from Developer module:false};]] 20 | 21 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 22 | {ephemeral} 23 | {interaction} 24 | ] 25 | $onlyIf[$getSelectMenuValues[all]==entertainment;] 26 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==helpmenu;] 27 | ` 28 | },{ 29 | type: "interaction", 30 | prototype: "selectMenu", 31 | code: `$interactionUpdate[{newEmbed:{title:Util}{field:**Management**:\`prefix\`, \`reset-prefix\`, \`setup-logs\`, \`suggest-set\`, \`suggest-reset\`, \`poll-set\`, \`poll-reset\`, \`welcomer\`, \`leave\` }{field:**Info**:\`serverinfo\`, \`userinfo\`}{field:**Miscellaneous**:\`avatar\`, \`banner\`, \`suggest\`, \`morse\`, \`periodic-table\`, \`randomcolor\`, \`poll\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:helpmenu_$authorID:Select a module:1:1:false:{stringInput:Main:main:Explore commands from Main module:false}{stringInput:Entertainment:entertainment:Explore commands from Entertainment module:false}{stringInput:Leveling:leveling:Explore commands from Leveling module:false}{stringInput:Util:util:Explore commands from Util module:false}$nonEscape[$get[devmodule]]}}] 32 | 33 | $let[devmodule;$if[$checkContains[$clientOwnerIDs[| ];$authorID]==true;{stringInput:Developer:dev:Explore commands from Developer module:false};]] 34 | 35 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 36 | {ephemeral} 37 | {interaction} 38 | ] 39 | $onlyIf[$getSelectMenuValues[all]==util;] 40 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==helpmenu;] 41 | ` 42 | },{ 43 | type: "interaction", 44 | prototype: "selectMenu", 45 | code: ` 46 | 47 | $interactionUpdate[{newEmbed:{title:Leveling}{field:**Commands**: \`leveling\`, \`rank\`, \`leaderboard\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:helpmenu_$authorID:Select a module:1:1:false:{stringInput:Main:main:Explore commands from Main module:false}{stringInput:Entertainment:entertainment:Explore commands from Entertainment module:false}{stringInput:Leveling:leveling:Explore commands from Leveling module:false}{stringInput:Util:util:Explore commands from Util module:false}$nonEscape[$get[devmodule]]}}] 48 | 49 | $let[devmodule;$if[$checkContains[$clientOwnerIDs[| ];$authorID]==true;{stringInput:Developer:dev:Explore commands from Developer module:false};]] 50 | 51 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 52 | {ephemeral} 53 | {interaction} 54 | ] 55 | $onlyIf[$getSelectMenuValues[all]==leveling;] 56 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==helpmenu;] 57 | ` 58 | },{ 59 | type: "interaction", 60 | prototype: "selectMenu", 61 | code: ` 62 | 63 | $interactionUpdate[{newEmbed:{title:Developer}{field:**Tools**:\`eval\`, \`jseval\`, \`refreshuserapps\`, \`deleteuserapps\`, \`serverlist\`, \`readfile\`, \`exec\`, \`refreshmembercache\`, \`update\`}{field:**Management**:\`dev-panel\`, \`shutdown\`, \`setcustomstatus\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:helpmenu_$authorID:Select a module:1:1:false:{stringInput:Main:main:Explore commands from Main module:false}{stringInput:Entertainment:entertainment:Explore commands from Entertainment module:false}{stringInput:Leveling:leveling:Explore commands from Leveling module:false}{stringInput:Util:util:Explore commands from Util module:false}$nonEscape[$get[devmodule]]}}] 64 | 65 | $let[devmodule;$if[$checkContains[$clientOwnerIDs[| ];$authorID]==true;{stringInput:Developer:dev:Explore commands from Developer module:false};]] 66 | 67 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 68 | {ephemeral} 69 | {interaction} 70 | ] 71 | $onlyIf[$getSelectMenuValues[all]==dev;] 72 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==helpmenu;] 73 | ` 74 | }] 75 | -------------------------------------------------------------------------------- /handlers/functions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | name: "$dodoAvatar", 3 | type: "aoi.js", 4 | params: [], 5 | code: `$userAvatar[632607624742961153]` 6 | },{ 7 | name: "$clientAvatar", 8 | type: "aoi.js", 9 | params: [], 10 | code: `$userAvatar[$clientID]` 11 | },{ 12 | name: "$randomTopic", 13 | type: "aoi.js", 14 | params: [], 15 | code: `$randomText[Did you go out today?;What did you eat today?;What are you currently worried about?;What game have you spent the most hours playing?;What game have you spent the most hours playing?;What movie can you watch over and over without ever getting tired of?;What are you interested in that most people aren't?;How do you judge a person?;What do you think you are much better at than you actually are?;Do you enjoy spicy food?;Do you usually get bored most of the time?;What do you think about technology?;What do you think about AI?]` 16 | },{ 17 | name: "$8ballanswers", 18 | type: "aoi.js", 19 | params: [], 20 | code: `$randomText[Yes;No;Yes definitely;You may rely on it;Without a doubt;It is decidedly so;Ask again later;Better not tell you now;Cannot predict now;Concentrate and ask again;My reply is no;My sources say no;Outlook not so good;Very doubtful;Most likely;As I see it, yes;Signs point to yes;Reply hazy, try again;Don’t count on it]` 21 | },{ 22 | name: "$hasUserTag", 23 | type: "aoi.js", 24 | params: ["userID"], 25 | code: `$checkCondition[$charCount[$discriminator[$get[userInput]]]!=1] 26 | 27 | $let[userInput;{userID}]` 28 | },{ 29 | name: "$userURL", 30 | type: "aoi.js", 31 | params: ["userID"], 32 | code: `https://discord.com/users/{userID}` 33 | },{ 34 | name: "$commandExists", 35 | type: "aoi.js", 36 | params: ["name"], 37 | code: `$checkCondition[$commandInfo[$toLowerCase[{name}];name]!=]` 38 | },{ 39 | name: "$autoList", 40 | type: "aoi.js", 41 | params: ["text", "seperator", "type"], 42 | code: `$arrayMap[returnlist;{type}; 43 | ;{}] 44 | $createArray[returnlist;$nonEscape[$get[createlist]]] 45 | $let[createlist;$advancedReplaceText[{text};{seperator};#SEMI#]]` 46 | },{ 47 | name: "$welcomerMessage", 48 | type: "aoi.js", 49 | params: ["content"], 50 | code: `$advancedReplaceText[$nonEscape[$get[content]];<server.totalMembers>;$membersCount;<username>;$get[username];<mention>;<@$authorID>;<id>;$authorID;<owner.username>;$username[$guildOwnerID];<server.name>;$guildName;<owner.id>;$guildOwnerID;<server.id>;$guildID;<creationdate>;$creationDate[$authorID;date];<position>;$ordinal[$memberJoinPosition];<Displayname>;$userDisplayName;<globalname>;$get[globalname]] 51 | 52 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$authorID]==false];true;$username[$authorID];false;$userTag[$authorID]]] 53 | $let[globalname;$advancedReplaceText[$checkCondition[$userGlobalName[$authorID]==];true;$username[$authorID];false;$userGlobalName[$authorID]]] 54 | $let[content;{content}] 55 | ` 56 | },{ 57 | name: "$leaveMessage", 58 | type: "aoi.js", 59 | params: ["content"], 60 | code: `$advancedReplaceText[$nonEscape[$get[content]];<server.totalMembers>;$membersCount;<username>;$get[username];<mention>;<@$authorID>;<id>;$authorID;<owner.username>;$username[$guildOwnerID];<server.name>;$guildName;<owner.id>;$guildOwnerID;<server.id>;$guildID;<creationdate>;$creationDate[$authorID;date];<position>;$ordinal[$memberJoinPosition];<leave.time>;<t:$truncate[$divide[$datestamp;1000]]:f>;<Displayname>;$userDisplayName;<globalname>;$get[globalname]] 61 | 62 | $let[username;$advancedReplaceText[$checkCondition[$hasUserTag[$authorID]==false];true;$username[$authorID];false;$userTag[$authorID]]] 63 | $let[globalname;$advancedReplaceText[$checkCondition[$userGlobalName[$authorID]==];true;$username[$authorID];false;$userGlobalName[$authorID]]] 64 | $let[content;{content}] 65 | ` 66 | },{ 67 | name: "$levelUpMessage", 68 | type: "aoi.js", 69 | params: ["content"], 70 | code: `$advancedReplaceText[$nonEscape[$get[content]];<newlevel>;$getUserVar[level];<mention>;<@$authorID>;<username>;$username;<oldlevel>;$getUserVar[previouslevel];<Displayname>;$userDisplayName;<globalname>;$get[globalname]] 71 | 72 | $let[globalname;$advancedReplaceText[$checkCondition[$userGlobalName[$authorID]==];true;$username[$authorID];false;$userGlobalName[$authorID]]] 73 | $let[content;{content}] 74 | ` 75 | },{ 76 | name: "$createProgressBar", 77 | type: "djs", 78 | code: async d => { 79 | const data = d.util.aoiFunc(d); 80 | const [value, max, barLength = 15] = data.inside.splits; 81 | 82 | function createBar(value, max, barLength) { 83 | const progress = Math.round((Math.max(value, 0) / max) * barLength); 84 | const progressText = "=".repeat(progress) + "-".repeat(barLength- progress); 85 | return progressText; 86 | } 87 | 88 | data.result = createBar(Number(value), Number(max), Number(barLength)); 89 | return { 90 | code: d.util.setCode(data) 91 | } 92 | } 93 | },{ 94 | name: "$excludeSpecialChars", 95 | type: "aoi.js", 96 | params: ["text"], 97 | code: `$removeContains[{text};+;-;/;%;&;!;?;@;^;*;<;>;$;#;.;_;=;~;|;';,]` 98 | },{ 99 | name: '$isNegative', 100 | params: ['value'], 101 | type: 'aoi.js', 102 | code: '$checkCondition[$isNumber[{value}]==true&&{value}<0]' 103 | },{ 104 | name: "$randomColor", // Exclusive to user apps for now 105 | type: "djs", 106 | code: async (d) => { 107 | const data = d.util.aoiFunc(d); 108 | 109 | const hex = Math.floor(Math.random() * 16777215).toString(16); 110 | data.result = `${hex.padStart(6, "0")}`; 111 | 112 | return { 113 | code: d.util.setCode(data) 114 | } 115 | } 116 | },{ 117 | name: "$owoify", 118 | type: "aoi.js", 119 | params: ["text"], 120 | code: `$replaceTextWithRegex[$replaceTextWithRegex[{text};/r|l/;g;w];/R|L/;g;W]` 121 | },{ // credit goes to https://github.com/aoijs/aoi.js/pull/678 for the original code 122 | name: "$messageAttachments", 123 | type: "djs", 124 | code: async (d) => { 125 | const data = d.util.aoiFunc(d); 126 | const [sep = ', '] = data.inside.splits; 127 | 128 | data.result = d.message.attachments.map(x => x?.url).join(sep); 129 | return { 130 | code: d.util.setCode(data) 131 | } 132 | } 133 | }] 134 | 135 | 136 | 137 | /* Disabled 138 | 139 | { 140 | name: "$fallbackAttachment", 141 | type: "aoi.js", 142 | params: ["url", "fallbacktoUse"], 143 | code: `$advancedReplaceText[$checkCondition[$IsValidImageLink[$get[Input]]==true];true;$get[Input];false;$get[FallbackInput]] 144 | $let[FallbackInput;{fallbacktoUse}] 145 | $let[Input;{url}]` 146 | } 147 | 148 | */ 149 | -------------------------------------------------------------------------------- /commands/Automation/Interactions/Buttons & SelectMenus/settingsmenu-interactions.js: -------------------------------------------------------------------------------- 1 | module.exports = [{ 2 | type: "interaction", 3 | prototype: "selectMenu", 4 | code: `$interactionUpdate[{newEmbed:{title:Auto Reply}{description: 5 | Having this option enabled will allow the bot to respond by pinging, which will let you know on what prefix it currently uses in this server. 6 | 7 | Disable this If It's purposefully used for spamming. 8 | }{field:**Current Setup**: 9 | **Auto Reply**#COLON# \`$get[autopingreply]\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:settingsmenu_$authorID:Select a option:1:1:false:{stringInput:Auto Reply:autoreply:Automatically reply to pings!:false}{stringInput:Include Bots:includebots:Whether or not to include bots in message logs.:false}{stringInput:Anonymous:anonymous:Hide moderator names being revealed:false}}}{actionRow:{button:Toggle:2:autoreplytoggle_$authorID:false}}] 10 | 11 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 12 | {ephemeral} 13 | {interaction} 14 | ] 15 | 16 | $let[autopingreply;$advancedReplaceText[$getGuildVar[autopingreply];on;Enabled;off;Disabled]] 17 | $onlyIf[$getSelectMenuValues[all]==autoreply;] 18 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==settingsmenu;] 19 | ` 20 | },{ 21 | type: "interaction", 22 | prototype: "button", 23 | code: ` 24 | 25 | $interactionFollowUp[$get[resultmessage];true] 26 | $interactionUpdate[{newEmbed:{title:Auto Reply}{description: 27 | Having this option enabled will allow the bot to respond by pinging, which will let you know on what prefix it currently uses in this server. 28 | 29 | Disable this If It's purposefully used for spamming. 30 | }{field:**Current Setup**: 31 | **Auto Reply**#COLON# \`$get[autopingreply]\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:settingsmenu_$authorID:Select a option:1:1:false:{stringInput:Auto Reply:autoreply:Automatically reply to pings!:false}{stringInput:Include Bots:includebots:Whether or not to include bots in message logs.:false}{stringInput:Anonymous:anonymous:Hide moderator names being revealed:false}}}{actionRow:{button:Toggle:2:autoreplytoggle_$authorID:false}}] 32 | 33 | 34 | $let[autopingreply;$advancedReplaceText[$getGuildVar[autopingreply];on;Enabled;off;Disabled]] 35 | $let[resultmessage;$advancedReplaceText[$checkCondition[$getGuildVar[autopingreply]==on];true;From now on, I will reply by pings!;false;From now on, I will no longer reply by pings!]] 36 | $setGuildVar[autopingreply;$get[newtoggledsetting]] 37 | $let[newtoggledsetting;$advancedReplaceText[$checkCondition[$getGuildVar[autopingreply]==on];true;off;false;on]] 38 | 39 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 40 | {ephemeral} 41 | {interaction} 42 | ] 43 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==autoreplytoggle;] 44 | 45 | ` 46 | },{ 47 | type: "interaction", 48 | prototype: "selectMenu", 49 | code: `$interactionUpdate[{newEmbed:{title:Include Bots}{description: 50 | This option let's you decide whether or not bots should be included in message logs. 51 | 52 | By default, this is enabled but you can choose to disable it for whatever reason.}{field:**Current Setup**: 53 | **Include Bots**#COLON# \`$get[includebots]\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:settingsmenu_$authorID:Select a option:1:1:false:{stringInput:Auto Reply:autoreply:Automatically reply to pings!:false}{stringInput:Include Bots:includebots:Whether or not to include bots in message logs.:false}{stringInput:Anonymous:anonymous:Hide moderator names being revealed:false}}}{actionRow:{button:Toggle:2:includebotstoggle_$authorID:false}}] 54 | 55 | $let[includebots;$advancedReplaceText[$getGuildVar[includebots];on;Enabled;off;Disabled]] 56 | 57 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 58 | {ephemeral} 59 | {interaction} 60 | ] 61 | 62 | $onlyIf[$getSelectMenuValues[all]==includebots;] 63 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==settingsmenu;] 64 | ` 65 | },{ 66 | type: "interaction", 67 | prototype: "button", 68 | code: ` 69 | $interactionFollowUp[$get[resultmessage];true] 70 | $interactionUpdate[{newEmbed:{title:Include Bots}{description: 71 | This option let's you decide whether or not bots should be included in message logs. 72 | 73 | By default, this is enabled but you can choose to disable it for whatever reason.}{field:**Current Setup**: 74 | **Include Bots**#COLON# \`$get[includebots]\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:settingsmenu_$authorID:Select a option:1:1:false:{stringInput:Auto Reply:autoreply:Automatically reply to pings!:false}{stringInput:Include Bots:includebots:Whether or not to include bots in message logs.:false}{stringInput:Anonymous:anonymous:Hide moderator names being revealed:false}}}{actionRow:{button:Toggle:2:includebotstoggle_$authorID:false}}] 75 | 76 | 77 | 78 | $let[includebots;$advancedReplaceText[$getGuildVar[includebots];on;Enabled;off;Disabled]] 79 | $let[resultmessage;$advancedReplaceText[$checkCondition[$getGuildVar[includebots]==on];true;From now on, Bots will be included in logs!;false;From now on, Bots will no longer be included in logs!]] 80 | $setGuildVar[includebots;$get[newtoggledsetting]] 81 | $let[newtoggledsetting;$advancedReplaceText[$checkCondition[$getGuildVar[includebots]==on];true;off;false;on]] 82 | 83 | 84 | 85 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 86 | {ephemeral} 87 | {interaction} 88 | ] 89 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==includebotstoggle;] 90 | 91 | 92 | ` 93 | },{ 94 | type: "interaction", 95 | prototype: "selectMenu", 96 | code: `$interactionUpdate[{newEmbed:{title:Anonymous}{description: 97 | This option allows moderator names to not be revealed in Ban logs! 98 | 99 | For security reasons, this feature is only exclusive to Ban logs! 100 | 101 | -# This does not apply to bots by default 102 | }{field:**Current Setup**: 103 | **Anonymous**#COLON# \`$get[anonymous]\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:settingsmenu_$authorID:Select a option:1:1:false:{stringInput:Auto Reply:autoreply:Automatically reply to pings!:false}{stringInput:Include Bots:includebots:Whether or not to include bots in message logs.:false}{stringInput:Anonymous:anonymous:Hide moderator names being revealed:false}}}{actionRow:{button:Toggle:2:anonymoustoggle_$authorID:false}}] 104 | 105 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 106 | {ephemeral} 107 | {interaction} 108 | ] 109 | 110 | $let[anonymous;$advancedReplaceText[$getGuildVar[anonymous];on;Enabled;off;Disabled]] 111 | $onlyIf[$getSelectMenuValues[all]==anonymous;] 112 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==settingsmenu;] 113 | ` 114 | },{ 115 | type: "interaction", 116 | prototype: "button", 117 | code: ` 118 | $interactionFollowUp[$get[resultmessage];true] 119 | $interactionUpdate[{newEmbed:{title:Anonymous}{description: 120 | This option allows moderator names to not be revealed in Ban logs! 121 | 122 | For security reasons, this feature is only exclusive to Ban logs! 123 | 124 | -# This does not apply to bots by default 125 | }{field:**Current Setup**: 126 | **Anonymous**#COLON# \`$get[anonymous]\`}{color:$getVar[embedcolor]}}{actionRow:{selectMenu:settingsmenu_$authorID:Select a option:1:1:false:{stringInput:Auto Reply:autoreply:Automatically reply to pings!:false}{stringInput:Include Bots:includebots:Whether or not to include bots in message logs.:false}{stringInput:Anonymous:anonymous:Hide moderator names being revealed:false}}}{actionRow:{button:Toggle:2:anonymoustoggle_$authorID:false}}] 127 | 128 | 129 | 130 | $let[anonymous;$advancedReplaceText[$getGuildVar[anonymous];on;Enabled;off;Disabled]] 131 | $let[resultmessage;$advancedReplaceText[$checkCondition[$getGuildVar[anonymous]==on];true;Anonymous has been enabled!;false;Anonymous has been disabled!]] 132 | $setGuildVar[anonymous;$get[newtoggledsetting]] 133 | $let[newtoggledsetting;$advancedReplaceText[$checkCondition[$getGuildVar[anonymous]==on];true;off;false;on]] 134 | 135 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;2]==$interactionData[author.id];This interaction is not for you. 136 | {ephemeral} 137 | {interaction} 138 | ] 139 | $onlyIf[$advancedTextSplit[$interactionData[customId];_;1]==anonymoustoggle;] 140 | 141 | 142 | ` 143 | }] 144 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | --------------------------------------------------------------------------------