From 90a0db09da892e8e4e7a0278da441d8899c7401c Mon Sep 17 00:00:00 2001
From: PetyXbron <35902119+PetyXbron@users.noreply.github.com>
Date: Sun, 9 Apr 2023 23:59:54 +0200
Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=A8=20[1.7.0]=20-=20Updated=20the=20MC?=
=?UTF-8?q?=20server=20API=20(#22)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Added enableNormals option (settable in the config file)
- Created data.json file
- Removed quick.db and replaced it with pure JSON saving (node.js fs function) (closes #19, fixes #3, fixes #10)
- Changed license from MIT to GPL-3.0
- Renamed "split" settings to "removeServerType" and moved the code to the functions.js file
- Added "deleteOther" feature for votingCH feature
- Added "install-cmd" to the package.json file
- Updated the API for getting the live Minecraft server info (removed minecraft-server-util & minecraft-motd-util and installed axios for HTTP GET method)
- Using https://mcstatus.io/ API (from the same author)
---
.gitignore | 2 +-
.replit | 6 +-
LICENSE | 695 +++++++++++++++++++++++++++++++++--
README.md | 68 ++--
commands/list.js | 31 +-
commands/status.js | 114 ++----
commands/test.js | 2 +-
commands/version.js | 75 +---
config.js | 29 +-
data.json | 3 +
events/messageCreate.js | 61 +--
events/messageReactionAdd.js | 18 +
events/ready.js | 324 +++++++---------
functions.js | 16 +
index.js | 60 +--
package.json | 25 +-
slashes/help.js | 206 +++++------
slashes/ip.js | 2 +-
slashes/list.js | 27 +-
slashes/status.js | 114 ++----
slashes/version.js | 49 +--
templates/command.js | 2 +-
22 files changed, 1197 insertions(+), 732 deletions(-)
create mode 100644 data.json
create mode 100644 events/messageReactionAdd.js
create mode 100644 functions.js
diff --git a/.gitignore b/.gitignore
index e7bbedf..e6211c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,4 @@ package-lock.json
test/
dev-config.js
-json.sqlite
\ No newline at end of file
+dev-data.json
\ No newline at end of file
diff --git a/.replit b/.replit
index 3758100..8b21162 100644
--- a/.replit
+++ b/.replit
@@ -1,3 +1,5 @@
-run = "npm start"
+language = "nodejs-npm"
+entrypoint = "index.js"
onBoot = "npm install"
-language = "nodejs"
\ No newline at end of file
+run = "npm start"
+hidden = ".gitignore"
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 4a409f3..2cc8add 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,674 @@
-MIT License
-
-Copyright (c) 2021 PetyXbron
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ Own Discord bot for Minecraft servers. Using https://mcstatus.io/ API.
+ Copyright (C) 2021-2023 PetyXbron
+
+ 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 .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ minecraft-bot Copyright (C) 2021-2022 PetyXbron
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
index 4881bce..7eae8d0 100644
--- a/README.md
+++ b/README.md
@@ -1,56 +1,71 @@
-## [DOCUMENTATION HERE 🔗](https://petyxbron.gitbook.io/minecraft-bot/installation)
-## [DOWNLOAD LATEST .ZIP 🔗](https://github.com/PetyXbron/minecraft-bot/archive/refs/heads/main.zip)
+## [🔗 DOCUMENTATION HERE](https://petyxbron.gitbook.io/minecraft-bot/installation)
+## [🔗 DOWNLOAD LATEST MAIN .ZIP](https://github.com/PetyXbron/minecraft-bot/archive/refs/heads/main.zip)
+## [🔗 JOIN DISCORD SUPPORT SERVER](https://discord.com/invite/PYTqqhWad2)
# Custom Discord Minecraft bot
### *Get info about your Minecraft server with this Discord bot!*
[![Repo stars](https://img.shields.io/github/stars/PetyXbron/minecraft-bot?style=flat&logo=github&labelColor=232121&color=blue&label=Stars)](https://github.com/PetyXbron/minecraft-bot/stargazers) [![Repo forks](https://img.shields.io/github/forks/PetyXbron/minecraft-bot?style=flat&logo=github&labelColor=232121&color=blue&label=Forks)](https://github.com/PetyXbron/minecraft-bot/network) [![Latest Version](https://img.shields.io/github/package-json/v/PetyXbron/minecraft-bot?color=blue&label=Version&labelColor=232121&logo=github&sort=semver&style=flat)](https://github.com/PetyXbron/minecraft-bot/tree/main/) [![Repo license](https://img.shields.io/github/license/PetyXbron/minecraft-bot?style=flat&logo=github&labelColor=232121&color=blue&label=License)](https://github.com/PetyXbron/minecraft-bot/blob/main/LICENSE)
-This code uses **Minecraft server util package** for getting status of Minecraft servers
-* minecraft-server-util package
- * [Github Repository](https://github.com/PassTheMayo/minecraft-server-util)
- * [npmjs Package](https://www.npmjs.com/package/minecraft-server-util)
- * [Author Github Profile](https://github.com/PassTheMayo)
+**This project uses MSC API ([mcstatus.io](https://mcstatus.io)) for getting status of Minecraft servers.**
+
+## REQUIREMENTS
+- **Need to install:**
+ - [Node.js](https://nodejs.org/en/about) v16.9.0 or higher *([download here](https://nodejs.org/en/download))*
+ - [NPM](https://docs.npmjs.com/about-npm) (automatically installs with Node.js)
+- **Recommended to:**
+ - Install IDE for editing files ([Visual Studio Code](https://code.visualstudio.com/) recommended)
+- **How to use?**
+ 1. Edit the [`config.js`](config.js) and [`data.json`](data.json) files
+ 2. Use the command `npm install` before running to install all required dependencies (or use *"install-cmd"* in the [`package.json`](package.json) file)
+ 3. Use `npm start` or `node index.js` to run the project
## WHAT CAN THIS BOT DO?
- **Fully customizable [config](config.js)**
- Working **commands** with **custom prefix** + their **[slash commands]((https://support.discord.com/hc/en-us/articles/1500000368501-Slash-Commands-FAQ))**
- - `help` command for getting help menu (list of all user-available commands)
- - `ip` command for getting IP address of server
- - `list` command for getting actual list of online players now
- - `status` command for getting simple and clear overview of server
- - `version` command for getting Minecraft version of server
+ - `help` command for getting the help menu (list of all user-available commands)
+ - `ip` command for getting the IP address of the server
+ - `list` command for getting an actual list of online players now
+ - `status` command for getting a simple and clear overview of the server
+ - `version` command for getting the Minecraft version of the server
- `vote` command for getting vote link for voting for server on Minecraft server list
-- **Auto updating bot's status** with online and max players (setup in config with variables)
+- **Auto updating bot's status** with online and max players (setup in the config with variables)
- ![Auto updating bot status](https://i.imgur.com/xNDVb2D.png)
+ ![Auto updating bot status](https://imgur.com/4D8W8lT.png)
![Bot status config variables](https://i.imgur.com/7TXaWTC.png)
-- More Discord bot activites: `playing`, `listening`, `watching` and `competing`
-- More Discord bot statuses: `online`, `idle`, `dnd` and `invsible`
-- **Poll/Voting channel** with reactions
+- More Discord bot activities: `playing`, `listening`, `watching`, and `competing`
+- More Discord bot statuses: `online`, `idle`, `dnd`, and `invisible`
+- **Suggestions/voting channel** with reactions and threads
![Voting channel](https://i.imgur.com/OfCxqhf.gif)
-- Custom responses for each command, editable in [config file](config.js)
+- Custom responses for each command, editable in [the config file](config.js)
- **Auto updating status message** with player list
- ![Auto status messsage](https://i.imgur.com/L6gFK4Q.png)
+ ![Auto status messsage](https://imgur.com/gSAUIh5.png)
- **Random** RGB **color of command embeds** (each message another)
![Random embed color](https://i.imgur.com/pA7h5rC.png)
- **Clear colorful console** logging
- ![minecraft-bot console](https://i.imgur.com/TyTCsQv.png)
+ ![minecraft-bot console](https://imgur.com/IqtzdM1.png)
-## HOW TO USE & INSTALL
+## MORE INFO
### Go to our [documentation](https://petyxbron.gitbook.io/minecraft-bot/installation/install) and see.
+Run on Repl.it:
+
[![Run on Repl.it](https://repl.it/badge/github/MrMazzone/dotreplit-example)](https://repl.it/github/PetyXbron/minecraft-bot)
-*Repl could not be updated for lastest Node.js version. Please check if you can install Node.js v17*
+
+*Repl probably won't be updated for the latest Node.js version. Please check if you can install Node.js v16.9.0 or higher to support Discord.js v14*
## TO DO
-- [x] Auto changing status message
+- [ ] Send custom embed message command
+- [ ] Send a custom message/announcement command
+- [ ] Better test command variables (more process info - like uptime)
+- [ ] Poll/Voting command (simple or with more options)
+- [x] Auto changing statusCH message
- [x] Status command
- [x] IP address command
- [x] Minecraft version command
@@ -58,14 +73,9 @@ This code uses **Minecraft server util package** for getting status of Minecraft
- [x] Vote link command
- [x] Poll/Voting channel with reactions
- [x] Slash commands
-- [x] Custom reply for ip, test and version command
- [x] Installation with repl.it
- [x] More text languages (or custom)
- [x] Bot status (activity) for players online number
- [x] Get invite link on bot start (available option in config)
- [x] Help command with all commands listing
-- [ ] Poll/Voting command (simple or with more options)
-- [ ] Server AdminTeam applications
-- [ ] Send custom embed message command
-- [ ] Send custom message/announcement command
-- [ ] Better test command variables (more process info - like uptime)
\ No newline at end of file
+- [x] And many other unlisted things 😉
\ No newline at end of file
diff --git a/commands/list.js b/commands/list.js
index 456902d..29c5736 100644
--- a/commands/list.js
+++ b/commands/list.js
@@ -1,4 +1,4 @@
-const util = require('minecraft-server-util'),
+const util = require('axios'),
Discord = require('discord.js'),
c = require('chalk'),
fs = require('fs'),
@@ -18,21 +18,18 @@ module.exports.run = async (bot, message) => {
if (!server.work) return;
- let
- ip1 = server.ip,
- port1 = server.port,
- icon = server.icon ? server.icon : message.guild.iconURL();
+ let icon = server.icon ? server.icon : message.guild.iconURL();
if (server.type === 'java') {
- util.status(ip1, port1)
- .then((result) => {
+ util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`)
+ .then((response) => {
if (text.title === "" || text.description === "" || text.listFormat === "") {
- const trueList = result.players.sample ? "\n\`\`\`" + result.players.sample.map(p => ` ${p.name} `).join('\r\n') + "\`\`\`" : "";
+ const trueList = response.data.players.list ? "\n\`\`\`" + response.data.players.list.map(p => ` ${p.name_clean} `).join('\r\n') + "\`\`\`" : "";
const serverEmbed = new Discord.EmbedBuilder()
.setAuthor({ name: config.server.name ? config.server.name : message.guild.name, iconURL: icon })
.setTitle("Online player list:")
- .setDescription(`**${result.players.online}**/**${result.players.max}**` + trueList)
+ .setDescription(`**${response.data.players.online}**/**${response.data.players.max}**` + trueList)
.setColor(config.embeds.color);
message.channel.send({ embeds: [serverEmbed] });
} else {
@@ -41,19 +38,19 @@ module.exports.run = async (bot, message) => {
text.title = text.title.replaceAll('{serverName}', config.server.name ? config.server.name : message.guild.name);
text.title = text.title.replaceAll('{voteLink}', config.server.vote);
text.title = text.title.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.title = text.title.replaceAll('{playersOnline}', result.players.online);
- text.title = text.title.replaceAll('{playersMax}', result.players.max);
+ text.title = text.title.replaceAll('{playersOnline}', response.data.players.online);
+ text.title = text.title.replaceAll('{playersMax}', response.data.players.max);
text.description = text.description.replaceAll('{serverIp}', server.ip);
text.description = text.description.replaceAll('{serverPort}', server.port);
text.description = text.description.replaceAll('{serverName}', config.server.name ? config.server.name : message.guild.name);
text.description = text.description.replaceAll('{voteLink}', config.server.vote);
text.description = text.description.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.description = text.description.replaceAll('{playersOnline}', result.players.online);
- text.description = text.description.replaceAll('{playersMax}', result.players.max);
+ text.description = text.description.replaceAll('{playersOnline}', response.data.players.online);
+ text.description = text.description.replaceAll('{playersMax}', response.data.players.max);
- if (result.players.sample) {
- var trueList = text.listFormat.replaceAll('{playersList}', result.players.sample.map(p => ` ${p.name} `).join('\r\n'));
+ if (response.data.players.list) {
+ var trueList = text.listFormat.replaceAll('{playersList}', response.data.players.list.map(p => ` ${p.name_clean} `).join('\r\n'));
}
const serverEmbed = new Discord.EmbedBuilder()
@@ -90,8 +87,8 @@ module.exports.run = async (bot, message) => {
if (warns) console.log(`${bot.emotes.warn} ` + warn(`Error when using command ${module.exports.config.name}! Error:\n`) + error);
});
} else {
- //Doesn't work for bedrock edition, sorry.
- message.reply('Sorry, but this function is not working for Bedrock servers.');
+ //Doesn't work for Bedrock edition, sorry.
+ message.reply({ content: 'Sorry, but this function is not working for Bedrock servers.' });
}
};
\ No newline at end of file
diff --git a/commands/status.js b/commands/status.js
index 03bc3f8..023de9e 100644
--- a/commands/status.js
+++ b/commands/status.js
@@ -1,4 +1,4 @@
-const util = require('minecraft-server-util'),
+const util = require('axios'),
Discord = require('discord.js'),
c = require('chalk'),
fs = require('fs'),
@@ -15,52 +15,24 @@ module.exports.run = async (bot, message) => {
text = commands.status.text,
settings = config.settings,
warn = c.keyword('yellow').bold,
- warns = config.settings.warns;
+ warns = config.settings.warns,
+ { removeVersion } = require('../functions');
if (!server.work) return;
- let
- ip1 = server.ip,
- port1 = server.port,
- icon = server.icon ? server.icon : message.guild.iconURL();
+ let icon = server.icon ? server.icon : message.guild.iconURL();
if (server.type === 'java') {
- util.status(ip1, port1)
- .then((result) => {
- let versionOriginal = result.version.name,
+ util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`)
+ .then((response) => {
+ let versionOriginal = response.data.version.name_clean,
versionAdvanced = false;
let maintenceStatus = false,
- lowCaseMotdClean = result.motd.clean.toLocaleLowerCase();
+ lowCaseMotdClean = response.data.motd.clean.toLocaleLowerCase();
if (lowCaseMotdClean.includes("maintenance")) maintenceStatus = true;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
@@ -71,7 +43,7 @@ module.exports.run = async (bot, message) => {
.setDescription(`${maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**"}
**Description**
- ${result.motd.clean}
+ ${response.data.motd.clean}
**IP Address**
\`${server.ip}\`:\`${server.port}\`
@@ -80,7 +52,7 @@ module.exports.run = async (bot, message) => {
${config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1)} ${version}
**Players**
- **${result.players.online}**/**${result.players.max}**`)
+ **${response.data.players.online}**/**${response.data.players.max}**`)
.setColor(config.embeds.color);
message.channel.send({ embeds: [serverEmbed] });
} else {
@@ -89,9 +61,9 @@ module.exports.run = async (bot, message) => {
text.title = text.title.replaceAll('{serverName}', config.server.name ? config.server.name : message.guild.name);
text.title = text.title.replaceAll('{voteLink}', config.server.vote);
text.title = text.title.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.title = text.title.replaceAll('{playersOnline}', result.players.online);
- text.title = text.title.replaceAll('{playersMax}', result.players.max);
- text.title = text.title.replaceAll('{motd}', result.motd.clean);
+ text.title = text.title.replaceAll('{playersOnline}', response.data.players.online);
+ text.title = text.title.replaceAll('{playersMax}', response.data.players.max);
+ text.title = text.title.replaceAll('{motd}', response.data.motd.clean);
text.title = text.title.replaceAll('{serverVersion}', version);
text.title = text.title.replaceAll('{status}', maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**");
@@ -100,9 +72,9 @@ module.exports.run = async (bot, message) => {
text.description = text.description.replaceAll('{serverName}', config.server.name ? config.server.name : message.guild.name);
text.description = text.description.replaceAll('{voteLink}', config.server.vote);
text.description = text.description.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.description = text.description.replaceAll('{playersOnline}', result.players.online);
- text.description = text.description.replaceAll('{playersMax}', result.players.max);
- text.description = text.description.replaceAll('{motd}', result.motd.clean);
+ text.description = text.description.replaceAll('{playersOnline}', response.data.players.online);
+ text.description = text.description.replaceAll('{playersMax}', response.data.players.max);
+ text.description = text.description.replaceAll('{motd}', response.data.motd.clean);
text.description = text.description.replaceAll('{serverVersion}', version);
text.description = text.description.replaceAll('{status}', maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**");
@@ -125,42 +97,16 @@ module.exports.run = async (bot, message) => {
if (warns) console.log(warn(`Error when using command ${module.exports.config.name}! Error:\n`) + error);
});
} else {
- util.statusBedrock(ip1, port1)
- .then((result) => {
- const versionOriginal = result.version.name;
+ util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`)
+ .then((response) => {
+ const versionOriginal = response.data.version.name_clean;
let versionAdvanced = false;
let maintenceStatus = false,
- lowCaseMotdClean = result.motd.clean.toLocaleLowerCase();
+ lowCaseMotdClean = response.data.motd.clean.toLocaleLowerCase();
if (lowCaseMotdClean.includes("maintenance")) maintenceStatus = true;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
@@ -171,7 +117,7 @@ module.exports.run = async (bot, message) => {
.setDescription(`:white_check_mark: ${maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**"}
**Description**
- ${result.motd.clean}
+ ${response.data.motd.clean}
**IP Address**
\`${server.ip}\`:\`${server.port}\`
@@ -180,7 +126,7 @@ module.exports.run = async (bot, message) => {
${config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1)} ${version}
**Players**
- **${result.players.online}**/**${result.players.max}**`)
+ **${response.data.players.online}**/**${response.data.players.max}**`)
.setColor(config.embeds.color);
message.channel.send({ embeds: [serverEmbed] });
} else {
@@ -189,9 +135,9 @@ module.exports.run = async (bot, message) => {
text.title = text.title.replaceAll('{serverName}', config.server.name ? config.server.name : message.guild.name);
text.title = text.title.replaceAll('{voteLink}', config.server.vote);
text.title = text.title.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.title = text.title.replaceAll('{playersOnline}', result.players.online);
- text.title = text.title.replaceAll('{playersMax}', result.players.max);
- text.title = text.title.replaceAll('{motd}', result.motd.clean);
+ text.title = text.title.replaceAll('{playersOnline}', response.data.players.online);
+ text.title = text.title.replaceAll('{playersMax}', response.data.players.max);
+ text.title = text.title.replaceAll('{motd}', response.data.motd.clean);
text.title = text.title.replaceAll('{serverVersion}', version);
text.title = text.title.replaceAll('{status}', maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**");
@@ -200,9 +146,9 @@ module.exports.run = async (bot, message) => {
text.description = text.description.replaceAll('{serverName}', config.server.name ? config.server.name : message.guild.name);
text.description = text.description.replaceAll('{voteLink}', config.server.vote);
text.description = text.description.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.description = text.description.replaceAll('{playersOnline}', result.players.online);
- text.description = text.description.replaceAll('{playersMax}', result.players.max);
- text.description = text.description.replaceAll('{motd}', result.motd.clean);
+ text.description = text.description.replaceAll('{playersOnline}', response.data.players.online);
+ text.description = text.description.replaceAll('{playersMax}', response.data.players.max);
+ text.description = text.description.replaceAll('{motd}', response.data.motd.clean);
text.description = text.description.replaceAll('{serverVersion}', version);
text.description = text.description.replaceAll('{status}', maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**");
diff --git a/commands/test.js b/commands/test.js
index f5ebbdf..5c66a5e 100644
--- a/commands/test.js
+++ b/commands/test.js
@@ -1,4 +1,4 @@
-const util = require('minecraft-server-util'),
+const util = require('axios'),
fs = require('fs'),
{ commands } = require(fs.existsSync(__dirname + '/../dev-config.js') ? '../dev-config' : '../config');
diff --git a/commands/version.js b/commands/version.js
index e3ff0f8..b65590e 100644
--- a/commands/version.js
+++ b/commands/version.js
@@ -1,5 +1,5 @@
const Discord = require('discord.js'),
- util = require('minecraft-server-util'),
+ util = require('axios'),
warn = require('chalk').keyword('yellow').bold,
fs = require('fs'),
{ commands } = require(fs.existsSync(__dirname + '/../dev-config.js') ? '../dev-config' : '../config');
@@ -13,16 +13,17 @@ module.exports.config = {
module.exports.run = async (bot, message, args) => {
let { server, config } = bot,
text = commands.version.text,
- icon = server.icon ? server.icon : message.guild.iconURL();
- const warns = config.settings.warns;
- const settings = config.settings
- ;
+ icon = server.icon ? server.icon : message.guild.iconURL(),
+ warns = config.settings.warns,
+ settings = config.settings,
+ { removeVersion } = require('../functions');
+
if (!server.work) return;
if (server.type === 'java') {
try {
- const result = await util.status(server.ip, server.port);
- var versionOriginal = result.version.name;
+ const response = await util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`);
+ var versionOriginal = response.data.version.name_clean;
} catch (e) {
if (warns) console.log(`${bot.emotes.warn} ` + warn(`Couldn't get version from server! Getting it from config..`));
var versionOriginal = config.server.version;
@@ -30,33 +31,7 @@ module.exports.run = async (bot, message, args) => {
let versionAdvanced = false;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
@@ -91,8 +66,8 @@ module.exports.run = async (bot, message, args) => {
}
} else {
try {
- const result = await util.statusBedrock(server.ip, server.port);
- var versionOriginal = result.version.name;
+ const response = await util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`);
+ var versionOriginal = response.data.version.name_clean;
} catch (e) {
if (warns) console.log(`${bot.emotes.warn} ` + warn(`Couldn't get version from server! Getting it from config..`));
var versionOriginal = config.server.version;
@@ -100,33 +75,7 @@ module.exports.run = async (bot, message, args) => {
let versionAdvanced = false;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
diff --git a/config.js b/config.js
index c052129..af2ddb3 100644
--- a/config.js
+++ b/config.js
@@ -1,8 +1,10 @@
-//CONFIG DATA EXPLANATION - https://docs.petyxbron.cz/config/config-info
+//CONFIG DATA EXPLANATION - https://mb.petyxbron.cz/config/config-info
+//ENABLE BOT "SERVER MEMBERS INTENT" & "MESSAGE CONTENT INTENT" ON DISCORD DEVELOPER PORTAL
+//YOU CAN DISABLE COMMANDS BY MESSAGE CONTENT ON LINE 97 (IF YOU WON'T USE "MESSAGE CONTENT INTENT")
module.exports = {
//Your bot data
bot: {
- token: "", //Your bot token - https://tinyurl.com/discordbot-token
+ //PASTE YOUR DISCORD BOT TOKEN IN DATA.JSON FILE (more secure) - https://tinyurl.com/discordbot-token
prefix: "", //Your custom prefix of the bot, like "!" or "."
presence: "", //Custom activity/status text
status: "", //You can choose: ONLINE, IDLE, DND (do not disturb), INVISIBLE
@@ -22,17 +24,21 @@ module.exports = {
},
//Basic code settings
- //All settings are boolean wanted - Use "true" for enabling, "false" for disabling setting.
+ //All settings are boolean wanted - Use "true" for enabling, and "false" for disabling setting.
settings: {
+ //General:
warns: true, //Show warns?
debug: false, //Log most of the changes and updates (pretty spam)?
inviteLink: true, //Show bot invite link on bot start?
- readyScan: true, //On bot's start, send to console server's basic info?
- split: false, //Advanced - Extract only the version like "1.17" or "1.12" etc.
+ readyScan: true, //On bot's start, send to console server's essential information?
+ //Features:
randomColor: false, //Enable random hex color generator for embeds? Overwrites embeds settings!
statusCH: false, //Enable auto-changing status message?
votingCH: false, //Enable voting channel?
- countingCH: false //Enable counting channel?
+ countingCH: false, //Enable counting channel?
+ //Advanced:
+ removeServerType: false, //Remove "Spigot", "Purpur" etc. from version and leave only "1.18", "1.19" etc.?
+ showDefaultPort: false //Show the server port behind IP if its default (25565, 19132) (primarily statusCH feature)?
},
//Period of auto changing status if you are using {onlinePlayers} or {maxPlayers} in bot's presence
@@ -47,7 +53,7 @@ module.exports = {
time: "30s" //Period of updating status message - like "3min", "20s" or "1min" etc.
},
- //Voting channel - https://docs.petyxbron.cz/config/config-info#voting-ch
+ //Voting channel - https://mb.petyxbron.cz/config/config-info#voting-ch
votingCH: {
channelID: "",
time: "30s", //Time for how long the cancel reaction should be deleted.
@@ -60,7 +66,8 @@ module.exports = {
reactions: {
first: "👍", //First added reaction (the positive one)
second: "👎", //Second added reaction (the negative one)
- cancel: "❌" //Third added reaction (cancel/remove button)
+ cancel: "❌", //Third added reaction (cancel/remove button)
+ deleteOther: false //Delete all other reactions than those mentioned above (admin's reactions are ignored)
}
},
@@ -86,12 +93,14 @@ module.exports = {
success: "💚",
info: "💙",
warn: "💛",
+ debug: "💜",
error: "🛑"
}
},
//All commands settings
commands: {
+ enableNormals: true, //This requires having "message content" intent allowed on the Discord developer portal site
enableSlashes: true, //If you want to disable only specific slashes, leave this true and go down
//List of all commands:
help: {
@@ -156,7 +165,7 @@ module.exports = {
},
test: {
enableNormal: true, //Enables normal command
- //Test command doesn't have slash type. Is it really necessary?
+ //Test command doesn't have a slash type. Is it really necessary?
aliases: [ //Only for normal commands
"t", "try", "testing"
],
@@ -189,4 +198,4 @@ module.exports = {
}
};
-//CONFIG DATA EXPLANATION - https://docs.petyxbron.cz/config/config-info
\ No newline at end of file
+//CONFIG DATA EXPLANATION - https://mb.petyxbron.cz/config/config-info
\ No newline at end of file
diff --git a/data.json b/data.json
new file mode 100644
index 0000000..2671f46
--- /dev/null
+++ b/data.json
@@ -0,0 +1,3 @@
+{
+ "token": ""
+}
\ No newline at end of file
diff --git a/events/messageCreate.js b/events/messageCreate.js
index e34dea5..62bd412 100644
--- a/events/messageCreate.js
+++ b/events/messageCreate.js
@@ -1,23 +1,12 @@
const ms = require('ms'),
version = require('../package.json').version,
- db = require('quick.db');
+ fs = require('fs');
module.exports = async (bot, message) => {
if (message.author.bot) return;
- if (message.content.includes(`minecraft-bot version`)) {
- message.channel.sendTyping();
- setTimeout(function () {
- message.channel.send({ content: version });
- }, ms('1s'));
- return;
- }
const { prefix, server, config } = bot;
- const messageArray = message.content.split(' ');
- const cmd = messageArray[0].toLowerCase();
- const args = messageArray.slice(1);
-
if (config.settings.votingCH && message.channel.id === config.votingCH.channelID) {
if (message.content.startsWith(prefix)) return;
@@ -36,25 +25,45 @@ module.exports = async (bot, message) => {
if (message) {
if (message.reactions.cache.get(config.votingCH.reactions.cancel)) {
message.reactions.cache.get(config.votingCH.reactions.cancel).remove();
- if (config.votingCH.threads.enable) {
- lastID = await db.fetch(`VotingCHLastID`) ? await db.fetch(`VotingCHLastID`) : 0;
- newID = parseInt(lastID) + 1;
- ID = (config.votingCH.threads.idSyntax.replace("1", "") + newID).slice(-config.votingCH.threads.idSyntax.length);
-
- const thread = await message.startThread({
- name: config.votingCH.threads.nameSyntax.replaceAll("{ID}", ID),
- autoArchiveDuration: config.votingCH.threads.archiveTime
- });
- await thread.leave();
-
- db.set(`VotingCHLastID`, newID);
- }
- return;
+ }
+
+ if (config.votingCH.threads.enable) {
+ const dataJSON = bot.dataJSON;
+ lastID = dataJSON["VotingCHLastID"] ? dataJSON["VotingCHLastID"] : 0;
+ newID = parseInt(lastID) + 1;
+ ID = (config.votingCH.threads.idSyntax.replace("1", "") + newID).slice(-config.votingCH.threads.idSyntax.length);
+
+ const thread = await message.startThread({
+ name: config.votingCH.threads.nameSyntax.replaceAll("{ID}", ID),
+ autoArchiveDuration: config.votingCH.threads.archiveTime
+ });
+ await thread.leave();
+
+ data = dataJSON;
+ data["VotingCHLastID"] = newID;
+
+ fs.writeFile(bot.dev ? './dev-data.json' : './data.json', JSON.stringify(data, null, 4), err => {
+ if (err) console.log("Could not edit the data.json content! Error:\n" + err);
+ });
}
}
});
}
+ if (!config.commands.enableNormals) return;
+
+ if (message.content.includes(`minecraft-bot version`)) {
+ message.channel.sendTyping();
+ setTimeout(function () {
+ message.channel.send({ content: `> **minecraft-bot:** \`${version}\`` });
+ }, ms('1s'));
+ return;
+ }
+
+ const messageArray = message.content.split(' ');
+ const cmd = messageArray[0].toLowerCase();
+ const args = messageArray.slice(1);
+
if (!message.content.startsWith(prefix)) return;
let commandfile = bot.commands.get(cmd.slice(prefix.length)) || bot.commands.get(bot.aliases.get(cmd.slice(prefix.length)));
if (commandfile) {
diff --git a/events/messageReactionAdd.js b/events/messageReactionAdd.js
new file mode 100644
index 0000000..e58079c
--- /dev/null
+++ b/events/messageReactionAdd.js
@@ -0,0 +1,18 @@
+const chalk = require('chalk'),
+ ms = require('ms'),
+ fs = require('fs'),
+ { PermissionsBitField } = require('discord.js'),
+ ma = chalk.magenta.bold;
+
+module.exports = async (bot, messageReaction) => {
+ const r = messageReaction;
+ const { prefix, server, config } = bot;
+ const debug = config.settings.debug;
+
+ if (config.settings.votingCH && config.votingCH.reactions.deleteOther && r.message.channel.id === config.votingCH.channelID) {
+ if (r.users.cache.first().id !== bot.user.id && !bot.guilds.cache.get(r.message.guildId).members.cache.get(r.users.cache.first().id).permissions.has(PermissionsBitField.Flags.Administrator)) {
+ await r.remove();
+ if (debug) console.log(`${bot.emotes.debug} ` + "Unwated reaction from " + ma(r.users.cache.first().tag) + " was removed from votingCH message.");
+ }
+ }
+};
\ No newline at end of file
diff --git a/events/ready.js b/events/ready.js
index 0f4f01c..0740095 100644
--- a/events/ready.js
+++ b/events/ready.js
@@ -1,19 +1,23 @@
const chalk = require('chalk'),
- util = require('minecraft-server-util'),
+ util = require('axios'),
Discord = require('discord.js'),
at = Discord.ActivityType,
- db = require('quick.db'),
+ fs = require('fs'),
ms = require('ms'),
gr = chalk.green.bold,
bold = chalk.bold,
bl = chalk.blue.bold,
+ ma = chalk.magenta.bold,
blu = chalk.blue.bold.underline,
- warn = chalk.keyword('yellow').bold;
+ warn = chalk.keyword('yellow').bold,
+ processInfo = chalk.cyan.bgBlack,
+ { removeVersion } = require('../functions');
module.exports = async (bot) => {
const { server, config, info, settings } = bot;
const guild = config.bot.guildID ? await bot.guilds.cache.get(config.bot.guildID) : null;
const debug = config.settings.debug;
+ const defPort = config.settings.showDefaultPort;
var warns = config.settings.warns;
if (bot.pres) {
@@ -23,46 +27,46 @@ module.exports = async (bot) => {
if (bot.pres.includes("{onlinePlayers}") | bot.pres.includes("{maxPlayers}")) {
async function autoUpdatingPresence() { //autoUpdatingPresence loop for refreshing bot presence and status
let errored = false,
- result = undefined;
+ response = undefined;
if (server.type === 'java') {
try {
- result = await util.status(server.ip, server.port);
+ response = await util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`);
} catch (err) {
- if (debug) console.log(err);
+ if (debug) console.log(`${bot.emotes.debug} Could not receive server status data! Error:\n` + err);
errored = true;
}
} else {
try {
- result = await util.statusBedrock(server.ip, server.port);
+ response = await util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`);
} catch (err) {
- if (debug) console.log(err);
+ if (debug) console.log(`${bot.emotes.debug} Could not receive server status data! Error:\n` + err);
errored = true;
}
};
if (!errored) {
if (presence.includes("{onlinePlayers}")) {
- presence = presence.replaceAll("{onlinePlayers}", result.players.online);
+ presence = presence.replaceAll("{onlinePlayers}", response.data.players.online);
};
if (presence.includes("{maxPlayers}")) {
- presence = presence.replaceAll("{maxPlayers}", result.players.max);
+ presence = presence.replaceAll("{maxPlayers}", response.data.players.max);
};
try {
await bot.user.setPresence({ activities: [{ name: presence, type: at[activity] }], status: status, afk: false }); //Sets bot activity
- if (debug) console.log(`${bot.emotes.success} Successfully set presence to ` + gr(`${activity} ${presence}`));
+ if (debug) console.log(`${bot.emotes.debug} Successfully set the bot presence to ` + ma(`${activity} ${presence}`));
} catch (e) {
- if (debug) console.log(e);
+ if (debug) console.log(`${bot.emotes.debug} Could not set the Discord bot presence! Error:\n` + e);
}
} else {
const presence = config.autoStatus.offline;
try {
await bot.user.setPresence({ activities: [{ name: presence, type: at[activity] }], status: status, afk: false }); //Sets bot activity
- if (debug) console.log(`${bot.emotes.warn} ` + warn('Server was not found! Presence set to ') + gr(`${activity} ${presence}`));
+ if (debug) console.log(`${bot.emotes.warn} ` + warn('Server was not found! Presence set to ') + ma(`${activity} ${presence}`));
} catch (e) {
- if (debug) console.log(e);
+ if (debug) console.log(`${bot.emotes.debug} Could not set the Discord bot presence! Error:\n` + e);
}
}
presence = config.bot.presence;
@@ -72,9 +76,9 @@ module.exports = async (bot) => {
} else {
try {
bot.user.setPresence({ activities: [{ name: presence, type: activity }], status: status, afk: false }); //Sets bot activity
- if (debug) console.log(`${bot.emotes.success} Successfully set presence to ` + gr(`${bot.activity.toLowerCase()} ${bot.pres}`));
+ if (debug) console.log(`${bot.emotes.debug} Successfully set the bot presence to ` + ma(`${bot.activity.toLowerCase()} ${bot.pres}`));
} catch (e) {
- console.log();
+ if (debug) console.log(`${bot.emotes.debug} Could not set the Discord bot presence! Error:\n` + e);
}
}
}
@@ -83,44 +87,44 @@ module.exports = async (bot) => {
async function countingCH() { //countingCH loop for refreshing voice channel name
let name = config.countingCH.name,
errored = false,
- result = undefined;
+ response = undefined;
if (server.type === 'java') {
try {
- result = await util.status(server.ip, server.port);
+ response = await util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`);
} catch (err) {
- if (debug) console.log(err);
+ if (debug) console.log(`${bot.emotes.debug} Could not receive server status data! Error:\n` + err);
errored = true;
}
} else {
try {
- result = await util.statusBedrock(server.ip, server.port);
+ response = await util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`);
} catch (err) {
- if (debug) console.log(err);
+ if (debug) console.log(`${bot.emotes.debug} Could not receive server status data! Error:\n` + err);
errored = true;
}
};
if (!errored) {
name = name
- .replaceAll("{onlinePlayers}", result.players.online)
- .replaceAll("{maxPlayers}", result.players.max);
+ .replaceAll("{onlinePlayers}", response.data.players.online)
+ .replaceAll("{maxPlayers}", response.data.players.max);
try {
channel = await bot.channels.cache.get(config.countingCH.channelID);
await channel.setName(name); //Sets channel name
- if (debug) console.log(`${bot.emotes.success} Successfully set channel name to ` + gr(name));
+ if (debug) console.log(`${bot.emotes.debug} Successfully set the countingCH channel name to ` + ma(name));
} catch (e) {
- if (debug) console.log(e);
+ if (warns) console.log(bot.emotes.warn + warn('Could not set the countingCH channel name! Error:\n') + e);
}
} else {
name = config.countingCH.offline;
try {
channel = await bot.channels.cache.get(config.countingCH.channelID);
await channel.setName(name); //Sets channel name
- if (debug) console.log(`${bot.emotes.warn} ` + warn('Server was not found! Channel name has been set to ') + gr(name));
+ if (debug) console.log(`${bot.emotes.debug} ` + warn('Could not get the server data information! Channel name has been set to ') + ma(name));
} catch (e) {
- if (debug) console.log(e);
+ if (warns) console.log(bot.emotes.warn + warn('Could not set the countingCH channel name! Error:\n') + e);
}
}
setTimeout(countingCH, ms(config.countingCH.time));
@@ -130,14 +134,15 @@ module.exports = async (bot) => {
if (config.settings.votingCH) {
const channel = bot.channels.cache.get(config.votingCH.channelID);
- console.log(`${bot.emotes.success} Channel ${gr(channel.name)} is now set as voting channel!`);
+ if (debug) console.log(`${bot.emotes.debug} Channel ${ma(channel.name)} is now set as voting channel!`);
}
if (config.settings.statusCH && server.work) {
const channel = bot.channels.cache.get(info.channelID);
const icon = server.icon ? server.icon : guild.iconURL();
+ const dataJSON = bot.dataJSON;
- if (!db.get('statusCHMsgID')) {
+ if (!dataJSON["StatusCHMsgID"]) {
let msg;
try {
const serverEmbed = new Discord.EmbedBuilder()
@@ -145,74 +150,56 @@ module.exports = async (bot) => {
.setDescription(`🔄 **SETTING...**`)
.addFields([
{ name: "PLAYERS", value: `�/�`, inline: false },
- { name: "INFO", value: `${config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1)} �\n\`${server.ip}\`:\`${server.port}\``, inline: true }
+ { name: "INFO", value: `${config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1)} �\n\`${server.ip}\`${!defPort && server.port === 25565 || !defPort && server.port === 19132 ? "" : `:\`${server.port}\``}`, inline: true }
])
.setColor(config.embeds.color);
- msg = await channel.send({ embeds: [serverEmbed] });
- } catch (err) { if (debug) console.log(err); }
+ try {
+ msg = await channel.send({ embeds: [serverEmbed] });
+ } catch (err) {
+ console.log("Could not send the statusCH message! Error:\n" + err);
+ }
+ } catch (err) {
+ if (warns) console.log(bot.emotes.warn + warn('Could not send the statusCH message! Error:\n') + err);
+ }
- console.log(`${bot.emotes.success} Successfully sent status message to ${gr(channel.name)}!`);
- db.set('statusCHMsgID', msg.id);
+ data = dataJSON;
+ data["StatusCHMsgID"] = msg.id;
+ fs.writeFile(bot.dev ? "./dev-data.json" : "./data.json", JSON.stringify(data, null, 4), err => {
+ if (warns) console.log(bot.emotes.warn + warn('Could not edit the data.json content! Error:\n') + err);
+ });
}
- msg = await channel.messages.fetch(db.get('statusCHMsgID'));
- let
- ip1 = server.ip,
- port1 = server.port;
+ msg = await channel.messages.fetch(dataJSON["StatusCHMsgID"]);
if (server.type === 'java') {
- util.status(ip1, port1)
- .then((result) => {
- const versionOriginal = result.version.name;
+ util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`)
+ .then((response) => {
+ const versionOriginal = response.data.version.name_clean;
let versionAdvanced = false;
let maintenceStatus = false,
- lowCaseMotdClean = result.motd.clean.toLocaleLowerCase();
+ lowCaseMotdClean = response.data.motd.clean.toLocaleLowerCase();
if (lowCaseMotdClean.includes("maintenance")) maintenceStatus = true;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
- const trueList = result.players.sample ? "\n\`\`\`" + result.players.sample.map(p => ` ${p.name} `).join('\r\n') + "\`\`\`" : "";
+ const trueList = response.data.players.list ? "\n\`\`\`" + response.data.players.list.map(p => ` ${p.name_clean} `).join('\r\n') + "\`\`\`" : "";
const serverEmbed = new Discord.EmbedBuilder()
.setAuthor({ name: config.server.name ? config.server.name : guild.name, iconURL: icon })
.setDescription(maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**")
.addFields(
- { name: "PLAYERS", value: `${result.players.online}/${result.players.max}` + trueList, inline: false },
- { name: "INFO", value: `${server.type.toUpperCase()} ${version}\n\`${server.ip}\`:\`${server.port}\``, inline: true }
+ { name: "PLAYERS", value: `${response.data.players.online}/${response.data.players.max}` + trueList, inline: false },
+ { name: "INFO", value: `${server.type.toUpperCase()} ${version}\n\`${server.ip}\`${!defPort && server.port === 25565 || !defPort && server.port === 19132 ? "" : `:\`${server.port}\``}`, inline: true }
)
.setColor(config.embeds.color)
.setFooter({ text: 'Updated' })
.setTimestamp();
- msg.edit({ embeds: [serverEmbed] });
+ try { msg.edit({ embeds: [serverEmbed] }); }
+ catch (err) { if (warns) console.log(bot.emotes.warn + warn('Could not edit the statusCH message! Error:\n') + err); }
+
})
.catch((error) => {
const errorEmbed = new Discord.EmbedBuilder()
@@ -221,47 +208,22 @@ module.exports = async (bot) => {
.setColor(config.embeds.error)
.setFooter({ text: 'Updated' })
.setTimestamp();
- msg.edit({ embeds: [errorEmbed] });
+ try { msg.edit({ embeds: [errorEmbed] }); }
+ catch (err) { console.log("Could not edit the statusCH message! Error:\n" + err); }
- if (warns) console.log(`${bot.emotes.warn} ` + warn(`Error when posting status message! Error:\n`) + error);
+ if (warns) console.log(`${bot.emotes.warn} ` + warn(`Something went wrong with sending statusCH message! Error:\n`) + error);
});
} else {
- util.statusBedrock(ip1, port1)
- .then((result) => {
- const versionOriginal = result.version.name;
+ util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`)
+ .then((response) => {
+ const versionOriginal = response.data.version.name_clean;
let versionAdvanced = false;
let maintenceStatus = false,
- lowCaseMotdClean = result.motd.clean.toLocaleLowerCase();
+ lowCaseMotdClean = response.data.motd.clean.toLocaleLowerCase();
if (lowCaseMotdClean.includes("maintenance")) maintenceStatus = true;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
@@ -269,13 +231,14 @@ module.exports = async (bot) => {
.setAuthor({ name: config.server.name ? config.server.name : guild.name, iconURL: icon })
.setDescription(maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**")
.addFields(
- { name: "PLAYERS", value: `${result.players.online}/${result.players.max}`, inline: false },
- { name: "INFO", value: `${server.type.toUpperCase()} ${version}\n\`${server.ip}\`:\`${server.port}\``, inline: true }
+ { name: "PLAYERS", value: `${response.data.players.online}/${response.data.players.max}`, inline: false },
+ { name: "INFO", value: `${server.type.toUpperCase()} ${version}\n\`${server.ip}\`${!defPort && server.port === 25565 || !defPort && server.port === 19132 ? "" : `:\`${server.port}\``}`, inline: true }
)
.setColor(config.embeds.color)
.setFooter({ text: 'Updated' })
.setTimestamp();
- msg.edit({ embeds: [serverEmbed] });
+ try { msg.edit({ embeds: [serverEmbed] }); }
+ catch (err) { if (warns) console.log(bot.emotes.warn + warn('Could not edit the statusCH message! Error:\n') + err); }
})
.catch((error) => {
const errorEmbed = new Discord.EmbedBuilder()
@@ -284,68 +247,44 @@ module.exports = async (bot) => {
.setColor(config.embeds.error)
.setFooter({ text: 'Updated' })
.setTimestamp();
- msg.edit({ embeds: [errorEmbed] });
+ try { msg.edit({ embeds: [errorEmbed] }); }
+ catch (err) { console.log("Could not edit the statusCH message! Error:\n" + err); }
- if (warns) console.log(`${bot.emotes.warn} ` + warn(`Error when posting status message! Error:\n`) + error);
+ if (warns) console.log(`${bot.emotes.warn} ` + warn(`Something went wrong with sending statusCH message! Error:\n`) + error);
});
}
- if (debug) console.log(`${bot.emotes.success} Successfully updated status message in ${gr(channel.name)}!`);
+ if (debug) console.log(`${bot.emotes.debug} Successfully updated status message in ${ma(channel.name)}!`);
if (server.type === 'java') {
setInterval(() =>
- util.status(ip1, port1)
- .then((result) => {
- const versionOriginal = result.version.name;
+ util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`)
+ .then((response) => {
+ const versionOriginal = response.data.version.name_clean;
let versionAdvanced = false;
let maintenceStatus = false,
- lowCaseMotdClean = result.motd.clean.toLocaleLowerCase();
+ lowCaseMotdClean = response.data.motd.clean.toLocaleLowerCase();
if (lowCaseMotdClean.includes("maintenance")) maintenceStatus = true;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
- const trueList = result.players.sample ? "\n\`\`\`" + result.players.sample.map(p => ` ${p.name} `).join('\r\n') + "\`\`\`" : "";
+ const trueList = response.data.players.list ? "\n\`\`\`" + response.data.players.list.map(p => ` ${p.name_clean} `).join('\r\n') + "\`\`\`" : "";
const serverEmbed = new Discord.EmbedBuilder()
.setAuthor({ name: config.server.name ? config.server.name : guild.name, iconURL: icon })
.setDescription(maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**")
.addFields(
- { name: "PLAYERS", value: `${result.players.online}/${result.players.max}` + trueList, inline: false },
- { name: "INFO", value: `${server.type.toUpperCase()} ${version}\n\`${server.ip}\`:\`${server.port}\``, inline: true }
+ { name: "PLAYERS", value: `${response.data.players.online}/${response.data.players.max}` + trueList, inline: false },
+ { name: "INFO", value: `${server.type.toUpperCase()} ${version}\n\`${server.ip}\`${!defPort && server.port === 25565 || !defPort && server.port === 19132 ? "" : `:\`${server.port}\``}`, inline: true }
)
.setColor(config.embeds.color)
.setFooter({ text: 'Updated' })
.setTimestamp();
- msg.edit({ embeds: [serverEmbed] });
+ try { msg.edit({ embeds: [serverEmbed] }); }
+ catch (err) { if (warns) console.log(bot.emotes.warn + warn('Could not edit the statusCH message! Error:\n') + err); }
})
.catch((error) => {
const errorEmbed = new Discord.EmbedBuilder()
@@ -354,48 +293,23 @@ module.exports = async (bot) => {
.setColor(config.embeds.error)
.setFooter({ text: 'Updated' })
.setTimestamp();
- msg.edit({ embeds: [errorEmbed] });
+ try { msg.edit({ embeds: [errorEmbed] }); }
+ catch (err) { if (warns) console.log(bot.emotes.warn + warn('Could not edit the statusCH message! Error:\n') + err); }
- if (warns) console.log(`${bot.emotes.warn} ` + warn(`Error when posting status message! Error:\n`) + error);
+ if (warns) console.log(`${bot.emotes.warn} ` + warn(`Something went wrong with sending statusCH message! Error:\n`) + error);
}), ms(info.time));
} else {
setInterval(() =>
- util.statusBedrock(ip1, port1)
- .then((result) => {
- const versionOriginal = result.version.name;
+ util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`)
+ .then((response) => {
+ const versionOriginal = response.data.version.name_clean;
let versionAdvanced = false;
let maintenceStatus = false,
- lowCaseMotdClean = result.motd.clean.toLocaleLowerCase();
+ lowCaseMotdClean = response.data.motd.clean.toLocaleLowerCase();
if (lowCaseMotdClean.includes("maintenance")) maintenceStatus = true;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
@@ -403,13 +317,14 @@ module.exports = async (bot) => {
.setAuthor({ name: config.server.name ? config.server.name : guild.name, iconURL: icon })
.setDescription(maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**")
.addFields(
- { name: "PLAYERS", value: `${result.players.online}/${result.players.max}`, inline: false },
- { name: "INFO", value: `${server.type.toUpperCase()} ${version}\n\`${server.ip}\`:\`${server.port}\``, inline: true }
+ { name: "PLAYERS", value: `${response.data.players.online}/${response.data.players.max}`, inline: false },
+ { name: "INFO", value: `${server.type.toUpperCase()} ${version}\n\`${server.ip}\`${!defPort && server.port === 25565 || !defPort && server.port === 19132 ? "" : `:\`${server.port}\``}`, inline: true }
)
.setColor(config.embeds.color)
.setFooter({ text: 'Updated' })
.setTimestamp();
- msg.edit({ embeds: [serverEmbed] });
+ try { msg.edit({ embeds: [serverEmbed] }); }
+ catch (err) { console.log("Could not edit the statusCH message! Error:\n" + err); }
})
.catch((error) => {
const errorEmbed = new Discord.EmbedBuilder()
@@ -418,42 +333,49 @@ module.exports = async (bot) => {
.setColor(config.embeds.error)
.setFooter({ text: 'Updated' })
.setTimestamp();
- msg.edit({ embeds: [errorEmbed] });
+ try { msg.edit({ embeds: [errorEmbed] }); }
+ catch (err) { console.log("Could not edit the statusCH message! Error:\n" + err); }
- if (warns) console.log(`${bot.emotes.warn} ` + warn(`Error when posting status message! Error:\n`) + error);
+ if (warns) console.log(`${bot.emotes.warn} ` + warn(`Something went wrong with sending status message! Error:\n`) + error);
}), ms(info.time));
}
}
+ console.log(`${bot.emotes.success} ` + gr(bot.user.username) + " is now working with prefix " + gr(bot.prefix));
+ if (settings.inviteLink) console.log(`${bot.emotes.info} ` + "Invite " + bl(bot.user.username) + " to your Discord server with link:\n " + blu(`https://discord.com/oauth2/authorize?client_id=${bot.user.id}&permissions=274877918272&scope=bot%20applications.commands`));
+
if (bot.readyScan && server.work) {
if (server.type === 'java') {
- util.status(server.ip, server.port)
- .then((result) => {
+ util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`)
+ .then((response) => {
console.log(`${bot.emotes.success} Successfully located ${gr(server.type.toUpperCase())} server ${gr(server.ip)}!\n` + " " + gr('Server info:\n')
- + " " + bold('IP: ') + bl(`${server.ip}:${result.port ? result.port : server.port}\n`)
- + " " + bold('VERSION: ') + bl(`${result.version.name ? result.version.name : 'unknown'}\n`)
- + " " + bold('PLAYERS: ') + bl(`${result.players.online ? result.players.online : '0'}` + '/' + `${result.players.max ? result.players.max : '0'}`)
+ + " " + bold('IP: ') + bl(`${server.ip}:${response.data.port ? response.data.port : server.port}\n`)
+ + " " + bold('VERSION: ') + bl(`${response.data.version.name_clean ? response.data.version.name_clean : 'unknown'}\n`)
+ + " " + bold('PLAYERS: ') + bl(`${response.data.players.online ? response.data.players.online : '0'}` + '/' + `${response.data.players.max ? response.data.players.max : '0'}`)
);
+ console.log(processInfo('>> minecraft-bot working <<'));
})
.catch((error) => {
- console.log(`${bot.emotes.warn} ` + warn(`Could not find ${server.type} server ${server.ip} with port ${server.port}! Error:\n`) + error);
+ if (warns) console.log(`${bot.emotes.warn} ` + warn(`Could not find ${server.type} server ${server.ip} with port ${server.port}! Error:\n`) + error);
+ console.log(processInfo('>> minecraft-bot working <<'));
});
} else if (server.type === 'bedrock') {
- util.statusBedrock(server.ip, server.port)
- .then((result) => {
- console.log(`${bot.emotes.success} Successfully located ${gr(server.type.toUpperCase())} server ${gr(server.ip)}!\n` + " " + gr('Server info:\n')
- + " " + bold('IP: ') + bl(`${server.ip}:${result.port ? result.port : server.port}\n`)
- + " " + bold('VERSION: ') + bl(`${result.version.name ? result.version.name : 'unknown'}\n`)
- + " " + bold('PLAYERS: ') + bl(`${result.players.online ? result.players.online : '0'}` + '/' + `${result.players.max ? result.players.max : '0'}`)
+ util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`)
+ .then((response) => {
+ console.log(`${bot.emotes.success} Successfully located ${gr(server.type.toUpperCase())} server ${gr(server.ip)}!\n` + " " + gr('| Server info:\n')
+ + " " + gr('| ') + bold('IP: ') + bl(`${server.ip}:${response.data.port ? response.data.port : server.port}\n`)
+ + " " + gr('| ') + bold('VERSION: ') + bl(`${response.data.version.name_clean ? response.data.version.name_clean : 'unknown'}\n`)
+ + " " + gr('| ') + bold('PLAYERS: ') + bl(`${response.data.players.online ? response.data.players.online : '0'}` + '/' + `${response.data.players.max ? response.data.players.max : '0'}`)
);
+ console.log(processInfo('>> minecraft-bot working <<'));
})
.catch((error) => {
- console.log(`${bot.emotes.warn} ` + (`Could not find ${server.type} server ${server.ip} with port ${server.port}! Error:\n`) + error);
+ if (warns) console.log(`${bot.emotes.warn} ` + (`Could not find ${server.type} server ${server.ip} with port ${server.port}! Error:\n`) + error);
+ console.log(processInfo('>> minecraft-bot working <<'));
});
}
+ } else {
+ console.log(processInfo('>> minecraft-bot working <<'));
}
-
- console.log(`${bot.emotes.success} ` + gr(bot.user.username) + " is now working with prefix " + gr(bot.prefix));
- if (settings.inviteLink) console.log(`${bot.emotes.info} ` + "Invite " + bl(bot.user.username) + " with " + blu(`https://discord.com/oauth2/authorize?client_id=${bot.user.id}&permissions=274877918272&scope=bot%20applications.commands`));
};
\ No newline at end of file
diff --git a/functions.js b/functions.js
new file mode 100644
index 0000000..4786d14
--- /dev/null
+++ b/functions.js
@@ -0,0 +1,16 @@
+module.exports = {
+ removeVersion(string) {
+ const serverVersions = [
+ "airplane", "akarin", "bukkit", "bungeecord", "cardboard",
+ "cleanstone", "craftbukkit", "cuberite", "cuberite", "empirecraft", "fabric",
+ "flexpipe", "forge", "geyser", "glowstone", "hexacord", "kettle", "lava",
+ "lavabukkit", "leafish", "magma", "mohist", "nukkit", "paper", "purpur",
+ "sonarlint", "spigot", "tacospigot", "travertine", "velocity", "velocity",
+ "waterfall", "yatopia"
+ ];
+ serverVersions.forEach(function (el) {
+ string = string.toLocaleLowerCase().replaceAll(`${el} `, "");
+ });
+ return string;
+ }
+};
\ No newline at end of file
diff --git a/index.js b/index.js
index eadd3eb..b75d800 100644
--- a/index.js
+++ b/index.js
@@ -1,18 +1,17 @@
const Discord = require('discord.js'),
fs = require('fs'),
c = require('chalk'),
+ processInfo = c.cyan.bgBlack,
ms = require('ms'),
+ util = require('axios'),
{ REST } = require('@discordjs/rest'),
{ Routes } = require('discord-api-types/v9');
-//Discord client - I like "bot" more, then "client"
-const bot = new Discord.Client({ intents: 34321 });
-//https://discord-intents-calculator.vercel.app/
-
let dev;
try { if (fs.existsSync('./dev-config.js')) { dev = true; } }
-catch (err) { console.error(err); }
+catch (err) { console.log(err); }
const config = require(dev ? './dev-config' : './config'),
+ dataJSON = require(dev ? './dev-data' : './data'),
{ commands } = config,
activites = ['PLAYING', 'WATCHING', 'COMPETING', 'LISTENING'], //Supported activites, discord.js supports more (but I don't care)
statuses = ['online', 'idle', 'dnd', 'invisible'], //Supported statuses
@@ -20,14 +19,20 @@ const config = require(dev ? './dev-config' : './config'),
kill = '\nKilling process...',
warn = c.keyword('yellow').bold,
warns = config.settings.warns,
- server = Array;
+ server = Array,
+ intents = config.commands.enableNormals ? 38401 : 5633;
+
+//Discord client - I like "bot" more, then "client"
+const bot = new Discord.Client({ intents: intents }); //OLD: 34321
+//https://discord-intents-calculator.vercel.app/
let info = config.statusCH;
bot.commands = new Discord.Collection();
bot.aliases = new Discord.Collection();
bot.slashes = new Discord.Collection();
-bot.token = config.bot.token;
+bot.dev = dev;
+bot.token = dataJSON["token"];
bot.prefix = config.bot.prefix;
bot.status = config.bot.status;
bot.pres = config.bot.presence;
@@ -49,22 +54,24 @@ if (!emojis.warn) emojis.warn = '💛';
if (!emojis.error) emojis.error = '🛑';
bot.emotes = emojis;
+console.log(processInfo('>> minecraft-bot started <<'));
+
if (bot.token === '') { //Checks if you have entered bot token to config
- console.log(`${bot.emotes.error} ` + error('Bot token in config is empty!') + kill);
+ console.log(`${bot.emotes.error} ` + error('Bot token in data.json is empty!') + kill);
return process.exit(1);
} else if (bot.prefix === '') { //Checks if you have entered bot prefix to config
- console.log(`${bot.emotes.error} ` + error('Bot prefix in config is empty!') + kill);
+ console.log(`${bot.emotes.error} ` + error('Bot prefix in config.js is empty!') + kill);
return process.exit(1);
};
if (bot.pres === '') { //Checks if you have entered custom presence text message for bot to config
- if (warns) console.log(`${bot.emotes.warn} ` + warn('Bot status in config was empty! Bot presence was disabled.'));
+ if (warns) console.log(`${bot.emotes.warn} ` + warn('Bot status in config.js was empty! Bot presence was disabled.'));
bot.pres = false;
}
if (!bot.activity) { //Checks if you have entered status activity type to config
if (bot.pres) {
- if (warns) console.log(`${bot.emotes.warn} ` + warn('Bot activity type in config was empty! Activity type is now "playing"'));
+ if (warns) console.log(`${bot.emotes.warn} ` + warn('Bot activity type in config.js was empty! Activity type is now "playing"'));
bot.activity = 'PLAYING';
};
};
@@ -78,7 +85,7 @@ if (!new Set(activites).has(bot.activity.toUpperCase())) { //Checks if you have
if (!bot.status) { //Checks if you have entered status activity type to config
if (bot.pres) {
- if (warns) console.log(`${bot.emotes.warn} ` + warn('Bot status type in config was empty! Bot presence is now set to "online"'));
+ if (warns) console.log(`${bot.emotes.warn} ` + warn('Bot status type in config.js was empty! Bot presence is now set to "online"'));
bot.status = 'ONLINE';
};
};
@@ -103,7 +110,7 @@ if (!server.ip) {
}
if (server.type !== 'java' && server.type !== 'bedrock') {
- if (bot.server) {
+ if (bot.server.work) {
if (!server.type) {
if (warns) console.log(`${bot.emotes.warn} ` + warn(`You did not specify server's edition, setting it to java.`));
server.type = 'java';
@@ -115,12 +122,12 @@ if (server.type !== 'java' && server.type !== 'bedrock') {
}
if (!server.port) {
- if (bot.server) {
+ if (bot.server.work) {
if (warns) console.log(`${bot.emotes.warn} ` + warn(`You did not specify server port, setting it to default one.`));
- if (server.type === 'bedrock') {
- server.port = 19132;
- } else {
+ if (server.type === 'java') {
server.port = 25565;
+ } else {
+ server.port = 19132;
}
}
}
@@ -208,18 +215,27 @@ if (!iconLINK) {
server.icon = false;
} else if (!iconLINK.includes("png" || "jpg" || "webp" || "gif")) {
if (warns) console.log(`${bot.emotes.warn} ` + warn("Unknown server icon file format. Setting it to undefined."));
- server.icon = "https://media.minecraftforum.net/attachments/300/619/636977108000120237.png";
+ server.icon = false;
} else if (!iconLINK.includes("https://" || "http://")) {
if (warns) console.log(`${bot.emotes.warn} ` + warn("Server icon link did contain https or http. Setting it to undefined."));
- server.icon = "https://media.minecraftforum.net/attachments/300/619/636977108000120237.png";
+ server.icon = false;
} else {
server.icon = iconLINK;
}
+if (!server.icon) {
+ if (server.type === "java" && bot.server.work) {
+ server.icon = `https://api.mcstatus.io/v2/icon/${server.ip}:${server.port}`;
+ } else {
+ server.icon = "https://media.minecraftforum.net/attachments/300/619/636977108000120237.png";
+ }
+}
+
bot.settings = config.settings;
-bot.settings.split = bot.settings.readyScan;
+bot.settings.removeServerType = bot.settings.readyScan;
bot.server = server;
bot.config = config;
+bot.dataJSON = dataJSON;
bot.info = info;
//Event handler
@@ -235,7 +251,7 @@ const commandsFolder = fs.readdirSync('./commands').filter(file => file.endsWith
for (const file of commandsFolder) {
const commandFile = require(`./commands/${file}`);
const command = file.split(".")[0];
- if (!!commands[command] && !!commands[command].enableNormal || !!commandFile.config.enable) {
+ if (!commands[command] || !!commands[command] && !!commands[command].enableNormal || !!commandFile.config.enable) {
bot.commands.set(command, commandFile);
commandFile.config.aliases.forEach(alias => {
bot.aliases.set(alias, command);
@@ -250,7 +266,7 @@ if (commands.enableSlashes) {
for (const file of slashCommandsFolder) {
const commandFile = require(`./slashes/${file}`);
const slashCommand = file.split(".")[0];
- if (!!commands[slashCommand] && !!commands[slashCommand].enableSlash) {
+ if (!commands[slashCommand] || !!commands[slashCommand] && !!commands[slashCommand].enableSlash) {
bot.slashes.set(slashCommand, commandFile);
slashCommands.push(commandFile.data.toJSON());
}
diff --git a/package.json b/package.json
index f0269d8..d49ed75 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
{
"name": "minecraft-bot",
- "version": "1.6.8",
+ "version": "1.7.0",
"description": "Discord Minecraft bot, with which you can check your Minecraft server status (player list, version, online state, etc.)",
"main": "index.js",
"scripts": {
"first": "npm i & node index.js",
"test": "npm i & node index.js",
- "start": "node index.js"
+ "start": "node --no-warnings index.js"
},
"repository": {
"type": "git",
@@ -22,25 +22,22 @@
"bot"
],
"author": "PetyXbron",
- "license": "MIT",
+ "license": "GPL-3.0-only",
"bugs": {
"url": "https://github.com/PetyXbron/minecraft-bot/issues"
},
"homepage": "https://github.com/PetyXbron/minecraft-bot",
"engines": {
- "node": "18.8.0",
- "npm": "8.18.0"
+ "node": ">=16.9.0"
},
"dependencies": {
- "@discordjs/rest": "^1.2.0",
- "axios": "^0.27.2",
+ "@discordjs/rest": "^1.7.0",
+ "axios": "^1.3.5",
"chalk": "4.1.2",
- "discord-api-types": "^0.37.10",
- "discord.js": "^14.5.0",
+ "discord-api-types": "^0.37.37",
+ "discord.js": "^14.9.0",
"fs": "^0.0.1-security",
- "minecraft-motd-util": "^1.1.12",
- "minecraft-server-util": "^5.3.1",
- "ms": "^2.1.3",
- "quick.db": "7.1.3"
- }
+ "ms": "^2.1.3"
+ },
+ "install-cmd": "npm i @discordjs/rest@1.7.0 axios@1.3.5 chalk@4.1.2 discord-api-types@0.37.37 discord.js@14.9.0 fs ms@2.1.3"
}
diff --git a/slashes/help.js b/slashes/help.js
index aeea82a..bd58b17 100644
--- a/slashes/help.js
+++ b/slashes/help.js
@@ -1,122 +1,122 @@
-const { SlashCommandBuilder } = require('@discordjs/builders'),
- { EmbedBuilder } = require('discord.js'),
- fs = require('fs'),
- { commands } = require(fs.existsSync(__dirname + '/../dev-config.js') ? '../dev-config' : '../config');
+ const { SlashCommandBuilder } = require('@discordjs/builders'),
+ { EmbedBuilder } = require('discord.js'),
+ fs = require('fs'),
+ { commands } = require(fs.existsSync(__dirname + '/../dev-config.js') ? '../dev-config' : '../config');
-module.exports = {
- data: new SlashCommandBuilder()
- .setName('help') //Name of command - RENAME THE FILE TOO!!!
- .setDescription(`Sends the command list menu`) //Description of command - you can change it :)
- .addStringOption(option =>
- option.setName('command')
- .setDescription('Command name')
- .setRequired(false))
-};
+ module.exports = {
+ data: new SlashCommandBuilder()
+ .setName('help') //Name of command - RENAME THE FILE TOO!!!
+ .setDescription(`Sends the command list menu`) //Description of command - you can change it :)
+ .addStringOption(option =>
+ option.setName('command')
+ .setDescription('Command name')
+ .setRequired(false))
+ };
-module.exports.run = async (bot, interaction) => {
- let { server, config } = bot,
- text = commands.help.text,
- icon = server.icon ? server.icon : message.guild.iconURL();
+ module.exports.run = async (bot, interaction) => {
+ let { server, config } = bot,
+ text = commands.help.text,
+ icon = server.icon ? server.icon : message.guild.iconURL();
- let args = new Array();
- if (interaction.options.getString('command')) args = [interaction.options.getString('command')];
- if (!args[0]) {
- let commandz = [],
- lines = [];
+ let args = new Array();
+ if (interaction.options.getString('command')) args = [interaction.options.getString('command')];
+ if (!args[0]) {
+ let commandz = [],
+ lines = [];
- commandz = fs.readdirSync(`./commands`).filter(file => file.endsWith('.js'));
+ commandz = fs.readdirSync(`./commands`).filter(file => file.endsWith('.js'));
- if (commandz.length > 0) {
- for (const commandFile of commandz) {
- const command = !!commands[commandFile.split(".js")[0]].enableNormal ? bot.commands.get(commandFile.split(".js")[0]) : false;
- if (command) {
- command.config.description = command.config.description ? command.config.description : false;
- lines.push(`> \`${bot.prefix}${command.config.name ? command.config.name : commandFile.split(".js")[0]}\`` + (command.config.description ? ` - ${command.config.description}` : ""));
+ if (commandz.length > 0) {
+ for (const commandFile of commandz) {
+ const command = !!commands[commandFile.split(".js")[0]].enableNormal ? bot.commands.get(commandFile.split(".js")[0]) : false;
+ if (command) {
+ command.config.description = command.config.description ? command.config.description : false;
+ lines.push(`> \`${bot.prefix}${command.config.name ? command.config.name : commandFile.split(".js")[0]}\`` + (command.config.description ? ` - ${command.config.description}` : ""));
+ }
}
}
- }
- if (!text.title || !text.description) {
- const helpEmbed = new EmbedBuilder()
- .setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
- .setTitle(config.server.name ? config.server.name : interaction.guild.name + " bot commands:")
- .setDescription(`> **Prefix:** \`${bot.prefix}\`\n\n> **Commands:**\n` + lines.join("\n"))
- .setColor(config.embeds.color);
- interaction.reply({ embeds: [helpEmbed] });
- } else {
- text.title = text.title.replaceAll('{serverIp}', server.ip);
- text.title = text.title.replaceAll('{serverPort}', server.port);
- text.title = text.title.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
- text.title = text.title.replaceAll('{voteLink}', config.server.vote);
- text.title = text.title.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.title = text.title.replaceAll('{prefix}', config.bot.prefix);
- text.title = text.title.replaceAll('{commands}', "\n" + lines.join("\n"));
+ if (!text.title || !text.description) {
+ const helpEmbed = new EmbedBuilder()
+ .setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
+ .setTitle(config.server.name ? config.server.name : interaction.guild.name + " bot commands:")
+ .setDescription(`> **Prefix:** \`${bot.prefix}\`\n\n> **Commands:**\n` + lines.join("\n"))
+ .setColor(config.embeds.color);
+ interaction.reply({ embeds: [helpEmbed] });
+ } else {
+ text.title = text.title.replaceAll('{serverIp}', server.ip);
+ text.title = text.title.replaceAll('{serverPort}', server.port);
+ text.title = text.title.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
+ text.title = text.title.replaceAll('{voteLink}', config.server.vote);
+ text.title = text.title.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
+ text.title = text.title.replaceAll('{prefix}', config.bot.prefix);
+ text.title = text.title.replaceAll('{commands}', "\n" + lines.join("\n"));
- text.description = text.description.replaceAll('{serverIp}', server.ip);
- text.description = text.description.replaceAll('{serverPort}', server.port);
- text.description = text.description.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
- text.description = text.description.replaceAll('{voteLink}', config.server.vote);
- text.description = text.description.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.description = text.description.replaceAll('{prefix}', config.bot.prefix);
- text.description = text.description.replaceAll('{commands}', "\n" + lines.join("\n"));
+ text.description = text.description.replaceAll('{serverIp}', server.ip);
+ text.description = text.description.replaceAll('{serverPort}', server.port);
+ text.description = text.description.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
+ text.description = text.description.replaceAll('{voteLink}', config.server.vote);
+ text.description = text.description.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
+ text.description = text.description.replaceAll('{prefix}', config.bot.prefix);
+ text.description = text.description.replaceAll('{commands}', "\n" + lines.join("\n"));
- const helpEmbed = new EmbedBuilder()
- .setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
- .setTitle(text.title)
- .setDescription(text.description)
- .setColor(config.embeds.color);
- interaction.reply({ embeds: [helpEmbed] });
+ const helpEmbed = new EmbedBuilder()
+ .setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
+ .setTitle(text.title)
+ .setDescription(text.description)
+ .setColor(config.embeds.color);
+ interaction.reply({ embeds: [helpEmbed] });
+ }
+ return;
}
- return;
- }
- if (bot.commands.has(args[0].toLocaleLowerCase()) || bot.aliases.has(args[0].toLocaleLowerCase())) {
- commandName = bot.commands.has(args[0].toLocaleLowerCase()) ? args[0].toLocaleLowerCase() : bot.aliases.get(args[0].toLocaleLowerCase());
+ if (bot.commands.has(args[0].toLocaleLowerCase()) || bot.aliases.has(args[0].toLocaleLowerCase())) {
+ commandName = bot.commands.has(args[0].toLocaleLowerCase()) ? args[0].toLocaleLowerCase() : bot.aliases.get(args[0].toLocaleLowerCase());
- let command = bot.commands.get(commandName);
+ let command = bot.commands.get(commandName);
- const helpEmbed = new EmbedBuilder()
- .setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
- .setTitle(`${commandName.charAt(0).toUpperCase() + commandName.slice(1)} Command:`)
- .setDescription(`
- > **Description:** ${!!command.config.description ? command.config.description : "Without description"}
- > **Aliases:** ${!!command.config.aliases ? "`" + bot.prefix + command.config.aliases.join(`\`, \`${bot.prefix}`) + "`" : "No aliases"}
- `)
- .setColor(config.embeds.color);
- return interaction.reply({ embeds: [helpEmbed] });
- } else {
- if (!text.errorTitle || !text.errorDescription) {
- const errorEmbed = new EmbedBuilder()
+ const helpEmbed = new EmbedBuilder()
.setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
- .setTitle(`Error! Command "${args[0]}" doesn't exist.`)
- .setDescription(`Command \`${args[0]}\` was not found.\nYou are entering the wrong alias or the command is disabled.`)
- .setColor(config.embeds.error);
- return interaction.reply({ embeds: [errorEmbed], ephemeral: true });
+ .setTitle(`${commandName.charAt(0).toUpperCase() + commandName.slice(1)} Command:`)
+ .setDescription(`
+ > **Description:** ${!!command.config.description ? command.config.description : "Without description"}
+ > **Aliases:** ${!!command.config.aliases ? "`" + bot.prefix + command.config.aliases.join(`\`, \`${bot.prefix}`) + "`" : "No aliases"}
+ `)
+ .setColor(config.embeds.color);
+ return interaction.reply({ embeds: [helpEmbed] });
} else {
- text.errorTitle = text.errorTitle.replaceAll('{serverIp}', server.ip);
- text.errorTitle = text.errorTitle.replaceAll('{serverPort}', server.port);
- text.errorTitle = text.errorTitle.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
- text.errorTitle = text.errorTitle.replaceAll('{voteLink}', config.server.vote);
- text.errorTitle = text.errorTitle.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.errorTitle = text.errorTitle.replaceAll('{prefix}', config.bot.prefix);
- text.errorTitle = text.errorTitle.replaceAll('{commands}', "\n" + lines.join("\n"));
- text.errorTitle = text.errorTitle.replaceAll('{arg0}', args[0]);
+ if (!text.errorTitle || !text.errorDescription) {
+ const errorEmbed = new EmbedBuilder()
+ .setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
+ .setTitle(`Error! Command "${args[0]}" doesn't exist.`)
+ .setDescription(`Command \`${args[0]}\` was not found.\nYou are entering the wrong alias or the command is disabled.`)
+ .setColor(config.embeds.error);
+ return interaction.reply({ embeds: [errorEmbed], ephemeral: true });
+ } else {
+ text.errorTitle = text.errorTitle.replaceAll('{serverIp}', server.ip);
+ text.errorTitle = text.errorTitle.replaceAll('{serverPort}', server.port);
+ text.errorTitle = text.errorTitle.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
+ text.errorTitle = text.errorTitle.replaceAll('{voteLink}', config.server.vote);
+ text.errorTitle = text.errorTitle.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
+ text.errorTitle = text.errorTitle.replaceAll('{prefix}', config.bot.prefix);
+ text.errorTitle = text.errorTitle.replaceAll('{commands}', "\n" + lines.join("\n"));
+ text.errorTitle = text.errorTitle.replaceAll('{arg0}', args[0]);
- text.errorDescription = text.errorDescription.replaceAll('{serverIp}', server.ip);
- text.errorDescription = text.errorDescription.replaceAll('{serverPort}', server.port);
- text.errorDescription = text.errorDescription.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
- text.errorDescription = text.errorDescription.replaceAll('{voteLink}', config.server.vote);
- text.errorDescription = text.errorDescription.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.errorDescription = text.errorDescription.replaceAll('{prefix}', config.bot.prefix);
- text.errorDescription = text.errorDescription.replaceAll('{commands}', "\n" + lines.join("\n"));
- text.errorDescription = text.errorDescription.replaceAll('{arg0}', args[0]);
+ text.errorDescription = text.errorDescription.replaceAll('{serverIp}', server.ip);
+ text.errorDescription = text.errorDescription.replaceAll('{serverPort}', server.port);
+ text.errorDescription = text.errorDescription.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
+ text.errorDescription = text.errorDescription.replaceAll('{voteLink}', config.server.vote);
+ text.errorDescription = text.errorDescription.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
+ text.errorDescription = text.errorDescription.replaceAll('{prefix}', config.bot.prefix);
+ text.errorDescription = text.errorDescription.replaceAll('{commands}', "\n" + lines.join("\n"));
+ text.errorDescription = text.errorDescription.replaceAll('{arg0}', args[0]);
- const errorEmbed = new EmbedBuilder()
- .setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
- .setTitle(text.errorTitle)
- .setDescription(text.errorDescription)
- .setColor(config.embeds.error);
- return interaction.reply({ embeds: [errorEmbed], ephemeral: true });
+ const errorEmbed = new EmbedBuilder()
+ .setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
+ .setTitle(text.errorTitle)
+ .setDescription(text.errorDescription)
+ .setColor(config.embeds.error);
+ return interaction.reply({ embeds: [errorEmbed], ephemeral: true });
+ }
}
- }
-};
\ No newline at end of file
+ };
\ No newline at end of file
diff --git a/slashes/ip.js b/slashes/ip.js
index a212c07..4fa83ec 100644
--- a/slashes/ip.js
+++ b/slashes/ip.js
@@ -12,7 +12,7 @@ module.exports = {
module.exports.run = async (bot, interaction) => {
let { server, config } = bot,
text = commands.ip.text,
- icon = server.icon ? server.icon : message.guild.iconURL();
+ icon = server.icon ? server.icon : interaction.guild.iconURL();
if (text.title === "" || text.description === "") {
const ipEmbed = new Discord.EmbedBuilder()
diff --git a/slashes/list.js b/slashes/list.js
index a4f253f..d62ab60 100644
--- a/slashes/list.js
+++ b/slashes/list.js
@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('@discordjs/builders'),
- util = require('minecraft-server-util'),
+ util = require('axios'),
Discord = require('discord.js'),
c = require('chalk'),
fs = require('fs'),
@@ -19,21 +19,18 @@ module.exports.run = async (bot, interaction) => {
if (!server.work) return;
- let
- ip1 = server.ip,
- port1 = server.port,
- icon = server.icon ? server.icon : interaction.guild.iconURL();
+ let icon = server.icon ? server.icon : interaction.guild.iconURL();
if (server.type === 'java') {
- util.status(ip1, port1)
- .then((result) => {
+ util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`)
+ .then((response) => {
if (text.title === "" || text.description === "" || text.listFormat === "") {
- const trueList = result.players.sample ? "\n\`\`\`" + result.players.sample.map(p => ` ${p.name} `).join('\r\n') + "\`\`\`" : "";
+ const trueList = response.data.players.list ? "\n\`\`\`" + response.data.players.list.map(p => ` ${p.name_clean} `).join('\r\n') + "\`\`\`" : "";
const serverEmbed = new Discord.EmbedBuilder()
.setAuthor({ name: config.server.name ? config.server.name : interaction.guild.name, iconURL: icon })
.setTitle("Online player list:")
- .setDescription(`**${result.players.online}**/**${result.players.max}**` + trueList)
+ .setDescription(`**${response.data.players.online}**/**${response.data.players.max}**` + trueList)
.setColor(config.embeds.color);
interaction.reply({ embeds: [serverEmbed] });
} else {
@@ -42,19 +39,19 @@ module.exports.run = async (bot, interaction) => {
text.title = text.title.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
text.title = text.title.replaceAll('{voteLink}', config.server.vote);
text.title = text.title.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.title = text.title.replaceAll('{playersOnline}', result.players.online);
- text.title = text.title.replaceAll('{playersMax}', result.players.max);
+ text.title = text.title.replaceAll('{playersOnline}', response.data.players.online);
+ text.title = text.title.replaceAll('{playersMax}', response.data.players.max);
text.description = text.description.replaceAll('{serverIp}', server.ip);
text.description = text.description.replaceAll('{serverPort}', server.port);
text.description = text.description.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
text.description = text.description.replaceAll('{voteLink}', config.server.vote);
text.description = text.description.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.description = text.description.replaceAll('{playersOnline}', result.players.online);
- text.description = text.description.replaceAll('{playersMax}', result.players.max);
+ text.description = text.description.replaceAll('{playersOnline}', response.data.players.online);
+ text.description = text.description.replaceAll('{playersMax}', response.data.players.max);
- if (result.players.sample) {
- var trueList = text.listFormat.replaceAll('{playersList}', result.players.sample.map(p => ` ${p.name} `).join('\r\n'));
+ if (response.data.players.list) {
+ var trueList = text.listFormat.replaceAll('{playersList}', response.data.players.list.map(p => ` ${p.name_clean} `).join('\r\n'));
}
const serverEmbed = new Discord.EmbedBuilder()
diff --git a/slashes/status.js b/slashes/status.js
index 9cbc85d..648dfa6 100644
--- a/slashes/status.js
+++ b/slashes/status.js
@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('@discordjs/builders'),
- util = require('minecraft-server-util'),
+ util = require('axios'),
Discord = require('discord.js'),
c = require('chalk'),
fs = require('fs'),
@@ -16,52 +16,24 @@ module.exports.run = async (bot, interaction) => {
text = commands.status.text,
settings = config.settings,
warn = c.keyword('yellow').bold,
- warns = config.settings.warns;
+ warns = config.settings.warns,
+ { removeVersion } = require('../functions');
if (!server.work) return;
- let
- ip1 = server.ip,
- port1 = server.port,
- icon = server.icon ? server.icon : interaction.guild.iconURL();
+ let icon = server.icon ? server.icon : interaction.guild.iconURL();
if (server.type === 'java') {
- util.status(ip1, port1)
- .then((result) => {
- const versionOriginal = result.version.name;
+ util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`)
+ .then((response) => {
+ const versionOriginal = response.data.version.name_clean;
let versionAdvanced = false;
let maintenceStatus = false,
- lowCaseMotdClean = result.motd.clean.toLocaleLowerCase();
+ lowCaseMotdClean = response.data.motd.clean.toLocaleLowerCase();
if (lowCaseMotdClean.includes("maintenance")) maintenceStatus = true;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
@@ -72,7 +44,7 @@ module.exports.run = async (bot, interaction) => {
.setDescription(`${maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**"}
**Description**
- ${result.motd.clean}
+ ${response.data.motd.clean}
**IP Address**
\`${server.ip}\`:\`${server.port}\`
@@ -81,7 +53,7 @@ module.exports.run = async (bot, interaction) => {
${config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1)} ${version}
**Players**
- **${result.players.online}**/**${result.players.max}**`)
+ **${response.data.players.online}**/**${response.data.players.max}**`)
.setColor(config.embeds.color);
interaction.reply({ embeds: [serverEmbed] });
} else {
@@ -90,9 +62,9 @@ module.exports.run = async (bot, interaction) => {
text.title = text.title.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
text.title = text.title.replaceAll('{voteLink}', config.server.vote);
text.title = text.title.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.title = text.title.replaceAll('{playersOnline}', result.players.online);
- text.title = text.title.replaceAll('{playersMax}', result.players.max);
- text.title = text.title.replaceAll('{motd}', result.motd.clean);
+ text.title = text.title.replaceAll('{playersOnline}', response.data.players.online);
+ text.title = text.title.replaceAll('{playersMax}', response.data.players.max);
+ text.title = text.title.replaceAll('{motd}', response.data.motd.clean);
text.title = text.title.replaceAll('{serverVersion}', version);
text.title = text.title.replaceAll('{status}', maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**");
@@ -101,9 +73,9 @@ module.exports.run = async (bot, interaction) => {
text.description = text.description.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
text.description = text.description.replaceAll('{voteLink}', config.server.vote);
text.description = text.description.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.description = text.description.replaceAll('{playersOnline}', result.players.online);
- text.description = text.description.replaceAll('{playersMax}', result.players.max);
- text.description = text.description.replaceAll('{motd}', result.motd.clean);
+ text.description = text.description.replaceAll('{playersOnline}', response.data.players.online);
+ text.description = text.description.replaceAll('{playersMax}', response.data.players.max);
+ text.description = text.description.replaceAll('{motd}', response.data.motd.clean);
text.description = text.description.replaceAll('{serverVersion}', version);
text.description = text.description.replaceAll('{status}', maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**");
@@ -126,42 +98,16 @@ module.exports.run = async (bot, interaction) => {
if (warns) console.log(`${bot.emotes.warn} ` + warn(`Error when using command ${module.exports.data.name}! Error:\n`) + error);
});
} else {
- util.statusBedrock(ip1, port1)
- .then((result) => {
- const versionOriginal = result.version.name;
+ util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`)
+ .then((response) => {
+ const versionOriginal = response.data.version.name_clean;
let versionAdvanced = false;
let maintenceStatus = false,
- lowCaseMotdClean = result.motd.clean.toLocaleLowerCase();
+ lowCaseMotdClean = response.data.motd.clean.toLocaleLowerCase();
if (lowCaseMotdClean.includes("maintenance")) maintenceStatus = true;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
@@ -172,7 +118,7 @@ module.exports.run = async (bot, interaction) => {
.setDescription(`${maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**"}
**Description**
- ${result.motd.clean}
+ ${response.data.motd.clean}
**IP Address**
\`${server.ip}\`:\`${server.port}\`
@@ -181,7 +127,7 @@ module.exports.run = async (bot, interaction) => {
${config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1)} ${version}
**Players**
- **${result.players.online}**/**${result.players.max}**`)
+ **${response.data.players.online}**/**${response.data.players.max}**`)
.setColor(config.embeds.color);
interaction.reply({ embeds: [serverEmbed] });
} else {
@@ -190,9 +136,9 @@ module.exports.run = async (bot, interaction) => {
text.title = text.title.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
text.title = text.title.replaceAll('{voteLink}', config.server.vote);
text.title = text.title.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.title = text.title.replaceAll('{playersOnline}', result.players.online);
- text.title = text.title.replaceAll('{playersMax}', result.players.max);
- text.title = text.title.replaceAll('{motd}', result.motd.clean);
+ text.title = text.title.replaceAll('{playersOnline}', response.data.players.online);
+ text.title = text.title.replaceAll('{playersMax}', response.data.players.max);
+ text.title = text.title.replaceAll('{motd}', response.data.motd.clean);
text.title = text.title.replaceAll('{serverVersion}', version);
text.title = text.title.replaceAll('{status}', maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**");
@@ -201,9 +147,9 @@ module.exports.run = async (bot, interaction) => {
text.description = text.description.replaceAll('{serverName}', config.server.name ? config.server.name : interaction.guild.name);
text.description = text.description.replaceAll('{voteLink}', config.server.vote);
text.description = text.description.replaceAll('{serverType}', config.server.type.charAt(0).toUpperCase() + config.server.type.slice(1));
- text.description = text.description.replaceAll('{playersOnline}', result.players.online);
- text.description = text.description.replaceAll('{playersMax}', result.players.max);
- text.description = text.description.replaceAll('{motd}', result.motd.clean);
+ text.description = text.description.replaceAll('{playersOnline}', response.data.players.online);
+ text.description = text.description.replaceAll('{playersMax}', response.data.players.max);
+ text.description = text.description.replaceAll('{motd}', response.data.motd.clean);
text.description = text.description.replaceAll('{serverVersion}', version);
text.description = text.description.replaceAll('{status}', maintenceStatus ? ":construction_worker: **MAINTENANCE**" : ":white_check_mark: **ONLINE**");
diff --git a/slashes/version.js b/slashes/version.js
index 0b29146..66bd584 100644
--- a/slashes/version.js
+++ b/slashes/version.js
@@ -1,6 +1,6 @@
const { SlashCommandBuilder } = require('@discordjs/builders'),
Discord = require('discord.js'),
- util = require('minecraft-server-util'),
+ util = require('axios'),
warn = require('chalk').keyword('yellow').bold,
fs = require('fs'),
{ commands } = require(fs.existsSync(__dirname + '/../dev-config.js') ? '../dev-config' : '../config');
@@ -14,16 +14,17 @@ module.exports = {
module.exports.run = async (bot, interaction) => {
let { server, config } = bot,
text = commands.version.text,
- icon = server.icon ? server.icon : message.guild.iconURL();
- const warns = config.settings.warns;
- const settings = config.settings
- ;
+ icon = server.icon ? server.icon : message.guild.iconURL(),
+ warns = config.settings.warns,
+ settings = config.settings,
+ { removeVersion } = require('../functions');
+
if (!server.work) return;
if (server.type === 'java') {
try {
- const result = await util.status(server.ip, server.port);
- var versionOriginal = result.version.name;
+ const response = await util.get(`https://api.mcstatus.io/v2/status/java/${server.ip}:${server.port}`);
+ var versionOriginal = response.data.version.name_clean;
} catch (e) {
if (warns) console.log(`${bot.emotes.warn} ` + warn(`Couldn't get version from server! Getting it from config..`));
var versionOriginal = config.server.version;
@@ -31,7 +32,7 @@ module.exports.run = async (bot, interaction) => {
let versionAdvanced = false;
- if (settings.split) {
+ if (settings.removeServerType) {
versionAdvanced = versionOriginal.toLocaleLowerCase()
.replace("bukkit ", "")
.replace("craftbukkit ", "")
@@ -92,8 +93,8 @@ module.exports.run = async (bot, interaction) => {
}
} else {
try {
- const result = await util.statusBedrock(server.ip, server.port);
- var versionOriginal = result.version.name;
+ const response = await util.get(`https://api.mcstatus.io/v2/status/bedrock/${server.ip}:${server.port}`);
+ var versionOriginal = response.data.version.name_clean;
} catch (e) {
if (warns) console.log(`${bot.emotes.warn} ` + warn(`Couldn't get version from server! Getting it from config..`));
var versionOriginal = config.server.version;
@@ -101,33 +102,7 @@ module.exports.run = async (bot, interaction) => {
let versionAdvanced = false;
- if (settings.split) {
- versionAdvanced = versionOriginal.toLocaleLowerCase()
- .replace("bukkit ", "")
- .replace("craftbukkit ", "")
- .replace("spigot ", "")
- .replace("forge ", "")
- .replace("fabric ", "")
- .replace("paper ", "")
- .replace("purpur ", "")
- .replace("tacospigot ", "")
- .replace("glowstone ", "")
- .replace("bungecord ", "")
- .replace("waterfall ", "")
- .replace("flexpipe ", "")
- .replace("hexacord ", "")
- .replace("velocity ", "")
- .replace("airplane ", "")
- .replace("sonarlint ", "")
- .replace("geyser ", "")
- .replace("cuberite ", "")
- .replace("yatopia ", "")
- .replace("mohist ", "")
- .replace("leafish ", "")
- .replace("cardboard ", "")
- .replace("magma ", "")
- .replace("empirecraft ", "");
- }
+ if (settings.removeServerType) versionAdvanced = removeVersion(versionOriginal);
const version = versionAdvanced ? versionAdvanced.charAt(0).toUpperCase() + versionAdvanced.slice(1) : versionOriginal;
diff --git a/templates/command.js b/templates/command.js
index 33698a7..6a81908 100644
--- a/templates/command.js
+++ b/templates/command.js
@@ -1,4 +1,4 @@
-const util = require('minecraft-server-util'),
+const util = require('axios'),
Discord = require('discord.js'),
c = require('chalk'),
fs = require('fs'),