diff options
54 files changed, 1169 insertions, 943 deletions
diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5171c54 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +node_modules +npm-debug.log
\ No newline at end of file @@ -11,11 +11,10 @@ ffprobe.exe .directory
-userData.sqlite
.vs/slnx.sqlite
.vs/slnx.sqlite-journal
json.sqlite
yarn.lock
-
-package-lock.json
\ No newline at end of file +package-lock.json
+database.sqlite
diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml new file mode 100644 index 0000000..b1bad03 --- /dev/null +++ b/.idea/dbnavigator.xml @@ -0,0 +1,417 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="DBNavigator.Project.DataEditorManager"> + <record-view-column-sorting-type value="BY_INDEX" /> + <value-preview-text-wrapping value="true" /> + <value-preview-pinned value="false" /> + </component> + <component name="DBNavigator.Project.DatabaseBrowserManager"> + <autoscroll-to-editor value="false" /> + <autoscroll-from-editor value="true" /> + <show-object-properties value="true" /> + <loaded-nodes /> + </component> + <component name="DBNavigator.Project.DatabaseEditorStateManager"> + <last-used-providers /> + </component> + <component name="DBNavigator.Project.DatabaseFileManager"> + <open-files /> + </component> + <component name="DBNavigator.Project.Settings"> + <connections /> + <browser-settings> + <general> + <display-mode value="TABBED" /> + <navigation-history-size value="100" /> + <show-object-details value="false" /> + </general> + <filters> + <object-type-filter> + <object-type name="SCHEMA" enabled="true" /> + <object-type name="USER" enabled="true" /> + <object-type name="ROLE" enabled="true" /> + <object-type name="PRIVILEGE" enabled="true" /> + <object-type name="CHARSET" enabled="true" /> + <object-type name="TABLE" enabled="true" /> + <object-type name="VIEW" enabled="true" /> + <object-type name="MATERIALIZED_VIEW" enabled="true" /> + <object-type name="NESTED_TABLE" enabled="true" /> + <object-type name="COLUMN" enabled="true" /> + <object-type name="INDEX" enabled="true" /> + <object-type name="CONSTRAINT" enabled="true" /> + <object-type name="DATASET_TRIGGER" enabled="true" /> + <object-type name="DATABASE_TRIGGER" enabled="true" /> + <object-type name="SYNONYM" enabled="true" /> + <object-type name="SEQUENCE" enabled="true" /> + <object-type name="PROCEDURE" enabled="true" /> + <object-type name="FUNCTION" enabled="true" /> + <object-type name="PACKAGE" enabled="true" /> + <object-type name="TYPE" enabled="true" /> + <object-type name="TYPE_ATTRIBUTE" enabled="true" /> + <object-type name="ARGUMENT" enabled="true" /> + <object-type name="DIMENSION" enabled="true" /> + <object-type name="CLUSTER" enabled="true" /> + <object-type name="DBLINK" enabled="true" /> + </object-type-filter> + </filters> + <sorting> + <object-type name="COLUMN" sorting-type="NAME" /> + <object-type name="FUNCTION" sorting-type="NAME" /> + <object-type name="PROCEDURE" sorting-type="NAME" /> + <object-type name="ARGUMENT" sorting-type="POSITION" /> + <object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" /> + </sorting> + <default-editors> + <object-type name="VIEW" editor-type="SELECTION" /> + <object-type name="PACKAGE" editor-type="SELECTION" /> + <object-type name="TYPE" editor-type="SELECTION" /> + </default-editors> + </browser-settings> + <navigation-settings> + <lookup-filters> + <lookup-objects> + <object-type name="SCHEMA" enabled="true" /> + <object-type name="USER" enabled="false" /> + <object-type name="ROLE" enabled="false" /> + <object-type name="PRIVILEGE" enabled="false" /> + <object-type name="CHARSET" enabled="false" /> + <object-type name="TABLE" enabled="true" /> + <object-type name="VIEW" enabled="true" /> + <object-type name="MATERIALIZED VIEW" enabled="true" /> + <object-type name="INDEX" enabled="true" /> + <object-type name="CONSTRAINT" enabled="true" /> + <object-type name="DATASET TRIGGER" enabled="true" /> + <object-type name="DATABASE TRIGGER" enabled="true" /> + <object-type name="SYNONYM" enabled="false" /> + <object-type name="SEQUENCE" enabled="true" /> + <object-type name="PROCEDURE" enabled="true" /> + <object-type name="FUNCTION" enabled="true" /> + <object-type name="PACKAGE" enabled="true" /> + <object-type name="TYPE" enabled="true" /> + <object-type name="DIMENSION" enabled="false" /> + <object-type name="CLUSTER" enabled="false" /> + <object-type name="DBLINK" enabled="true" /> + </lookup-objects> + <force-database-load value="false" /> + <prompt-connection-selection value="true" /> + <prompt-schema-selection value="true" /> + </lookup-filters> + </navigation-settings> + <dataset-grid-settings> + <general> + <enable-zooming value="true" /> + <enable-column-tooltip value="true" /> + </general> + <sorting> + <nulls-first value="true" /> + <max-sorting-columns value="4" /> + </sorting> + <audit-columns> + <column-names value="" /> + <visible value="true" /> + <editable value="false" /> + </audit-columns> + </dataset-grid-settings> + <dataset-editor-settings> + <text-editor-popup> + <active value="false" /> + <active-if-empty value="false" /> + <data-length-threshold value="100" /> + <popup-delay value="1000" /> + </text-editor-popup> + <values-actions-popup> + <show-popup-button value="true" /> + <element-count-threshold value="1000" /> + <data-length-threshold value="250" /> + </values-actions-popup> + <general> + <fetch-block-size value="100" /> + <fetch-timeout value="30" /> + <trim-whitespaces value="true" /> + <convert-empty-strings-to-null value="true" /> + <select-content-on-cell-edit value="true" /> + <large-value-preview-active value="true" /> + </general> + <filters> + <prompt-filter-dialog value="true" /> + <default-filter-type value="BASIC" /> + </filters> + <qualified-text-editor text-length-threshold="300"> + <content-types> + <content-type name="Text" enabled="true" /> + <content-type name="XML" enabled="true" /> + <content-type name="DTD" enabled="true" /> + <content-type name="HTML" enabled="true" /> + <content-type name="XHTML" enabled="true" /> + <content-type name="CSS" enabled="true" /> + <content-type name="SQL" enabled="true" /> + <content-type name="PL/SQL" enabled="true" /> + <content-type name="JavaScript" enabled="true" /> + <content-type name="JSON" enabled="true" /> + <content-type name="JSON5" enabled="true" /> + <content-type name="YAML" enabled="true" /> + </content-types> + </qualified-text-editor> + <record-navigation> + <navigation-target value="VIEWER" /> + </record-navigation> + </dataset-editor-settings> + <code-editor-settings> + <general> + <show-object-navigation-gutter value="false" /> + <show-spec-declaration-navigation-gutter value="true" /> + <enable-spellchecking value="true" /> + <enable-reference-spellchecking value="false" /> + </general> + <confirmations> + <save-changes value="false" /> + <revert-changes value="true" /> + </confirmations> + </code-editor-settings> + <code-completion-settings> + <filters> + <basic-filter> + <filter-element type="RESERVED_WORD" id="keyword" selected="true" /> + <filter-element type="RESERVED_WORD" id="function" selected="true" /> + <filter-element type="RESERVED_WORD" id="parameter" selected="true" /> + <filter-element type="RESERVED_WORD" id="datatype" selected="true" /> + <filter-element type="RESERVED_WORD" id="exception" selected="true" /> + <filter-element type="OBJECT" id="schema" selected="true" /> + <filter-element type="OBJECT" id="role" selected="true" /> + <filter-element type="OBJECT" id="user" selected="true" /> + <filter-element type="OBJECT" id="privilege" selected="true" /> + <user-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="false" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </user-schema> + <public-schema> + <filter-element type="OBJECT" id="table" selected="false" /> + <filter-element type="OBJECT" id="view" selected="false" /> + <filter-element type="OBJECT" id="materialized view" selected="false" /> + <filter-element type="OBJECT" id="index" selected="false" /> + <filter-element type="OBJECT" id="constraint" selected="false" /> + <filter-element type="OBJECT" id="trigger" selected="false" /> + <filter-element type="OBJECT" id="synonym" selected="false" /> + <filter-element type="OBJECT" id="sequence" selected="false" /> + <filter-element type="OBJECT" id="procedure" selected="false" /> + <filter-element type="OBJECT" id="function" selected="false" /> + <filter-element type="OBJECT" id="package" selected="false" /> + <filter-element type="OBJECT" id="type" selected="false" /> + <filter-element type="OBJECT" id="dimension" selected="false" /> + <filter-element type="OBJECT" id="cluster" selected="false" /> + <filter-element type="OBJECT" id="dblink" selected="false" /> + </public-schema> + <any-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="true" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </any-schema> + </basic-filter> + <extended-filter> + <filter-element type="RESERVED_WORD" id="keyword" selected="true" /> + <filter-element type="RESERVED_WORD" id="function" selected="true" /> + <filter-element type="RESERVED_WORD" id="parameter" selected="true" /> + <filter-element type="RESERVED_WORD" id="datatype" selected="true" /> + <filter-element type="RESERVED_WORD" id="exception" selected="true" /> + <filter-element type="OBJECT" id="schema" selected="true" /> + <filter-element type="OBJECT" id="user" selected="true" /> + <filter-element type="OBJECT" id="role" selected="true" /> + <filter-element type="OBJECT" id="privilege" selected="true" /> + <user-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="true" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </user-schema> + <public-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="true" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </public-schema> + <any-schema> + <filter-element type="OBJECT" id="table" selected="true" /> + <filter-element type="OBJECT" id="view" selected="true" /> + <filter-element type="OBJECT" id="materialized view" selected="true" /> + <filter-element type="OBJECT" id="index" selected="true" /> + <filter-element type="OBJECT" id="constraint" selected="true" /> + <filter-element type="OBJECT" id="trigger" selected="true" /> + <filter-element type="OBJECT" id="synonym" selected="true" /> + <filter-element type="OBJECT" id="sequence" selected="true" /> + <filter-element type="OBJECT" id="procedure" selected="true" /> + <filter-element type="OBJECT" id="function" selected="true" /> + <filter-element type="OBJECT" id="package" selected="true" /> + <filter-element type="OBJECT" id="type" selected="true" /> + <filter-element type="OBJECT" id="dimension" selected="true" /> + <filter-element type="OBJECT" id="cluster" selected="true" /> + <filter-element type="OBJECT" id="dblink" selected="true" /> + </any-schema> + </extended-filter> + </filters> + <sorting enabled="true"> + <sorting-element type="RESERVED_WORD" id="keyword" /> + <sorting-element type="RESERVED_WORD" id="datatype" /> + <sorting-element type="OBJECT" id="column" /> + <sorting-element type="OBJECT" id="table" /> + <sorting-element type="OBJECT" id="view" /> + <sorting-element type="OBJECT" id="materialized view" /> + <sorting-element type="OBJECT" id="index" /> + <sorting-element type="OBJECT" id="constraint" /> + <sorting-element type="OBJECT" id="trigger" /> + <sorting-element type="OBJECT" id="synonym" /> + <sorting-element type="OBJECT" id="sequence" /> + <sorting-element type="OBJECT" id="procedure" /> + <sorting-element type="OBJECT" id="function" /> + <sorting-element type="OBJECT" id="package" /> + <sorting-element type="OBJECT" id="type" /> + <sorting-element type="OBJECT" id="dimension" /> + <sorting-element type="OBJECT" id="cluster" /> + <sorting-element type="OBJECT" id="dblink" /> + <sorting-element type="OBJECT" id="schema" /> + <sorting-element type="OBJECT" id="role" /> + <sorting-element type="OBJECT" id="user" /> + <sorting-element type="RESERVED_WORD" id="function" /> + <sorting-element type="RESERVED_WORD" id="parameter" /> + </sorting> + <format> + <enforce-code-style-case value="true" /> + </format> + </code-completion-settings> + <execution-engine-settings> + <statement-execution> + <fetch-block-size value="100" /> + <execution-timeout value="20" /> + <debug-execution-timeout value="600" /> + <focus-result value="false" /> + <prompt-execution value="false" /> + </statement-execution> + <script-execution> + <command-line-interfaces /> + <execution-timeout value="300" /> + </script-execution> + <method-execution> + <execution-timeout value="30" /> + <debug-execution-timeout value="600" /> + <parameter-history-size value="10" /> + </method-execution> + </execution-engine-settings> + <operation-settings> + <transactions> + <uncommitted-changes> + <on-project-close value="ASK" /> + <on-disconnect value="ASK" /> + <on-autocommit-toggle value="ASK" /> + </uncommitted-changes> + <multiple-uncommitted-changes> + <on-commit value="ASK" /> + <on-rollback value="ASK" /> + </multiple-uncommitted-changes> + </transactions> + <session-browser> + <disconnect-session value="ASK" /> + <kill-session value="ASK" /> + <reload-on-filter-change value="false" /> + </session-browser> + <compiler> + <compile-type value="KEEP" /> + <compile-dependencies value="ASK" /> + <always-show-controls value="false" /> + </compiler> + <debugger> + <debugger-type value="JDBC" /> + <use-generic-runners value="true" /> + </debugger> + </operation-settings> + <ddl-file-settings> + <extensions> + <mapping file-type-id="VIEW" extensions="vw" /> + <mapping file-type-id="TRIGGER" extensions="trg" /> + <mapping file-type-id="PROCEDURE" extensions="prc" /> + <mapping file-type-id="FUNCTION" extensions="fnc" /> + <mapping file-type-id="PACKAGE" extensions="pkg" /> + <mapping file-type-id="PACKAGE_SPEC" extensions="pks" /> + <mapping file-type-id="PACKAGE_BODY" extensions="pkb" /> + <mapping file-type-id="TYPE" extensions="tpe" /> + <mapping file-type-id="TYPE_SPEC" extensions="tps" /> + <mapping file-type-id="TYPE_BODY" extensions="tpb" /> + </extensions> + <general> + <lookup-ddl-files value="true" /> + <create-ddl-files value="false" /> + <synchronize-ddl-files value="true" /> + <use-qualified-names value="false" /> + <make-scripts-rerunnable value="true" /> + </general> + </ddl-file-settings> + <general-settings> + <regional-settings> + <date-format value="MEDIUM" /> + <number-format value="UNGROUPED" /> + <locale value="SYSTEM_DEFAULT" /> + <use-custom-formats value="false" /> + </regional-settings> + <environment> + <environment-types> + <environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" /> + <environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" /> + <environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" /> + <environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" /> + </environment-types> + <visibility-settings> + <connection-tabs value="true" /> + <dialog-headers value="true" /> + <object-editor-tabs value="true" /> + <script-editor-tabs value="false" /> + <execution-result-tabs value="true" /> + </visibility-settings> + </environment> + </general-settings> + </component> +</project>
\ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 473704a..2799fb4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ Include the GPL-3.0 license too and follow the following format when you create /****************************************
*
* [Command/Plugin]: (Command or Plugin) for AleeBot
- * Copyright (C) 2017-2020 Alee Productions & (your name here)
+ * Copyright (C) 2017-2023 Andrew Lee & (your name here)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@ exports.help = { name: 'name here',
description: 'Description here.',
usage: 'Usage [here]',
- category: '- General Commands',
+ category: '- [Category] Commands',
};
```
@@ -43,7 +43,9 @@ exports.help = { First get NodeJS then clone this repo then do `npm install` or `yarn install` in the AleeBot folder. Now add a file called `tokens.json` then copy and paste this follow code.
```json
{
- "abtoken": "token"
+ "abtoken": "token",
+ "mongoPath": "mongodb://127.0.0.1:27017/aleebot",
+ "port": 3000
}
```
-Then get your token from discord and replace `token` with your token and finally run this in linux `./run_linux.sh` or for windows `run_win.bat` or `npm/yarn start`.
+Then get your token from discord and replace `token` with your token. After that, install MongoDB and run it. Finally, run this in linux `./run_linux.sh` or for windows `run_win.bat` or `npm/yarn start`.
diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1256d22 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM node:alpine + +WORKDIR /usr/src/bot + +COPY package.json ./ + +COPY tokens.json ./ + +COPY yarn.lock ./ + +RUN yarn install + +COPY . . + +CMD ["node", "bot_discord.js"] @@ -20,7 +20,7 @@ <p>Here's the list of people who helped me with AleeBot for discord servers</p>
<ul>
<li>Alee14</li>
- <li>OfficialRain (Rain)</li>
+ <li>OfficialRain (Raina)</li>
<li>jtsshieh</li>
</ul>
<br>
diff --git a/To be worked on/addquote.js b/To be worked on/addquote.js new file mode 100644 index 0000000..5f2b9bc --- /dev/null +++ b/To be worked on/addquote.js @@ -0,0 +1,132 @@ +/** ************************************** + * + * AddQuote: Command for AleeBot + * Copyright (C) 2017-2021 Alee Productions + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * *************************************/ +const quoteDB = require('../models/quote'); +const { MessageEmbed } = require("discord.js"); +module.exports.run = async (client, message, args) => { + if (!['242775871059001344'].includes(message.author.id)) return message.reply('**This command is disabled due to a new system being implemented.**'); + try { + let newAuthor; + let newAuthorImage; + let newQuote; + let newYear; + + let quoteOriginator; + + let isSetupRunning = false; + + const setupProcess = [ + 'Provide the name of the author.', + 'Submit the image of the author\nYou need to use a picture link that ends in .jpg or .png (like those from IMGUR or Google Images), and the picture should be either 128x128 pixels or 512x512 pixels in size.', + 'Enter the quote', + 'Specify the year from which the quote originates.' + ] + + let setupMessage = "Welcome to the AleeBot Quote Setup!\n" + setupMessage += "Please follow these rules when submitting quotes\n" + setupMessage += "```1. Do not use profanity or offensive language.\n" + setupMessage += "2. Do not send any personal information.\n" + setupMessage += "3. Only send noteworthy quotes.```\n" + setupMessage += "We reserve the right to reject any quotes that do not meet our criteria.\n" + + let counter = 0 + + if (isSetupRunning) { + return await message.reply('You are already setting up the quote.'); + } + const filter = m => m.author.id === message.author.id + + isSetupRunning = true; + await message.reply(':arrow_left: Check your DMs to continue.') + await message.author.send(setupMessage); + await message.author.send(setupProcess[counter++]); + + const collector = message.channel.createMessageCollector({ + filter, + max: setupProcess.length, + time: 1000 * 60 + }); + + collector.on('collect', message => { + console.log(`Collected ${message.content} from ${message.author.tag}`) + if (setupProcess.length > setupProcess.length + 1) { + message.author.send(setupProcess[counter++]); + } + }); + + collector.on('end', collected => { + if (collected.size === 0 && collected.size < 2) { + message.author.send('Quote setup was not completed, rerun the command.') + } else { + let quoteContent = []; + + collected.forEach((message) => { + quoteContent.push(message.content) + }) + + newAuthor = quoteContent[0] + newAuthorImage = quoteContent[1] + newQuote = quoteContent[2] + newYear = quoteContent[3] + + const setupEmbed = new MessageEmbed() + .setAuthor('AleeBot Quote Setup', client.user.avatarURL()) + .setDescription('Are you happy with this quote?\nThis quote will be sent for manual approval') + .addField('Author', newAuthor) + .addField('Author Image (URL)', newAuthorImage) + .addField('Quote', newQuote) + .addField('Year', newYear); + + message.author.send({embeds:[setupEmbed]}) + quoteOriginator = message.author.tag + console.log(`This quote has been originated from ${quoteOriginator}`) + isSetupRunning = false; + } + + }); + + /*await quoteDB.create({ + author: newAuthor, + authorImage: newAuthorImage, + quote: newQuote, + year: newYear, + });*/ + + //let messageReact = await message.author.send({embeds: [setupEmbed]}); + /*await messageReact.react('🧑'); + await messageReact.react('📷'); + await messageReact.react('🖋️'); + await messageReact.react('📅');*/ + + } catch (error) { + console.log(error) + } +}; + +exports.conf = { + aliases: [], + guildOnly: true, +}; +exports.help = { + name: 'addquote', + description: 'Adds a quote to the database.', + usage: 'addquote', + category: '- Quote Commands', +}; + diff --git a/To be worked on/leave.js b/To be worked on/leave.js index da0b4cc..78410e2 100644 --- a/To be worked on/leave.js +++ b/To be worked on/leave.js @@ -1,7 +1,7 @@ /** ************************************** * * Leave: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/To be worked on/play.js b/To be worked on/play.js index abebc8b..f14d3c5 100644 --- a/To be worked on/play.js +++ b/To be worked on/play.js @@ -1,7 +1,7 @@ /** ************************************** * * Play: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/To be worked on/queue.js b/To be worked on/queue.js index 1208ddf..2b6d31a 100644 --- a/To be worked on/queue.js +++ b/To be worked on/queue.js @@ -1,7 +1,7 @@ /** ************************************** * * Queue: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/To be worked on/skip.js b/To be worked on/skip.js index 371e7e7..bda040b 100644 --- a/To be worked on/skip.js +++ b/To be worked on/skip.js @@ -1,7 +1,7 @@ /** ************************************** * * Skip: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/bot_discord.js b/bot_discord.js index 991a294..b32e018 100644 --- a/bot_discord.js +++ b/bot_discord.js @@ -1,7 +1,7 @@ /** ************************************** * * AleeBot: Made for discord servers - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2022 Andrew Lee Projects * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,43 +18,54 @@ * * *************************************/ const Discord = require('discord.js'); +const client = new Discord.Client({ + allowedMentions: { + parse: ['users', 'roles'], + repliedUser: true + }, + intents: ['GUILDS', 'GUILD_MESSAGES', 'GUILD_MEMBERS', 'GUILD_MESSAGE_REACTIONS'] +}); const moment = require('moment'); +const express = require('express'); +const fs = require('fs'); const readline = require('readline'); const colors = require('colors'); -const DBL = require('dblapi.js'); //const i18next = require('i18next'); -const client = new Discord.Client({ - disableEveryone: true, -}); +const web = express(); const settings = require('./storage/settings.json'); -const fs = require('fs'); const api = require('./tokens.json'); -const dbl = new DBL(api.dbltoken, client); +const { activity } = require('./storage/activities'); const active = new Map(); -const ownerID = '242775871059001344'; let autoRole = true; +let readyEmbedMessage = true; +const ownerID = '242775871059001344'; let logChannel = '318874545593384970'; let statusChannelID = '606602551634296968'; -let readyEmbedMessage = true; -const activities = [ - 'AleeBot ' + settings.abVersion + ' | ' + settings.prefix + 'help', - 'Coding bytes', - 'Drawing shapes', - 'Fighting Quad', - 'Ultra Jump Mania!' -]; +let serverWhitelist = "243022206437687296"; +let roleWhitelist = "657426918416580614"; const log = (message) => { console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] ${message}`.white); }; +function botPresence() { + client.user.setPresence({ + activities: [{ + name: activity[Math.floor(Math.random() * activity.length)] + }], + status: 'online', + afk: false, + }); + log(`[>] Updated bot presence to "${client.user.presence.activities[0].name}"`.green); +} + const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: '> '.gray, }); -console.log(`AleeBot ${settings.abVersion}: Copyright (C) 2017-2020 Alee Productions`.gray); +console.log(`AleeBot ${settings.abVersion}: Copyright (C) 2017-2023 Andrew Lee Projects`.gray); console.log('This program comes with ABSOLUTELY NO WARRANTY; for details type `show w\'.'.gray); console.log('This is free software, and you are welcome to redistribute it'.gray); console.log('under certain conditions; type `show c\' for details.\n'.gray); @@ -103,8 +114,7 @@ fs.readdir('./commands', (err, files) => { console.log(err.stack); } }); - log('[>] Command Loading complete!'.green); - console.log('\n'); + log('[>] Command loading complete!\n'.green); }); rl.on('line', function(cmd) { @@ -114,29 +124,20 @@ rl.on('line', function(cmd) { if (client.guilds.size === 0) { console.log(('[!] No guilds found.'.yellow)); } else { - console.log('[i] Here\'s the servers that AleeBot is connected to:'); + console.log('[i] These are the servers that AleeBot is connected to:'); for ([id, guild] of client.guilds) { console.log(` Guild Name: ${guild.name} - ID: ${guild.id}`.blue); } } break; - case 'channels': - if (!args[1]) { - console.log('[!] Please insert the guild\'s ID.'.yellow); - } else { - var guild = client.guilds.get(args[1]); - console.log('[i] Here\'s the channels that this guild have:'.blue); - for ([id, channel, guild] of guild && client.channels) { - console.log(` Channel: #${channel.name} - ID: ${channel.id}`.blue); - } - } - break; case 'leave': if (!args[1]) { console.log('[!] Please insert the guild\'s ID.'.yellow); } else { - var guild = client.guilds.get(args[1]); - guild.leave(); + let guild = client.guilds.cache.get(args[1]); + guild.leave().then(guild => { + console.log(`AleeBot has left ${guild.name}`) + }); } break; case 'broadcast': @@ -144,12 +145,14 @@ rl.on('line', function(cmd) { console.log('[!] Usage: broadcast [guildID] [channelID].'.yellow); } else { const broadcast = args.join(' ').slice(48); - var guild = null; - guild = client.guilds.get(args[1]); - var channel = null; - channel = guild.channels.get(args[2]); + let guild = null; + guild = client.guilds.cache.get(args[1]); + let channel = null; + channel = guild.channels.cache.get(args[2]); if (channel != null) { - channel.send(broadcast); + channel.send(`**[Broadcast]** ${broadcast}`); + } else { + console.log('[X] Broadcast cannot be blank'.red) } } break; @@ -159,12 +162,21 @@ rl.on('line', function(cmd) { let uptimeMinutes = Math.floor(uptime / 60); const minutes = uptime % 60; let hours = 0; + let days = 0; while (uptimeMinutes >= 60) { hours++; uptimeMinutes = uptimeMinutes - 60; } + while (hours >= 24) { + days++; + hours = hours - 24; + } const uptimeSeconds = minutes % 60; - console.log(`[i] AleeBot has been up for ${hours} hours, ${uptimeMinutes} minutes, and ${uptimeSeconds} seconds.`.blue); + console.log(`[i] AleeBot has been up for ${days} days, ${hours} hours, ${uptimeMinutes} minutes, and ${uptimeSeconds} seconds.`); + break; + case 'activity': + console.log('[i] Generating new activity'.blue); + botPresence(); break; case 'exit': console.log('[i] AleeBot will now exit!'.blue); @@ -184,10 +196,10 @@ rl.on('line', function(cmd) { case 'help': let msg = ('AleeBot '+ settings.abVersion +' Console Help\n\n'); msg += ('guilds - Shows all guilds that AleeBot\'s on.\n'); - msg += ('channels - Shows all the channels that the guilds have.\n'); msg += ('leave - Leaves a guild.\n'); msg += ('broadcast - Broadcasts a message to a server.\n'); msg += ('uptime - Shows the uptime for AleeBot.\n'); + msg += ('activity - Generates new activity\n'); msg += ('help - Shows this command.\n'); msg += ('exit - Exits AleeBot.\n'); console.log(msg.cyan); @@ -198,71 +210,70 @@ rl.on('line', function(cmd) { rl.prompt(); }); -client.on('ready', () => { +client.on('ready', async () => { log('[>] AleeBot is now ready!'.green); log(`[i] Logged in as ${client.user.tag}`.green); log(`[i] Default Prefix: ${settings.prefix}`.green); log(`[i] Bot ID: ${client.user.id}`.green); - log(`[i] Token: ${api.abtoken}`.green); - log(`[i] Running version ${settings.abVersion} and in ${client.guilds.cache.size} guilds`.green); - - client.setInterval(function() { - /* - setInterval(() => { - dbl.postStats(client.guilds.size, client.shards.Id, client.shards.total); - }, 1800000);*/ - client.user.setPresence({ - activity: { - name: activities[Math.floor(Math.random() * activities.length)] - }, - status: 'online', - afk: false, - }); + log(`[i] Running version ${settings.abVersion} | Serving in ${client.guilds.cache.size} guilds`.green); + + botPresence(); + + web.get('/', (req, res) => { + res.send("Hello World! This is going to become the AleeBot dashboard..."); + }); + + web.listen(api.port, () => { + console.log(`Listening at https://localhost:${api.port}`) + }) + + setInterval(function() { + botPresence(); }, 200000); if (readyEmbedMessage === true) { const readyEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Status', client.user.avatarURL()) .setDescription('AleeBot has started') - .addField('Prefix', `\`${settings.prefix}\``, true) + .addField('Version', settings.abVersion, true) + .addField('Discord.JS Version', Discord.version, true) + .addField('Prefix', `\`${settings.prefix}\``) .setColor('#5cd65c'); let statusChannel = client.channels.cache.get(statusChannelID); if (!statusChannel) return console.error('The status channel does not exist! Skipping.'); - statusChannel.send(readyEmbed); + statusChannel.send({ embeds: [readyEmbed]}); } rl.prompt(); }); client.on('guildMemberAdd', (member) => { - if (member.guild.id !== '243022206437687296') return; + if (member.guild.id !== serverWhitelist) return; const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Logging', client.user.avatarURL()) .setDescription(`A user has joined this server!`) - .addField('Username: ', `${member.displayName}`, true) + .addField('Username: ', `${member.user.tag}`, true) .addField('User ID: ', `${member.id}`, true) .addField('Created At: ', `${member.user.createdAt.toUTCString()}`) - //.addField('Invite Code: ', `${member.invite.code}`) .setColor('#4bff31') .setTimestamp(); let guildMember = client.channels.cache.get(logChannel); if (!guildMember) return; - guildMember.send(logEmbed); + guildMember.send({ embeds: [logEmbed]}); if (autoRole === true) { - if (member.guild.id !== '243022206437687296') return; - const role = member.guild.roles.cache.get('657426918416580614'); + if (member.guild.id !== serverWhitelist) return; + const role = member.guild.roles.cache.get(roleWhitelist); member.roles.add(role); - log(`[i] ${member.user.username} joined Alee Productions.`.green); - log(`[i] I gave ${member.user.username} the "Member" role.`.green); + log(`[i] ${member.user.username} joined Andrew Lee Projects, automatically giving them role.`.green); } }); client.on('guildMemberRemove', (member) => { - if (member.guild.id !== '243022206437687296') return; + if (member.guild.id !== serverWhitelist) return; const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Logging', client.user.avatarURL()) .setDescription(`A user has left this server!`) - .addField('Username: ', `${member.displayName}`, true) + .addField('Username: ', `${member.user.tag}`, true) .addField('User ID: ', `${member.id}`, true) .setColor('#ec2727') .setTimestamp(); @@ -270,12 +281,12 @@ client.on('guildMemberRemove', (member) => { let guildMember = client.channels.cache.get(logChannel); if (!guildMember) return; - guildMember.send(logEmbed); + guildMember.send({ embeds: [logEmbed]}); }) client.on('messageUpdate', async (oldMessage, newMessage) => { - if (oldMessage.guild.id !== '243022206437687296') return; + if (oldMessage.guild.id !== serverWhitelist) return; if (oldMessage.content === newMessage.content) { return; } @@ -287,15 +298,15 @@ client.on('messageUpdate', async (oldMessage, newMessage) => { .setColor('#ffff1a') .setTimestamp() .setFooter(`Author ID: ${oldMessage.author.id}`); - + let editMessage = client.channels.cache.get(logChannel); if (!editMessage) return; - editMessage.send(logEmbed); + editMessage.send({ embeds: [logEmbed]}); }); client.on('messageDelete', (message) => { - if (message.guild.id !== '243022206437687296') return; + if (message.guild.id !== serverWhitelist) return; const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Logging', client.user.avatarURL()) .setDescription(`A message from ${message.author.username} was deleted in <#${message.channel.id}>`) @@ -307,11 +318,11 @@ client.on('messageDelete', (message) => { let deleteMessage = client.channels.cache.get(logChannel); if (!deleteMessage) return; - deleteMessage.send(logEmbed); + deleteMessage.send({ embeds: [logEmbed]}); }); client.on('guildBanAdd', (guild, user) => { - if (guild.id !== '243022206437687296') return; + if (guild.id !== serverWhitelist) return; const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Logging', client.user.avatarURL()) .setDescription(`This user got banned from ${guild.name}`) @@ -323,11 +334,11 @@ client.on('guildBanAdd', (guild, user) => { let banMessage = client.channels.cache.get(logChannel); if (!banMessage) return; - banMessage.send(logEmbed); + banMessage.send({ embeds: [logEmbed]}); }); client.on('guildBanRemove', (guild, user) => { - if (guild.id !== '243022206437687296') return; + if (guild.id !== serverWhitelist) return; const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Logging', client.user.avatarURL()) .setDescription(`This user got unbanned from ${guild.name}`) @@ -339,28 +350,28 @@ client.on('guildBanRemove', (guild, user) => { let banMessage = client.channels.cache.get(logChannel); if (!banMessage) return; - banMessage.send(logEmbed); + banMessage.send({ embeds: [logEmbed]}); }); client.on('guildCreate', (guild) => { - log(`[i] New guild joined: ${guild.name} (id: ${guild.id}). This guild has ${guild.memberCount} members!`.blue); + log(`[i] New guild joined: ${guild.name} (${guild.id}). This guild has ${guild.memberCount} members!`.blue); const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot', client.user.avatarURL()) .setDescription('I got added to a server!') .addField('Server Name:', `${guild.name}`, true) .addField('Server ID:', `${guild.id}`, true) - .addField('Members', guild.memberCount, true) + .addField('Members', `${guild.memberCount}`, true) .setColor('#5cd65c') .setFooter(`We now run on ${client.guilds.cache.size} guilds.`); let statusChannel = client.channels.cache.get(statusChannelID); if (!statusChannel) return; - statusChannel.send(logEmbed); + statusChannel.send({ embeds: [logEmbed]}); }); client.on('guildDelete', (guild) => { - log(`[i] I have been removed from: ${guild.name} (id: ${guild.id})`.red); + log(`[i] I have been removed from: ${guild.name} (${guild.id})`.red); const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot', client.user.avatarURL()) .setDescription('I got removed from a server...') @@ -371,18 +382,30 @@ client.on('guildDelete', (guild) => { let statusChannel = client.channels.cache.get(statusChannelID); if (!statusChannel) return; - statusChannel.send(logEmbed); + statusChannel.send({ embeds: [logEmbed]}); }); -dbl.on('posted', () => { - log('Server count posted!'.blue); -}); +client.on("messageReactionAdd", async (reaction, user) => { + // When a reaction is received, check if the structure is partial + if (reaction.partial) { + // If the message this reaction belongs to was removed, the fetching might result in an API error which should be handled + try { + await reaction.fetch(); + } catch (error) { + console.error('Something went wrong when fetching the message:', error); + // Return as `reaction.message.author` may be undefined/null + return; + } + } -dbl.on('error', (e) => { - log(`[X | DBL ERROR] ${e}`.red); + // Now the message has been cached and is fully available + console.log(`${reaction.message.author}'s message "${reaction.message.content}" gained a reaction!`); + // The reaction is now also fully available and the properties will be reflected accurately: + console.log(`${reaction.count} user(s) have given the same reaction to this message!`); }); -client.on('message', (msg) => { +client.on('messageCreate', async(msg) => { + if (!client.application?.owner) await client.application?.fetch(); if (msg.author.bot) return; const prefixes = JSON.parse(fs.readFileSync('./storage/prefixes.json', 'utf8')); @@ -410,7 +433,7 @@ client.on('message', (msg) => { if (cmd) { if (cmd.conf.guildOnly === true) { if (!msg.channel.guild) { - return msg.channel.createMessage('This command can only be ran in a guild.'); + return msg.channel.send('This command can only be ran in a guild.'); } } try { @@ -427,9 +450,24 @@ client.on('message', (msg) => { } }); +client.on('interactionCreate', async (interaction) => { + if (!interaction.isCommand()) return; + + if (!client.commands.has(interaction.commandName)) return; + + try { + await client.commands.get(interaction.commandName).execute(interaction); + } catch (error) { + console.error(error); + await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true }); + } + +}); + process.on('unhandledRejection', function(err, p) { log('[X | UNCAUGHT PROMISE] ' + err.stack.red); }); + client.on('reconnecting', function() { log('[!] AleeBot has disconnected from Discord and is now attempting to reconnect.'.yellow); }); diff --git a/commands/about.js b/commands/about.js index a455faa..be1c17d 100644 --- a/commands/about.js +++ b/commands/about.js @@ -1,7 +1,7 @@ /** ************************************** * * About: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,15 +18,33 @@ * * *************************************/ module.exports.run = async (client, message) => { - const Discord = require('discord.js'); - const os = require('os'); - const embed = new Discord.MessageEmbed() + const { MessageEmbed, MessageButton, MessageActionRow } = require('discord.js'); + + let Contributors = ('- Andrew Lee (Founder of this project)\n'); + Contributors += ('- OfficialRain (Raina) (Uptime Command)\n'); + Contributors += ('- jtsshieh (Command Handler)'); + + const aboutEmbed = new MessageEmbed() .setAuthor(`AleeBot ${require('../storage/settings.json').abVersion}`, client.user.avatarURL()) - .addField('About AleeBot', 'AleeBot is an all-in-one bot that\'s made from the Discord.JS api!') - .addField('Contributors', 'Andrew Lee (Founder of this project)\nOfficialRain (Raina) (Uptime Command)\njtsshieh (Command Handler)') - .setFooter('© Copyright 2017-2020 Alee Productions, Licensed with GPL-3.0') + .addField('About AleeBot', 'AleeBot is an all-in-one bot that\'s made from the Discord.JS API!') + .addField('License', 'GNU General Public License v3.0') + .addField('Contributors', Contributors) + .setFooter('© Copyright 2017-2023 Andrew Lee Projects') .setColor('#1fd619'); - await message.channel.send({embed}); + + let inviteButton = new MessageActionRow() + .addComponents( + new MessageButton() + .setStyle('LINK') + .setLabel('Invite AleeBot') + .setURL('https://top.gg/bot/282547024547545109'), + new MessageButton() + .setStyle('LINK') + .setLabel('Join Andrew Lee Projects') + .setURL('https://discord.gg/EFhRDqG') + ); + + await message.channel.send({embeds: [aboutEmbed], components: [inviteButton]}); }; exports.conf = { diff --git a/commands/addquote.js b/commands/addquote.js deleted file mode 100644 index 7b7221e..0000000 --- a/commands/addquote.js +++ /dev/null @@ -1,60 +0,0 @@ -/** ************************************** - * - * AddQuote: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * *************************************/ -module.exports.run = async (client, message, args) => { - /* - const moment = require('moment'); - const log = message => { - - console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] ${message}`); - - }; - const fs = require('fs'); - if(!args[0]) return message.reply(`Usage: ab:addquote [author] [authorImage] [quote] [year]`); - - let quotes = JSON.parse(fs.readFileSync("./storage/quotes.json", "utf8")); - - quotes = { - author: args[0], - authorImage: args[1], - quote: args[2], - year: args[3] - }; - - fs.writeFile("./storage/quotes.json", JSON.stringify(quotes), (err) =>{ - if (err) log(err) - }) - - message.reply(`You just added a new quote!`); - log(`[i] A quote has been added to quotes.json...`) -*/ - message.reply('Command is broken for now'); -}; - -exports.conf = { - aliases: [], - guildOnly: true, -}; -exports.help = { - name: 'addquote', - description: 'Sets the guild prefix.', - usage: 'addquote [author] [authorImage] [quote] [year]', - category: '- Quote Commands', -}; - diff --git a/commands/ask.js b/commands/ask.js index 3b1efd5..efb4a22 100644 --- a/commands/ask.js +++ b/commands/ask.js @@ -1,7 +1,7 @@ /** ************************************** * * Ask: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ module.exports.run = async (client, message, args) => { 'Yep. Just kidding :P', 'I doubt it.', 'Maybe?', + 'Perhaps...', 'I don\'t know?', 'Hmm let me think :thinking:', ]; diff --git a/commands/avatarurl.js b/commands/avatarurl.js index 7c50e2c..2c796f4 100644 --- a/commands/avatarurl.js +++ b/commands/avatarurl.js @@ -1,7 +1,7 @@ /** ************************************** * * avatarurl: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,11 +18,17 @@ * * *************************************/ module.exports.run = async (client, message) => { - message.reply(message.author.avatarURL({ dynamic: true, format: 'png', size: 1024 })); + if(!message.mentions.users.first()) { + message.reply(message.author.avatarURL({ dynamic: true, format: 'png', size: 1024 })); + } else { + let targetMember; + targetMember = message.mentions.users.first(); + message.reply(targetMember.avatarURL({ dynamic: true, format: 'png', size: 1024 })) + } }; exports.conf = { - aliases: [], + aliases: ['pic'], guildOnly: false, }; exports.help = { diff --git a/commands/ban.js b/commands/ban.js index 3c8a809..b734be5 100644 --- a/commands/ban.js +++ b/commands/ban.js @@ -1,7 +1,7 @@ /** ************************************** * * Ban: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,16 +21,16 @@ module.exports.run = async (client, message, args) => { const Discord = require('discord.js'); const mreason = args.join(' ').slice(22); if (!message.member.permissions.has('BAN_MEMBERS')) return message.reply('It looks like that you don\'t have the permissions to ban people.'); - if (!message.guild.member(client.user).hasPermission('BAN_MEMBERS')) return message.reply('Uhh... I don\'t have permission to ban members.'); + if (!message.guild.members.cache.get(client.user.id).permissions.has('BAN_MEMBERS')) return message.reply('I don\'t have permission to ban members.'); const member = message.mentions.members.first(); - if (!member) return message.reply('Uhh... Please mention a member first.'); - await member.ban(`Banned by ${message.author.tag} Reason: ` + mreason); - const embed = new Discord.MessageEmbed() + if (!member) return message.reply('Please mention a member first.'); + await member.ban({ reason: `Banned by ${message.author.tag} for ${mreason}.`}); + const banEmbed = new Discord.MessageEmbed() .setTitle('User Banned!') .setColor('#1fd619') .addField('**User:**', `${member.user.tag}`) - .addField('**Reason:**', `\`\`\`${mreason}\`\`\``); - await message.channel.send({embed}); + if (mreason) return banEmbed.addField('**Reason:**', `\`\`\`${mreason}\`\`\``); + await message.channel.send({embeds: [banEmbed]}); }; exports.conf = { diff --git a/commands/eval.js b/commands/eval.js index ef8fc97..b414225 100644 --- a/commands/eval.js +++ b/commands/eval.js @@ -1,7 +1,7 @@ /** ************************************** * * Eval: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions & jtsshieh + PokeWorld + * Copyright (C) 2017-2021 Alee Productions & jtsshieh + PokeWorld * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -47,7 +47,7 @@ module.exports.run = async (client, message, args) => { .addField(':outbox_tray: Output:', `\`\`\`${err}\`\`\``) .setFooter('Eval', client.user.avatarURL()) .setColor('RED'); - return message.channel.send({embed}); + return message.channel.send({embeds: [embed]}); } try { @@ -59,7 +59,7 @@ module.exports.run = async (client, message, args) => { .setFooter('Eval', client.user.avatarURL()) .setColor('GREEN'); - return message.channel.send({embed}); + return message.channel.send({embeds: [embed]}); } catch (err) { const embed = new MessageEmbed() .setAuthor('Eval Error') @@ -68,7 +68,7 @@ module.exports.run = async (client, message, args) => { .addField(':outbox_tray: Output:', `\`\`\`${err}\`\`\``) .setFooter('Eval', client.user.avatarURL()) .setColor('RED'); - return message.channel.send({embed}); + return message.channel.send({embeds: [embed]}); } }; diff --git a/commands/git.js b/commands/git.js index ed98ebf..e4912e1 100644 --- a/commands/git.js +++ b/commands/git.js @@ -1,7 +1,7 @@ /** ************************************** * * Git: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,16 +18,23 @@ * * *************************************/ module.exports.run = async (client, message) => { - const Discord = require('discord.js'); + const { MessageEmbed, MessageButton, MessageActionRow } = require('discord.js'); const git = require('git-last-commit'); git.getLastCommit(function(err, commit) { - const embed = new Discord.MessageEmbed() - .setTitle('GitHub Information') - .addField('**Repository:**', 'https://github.com/aleeproductions/AleeBot') + const gitInfo = new MessageEmbed() + .setTitle('Git Information') .addField('**Last Commit:**', commit.subject) .addField('**Commited By:**', commit.author.name) .setColor('#1fd619'); - message.channel.send({embed}); + + let sourceCode = new MessageActionRow() + .addComponents( + new MessageButton() + .setStyle('LINK') + .setLabel('Source Code') + .setURL('https://github.com/alee14-projects/AleeBot') + ); + message.channel.send({embeds: [gitInfo], components: [sourceCode]}); }); }; diff --git a/commands/help.js b/commands/help.js index 36d4630..0b9191e 100644 --- a/commands/help.js +++ b/commands/help.js @@ -1,7 +1,7 @@ /** ************************************** * * Help: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,12 +38,12 @@ module.exports.run = async (client, message) => { } const prefix = prefixes[message.guild.id].prefixes; - if (!message.guild.member(client.user).hasPermission('EMBED_LINKS')) return message.reply('ERROR: AleeBot doesn\'t have the permission to send embed links please enable them to use the full help.'); + if (!message.guild.members.cache.get(client.user.id).permissions.has('EMBED_LINKS')) return message.reply('ERROR: AleeBot doesn\'t have the permission to send embed links, please enable them to use the full help.'); const embed = new Discord.MessageEmbed() - .setAuthor('AleeBot ' + require('../storage/settings.json').abVersion + ` Help and on ${client.guilds.cache.size} servers`, client.user.avatarURL()) - .setDescription('Every command you input into AleeBot is `' + prefix + '`') + .setAuthor('AleeBot ' + require('../storage/settings.json').abVersion + ` Help`, client.user.avatarURL()) + .setDescription('Every command you input into AleeBot is `ab:`') + .setFooter(`Currently serving on ${client.guilds.cache.size} servers`) .setColor('#1fd619') - .setFooter('© Copyright 2017-2020 Alee Productions, Licensed with GPL-3.0'); categories.forEach(function(x) { let cat = ''; @@ -55,7 +55,7 @@ module.exports.run = async (client, message) => { embed.addField(x, cat, true); }); - await message.channel.send({embed}); + await message.channel.send({embeds: [embed]}); }; exports.conf = { diff --git a/commands/info.js b/commands/info.js index 3de7ecd..95eaebb 100644 --- a/commands/info.js +++ b/commands/info.js @@ -1,7 +1,7 @@ /** ************************************** * * Info: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,16 +18,19 @@ * * *************************************/ module.exports.run = async (client, message) => { - const Discord = require('discord.js'); + const { MessageEmbed, version } = require('discord.js'); const os = require('os'); - const embed = new Discord.MessageEmbed() + const mongoose = require('mongoose'); + const embed = new MessageEmbed() .setTitle('Information on AleeBot\'s Host') .addField('OS Hostname: ', os.hostname(), true) .addField('NodeJS Version: ', process.versions.node, true) + .addField('Discord.JS Version: ', version, true) .addField('OS Platform: ', os.platform(), true) .addField('OS Version: ', os.release(), true) + .addField('Mongoose Version:', mongoose.version, true) .setColor('#1fd619'); - message.channel.send({embed}); + await message.channel.send({ embeds: [embed] }); }; exports.conf = { diff --git a/commands/interrogate.js b/commands/interrogate.js index 54e8cb2..3386352 100644 --- a/commands/interrogate.js +++ b/commands/interrogate.js @@ -1,7 +1,7 @@ /** ************************************** * * Interrogate: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,10 +18,10 @@ * * *************************************/ module.exports.run = async (client, message, args) => { - if (message.guild.id != '243022206437687296') return message.reply('This is a ALP exclusive command.'); + if (message.guild.id !== '243022206437687296') return message.reply('This is a Binaryworks exclusive command.'); - if (!message.member.hasPermission('BAN_MEMBERS')) return message.reply('It looks like that you don\'t have the permissions to jail members.'); - if (!message.guild.member(client.user).hasPermission('MANAGE_ROLES')) return message.reply('Uhh... I don\'t have permission to jail members.'); + if (!message.member.permissions.has('BAN_MEMBERS')) return message.reply('It looks like that you don\'t have the permissions to jail members.'); + if (!message.guild.members.cache.get(client.user.id).permissions.has('MANAGE_ROLES')) return message.reply('Uhh... I don\'t have permission to jail members.'); const member = message.mentions.members.first(); if (!member) return await message.reply('Uhh... Please mention a member first.'); diff --git a/commands/invite.js b/commands/invite.js deleted file mode 100644 index e6f538f..0000000 --- a/commands/invite.js +++ /dev/null @@ -1,49 +0,0 @@ -/** ************************************** - * - * Invite: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * *************************************/ -module.exports.run = async (client, message) => { - message.channel.send({embed: { - color: 2086425, - title: 'Invite Command', - fields: [{ - name: 'Invite AleeBot', - value: '[Invite AleeBot to your server.](https://top.gg/bot/282547024547545109)', - }, - { - name: 'Join the Alee Productions Community', - value: '[Discord Server](https://discord.gg/EFhRDqG)', - }, - ], - }, - }); - - // message.channel.send('Want AleeBot in your server? Here\'s the link: https://discordapp.com/api/oauth2/authorize?client_id=282547024547545109&permissions=2080375863&scope=bot'); -}; - -exports.conf = { - aliases: [], - guildOnly: false, -}; -exports.help = { - name: 'invite', - description: 'Gives you an invite to the guild and the bot.', - usage: 'invite', - category: '- General Commands', -}; - diff --git a/commands/kick.js b/commands/kick.js index 3cbaaf8..c248afc 100644 --- a/commands/kick.js +++ b/commands/kick.js @@ -1,7 +1,7 @@ /** ************************************** * * Kick: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,16 +21,16 @@ module.exports.run = async (client, message, args) => { const Discord = require('discord.js'); const mreason = args.join(' ').slice(22); if (!message.member.permissions.has('KICK_MEMBERS')) return message.reply('It looks like that you don\'t have the permissions to kick people.'); - if (!message.guild.member(client.user).hasPermission('KICK_MEMBERS')) return message.reply('Uhh... I don\'t have permission to kick members.'); + if (!message.guild.members.cache.get(client.user.id).permissions.has('KICK_MEMBERS')) return message.reply('I don\'t have permission to kick members.'); const member = message.mentions.members.first(); - if (!member) return message.reply('Uhh... Please mention a member first.'); - member.kick(`Kicked by: ${message.author.tag} Reason: ` + mreason); - const embed = new Discord.MessageEmbed() + if (!member) return message.reply('Please mention a member first.'); + await member.kick(`Kicked by ${message.author.tag} for ${mreason}.`); + const kickEmbed = new Discord.MessageEmbed() .setTitle('User Kicked!') .setColor('#1fd619') .addField('**User:**', `${member.user.tag}`) - .addField('**Reason:**', `\`\`\`${mreason}\`\`\``); - await message.channel.send({embed}); + if (mreason) return kickEmbed.addField('**Reason:**', `\`\`\`${mreason}\`\`\``); + await message.channel.send({embeds: [kickEmbed]}); }; exports.conf = { diff --git a/commands/leaveguild.js b/commands/leaveguild.js index 5108436..00a97fc 100644 --- a/commands/leaveguild.js +++ b/commands/leaveguild.js @@ -1,7 +1,7 @@ /** ************************************** * * LeaveGuild: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,8 +18,8 @@ * * *************************************/ module.exports.run = async (client, message) => { - if (!['242775871059001344', message.guild.owner.user.id].includes(message.author.id)) return message.reply('Nope! You need the person who created this bot or the owner of this guild to use this command.'); - message.channel.send('Alright, I\'m leaving the server now. Bye everyone!'); + if (!['242775871059001344', message.guild.ownerID].includes(message.author.id)) return message.reply('Nope! You need the person who created this bot or the owner of this guild to use this command.'); + await message.channel.send('Leaving server. If that\'s a mistake, you can re-invite me'); message.guild.leave(); }; diff --git a/commands/nick.js b/commands/nick.js index f65bf74..8fcdce7 100644 --- a/commands/nick.js +++ b/commands/nick.js @@ -1,7 +1,7 @@ /** ************************************** * * Nick: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ * * *************************************/ module.exports.run = async (client, message, args) => { - if (!message.guild.member(client.user).hasPermission('MANAGE_NICKNAME')) return message.reply('**ERROR:** I can\'t change nicknames. (Check permissions)'); + if (!message.guild.members.cache.get(client.user.id).permissions.has('MANAGE_NICKNAME')) return message.reply('**ERROR:** I can\'t change nicknames. (Check permissions)'); const nick = args.join(' '); message.member.setNickname(nick); message.channel.send(`Alright! I changed your nickname to \`${nick}\``); diff --git a/commands/ping.js b/commands/ping.js index b8d2779..d66330d 100644 --- a/commands/ping.js +++ b/commands/ping.js @@ -1,7 +1,7 @@ /** ************************************** * * Ping: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/commands/poweroff.js b/commands/poweroff.js index 8067c5f..22fb6bb 100644 --- a/commands/poweroff.js +++ b/commands/poweroff.js @@ -1,7 +1,7 @@ /** ************************************** * * Poweroff: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ module.exports.run = async (client, message) => { let statusChannel = client.channels.cache.get('606602551634296968'); if (!statusChannel) return console.error('The status channel does not exist! Skipping.'); - await statusChannel.send(stopEmbed); + await statusChannel.send({ embeds: [stopEmbed]}); await message.reply(':warning: AleeBot will now exit!'); console.log('[i] AleeBot will now exit!'.blue); client.destroy(); diff --git a/commands/purge.js b/commands/purge.js index 97c1be6..bc6e727 100644 --- a/commands/purge.js +++ b/commands/purge.js @@ -1,7 +1,7 @@ /** ************************************** * * Purge: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/commands/quote.js b/commands/quote.js index 149fe37..37f5714 100644 --- a/commands/quote.js +++ b/commands/quote.js @@ -1,7 +1,7 @@ /** ************************************** * * Quote: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,39 +17,33 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * * *************************************/ -module.exports.run = async (client, message) => { - const Discord = require('discord.js'); - - let NewQuote; - - function GetNewQuote(quoteNum = -1) { - NewQuote = new Discord.MessageEmbed(); - - let quo = require('../storage/quotes.json').quotes; +module.exports.run = async (client, message, args) => { + const quoteDB = require('../models/quote'); + const { MessageEmbed } = require('discord.js'); + let quoteID = args[0]; + + if (quoteID === undefined) { + const quoteList = await quoteDB.findAll({ attributes: ['id'] }) + const random = crypto.getRandomValues(new Uint32Array(1)); + quoteID = quoteList[random[0] % quoteList.length].id; + } - if (quoteNum == -1) { - quoteNum = Math.floor(Math.random() * 1000) % quo.length; - quo=quo[quoteNum]; - } + const quote = await quoteDB.findOne({ where: { id: quoteID } }) - const author = quo.author; - const authorImage = quo.authorImage; - const quote = quo.quote; - const year = quo.year; - const url = quo.url; - NewQuote.setAuthor(author, authorImage); - NewQuote.setColor('#1fd619'); - NewQuote.setDescription(quote); - NewQuote.setFooter('- ' + year); - NewQuote.setURL(url); + if (quote) { + const quoteEmbed = new MessageEmbed() + .setAuthor({ name: quote.author, iconURL: quote.authorImage }) + .setDescription(quote.quote) + .setColor('#1fd619') + .setFooter('- ' + quote.year); - return NewQuote; + await message.reply({ content: 'Alright, here\'s your quote.', embeds: [quoteEmbed] }) + } else { + message.reply('Cannot find quote, specify the correct quote id.'); } - const newquote = GetNewQuote(); - message.reply('Alright, here\'s your quote.'); - message.channel.send(newquote); + }; exports.conf = { diff --git a/commands/say.js b/commands/say.js index fe17b42..9ef9707 100644 --- a/commands/say.js +++ b/commands/say.js @@ -1,7 +1,7 @@ /** ************************************** * * Say: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/commands/serverinfo.js b/commands/serverinfo.js new file mode 100644 index 0000000..67442a2 --- /dev/null +++ b/commands/serverinfo.js @@ -0,0 +1,51 @@ +/** ************************************** + * + * ServerInfo: Command for AleeBot + * Copyright (C) 2017-2021 Alee Productions + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * *************************************/ +module.exports.run = async (client, message) => { + const Discord = require('discord.js'); + const listedChannels = []; + let guildOwner = await message.guild.fetchOwner(); + let memberCountNoBots = await message.guild.members.fetch().then((members) => members.filter(member => !member.user.bot).size); + const embed = new Discord.MessageEmbed() + .setAuthor(`${message.guild.name}`, `${message.guild.iconURL()}`) + .setDescription('Server Information') + .setThumbnail(message.guild.iconURL()) + .addField('Main Information', `**Server Name:** ${message.guild.name}\n**Server ID:** ${message.guild.id}\n**Server Owner:** ${guildOwner.user.tag}`) + .addField('Join Dates', `**Created At:** ${message.guild.createdAt.toUTCString()}\n**AleeBot Joined:** ${message.guild.joinedAt.toUTCString()}`) + /*message.guild.channels.cacheType.forEach(channel => { + listedChannels.push(channel) + })*/ + //.addField('Channels', `${listedChannels.join('\n')}`) + //.addField('Total Channels', message.guild.channelCountMode) + .addField('Total Members (with bots)', `${message.guild.memberCount}`) + .addField('Total Members (without bots)', `${memberCountNoBots}`) + .setColor('#1fd619'); + await message.channel.send({embeds: [embed]}); +}; + +exports.conf = { + aliases: ['sinfo'], + guildOnly: false, +}; +exports.help = { + name: 'serverinfo', + description: 'Tells your info.', + usage: 'serverinfo', + category: '- Information Commands', +}; diff --git a/commands/setlogchannel.js b/commands/setlogchannel.js new file mode 100644 index 0000000..c04e926 --- /dev/null +++ b/commands/setlogchannel.js @@ -0,0 +1,46 @@ +/** ************************************** + * + * SetLogChannel: Command for AleeBot + * Copyright (C) 2017-2021 Alee Productions + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * *************************************/ +const guildDB = require ('../models/guild-settings') +module.exports.run = async (client, message) => { + //This will be replaced in the future possibly + if (!message.member.permissions.has('MANAGE_GUILD')) return message.reply('It looks like that you can\'t manage this server.'); + const channel = await message.mentions.channels.first().id; + const [ guild ] = await guildDB.findOrCreate({ where: { id: message.guild.id } } ) + + if (!channel) { + message.reply('No channel has been set, disabling the logging channel feature...'); + await guild.update({ channelId: null } ); + } else { + await guild.update({ channelId: message.guild.id } ) ; + } + + await message.reply(`Logging channel has been set to <#${channel}>`); +}; + +exports.conf = { + aliases: [], + guildOnly: false, +}; +exports.help = { + name: 'setlogchannel', + description: 'Set the log channel.', + usage: 'setlogchannel #channel', + category: '- Moderation Commands', +}; diff --git a/commands/setprefix.js b/commands/setprefix.js index edb42c9..6800eea 100644 --- a/commands/setprefix.js +++ b/commands/setprefix.js @@ -1,7 +1,7 @@ /** ************************************** * * SetPrefix: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ module.exports.run = async (client, message, args) => { console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] ${message}`); }; const fs = require('fs'); - if (!message.member.hasPermission('ADMINISTRATOR')) return message.reply('Sorry you need admin to set my prefix'); + if (!message.member.permissions.has('ADMINISTRATOR')) return message.reply('Sorry you need admin to set my prefix'); if (!args[0] || args[0 == 'help']) return message.reply('Usage: <your prefix>setprefix <prefix>'); const prefixes = JSON.parse(fs.readFileSync('./storage/prefixes.json', 'utf8')); diff --git a/commands/setup.js b/commands/setup.js index bf6a14c..5c2f232 100644 --- a/commands/setup.js +++ b/commands/setup.js @@ -1,7 +1,7 @@ /**************************************** - * + * * Setup: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,22 +15,23 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * * *************************************/ module.exports.run = async (client, message) => { - if (!['242775871059001344', message.guild.owner.user.id].includes(message.author.id)) return message.reply(':warning: You must be a server owner or be the creator of the bot to access this command.'); + if (!['242775871059001344', message.guild.ownerId].includes(message.author.id)) return message.reply(':warning: You must be a server owner or be the creator of the bot to access this command.'); message.reply('Look at your DMs.'); //message.reply("This feature is coming soon. Stay tuned!"); const Discord = require('discord.js'); const setupEmbed = new Discord.MessageEmbed() .setTitle('AleeBot Setup', client.user.avatarURL()) .setDescription('Select the options') - .addField('Logs', 'channelid', true) - // .addField('Chat Logs', 'placeholder', true) - // .addField('Chat Logs', 'placeholder', true); + .addField('Chat Logs', 'channelid', true) + .addField('Joining & Leaving Logs', 'placeholder', true) + .addField('Broadcast', 'placeholder', true) + .addField('Broadcast', 'placeholder', true); - message.author.send(setupEmbed); + message.author.send({embeds: [setupEmbed]}); }; exports.conf = { @@ -42,4 +43,4 @@ exports.help = { description: 'Setting up AleeBot.', usage: 'setup', category: '- Settings Commands', -};
\ No newline at end of file +}; diff --git a/commands/slowdown.js b/commands/slowdown.js index c9fc611..55e441b 100644 --- a/commands/slowdown.js +++ b/commands/slowdown.js @@ -1,7 +1,7 @@ /** ************************************** * * Slowdown: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ module.exports.run = async (client, message, args) => { if (!message.member.permissions.has('MANAGE_CHANNELS')) return message.reply('It looks like that you don\'t have the permissions to slowdown channels.'); if (isNaN(args[0])) return message.reply('Please input a valid number to slowdown a channel.'); await message.channel.setRateLimitPerUser(args[0]); - message.channel.send(`This channel has been ratelimited for ${args[0]} second(s).`); + message.channel.send(`This channel has been slowdown for ${args[0]} second(s).`); }; diff --git a/commands/suggest.js b/commands/suggest.js index 3adaa31..b503139 100644 --- a/commands/suggest.js +++ b/commands/suggest.js @@ -1,7 +1,7 @@ /** ************************************** * * Suggest: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,15 +18,15 @@ * * *************************************/ module.exports.run = async (client, message, args) => { - if (message.guild.id != '243022206437687296') return message.reply('This is a ALP exclusive command.'); + if (message.guild.id !== '243022206437687296') return message.reply('This is a Andrew Lee Projects exclusive command.'); const {MessageEmbed} = require('discord.js'); - client.channels.cache.get('427495678390960148').send( + client.channels.cache.get('427495678390960148').send({ embeds: [ new MessageEmbed() .setColor('#1fd619') .setTitle('Suggestion') - .setDescription('This is a suggestion from '+ message.author.username +' please react to it using the following emojis.') + .setDescription('This is a suggestion from '+ message.author.username +'. Please react to it using the following emojis.') .addField('Suggestion Contents', args.join(' ')), - ).then((message) => { + ]}).then((message) => { message.react('\u2705'); message.react('\u274E'); }); @@ -39,7 +39,7 @@ exports.conf = { }; exports.help = { name: 'suggest', - description: 'Suggest a feature in ALP.', + description: 'Suggest a feature in Andrew Lee Projects.', usage: 'suggest [suggestion]', category: '- ALP Exclusive Commands', }; diff --git a/commands/suggestfeature.js b/commands/suggestfeature.js index 8b8b3c7..21b6849 100644 --- a/commands/suggestfeature.js +++ b/commands/suggestfeature.js @@ -1,7 +1,7 @@ /**************************************** - * + * * SuggestFeature: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,22 +15,23 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * * *************************************/ module.exports.run = async (client, message, args) => { const { MessageEmbed } = require('discord.js'); - - client.channels.cache.get('427495678390960148').send( + + client.channels.cache.get('427495678390960148').send({ embeds: [ new MessageEmbed() - .setColor ('#1fd619') + .setColor('#1fd619') .setTitle('AleeBot Feature Suggestion') - .setDescription('This is an AleeBot feature suggestion from '+ message.author.username +` sending from ${message.guild.name}.`) + .setDescription(`This is an AleeBot feature suggested from ${message.author.username}.`) .addField('Suggestion Contents', args.join(' ')) + .setFooter(`Sending from ${message.guild.name}`, message.guild.iconURL())]} ); - await message.reply('Your suggestion has been shown to the ALP discord server!'); - + await message.reply('Your suggestion has been shown to the Andrew Lee Projects discord server!'); + }; - + exports.conf = { aliases: [], guildOnly: false, @@ -41,4 +42,4 @@ exports.help = { usage: 'suggestfeature [suggestion]', category: '- General Commands', }; - + diff --git a/commands/jail.js b/commands/timeout.js index 432f60a..bed9077 100644 --- a/commands/jail.js +++ b/commands/timeout.js @@ -1,7 +1,7 @@ /** ************************************** * * Jail: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,16 +18,23 @@ * * *************************************/ module.exports.run = async (client, message, args) => { - if (message.guild.id != '243022206437687296') return message.reply('This is a ALP exclusive command.'); + const { MessageEmbed } = require('discord.js'); - if (!message.member.hasPermission('BAN_MEMBERS')) return message.reply('It looks like that you don\'t have the permissions to jail members.'); - if (!message.guild.member(client.user).hasPermission('MANAGE_ROLES')) return message.reply('Uhh... I don\'t have permission to jail members.'); + if (!message.member.permissions.has('BAN_MEMBERS')) return message.reply('It looks like that you don\'t have the permissions to jail members.'); + if (!message.guild.members.cache.get(client.user.id).permissions.has('MANAGE_ROLES')) return message.reply('Uhh... I don\'t have permission to jail members.'); + + if (!args[1]) message.reply('Determine the length of the timeout...'); + if (!args[2]) message.reply('Determine the reason of the timeout...'); const member = message.mentions.members.first(); if (!member) return await message.reply('Uhh... Please mention a member first.'); - member.roles.add(message.guild.roles.cache.get('428205205155217418')); - message.reply(`Alright, I just jailed ${member.user.tag}.`); + const timeoutEmbed = new MessageEmbed() + .setDescription(`${member.user.tag} just got timed out!`) + .addField('Length', `${args[1]} minute(s)`) + .addField('Reason', args[2]) + .setColor('#ec2727') + member.timeout(args[1] * 60 * 1000, args[2]).then(message.reply({embeds: [timeoutEmbed]})); }; exports.conf = { @@ -35,8 +42,8 @@ exports.conf = { guildOnly: false, }; exports.help = { - name: 'jail', - description: 'Jails a member', - usage: 'jail [user]', - category: '- ALP Exclusive Commands', + name: 'timeout', + description: 'Times out a member', + usage: 'timeout [user]', + category: '- Moderation Commands', }; diff --git a/commands/uptime.js b/commands/uptime.js index 90afc81..7453ad5 100644 --- a/commands/uptime.js +++ b/commands/uptime.js @@ -1,7 +1,7 @@ /** ************************************** * * Uptime: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions & OfficialRain + * Copyright (C) 2017-2021 Alee Productions & OfficialRain * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,12 +23,17 @@ module.exports.run = async (client, message) => { let uptimeMinutes = Math.floor(uptime / 60); const minutes = uptime % 60; let hours = 0; + let days = 0; while (uptimeMinutes >= 60) { - hours++; - uptimeMinutes = uptimeMinutes - 60; + hours++; + uptimeMinutes = uptimeMinutes - 60; + } + while (hours >= 24) { + days++; + hours = hours - 24; } const uptimeSeconds = minutes % 60; - message.channel.send(':clock3: AleeBot has been up for ' + hours + ' hours, ' + uptimeMinutes + ' minutes, and ' + uptimeSeconds + ' seconds.'); + message.channel.send(`:clock3: AleeBot has been up for ${days} days, ${hours} hours, ${uptimeMinutes} minutes, and ${uptimeSeconds} seconds.`); }; exports.conf = { diff --git a/commands/userinfo.js b/commands/userinfo.js index f12454a..bc7ec8e 100644 --- a/commands/userinfo.js +++ b/commands/userinfo.js @@ -1,7 +1,7 @@ /** ************************************** * * UserInfo: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,11 +23,11 @@ module.exports.run = async (client, message) => { .setAuthor(message.author.tag, message.author.avatarURL()) .setDescription('User Information') .setThumbnail(message.author.avatarURL()) - .addField('Names', '**Username:** ' + message.author.username + '\n**Current Nickname:** ' + message.member.displayName) + .addField('Names', `**Display Name:** ${message.member.displayName}\n**Username:** ${message.author.username}\n**Server Nickname:** ${message.member.displayName}`) .addField('Identity', `**User ID:** ${message.author.id} `) - .addField('Create and Join Times', '**Created At:** ' + message.member.user.createdAt.toUTCString() + '\n**Joined Guild At:** ' + message.member.joinedAt.toUTCString()) + .addField('Create and Join Times', `**Created At:** ${message.member.user.createdAt.toUTCString()}\n**Joined Guild At:** ${message.member.joinedAt.toUTCString()}`) .setColor('#1fd619'); - await message.channel.send({embed}); + await message.channel.send({embeds: [embed]}); }; diff --git a/deprecated/balance.js b/deprecated/balance.js index ca32081..bf7618c 100644 --- a/deprecated/balance.js +++ b/deprecated/balance.js @@ -1,7 +1,7 @@ /** ************************************** * * Balance: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/deprecated/buy.js b/deprecated/buy.js index 25f2589..98d4fcf 100644 --- a/deprecated/buy.js +++ b/deprecated/buy.js @@ -1,7 +1,7 @@ /** ************************************** * * Buy: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/deprecated/daily.js b/deprecated/daily.js index c0f04f9..4a38f26 100644 --- a/deprecated/daily.js +++ b/deprecated/daily.js @@ -1,7 +1,7 @@ /** ************************************** * * Daily: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/deprecated/pay.js b/deprecated/pay.js index bc27a4b..42e0f28 100644 --- a/deprecated/pay.js +++ b/deprecated/pay.js @@ -1,7 +1,7 @@ /** ************************************** * * Pay: Command for AleeBot - * Copyright (C) 2017-2020 Alee Productions + * Copyright (C) 2017-2021 Alee Productions * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/models/guild-settings.js b/models/guild-settings.js new file mode 100644 index 0000000..2e4f8ef --- /dev/null +++ b/models/guild-settings.js @@ -0,0 +1,24 @@ +const Sequelize = require("sequelize"); +const sequelize = require('../utils/sequelize'); + +const guildSettings = sequelize.define('guild-settings', { + id: { + type: Sequelize.STRING, + primaryKey: true + }, + logChannelID: { + type: Sequelize.STRING, + allowNull: true + }, + autoRoleToggle: { + type: Sequelize.BOOLEAN, + allowNull: true + }, + autoRoleID: { + type: Sequelize.STRING, + allowNull: true + } + +}) + +module.exports = guildSettings diff --git a/models/quote.js b/models/quote.js new file mode 100644 index 0000000..f31b472 --- /dev/null +++ b/models/quote.js @@ -0,0 +1,29 @@ +const Sequelize = require("sequelize"); +const sequelize = require('../utils/sequelize'); + +const quote = sequelize.define('quotes', { + id: { + type: Sequelize.INTEGER, + autoIncrement: true, + primaryKey: true + }, + author: { + type: Sequelize.STRING, + allowNull: false + }, + authorImage: { + type: Sequelize.STRING, + allowNull: false + }, + quote: { + type: Sequelize.TEXT, + allowNull: false + }, + year: { + type: Sequelize.STRING, + allowNull: false + } + +}) + +module.exports = quote diff --git a/package.json b/package.json index f19a40b..4c23498 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aleebot", - "version": "2.0.0", + "version": "2.13.0b", "description": "A chat bot for discord written in discord.js.", "main": "bot_discord.js", "scripts": { @@ -9,31 +9,28 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/aleeproductions/AleeBot-JS.git" + "url": "git+https://github.com/Alee14/AleeBot.git" }, - "author": "Alee Productions", + "author": "Andrew Lee", "license": "GPL-3.0", "bugs": { - "url": "https://github.com/aleeproductions/AleeBot/issues" + "url": "https://github.com/Alee14/AleeBot/issues" }, - "homepage": "https://github.com/aleeproductions/AleeBot#readme", + "homepage": "https://github.com/Alee14/AleeBot#readme", "dependencies": { "blessed": "^0.1.81", "colors": "^1.3.0", - "dblapi.js": "^2.0.0", - "discord.js": "^12.5.3", + "discord.js": "^13.0.1", "eslint": "^7.1.0", - "fs": "0.0.1-security", + "express": "^4.17.1", "git-last-commit": "^0.3.0", "i18next": "^19.4.4", "moment": "^2.21.0", - "node-opus": "^0.3.0", "os": "^0.1.1", "parse-ms": "^1.0.1", "readline": "^1.3.0", - "sequelize": "^6.2.3", - "sqlite3": "^5.0.0", - "ytdl-core": "^0.20.4" + "sequelize": "^6.30.0", + "sqlite3": "^5.1.6" }, "devDependencies": { "nodemon": "^2.0.2" diff --git a/storage/activities.js b/storage/activities.js new file mode 100644 index 0000000..2b2a286 --- /dev/null +++ b/storage/activities.js @@ -0,0 +1,102 @@ +const { abVersion } = require("./settings.json"); +const { version } = require("discord.js"); + +const activities = [ + `AleeBot ${abVersion}`, + 'Coding bytes', + 'Drawing shapes', + 'Fighting Quad', + 'Installing Windows 11', + 'Breaking Windows 10', + 'Beating up big tech', + 'Deleting Google', + 'Deleting Apple', + 'Deleting System32', + 'Deleting /usr/bin/', + 'Watering down the Apple walled garden', + 'Reticulating splines', + 'Generating world', + 'Never punch a tree...', + 'Collecting data', + 'Dag dag!', + 'Developed by Andrew Lee', + 'When will 2.13 release?', + 'Alert Irruption !!!', + 'when', + 'Frying Shrimpbot', + 'RADIATION BABY', + 'Frivolously Spending', + 'Thanks! @Victor', + 'MCA DiscoVision', + 'Werq', + 'Pombo', + 'Ian Clary\'s First Day At FrivoloCo!', + 'Squid Airlines', + 'AirCS Race', + 'FrivoloCo', + 'I WANT 2 ORDER', + 'I REALLY WANT 2 ORDER', + 'Monica Is Going To Cosume You', + 'BLÅHAJ', + 'ShiftOS', + 'Histacom', + 'Wall Street', + 'Mac OS X Jaguar', + 'Abunchoo 12.10', + 'MikeOS', + 'theBeat', + 'FRESHMusicPlayer', + 'theShell', + 'theBeat', + 'theSlate', + 'theDesk', + 'Ultra Jump Mania!', + 'Battle Blaze', + 'Tempest', + 'Turbo Crash 9', + 'Pocket Gakusei', + 'Hidden Heroes', + 'Skybreakers', + 'Always Running', + 'Only Up', + 'Trade', + 'Breeze', + 'Steady', + 'Bluejay', + 'Exposing TAS-Corp', + 'Fighting Evelyn Claythorne', + 'Frying Dr. Sheridan', + 'Hacking SherCorp', + 'Games with Tari', + 'Decommissioning Meta Runners', + 'Installing Meta Runners', + '90% bug free!', + 'Google Wallet', + 'Apple Pay', + 'Splatoon 3', + 'Super Mario 64', + 'Minceraft', + 'Mario Kart 8', + 'bnbmc', + 'Evaluating JavaScript code', + 'Evaluating C# code', + 'Forkbombing FMP', + 'Merging with DLAP', + 'Now asbestos-free!', + 'May contain nuts!', + 'MythOS', + 'Also try Scratch!', + 'Funky!', + 'Apple Vision Pro', + 'What is Web3?', + 'GNU\'s NOT UNIX!', + 'Linux, but actually GNU/Linux', + 'Praise RMS! (dont)', + 'Praying to St IGNUcius', + 'Debloating my ThinkPad', + 'Turbotastic!', + 'Goddamn Idiotic Truckload of Windows', + `Now running on Discord.JS ${version}!` +]; + +exports.activity = activities diff --git a/storage/quotes.json b/storage/quotes.json deleted file mode 100644 index 78c76a4..0000000 --- a/storage/quotes.json +++ /dev/null @@ -1,260 +0,0 @@ -{ - "quotes" :[ - { - "id": 0, - "author": "Victor Tran", - "authorImage": "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote": "A letter says a whole video!", - "year": "2017", - "url": "https://cdn.discordapp.com/attachments/278874966542385152/280566273992032258/Screenshot_20170213-160944.png" - }, - { - "id": 1, - "author" : "Prince Hamlet: William Shakespeare", - "authorImage" : "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Shakespeare.jpg/468px-Shakespeare.jpg", - "quote" : "To be, or not to be, that is the question", - "year" : "circa. 1600", - "url" : "https://en.wikipedia.org/wiki/To_be,_or_not_to_be" - }, - { - "id": 2, - "author" : "Diana Adams / Mitsubishi Mirage", - "authorImage" : "https://yt3.ggpht.com/-tQLg1M-3org/AAAAAAAAAAI/AAAAAAAAAAA/-kkOvupMHXQ/s88-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "Dialing 000...\nNOOO!!!", - "year" : "2017", - "url" : "https://youtu.be/jDy57c7Y-4A?t:11m52s" - }, - { - "id": 3, - "author" : "Diana Adams / Mitsubishi Mirage", - "authorImage" : "https://yt3.ggpht.com/-tQLg1M-3org/AAAAAAAAAAI/AAAAAAAAAAA/-kkOvupMHXQ/s88-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "You'd have a crash by now!\nPardon?", - "year" : "2017", - "url" : "https://youtu.be/jDy57c7Y-4A?t:15m5s" - }, - { - "id": 4, - "author" : "Ivoponop Pena", - "authorImage" : "https://yt3.ggpht.com/-hZJxXIFsfB8/AAAAAAAAAAI/AAAAAAAAAAA/c_mjVjQWvTw/s48-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "i buy tablets for the bubble plastic", - "year" : "2016", - "url" : "https://www.youtube.com/watch?v:AqFDn0TxwH4" - }, - { - "id": 5, - "author" : "The Mill on the Floss: George Eliot", - "authorImage" : "https://upload.wikimedia.org/wikipedia/commons/8/81/George_Eliot_at_30_by_François_D%27Albert_Durade.jpg", - "quote" : "Don't judge a book by its cover", - "year" : "1860", - "url" : "https://en.wikipedia.org/wiki/Don't_judge_a_book_by_its_cover" - }, - { - "id": 6, - "author" : "tostoday", - "authorImage" : "https://yt3.ggpht.com/-gNRclMiHzN4/AAAAAAAAAAI/AAAAAAAAAAA/BNEDEUakd4A/s48-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "I don't know why but Visopsys sounds like a medical condition", - "year" : "circa. 2015", - "url" : "https://www.youtube.com/watch?v:5T-vEZeY2v0" - }, - { - "id": 7, - "author" : "Diana Adams", - "authorImage" : "https://yt3.ggpht.com/-tQLg1M-3org/AAAAAAAAAAI/AAAAAAAAAAA/-kkOvupMHXQ/s88-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "4 × 1 000 000!? 4 000 000! It's not that hard...", - "year" : "2014", - "url" : "https://youtu.be/5T-vEZeY2v0?t:9m28s" - }, - { - "id": 8, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Yes! I'm not *just* a blue happy face!", - "year" : "2016", - "url" : "https://youtu.be/2E21oad5pWQ" - }, - { - "id": 9, - "author" : "ItsDeckyah", - "authorImage" : "https://yt3.ggpht.com/-t70ZI-25A1k/AAAAAAAAAAI/AAAAAAAAAAA/uGrVakleFIM/s48-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "Always remember, don't let those who are bullying you ruin your life, they are out to do just that. And that's probably all they'll do their whole lives", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 10, - "author" : "Mighty_Eagle073", - "authorImage" : "https://yt3.ggpht.com/-Q5IvX3eEGl8/AAAAAAAAAAI/AAAAAAAAAAA/LspLd8v-PR8/s100-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "Spamming : Damning", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 11, - "author" : "Nibble", - "authorImage" : "https://yt3.ggpht.com/-SUPNlJ8a7qA/AAAAAAAAAAI/AAAAAAAAAAA/R_I4z7057_w/s100-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "AUTO CORRECF!!!", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 12, - "author" : "Alee", - "authorImage" : "https://cdn.discordapp.com/avatars/242775871059001344/b8a995d836bbb8529ae35dc12c2289de.png?size:2048", - "quote" : "IS THERE A GOOOOOGALIE HERE!!!!", - "year" : "2014", - "url" : "https://youtu.be/Ap6fUlMx90A?t:2m30s" - }, - { - "id": 13, - "author" : "143malliw", - "authorImage" : "https://yt3.ggpht.com/-SUPNlJ8a7qA/AAAAAAAAAAI/AAAAAAAAAAA/R_I4z7057_w/s100-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "but i can't write a quote, for I am the quote", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 14, - "author" : "AstralMod", - "authorImage" : "https://cdn.discordapp.com/avatars/282048599574052864/56d2d99bf763df5a05f5d157108edbdc.png?size:2048", - "quote" : "Welcome to the weekly chat chat!", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 15, - "author" : "AstralPhaser", - "authorImage" : "https://cdn.discordapp.com/avatars/230480971084988417/32f46a9671c6ceedc54b369ea73be178.png?size:2048", - "quote" : "Ok the shrimp is now on the barbie", - "year" : "2017", - "url" : "https://media.discordapp.net/attachments/277922530973581312/355882401546764289/d300-123-6379-orton-wp.png" - }, - { - "id": 16, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : ":joy: It's Cameron's Birthday!\nJoy!!!11!!111!!!!", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 17, - "author" : "Steve Jobs", - "authorImage" : "http://media.syracuse.com/news/photo/2011/01/9177328-large.jpg", - "quote" : "It's really hard to design products by focus groups. A lot of times, people don't know what they want until you show it to them.", - "year" : "1998", - "url" : "https://www.huffingtonpost.com/gregory-ciotti/why-steve-jobs-didnt-list_b_5628355.html" - }, - { - "id": 18, - "author" : "arencllc", - "authorImage" : "https://cdn.discordapp.com/avatars/191290329985581069/e4d6ee5c8836f5c79c51611d0ba536eb.png?size:2048", - "quote" : "Coding for uwp is as hard as using a UWP program.", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 19, - "author" : "FloppyDiskDrive", - "authorImage" : "https://cdn.discordapp.com/avatars/228271067821506560/a_0122b441972a6edfa6201ee871fad2a7.gif?size:2048", - "quote" : "Victor would be a champ at synchronized thinking.", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 20, - "author" : "Tembot", - "authorImage" : "https://cdn.discordapp.com/avatars/361202413165608962/fba99664eb0aeec8a47db3a74a2029d5.png?size:2048", - "quote" : "Why are u stocking me", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 21, - "author" : "PieLover12", - "authorImage" : "https://cdn.discordapp.com/avatars/344630031303311371/d84ae603ee53a5b54f7b78bcb4f733f2.png?size:2048", - "quote" : "DIE YOU LOOK LIKE TINY GIRL", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 22, - "author" : "AstralPhaser", - "authorImage" : "https://cdn.discordapp.com/avatars/230480971084988417/32f46a9671c6ceedc54b369ea73be178.png?size:2048", - "quote" : "anyway, I've gotta go now, I'll be back in 3 \"year\"s", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 23, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Zero electric cars means they don't sell electric cards here", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 24, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Unless you're living in like Denland or something", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 25, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "[goes and cries in a corner]\nWAAA\nWAAAAAAAAAA\nWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "year" : "2017", - "url" : "https://cdn.discordapp.com/attachments/373884824034869249/374564169678061568/unknown.png" - }, - { - "id": 26, - "author" : "OSFirstTimer", - "authorImage" : "https://yt3.ggpht.com/-tQLg1M-3org/AAAAAAAAAAI/AAAAAAAAAAA/-kkOvupMHXQ/s88-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "The most popular version of Linux ever called Abuncho. Abuncho 12.10.", - "year" : "2012", - "url" : "https://youtu.be/PgGbZfR6Vec?t:6s" - }, - { - "id": 27, - "author" : "Vat19", - "authorImage" : "https://s3.amazonaws.com/images1.vat19.com/branding/vat19-mobile-logo-2x.png", - "quote" : "VAAAAT NINETEEEEEEN! dot com ._.", - "year" : "2017", - "url" : "https://youtu.be/tnvcxBns_uQ?t:3m17s" - }, - { - "id": 28, - "author" : "Steve Jobs", - "authorImage" : "http://media.syracuse.com/news/photo/2011/01/9177328-large.jpg", - "quote" : "Sometimes life is going to hit you in the head with a brick. Don't lose faith.", - "year" : "circa. 2000", - "url" : "https://www.example.com/" - }, - { - "id": 29, - "author" : "Alee", - "authorImage" : "https://cdn.discordapp.com/avatars/242775871059001344/b9814f1117027993d46cd5ae9ce2dd48.png?size=2048", - "quote" : "Victor finally swore\nAnd I was like \"HOLY SHIT\"", - "year" : "2018", - "url" : "https://www.example.com/" - }, - { - "id": 30, - "author" : "Zac Bowden", - "authorImage" : "https://pbs.twimg.com/profile_images/963331874503430144/NTv0Dlaj_400x400.jpg", - "quote" : "We can happily move on to Windows 11, Windows 10 is now done and dusted", - "year" : "2018", - "url" : "https://www.example.com/" - }, - { - "id": 31, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "WHAT THE - IS THAT\nMAN I JUST CAME BACK TO MY ROOM\nAND THEN I SEE YOU WITH A GUY IN IT", - "year" : "2018", - "url" : "https://www.example.com/" - } - ] -} diff --git a/storage/quotes.json.bak b/storage/quotes.json.bak deleted file mode 100644 index 78c76a4..0000000 --- a/storage/quotes.json.bak +++ /dev/null @@ -1,260 +0,0 @@ -{ - "quotes" :[ - { - "id": 0, - "author": "Victor Tran", - "authorImage": "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote": "A letter says a whole video!", - "year": "2017", - "url": "https://cdn.discordapp.com/attachments/278874966542385152/280566273992032258/Screenshot_20170213-160944.png" - }, - { - "id": 1, - "author" : "Prince Hamlet: William Shakespeare", - "authorImage" : "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Shakespeare.jpg/468px-Shakespeare.jpg", - "quote" : "To be, or not to be, that is the question", - "year" : "circa. 1600", - "url" : "https://en.wikipedia.org/wiki/To_be,_or_not_to_be" - }, - { - "id": 2, - "author" : "Diana Adams / Mitsubishi Mirage", - "authorImage" : "https://yt3.ggpht.com/-tQLg1M-3org/AAAAAAAAAAI/AAAAAAAAAAA/-kkOvupMHXQ/s88-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "Dialing 000...\nNOOO!!!", - "year" : "2017", - "url" : "https://youtu.be/jDy57c7Y-4A?t:11m52s" - }, - { - "id": 3, - "author" : "Diana Adams / Mitsubishi Mirage", - "authorImage" : "https://yt3.ggpht.com/-tQLg1M-3org/AAAAAAAAAAI/AAAAAAAAAAA/-kkOvupMHXQ/s88-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "You'd have a crash by now!\nPardon?", - "year" : "2017", - "url" : "https://youtu.be/jDy57c7Y-4A?t:15m5s" - }, - { - "id": 4, - "author" : "Ivoponop Pena", - "authorImage" : "https://yt3.ggpht.com/-hZJxXIFsfB8/AAAAAAAAAAI/AAAAAAAAAAA/c_mjVjQWvTw/s48-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "i buy tablets for the bubble plastic", - "year" : "2016", - "url" : "https://www.youtube.com/watch?v:AqFDn0TxwH4" - }, - { - "id": 5, - "author" : "The Mill on the Floss: George Eliot", - "authorImage" : "https://upload.wikimedia.org/wikipedia/commons/8/81/George_Eliot_at_30_by_François_D%27Albert_Durade.jpg", - "quote" : "Don't judge a book by its cover", - "year" : "1860", - "url" : "https://en.wikipedia.org/wiki/Don't_judge_a_book_by_its_cover" - }, - { - "id": 6, - "author" : "tostoday", - "authorImage" : "https://yt3.ggpht.com/-gNRclMiHzN4/AAAAAAAAAAI/AAAAAAAAAAA/BNEDEUakd4A/s48-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "I don't know why but Visopsys sounds like a medical condition", - "year" : "circa. 2015", - "url" : "https://www.youtube.com/watch?v:5T-vEZeY2v0" - }, - { - "id": 7, - "author" : "Diana Adams", - "authorImage" : "https://yt3.ggpht.com/-tQLg1M-3org/AAAAAAAAAAI/AAAAAAAAAAA/-kkOvupMHXQ/s88-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "4 × 1 000 000!? 4 000 000! It's not that hard...", - "year" : "2014", - "url" : "https://youtu.be/5T-vEZeY2v0?t:9m28s" - }, - { - "id": 8, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Yes! I'm not *just* a blue happy face!", - "year" : "2016", - "url" : "https://youtu.be/2E21oad5pWQ" - }, - { - "id": 9, - "author" : "ItsDeckyah", - "authorImage" : "https://yt3.ggpht.com/-t70ZI-25A1k/AAAAAAAAAAI/AAAAAAAAAAA/uGrVakleFIM/s48-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "Always remember, don't let those who are bullying you ruin your life, they are out to do just that. And that's probably all they'll do their whole lives", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 10, - "author" : "Mighty_Eagle073", - "authorImage" : "https://yt3.ggpht.com/-Q5IvX3eEGl8/AAAAAAAAAAI/AAAAAAAAAAA/LspLd8v-PR8/s100-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "Spamming : Damning", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 11, - "author" : "Nibble", - "authorImage" : "https://yt3.ggpht.com/-SUPNlJ8a7qA/AAAAAAAAAAI/AAAAAAAAAAA/R_I4z7057_w/s100-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "AUTO CORRECF!!!", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 12, - "author" : "Alee", - "authorImage" : "https://cdn.discordapp.com/avatars/242775871059001344/b8a995d836bbb8529ae35dc12c2289de.png?size:2048", - "quote" : "IS THERE A GOOOOOGALIE HERE!!!!", - "year" : "2014", - "url" : "https://youtu.be/Ap6fUlMx90A?t:2m30s" - }, - { - "id": 13, - "author" : "143malliw", - "authorImage" : "https://yt3.ggpht.com/-SUPNlJ8a7qA/AAAAAAAAAAI/AAAAAAAAAAA/R_I4z7057_w/s100-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "but i can't write a quote, for I am the quote", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 14, - "author" : "AstralMod", - "authorImage" : "https://cdn.discordapp.com/avatars/282048599574052864/56d2d99bf763df5a05f5d157108edbdc.png?size:2048", - "quote" : "Welcome to the weekly chat chat!", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 15, - "author" : "AstralPhaser", - "authorImage" : "https://cdn.discordapp.com/avatars/230480971084988417/32f46a9671c6ceedc54b369ea73be178.png?size:2048", - "quote" : "Ok the shrimp is now on the barbie", - "year" : "2017", - "url" : "https://media.discordapp.net/attachments/277922530973581312/355882401546764289/d300-123-6379-orton-wp.png" - }, - { - "id": 16, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : ":joy: It's Cameron's Birthday!\nJoy!!!11!!111!!!!", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 17, - "author" : "Steve Jobs", - "authorImage" : "http://media.syracuse.com/news/photo/2011/01/9177328-large.jpg", - "quote" : "It's really hard to design products by focus groups. A lot of times, people don't know what they want until you show it to them.", - "year" : "1998", - "url" : "https://www.huffingtonpost.com/gregory-ciotti/why-steve-jobs-didnt-list_b_5628355.html" - }, - { - "id": 18, - "author" : "arencllc", - "authorImage" : "https://cdn.discordapp.com/avatars/191290329985581069/e4d6ee5c8836f5c79c51611d0ba536eb.png?size:2048", - "quote" : "Coding for uwp is as hard as using a UWP program.", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 19, - "author" : "FloppyDiskDrive", - "authorImage" : "https://cdn.discordapp.com/avatars/228271067821506560/a_0122b441972a6edfa6201ee871fad2a7.gif?size:2048", - "quote" : "Victor would be a champ at synchronized thinking.", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 20, - "author" : "Tembot", - "authorImage" : "https://cdn.discordapp.com/avatars/361202413165608962/fba99664eb0aeec8a47db3a74a2029d5.png?size:2048", - "quote" : "Why are u stocking me", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 21, - "author" : "PieLover12", - "authorImage" : "https://cdn.discordapp.com/avatars/344630031303311371/d84ae603ee53a5b54f7b78bcb4f733f2.png?size:2048", - "quote" : "DIE YOU LOOK LIKE TINY GIRL", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 22, - "author" : "AstralPhaser", - "authorImage" : "https://cdn.discordapp.com/avatars/230480971084988417/32f46a9671c6ceedc54b369ea73be178.png?size:2048", - "quote" : "anyway, I've gotta go now, I'll be back in 3 \"year\"s", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 23, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Zero electric cars means they don't sell electric cards here", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 24, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Unless you're living in like Denland or something", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "id": 25, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "[goes and cries in a corner]\nWAAA\nWAAAAAAAAAA\nWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "year" : "2017", - "url" : "https://cdn.discordapp.com/attachments/373884824034869249/374564169678061568/unknown.png" - }, - { - "id": 26, - "author" : "OSFirstTimer", - "authorImage" : "https://yt3.ggpht.com/-tQLg1M-3org/AAAAAAAAAAI/AAAAAAAAAAA/-kkOvupMHXQ/s88-c-k-no-mo-rj-c0xffffff/photo.jpg", - "quote" : "The most popular version of Linux ever called Abuncho. Abuncho 12.10.", - "year" : "2012", - "url" : "https://youtu.be/PgGbZfR6Vec?t:6s" - }, - { - "id": 27, - "author" : "Vat19", - "authorImage" : "https://s3.amazonaws.com/images1.vat19.com/branding/vat19-mobile-logo-2x.png", - "quote" : "VAAAAT NINETEEEEEEN! dot com ._.", - "year" : "2017", - "url" : "https://youtu.be/tnvcxBns_uQ?t:3m17s" - }, - { - "id": 28, - "author" : "Steve Jobs", - "authorImage" : "http://media.syracuse.com/news/photo/2011/01/9177328-large.jpg", - "quote" : "Sometimes life is going to hit you in the head with a brick. Don't lose faith.", - "year" : "circa. 2000", - "url" : "https://www.example.com/" - }, - { - "id": 29, - "author" : "Alee", - "authorImage" : "https://cdn.discordapp.com/avatars/242775871059001344/b9814f1117027993d46cd5ae9ce2dd48.png?size=2048", - "quote" : "Victor finally swore\nAnd I was like \"HOLY SHIT\"", - "year" : "2018", - "url" : "https://www.example.com/" - }, - { - "id": 30, - "author" : "Zac Bowden", - "authorImage" : "https://pbs.twimg.com/profile_images/963331874503430144/NTv0Dlaj_400x400.jpg", - "quote" : "We can happily move on to Windows 11, Windows 10 is now done and dusted", - "year" : "2018", - "url" : "https://www.example.com/" - }, - { - "id": 31, - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "WHAT THE - IS THAT\nMAN I JUST CAME BACK TO MY ROOM\nAND THEN I SEE YOU WITH A GUY IN IT", - "year" : "2018", - "url" : "https://www.example.com/" - } - ] -} diff --git a/storage/vtquotes.json b/storage/vtquotes.json deleted file mode 100644 index 79781cd..0000000 --- a/storage/vtquotes.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "quotes" :[ - { - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "@Derpy ♀ For your own fucking good, learn what political correctness is.", - "year" : "2017", - "url" : "https://cdn.discordapp.com/attachments/371830028381454337/372263065472729088/2017-10-24_01.58.19.png" - }, - { - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "But couldn't you at least put the mounted disks on the dick or on Dinder?\nDOCK", - "year" : "2017", - "url" : "https://www.example.com" - }, - { - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Just happened one gay?\nDAY\nOH BOY\nI BLAME SWIPE TYPING", - "year" : "2017", - "url" : "https://www.example.com" - }, - { - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "(there is a :middle_finger: emoji sitting in Gboard now after my brother sent that to Google assistant)", - "year" : "2017", - "url" : "https://www.example.com/" - }, - { - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Who needs to say fuck when you can say - instead\nI blame that on my secretary :sob:", - "year" : "2018", - "url" : "https://www.example.com/" - }, - { - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "Dire Dire DICKS\nWAIT\nNO\nDOCKS", - "year" : "2018", - "url" : "https://www.example.com/" - }, - { - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "I need to find a new sexretary ASAP\n.....\nHELP\nAHHHHHHHHHHHH\nSECRETARY", - "year" : "2018", - "url" : "https://www.example.com/" - }, - { - "author" : "Victor Tran", - "authorImage" : "https://yt3.ggpht.com/-Iuf1v4-SSSM/AAAAAAAAAAI/AAAAAAAAAAA/89IYeQw--wU/photo.jpg", - "quote" : "are you serious blake LMAO", - "year" : "2018", - "url" : "https://www.example.com/" - } - ] -} diff --git a/sync-database.js b/sync-database.js new file mode 100644 index 0000000..2462f29 --- /dev/null +++ b/sync-database.js @@ -0,0 +1,9 @@ +const quoteDB = require("./models/quote"); +const guildDB = require ('./models/guild-settings'); +quoteDB.sync({alter: true}).then(() => { + console.log('Quote database synced!') +}); + +guildDB.sync({alter: true}).then(() => { + console.log('Guild database synced!') +}); diff --git a/utils/sequelize.js b/utils/sequelize.js new file mode 100644 index 0000000..db18d50 --- /dev/null +++ b/utils/sequelize.js @@ -0,0 +1,9 @@ +const Sequelize = require("sequelize"); +const sequelize = new Sequelize('database', 'user', 'password', { + host: 'localhost', + dialect: 'sqlite', + logging: false, + storage: 'database.sqlite', +}); + +module.exports = sequelize; |
