aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Lee <andrew@alee14.me>2025-02-25 23:15:04 -0500
committerGitHub <noreply@github.com>2025-02-25 23:15:04 -0500
commit44f7f14736aaf77858ee71c80abeb3c13343d3c2 (patch)
tree47dc895e50fa95b52a894bf0806e1a6c1edc8818
parent9519602e73a53931be10438dcd990becea7989d9 (diff)
parent5777f96394444dab18a81d6f085ac81df3e62008 (diff)
downloadAleeBot-44f7f14736aaf77858ee71c80abeb3c13343d3c2.tar.gz
AleeBot-44f7f14736aaf77858ee71c80abeb3c13343d3c2.tar.bz2
AleeBot-44f7f14736aaf77858ee71c80abeb3c13343d3c2.zip
Merge pull request #36 from Alee14/beta
2.13 Release
-rw-r--r--.dockerignore6
-rw-r--r--.gitignore8
-rw-r--r--.idea/codeStyles/codeStyleConfig.xml5
-rw-r--r--.idea/dbnavigator.xml417
-rw-r--r--.idea/discord.xml2
-rw-r--r--.idea/inspectionProfiles/Project_Default.xml10
-rw-r--r--.idea/jsLibraryMappings.xml6
-rw-r--r--CONTRIBUTING.md12
-rw-r--r--Dockerfile16
-rw-r--r--README.md2
-rw-r--r--To be worked on/leave.js41
-rw-r--r--To be worked on/play.js203
-rw-r--r--To be worked on/queue.js50
-rw-r--r--To be worked on/skip.js62
-rw-r--r--api/routes/quotes.js58
-rw-r--r--api/server.js73
-rw-r--r--bot_discord.js818
-rw-r--r--commands/about.js63
-rw-r--r--commands/addquote.js251
-rw-r--r--commands/ask.js66
-rw-r--r--commands/avatarurl.js32
-rw-r--r--commands/balance.js51
-rw-r--r--commands/ban.js46
-rw-r--r--commands/eval.js138
-rw-r--r--commands/git.js43
-rw-r--r--commands/help.js140
-rw-r--r--commands/info.js54
-rw-r--r--commands/interrogate.js41
-rw-r--r--commands/invite.js51
-rw-r--r--commands/jail.js43
-rw-r--r--commands/kick.js48
-rw-r--r--commands/leaveguild.js39
-rw-r--r--commands/nick.js36
-rw-r--r--commands/pay.js60
-rw-r--r--commands/ping.js66
-rw-r--r--commands/poweroff.js54
-rw-r--r--commands/purge.js43
-rw-r--r--commands/quote.js74
-rw-r--r--commands/say.js41
-rw-r--r--commands/serverinfo.js51
-rw-r--r--commands/setlogchannel.js55
-rw-r--r--commands/setprefix.js65
-rw-r--r--commands/setup.js45
-rw-r--r--commands/slowdown.js37
-rw-r--r--commands/suggest.js59
-rw-r--r--commands/suggestfeature.js54
-rw-r--r--commands/timeout.js49
-rw-r--r--commands/uptime.js93
-rw-r--r--commands/userinfo.js53
-rw-r--r--commands/vtquote.js65
-rw-r--r--deprecated/buy.js118
-rw-r--r--deprecated/daily.js59
-rw-r--r--docker-compose.yml14
-rw-r--r--models/guild-settings.js29
-rw-r--r--models/quote.js66
-rw-r--r--package.json40
-rw-r--r--run_bash.sh43
-rw-r--r--run_linux.sh7
-rw-r--r--run_win.bat11
-rw-r--r--storage/activities.js99
-rw-r--r--storage/items.json20
-rw-r--r--storage/quotes.json260
-rw-r--r--storage/quotes.json.bak260
-rw-r--r--storage/settings.json2
-rw-r--r--storage/vtquotes.json60
-rw-r--r--sync-database.js13
-rw-r--r--update_dep.bat6
-rw-r--r--utils/sequelize.js9
-rw-r--r--web/.gitignore24
-rw-r--r--web/.vscode/extensions.json4
-rw-r--r--web/.vscode/launch.json11
-rw-r--r--web/Dockerfile9
-rw-r--r--web/astro.config.mjs21
-rw-r--r--web/bun.lockbbin0 -> 179198 bytes
-rw-r--r--web/package.json20
-rw-r--r--web/public/favicon.svg9
-rw-r--r--web/src/components/Quotes.jsx88
-rw-r--r--web/src/layouts/Layout.astro22
-rw-r--r--web/src/pages/index.astro45
-rw-r--r--web/src/styles/Quote.css33
-rw-r--r--web/tsconfig.json14
-rw-r--r--yarn.lock2349
82 files changed, 5363 insertions, 2297 deletions
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..60260be
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,6 @@
+node_modules
+npm-debug.log
+.git
+.env
+database.sqlite
+web
diff --git a/.gitignore b/.gitignore
index fb6a084..541fcd0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,11 +11,9 @@ 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
+.env
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..a55e7a1
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+ <state>
+ <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+ </state>
+</component> \ No newline at end of file
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/.idea/discord.xml b/.idea/discord.xml
index 59b11d1..a04e4e5 100644
--- a/.idea/discord.xml
+++ b/.idea/discord.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
- <option name="show" value="true" />
+ <option name="show" value="PROJECT_FILES" />
</component>
<component name="ProjectNotificationSettings">
<option name="askShowProject" value="false" />
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..eb6a880
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,10 @@
+<component name="InspectionProjectProfileManager">
+ <profile version="1.0">
+ <option name="myName" value="Project Default" />
+ <inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
+ <Languages>
+ <language minSize="86" name="JavaScript" />
+ </Languages>
+ </inspection_tool>
+ </profile>
+</component> \ No newline at end of file
diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml
new file mode 100644
index 0000000..d23208f
--- /dev/null
+++ b/.idea/jsLibraryMappings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="JavaScriptLibraryMappings">
+ <includedPredefinedLibrary name="Node.js Core" />
+ </component>
+</project> \ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 576f325..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,16 +34,18 @@ exports.help = {
name: 'name here',
description: 'Description here.',
usage: 'Usage [here]',
- category: '- General Commands',
+ category: '- [Category] Commands',
};
```
# Testing the bot
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..44c3d57
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,16 @@
+FROM node:latest
+
+WORKDIR /usr/src/bot
+
+RUN apt-get update && apt-get install -y build-essential libtool autoconf automake python3
+
+COPY package.json ./
+
+COPY yarn.lock ./
+
+RUN yarn install
+
+COPY . .
+
+ENTRYPOINT ["node", "bot_discord.js"]
+
diff --git a/README.md b/README.md
index 07f7027..6665b03 100644
--- a/README.md
+++ b/README.md
@@ -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/leave.js b/To be worked on/leave.js
index e1584f0..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) 2018 AleeCorp
+ * 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,29 +15,28 @@
*
* 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) => {
- if (!message.member.voiceChannel) return message.reply('You need a voice channel to perform this action.');
+ if (!message.member.voiceChannel) return message.reply('You need a voice channel to perform this action.');
- if (!message.guild.me.voiceChannel) return message.reply('Error: The bot isn\'t connected to a voice channel.')
+ if (!message.guild.me.voiceChannel) return message.reply('Error: The bot isn\'t connected to a voice channel.');
- if (message.guild.me.voiceChannelID !== message.member.voiceChannelID) return message.reply('Error: You aren\'t connected in the same voice channel as the bot...');
+ if (message.guild.me.voiceChannelID !== message.member.voiceChannelID) return message.reply('Error: You aren\'t connected in the same voice channel as the bot...');
- message.guild.me.voiceChannel.leave();
+ message.guild.me.voiceChannel.leave();
- message.channel.send("Leaving channel...")
+ message.channel.send('Leaving channel...');
+};
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'leave',
- description: 'Leaves voice chat.',
- usage: 'leave',
- category: '- Music Commands',
- }; \ No newline at end of file
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'leave',
+ description: 'Leaves voice chat.',
+ usage: 'leave',
+ category: '- Music Commands',
+};
diff --git a/To be worked on/play.js b/To be worked on/play.js
index ddf80db..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) 2018 AleeCorp
+ * 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,108 +15,101 @@
*
* 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, ops) => {
- const ytdl = require('ytdl-core');
-
- if (!message.member.voiceChannel) return message.reply('Please connect to a voice channel...');
-
- if (!args[0]) return message.reply('Please input a url.');
-
- let vaildate = await ytdl.validateURL(args[0]);
-
- if (!vaildate) return message.reply('Please input a **valid** url.');
-
- let info = await ytdl.getInfo(args[0]);
-
- let data = ops.active.get(message.guild.id) || {};
-
- if (!data.connection) data.connection = await message.member.voiceChannel.join();
- if (!data.queue) data.queue = [];
- data.guildID = message.guild.id;
-
- data.queue.push({
- songTitle: info.title,
- requester: message.author.tag,
- url: args[0],
- announceChannel: message.channel.id
- });
- if (!data.dispatcher) play(client, ops, data);
- else {
- const { RichEmbed } = require('discord.js');
- const embed = new RichEmbed()
- .setTitle('This music has been added to the queue!')
- .setAuthor(info.title, client.user.avatarURL)
- .setColor(0x00afff)
- .setTimestamp()
- .addField('Title', info.title)
- .addField('Requested by:', message.author.tag)
- .setFooter('AleeBot Music Player');
-
- message.channel.send({embed})
- }
-
- ops.active.set(message.guild.id, data);
-
- };
-
- async function play(client, ops, data) {
- const ytdl = require('ytdl-core');
- const { RichEmbed } = require('discord.js');
- const embed = new RichEmbed()
- .setTitle('Now playing!')
- .setAuthor(data.queue[0].songTitle, client.user.avatarURL)
- .setColor(0x00afff)
- .setTimestamp()
- .addField('Title', data.queue[0].songTitle)
- .addField('Requested by:', data.queue[0].requester)
- // .addField('Link', info.url)
- // .addField('Duration', time)
- .setFooter('AleeBot Music Player');
-
- client.channels.get(data.queue[0].announceChannel).send({embed})
-
- data.dispatcher = await data.connection.playStream(ytdl(data.queue[0].url, { filter: 'audioonly'}));
- data.dispatcher.guildID = data.guildID;
-
- data.dispatcher.once('finish', function () {
- finish(client, ops, this);
- });
-
- };
-
- function finish(client, ops, dispatcher) {
-
- let fetched = ops.active.get(dispatcher.guildID);
-
- fetched.queue.shift();
-
- if (fetched.queue.length > 0) {
-
- ops.active.set(dispatcher.guildID, fetched);
-
- play(client, ops, fetched);
-
- } else {
- ops.active.delete(dispatcher.guildID);
-
- let vc = client.guild.get(dispatcher.guildID).me.voiceChannel;
-
- if (vc) vc.leave();
-
- }
-
- }
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'play',
- description: 'Plays music.',
- usage: 'play [url]',
- category: '- Music Commands',
- }; \ No newline at end of file
+ const ytdl = require('ytdl-core');
+
+ if (!message.member.voiceChannel) return message.reply('Please connect to a voice channel...');
+
+ if (!args[0]) return message.reply('Please input a url.');
+
+ const vaildate = await ytdl.validateURL(args[0]);
+
+ if (!vaildate) return message.reply('Please input a **valid** url.');
+
+ const info = await ytdl.getInfo(args[0]);
+
+ const data = ops.active.get(message.guild.id) || {};
+
+ if (!data.connection) data.connection = await message.member.voiceChannel.join();
+ if (!data.queue) data.queue = [];
+ data.guildID = message.guild.id;
+
+ data.queue.push({
+ songTitle: info.title,
+ requester: message.author.tag,
+ url: args[0],
+ announceChannel: message.channel.id,
+ });
+ if (!data.dispatcher) play(client, ops, data);
+ else {
+ const {MessageEmbed} = require('discord.js');
+ const embed = new MessageEmbed()
+ .setTitle('This music has been added to the queue!')
+ .setAuthor(info.title, client.user.avatarURL())
+ .setColor(0x00afff)
+ .setTimestamp()
+ .addField('Title', info.title)
+ .addField('Requested by:', message.author.tag)
+ .setFooter('AleeBot Music Player');
+
+ message.channel.send({embed});
+ }
+
+ ops.active.set(message.guild.id, data);
+};
+
+async function play(client, ops, data) {
+ const ytdl = require('ytdl-core');
+ const {MessageEmbed} = require('discord.js');
+ const embed = new MessageEmbed()
+ .setTitle('Now playing!')
+ .setAuthor(data.queue[0].songTitle, client.user.avatarURL())
+ .setColor(0x00afff)
+ .setTimestamp()
+ .addField('Title', data.queue[0].songTitle)
+ .addField('Requested by:', data.queue[0].requester)
+ // .addField('Link', info.url)
+ // .addField('Duration', time)
+ .setFooter('AleeBot Music Player');
+
+ client.channels.get(data.queue[0].announceChannel).send({embed});
+
+ data.dispatcher = await data.connection.playStream(ytdl(data.queue[0].url, {filter: 'audioonly'}));
+ data.dispatcher.guildID = data.guildID;
+
+ data.dispatcher.once('finish', function() {
+ finish(client, ops, this);
+ });
+}
+
+function finish(client, ops, dispatcher) {
+ const fetched = ops.active.get(dispatcher.guildID);
+
+ fetched.queue.shift();
+
+ if (fetched.queue.length > 0) {
+ ops.active.set(dispatcher.guildID, fetched);
+
+ play(client, ops, fetched);
+ } else {
+ ops.active.delete(dispatcher.guildID);
+
+ const vc = client.guild.get(dispatcher.guildID).me.voiceChannel;
+
+ if (vc) vc.leave();
+ }
+}
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'play',
+ description: 'Plays music.',
+ usage: 'play [url]',
+ category: '- Music Commands',
+};
diff --git a/To be worked on/queue.js b/To be worked on/queue.js
index 77d86b7..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) 2018 AleeCorp
+ * 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,35 +15,33 @@
*
* 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, ops) => {
-
- let fetched = ops.active.get(message.guild.id);
+ const fetched = ops.active.get(message.guild.id);
- if (!fetched) return message.reply('Currently, there isn\'t any music playing in this guild.');
+ if (!fetched) return message.reply('Currently, there isn\'t any music playing in this guild.');
- let queue = fetched.queue
- let nowPlaying = queue[0];
+ const queue = fetched.queue;
+ const nowPlaying = queue[0];
- let resp = `__**Now Playing**__\n**${nowPlaying.songTitle}** -- **Requested By:** *${nowPlaying.requester}*\n\n__**Queue**__\n`;
+ let resp = `__**Now Playing**__\n**${nowPlaying.songTitle}** -- **Requested By:** *${nowPlaying.requester}*\n\n__**Queue**__\n`;
- for (var i = 1; i < queue.length; i++) {
- resp += `${i}. **${queue[i].songTitle}** -- **Requested By:** *${queue[i].requester}*\n`
- }
+ for (let i = 1; i < queue.length; i++) {
+ resp += `${i}. **${queue[i].songTitle}** -- **Requested By:** *${queue[i].requester}*\n`;
+ }
- message.channel.send(resp);
+ message.channel.send(resp);
+};
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'queue',
- description: 'Checks what music is in queue.',
- usage: 'queue',
- category: '- Music Commands',
- }; \ No newline at end of file
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'queue',
+ description: 'Checks what music is in queue.',
+ usage: 'queue',
+ category: '- Music Commands',
+};
diff --git a/To be worked on/skip.js b/To be worked on/skip.js
index 5a6d2b7..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) 2018 AleeCorp
+ * 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,48 +15,44 @@
*
* 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, ops) => {
+ const fetched = ops.active.get(message.guild.id);
- let fetched = ops.active.get(message.guild.id);
-
- if (!fetched) return message.reply('Currently, there isn\'t any music playing in this guild.');
-
- if (message.member.voiceChannel !== message.guild.me.voiceChannel) return message.reply('Sorry, you are currently not in the same channel as the bot.')
-
- let userCount = message.member.voiceChannel.members.size;
+ if (!fetched) return message.reply('Currently, there isn\'t any music playing in this guild.');
- let required = Math.ceil(userCount/2);
+ if (message.member.voiceChannel !== message.guild.me.voiceChannel) return message.reply('Sorry, you are currently not in the same channel as the bot.');
- if (!fetched.queue[0].voteSkips) fetched.queue[0].voteSkips = [];
+ const userCount = message.member.voiceChannel.members.size;
- if (fetched.queue[0].voteSkips.includes(message.member.id)) return message.reply(`Sorry, you have already voted to skip! ${fetched.queue[0].voteSkips.length}/${required} required.`)
+ const required = Math.ceil(userCount/2);
- fetched.queue[0].voteSkips.push(message.member.id);
+ if (!fetched.queue[0].voteSkips) fetched.queue[0].voteSkips = [];
- ops.active.set(message.guild.id, fetched);
+ if (fetched.queue[0].voteSkips.includes(message.member.id)) return message.reply(`Sorry, you have already voted to skip! ${fetched.queue[0].voteSkips.length}/${required} required.`);
- if (fetched.queue[0].voteSkips.length >= required) {
+ fetched.queue[0].voteSkips.push(message.member.id);
- message.channel.send('Successfully skipped song!');
+ ops.active.set(message.guild.id, fetched);
- return fetched.dispatcher.emit('finish');
+ if (fetched.queue[0].voteSkips.length >= required) {
+ message.channel.send('Successfully skipped song!');
- }
+ return fetched.dispatcher.emit('finish');
+ }
- message.channel.send(`Successfully voted to skip! ${fetched.queue[0].voteSkips.length}/${required} required.`)
+ message.channel.send(`Successfully voted to skip! ${fetched.queue[0].voteSkips.length}/${required} required.`);
+};
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'skip',
- description: 'Skips a music.',
- usage: 'skip',
- category: '- Music Commands',
- }; \ No newline at end of file
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'skip',
+ description: 'Skips a music.',
+ usage: 'skip',
+ category: '- Music Commands',
+};
diff --git a/api/routes/quotes.js b/api/routes/quotes.js
new file mode 100644
index 0000000..39aba7b
--- /dev/null
+++ b/api/routes/quotes.js
@@ -0,0 +1,58 @@
+const express = require('express');
+const quoteDB = require('../../models/quote.js');
+
+const router = express.Router();
+
+const pendingQuote = quoteDB.pendingQuote;
+const approvedQuote = quoteDB.quote;
+
+router.get('/pending-quotes', async (req, res) => {
+ try {
+ const quotes = await pendingQuote.findAll();
+ res.json(quotes);
+ } catch (error) {
+ console.error('Error fetching quotes:', error);
+ res.status(500).send('Internal Server Error');
+ }
+});
+
+router.post('/approve-quote', async (req, res) => {
+ const { id } = req.body;
+ try {
+ const quote = await pendingQuote.findByPk(id);
+ if (quote) {
+ await approvedQuote.create({
+ author: quote.author,
+ authorImage: quote.authorImage,
+ quote: quote.quote,
+ year: quote.year,
+ submitter: quote.submitterID
+ });
+ await pendingQuote.destroy({ where: { id } });
+ res.status(200).send('Quote approved');
+ } else {
+ res.status(404).send('Quote not found');
+ }
+ } catch (error) {
+ console.error('Error approving quote:', error);
+ res.status(500).send('Internal Server Error');
+ }
+});
+
+router.post('/reject-quote', async (req, res) => {
+ const { id } = req.body;
+ try {
+ const quote = await pendingQuote.findByPk(id);
+ if (quote) {
+ await pendingQuote.destroy({ where: { id } });
+ res.status(200).send('Quote rejected');
+ } else {
+ res.status(404).send('Quote not found');
+ }
+ } catch (error) {
+ console.error('Error rejecting quote:', error);
+ res.status(500).send('Internal Server Error');
+ }
+});
+
+module.exports = router;
diff --git a/api/server.js b/api/server.js
new file mode 100644
index 0000000..acfe528
--- /dev/null
+++ b/api/server.js
@@ -0,0 +1,73 @@
+const express = require('express');
+const cors = require('cors');
+const quotesRouter = require('./routes/quotes');
+require('dotenv').config()
+
+const app = express();
+
+const apiServer = (client) => {
+ app.use(cors()); // Allow cross-origin requests
+ app.use(express.json());
+
+ app.use('/api', quotesRouter);
+
+ app.get('/api/version', (req, res) => {
+ const { abVersion } = require('../storage/settings.json');
+ res.json(abVersion);
+
+ });
+
+ app.get('/api/uptime', (req, res) => {
+ res.json(client.uptime);
+ });
+
+ app.get('/api/servers', (req, res) => {
+ const guildsInfo = [];
+
+ if (client.guilds.cache.size === 0) {
+ res.json({
+ message: 'No servers found'
+ })
+ } else {
+ client.guilds.cache.forEach((guild) => {
+ const guildInfo = {
+ name: guild.name,
+ members: guild.memberCount,
+ id: guild.id
+ };
+ guildsInfo.push(guildInfo);
+ });
+ }
+
+ res.json(guildsInfo);
+
+ });
+
+ app.post('/api/leave', (req, res) => {
+ const { id } = req.body;
+ let guild = client.guilds.cache.get(id);
+
+ try {
+ guild.leave().then(guild => {
+ res.json({
+ guild: guild.name,
+ left: true
+ })
+ });
+
+ } catch (error) {
+ console.error('Error leaving server:', error);
+ res.status(500).res.json({
+ guild: guild.name,
+ left: false
+ })
+ }
+ });
+
+ // Start the server
+ app.listen(process.env.port, () => {
+ console.log(`Server is running on http://localhost:${process.env.port}`);
+ });
+};
+
+module.exports = apiServer;
diff --git a/bot_discord.js b/bot_discord.js
index e8d18e1..1a87074 100644
--- a/bot_discord.js
+++ b/bot_discord.js
@@ -1,327 +1,491 @@
-/****************************************
- *
- * AleeBot: Made for discord servers
- * 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/>.
- *
- * *************************************/
-const Discord = require('discord.js');
-const moment = require('moment');
-const readline = require('readline');
-const colors = require('colors');
-const DBL = require("dblapi.js");
-const client = new Discord.Client({
- disableEveryone: true
-});
-const settings = require('./storage/settings.json')
-const fs = require('fs');
-const api = require('./tokens.json');
-const dbl = new DBL(api.dbltoken, client);
-const active = new Map();
-const ownerID = "242775871059001344";
-
-const log = message => {
-
- console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] ${message}`.white);
-
-};
-
-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('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)
-
-if (process.argv.indexOf("--debug") == -1) {
- console.log("Running AleeBot without --debug command line flag. Debug output disabled.\n".yellow);
-} else {
- console.log('[!] Entering debug mode...'.yellow)
- client.on('debug', function(info) {
- log(info.gray);
- });
- client.on('warn', function(info) {
- log(info.red);
- });
-}
-
-if (process.argv.indexOf("--beta") == -1) {
- client.login(api.abtoken).catch(function() {
- console.log('[X] Login failed. The token that you put in is invalid, please put in a new one...'.red);
- process.exit(0);
- });
-
-} else {
- client.login(api.abbtoken).catch(function() {
- console.log('[X] Login failed. The token that you put in is invalid, please put in a new one...'.red);
- process.exit(0);
- });
-}
-
-client.commands = new Discord.Collection();
-client.aliases = new Discord.Collection();
-
-fs.readdir('./commands', (err, files) => {
- if (err) console.error(err);
- log(`[!] Attempting to load a total of ${files.length} commands into the memory.`.cyan);
- files.forEach(file => {
- try {
- const command = require(`./commands/${file}`);
- log(`[!] Attempting to load the command "${command.help.name}".`.cyan);
- client.commands.set(command.help.name, command);
- command.conf.aliases.forEach(alias => {
- client.aliases.set(alias, command.help.name);
- log(`[!] Attempting to load "${alias}" as an alias for "${command.help.name}"`.cyan);
- });
- }
- catch (err) {
- log('[X] An error has occured trying to load a command. Here is the error.'.red);
- console.log(err.stack);
- }
- });
- log('[>] Command Loading complete!'.green);
- console.log('\n');
-});
-
-rl.on('line', function(cmd){
- var args = cmd.split(" ");
- switch(args[0]) {
- case "guilds":
- if (client.guilds.size === 0) {
- console.log(('[!] No guilds found.'.yellow));
- } else {
- console.log('[i] Here\'s 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();
- }
- break;
- case "broadcast":
- if (!args[1]) {
- console.log('[!] Usage: broadcast [guildID] [channelID].'.yellow);
- } else {
- let broadcast = args.join(" ").slice(48);
- var guild = null;
- guild = client.guilds.get(args[1]);
- var channel = null;
- channel = guild.channels.get(args[2])
- if (channel != null) {
- channel.send(broadcast);
- }
- }
- break;
- case "uptime":
- let uptime = parseInt(client.uptime);
- uptime = Math.floor(uptime / 1000);
- let uptimeMinutes = Math.floor(uptime / 60);
- const minutes = uptime % 60;
- let hours = 0;
- while (uptimeMinutes >= 60) {
- hours++;
- uptimeMinutes = uptimeMinutes - 60;
- }
- const uptimeSeconds = minutes % 60;
- console.log(`[i] AleeBot has been up for ${hours} hours, ${uptimeMinutes} minutes, and ${uptimeSeconds} seconds.`.blue);
- break;
- case "exit":
- console.log('[i] AleeBot will now exit!'.blue)
- client.destroy();
- process.exit(0);
- break;
- case "help":
- var 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 += (`help - Shows this command.\n`)
- msg += (`exit - Exits AleeBot.\n`)
- console.log(msg.cyan);
- break;
- default:
- console.log('Unknown command, type \'help\' to list the commands...'.yellow)
- }
- rl.prompt();
-});
-
-
-client.on('ready', () => {
- 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.size} guilds`.green);
-
- client.setInterval(function() {
- const games = [
- 'AleeBot ' + settings.abVersion + ' | ' + settings.prefix + 'help',
- 'Annoying Alee',
- 'Coding stuff',
- 'Drawing shapes',
- 'Fighting AstralMod',
- ];
- setInterval(() => {
- dbl.postStats(client.guilds.size, client.shards.Id, client.shards.total);
- }, 1800000);
- client.user.setPresence({
- status: 'online',
- afk: false,
- game: {
- type: 0,
- name: games[Math.floor(Math.random() * games.length)],
- },
- });
- }, 200000);
- client.user.setStatus('online');
- //client.channels.find('id', '606602551634296968').send("**AleeBot Status:** AleeBot has started.");
- rl.prompt();
-});
-
-client.on('guildCreate', guild => {
-
- log(`[i] New guild joined: ${guild.name} (id: ${guild.id}). This guild has ${guild.memberCount} members!`.blue);
-
-});
-
-
-client.on('guildDelete', guild => {
-
- log(`[i] I have been removed from: ${guild.name} (id: ${guild.id})`.red);
-
-});
-
-dbl.on('posted', () => {
- log('Server count posted!'.blue);
-});
-
-dbl.on('error', e => {
- log(`[X | DBL ERROR] ${e}`.red);
-});
-
-client.on('message', (msg) => {
- if (msg.author.bot) return;
-
- if (msg.mentions != null && msg.mentions.users != null) {
- if (msg.mentions.users.has("282547024547545109")){
- if (msg.content.toLowerCase().includes("hello") || (msg.content.toLowerCase().includes("hi"))) {
- msg.reply(`Hello ${msg.author.username}!`);
- } else {
- if (msg.content.toLowerCase().includes("shut") && msg.content.toLowerCase().includes("up")) {
- switch (Math.floor(Math.random() * 1000) % 3) {
- case 0:
- msg.reply("Excuse me? Can you not speak to me in that tone...")
- break;
- case 1:
- msg.reply("NO! I can talk as much I can!");
- break;
- case 2:
- msg.reply("Nah I won't....");
- break;
- }
- } else if (msg.content.toLowerCase().includes("how") && msg.content.toLowerCase().includes("are") && msg.content.toLowerCase().includes("you")) {
- msg.reply("I'm doing OK, I suppose...");
- } else if (msg.content.toLowerCase().includes("ok") && msg.content.toLowerCase().includes("google")) {
- msg.reply("Erm... I am not google, if you want to use Google here's the link: https://www.google.com");
- } else if (msg.content.toLowerCase().includes("f") && msg.content.toLowerCase().includes("off")) {
- msg.reply("Do you want a hammer? :hammer:");
- } else if (msg.content.toLowerCase().includes("aleearmy")) {
- msg.reply("Oh yeah.. that thing Alee made...");
- }
- }
- }
- };
-
-
- let prefixes = JSON.parse(fs.readFileSync("./storage/prefixes.json", "utf8"));
-
- if(!prefixes[msg.guild.id]){
- prefixes[msg.guild.id] = {
- prefixes: settings.prefix
- };
- }
-
- let prefix = prefixes[msg.guild.id].prefixes
-
-
- if (!msg.content.startsWith(prefix)) return;
- const args = msg.content.slice(prefix.length).trim().split(/ +/g);
- const command = args.shift();
- let cmd;
-
- if (client.commands.has(command)) {
- cmd = client.commands.get(command);
- } else if (client.aliases.has(command)) {
- cmd = client.commands.get(client.aliases.get(command));
- }
-
- if (cmd) {
- if (cmd.conf.guildOnly == true) {
- if (!msg.channel.guild) {
- return msg.channel.createMessage('This command can only be ran in a guild.');
- }
- }
- try {
-
- let ops = {
- ownerID: ownerID,
- active: active
- }
-
- cmd.run(client, msg, args, ops);
- }
- catch (e) {
- console.error(e);
- }
- }
-});
-
-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);
-});
-
-client.on('disconnect', function() {
- log("[X] AleeBot has disconnected from Discord and will not attempt to reconnect.".red);
- console.log("At this point, you'll need to restart AleeBot.".red);
-});
+/** **************************************
+ *
+ * AleeBot: Made for discord servers
+ * Copyright (C) 2017-2025 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
+ * 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/>.
+ *
+ * *************************************/
+require('dotenv').config()
+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', 'DIRECT_MESSAGES', 'DIRECT_MESSAGE_REACTIONS']
+});
+const moment = require('moment');
+const fs = require('fs');
+const readline = require('readline');
+const colors = require('colors');
+//const i18next = require('i18next');
+const settings = require('./storage/settings.json');
+const { activity } = require('./storage/activities');
+const apiServer = require("./api/server");
+const active = new Map();
+let autoRole = true;
+let readyEmbedMessage = true;
+
+const { guildSettings } = require('./models/guild-settings');
+
+const ownerID = '242775871059001344';
+//let logChannel = '318874545593384970';
+let statusChannelID = '606602551634296968';
+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-2025 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);
+
+if (process.argv.indexOf('--debug') === -1) {
+ console.log('Running AleeBot without --debug command line flag. Debug output disabled.\n'.yellow);
+} else {
+ console.log('[!] Entering debug mode...'.yellow);
+ client.on('debug', function(info) {
+ log(info.gray);
+ });
+ client.on('warn', function(info) {
+ log(info.red);
+ });
+}
+
+if (process.argv.indexOf('--beta') === -1) {
+ client.login(process.env.abtoken).catch(function() {
+ console.log('[X] Login failed. The token that you put in is invalid, please put in a new one...'.red);
+ process.exit(0);
+ });
+} else {
+ client.login(process.env.abbtoken).catch(function() {
+ console.log('[X] Login failed. The token that you put in is invalid, please put in a new one...'.red);
+ process.exit(0);
+ });
+}
+
+client.commands = new Discord.Collection();
+client.aliases = new Discord.Collection();
+
+fs.readdir('./commands', (err, files) => {
+ if (err) console.error(err);
+ log(`[!] Attempting to load a total of ${files.length} commands into the memory.`.cyan);
+ files.forEach((file) => {
+ try {
+ const command = require(`./commands/${file}`);
+ log(`[!] Attempting to load the command "${command.help.name}".`.cyan);
+ client.commands.set(command.help.name, command);
+ command.conf.aliases.forEach((alias) => {
+ client.aliases.set(alias, command.help.name);
+ log(`[!] Attempting to load "${alias}" as an alias for "${command.help.name}"`.cyan);
+ });
+ } catch (err) {
+ log('[X] An error has occurred trying to load a command. Here is the error.'.red);
+ console.log(err.stack);
+ }
+ });
+ log('[>] Command loading complete!\n'.green);
+});
+
+rl.on('line', function(cmd) {
+ const args = cmd.split(' ');
+ switch (args[0]) {
+ case 'guilds':
+ if (client.guilds.size === 0) {
+ console.log(('[!] No guilds found.'.yellow));
+ } else {
+ console.log('[i] These are the servers that AleeBot is connected to:');
+ client.guilds.cache.forEach((guild) => {
+ console.log(` Guild Name: ${guild.name} - ID: ${guild.id}`.blue);
+ });
+ }
+ break;
+ case 'leave':
+ if (!args[1]) {
+ console.log('[!] Please insert the guild\'s ID.'.yellow);
+ } else {
+ let guild = client.guilds.cache.get(args[1]);
+ guild.leave().then(guild => {
+ console.log(`AleeBot has left ${guild.name}`)
+ });
+ }
+ break;
+ case 'broadcast':
+ if (!args[1]) {
+ console.log('[!] Usage: broadcast [guildID] [channelID].'.yellow);
+ } else {
+ const broadcast = args.join(' ').slice(48);
+ 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]** ${broadcast}`);
+ } else {
+ console.log('[X] Broadcast cannot be blank'.red)
+ }
+ }
+ break;
+ case 'uptime':
+ let uptime = parseInt(client.uptime);
+ uptime = Math.floor(uptime / 1000);
+ 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 ${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);
+ const asyncPowerOff = async () => {
+ const readyEmbed = new Discord.MessageEmbed()
+ .setAuthor('AleeBot Status', client.user.avatarURL())
+ .setDescription('AleeBot is now going offline...')
+ .setColor('#ff3333');
+ let statusChannel = client.channels.cache.get(statusChannelID);
+ if (!statusChannel) return console.error('The status channel does not exist! Skipping.');
+ await statusChannel.send(readyEmbed);
+ };
+ asyncPowerOff();
+ client.destroy();
+ process.exit(0);
+ break;
+ case 'help':
+ let msg = ('AleeBot '+ settings.abVersion +' Console Help\n\n');
+ msg += ('guilds - Shows all guilds that AleeBot\'s on.\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);
+ break;
+ default:
+ console.log('Unknown command, type \'help\' to list the commands...'.yellow);
+ }
+ rl.prompt();
+});
+
+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] Running version ${settings.abVersion} | Serving in ${client.guilds.cache.size} guilds`.green);
+
+ botPresence();
+
+ apiServer(client);
+
+ setInterval(function() {
+ botPresence();
+ }, 200000);
+ if (readyEmbedMessage === true) {
+ const readyEmbed = new Discord.MessageEmbed()
+ .setAuthor('AleeBot Status', client.user.avatarURL())
+ .setDescription('AleeBot has started')
+ .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({ embeds: [readyEmbed]});
+ }
+ rl.prompt();
+});
+
+client.on('guildMemberAdd', async (member) => {
+ const guildSetting = await guildSettings.findOne({ where: { guildID: member.guild.id } });
+ if (!guildSetting || !guildSetting.logChannelID) return;
+
+ const logEmbed = new Discord.MessageEmbed()
+ .setAuthor('AleeBot Logging', client.user.avatarURL())
+ .setDescription(`A user has joined this server!`)
+ .addField('Username: ', `${member.user.tag}`, true)
+ .addField('User ID: ', `${member.id}`, true)
+ .addField('Created At: ', `${member.user.createdAt.toUTCString()}`)
+ .setColor('#4bff31')
+ .setTimestamp();
+
+ let guildMember = client.channels.cache.get(guildSetting.logChannelID);
+ if (!guildMember) return;
+
+ guildMember.send({ embeds: [logEmbed]});
+ if (autoRole === true) {
+ if (member.guild.id !== serverWhitelist) return;
+ const role = member.guild.roles.cache.get(roleWhitelist);
+ member.roles.add(role);
+ log(`[i] ${member.user.username} joined Andrew Lee Projects, automatically giving them role.`.green);
+ }
+});
+
+client.on('guildMemberRemove', async (member) => {
+ const guildSetting = await guildSettings.findOne({ where: { guildID: member.guild.id } });
+ if (!guildSetting || !guildSetting.logChannelID) return;
+
+ const logEmbed = new Discord.MessageEmbed()
+ .setAuthor('AleeBot Logging', client.user.avatarURL())
+ .setDescription(`A user has left this server!`)
+ .addField('Username: ', `${member.user.tag}`, true)
+ .addField('User ID: ', `${member.id}`, true)
+ .setColor('#ec2727')
+ .setTimestamp();
+
+ let guildMember = client.channels.cache.get(guildSetting.logChannelID);
+ if (!guildMember) return;
+
+ guildMember.send({ embeds: [logEmbed]});
+})
+
+
+client.on('messageUpdate', async (oldMessage, newMessage) => {
+ const guildSetting = await guildSettings.findOne({ where: { guildID: oldMessage.guild.id } });
+ if (!oldMessage.guild || !guildSetting || !guildSetting.logChannelID) return;
+
+ //if (!oldMessage.guild || oldMessage.guild.id !== serverWhitelist) return;
+ if (oldMessage.content === newMessage.content) {
+ return;
+ }
+ const logEmbed = new Discord.MessageEmbed()
+ .setAuthor('AleeBot Logging', client.user.avatarURL())
+ .setDescription(`A message from ${oldMessage.author.username} was edited in <#${oldMessage.channel.id}>`)
+ .addField('Before: ', `\`\`\`${oldMessage.content}\`\`\``)
+ .addField('After: ', `\`\`\`${newMessage.content}\`\`\``)
+ .setColor('#ffff1a')
+ .setTimestamp()
+ .setFooter(`Author ID: ${oldMessage.author.id}`);
+
+ let editMessage = client.channels.cache.get(guildSetting.logChannelID);
+ if (!editMessage) return;
+
+ editMessage.send({ embeds: [logEmbed]});
+});
+
+client.on('messageDelete', async (message) => {
+ if (!message.content) return;
+
+ const guildSetting = await guildSettings.findOne({ where: { guildID: message.guild.id } });
+ if (!guildSetting || !guildSetting.logChannelID) 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}>`)
+ .addField('Deleted Message: ', `\`\`\`${message.content}\`\`\``)
+ .setColor('#ff021b')
+ .setTimestamp()
+ .setFooter(`Author ID: ${message.author.id}`);
+
+ let deleteMessage = client.channels.cache.get(guildSetting.logChannelID);
+ if (!deleteMessage) return;
+
+ deleteMessage.send({ embeds: [logEmbed]});
+});
+
+// client.on('guildBanAdd', async (guild, user) => {
+// const guildSetting = await guildSettings.findOne({ where: { guildID: guild.id } });
+// if (!guildSetting || !guildSetting.logChannelID) return;
+//
+// const logEmbed = new Discord.MessageEmbed()
+// .setAuthor('AleeBot Logging', client.user.avatarURL())
+// .setDescription(`This user got banned from ${guild.name}`)
+// .addField('User:', `${user.tag}`)
+// .addField('User ID:', `${user.id}`)
+// .setColor('#ff021b')
+// .setTimestamp();
+//
+// let banMessage = client.channels.cache.get(guildSetting.logChannelID);
+// if (!banMessage) return;
+//
+// banMessage.send({ embeds: [logEmbed]});
+// });
+//
+// client.on('guildBanRemove', async (guild, user) => {
+// const guildSetting = await guildSettings.findOne({ where: { guildID: guild.id } });
+// if (!guildSetting || !guildSetting.logChannelID) return;
+//
+// const logEmbed = new Discord.MessageEmbed()
+// .setAuthor('AleeBot Logging', client.user.avatarURL())
+// .setDescription(`This user got unbanned from ${guild.name}`)
+// .addField('User:', `${user.tag}`)
+// .addField('User ID:', `${user.id}`)
+// .setColor('#ff021b')
+// .setTimestamp();
+//
+// let banMessage = client.channels.cache.get(guildSetting.logChannelID);
+// if (!banMessage) return;
+//
+// banMessage.send({ embeds: [logEmbed]});
+// });
+
+client.on('guildCreate', (guild) => {
+ 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)
+ .setColor('#5cd65c')
+ .setFooter(`We now run on ${client.guilds.cache.size} guilds.`);
+
+ let statusChannel = client.channels.cache.get(statusChannelID);
+ if (!statusChannel) return;
+ statusChannel.send({ embeds: [logEmbed]});
+});
+
+
+client.on('guildDelete', (guild) => {
+ 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...')
+ .addField('Server Name:', `${guild.name}`, true)
+ .addField('Server ID:', `${guild.id}`, true)
+ .setColor('#ff021b')
+ .setFooter(`We now run on ${client.guilds.cache.size} guilds.`);
+
+ let statusChannel = client.channels.cache.get(statusChannelID);
+ if (!statusChannel) return;
+ statusChannel.send({ embeds: [logEmbed]});
+});
+/*
+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;
+ }
+ }
+
+ // 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('messageCreate', async(msg) => {
+ if (!client.application?.owner) await client.application?.fetch();
+ if (msg.author.bot) return;
+ if (!msg.guild) return;
+
+ const prefixes = JSON.parse(fs.readFileSync('./storage/prefixes.json', 'utf8'));
+
+ if (!prefixes[msg.guild.id]) {
+ prefixes[msg.guild.id] = {
+ prefixes: settings.prefix,
+ };
+ }
+
+ const prefix = prefixes[msg.guild.id].prefixes;
+
+
+ if (!msg.content.startsWith(prefix)) return;
+ const args = msg.content.slice(prefix.length).trim().split(/ +/g);
+ const command = args.shift();
+ let cmd;
+
+ if (client.commands.has(command)) {
+ cmd = client.commands.get(command);
+ } else if (client.aliases.has(command)) {
+ cmd = client.commands.get(client.aliases.get(command));
+ }
+
+ if (cmd) {
+ if (cmd.conf.guildOnly === true) {
+ if (!msg.channel.guild) {
+ return msg.channel.send('This command can only be ran in a guild.');
+ }
+ }
+ try {
+ const ops = {
+ ownerID: ownerID,
+ active: active,
+ autoRole: autoRole,
+ };
+
+ cmd.run(client, msg, args, ops);
+ } catch (e) {
+ console.error(e);
+ }
+ }
+});
+
+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);
+});
+
+client.on('disconnect', function() {
+ log('[X] AleeBot has disconnected from Discord and will not attempt to reconnect.'.red);
+ console.log('At this point, you\'ll need to restart AleeBot.'.red);
+ process.exit(0);
+});
diff --git a/commands/about.js b/commands/about.js
new file mode 100644
index 0000000..0ae756d
--- /dev/null
+++ b/commands/about.js
@@ -0,0 +1,63 @@
+/** **************************************
+ *
+ * About: 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 { 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('License', 'GNU General Public License v3.0')
+ .addField('Contributors', Contributors)
+ .setFooter('© Copyright 2017-2025 Andrew Lee Projects')
+ .setColor('#1fd619');
+
+ let Buttons = new MessageActionRow()
+ .addComponents(
+ new MessageButton()
+ .setStyle('LINK')
+ .setLabel('Source Code')
+ .setURL('https://github.com/alee14-projects/AleeBot'),
+ new MessageButton()
+ .setStyle('LINK')
+ .setLabel('Invite AleeBot')
+ .setURL('https://discord.com/oauth2/authorize?client_id=282547024547545109&permissions=68185158&scope=bot'),
+ new MessageButton()
+ .setStyle('LINK')
+ .setLabel('Join Andrew Lee Projects')
+ .setURL('https://discord.gg/EFhRDqG')
+ );
+
+ await message.channel.send({embeds: [aboutEmbed], components: [Buttons]});
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'about',
+ description: 'About the bot.',
+ usage: 'about',
+ category: '- Information Commands',
+};
diff --git a/commands/addquote.js b/commands/addquote.js
index 04df3f4..6eae015 100644
--- a/commands/addquote.js
+++ b/commands/addquote.js
@@ -1,7 +1,7 @@
-/****************************************
- *
+/** **************************************
+ *
* AddQuote: 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,46 +15,207 @@
*
* 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',
- };
-
+const { pendingQuote } = require('../models/quote');
+const { MessageEmbed } = require("discord.js");
+
+const setupUsers = new Set();
+
+module.exports.run = async (client, message) => {
+ try {
+ let newAuthor, newAuthorImage, newQuote, newYear;
+
+ if (setupUsers.has(message.author.id)) {
+ return await message.reply('You are already setting up a quote.');
+ }
+
+ setupUsers.add(message.author.id);
+
+ const setupProcess = [
+ 'Provide the name of the author:',
+ 'Submit the image of the author:\nYou can use an attachment or a link that ends in .jpg/.jpeg 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:'
+ ];
+
+ async function createQuote() {
+ await pendingQuote.create({
+ author: newAuthor,
+ authorImage: newAuthorImage,
+ quote: newQuote,
+ year: newYear,
+ submitterAuthor: message.author.username,
+ submitterID: message.author.id
+ });
+ }
+
+ let setupMessage = "Welcome to the AleeBot Quote Setup!\n";
+ setupMessage += "Please follow these rules when submitting quotes:\n";
+ setupMessage += "```1. No offensive content (NSFW, Racism, etc).\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";
+
+ const filter = (m) => m.author.id === message.author.id;
+
+ await message.reply(':arrow_left: Check DMs to continue.');
+
+ const dmChannel = await message.author.createDM();
+ await dmChannel.send(setupMessage);
+ await dmChannel.send(setupProcess[0]);
+
+ let counter = 1;
+ const collector = dmChannel.createMessageCollector({
+ filter,
+ max: setupProcess.length,
+ time: 1000 * 1200
+ });
+
+ collector.on('collect', async (msg) => {
+ if (counter === 2) { // Collecting author image
+ const attachment = msg.attachments.first();
+ if (attachment) {
+ const fileExtension = attachment.name.split('.').pop().toLowerCase();
+ if (['jpg', 'png', 'jpeg'].includes(fileExtension)) {
+ newAuthorImage = attachment.url.toString(); // Use the attachment's URL directly
+ } else {
+ await dmChannel.send('Invalid file type. Please attach a .jpg or .png image.');
+ collector.stop();
+ return;
+ }
+ } else if (msg.content.startsWith('http') && (msg.content.endsWith('.jpg') || msg.content.endsWith('.jpeg') || msg.content.endsWith('.png'))) {
+ newAuthorImage = msg.content;
+ } else {
+ await dmChannel.send('Invalid input. Please provide an image URL or attach an image file.');
+ collector.stop();
+ return;
+ }
+ }
+
+ if (counter < setupProcess.length) {
+ await dmChannel.send(setupProcess[counter++]);
+ }
+ });
+
+ collector.on('end', async (collected) => {
+ if (collected.size < setupProcess.length) {
+ dmChannel.send('Quote setup was not completed. Please rerun the command.');
+ setupUsers.delete(message.author.id);
+ } else {
+ const quoteContent = collected.map((m) => m.content);
+ newAuthor = quoteContent[0];
+ if (!newAuthorImage) {
+ newAuthorImage = quoteContent[1] || 'N/A';
+ }
+ 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 automatically in 20 minutes.')
+ .addField('Author', newAuthor || 'N/A')
+ .addField('Author Image (URL)', newAuthorImage || 'N/A')
+ .addField('Quote', newQuote || 'N/A')
+ .addField('Year', newYear || 'N/A')
+ .setColor('#1fd619');
+
+ let messageReact = await dmChannel.send({embeds: [setupEmbed]});
+ await messageReact.react('🧑');
+ await messageReact.react('📷');
+ await messageReact.react('🖋️');
+ await messageReact.react('📅');
+ await messageReact.react('✅');
+ await messageReact.react('❌');
+
+ const reactionFilter = (reaction, user) => {
+ return ['🧑', '📷', '🖋️', '📅', '✅', '❌'].includes(reaction.emoji.name) && user.id === message.author.id;
+ };
+
+ const reactionCollector = messageReact.createReactionCollector({
+ filter: reactionFilter,
+ time: 1000 * 1200
+ });
+
+ reactionCollector.on('collect', async (reaction) => {
+ switch (reaction.emoji.name) {
+ case '🧑':
+ await dmChannel.send('You selected the author. Please provide the name of the author.');
+ const authorResponse = await dmChannel.awaitMessages({ filter, max: 1, time: 60000 });
+ if (authorResponse.size) newAuthor = authorResponse.first().content;
+ await dmChannel.send('Updated author name.');
+ break;
+ case '📷':
+ await dmChannel.send('You selected the author image. Please provide the image URL or attach an image file.');
+ const imageResponse = await dmChannel.awaitMessages({ filter, max: 1, time: 60000 });
+ const attachment = imageResponse.first().attachments.first();
+ if (attachment) {
+ const fileExtension = attachment.name.split('.').pop().toLowerCase();
+ if (['jpg', 'png', 'jpeg'].includes(fileExtension)) {
+ newAuthorImage = attachment.url.toString(); // Use the attachment's URL directly
+ } else {
+ await dmChannel.send('Invalid file type. Please attach a .jpg or .png image.');
+ }
+ } else if (imageResponse.first().content.startsWith('http') && (imageResponse.first().content.endsWith('.jpg') || imageResponse.first().content.endsWith('.jpeg') || imageResponse.first().content.endsWith('.png'))) {
+ newAuthorImage = imageResponse.first().content;
+ } else {
+ await dmChannel.send('Invalid input. Please provide an image URL or attach an image file.');
+ }
+ await dmChannel.send('Updated author image.');
+ break;
+ case '🖋️':
+ await dmChannel.send('You selected the quote. Please provide the quote.');
+ const quoteResponse = await dmChannel.awaitMessages({ filter, max: 1, time: 60000 });
+ if (quoteResponse.size) newQuote = quoteResponse.first().content;
+ await dmChannel.send('Updated quote.');
+ break;
+ case '📅':
+ await dmChannel.send('You selected the year. Please provide the year.');
+ const yearResponse = await dmChannel.awaitMessages({ filter, max: 1, time: 60000 });
+ if (yearResponse.size) newYear = yearResponse.first().content;
+ await dmChannel.send('Updated year.');
+ break;
+ case '✅':
+ reactionCollector.stop('completed');
+ break;
+ case '❌':
+ reactionCollector.stop('cancelled');
+ break;
+ }
+
+ await messageReact.edit({embeds: [setupEmbed]});
+ });
+
+ reactionCollector.on('end', async (collected, reason) => {
+ if (reason === 'cancelled') {
+ dmChannel.send('Cancelling quote setup.');
+ } else if (reason === 'completed') {
+ dmChannel.send('Sending this quote for manual approval.');
+ await createQuote();
+ } else {
+ dmChannel.send('You have not responded. Sending this quote for manual approval.');
+ await createQuote();
+ }
+ setupUsers.delete(message.author.id);
+ });
+ }
+ });
+ } catch (error) {
+ await message.author.send('An error occurred while setting up the quote. Please rerun the command.');
+ setupUsers.delete(message.author.id);
+ console.error(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/commands/ask.js b/commands/ask.js
index db9e10e..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
@@ -15,35 +15,35 @@
*
* 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) => {
- let abaskanswer = [
- "Yes.",
- "Nope. Just kidding :P",
- "Definitely!",
- "No.",
- "Yep. Just kidding :P",
- "I doubt it.",
- "Maybe?",
- "I don't know?",
- "Hmm let me think :thinking:"
- ];
- if (args[1]) {
- message.channel.sendMessage(abaskanswer[Math.floor(Math.random() * abaskanswer.length)]);
- } else {
- message.channel.sendMessage("Sorry, I don't know what your saying.")
- }
- };
-
- exports.conf = {
- aliases: ['8ball'],
- guildOnly: false,
- };
- exports.help = {
- name: 'ask',
- description: 'Give AleeBot a question!',
- usage: 'ask [args]',
- category: '- Fun Commands',
- };
- \ No newline at end of file
+ const abaskanswer = [
+ 'Yes.',
+ 'Nope. Just kidding :P',
+ 'Definitely!',
+ 'No.',
+ 'Yep. Just kidding :P',
+ 'I doubt it.',
+ 'Maybe?',
+ 'Perhaps...',
+ 'I don\'t know?',
+ 'Hmm let me think :thinking:',
+ ];
+ if (args[1]) {
+ message.channel.send(abaskanswer[Math.floor(Math.random() * abaskanswer.length)]);
+ } else {
+ message.channel.send('Sorry, I don\'t know what your saying.');
+ }
+};
+
+exports.conf = {
+ aliases: ['8ball'],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'ask',
+ description: 'Give AleeBot a question!',
+ usage: 'ask [args]',
+ category: '- Fun Commands',
+};
diff --git a/commands/avatarurl.js b/commands/avatarurl.js
index 018bc7a..2c796f4 100644
--- a/commands/avatarurl.js
+++ b/commands/avatarurl.js
@@ -1,7 +1,7 @@
-/****************************************
- *
- * AvatarURL: Command for AleeBot
- * Copyright (C) 2017-2020 Alee Productions
+/** **************************************
+ *
+ * avatarurl: 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
@@ -15,19 +15,25 @@
*
* 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.reply(message.author.avatarURL);
+ 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: [],
- guildOnly: false,
+ aliases: ['pic'],
+ guildOnly: false,
};
exports.help = {
- name: 'avatarurl',
- description: 'Sends you your avatar picture.',
- usage: 'avatarurl',
- category: '- Fun Commands',
+ name: 'avatarurl',
+ description: 'Sends you your avatar picture.',
+ usage: 'avatarurl',
+ category: '- Fun Commands',
};
diff --git a/commands/balance.js b/commands/balance.js
deleted file mode 100644
index ae575cc..0000000
--- a/commands/balance.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/****************************************
- *
- * Balance: 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) => {
- const db = require('quick.db');
- const { RichEmbed } = require('discord.js');
-
- let user = message.mentions.users.first() || message.author;
-
- let balance = await db.fetch(`userBalance_${user.id}`);
-
- if (balance === null) {
- db.set(`userBalance_${message.author.id}`, 0);
- balance = 0;
- }
- const embed = new RichEmbed()
- .setDescription(`**AleeCorp Bank**`)
- .addField('Account Holder: ', user.username, true)
- .addField('Account Balance: ', balance, true)
- .setColor('#1fd619')
-
- message.channel.send({embed})
- };
-
- exports.conf = {
- aliases: ['bal', 'money'],
- guildOnly: false,
- };
- exports.help = {
- name: 'balance',
- description: 'Checks the balance of AleeBot',
- usage: 'balance [@someone (optional)]',
- category: '- Economy Commands',
- };
- \ No newline at end of file
diff --git a/commands/ban.js b/commands/ban.js
index 6331347..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
@@ -15,31 +15,31 @@
*
* 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 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.');
- const member = message.mentions.members.first();
- if (!member) return message.reply("Uhh... Please mention a member first.");
- member.ban(`Banned by ${message.author.tag} Reason: ` + mreason);
- const embed = new Discord.RichEmbed()
- .setTitle('User Banned!')
- .setColor('#1fd619')
- .addField('**User:**', `${member.user.tag}`)
- .addField('**Reason:**', `\`\`\`${mreason}\`\`\``)
- await message.channel.send({ embed });
+ 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.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('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}`)
+ if (mreason) return banEmbed.addField('**Reason:**', `\`\`\`${mreason}\`\`\``);
+ await message.channel.send({embeds: [banEmbed]});
};
exports.conf = {
- aliases: [],
- guildOnly: false,
+ aliases: [],
+ guildOnly: false,
};
exports.help = {
- name: 'ban',
- description: 'Bans a member',
- usage: 'ban [user] [reason]',
- category: '- Moderation Commands',
+ name: 'ban',
+ description: 'Bans a member',
+ usage: 'ban [user] [reason]',
+ category: '- Moderation Commands',
};
diff --git a/commands/eval.js b/commands/eval.js
index 90b7030..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
@@ -15,72 +15,70 @@
*
* 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) => {
- if (!['242775871059001344',].includes(message.author.id)) return message.reply('Nope! You need the person who created this bot to use this command.');
- const { RichEmbed } = require('discord.js');
- const code = args.join(' ');
-
- let evaled;
- let remove;
-
- try {
- remove = text => {
- if (typeof(text) === 'string') {
- return text.replace(/`/g, '`' + String.fromCharCode(8203)).replace(/@/g, '@' + String.fromCharCode(8203));
- } else {
- return text;
- }
- };
-
- evaled = eval(code);
-
- if (typeof evaled !== 'string') {
- evaled = require('util').inspect(evaled);
- }
-
- } catch (err) {
- const embed = new RichEmbed()
- .setAuthor('Eval Error')
- .setDescription('Eval\'s result')
- .addField(':inbox_tray: Input:', `\`\`\`js\n${code}\n\`\`\``)
- .addField(':outbox_tray: Output:', `\`\`\`${err}\`\`\``)
- .setFooter('Eval', client.user.avatarURL)
- .setColor('RED');
- return message.channel.send({ embed });
- }
-
- try {
- const embed = new RichEmbed()
- .setAuthor('Eval Success')
- .setDescription('Eval\'s result')
- .addField(':inbox_tray: Input:', `\`\`\`js\n${code}\n\`\`\``)
- .addField(':outbox_tray: Output:', `\`\`\`js\n${remove(evaled)}\n\`\`\``)
- .setFooter('Eval', client.user.avatarURL)
- .setColor('GREEN');
-
- return message.channel.send({ embed });
- } catch (err) {
- const embed = new RichEmbed()
- .setAuthor('Eval Error')
- .setDescription('Eval\'s result')
- .addField(':inbox_tray: Input:', `\`\`\`js\n${code}\n\`\`\``)
- .addField(':outbox_tray: Output:', `\`\`\`${err}\`\`\``)
- .setFooter('Eval', client.user.avatarURL)
- .setColor('RED');
- return message.channel.send({ embed });
- }
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'eval',
- description: 'Evalulates commands.',
- usage: '<code>',
- category: '- Owners Only',
- };
- \ No newline at end of file
+ if (!['242775871059001344'].includes(message.author.id)) return message.reply('Nope! You need the person who created this bot to use this command.');
+ const {MessageEmbed} = require('discord.js');
+ const code = args.join(' ');
+
+ let evaled;
+ let remove;
+
+ try {
+ remove = (text) => {
+ if (typeof(text) === 'string') {
+ return text.replace(/`/g, '`' + String.fromCharCode(8203)).replace(/@/g, '@' + String.fromCharCode(8203));
+ } else {
+ return text;
+ }
+ };
+
+ evaled = eval(code);
+
+ if (typeof evaled !== 'string') {
+ evaled = require('util').inspect(evaled);
+ }
+ } catch (err) {
+ const embed = new MessageEmbed()
+ .setAuthor('Eval Error')
+ .setDescription('Eval\'s result')
+ .addField(':inbox_tray: Input:', `\`\`\`js\n${code}\n\`\`\``)
+ .addField(':outbox_tray: Output:', `\`\`\`${err}\`\`\``)
+ .setFooter('Eval', client.user.avatarURL())
+ .setColor('RED');
+ return message.channel.send({embeds: [embed]});
+ }
+
+ try {
+ const embed = new MessageEmbed()
+ .setAuthor('Eval Success')
+ .setDescription('Eval\'s result')
+ .addField(':inbox_tray: Input:', `\`\`\`js\n${code}\n\`\`\``)
+ .addField(':outbox_tray: Output:', `\`\`\`js\n${remove(evaled)}\n\`\`\``)
+ .setFooter('Eval', client.user.avatarURL())
+ .setColor('GREEN');
+
+ return message.channel.send({embeds: [embed]});
+ } catch (err) {
+ const embed = new MessageEmbed()
+ .setAuthor('Eval Error')
+ .setDescription('Eval\'s result')
+ .addField(':inbox_tray: Input:', `\`\`\`js\n${code}\n\`\`\``)
+ .addField(':outbox_tray: Output:', `\`\`\`${err}\`\`\``)
+ .setFooter('Eval', client.user.avatarURL())
+ .setColor('RED');
+ return message.channel.send({embeds: [embed]});
+ }
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'eval',
+ description: 'Evalulates commands.',
+ usage: '<code>',
+ category: '- Owners Only',
+};
diff --git a/commands/git.js b/commands/git.js
deleted file mode 100644
index d6bed8b..0000000
--- a/commands/git.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/****************************************
- *
- * Git: 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) => {
- const Discord = require('discord.js');
- const git = require('git-last-commit');
- git.getLastCommit(function(err, commit) {
- const embed = new Discord.RichEmbed()
- .setTitle('GitHub Information')
- .addField('**Repository:**', 'https://github.com/aleeproductions/AleeBot-JS')
- .addField('**Last Commit:**', commit.subject)
- .addField('**Commited By:**', commit.author.name)
- .setColor('#1fd619')
- message.channel.send({ embed });
- })
-};
-
-exports.conf = {
- aliases: [],
- guildOnly: false,
-};
-exports.help = {
- name: 'git',
- description: 'Get the git info.',
- usage: 'git',
- category: '- General Commands',
-};
diff --git a/commands/help.js b/commands/help.js
index eb53b40..7a824f1 100644
--- a/commands/help.js
+++ b/commands/help.js
@@ -1,70 +1,70 @@
-/****************************************
- *
- * Help: 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/>.
- *
- * *************************************/
-const Discord = require('discord.js');
-const fs = require('fs');
-module.exports.run = async (client, message) => {
- const categories = [];
- const commands = Array.from(client.commands.keys());
- const settings = require('../storage/settings.json');
- commands.forEach(function(x) {
- if (!categories.includes(client.commands.get(x).help.category)) {
- categories.push(client.commands.get(x).help.category);
- }
- });
-
- let prefixes = JSON.parse(fs.readFileSync("./storage/prefixes.json", "utf8"));
-
- if(!prefixes[message.guild.id]){
- prefixes[message.guild.id] = {
- prefixes: settings.prefix
- };
- }
-
- let 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.');
- const embed = new Discord.RichEmbed()
- .setAuthor('AleeBot ' + require('../storage/settings.json').abVersion + ` Help and on ${client.guilds.size} servers`, client.user.avatarURL)
- .setDescription('Every command you input into AleeBot is `' + prefix + '`')
- .setColor('#1fd619')
- .setFooter('© Copyright 2017-2020 Alee Productions, Licensed with GPL-3.0');
-
- categories.forEach(function(x) {
- let cat = '';
- commands.forEach(function(command) {
- if (client.commands.get(command).help.category == x) {
- cat = cat + command + '\n';
- }
- });
- embed.addField(x, cat, true);
- });
-
- await message.channel.send({ embed });
-};
-
-exports.conf = {
- aliases: ['h'],
- guildOnly: false,
-};
-exports.help = {
- name: 'help',
- description: 'Displays all the commands or a page with information for 1 command.',
- usage: 'help (command:command-name)',
- category: '- General Commands',
-};
+/** **************************************
+ *
+ * Help: 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 Discord = require('discord.js');
+const fs = require('fs');
+module.exports.run = async (client, message) => {
+ const categories = [];
+ const commands = Array.from(client.commands.keys());
+ const settings = require('../storage/settings.json');
+ commands.forEach(function(x) {
+ if (!categories.includes(client.commands.get(x).help.category)) {
+ categories.push(client.commands.get(x).help.category);
+ }
+ });
+
+ const prefixes = JSON.parse(fs.readFileSync('./storage/prefixes.json', 'utf8'));
+
+ if (!prefixes[message.guild.id]) {
+ prefixes[message.guild.id] = {
+ prefixes: settings.prefix,
+ };
+ }
+
+ const prefix = prefixes[message.guild.id].prefixes;
+ 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`, client.user.avatarURL())
+ .setDescription('Every command you input into AleeBot is `' + prefix + '`')
+ .setFooter(`Currently serving on ${client.guilds.cache.size} servers`)
+ .setColor('#1fd619')
+
+ categories.forEach(function(x) {
+ let cat = '';
+ commands.forEach(function(command) {
+ if (client.commands.get(command).help.category == x) {
+ cat = cat + command + '\n';
+ }
+ });
+ embed.addField(x, cat, true);
+ });
+
+ await message.channel.send({embeds: [embed]});
+};
+
+exports.conf = {
+ aliases: ['h'],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'help',
+ description: 'Displays all the commands or a page with information for 1 command.',
+ usage: 'help (command:command-name)',
+ category: '- General Commands',
+};
diff --git a/commands/info.js b/commands/info.js
index 162a1cf..a74d73e 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
@@ -15,29 +15,29 @@
*
* 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 os = require('os');
- const embed = new Discord.RichEmbed()
- .setTitle('Information on AleeBot\'s Host')
- .addField('OS Hostname: ', os.hostname() , true)
- .addField('NodeJS Version: ', process.versions.node , true)
- .addField('OS Platform: ', os.platform() , true)
- .addField('OS Version: ', os.release() , true)
- .setColor('#1fd619');
- message.channel.send({embed});
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'info',
- description: 'Tells you information about the bot',
- usage: 'info',
- category: '- Information Commands',
- };
- \ No newline at end of file
+ const { MessageEmbed, version } = require('discord.js');
+ const os = require('os');
+ 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)
+ .setColor('#1fd619');
+ await message.channel.send({ embeds: [embed] });
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'info',
+ description: 'Tells you information about the bot',
+ usage: 'info',
+ category: '- Information Commands',
+};
diff --git a/commands/interrogate.js b/commands/interrogate.js
index 5630114..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
@@ -15,29 +15,28 @@
*
* 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) => {
- if (message.guild.id != '243022206437687296') return message.reply ('This is a ACN 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.');
+ const member = message.mentions.members.first();
+ if (!member) return await message.reply('Uhh... Please mention a member first.');
- member.addRole(message.guild.roles.find('name', 'Interrogation'));
- message.reply(`Alright, I just interrogated ${member.user.tag}.`)
+ member.roles.add(message.guild.roles.cache.get('431973193608200193'));
+ message.reply(`Alright, I just interrogated ${member.user.tag}.`);
};
exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'interrogate',
- description: 'Interrogates a member',
- usage: 'interrogate [user]',
- category: '- ALP Exclusive Commands',
- };
- \ No newline at end of file
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'interrogate',
+ description: 'Interrogates a member',
+ usage: 'interrogate [user]',
+ category: '- ALP Exclusive Commands',
+};
diff --git a/commands/invite.js b/commands/invite.js
deleted file mode 100644
index b0d3ec3..0000000
--- a/commands/invite.js
+++ /dev/null
@@ -1,51 +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) => {
- const Discord = require('discord.js');
- const embed = new Discord.RichEmbed()
- message.channel.send({embed: {
- color: 2086425,
- title: "Invite Command",
- fields: [{
- name: "Invite AleeBot",
- value: "[Invite AleeBot to your server.](https://discordapp.com/api/oauth2/authorize?client_id=282547024547545109&permissions=2080375863&scope=bot)"
- },
- {
- name: "Join the Alee Productions Community",
- value: "[If there's any bugs you can join Alee Community guild and explain the bug...](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/jail.js b/commands/jail.js
deleted file mode 100644
index 18cbfb1..0000000
--- a/commands/jail.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/****************************************
- *
- * Jail: 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) => {
- if (message.guild.id != '243022206437687296') return message.reply ('This is a ACN 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.');
-
- const member = message.mentions.members.first();
- if (!member) return await message.reply('Uhh... Please mention a member first.');
-
- member.addRole(message.guild.roles.find('name', 'Jail'));
- message.reply(`Alright, I just jailed ${member.user.tag}.`)
-};
-
-exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'jail',
- description: 'Jails a member',
- usage: 'jail [user]',
- category: '- ALP Exclusive Commands',
- };
- \ No newline at end of file
diff --git a/commands/kick.js b/commands/kick.js
index dbb1eb1..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
@@ -15,31 +15,31 @@
*
* 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 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 ban people.");
- if (!message.guild.member(client.user).hasPermission('KICK_MEMBERS')) return message.reply('Uhh... 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.RichEmbed()
- .setTitle('User Kicked!')
- .setColor('#1fd619')
- .addField('**User:**', `${member.user.tag}`)
- .addField('**Reason:**', `\`\`\`${mreason}\`\`\``)
- await message.channel.send({ embed });
- };
+ 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.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('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}`)
+ if (mreason) return kickEmbed.addField('**Reason:**', `\`\`\`${mreason}\`\`\``);
+ await message.channel.send({embeds: [kickEmbed]});
+};
exports.conf = {
- aliases: [],
- guildOnly: false,
+ aliases: [],
+ guildOnly: false,
};
exports.help = {
- name: 'kick',
- description: 'Kicks a member',
- usage: 'kick [user]',
- category: '- Moderation Commands',
+ name: 'kick',
+ description: 'Kicks a member',
+ usage: 'kick [user]',
+ category: '- Moderation Commands',
};
diff --git a/commands/leaveguild.js b/commands/leaveguild.js
index 4a77b0c..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
@@ -15,22 +15,21 @@
*
* 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('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!')
- message.guild.leave();
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'leaveguild',
- description: 'Makes the bot leave the server',
- usage: 'leaveguild',
- category: '- Owners Only',
- };
- \ No newline at end of file
+ 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();
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'leaveguild',
+ description: 'Makes the bot leave the server',
+ usage: 'leaveguild',
+ category: '- Owners Only',
+};
diff --git a/commands/nick.js b/commands/nick.js
new file mode 100644
index 0000000..8fcdce7
--- /dev/null
+++ b/commands/nick.js
@@ -0,0 +1,36 @@
+/** **************************************
+ *
+ * Nick: 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, args) => {
+ 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}\``);
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'nick',
+ description: 'Changes nickname.',
+ usage: 'nick [context]',
+ category: '- General Commands',
+};
diff --git a/commands/pay.js b/commands/pay.js
deleted file mode 100644
index 633e4db..0000000
--- a/commands/pay.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/****************************************
- *
- * Pay: 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 db = require('quick.db');
- if (!message.mentions.members.first()) return message.reply('Please mention a user...');
-
- let targetMember = message.mentions.members.first(),
- amount = parseInt(args.join(' ').replace(targetMember, ''));
-
- if (isNaN(amount)) return message.reply('Please define an amount.')
-
- let targetBalance = await db.fetch(`userBalance_${targetMember.id}`),
- selfBalance = await db.fetch(`userBalance_${message.author.id}`);
-
- if (targetBalance === null) {
- db.set(`userBalance_${targetMember.id}`, 0);
- targetBalance = 0
- }
-
- if (selfBalance === null) {
- db.set(`userBalance_${message.author.id}`, 0);
- selfBalance = 0
- }
-
- if (amount > selfBalance) return message.reply('Sorry you don\'t have enough money.');
-
- db.add(`userBalance_${targetMember.id}`, amount);
- db.subtract(`userBalance_${message.author.id}`, amount);
-
- message.reply(`Successfully transfered $${amount} to ${targetMember.user}`)
- };
-
- exports.conf = {
- aliases: ['transfer'],
- guildOnly: false,
- };
- exports.help = {
- name: 'pay',
- description: 'You can pay others!',
- usage: 'pay [@user] [interger]',
- category: '- Economy Commands',
- }; \ No newline at end of file
diff --git a/commands/ping.js b/commands/ping.js
index fa1fd10..d66330d 100644
--- a/commands/ping.js
+++ b/commands/ping.js
@@ -1,33 +1,33 @@
-/****************************************
- *
- * Ping: 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.reply('**PONG!** :ping_pong: ' + Math.round(client.ping) + ' ms');
-};
-
-exports.conf = {
- aliases: [],
- guildOnly: false,
-};
-exports.help = {
- name: 'ping',
- description: 'Ping the bot.',
- usage: 'ping',
- category: '- General Commands',
-};
+/** **************************************
+ *
+ * Ping: 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) => {
+ message.reply('**PONG!** :ping_pong: ' + Math.round(client.ws.ping) + ' ms');
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'ping',
+ description: 'Ping the bot.',
+ usage: 'ping',
+ category: '- General Commands',
+};
diff --git a/commands/poweroff.js b/commands/poweroff.js
index f336bed..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
@@ -15,24 +15,32 @@
*
* 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) => {
- if (!['242775871059001344',].includes(message.author.id)) return message.reply('Nope! You need the person who created this bot to use this command.');
- await client.channels.find('id', '606602551634296968').send("**AleeBot Status:** AleeBot is now going offline.");
- await message.reply(':warning: AleeBot will now exit!');
- client.destroy();
- process.exit(0);
- };
-
- exports.conf = {
- aliases: ['reboot'],
- guildOnly: false,
- };
- exports.help = {
- name: 'poweroff',
- description: 'Turns off AleeBot.',
- usage: 'poweroff',
- category: '- Owners Only',
- };
- \ No newline at end of file
+module.exports.run = async (client, message) => {
+ const Discord = require('discord.js');
+ if (!['242775871059001344'].includes(message.author.id)) return message.reply('Nope! You need the person who created this bot to use this command.');
+ const stopEmbed = new Discord.MessageEmbed()
+ .setAuthor('AleeBot Status', client.user.avatarURL())
+ .setDescription('AleeBot is now going offline...')
+ .setColor('#ff3333');
+
+ let statusChannel = client.channels.cache.get('606602551634296968');
+ if (!statusChannel) return console.error('The status channel does not exist! Skipping.');
+ await statusChannel.send({ embeds: [stopEmbed]});
+ await message.reply(':warning: AleeBot will now exit!');
+ console.log('[i] AleeBot will now exit!'.blue);
+ client.destroy();
+ process.exit(0);
+};
+
+exports.conf = {
+ aliases: ['reboot'],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'poweroff',
+ description: 'Turns off AleeBot.',
+ usage: 'poweroff',
+ category: '- Owners Only',
+};
diff --git a/commands/purge.js b/commands/purge.js
index 9a510f9..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
@@ -15,26 +15,25 @@
*
* 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) => {
- if (!message.member.permissions.has('MANAGE_MESSAGES')) return message.reply("It looks like that you don't have the permissions to delete messages.")
- if (isNaN(args[0])) return message.reply("Please put the valid number of messages to purge.");
+ if (!message.member.permissions.has('MANAGE_MESSAGES')) return message.reply('It looks like that you don\'t have the permissions to delete messages.');
+ if (isNaN(args[0])) return message.reply('Please put the valid number of messages to purge.');
+
+ if (args[0] > 100) return message.channel.send('Please put a number less than 100.');
- if (args[0] > 100) return message.channel.send("Please put a number less than 100.");
+ message.channel.bulkDelete(args[0])
+ .then( (messages) => message.channel.send(`Successfully deleted ${messages.size} messages.`));
+};
- message.channel.bulkDelete(args[0])
- .then( messages => message.channel.send(`Successfully deleted ${messages.size} messages.`))
- };
-
- exports.conf = {
- aliases: ['rm'],
- guildOnly: false,
- };
- exports.help = {
- name: 'purge',
- description: 'Removes messages in a bulk.',
- usage: 'purge [number]',
- category: '- Moderation Commands',
- };
- \ No newline at end of file
+exports.conf = {
+ aliases: ['rm'],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'purge',
+ description: 'Removes messages in a bulk.',
+ usage: 'purge [number]',
+ category: '- Moderation Commands',
+};
diff --git a/commands/quote.js b/commands/quote.js
index 9aa9be0..f19675f 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
@@ -15,51 +15,43 @@
*
* 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');
-
-let NewQuote;
+module.exports.run = async (client, message, args) => {
+ const { quote: quoteDB } = require('../models/quote');
+ const { MessageEmbed } = require('discord.js');
+ let quoteID = args[0];
- function GetNewQuote(quoteNum = -1) {
- NewQuote = new Discord.RichEmbed();
-
- let quo = require('../storage/quotes.json').quotes;
+ 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;
+ if (quote) {
+ const quoteEmbed = new MessageEmbed()
+ .setAuthor({ name: quote.author, iconURL: quote.authorImage })
+ .setDescription(quote.quote)
+ .setColor('#1fd619')
+ .setFooter(`- ${quote.year}\nSubmitted by ${quote.submitter}`);
- NewQuote.setAuthor(author, authorImage);
- NewQuote.setColor('#1fd619');
- NewQuote.setDescription(quote);
- NewQuote.setFooter('- ' + year);
- NewQuote.setURL(url);
+ await message.reply({ embeds: [quoteEmbed] })
+ } else {
+ message.reply('Cannot find quote, specify the correct quote id.');
+ }
- return NewQuote;
- }
- const newquote = GetNewQuote();
- message.reply('Alright, here\'s your quote.')
- message.channel.send(newquote);
};
exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'quote',
- description: 'Tells you quotes',
- usage: 'quote',
- category: '- Quote Commands',
- };
- \ No newline at end of file
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'quote',
+ description: 'Tells you quotes',
+ usage: 'quote',
+ category: '- Quote Commands',
+};
diff --git a/commands/say.js b/commands/say.js
index 4f25aec..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
@@ -15,23 +15,22 @@
*
* 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) => {
- if (!['242775871059001344',].includes(message.author.id)) return message.reply('Nope! You need the person who created this bot to use this command.');
- let absay = args.join(" ");
- message.delete().catch();
- message.channel.send(absay);
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'say',
- description: 'You can control AleeBot now!',
- usage: 'say [context]',
- category: '- Owners Only',
- };
- \ No newline at end of file
+ if (!['242775871059001344'].includes(message.author.id)) return message.reply('Nope! You need the person who created this bot to use this command.');
+ const absay = args.join(' ');
+ message.delete().catch();
+ message.channel.send(absay);
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'say',
+ description: 'You can control AleeBot now!',
+ usage: 'say [context]',
+ category: '- Owners Only',
+};
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..d989f8b
--- /dev/null
+++ b/commands/setlogchannel.js
@@ -0,0 +1,55 @@
+/** **************************************
+ *
+ * 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 { guildSettings } = require ('../models/guild-settings')
+module.exports.run = async (client, message, args) => {
+ //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.');
+
+ let channel;
+
+ if (message.mentions.channels.first()) {
+ channel = message.mentions.channels.first().id;
+ } else if (args[0] && message.guild.channels.cache.has(args[0])) {
+ channel = args[0];
+ } else {
+ return await message.reply('Please enter a valid channel ID.')
+ }
+
+ const [ guild ] = await guildSettings.findOrCreate({ where: { guildID: message.guild.id } } )
+
+ if (!channel) {
+ message.reply('No channel has been set, disabling the logging channel feature...');
+ await guild.update({ logChannelID: null } );
+ } else {
+ await guild.update({ logChannelID: channel } );
+ 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 f9aac08..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
@@ -15,41 +15,38 @@
*
* 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 => {
+ const moment = require('moment');
+ const log = (message) => {
+ console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] ${message}`);
+ };
+ const fs = require('fs');
+ 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>');
- 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(!args[0] || args[0 == "help"]) return message.reply(`Usage: <your prefix>setprefix <prefix>`)
+ const prefixes = JSON.parse(fs.readFileSync('./storage/prefixes.json', 'utf8'));
- let prefixes = JSON.parse(fs.readFileSync("./storage/prefixes.json", "utf8"));
+ prefixes[message.guild.id] = {
+ prefixes: args[0],
+ };
- prefixes[message.guild.id] = {
- prefixes: args[0]
- };
+ fs.writeFile('./storage/prefixes.json', JSON.stringify(prefixes), (err) =>{
+ if (err) log(err);
+ });
- fs.writeFile("./storage/prefixes.json", JSON.stringify(prefixes), (err) =>{
- if (err) log(err)
- })
+ message.reply(`AleeBot's Prefix in this guild is now \`${args[0]}\``);
+ log(`[i] The guild ${message.guild.name} has changed AleeBot's prefix to ${args[0]}`);
+};
- message.reply(`AleeBot's Prefix in this guild is now \`${args[0]}\``);
- log(`[i] The guild ${message.guild.name} has changed AleeBot's prefix to ${args[0]}`)
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: true,
- };
- exports.help = {
- name: 'setprefix',
- description: 'Sets the guild prefix.',
- usage: 'setprefix [prefix]',
- category: '- Settings Commands',
- };
- \ No newline at end of file
+exports.conf = {
+ aliases: [],
+ guildOnly: true,
+};
+exports.help = {
+ name: 'setprefix',
+ description: 'Sets the guild prefix.',
+ usage: 'setprefix [prefix]',
+ category: '- Settings Commands',
+};
diff --git a/commands/setup.js b/commands/setup.js
new file mode 100644
index 0000000..c797f7d
--- /dev/null
+++ b/commands/setup.js
@@ -0,0 +1,45 @@
+/****************************************
+ *
+ * Setup: 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) => {
+ 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(':arrow_left: Check DMs to continue.');
+ const Discord = require('discord.js');
+ const setupEmbed = new Discord.MessageEmbed()
+ .setTitle('AleeBot Setup', client.user.avatarURL())
+ .setDescription('Select the options')
+ .addField('Logging', 'channelid', true)
+ .addField('Broadcast', 'placeholder', true)
+ .addField('Quote of the Day', 'placeholder', true)
+ .addField('QOTD Channel', 'channelid', true);
+
+ message.author.send({embeds: [setupEmbed]});
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'setup',
+ description: 'Setting up AleeBot.',
+ usage: 'setup',
+ category: '- Settings Commands',
+};
diff --git a/commands/slowdown.js b/commands/slowdown.js
new file mode 100644
index 0000000..55e441b
--- /dev/null
+++ b/commands/slowdown.js
@@ -0,0 +1,37 @@
+/** **************************************
+ *
+ * Slowdown: 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, 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 slowdown for ${args[0]} second(s).`);
+
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'slowdown',
+ description: 'Ratelimits channel.',
+ usage: 'slowdown [number]',
+ category: '- Moderation Commands',
+};
diff --git a/commands/suggest.js b/commands/suggest.js
index 1b2d814..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
@@ -15,32 +15,31 @@
*
* 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) => {
- if (message.guild.id != '243022206437687296') return message.reply ('This is a ALP exclusive command.');
- const { RichEmbed } = require('discord.js');
- client.channels.find('id', '427495678390960148').send(
- new RichEmbed()
- .setColor ('#1fd619')
- .setTitle('Suggestion')
- .setDescription(`This is a suggestion from `+ message.author.username +` please react to it using the following emojis.`)
- .addField('Suggestion Contents', args.join(' '))
- ).then(message => {
- message.react('\u2705');
- message.react('\u274E');
- });
- message.reply("Your suggestion has been shown in the suggestions channel.")
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'suggest',
- description: 'Suggest a feature in ACN.',
- usage: 'suggest [suggestion]',
- category: '- ALP Exclusive Commands',
- };
- \ No newline at end of file
+ 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({ embeds: [
+ new MessageEmbed()
+ .setColor('#1fd619')
+ .setTitle('Suggestion')
+ .setDescription('This is a suggestion from '+ message.author.username +'. Please react to it using the following emojis.')
+ .addField('Suggestion Contents', args.join(' ')),
+ ]}).then((message) => {
+ message.react('\u2705');
+ message.react('\u274E');
+ });
+ message.reply('Your suggestion has been shown in the suggestions channel.');
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'suggest',
+ 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 95e1c2d..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,29 +15,31 @@
*
* 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 { RichEmbed } = require('discord.js');
- client.channels.find('id', '427495678390960148').send(
- new RichEmbed()
- .setColor ('#1fd619')
- .setTitle('AleeBot Feature Suggestion')
- .setDescription(`This is an AleeBot feature suggestion from `+ message.author.username +` sending from ${message.guild.name}.`)
- .addField('Suggestion Contents', args.join(' '))
- )
- await message.reply("Your suggestion has been shown to the ALP discord server!")
-
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'suggestfeature',
- description: 'Suggest features in AleeBot.',
- usage: 'suggestfeature [suggestion]',
- category: '- General Commands',
- };
-
+ const { MessageEmbed } = require('discord.js');
+
+ client.channels.cache.get('427495678390960148').send({ embeds: [
+ new MessageEmbed()
+ .setColor('#1fd619')
+ .setTitle('AleeBot Feature Suggestion')
+ .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 Andrew Lee Projects discord server!');
+
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'suggestfeature',
+ description: 'Suggest features in AleeBot.',
+ usage: 'suggestfeature [suggestion]',
+ category: '- General Commands',
+};
+
diff --git a/commands/timeout.js b/commands/timeout.js
new file mode 100644
index 0000000..bed9077
--- /dev/null
+++ b/commands/timeout.js
@@ -0,0 +1,49 @@
+/** **************************************
+ *
+ * Jail: 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, args) => {
+ const { MessageEmbed } = require('discord.js');
+
+ 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.');
+
+ 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 = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'timeout',
+ description: 'Times out a member',
+ usage: 'timeout [user]',
+ category: '- Moderation Commands',
+};
diff --git a/commands/uptime.js b/commands/uptime.js
index 7c8d9fe..7453ad5 100644
--- a/commands/uptime.js
+++ b/commands/uptime.js
@@ -1,45 +1,48 @@
-/****************************************
- *
- * Uptime: Command for AleeBot
- * Copyright (C) 2017-2020 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
- * 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) => {
-
- let uptime = parseInt(client.uptime);
- uptime = Math.floor(uptime / 1000);
- let uptimeMinutes = Math.floor(uptime / 60);
- const minutes = uptime % 60;
- let hours = 0;
- while (uptimeMinutes >= 60) {
- hours++;
- uptimeMinutes = uptimeMinutes - 60;
- }
- const uptimeSeconds = minutes % 60;
- message.channel.send(':clock3: AleeBot has been up for ' + hours + ' hours, ' + uptimeMinutes + ' minutes, and ' + uptimeSeconds + ' seconds.');
-
-};
-
-exports.conf = {
- aliases: [],
- guildOnly: false,
-};
-exports.help = {
- name: 'uptime',
- description: 'Displays Uptime.',
- usage: 'uptime',
- category: '- General Commands',
-};
+/** **************************************
+ *
+ * Uptime: Command for AleeBot
+ * 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
+ * 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) => {
+ let uptime = parseInt(client.uptime);
+ uptime = Math.floor(uptime / 1000);
+ 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;
+ message.channel.send(`:clock3: AleeBot has been up for ${days} days, ${hours} hours, ${uptimeMinutes} minutes, and ${uptimeSeconds} seconds.`);
+};
+
+exports.conf = {
+ aliases: [],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'uptime',
+ description: 'Displays Uptime.',
+ usage: 'uptime',
+ category: '- General Commands',
+};
diff --git a/commands/userinfo.js b/commands/userinfo.js
index 2eebd8b..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
@@ -15,30 +15,29 @@
*
* 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');
- var embed = new Discord.RichEmbed()
- .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("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())
- .setColor('#1fd619')
- message.channel.send({embed});
+ const Discord = require('discord.js');
+ const embed = new Discord.MessageEmbed()
+ .setAuthor(message.author.tag, message.author.avatarURL())
+ .setDescription('User Information')
+ .setThumbnail(message.author.avatarURL())
+ .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()}`)
+ .setColor('#1fd619');
+ await message.channel.send({embeds: [embed]});
+
+};
- };
-
- exports.conf = {
- aliases: ['uinfo'],
- guildOnly: false,
- };
- exports.help = {
- name: 'userinfo',
- description: 'Tells your info.',
- usage: 'userinfo',
- category: '- Information Commands',
- };
- \ No newline at end of file
+exports.conf = {
+ aliases: ['uinfo'],
+ guildOnly: false,
+};
+exports.help = {
+ name: 'userinfo',
+ description: 'Tells your info.',
+ usage: 'userinfo',
+ category: '- Information Commands',
+};
diff --git a/commands/vtquote.js b/commands/vtquote.js
deleted file mode 100644
index e21db08..0000000
--- a/commands/vtquote.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************
- *
- * VTQuote: 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) => {
- const Discord = require('discord.js');
-
- let VictorQuote;
-
- function GetVictorQuote(quoteNum = -1) {
- VictorQuote = new Discord.RichEmbed();
-
- let quo = require('../storage/vtquotes.json').quotes
-
- if (quoteNum == -1) {
- quoteNum = Math.floor(Math.random() * 1000) % quo.length;
- quo=quo[quoteNum];
- }
-
- const author = quo.author;
- const authorImage = quo.authorImage;
- const quote = quo.quote;
- const year = quo.year;
- const url = quo.url;
-
- VictorQuote.setAuthor(author, authorImage);
- VictorQuote.setColor('#1fd619');
- VictorQuote.setDescription(quote);
- VictorQuote.setFooter('- ' + year);
- VictorQuote.setURL(url);
-
- return VictorQuote;
- }
-
- const victorquote = GetVictorQuote();
- message.reply('Alright, here\'s your Victor quote.')
- message.channel.send(victorquote);
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'vtquote',
- description: 'Tells you quotes when victor accidentaly swore.',
- usage: 'vtquote',
- category: '- Quote Commands',
- };
- \ No newline at end of file
diff --git a/deprecated/buy.js b/deprecated/buy.js
deleted file mode 100644
index e5b8fee..0000000
--- a/deprecated/buy.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/****************************************
- *
- * Buy: Command for AleeBot
- * Copyright (C) 2018 AleeCorp
- *
- * 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 Discord = require('discord.js');
-const fs = require('fs')
-const db = require('quick.db');
-const items = JSON.parse(fs.readFileSync('./storage/items.json', 'utf8'));
-
- let categories = [];
-
- if (!args.join(" ")) {
-
-
- for (var i in items) {
-
-
- if (!categories.includes(items[i].type)) {
- categories.push(items[i].type)
- }
-
- }
-
-
- const embed = new Discord.RichEmbed()
- .setDescription(`Available Items`)
- .setColor('#1fd619')
-
- for (var i = 0; i < categories.length; i++) {
-
- var tempDesc = '';
-
- for (var c in items) {
- if (categories[i] === items[c].type) {
-
- tempDesc += `${items[c].name} - ${items[c].price}$ - ${items[c].desc}\n`;
-
- }
-
- }
-
- embed.addField(categories[i], tempDesc);
-
- }
-
-
- return message.channel.send({
- embed
- });
-
-
- }
-
- let itemName = '';
- let itemPrice = 0;
- let itemDesc = '';
-
- for (var i in items) {
- if (args.join(" ").trim().toUpperCase() === items[i].name.toUpperCase()) {
- itemName = items[i].name;
- itemPrice = items[i].price;
- itemDesc = items[i].desc;
- }
- }
-
-
- if (itemName === '') {
- return message.channel.send(`Item ${args.join(" ").trim()} not found.`)
- }
-
- let selfBalance = await db.fetch(`userBalance_${message.author.id}`);
-
- if (selfBalance === null) {
- db.set(`userBalance_${message.author.id}`, 0);
- selfBalance = 0
- }
-
- if (itemPrice > selfBalance) return message.reply('You don\'t have enough money for this item.')
-
- db.subtract(`userBalance_${message.author.id}`, itemPrice);
-
- if (itemName === 'Programmer Role') {
- message.guild.members.get(message.author.id).addRole(message.guild.roles.find("name", "Programmers"));
- }
-
- message.channel.send('You bought ' + itemName + '!');
- */
- message.reply('Command is broken for now');
-};
-
-exports.conf = {
- aliases: [],
- guildOnly: false,
-};
-exports.help = {
- name: 'buy',
- description: 'Buy things.',
- usage: 'buy [item]',
- category: '- Economy Commands',
-};
- \ No newline at end of file
diff --git a/deprecated/daily.js b/deprecated/daily.js
deleted file mode 100644
index 0d844a2..0000000
--- a/deprecated/daily.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************
- *
- * Daily: Command for AleeBot
- * Copyright (C) 2018 AleeCorp
- *
- * 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 db = require('quick.db');
- ms = require('parse-ms');
-
-module.exports.run = async (client, message) => {
-
- let cooldown = 8.64e+7,
- amount = 100;
-
- let lastDaily = await db.fetch(`lastDaily_${message.author.id}`);
-
- if (lastDaily !== null && cooldown - (Date.now() - lastDaily) > 0) {
- let timeObj = ms(cooldown - (Date.now() - lastDaily));
-
- message.reply(`You already collected your money, please wait **${timeObj.hours}h ${timeObj.minutes}m**!`)
- } else {
- message.channel.send(`You have successfully collected $${amount} dollars!`);
-
- let balance = await db.fetch(`userBalance_${message.author.id}`);
-
- if (balance == null) {
- db.set(`userBalance_${message.author.id}`, 0);
- }
-
- db.set(`lastDaily_${message.author.id}`, Date.now());
- db.add(`userBalance_${message.author.id}`, 100);
- }
-
- };
-
- exports.conf = {
- aliases: [],
- guildOnly: false,
- };
- exports.help = {
- name: 'daily',
- description: 'This gives you money everyday.',
- usage: 'daily',
- category: '- Economy Commands',
- };
- \ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..edd06ab
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,14 @@
+services:
+ aleebot:
+ image: aleebot
+ volumes:
+ - ./database.sqlite:/usr/src/bot/database.sqlite
+ - ./.env:/usr/src/bot/.env
+ ports:
+ - "3000:3000"
+ web:
+ image: aleebot-web
+ environment:
+ - HOST=0.0.0.0
+ ports:
+ - "4321:4321"
diff --git a/models/guild-settings.js b/models/guild-settings.js
new file mode 100644
index 0000000..8cc7478
--- /dev/null
+++ b/models/guild-settings.js
@@ -0,0 +1,29 @@
+const Sequelize = require("sequelize");
+const sequelize = require('../utils/sequelize');
+
+const guildSettings = sequelize.define('guild-settings', {
+ id: {
+ type: Sequelize.INTEGER,
+ primaryKey: true,
+ autoIncrement: true,
+ },
+ guildID: {
+ type: Sequelize.STRING,
+ allowNull: false
+ },
+ logChannelID: {
+ type: Sequelize.STRING,
+ allowNull: true
+ }
+ // qotdChannelID: {
+ // type: Sequelize.STRING,
+ // allowNull: true
+ // },
+ // qotdToggle: {
+ // type: Sequelize.BOOLEAN,
+ // allowNull: true
+ // }
+
+})
+
+module.exports = { guildSettings }
diff --git a/models/quote.js b/models/quote.js
new file mode 100644
index 0000000..ceef241
--- /dev/null
+++ b/models/quote.js
@@ -0,0 +1,66 @@
+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
+ },
+ submitter: {
+ type: Sequelize.STRING,
+ allowNull: false
+ }
+
+})
+
+const pendingQuote = sequelize.define('pending-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
+ },
+ submitterAuthor: {
+ type: Sequelize.STRING,
+ allowNull: false
+ },
+ submitterID: {
+ type: Sequelize.STRING,
+ allowNull: false
+ }
+
+})
+
+module.exports = { quote, pendingQuote };
diff --git a/package.json b/package.json
index 25c377a..404b4a5 100644
--- a/package.json
+++ b/package.json
@@ -1,35 +1,39 @@
{
"name": "aleebot",
- "version": "2.0.0",
+ "version": "2.13.0",
"description": "A chat bot for discord written in discord.js.",
- "main": "src/bot.js",
+ "main": "bot_discord.js",
"scripts": {
"start": "node bot_discord.js",
- "dev": "node bot_discord.js --beta"
+ "dev": "nodemon bot_discord.js --beta"
},
"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-JS/issues"
+ "url": "https://github.com/Alee14/AleeBot/issues"
},
- "homepage": "https://github.com/aleeproductions/AleeBot-JS#readme",
+ "homepage": "https://github.com/Alee14/AleeBot#readme",
"dependencies": {
"blessed": "^0.1.81",
- "colors": "^1.3.0",
- "dblapi.js": "^2.0.0",
- "discord.js": "^11.3.1",
- "fs": "0.0.1-security",
- "git-last-commit": "^0.3.0",
- "moment": "^2.21.0",
- "node-opus": "^0.3.0",
- "os": "^0.1.1",
- "parse-ms": "^1.0.1",
+ "colors": "^1.4.0",
+ "cors": "^2.8.5",
+ "discord.js": "13.17.1",
+ "dotenv": "^16.4.7",
+ "eslint": "^9.18.0",
+ "express": "^4.21.2",
+ "i18next": "^24.2.1",
+ "moment": "^2.30.1",
+ "os": "^0.1.2",
+ "parse-ms": "^4.0.0",
"readline": "^1.3.0",
- "ytdl-core": "^0.20.4"
+ "sequelize": "^6.37.5",
+ "sqlite3": "^5.1.7"
},
- "devDependencies": {}
+ "devDependencies": {
+ "nodemon": "^2.0.2"
+ }
}
diff --git a/run_bash.sh b/run_bash.sh
new file mode 100644
index 0000000..cca71f5
--- /dev/null
+++ b/run_bash.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+echo 'Welcome to the AleeBot Console.'
+echo 'If you want to self-host this bot, please continue by executing the following steps:'
+echo '1. Create a tokens.json file and include the token of your bot user so that the bot does not error out when connecting to Discord Servers.'
+echo '2. You will need to edit this file that you ran, and remove the "git pull" line. This causes errors as it will try to pull from the AleeBot git.'
+echo '3. Finally, you must credit the developers (Alee Productions Developers will work fine).'
+echo '--------------------------------------------------------------------------------'
+echo "To start the bot when you are ready, type in 'Yes/yes/y' or type in 'debug' to enter debug mode or type in 'beta' to enter beta mode."
+while true
+do
+read -r -p "> " input
+
+case $input in
+ [yY] | [yY][eE][sS])
+ for (( ; ; ))
+ do
+ git pull
+ node bot_discord.js
+ sleep 2
+ done
+ ;;
+ [dD][eE][bB][uU][gG])
+ for (( ; ; ))
+ do
+ node bot_discord.js --debug
+ sleep 2
+ done
+ ;;
+ [bB][eE][tT][aA])
+ for (( ; ; ))
+ do
+ node bot_discord.js --beta
+ sleep 2
+ done
+ ;;
+ [nN] | [nN][oO])
+ exit 1
+ ;;
+ *)
+echo "Bad command"
+ ;;
+esac
+ done \ No newline at end of file
diff --git a/run_linux.sh b/run_linux.sh
deleted file mode 100644
index fedf8fb..0000000
--- a/run_linux.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-echo 'Welcome to AleeBot!'
-for (( ; ; ))
-do
- git pull
- node bot_discord.js
-done \ No newline at end of file
diff --git a/run_win.bat b/run_win.bat
index b2d4974..4fd4f85 100644
--- a/run_win.bat
+++ b/run_win.bat
@@ -4,15 +4,16 @@ title AleeBot Console
echo Welcome to the AleeBot Console.
echo If you want to self-host this bot, please continue by executing the following steps:
echo 1. Create a tokens.json file and include the token of your bot user so that the bot does not error out when connecting to Discord Servers.
-echo 2. You will need to edit this file that you ran, and remove the 'git pull" line. This causes errors as it will try to pull from the AleeBot git.
-echo 3. Finally, you must credit the developers (AleeCorp Developers will work fine).
+echo 2. You will need to edit this file that you ran, and remove the "git pull" line. This causes errors as it will try to pull from the AleeBot git.
+echo 3. Finally, you must credit the developers (Alee Productions Developers will work fine).
echo --------------------------------------------------------------------------------
-echo To start the bot when you are ready, type in 'Yes/yes/y' or type in 'debug' to enter debug mode.
+echo To start the bot when you are ready, type in 'Yes/yes/y' or type in 'debug' to enter debug mode or type in 'beta' to enter beta mode.
set /p start=user@AleeBot:~$
if %start% == Yes goto a
if %start% == yes goto a
if %start% == y goto a
if %start% == debug goto ad
+if %start% == beta goto ab
if %start% == no goto cexit
if %start% == No goto cexit
if %start% == exit goto cexit
@@ -33,6 +34,10 @@ echo.
git pull
node bot_discord.js --debug
goto ad
+:ab
+git pull
+node bot_discord.js --beta
+goto ab
:easter
echo Hey... there is no easter egg...
cls
diff --git a/storage/activities.js b/storage/activities.js
new file mode 100644
index 0000000..be28e58
--- /dev/null
+++ b/storage/activities.js
@@ -0,0 +1,99 @@
+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',
+ 'Debloating my ThinkPad',
+ 'Turbotastic!',
+ `Now running on Discord.JS ${version}!`
+];
+
+exports.activity = activities
diff --git a/storage/items.json b/storage/items.json
deleted file mode 100644
index 1d57718..0000000
--- a/storage/items.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "Programmer" : {
- "name": "Programmer Role",
- "price": "100",
- "type": "Roles",
- "desc": "Buying this gives you the programmer role."
- },
- "AleeOS" : {
- "name": "AleeOS",
- "price": "400",
- "type": "OS",
- "desc": "Buying this gives you AleeOS."
- },
- "theSlate" : {
- "name": "theSlate",
- "price": "400",
- "type": "Tools",
- "desc": "Buying this gives you theSlate."
- }
-} \ No newline at end of file
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/settings.json b/storage/settings.json
index 05117e9..4a6911c 100644
--- a/storage/settings.json
+++ b/storage/settings.json
@@ -1,4 +1,4 @@
{
- "abVersion": "2.12.0",
+ "abVersion": "2.13.0",
"prefix": "ab:"
}
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..7a9271c
--- /dev/null
+++ b/sync-database.js
@@ -0,0 +1,13 @@
+const { quote, pendingQuote } = require("./models/quote");
+const { guildSettings } = require ('./models/guild-settings');
+quote.sync({alter: true}).then(() => {
+ console.log('Quote database synced!')
+});
+
+pendingQuote.sync({alter: true}).then(() => {
+ console.log('Pending Quote database synced!')
+});
+
+guildSettings.sync({alter: true}).then(() => {
+ console.log('Guild database synced!')
+});
diff --git a/update_dep.bat b/update_dep.bat
deleted file mode 100644
index a90f20d..0000000
--- a/update_dep.bat
+++ /dev/null
@@ -1,6 +0,0 @@
-@echo off
-title Installing/Updating Dependencies
-git pull
-yarn install
-pause
-exit
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;
diff --git a/web/.gitignore b/web/.gitignore
new file mode 100644
index 0000000..016b59e
--- /dev/null
+++ b/web/.gitignore
@@ -0,0 +1,24 @@
+# build output
+dist/
+
+# generated types
+.astro/
+
+# dependencies
+node_modules/
+
+# logs
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# environment variables
+.env
+.env.production
+
+# macOS-specific files
+.DS_Store
+
+# jetbrains setting folder
+.idea/
diff --git a/web/.vscode/extensions.json b/web/.vscode/extensions.json
new file mode 100644
index 0000000..22a1505
--- /dev/null
+++ b/web/.vscode/extensions.json
@@ -0,0 +1,4 @@
+{
+ "recommendations": ["astro-build.astro-vscode"],
+ "unwantedRecommendations": []
+}
diff --git a/web/.vscode/launch.json b/web/.vscode/launch.json
new file mode 100644
index 0000000..d642209
--- /dev/null
+++ b/web/.vscode/launch.json
@@ -0,0 +1,11 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "command": "./node_modules/.bin/astro dev",
+ "name": "Development server",
+ "request": "launch",
+ "type": "node-terminal"
+ }
+ ]
+}
diff --git a/web/Dockerfile b/web/Dockerfile
new file mode 100644
index 0000000..e021df4
--- /dev/null
+++ b/web/Dockerfile
@@ -0,0 +1,9 @@
+FROM oven/bun:latest
+
+WORKDIR /web
+
+COPY . .
+
+RUN bun run build
+
+ENTRYPOINT ["bun", "run", "/web/dist/server/entry.mjs"]
diff --git a/web/astro.config.mjs b/web/astro.config.mjs
new file mode 100644
index 0000000..d32e23b
--- /dev/null
+++ b/web/astro.config.mjs
@@ -0,0 +1,21 @@
+// @ts-check
+import { defineConfig, envField } from 'astro/config';
+
+import react from '@astrojs/react';
+
+import node from '@astrojs/node';
+
+// https://astro.build/config
+export default defineConfig({
+ integrations: [react()],
+
+ adapter: node({
+ mode: 'standalone'
+ }),
+
+ env: {
+ schema: {
+ API_URL: envField.string({ context: 'client', access: 'public' }),
+ }
+ }
+});
diff --git a/web/bun.lockb b/web/bun.lockb
new file mode 100644
index 0000000..26b85b4
--- /dev/null
+++ b/web/bun.lockb
Binary files differ
diff --git a/web/package.json b/web/package.json
new file mode 100644
index 0000000..2a7be8a
--- /dev/null
+++ b/web/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "aleebot-web",
+ "type": "module",
+ "version": "0.0.1",
+ "scripts": {
+ "dev": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "astro": "astro"
+ },
+ "dependencies": {
+ "@astrojs/node": "^9.0.0",
+ "@astrojs/react": "^4.1.3",
+ "@types/react": "^19.0.4",
+ "@types/react-dom": "^19.0.2",
+ "astro": "^5.1.5",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
+ }
+}
diff --git a/web/public/favicon.svg b/web/public/favicon.svg
new file mode 100644
index 0000000..f157bd1
--- /dev/null
+++ b/web/public/favicon.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
+ <path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
+ <style>
+ path { fill: #000; }
+ @media (prefers-color-scheme: dark) {
+ path { fill: #FFF; }
+ }
+ </style>
+</svg>
diff --git a/web/src/components/Quotes.jsx b/web/src/components/Quotes.jsx
new file mode 100644
index 0000000..1eb258a
--- /dev/null
+++ b/web/src/components/Quotes.jsx
@@ -0,0 +1,88 @@
+import { useState, useEffect } from 'react';
+import '../styles/Quote.css'
+import { API_URL } from "astro:env/client";
+
+export function PendingQuotes() {
+ const [quotes, setQuotes] = useState([]);
+
+ const fetchQuotes = async () => {
+ try {
+ const response = await fetch(`${API_URL}/api/pending-quotes`);
+ const data = await response.json();
+ setQuotes(data);
+ } catch (error) {
+ console.error('Failed to fetch quotes:', error);
+ }
+ };
+
+ useEffect(() => {
+ fetchQuotes();
+ }, []);
+
+ const approveQuote = async (id) => {
+ try {
+ const response = await fetch(`${API_URL}/api/approve-quote`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ id }),
+ });
+
+ if (response.ok) {
+ fetchQuotes(); // Refresh the listing after approving the quote
+ } else {
+ console.error('Failed to approve quote');
+ }
+ } catch (error) {
+ console.error('Error approving quote:', error);
+ }
+ };
+
+ const rejectQuote = async (id) => {
+ try {
+ const response = await fetch(`${API_URL}/api/reject-quote`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ id }),
+ });
+
+ if (response.ok) {
+ fetchQuotes(); // Refresh the listing after approving the quote
+ } else {
+ console.error('Failed to reject quote');
+ }
+ } catch (error) {
+ console.error('Error rejecting quote:', error);
+ }
+ };
+
+ return (
+ <div>
+ <h1>Pending Quotes</h1>
+ {quotes.length > 0 ? (
+ <ul className="quoteList">
+ {quotes.map((quote) => (
+ <li key={quote.id} className="quoteList">
+ <div className="quote">
+ <div className="author">
+ <img src={quote.authorImage} alt="No Profile" width="50" height="50"/>
+ <h1 className="quoteAuthor">{quote.author}</h1>
+ </div>
+ <p className="quoteText">{quote.quote}</p>
+ <small>- {quote.year}</small>
+ <small>Submitted by {quote.submitterAuthor} ({quote.submitterID})</small>
+ </div>
+ <button onClick={() => approveQuote(quote.id)}>Approve</button>
+ <button onClick={() => rejectQuote(quote.id)}>Reject</button>
+ </li>
+ ))}
+ </ul>
+ ) : (
+ <p>No pending quotes available.</p>
+ )}
+ </div>
+ );
+}
diff --git a/web/src/layouts/Layout.astro b/web/src/layouts/Layout.astro
new file mode 100644
index 0000000..2f6032d
--- /dev/null
+++ b/web/src/layouts/Layout.astro
@@ -0,0 +1,22 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width" />
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
+ <meta name="generator" content={Astro.generator} />
+ <title>AleeBot Web Interface</title>
+ </head>
+ <body>
+ <slot />
+ </body>
+</html>
+
+<style>
+ html,
+ body {
+ margin: 0;
+ width: 100%;
+ height: 100%;
+ }
+</style>
diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro
new file mode 100644
index 0000000..f1dc6e7
--- /dev/null
+++ b/web/src/pages/index.astro
@@ -0,0 +1,45 @@
+---
+import Layout from '../layouts/Layout.astro';
+import { PendingQuotes } from '../components/Quotes';
+
+---
+
+<Layout>
+ <div class="container">
+ <h1 id="version">AleeBot</h1>
+ <PendingQuotes client:load />
+ </div>
+</Layout>
+
+<style>
+ @import url('https://fonts.googleapis.com/css2?family=Exo+2:ital,wght@0,100..900;1,100..900&display=swap');
+ html,
+ body {
+ margin: 0;
+ width: 100%;
+ height: 100%;
+ font-family: "Exo 2", sans-serif;
+ }
+
+ .container {
+ margin: 2em;
+ }
+
+</style>
+
+<script>
+ import { API_URL } from "astro:env/client"
+ document.addEventListener('DOMContentLoaded', async () => {
+ try {
+ const version = await fetch(`${API_URL}/api/version`).then((res) => res.json());
+ const versionElement = document.getElementById('version');
+ if (versionElement) {
+ versionElement.textContent = `AleeBot ${version}`;
+ } else {
+ console.error('Element with ID "version" not found.');
+ }
+ } catch (e) {
+ console.error('Failed to fetch version:', e);
+ }
+ });
+</script>
diff --git a/web/src/styles/Quote.css b/web/src/styles/Quote.css
new file mode 100644
index 0000000..8adfb29
--- /dev/null
+++ b/web/src/styles/Quote.css
@@ -0,0 +1,33 @@
+.quote {
+ display: flex;
+ flex-direction: column;
+ background: #555555;
+ color: #FFFFFF;
+ padding: 1em;
+}
+
+ul.quoteList {
+ margin: 0;
+ padding: 0;
+}
+
+li.quoteList {
+ list-style-type: none;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.author {
+ display: flex;
+ flex-direction: row;
+}
+
+h1.quoteAuthor {
+ font-size: 1.5em;
+ padding: 0;
+ margin: 0 0 0 .5em;
+}
+
+.quoteText {
+ margin: .5em 0;
+}
diff --git a/web/tsconfig.json b/web/tsconfig.json
new file mode 100644
index 0000000..69c1600
--- /dev/null
+++ b/web/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "include": [
+ ".astro/types.d.ts",
+ "**/*"
+ ],
+ "exclude": [
+ "dist"
+ ],
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "react"
+ }
+} \ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..26e43c3
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,2349 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/runtime@^7.23.2":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1"
+ integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@discordjs/builders@^0.16.0":
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.16.0.tgz#3201f57fa57c4dd77aebb480cf47da77b7ba2e8c"
+ integrity sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==
+ dependencies:
+ "@sapphire/shapeshift" "^3.5.1"
+ discord-api-types "^0.36.2"
+ fast-deep-equal "^3.1.3"
+ ts-mixer "^6.0.1"
+ tslib "^2.4.0"
+
+"@discordjs/collection@^0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.7.0.tgz#1a6c00198b744ba2b73a64442145da637ac073b8"
+ integrity sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==
+
+"@eslint-community/eslint-utils@^4.2.0":
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56"
+ integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==
+ dependencies:
+ eslint-visitor-keys "^3.4.3"
+
+"@eslint-community/regexpp@^4.12.1":
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
+ integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
+
+"@eslint/config-array@^0.19.0":
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984"
+ integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==
+ dependencies:
+ "@eslint/object-schema" "^2.1.5"
+ debug "^4.3.1"
+ minimatch "^3.1.2"
+
+"@eslint/core@^0.10.0":
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091"
+ integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==
+ dependencies:
+ "@types/json-schema" "^7.0.15"
+
+"@eslint/eslintrc@^3.2.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c"
+ integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^10.0.1"
+ globals "^14.0.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@9.18.0":
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.18.0.tgz#3356f85d18ed3627ab107790b53caf7e1e3d1e84"
+ integrity sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==
+
+"@eslint/object-schema@^2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e"
+ integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==
+
+"@eslint/plugin-kit@^0.2.5":
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81"
+ integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==
+ dependencies:
+ "@eslint/core" "^0.10.0"
+ levn "^0.4.1"
+
+"@gar/promisify@^1.0.1":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
+ integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
+
+"@humanfs/core@^0.19.1":
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
+ integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==
+
+"@humanfs/node@^0.16.6":
+ version "0.16.6"
+ resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e"
+ integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==
+ dependencies:
+ "@humanfs/core" "^0.19.1"
+ "@humanwhocodes/retry" "^0.3.0"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/retry@^0.3.0":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a"
+ integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==
+
+"@humanwhocodes/retry@^0.4.1":
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b"
+ integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==
+
+"@npmcli/fs@^1.0.0":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257"
+ integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==
+ dependencies:
+ "@gar/promisify" "^1.0.1"
+ semver "^7.3.5"
+
+"@npmcli/move-file@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
+ integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
+ dependencies:
+ mkdirp "^1.0.4"
+ rimraf "^3.0.2"
+
+"@sapphire/async-queue@^1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8"
+ integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==
+
+"@sapphire/shapeshift@^3.5.1":
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.6.0.tgz#988ff6576162a581a29bc26deb5492f7d1bf419f"
+ integrity sha512-tu2WLRdo5wotHRvsCkspg3qMiP6ETC3Q1dns1Q5V6zKUki+1itq6AbhMwohF9ZcLoYqg+Y8LkgRRtVxxTQVTBQ==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ lodash.uniqwith "^4.5.0"
+
+"@tootallnate/once@1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+
+"@types/debug@^4.1.8":
+ version "4.1.12"
+ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917"
+ integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==
+ dependencies:
+ "@types/ms" "*"
+
+"@types/estree@^1.0.6":
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
+ integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
+
+"@types/json-schema@^7.0.15":
+ version "7.0.15"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/ms@*":
+ version "0.7.31"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
+ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
+
+"@types/node-fetch@^2.6.3":
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03"
+ integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==
+ dependencies:
+ "@types/node" "*"
+ form-data "^4.0.0"
+
+"@types/node@*":
+ version "18.7.18"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.18.tgz#633184f55c322e4fb08612307c274ee6d5ed3154"
+ integrity sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==
+
+"@types/validator@^13.7.17":
+ version "13.12.2"
+ resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.12.2.tgz#760329e756e18a4aab82fc502b51ebdfebbe49f5"
+ integrity sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==
+
+"@types/ws@^8.5.4":
+ version "8.5.13"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20"
+ integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==
+ dependencies:
+ "@types/node" "*"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.14.0:
+ version "8.14.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
+ integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
+
+agent-base@6, agent-base@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+agentkeepalive@^4.1.3:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255"
+ integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==
+ dependencies:
+ debug "^4.1.0"
+ depd "^2.0.0"
+ humanize-ms "^1.2.1"
+
+aggregate-error@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+ integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
+ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+"aproba@^1.0.3 || ^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
+ integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
+
+are-we-there-yet@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd"
+ integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^3.6.0"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bl@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
+blessed@^0.1.81:
+ version "0.1.81"
+ resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129"
+ integrity sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==
+
+body-parser@1.20.3:
+ version "1.20.3"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
+ integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.13.0"
+ raw-body "2.5.2"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+buffer@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+cacache@^15.2.0:
+ version "15.3.0"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
+ integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
+ dependencies:
+ "@npmcli/fs" "^1.0.0"
+ "@npmcli/move-file" "^1.0.1"
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ glob "^7.1.4"
+ infer-owner "^1.0.4"
+ lru-cache "^6.0.0"
+ minipass "^3.1.1"
+ minipass-collect "^1.0.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.2"
+ mkdirp "^1.0.3"
+ p-map "^4.0.0"
+ promise-inflight "^1.0.1"
+ rimraf "^3.0.2"
+ ssri "^8.0.1"
+ tar "^6.0.2"
+ unique-filename "^1.1.1"
+
+call-bind-apply-helpers@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840"
+ integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
+call-bound@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681"
+ integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ get-intrinsic "^1.2.6"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chokidar@^3.5.2:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-support@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
+ integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
+
+colors@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+ integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+console-control-strings@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
+ integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
+
+cors@^2.8.5:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+cross-spawn@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@4, debug@^4.1.0, debug@^4.3.3:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+ dependencies:
+ ms "^2.1.3"
+
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
+
+depd@2.0.0, depd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-libc@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
+ integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
+
+discord-api-types@^0.33.5:
+ version "0.33.5"
+ resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.33.5.tgz#6548b70520f7b944c60984dca4ab58654d664a12"
+ integrity sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==
+
+discord-api-types@^0.36.2:
+ version "0.36.3"
+ resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.36.3.tgz#a931b7e57473a5c971d6937fa5f392eb30047579"
+ integrity sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==
+
+discord.js@13.17.1:
+ version "13.17.1"
+ resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.17.1.tgz#df171c8aacb351b1532d0562dd7db56df666094d"
+ integrity sha512-h13kUf+7ZaP5ZWggzooCxFutvJJvugcAO54oTEIdVr3zQWi0Sf/61S1kETtuY9nVAyYebXR/Ey4C+oWbsgEkew==
+ dependencies:
+ "@discordjs/builders" "^0.16.0"
+ "@discordjs/collection" "^0.7.0"
+ "@sapphire/async-queue" "^1.5.0"
+ "@types/node-fetch" "^2.6.3"
+ "@types/ws" "^8.5.4"
+ discord-api-types "^0.33.5"
+ form-data "^4.0.0"
+ node-fetch "^2.6.7"
+ ws "^8.13.0"
+
+dotenv@^16.4.7:
+ version "16.4.7"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26"
+ integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==
+
+dottie@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.6.tgz#34564ebfc6ec5e5772272d466424ad5b696484d4"
+ integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==
+
+dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+encodeurl@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
+encoding@^0.1.12:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
+ integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
+ dependencies:
+ iconv-lite "^0.6.2"
+
+end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+env-paths@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+err-code@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
+ integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
+
+es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+ integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+ dependencies:
+ es-errors "^1.3.0"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-scope@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442"
+ integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint-visitor-keys@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
+ integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
+
+eslint@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.18.0.tgz#c95b24de1183e865de19f607fda6518b54827850"
+ integrity sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.12.1"
+ "@eslint/config-array" "^0.19.0"
+ "@eslint/core" "^0.10.0"
+ "@eslint/eslintrc" "^3.2.0"
+ "@eslint/js" "9.18.0"
+ "@eslint/plugin-kit" "^0.2.5"
+ "@humanfs/node" "^0.16.6"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@humanwhocodes/retry" "^0.4.1"
+ "@types/estree" "^1.0.6"
+ "@types/json-schema" "^7.0.15"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.6"
+ debug "^4.3.2"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^8.2.0"
+ eslint-visitor-keys "^4.2.0"
+ espree "^10.3.0"
+ esquery "^1.5.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^8.0.0"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+
+espree@^10.0.1, espree@^10.3.0:
+ version "10.3.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a"
+ integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==
+ dependencies:
+ acorn "^8.14.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^4.2.0"
+
+esquery@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+expand-template@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
+ integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
+
+express@^4.21.2:
+ version "4.21.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32"
+ integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.3"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.7.1"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.3.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.3"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.12"
+ proxy-addr "~2.0.7"
+ qs "6.13.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.19.0"
+ serve-static "1.16.2"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+file-entry-cache@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f"
+ integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
+ dependencies:
+ flat-cache "^4.0.0"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
+ integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c"
+ integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.4"
+
+flatted@^3.2.9:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27"
+ integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+gauge@^4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
+ integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
+ dependencies:
+ aproba "^1.0.3 || ^2.0.0"
+ color-support "^1.1.3"
+ console-control-strings "^1.1.0"
+ has-unicode "^2.0.1"
+ signal-exit "^3.0.7"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+ wide-align "^1.1.5"
+
+get-intrinsic@^1.2.5, get-intrinsic@^1.2.6:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044"
+ integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ function-bind "^1.1.2"
+ get-proto "^1.0.0"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.1.0"
+
+get-proto@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
+
+github-from-package@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+ integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@^7.1.3, glob@^7.1.4:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e"
+ integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
+
+gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
+graceful-fs@^4.2.6:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
+has-unicode@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
+
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+http-cache-semantics@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
+ integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-proxy-agent@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+ integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+ dependencies:
+ "@tootallnate/once" "1"
+ agent-base "6"
+ debug "4"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+humanize-ms@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+ integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
+ dependencies:
+ ms "^2.0.0"
+
+i18next@^24.2.1:
+ version "24.2.1"
+ resolved "https://registry.yarnpkg.com/i18next/-/i18next-24.2.1.tgz#91e8f11fc9bd7042ec0bd36bed2dd0457aaa35fa"
+ integrity sha512-Q2wC1TjWcSikn1VAJg13UGIjc+okpFxQTxjVAymOnSA3RpttBQNMPf2ovcgoFVsV4QNxTfNZMAxorXZXsk4fBA==
+ dependencies:
+ "@babel/runtime" "^7.23.2"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore-by-default@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
+ integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==
+
+ignore@^5.2.0:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+infer-owner@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+ integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
+inflection@^1.13.4:
+ version "1.13.4"
+ resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.4.tgz#65aa696c4e2da6225b148d7a154c449366633a32"
+ integrity sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+ip@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
+ integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-lambda@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
+ integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+keyv@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.uniqwith@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz#7a0cbf65f43b5928625a9d4d0dc54b18cadc7ef3"
+ integrity sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==
+
+lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+make-fetch-happen@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
+ integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==
+ dependencies:
+ agentkeepalive "^4.1.3"
+ cacache "^15.2.0"
+ http-cache-semantics "^4.1.0"
+ http-proxy-agent "^4.0.1"
+ https-proxy-agent "^5.0.0"
+ is-lambda "^1.0.1"
+ lru-cache "^6.0.0"
+ minipass "^3.1.3"
+ minipass-collect "^1.0.2"
+ minipass-fetch "^1.3.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.4"
+ negotiator "^0.6.2"
+ promise-retry "^2.0.1"
+ socks-proxy-agent "^6.0.0"
+ ssri "^8.0.0"
+
+math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+merge-descriptors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
+ integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
+minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.3:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass-collect@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+ integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-fetch@^1.3.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6"
+ integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==
+ dependencies:
+ minipass "^3.1.0"
+ minipass-sized "^1.0.3"
+ minizlib "^2.0.0"
+ optionalDependencies:
+ encoding "^0.1.12"
+
+minipass-flush@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+ integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+ integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-sized@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70"
+ integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+ integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+ dependencies:
+ yallist "^4.0.0"
+
+minipass@^4.0.0:
+ version "4.2.5"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.5.tgz#9e0e5256f1e3513f8c34691dd68549e85b2c8ceb"
+ integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==
+
+minizlib@^2.0.0, minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
+
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+moment-timezone@^0.5.43:
+ version "0.5.46"
+ resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.46.tgz#a21aa6392b3c6b3ed916cd5e95858a28d893704a"
+ integrity sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==
+ dependencies:
+ moment "^2.29.4"
+
+moment@^2.29.4:
+ version "2.29.4"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
+ integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
+
+moment@^2.30.1:
+ version "2.30.1"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
+ integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+napi-build-utils@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
+ integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+negotiator@0.6.3, negotiator@^0.6.2:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+node-abi@^3.3.0:
+ version "3.71.0"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.71.0.tgz#52d84bbcd8575efb71468fbaa1f9a49b2c242038"
+ integrity sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==
+ dependencies:
+ semver "^7.3.5"
+
+node-addon-api@^7.0.0:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
+ integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
+
+node-fetch@^2.6.7:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-gyp@8.x:
+ version "8.4.1"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937"
+ integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==
+ dependencies:
+ env-paths "^2.2.0"
+ glob "^7.1.4"
+ graceful-fs "^4.2.6"
+ make-fetch-happen "^9.1.0"
+ nopt "^5.0.0"
+ npmlog "^6.0.0"
+ rimraf "^3.0.2"
+ semver "^7.3.5"
+ tar "^6.1.2"
+ which "^2.0.2"
+
+nodemon@^2.0.2:
+ version "2.0.20"
+ resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.20.tgz#e3537de768a492e8d74da5c5813cb0c7486fc701"
+ integrity sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==
+ dependencies:
+ chokidar "^3.5.2"
+ debug "^3.2.7"
+ ignore-by-default "^1.0.1"
+ minimatch "^3.1.2"
+ pstree.remy "^1.1.8"
+ semver "^5.7.1"
+ simple-update-notifier "^1.0.7"
+ supports-color "^5.5.0"
+ touch "^3.1.0"
+ undefsafe "^2.0.5"
+
+nopt@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
+ integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
+ dependencies:
+ abbrev "1"
+
+nopt@~1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+ integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==
+ dependencies:
+ abbrev "1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npmlog@^6.0.0:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
+ integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
+ dependencies:
+ are-we-there-yet "^3.0.0"
+ console-control-strings "^1.1.0"
+ gauge "^4.0.3"
+ set-blocking "^2.0.0"
+
+object-assign@^4:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.13.3:
+ version "1.13.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a"
+ integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.5"
+
+os@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/os/-/os-0.1.2.tgz#f29a50c62908516ba42652de42f7038600cadbc2"
+ integrity sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-ms@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4"
+ integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-to-regexp@0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
+ integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
+
+pg-connection-string@^2.6.1:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.7.0.tgz#f1d3489e427c62ece022dba98d5262efcb168b37"
+ integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==
+
+picomatch@^2.0.4, picomatch@^2.2.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+prebuild-install@^7.1.1:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056"
+ integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==
+ dependencies:
+ detect-libc "^2.0.0"
+ expand-template "^2.0.3"
+ github-from-package "0.0.0"
+ minimist "^1.2.3"
+ mkdirp-classic "^0.5.3"
+ napi-build-utils "^1.0.1"
+ node-abi "^3.3.0"
+ pump "^3.0.0"
+ rc "^1.2.7"
+ simple-get "^4.0.0"
+ tar-fs "^2.0.0"
+ tunnel-agent "^0.6.0"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==
+
+promise-retry@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
+ integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==
+ dependencies:
+ err-code "^2.0.2"
+ retry "^0.12.0"
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+pstree.remy@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
+ integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
+
+pump@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+ integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.13.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
+ integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
+ dependencies:
+ side-channel "^1.0.6"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+readable-stream@^3.1.1, readable-stream@^3.4.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+readline@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c"
+ integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==
+
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+retry-as-promised@^7.0.4:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.0.4.tgz#9df73adaeea08cb2948b9d34990549dc13d800a2"
+ integrity sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==
+
+retry@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+semver@^5.7.1:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^7.3.5:
+ version "7.3.8"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
+ integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
+ dependencies:
+ lru-cache "^6.0.0"
+
+semver@^7.5.4:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
+semver@~7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+send@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+ integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+sequelize-pool@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz#210b391af4002762f823188fd6ecfc7413020768"
+ integrity sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==
+
+sequelize@^6.37.5:
+ version "6.37.5"
+ resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.37.5.tgz#2711ab97d0e0fe49c652368946a7312eb0f11cd7"
+ integrity sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==
+ dependencies:
+ "@types/debug" "^4.1.8"
+ "@types/validator" "^13.7.17"
+ debug "^4.3.4"
+ dottie "^2.0.6"
+ inflection "^1.13.4"
+ lodash "^4.17.21"
+ moment "^2.29.4"
+ moment-timezone "^0.5.43"
+ pg-connection-string "^2.6.1"
+ retry-as-promised "^7.0.4"
+ semver "^7.5.4"
+ sequelize-pool "^7.1.0"
+ toposort-class "^1.0.1"
+ uuid "^8.3.2"
+ validator "^13.9.0"
+ wkx "^0.5.0"
+
+serve-static@1.16.2:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+ integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
+ dependencies:
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.19.0"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel-list@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
+ integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
+side-channel@^1.0.6:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
+ integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+ side-channel-list "^1.0.0"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
+
+signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
+ integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
+ dependencies:
+ decompress-response "^6.0.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+simple-update-notifier@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz#7edf75c5bdd04f88828d632f762b2bc32996a9cc"
+ integrity sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==
+ dependencies:
+ semver "~7.0.0"
+
+smart-buffer@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
+socks-proxy-agent@^6.0.0:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce"
+ integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==
+ dependencies:
+ agent-base "^6.0.2"
+ debug "^4.3.3"
+ socks "^2.6.2"
+
+socks@^2.6.2:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55"
+ integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==
+ dependencies:
+ ip "^2.0.0"
+ smart-buffer "^4.2.0"
+
+sqlite3@^5.1.7:
+ version "5.1.7"
+ resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7"
+ integrity sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==
+ dependencies:
+ bindings "^1.5.0"
+ node-addon-api "^7.0.0"
+ prebuild-install "^7.1.1"
+ tar "^6.1.11"
+ optionalDependencies:
+ node-gyp "8.x"
+
+ssri@^8.0.0, ssri@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
+ integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
+ dependencies:
+ minipass "^3.1.1"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
+
+supports-color@^5.5.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+tar-fs@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
+ integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
+ dependencies:
+ chownr "^1.1.1"
+ mkdirp-classic "^0.5.2"
+ pump "^3.0.0"
+ tar-stream "^2.1.4"
+
+tar-stream@^2.1.4:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+ integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
+ dependencies:
+ bl "^4.0.3"
+ end-of-stream "^1.4.1"
+ fs-constants "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+
+tar@^6.0.2, tar@^6.1.11, tar@^6.1.2:
+ version "6.1.13"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b"
+ integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^4.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+toposort-class@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988"
+ integrity sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==
+
+touch@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
+ integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
+ dependencies:
+ nopt "~1.0.10"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+ts-mixer@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.1.tgz#7c2627fb98047eb5f3c7f2fee39d1521d18fe87a"
+ integrity sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==
+
+tslib@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+undefsafe@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
+ integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
+
+unique-filename@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+ integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+ integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+ dependencies:
+ imurmurhash "^0.1.4"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+validator@^13.9.0:
+ version "13.12.0"
+ resolved "https://registry.yarnpkg.com/validator/-/validator-13.12.0.tgz#7d78e76ba85504da3fee4fd1922b385914d4b35f"
+ integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which@^2.0.1, which@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
+ integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
+ dependencies:
+ string-width "^1.0.2 || 2 || 3 || 4"
+
+wkx@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c"
+ integrity sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==
+ dependencies:
+ "@types/node" "*"
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@^8.13.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
+ integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==