diff --git a/LICENSE b/LICENSE
index d97a1fb..0ad25db 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,21 +1,661 @@
-MIT License
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
-Copyright (c) 2019 Big Bot Network
+ 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.
-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:
+ Preamble
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server 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.
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are 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.
+
+ 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.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ 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 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 work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero 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 Affero 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 Affero 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 Affero 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.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ 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 AGPL, see
+.
diff --git a/pom.xml b/pom.xml
index 450bede..c4f89c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
Hadder
Hadder
- 0.10-ALPHA
+ 0.1-BETA
Hadder
@@ -19,7 +19,7 @@
net.dv8tion
JDA
- 4.0.0_79
+ 4.1.0_87
org.json
diff --git a/src/main/java/com/bbn/hadder/Hadder.java b/src/main/java/com/bbn/hadder/Hadder.java
index f96792f..6be5938 100644
--- a/src/main/java/com/bbn/hadder/Hadder.java
+++ b/src/main/java/com/bbn/hadder/Hadder.java
@@ -57,6 +57,7 @@ public class Hadder {
new RebootCommand(),
new EqualsCommand(),
new InviteCommand(),
+ new ScreenShareCommand(),
new NickCommand(),
new PrefixCommand(),
new BlowjobCommand(),
@@ -88,7 +89,13 @@ public class Hadder {
new AboutCommand(),
new LanguageCommand(),
new ClydeCommand(),
- new StarBoardCommand()), config, helpCommand);
+ new PlayCommand(),
+ new StarBoardCommand(),
+ new QueueCommand(),
+ new InfoCommand(),
+ new SkipCommand(),
+ new EditRulesCommand(),
+ new StopCommand()), config, helpCommand);
builder.addEventListeners(
new MentionListener(rethink),
@@ -98,7 +105,8 @@ public class Hadder {
new ReadyListener(rethink, config),
new InviteLinkListener(rethink),
new RulesListener(rethink),
- new StarboardListener(rethink));
+ new StarboardListener(rethink),
+ new VoiceLeaveListener());
try {
shardManager = builder.build();
diff --git a/src/main/java/com/bbn/hadder/Rethink.java b/src/main/java/com/bbn/hadder/Rethink.java
index f501971..5e99d76 100644
--- a/src/main/java/com/bbn/hadder/Rethink.java
+++ b/src/main/java/com/bbn/hadder/Rethink.java
@@ -4,7 +4,6 @@ import com.bbn.hadder.core.Config;
import com.rethinkdb.RethinkDB;
import com.rethinkdb.gen.exc.ReqlOpFailedError;
import com.rethinkdb.net.Connection;
-import com.rethinkdb.net.Cursor;
import org.json.JSONArray;
import java.util.NoSuchElementException;
@@ -56,33 +55,31 @@ public class Rethink {
public Object get(String table, String where, String value, String column) {
JSONArray array = this.getAsArray(table, where, value);
- if (array.length()>0)
+ if (array.length() > 0)
if (array.getJSONObject(0).has(column))
return array.getJSONObject(0).get(column);
else return null;
else return null;
}
- public String update(String table, String wherevalue, String what, String whatvalue) {
- String out = "";
+ public void update(String table, String value, String what, String whatvalue) {
try {
- Cursor cursor = r.table(table).get(wherevalue).update(r.hashMap(what, whatvalue)).run(conn);
- out=cursor.toString();
- } catch (ClassCastException ignored) {}
- return out;
+ r.table(table).get(value).update(r.hashMap(what, whatvalue)).run(conn);
+ } catch (ClassCastException e) {
+ e.printStackTrace();
+ }
}
- public String insert(String table, Object object) {
- String out = "";
+ public void insert(String table, Object object) {
try {
- Cursor cursor = r.table(table).insert(object).run(conn);
- out = cursor.next().toString();
- } catch (ClassCastException ignored) {}
- return out;
+ r.table(table).insert(object).run(conn);
+ } catch (ClassCastException e) {
+ e.printStackTrace();
+ }
}
- public void remove(String table, String where, String wherevalue) {
- r.table(table).filter(row -> row.g(where.toLowerCase()).eq(wherevalue)).delete().run(conn);
+ public void remove(String table, String where, String value) {
+ r.table(table).filter(row -> row.g(where.toLowerCase()).eq(value)).delete().run(conn);
}
public void setup() {
@@ -108,16 +105,16 @@ public class Rethink {
}
}
- public void setUserPrefix(String prefix, String userid) {
- this.update("user", userid, "prefix", prefix);
+ public void setUserPrefix(String prefix, String user_id) {
+ this.update("user", user_id, "prefix", prefix);
}
public String getUserPrefix(String id) {
return (String) this.get("user", "id", id, "prefix");
}
- public void setGuildPrefix(String prefix, String guildid) {
- this.update("server", guildid, "prefix", prefix);
+ public void setGuildPrefix(String prefix, String guild_id) {
+ this.update("server", guild_id, "prefix", prefix);
}
public String getGuildPrefix(String id) {
@@ -139,40 +136,40 @@ public class Rethink {
this.insert("user", r.hashMap("id", id).with("prefix", "h.").with("language", "en"));
}
- public void setNeededstars(String stars, String guildid) {
- this.update("server", guildid, "neededstars", stars);
+ public void setNeededstars(String stars, String guild_id) {
+ this.update("server", guild_id, "neededstars", stars);
}
- public String getNeededstars(String guildid) {
- return (String) this.get("server", "id", guildid, "neededstars");
+ public String getNeededstars(String guild_id) {
+ return (String) this.get("server", "id", guild_id, "neededstars");
}
- public void setStarboardChannel(String guildid, String channelid) {
- this.update("server", guildid, "starboard", channelid);
+ public void setStarboardChannel(String guild_id, String channel_id) {
+ this.update("server", guild_id, "starboard", channel_id);
}
- public String getStarboardChannel(String guildid) {
- return (String) this.get("server", "id", guildid, "starboard");
+ public String getStarboardChannel(String guild_id) {
+ return (String) this.get("server", "id", guild_id, "starboard");
}
- public boolean hasStarboardChannel(String guildid) {
- return !this.get("server", "id", guildid, "starboard").equals("");
+ public boolean hasStarboardChannel(String guild_id) {
+ return !this.get("server", "id", guild_id, "starboard").equals("");
}
- public void insertStarboardMessage(String messageid, String guildid, String starboardmessageid) {
- this.insert("stars", r.hashMap("id", messageid).with("guild", guildid).with("starboardmsg", starboardmessageid));
+ public void insertStarboardMessage(String message_id, String guild_id, String starboardmessageid) {
+ this.insert("stars", r.hashMap("id", message_id).with("guild", guild_id).with("starboardmsg", starboardmessageid));
}
- public String getStarboardMessage(String messageid) {
- return (String) this.get("stars", "id", messageid, "starboardmsg");
+ public String getStarboardMessage(String message_id) {
+ return (String) this.get("stars", "id", message_id, "starboardmsg");
}
- public void removeStarboardMessage(String messageid) {
- this.remove("stars", "id", messageid);
+ public void removeStarboardMessage(String message_id) {
+ this.remove("stars", "id", message_id);
}
- public boolean hasStarboardMessage(String messageid) {
- return this.get("stars", "id", messageid, "guild") != null;
+ public boolean hasStarboardMessage(String message_id) {
+ return this.get("stars", "id", message_id, "guild") != null;
}
public void updateRules(String guild_id, String message_id, String role_id, String accept_emote, String decline_emote) {
@@ -211,7 +208,7 @@ public class Rethink {
}
public void setLanguage(String user_id, String language) {
- this.update("users", user_id, "language", language);
+ this.update("user", user_id, "language", language);
}
public String getLanguage(String user_id) {
diff --git a/src/main/java/com/bbn/hadder/audio/AudioInfo.java b/src/main/java/com/bbn/hadder/audio/AudioInfo.java
new file mode 100644
index 0000000..8aa35e9
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/audio/AudioInfo.java
@@ -0,0 +1,28 @@
+package com.bbn.hadder.audio;
+
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
+import net.dv8tion.jda.api.entities.Member;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class AudioInfo {
+
+ private final AudioTrack track;
+ private final Member author;
+
+ AudioInfo(AudioTrack track, Member author) {
+ this.track = track;
+ this.author = author;
+ }
+
+ public AudioTrack getTrack() {
+ return track;
+ }
+
+ public Member getAuthor() {
+ return author;
+ }
+
+}
diff --git a/src/main/java/com/bbn/hadder/audio/AudioManager.java b/src/main/java/com/bbn/hadder/audio/AudioManager.java
new file mode 100644
index 0000000..f16baa2
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/audio/AudioManager.java
@@ -0,0 +1,164 @@
+package com.bbn.hadder.audio;
+
+import com.bbn.hadder.commands.CommandEvent;
+import com.bbn.hadder.utils.MessageEditor;
+import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
+import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
+import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
+import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
+import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
+import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.Message;
+
+import java.util.AbstractMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class AudioManager {
+
+ public AudioManager() {
+ AudioSourceManagers.registerRemoteSources(myManager);
+ }
+
+ public Map> players = new HashMap<>();
+ private final AudioPlayerManager myManager = new DefaultAudioPlayerManager();
+
+ public boolean hasPlayer(Guild guild) {
+ return players.containsKey(guild.getId());
+ }
+
+ public void removePlayer(Guild g) {
+ System.out.println(players.toString());
+ players.remove(g.getId());
+ System.out.println(players.toString());
+ }
+
+ public Map> getPlayers () {
+ return players;
+ }
+
+ public AudioPlayer getPlayer(Guild guild) {
+ AudioPlayer p;
+ if (hasPlayer(guild)) {
+ p = players.get(guild.getId()).getKey();
+ } else {
+ p = createPlayer(guild);
+ }
+ return p;
+ }
+
+ public TrackManager getTrackManager(Guild guild) {
+ return players.get(guild.getId()).getValue();
+ }
+
+ public AudioPlayer createPlayer(Guild guild) {
+ AudioPlayer nPlayer = myManager.createPlayer();
+ TrackManager manager = new TrackManager(nPlayer);
+ nPlayer.addListener(manager);
+ guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(nPlayer));
+ players.put(guild.getId(), new AbstractMap.SimpleEntry<>(nPlayer, manager));
+ return nPlayer;
+ }
+
+ public void loadTrack(String identifier, CommandEvent event, Message msg) {
+ Guild guild = event.getGuild();
+ getPlayer(guild);
+
+ myManager.loadItemOrdered(guild, identifier, new AudioLoadResultHandler() {
+
+ @Override
+ public void trackLoaded(AudioTrack track) {
+ getTrackManager(guild).queue(track, event.getMember());
+ msg.editMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.music.play.success.loading.title", "⏯",
+ "", "")
+ .addField(event.getMessageEditor().getTerm("commands.music.play.success.title"), track.getInfo().title, false)
+ .addField(event.getMessageEditor().getTerm("commands.music.play.success.author"), track.getInfo().author, true)
+ .addField(event.getMessageEditor().getTerm("commands.music.play.success.length"),
+ String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(track.getInfo().length),
+ TimeUnit.MILLISECONDS.toMinutes(track.getInfo().length) % TimeUnit.HOURS.toMinutes(1),
+ TimeUnit.MILLISECONDS.toSeconds(track.getInfo().length) % TimeUnit.MINUTES.toSeconds(1)), true)
+ .build()).queue();
+ }
+
+ @Override
+ public void playlistLoaded(AudioPlaylist playlist) {
+ if (playlist.getSelectedTrack() != null) {
+ trackLoaded(playlist.getSelectedTrack());
+ } else if (playlist.isSearchResult()) {
+ trackLoaded(playlist.getTracks().get(0));
+ } else {
+ event.getTextChannel().sendMessage("PL loaded :D").queue();
+ }
+ }
+
+ @Override
+ public void noMatches() {
+ msg.editMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.music.play.error.match.title", "❌",
+ "commands.music.play.error.match.description", "")
+ .build()).queue();
+ }
+
+ @Override
+ public void loadFailed(FriendlyException e) {
+ msg.editMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.music.play.error.load.title", "❌",
+ "commands.music.play.error.load.description", "")
+ .build()).queue();
+ }
+ });
+ }
+
+ public boolean isDj(Member member) {
+ return member.getRoles().stream().anyMatch(r -> r.getName().equals("DJ"));
+ }
+
+ public boolean isCurrentDj(Member member) {
+ return getTrackManager(member.getGuild()).getTrackInfo(getPlayer(member.getGuild()).getPlayingTrack()).getAuthor().equals(member);
+ }
+
+ public boolean isIdle(CommandEvent event) {
+ if (!hasPlayer(event.getGuild()) || getPlayer(event.getGuild()).getPlayingTrack() == null) {
+ event.getTextChannel().sendMessage(" Idle no song lul :D").queue();
+ return true;
+ }
+ return false;
+ }
+
+ public void forceSkipTrack(CommandEvent event) {
+ getPlayer(event.getGuild()).stopTrack();
+ event.getTextChannel().sendMessage("Skipped boyy :D").queue();
+ }
+
+ public String buildQueueMessage(AudioInfo info) {
+ AudioTrackInfo trackInfo = info.getTrack().getInfo();
+ String title = trackInfo.title;
+ long length = trackInfo.length;
+ return "`[ " + getTimestamp(length) + " ]` " + title + "\n";
+ }
+
+ public String getTimestamp(long milis) {
+ long seconds = milis / 1000;
+ long hours = Math.floorDiv(seconds, 3600);
+ seconds = seconds - (hours * 3600);
+ long mins = Math.floorDiv(seconds, 60);
+ seconds = seconds - (mins * 60);
+ return (hours == 0 ? "" : hours + ":") + String.format("%02d", mins) + ":" + String.format("%02d", seconds);
+ }
+
+ public String getOrNull(String s) {
+ return s.isEmpty() ? "N/A" : s;
+ }
+
+}
diff --git a/src/main/java/com/bbn/hadder/audio/AudioPlayerSendHandler.java b/src/main/java/com/bbn/hadder/audio/AudioPlayerSendHandler.java
new file mode 100644
index 0000000..1863de2
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/audio/AudioPlayerSendHandler.java
@@ -0,0 +1,49 @@
+package com.bbn.hadder.audio;
+
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
+import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
+import net.dv8tion.jda.api.audio.AudioSendHandler;
+
+import javax.annotation.Nullable;
+import java.nio.ByteBuffer;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class AudioPlayerSendHandler implements AudioSendHandler {
+
+ private final AudioPlayer audioPlayer;
+ private AudioFrame lastFrame;
+
+ public AudioPlayerSendHandler(AudioPlayer audioPlayer) {
+ this.audioPlayer = audioPlayer;
+ }
+
+ @Override
+ public boolean canProvide() {
+ if (lastFrame == null) {
+ lastFrame = audioPlayer.provide();
+ }
+
+ return lastFrame != null;
+ }
+
+ @Nullable
+ @Override
+ public ByteBuffer provide20MsAudio() {
+ if (lastFrame == null) {
+ lastFrame = audioPlayer.provide();
+ }
+
+ byte[] data = lastFrame != null ? lastFrame.getData() : null;
+ lastFrame = null;
+
+ return ByteBuffer.wrap(data);
+ }
+
+ @Override
+ public boolean isOpus() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/audio/TrackManager.java b/src/main/java/com/bbn/hadder/audio/TrackManager.java
new file mode 100644
index 0000000..b4c1e9a
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/audio/TrackManager.java
@@ -0,0 +1,73 @@
+package com.bbn.hadder.audio;
+
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
+import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
+import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
+import net.dv8tion.jda.api.entities.Guild;
+import net.dv8tion.jda.api.entities.Member;
+import net.dv8tion.jda.api.entities.VoiceChannel;
+
+import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class TrackManager extends AudioEventAdapter {
+
+ private final AudioPlayer player;
+ private final Queue queue;
+
+ public TrackManager(AudioPlayer player) {
+ this.player = player;
+ this.queue = new LinkedBlockingQueue<>();
+ }
+
+ public void queue(AudioTrack track, Member author) {
+ AudioInfo info = new AudioInfo(track, author);
+ queue.add(info);
+
+ if (player.getPlayingTrack() == null) {
+ player.playTrack(track);
+ }
+ }
+
+ @Override
+ public void onTrackStart(AudioPlayer player, AudioTrack track) {
+ AudioInfo info = queue.element();
+ VoiceChannel vChan = info.getAuthor().getVoiceState().getChannel();
+ if (vChan == null) {
+ player.stopTrack();
+ } else {
+ info.getAuthor().getGuild().getAudioManager().openAudioConnection(vChan);
+ }
+ }
+
+ @Override
+ public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
+ Guild g = queue.poll().getAuthor().getGuild();
+ if (queue.isEmpty()) {
+ g.getAudioManager().closeAudioConnection();
+ } else {
+ player.playTrack(queue.element().getTrack());
+ }
+ }
+
+ public Set getQueuedTracks() {
+ return new LinkedHashSet<>(queue);
+ }
+
+ public void purgeQueue() {
+ queue.clear();
+ }
+
+ public void remove(AudioInfo entry) {
+ queue.remove(entry);
+ }
+
+ public AudioInfo getTrackInfo(AudioTrack track) {
+ return queue.stream().filter(audioInfo -> audioInfo.getTrack().equals(track)).findFirst().orElse(null);
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/commands/CommandEvent.java b/src/main/java/com/bbn/hadder/commands/CommandEvent.java
index 7ea21a7..fb9d643 100644
--- a/src/main/java/com/bbn/hadder/commands/CommandEvent.java
+++ b/src/main/java/com/bbn/hadder/commands/CommandEvent.java
@@ -4,6 +4,7 @@ import com.bbn.hadder.Rethink;
import com.bbn.hadder.commands.general.HelpCommand;
import com.bbn.hadder.core.CommandHandler;
import com.bbn.hadder.core.Config;
+import com.bbn.hadder.utils.EventWaiter;
import com.bbn.hadder.utils.MessageEditor;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Message;
@@ -18,14 +19,16 @@ public class CommandEvent extends MessageReceivedEvent {
private CommandHandler commandHandler;
private HelpCommand helpCommand;
private MessageEditor messageEditor;
+ private EventWaiter eventWaiter;
- public CommandEvent(@Nonnull JDA api, long responseNumber, @Nonnull Message message, Rethink rethink, Config config, CommandHandler commandHandler, HelpCommand helpCommand, MessageEditor messageEditor) {
+ public CommandEvent(@Nonnull JDA api, long responseNumber, @Nonnull Message message, Rethink rethink, Config config, CommandHandler commandHandler, HelpCommand helpCommand, MessageEditor messageEditor, EventWaiter eventWaiter) {
super(api, responseNumber, message);
this.rethink = rethink;
this.config = config;
this.commandHandler = commandHandler;
this.helpCommand = helpCommand;
this.messageEditor = messageEditor;
+ this.eventWaiter = eventWaiter;
}
public Rethink getRethink() {
@@ -47,4 +50,8 @@ public class CommandEvent extends MessageReceivedEvent {
public MessageEditor getMessageEditor() {
return messageEditor;
}
+
+ public EventWaiter getEventWaiter() {
+ return eventWaiter;
+ }
}
diff --git a/src/main/java/com/bbn/hadder/commands/fun/AvatarCommand.java b/src/main/java/com/bbn/hadder/commands/fun/AvatarCommand.java
index e3c852d..9bb48f9 100644
--- a/src/main/java/com/bbn/hadder/commands/fun/AvatarCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/fun/AvatarCommand.java
@@ -66,6 +66,6 @@ public class AvatarCommand implements Command {
@Override
public String usage() {
- return "[@User]/[ID]";
+ return "user/id";
}
}
diff --git a/src/main/java/com/bbn/hadder/commands/fun/GifCommand.java b/src/main/java/com/bbn/hadder/commands/fun/GifCommand.java
index ecd14d1..760c139 100644
--- a/src/main/java/com/bbn/hadder/commands/fun/GifCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/fun/GifCommand.java
@@ -58,6 +58,6 @@ public class GifCommand implements Command {
@Override
public String usage() {
- return "";
+ return "searchterm";
}
}
diff --git a/src/main/java/com/bbn/hadder/commands/fun/MemeCommand.java b/src/main/java/com/bbn/hadder/commands/fun/MemeCommand.java
index 93b7749..2c1918b 100644
--- a/src/main/java/com/bbn/hadder/commands/fun/MemeCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/fun/MemeCommand.java
@@ -21,16 +21,17 @@ public class MemeCommand implements Command {
public void executed(String[] args, CommandEvent event) {
OkHttpClient client = new OkHttpClient();
- Request request = new Request.Builder().url("https://some-random-api.ml/meme").build();
+ Request request = new Request.Builder().url("https://meme-api.herokuapp.com/gimme").build();
try {
Response response = client.newCall(request).execute();
JSONObject json = new JSONObject(response.body().string());
- String url = json.get("image").toString();
+ String url = json.getString("url");
event.getTextChannel().sendMessage(
event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
"commands.fun.meme.success.title", "")
.setImage(url)
+ .setAuthor("Subreddit: " + json.getString("subreddit"))
.build()).queue();
} catch (IOException e) {
e.printStackTrace();
diff --git a/src/main/java/com/bbn/hadder/commands/general/AboutCommand.java b/src/main/java/com/bbn/hadder/commands/general/AboutCommand.java
index 82d17eb..3800836 100644
--- a/src/main/java/com/bbn/hadder/commands/general/AboutCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/general/AboutCommand.java
@@ -24,7 +24,7 @@ public class AboutCommand implements Command {
@Override
public String[] labels() {
- return new String[]{"about", "info"};
+ return new String[]{"about"};
}
@Override
diff --git a/src/main/java/com/bbn/hadder/commands/misc/FeedbackCommand.java b/src/main/java/com/bbn/hadder/commands/misc/FeedbackCommand.java
index d081a46..a84d9f3 100644
--- a/src/main/java/com/bbn/hadder/commands/misc/FeedbackCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/misc/FeedbackCommand.java
@@ -37,6 +37,7 @@ public class FeedbackCommand implements Command {
GitHub connection = GitHub.connectUsingOAuth(event.getConfig().getGitHubToken());
GHRepository Hadder = connection.getOrganization("BigBotNetwork").getRepository("Hadder");
GHIssue issue = Hadder.createIssue(title).body("Feedback by " + event.getAuthor().getAsTag() + "
" + description).label("feedback").create();
+ issue.addLabels("feedback");
event.getTextChannel().sendMessage(
event.getMessageEditor().getMessage(
MessageEditor.MessageType.INFO,
diff --git a/src/main/java/com/bbn/hadder/commands/moderation/BanCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/BanCommand.java
index 406d699..de948d9 100644
--- a/src/main/java/com/bbn/hadder/commands/moderation/BanCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/moderation/BanCommand.java
@@ -26,7 +26,7 @@ public class BanCommand implements Command {
event.getMessageEditor().getMessage(
MessageEditor.MessageType.INFO,
"commands.moderation.ban.success.title",
- "✅",
+ "",
"commands.moderation.ban.success.description",
victim.getUser().getName() + ".").build()).queue();
} else {
@@ -74,7 +74,7 @@ public class BanCommand implements Command {
}
event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
"commands.moderation.ban.success.title",
- "✅",
+ "",
"commands.moderation.ban.massban.success.description",
String.valueOf(event.getMessage().getMentionedMembers().size())).build()).queue();
}
diff --git a/src/main/java/com/bbn/hadder/commands/moderation/ClearCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/ClearCommand.java
index 6e3d248..2e9bc1f 100644
--- a/src/main/java/com/bbn/hadder/commands/moderation/ClearCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/moderation/ClearCommand.java
@@ -50,13 +50,25 @@ public class ClearCommand implements Command {
List history = event.getTextChannel().getHistory().retrievePast(nbToDelete + 1).complete();
List msgToDelete = new ArrayList<>(history);
event.getTextChannel().deleteMessages(msgToDelete).queue();
- Message msg = event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO, "", "", "commands.moderation.clear.success.description", String.valueOf(nbToDelete)).build()).complete();
- try {
- TimeUnit.SECONDS.sleep(2);
- } catch (InterruptedException e) {
- e.printStackTrace();
+ if (nbToDelete == 1) {
+ Message msg = event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO, "commands.moderation.clear.success.title",
+ "commands.moderation.clear.success.description.singular").build()).complete();
+ try {
+ TimeUnit.SECONDS.sleep(2);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ msg.delete().queue();
+ } else {
+ Message msg = event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO, "commands.moderation.clear.success.title", "",
+ "commands.moderation.clear.success.description.plural", String.valueOf(nbToDelete)).build()).complete();
+ try {
+ TimeUnit.SECONDS.sleep(2);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ msg.delete().queue();
}
- msg.delete().queue();
}
} catch (NumberFormatException e) {
event.getHelpCommand().sendHelp(this, event);
diff --git a/src/main/java/com/bbn/hadder/commands/moderation/EditRulesCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/EditRulesCommand.java
new file mode 100644
index 0000000..c8e9fd3
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/commands/moderation/EditRulesCommand.java
@@ -0,0 +1,98 @@
+package com.bbn.hadder.commands.moderation;
+
+import com.bbn.hadder.commands.Command;
+import com.bbn.hadder.commands.CommandEvent;
+import com.bbn.hadder.core.Perm;
+import com.bbn.hadder.core.Perms;
+import com.bbn.hadder.utils.MessageEditor;
+import net.dv8tion.jda.api.entities.TextChannel;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+@Perms(Perm.MANAGE_SERVER)
+public class EditRulesCommand implements Command {
+
+ @Override
+ public void executed(String[] args, CommandEvent event) {
+ if (event.getRethink().getRulesMID(event.getGuild().getId()).length() == 18) {
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.moderation.editrules.message.title",
+ "commands.moderation.editrules.message.description").build()).queue();
+
+ event.getEventWaiter().newOnMessageEventWaiter(event1 -> {
+ String rules = event1.getMessage().getContentRaw();
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.moderation.editrules.channel.title",
+ "commands.moderation.editrules.channel.description").build()).queue();
+
+ event.getEventWaiter().newOnMessageEventWaiter(event2 -> {
+ if (event2.getMessage().getMentionedChannels().size() == 1) {
+ try {
+ TextChannel channel = event2.getMessage().getMentionedChannels().get(0);
+ checkChannel(event, rules, channel);
+ } catch (Exception e) {
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR,
+ "commands.moderation.editrules.channel.error.title",
+ "commands.moderation.editrules.channel.error.description")
+ .build()).queue();
+ }
+ } else {
+ try {
+ TextChannel channel = event1.getGuild().getTextChannelsByName(event2.getMessage().getContentRaw(), true).get(0);
+ checkChannel(event, rules, channel);
+ } catch (Exception e) {
+ event.getTextChannel().sendMessage(
+ event.getMessageEditor().getMessage(
+ MessageEditor.MessageType.ERROR,
+ "commands.moderation.editrules.channel.error.title",
+ "commands.moderation.editrules.channel.error.description")
+ .build()).queue();
+ }
+ }
+ }, event.getJDA(), event.getAuthor());
+ }, event.getJDA(), event.getAuthor());
+ } else {
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR,
+ "commands.moderation.editrules.error.title", "",
+ "commands.moderation.editrules.error.description", event.getRethink().getGuildPrefix(event.getGuild().getId())).build()).queue();
+ }
+ }
+
+ public void checkChannel(CommandEvent event, String rules, TextChannel channel) {
+ try {
+ channel.retrieveMessageById(event.getRethink().getRulesMID(event.getGuild().getId())).queue();
+ setRules(event, rules, channel);
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.moderation.editrules.success.title",
+ "commands.moderation.editrules.success.description").build()).queue();
+ } catch (Exception e) {
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR,
+ "commands.moderation.editrules.channel.message.error.title",
+ "commands.moderation.editrules.channel.message.error.description").build()).queue();
+ }
+ }
+
+ public void setRules(CommandEvent event, String rules, TextChannel channel) {
+ channel.retrieveMessageById(event.getRethink().getRulesMID(event.getGuild().getId())).complete().editMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO)
+ .setTitle("Rules")
+ .setDescription(rules)
+ .build()).queue();
+ }
+
+ @Override
+ public String[] labels() {
+ return new String[]{"editrules", "rulesedit", "edit_rules", "rules_edit"};
+ }
+
+ @Override
+ public String description() {
+ return "commands.moderation.editrules.help.description";
+ }
+
+ @Override
+ public String usage() {
+ return "";
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/commands/moderation/InviteDetectCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/InviteDetectCommand.java
index 37f9b0d..b85fee6 100644
--- a/src/main/java/com/bbn/hadder/commands/moderation/InviteDetectCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/moderation/InviteDetectCommand.java
@@ -9,7 +9,6 @@ import com.bbn.hadder.commands.CommandEvent;
import com.bbn.hadder.core.Perm;
import com.bbn.hadder.core.Perms;
import com.bbn.hadder.utils.MessageEditor;
-import net.dv8tion.jda.api.Permission;
@Perms(Perm.MANAGE_SERVER)
public class InviteDetectCommand implements Command {
diff --git a/src/main/java/com/bbn/hadder/commands/moderation/NickCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/NickCommand.java
index df21d5a..6a10aa2 100644
--- a/src/main/java/com/bbn/hadder/commands/moderation/NickCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/moderation/NickCommand.java
@@ -12,7 +12,7 @@ import com.bbn.hadder.utils.MessageEditor;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Member;
-@Perms(Perm.CHANGE_NICKNAME)
+@Perms(Perm.MANAGE_NICKNAMES)
public class NickCommand implements Command {
@Override
diff --git a/src/main/java/com/bbn/hadder/commands/moderation/PrefixCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/PrefixCommand.java
index 43742d9..86f2c12 100644
--- a/src/main/java/com/bbn/hadder/commands/moderation/PrefixCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/moderation/PrefixCommand.java
@@ -5,7 +5,6 @@ import com.bbn.hadder.commands.CommandEvent;
import com.bbn.hadder.core.Perm;
import com.bbn.hadder.core.Perms;
import com.bbn.hadder.utils.MessageEditor;
-import net.dv8tion.jda.api.Permission;
@Perms(Perm.MANAGE_SERVER)
public class PrefixCommand implements Command {
diff --git a/src/main/java/com/bbn/hadder/commands/moderation/RulesCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/RulesCommand.java
index 23fb16e..99cc13e 100644
--- a/src/main/java/com/bbn/hadder/commands/moderation/RulesCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/moderation/RulesCommand.java
@@ -29,7 +29,7 @@ public class RulesCommand implements Command {
"commands.moderation.rules.setup.title",
"commands.moderation.rules.setup.description")
.build()).queue();
- new EventWaiter().newOnMessageEventWaiter(event1 -> {
+ event.getEventWaiter().newOnMessageEventWaiter(event1 -> {
if (event1.getMessage().getMentionedChannels().size() == 1) {
try {
TextChannel channel = event1.getMessage().getMentionedChannels().get(0);
@@ -70,7 +70,7 @@ public class RulesCommand implements Command {
"commands.moderation.rules.rules.description",
channel.getName())
.build()).queue();
- new EventWaiter().newOnMessageEventWaiter(event2 -> {
+ event.getEventWaiter().newOnMessageEventWaiter(event2 -> {
String message = event2.getMessage().getContentRaw();
event2.getChannel().sendMessage(
event.getMessageEditor().getMessage(
@@ -96,7 +96,9 @@ public class RulesCommand implements Command {
}, event.getJDA(), event.getAuthor());
}, event.getJDA(), event.getAuthor());
} else {
- event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.NO_PERMISSION)
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR,
+ "commands.moderation.rules.error.message.title",
+ "commands.moderation.rules.error.message.description")
.build()).queue();
}
} else {
@@ -118,16 +120,16 @@ public class RulesCommand implements Command {
"",
"commands.moderation.rules.emote.accept.description", role.getName())
.build()).queue();
- new EventWaiter().newOnMessageEventWaiter(event4 -> {
+ event.getEventWaiter().newOnMessageEventWaiter(event4 -> {
if (event4.getMessage().getEmotes().size() == 1) {
Emote aemote = event4.getMessage().getEmotes().get(0);
event4.getChannel().sendMessage(
event.getMessageEditor().getMessage(
MessageEditor.MessageType.INFO,
"commands.moderation.rules.emote.decline.title", "",
- "commands.moderation.rules.emote.decline.title", String.valueOf(aemote))
+ "commands.moderation.rules.emote.decline.description", String.valueOf(aemote))
.build()).queue();
- new EventWaiter().newOnMessageEventWaiter(event5 -> {
+ event.getEventWaiter().newOnMessageEventWaiter(event5 -> {
Emote demote = event5.getMessage().getEmotes().get(0);
if (!aemote.equals(demote)) {
Message rules = channel.sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO)
@@ -172,7 +174,7 @@ public class RulesCommand implements Command {
"commands.moderation.rules.emote.decline.title",
"commands.moderation.rules.emoji.decline.description")
.build()).queue();
- new EventWaiter().newOnMessageEventWaiter(event5 -> {
+ event.getEventWaiter().newOnMessageEventWaiter(event5 -> {
String demote = event5.getMessage().getContentRaw();
if (!aemote.equals(demote)) {
Message rules = channel.sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO)
diff --git a/src/main/java/com/bbn/hadder/commands/moderation/StarBoardCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/StarBoardCommand.java
index 50d6987..3371eec 100644
--- a/src/main/java/com/bbn/hadder/commands/moderation/StarBoardCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/moderation/StarBoardCommand.java
@@ -14,7 +14,7 @@ public class StarBoardCommand implements Command {
event.getChannel().sendMessage(
event.getMessageEditor().getMessage(
MessageEditor.MessageType.INFO,
- "commands.moderation.starboard.successchannel","")
+ "commands.moderation.starboard.success.title","")
.build())
.queue();
} else {
diff --git a/src/main/java/com/bbn/hadder/commands/music/InfoCommand.java b/src/main/java/com/bbn/hadder/commands/music/InfoCommand.java
new file mode 100644
index 0000000..f38f0ef
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/commands/music/InfoCommand.java
@@ -0,0 +1,48 @@
+package com.bbn.hadder.commands.music;
+
+import com.bbn.hadder.audio.AudioManager;
+import com.bbn.hadder.commands.Command;
+import com.bbn.hadder.commands.CommandEvent;
+import com.bbn.hadder.utils.MessageEditor;
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class InfoCommand implements Command {
+
+ private static final String CD = "\uD83D\uDCBF";
+ private static final String MIC = "\uD83C\uDFA4";
+ private static final String QUEUE_DESCRIPTION = "%s **|>** %s\n%s\n%s %s\n%s";
+
+ @Override
+ public void executed(String[] args, CommandEvent event) {
+ if (new AudioManager().hasPlayer(event.getGuild()) && new AudioManager().getPlayer(event.getGuild()).getPlayingTrack() == null) {
+ AudioTrack track = new AudioManager().getPlayer(event.getGuild()).getPlayingTrack();
+ event.getTextChannel().sendMessage("Track Info" + String.format(QUEUE_DESCRIPTION, CD, new AudioManager().getOrNull(track.getInfo().title),
+ "\n\u23F1 **|>** `[ " + new AudioManager().getTimestamp(track.getPosition()) + " / " + new AudioManager().getTimestamp(track.getInfo().length) + " ]`",
+ "\n" + MIC, new AudioManager().getOrNull(track.getInfo().author),
+ "\n\uD83C\uDFA7 **|>** " + "")).queue();
+ } else {
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR,
+ "commands.music.info.error.title",
+ "commands.music.info.error.description").build()).queue();
+ }
+ }
+
+ @Override
+ public String[] labels() {
+ return new String[]{"info", "songinfo"};
+ }
+
+ @Override
+ public String description() {
+ return "Shows information about the playing song";
+ }
+
+ @Override
+ public String usage() {
+ return "";
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/commands/music/LeaveCommand.java b/src/main/java/com/bbn/hadder/commands/music/LeaveCommand.java
index eb860db..c2a0398 100644
--- a/src/main/java/com/bbn/hadder/commands/music/LeaveCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/music/LeaveCommand.java
@@ -15,14 +15,14 @@ public class LeaveCommand implements Command {
if (event.getGuild().getSelfMember().getVoiceState().inVoiceChannel()) {
event.getGuild().getAudioManager().closeAudioConnection();
event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(
- MessageEditor.MessageType.INFO,
- "commands.music.leave.success.title",
+ MessageEditor.MessageType.INFO,
+ "commands.music.leave.success.title",
"commands.music.leave.success.description")
.build()).queue();
} else {
event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(
- MessageEditor.MessageType.WARNING,
- "commands.music.leave.error.tile",
+ MessageEditor.MessageType.WARNING,
+ "commands.music.leave.error.tile",
"commands.music.leave.error.description")
.build()).queue();
}
@@ -30,7 +30,7 @@ public class LeaveCommand implements Command {
@Override
public String[] labels() {
- return new String[]{"leave"};
+ return new String[]{"leave", "quit"};
}
@Override
diff --git a/src/main/java/com/bbn/hadder/commands/music/PlayCommand.java b/src/main/java/com/bbn/hadder/commands/music/PlayCommand.java
new file mode 100644
index 0000000..ddb5c92
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/commands/music/PlayCommand.java
@@ -0,0 +1,58 @@
+package com.bbn.hadder.commands.music;
+
+import com.bbn.hadder.audio.AudioManager;
+import com.bbn.hadder.commands.Command;
+import com.bbn.hadder.commands.CommandEvent;
+import com.bbn.hadder.utils.MessageEditor;
+import net.dv8tion.jda.api.entities.Message;
+
+import java.net.URL;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class PlayCommand implements Command {
+
+ @Override
+ public void executed(String[] args, CommandEvent event) {
+ if (args.length > 0) {
+ if (event.getMember().getVoiceState().inVoiceChannel()) {
+ String input = event.getMessage().getContentRaw().replaceFirst(event.getRethink().getGuildPrefix(event.getGuild().getId()) + "play ", "").replaceFirst(event.getRethink().getUserPrefix(event.getAuthor().getId()) + "play ", "");
+ try {
+ new URL(input).toURI();
+ Message msg = event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.music.play.load.title", "⭕",
+ "commands.music.play.load.description", "").build()).complete();
+ new AudioManager().loadTrack(input, event, msg);
+ } catch (Exception ignore) {
+ Message msg = event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.music.play.load.title", "⭕",
+ "commands.music.play.load.description", "").build()).complete();
+ new AudioManager().loadTrack("ytsearch: " + input, event, msg);
+ }
+ } else {
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(
+ MessageEditor.MessageType.WARNING,
+ "commands.music.join.error.channel.title",
+ "commands.music.join.error.channel.description")
+ .build()).queue();
+ }
+ } else event.getHelpCommand().sendHelp(this, event);
+ }
+
+ @Override
+ public String[] labels() {
+ return new String[]{"play"};
+ }
+
+ @Override
+ public String description() {
+ return "commands.music.play.help.description";
+ }
+
+ @Override
+ public String usage() {
+ return "song";
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/commands/music/QueueCommand.java b/src/main/java/com/bbn/hadder/commands/music/QueueCommand.java
new file mode 100644
index 0000000..d2178f9
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/commands/music/QueueCommand.java
@@ -0,0 +1,52 @@
+package com.bbn.hadder.commands.music;
+
+import com.bbn.hadder.audio.AudioInfo;
+import com.bbn.hadder.audio.AudioManager;
+import com.bbn.hadder.commands.Command;
+import com.bbn.hadder.commands.CommandEvent;
+import com.bbn.hadder.utils.MessageEditor;
+import net.dv8tion.jda.api.EmbedBuilder;
+
+import java.util.Set;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class QueueCommand implements Command {
+
+ @Override
+ public void executed(String[] args, CommandEvent event) {
+ if (!new AudioManager().hasPlayer(event.getGuild()) || new AudioManager().getTrackManager(event.getGuild()).getQueuedTracks().isEmpty()) {
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.WARNING,
+ "commands.music.queue.error.title",
+ "commands.music.queue.error.description"
+ ).build()).queue();
+ } else {
+ Set queue = new AudioManager().getTrackManager(event.getGuild()).getQueuedTracks();
+ EmbedBuilder b = event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.music.queue.success.title",
+ "commands.music.queue.success.description")
+ .addField("Queued songs", String.valueOf(queue.size()), true);
+ for (AudioInfo g : queue) {
+ b.addField(g.getTrack().getInfo().author, g.getTrack().getInfo().title, true);
+ }
+ event.getTextChannel().sendMessage(b.build()).queue();
+ }
+ }
+
+ @Override
+ public String[] labels() {
+ return new String[]{"queue"};
+ }
+
+ @Override
+ public String description() {
+ return "Shows the music queue.";
+ }
+
+ @Override
+ public String usage() {
+ return "";
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/commands/music/SkipCommand.java b/src/main/java/com/bbn/hadder/commands/music/SkipCommand.java
new file mode 100644
index 0000000..ea36991
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/commands/music/SkipCommand.java
@@ -0,0 +1,33 @@
+package com.bbn.hadder.commands.music;
+
+import com.bbn.hadder.audio.AudioInfo;
+import com.bbn.hadder.audio.AudioManager;
+import com.bbn.hadder.commands.Command;
+import com.bbn.hadder.commands.CommandEvent;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class SkipCommand implements Command {
+
+ @Override
+ public void executed(String[] args, CommandEvent event) {
+
+ }
+
+ @Override
+ public String[] labels() {
+ return new String[]{"skip"};
+ }
+
+ @Override
+ public String description() {
+ return "Skips the song";
+ }
+
+ @Override
+ public String usage() {
+ return "";
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/commands/music/StopCommand.java b/src/main/java/com/bbn/hadder/commands/music/StopCommand.java
new file mode 100644
index 0000000..97e8691
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/commands/music/StopCommand.java
@@ -0,0 +1,43 @@
+package com.bbn.hadder.commands.music;
+
+import com.bbn.hadder.audio.AudioManager;
+import com.bbn.hadder.commands.Command;
+import com.bbn.hadder.commands.CommandEvent;
+import com.bbn.hadder.utils.MessageEditor;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class StopCommand implements Command {
+
+ @Override
+ public void executed(String[] args, CommandEvent event) {
+ if (new AudioManager().hasPlayer(event.getGuild())) {
+ new AudioManager().players.remove(event.getGuild().getId());
+ new AudioManager().getPlayer(event.getGuild()).destroy();
+ new AudioManager().getTrackManager(event.getGuild()).purgeQueue();
+ event.getGuild().getAudioManager().closeAudioConnection();
+ event.getTextChannel().sendMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
+ "commands.music.stop.success.title",
+ "commands.music.stop.success.description").build()).queue();
+ } else {
+ event.getTextChannel().sendMessage("I love you <3").queue();
+ }
+ }
+
+ @Override
+ public String[] labels() {
+ return new String[]{"stop"};
+ }
+
+ @Override
+ public String description() {
+ return "commands.music.stop.help.description";
+ }
+
+ @Override
+ public String usage() {
+ return "";
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/commands/owner/EvalCommand.java b/src/main/java/com/bbn/hadder/commands/owner/EvalCommand.java
index ca5fac2..e0f4e31 100644
--- a/src/main/java/com/bbn/hadder/commands/owner/EvalCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/owner/EvalCommand.java
@@ -5,6 +5,7 @@ package com.bbn.hadder.commands.owner;
*/
import com.bbn.hadder.Hadder;
+import com.bbn.hadder.audio.AudioManager;
import com.bbn.hadder.commands.Command;
import com.bbn.hadder.commands.CommandEvent;
import com.bbn.hadder.core.Perm;
@@ -43,6 +44,7 @@ public class EvalCommand implements Command {
engine.put("author", event.getAuthor());
engine.put("member", event.getMember());
engine.put("self", event.getGuild().getSelfMember());
+ engine.put("audio", new AudioManager());
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
diff --git a/src/main/java/com/bbn/hadder/commands/owner/TestCommand.java b/src/main/java/com/bbn/hadder/commands/owner/TestCommand.java
index ae25810..58aaca5 100644
--- a/src/main/java/com/bbn/hadder/commands/owner/TestCommand.java
+++ b/src/main/java/com/bbn/hadder/commands/owner/TestCommand.java
@@ -2,8 +2,6 @@ package com.bbn.hadder.commands.owner;
import com.bbn.hadder.commands.Command;
import com.bbn.hadder.commands.CommandEvent;
-import com.bbn.hadder.core.Perm;
-import com.bbn.hadder.core.Perms;
import com.bbn.hadder.utils.MessageEditor.MessageType;
/*
diff --git a/src/main/java/com/bbn/hadder/core/CommandHandler.java b/src/main/java/com/bbn/hadder/core/CommandHandler.java
index a51e674..9d7469f 100644
--- a/src/main/java/com/bbn/hadder/core/CommandHandler.java
+++ b/src/main/java/com/bbn/hadder/core/CommandHandler.java
@@ -4,6 +4,7 @@ import com.bbn.hadder.Rethink;
import com.bbn.hadder.commands.Command;
import com.bbn.hadder.commands.CommandEvent;
import com.bbn.hadder.commands.general.HelpCommand;
+import com.bbn.hadder.utils.EventWaiter;
import com.bbn.hadder.utils.MessageEditor;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
@@ -34,16 +35,14 @@ public class CommandHandler {
if (args.length > 0 && args[0].equals("")) args = new String[0];
CommandEvent commandEvent = new CommandEvent(event.getJDA(), event.getResponseNumber(), event.getMessage(), rethink,
- config, this, helpCommand, new MessageEditor(rethink, event.getAuthor()));
- if (cmd.getClass().getAnnotations().length>0) {
- if (!Arrays.asList(cmd.getClass().getAnnotations()).contains(Perms.class)) {
- for (Perm perm : cmd.getClass().getAnnotation(Perms.class).value()) {
- if (!perm.check(commandEvent)) {
- commandEvent.getTextChannel()
- .sendMessage(commandEvent.getMessageEditor().getMessage(MessageEditor.MessageType.NO_PERMISSION).build())
- .queue();
- return;
- }
+ config, this, helpCommand, new MessageEditor(rethink, event.getAuthor()), new EventWaiter());
+ if (cmd.getClass().getAnnotations().length > 0 && !Arrays.asList(cmd.getClass().getAnnotations()).contains(Perms.class)) {
+ for (Perm perm : cmd.getClass().getAnnotation(Perms.class).value()) {
+ if (!perm.check(commandEvent)) {
+ commandEvent.getTextChannel()
+ .sendMessage(commandEvent.getMessageEditor().getMessage(MessageEditor.MessageType.NO_PERMISSION).build())
+ .queue();
+ return;
}
}
}
diff --git a/src/main/java/com/bbn/hadder/core/Perm.java b/src/main/java/com/bbn/hadder/core/Perm.java
index 4cd1b7a..1ecb0f4 100644
--- a/src/main/java/com/bbn/hadder/core/Perm.java
+++ b/src/main/java/com/bbn/hadder/core/Perm.java
@@ -52,10 +52,10 @@ public enum Perm {
return event.getMember().hasPermission(Permission.MANAGE_ROLES) || event.getConfig().getOwners().contains(event.getAuthor().getIdLong());
}
},
- CHANGE_NICKNAME {
+ MANAGE_NICKNAMES {
@Override
public boolean check(CommandEvent event) {
- return event.getMember().hasPermission(Permission.NICKNAME_CHANGE) || event.getConfig().getOwners().contains(event.getAuthor().getIdLong());
+ return event.getMember().hasPermission(Permission.NICKNAME_MANAGE) || event.getConfig().getOwners().contains(event.getAuthor().getIdLong());
}
},
ADMINISTRATOR {
diff --git a/src/main/java/com/bbn/hadder/listener/VoiceLeaveListener.java b/src/main/java/com/bbn/hadder/listener/VoiceLeaveListener.java
new file mode 100644
index 0000000..35f4644
--- /dev/null
+++ b/src/main/java/com/bbn/hadder/listener/VoiceLeaveListener.java
@@ -0,0 +1,24 @@
+package com.bbn.hadder.listener;
+
+import com.bbn.hadder.audio.AudioManager;
+import com.bbn.hadder.audio.TrackManager;
+import net.dv8tion.jda.api.events.guild.voice.GuildVoiceLeaveEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+/**
+ * @author Skidder / GregTCLTK
+ */
+
+public class VoiceLeaveListener extends ListenerAdapter {
+
+ @Override
+ public void onGuildVoiceLeave(GuildVoiceLeaveEvent event) {
+ if (new AudioManager().hasPlayer(event.getGuild())) {
+ TrackManager manager = new AudioManager().getTrackManager(event.getGuild());
+ manager.getQueuedTracks().stream()
+ .filter(info -> !info.getTrack().equals(new AudioManager().getPlayer(event.getGuild()).getPlayingTrack())
+ && info.getAuthor().getUser().equals(event.getMember().getUser()))
+ .forEach(manager::remove);
+ }
+ }
+}
diff --git a/src/main/java/com/bbn/hadder/utils/AudioPlayerSendHandler.java b/src/main/java/com/bbn/hadder/utils/AudioPlayerSendHandler.java
deleted file mode 100644
index ff3f483..0000000
--- a/src/main/java/com/bbn/hadder/utils/AudioPlayerSendHandler.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.bbn.hadder.utils;
-
-/*
- * @author Skidder / GregTCLTK
- */
-
-import net.dv8tion.jda.api.audio.AudioSendHandler;
-
-import javax.annotation.Nullable;
-import java.nio.ByteBuffer;
-
-public class AudioPlayerSendHandler implements AudioSendHandler {
-
- @Override
- public boolean canProvide() {
- return false;
- }
-
- @Nullable
- @Override
- public ByteBuffer provide20MsAudio() {
-
- return null;
- }
-}
diff --git a/src/main/java/com/bbn/hadder/utils/MessageEditor.java b/src/main/java/com/bbn/hadder/utils/MessageEditor.java
index 2f22d85..c7205f1 100644
--- a/src/main/java/com/bbn/hadder/utils/MessageEditor.java
+++ b/src/main/java/com/bbn/hadder/utils/MessageEditor.java
@@ -56,7 +56,7 @@ public class MessageEditor {
switch (type) {
case INFO:
builder
- .setColor(new Color(47, 94, 105))
+ .setColor(new Color(78, 156, 174))
.setFooter("Hadder", "https://bigbotnetwork.com/images/Hadder.png")
.setTimestamp(Instant.now());
break;
diff --git a/src/main/resources/Translations/Translations_de.properties b/src/main/resources/Translations/Translations_de.properties
index 70f5ff4..c5de023 100644
--- a/src/main/resources/Translations/Translations_de.properties
+++ b/src/main/resources/Translations/Translations_de.properties
@@ -2,137 +2,130 @@
# @author Skidder / GregTCLTK
#
-#
-# @author Skidder / GregTCLTK
-#
-
-Hadder = Hadderino
+Hadder = Hadder
+user = <@Benutzer>
searchterm =
username =
-number = /all
-guildprefix =
-prefix =
-vc-name/id =
-user+nickname = <@user>
-region =
+number = /all
+prefix =
+userprefix =
+vc-name/id =
+user+nickname = <@Benutzer>
+region =
guildid =
+content =
+song =
-error = Error
-none = None
-success\! = Success\!
+error = Fehler
+none = Nicht angegeben
+success\! = Erfolgreich\!
-commands.fun.avatar.success.title = Avatar of %extra%
-commands.fun.avatar.help.description = Sends the avatar of the specified member.
-commands.fun.gif.error.description = Please try again with another term.
-commands.fun.gif.help.description = Look for a GIF on Giphy
-commands.fun.meme.success.title = Your random meme
-commands.fun.meme.api.error = The request to the meme API could not be processed. Please try it again later.
-commands.fun.meme.help.description = Sends you a random meme.
+commands.fun.avatar.success.title = Avatar von %extra%
+commands.fun.avatar.help.description = Sendet den Avatar des angegebenen Benutzers.
+commands.fun.gif.error.description = Bitte versuche es mit einem anderen Begriff erneut.
+commands.fun.gif.help.description = Sucht nach einem GIF auf Giphy.
+commands.fun.meme.success.title = Dein zufälliges Meme\:
+commands.fun.meme.api.error = Die Anfrage an die Meme-API konnte nicht verarbeitet werden. Bitte versuche es später erneut.
+commands.fun.meme.help.description = Sendet dir einen zufälligen Meme.
+commands.fun.clyde.help.description = Sends a message as a webhook named Clyde.
-commands.general.about.success.title = Hadder - About
-commands.general.about.success.description = Hadder is an open source Discord bot.
-commands.general.about.success.field.one.title = Support the Developers
-commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it you donate some money [here]%extra%
-commands.general.about.help.description = Shows infos about Hadder
-commands.general.equals.string.first.request = Please send me the first String
-commands.general.equals.string.second.request = Please send me the second String
-commands.general.equals.string.equals.true = Yes\! The first string equals the second string\!
-commands.general.equals.string.equals.false = Well yes but actually No. This isn't the same.
-commands.general.equals.string.first = First String
-commands.general.equals.string.second = Second String
-commands.general.equals.string.result = Result
-commands.general.equals.help.description = Check if two strings are the same
-commands.general.help.field.usage = Benutzung
-commands.general.help.error.description = I need the Embed Links Permission to send the Help Menu\!
-commands.general.help.help.description = Shows each command or explains its usage
+commands.general.about.success.title = Hadder - Info
+commands.general.about.success.description = Hadder ist ein Open-Source Discord Bot.
+commands.general.about.success.field.one.title = Support the developers
+commands.general.about.success.field.one.description = Hadder ist für alle völlig kostenlos. Wir würden es begrüßen, wenn du etwas Geld an uns spendest. Klicken [hier]%extra%, um zu spenden.
+commands.general.about.help.description = Zeigt Informationen über Hadder.
+commands.general.equals.string.first.request = Bitte sende mir den ersten String.
+commands.general.equals.string.second.request = Bitte sende mir den zweiten String.
+commands.general.equals.string.equals.true = Ja\! Der erste String entspricht dem zweiten String\!
+commands.general.equals.string.equals.false = Ja, aber eigentlich nein. Das ist nicht dasselbe.
+commands.general.equals.string.first = First string\:
+commands.general.equals.string.second = Second string\:
+commands.general.equals.string.result = Ergebnis\:
+commands.general.equals.help.description = Prüft ob zwei Strings gleich sind
+commands.general.help.field.usage = Benutzung\:
+commands.general.help.error.description = Ich brauche die Links Einbetten Berechtigung, um das Hilfe-Menü zu senden\!
+commands.general.help.help.description = Zeigt jeden Befehl an und erklärt seine Verwendung.
commands.general.help.help.label = [CommandName]
-commands.general.invite.success.title = Invite me\!
-commands.general.invite.success.description = [Invite me here\!]%extra%
-commands.general.invite.help.description = Shows the invitation to invite Hadder to your server
-commands.general.ping.help.description = Shows the ping to the Discord API
+commands.general.invite.success.title = Lade mich ein\!
+commands.general.invite.success.description = [Lade mich hier ein\!]%extra%
+commands.general.invite.help.description = Zeigt den Einladungslink an, um Hadder auf deinen Server einzuladen.
+commands.general.ping.help.description = Zeigt den Ping zur Discord API
-commands.misc.feedback.title.request.title = Feedback Topic
-commands.misc.feedback.title.request.description = Please send me the feedback topic.
-commands.misc.feedback.description.request.title = Feedback Description
-commands.misc.feedback.description.request.description = Please send me the feedback description now.
-commands.misc.feedback.help.description = Sends feedback directly to the developers.
-commands.misc.feedback.success.title = Feedback successfully sent
-commands.misc.github.link.title = Link your GitHub Account
-commands.misc.github.success.title = Information about %extra%
-commands.misc.github.success.bio = User bio
-commands.misc.github.success.location = Location
-commands.misc.github.success.website = Website
-commands.misc.github.success.repositories = Public repositories
-commands.misc.github.success.gists = Public gists
-commands.misc.github.success.followers = Followers
-commands.misc.github.success.following = Following
-commands.misc.github.api.error.description = The GitHub API might be down at the moment\!
-commands.misc.github.user.error.description = This user does not exist\!
-commands.misc.github.connect.title = Connect you GH account
-commands.misc.github.connect.description = [Please connect your GitHub account here]%extra%
-commands.misc.github.help.description = Displays information about a GitHub user profile.
-commands.misc.screenshare.success.title = Here's your Url to share your Screen
-commands.misc.screenshare.id.error.title = Wait that's illegal
-commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID? \n\nNote\: Make sure the Voice Channel is on this Guild.
-commands.misc.screenshare.channel.error.title = Please Choose a Voice Channel
-commands.misc.screenshare.channel.error.description = There is more than one channel with this name
+commands.misc.feedback.title.request.title = Feedback-Thema
+commands.misc.feedback.title.request.description = Bitte senden Sie mir das Thema des Feedbacks.
+commands.misc.feedback.description.request.title = Feedback Beschreibung
+commands.misc.feedback.description.request.description = Bitte senden Sie mir jetzt die Feedback Beschreibung.
+commands.misc.feedback.help.description = Sendet Feedback direkt an die Entwickler.
+commands.misc.feedback.success.title = Feedback erfolgreich gesendet\!
+commands.misc.github.link.title = Verbinde dein GitHub Konto
+commands.misc.github.success.title = Informationen über %extra%
+commands.misc.github.success.bio = Biographie
+commands.misc.github.success.location = Standort
+commands.misc.github.success.website = Webseite
+commands.misc.github.success.repositories = Öffentliche Repositories
+commands.misc.github.success.gists = Öffentliche Gists
+commands.misc.github.success.followers = Abonnenten
+commands.misc.github.success.following = Folgt
+commands.misc.github.api.error.description = Die GitHub API könnte im Moment nicht verfügbar sein\!
+commands.misc.github.user.error.description = Dieser Benutzer existiert nicht\!
+commands.misc.github.connect.title = Verbinde dein GH Konto
+commands.misc.github.connect.description = [Bitte verbinde dein GitHub-Konto hier]%extra%
+commands.misc.github.help.description = Zeigt Informationen über ein GitHub Benutzerprofil an.
+commands.misc.screenshare.success.title = Here's your URL to share your Screen
+commands.misc.screenshare.id.error.title = Warte. Das ist illegal.
+commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID. \n\nNote\: Make sure the Voice Channel is in this Guild.
+commands.misc.screenshare.channel.error.title = Please choose a Voice Channel
+commands.misc.screenshare.channel.error.description = Es gibt mehr als einen Sprachkanal mit diesem Namen
commands.misc.screenshare.number.error.title = You specified a wrong number\!
-commands.misc.screenshare.number.error.description = This isn't a Number.
-commands.misc.screenshare.channel.existing.error = Hol' up
-commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is on this Guild.
+commands.misc.screenshare.number.error.description = Dies ist keine Zahl.
+commands.misc.screenshare.channel.existing.error = Warte ma'
+commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is in this Guild.
commands.misc.screenshare.help.description = Shows you the link to share your screen.
commands.moderation.ban.success.title = %extra% Successfully banned %extra%
commands.moderation.ban.success.description = I successfully baned %extra%
-commands.moderation.ban.error.title = Not possible
-commands.moderation.ban.myself.error.description = I can not ban myself\!
-commands.moderation.ban.yourself.error.description = You can not ban yourself\!
-commands.moderation.ban.massban.success.description = I successfully baned %extra% Members\!
+commands.moderation.ban.error.title = Nicht möglich
+commands.moderation.ban.myself.error.description = Ich kann mich nicht selbst bannen\!
+commands.moderation.ban.yourself.error.description = Du kannst dich nicht selbst bannen\!
+commands.moderation.ban.massban.success.description = Ich habe erfolgreich %extra% Mitglieder gebannt\!
commands.moderation.ban.help.description = Bans one ore more user from the server
-commands.moderation.lear.all.success.title = Successfully deleted
-commands.moderation.lear.all.success.description = I successfully deleted %extra% messages.
-commands.moderation.clear.number.error.description = You have to choose a number between 1 and 99\!
-commands.moderation.clear.success.description = Successfully deleted %extra% messages.
-commands.moderation.clear.message.error.title = No messages\!
-commands.moderation.clear.message.error.description = There are no messages in this channel.
-commands.moderation.clear.help.description = Deletes the specified number of messages.
+commands.moderation.lear.all.success.title = Erfolgreich gelöscht
+commands.moderation.lear.all.success.description = Ich habe erfolgreich %extra% Nachrichten gelöscht.
+commands.moderation.clear.number.error.description = Sie müssen eine Zahl zwischen 1 und 99 wählen\!
+commands.moderation.clear.success.description = Ich habe erfolgreich %extra% Nachrichten gelöscht.
+commands.moderation.clear.message.error.title = Keine Nachrichten\!
+commands.moderation.clear.message.error.description = Es gibt keine Nachrichten in diesem Kanal.
+commands.moderation.clear.help.description = Löscht die angegebene Anzahl von Nachrichten.
commands.moderation.prefix.success.title = %extra% Successfully set %extra%
-commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to %extra%
+commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to `%extra%`.
commands.moderation.prefix.error.description = The prefix must not contain **"**
commands.moderation.prefix.help.description = Sets the Guild-Prefix.
-commands.moderation.invitedetect.activate.success.title = Successfully activated
+commands.moderation.invitedetect.activate.success.title = Erfolgreich aktiviert
commands.moderation.invitedetect.activate.success.description = I successfully activated the invite link detection for this guild.
-commands.moderation.invitedetect.activate.error.title = Already activated
+commands.moderation.invitedetect.activate.error.title = Bereits aktiviert
commands.moderation.invitedetect.activate.error.description = The invite link detection is already activated on this guild.
-commands.moderation.invitedetect.deactivate.success.title = Successfully deactivated
+commands.moderation.invitedetect.deactivate.success.title = Erfolgreich deaktiviert
commands.moderation.invitedetect.deactivate.success.description = I successfully deactivated the invite link detection for this guild.
-commands.moderation.invitedetect.deactivate.error.title = Already deactivated
-commands.moderation.invitedetect.deactivate.error.description = The invite link detection is already deactivated on this guild.
-commands.moderation.invitedetect.help.description = Activate or deactivate the Discord invite link detection.
-commands.moderation.kick.success.title = %extra% Successfully kicked %extra%
-commands.moderation.kick.success.description = I successfully kicked %extra%.
-commands.moderation.kick.error.title = Not possible
-commands.moderation.kick.myself.error.description = I can not kick myself\!
-commands.moderation.kick.yourself.error.description = You can't kick yourself.
-commands.moderation.kick.mass.success.description = I successfully kicked 69 Members\!
-commands.moderation.kick.help.description = Kicks one or more user from the server.
-commands.moderation.kick.masskick.success.description = I successfully kicked %extra% members.
-commands.moderation.link.request.success.description = If i'm on this guild i sent a message to accept the link.
-commands.moderation.link.error.title = Wait that's illegal.
-commands.moderation.link.request.error.description = You specified the same guild as the guild on which you're reading this
-commands.moderation.link.request.accept.title = ) wants to link guilds\!
-commands.moderation.link.request.accept.description = React with the reactions to accept or decline it
-commands.moderation.link.set.title = Set the thing boi
-commands.moderation.link.help.description = Links two or more servers.
+commands.moderation.invitedetect.deactivate.error.title = Bereits deaktiviert
+commands.moderation.invitedetect.deactivate.error.description = Die Einladungslink-Erkennung ist auf dieser Guild bereits deaktiviert.
+commands.moderation.invitedetect.help.description = Aktiviert oder deaktiviert die Discord Einladungserkennung.
+commands.moderation.kick.success.title = %extra% Erfolgreich gekickt %extra%
+commands.moderation.kick.success.description = Ich habe %extra% erfolgreich gekickt.
+commands.moderation.kick.error.title = Nicht möglich
+commands.moderation.kick.myself.error.description = Ich kann mich nicht selbst kicken\!
+commands.moderation.kick.yourself.error.description = Du kannst dich nicht selbst kicken.
+commands.moderation.kick.mass.success.description = I successfully kicked %extra% Members\!
+commands.moderation.kick.help.description = Wirft einen oder mehrere Benutzer vom Server.
+commands.moderation.kick.masskick.success.description = Ich habe %extra% Mitglieder erfolgreich gekickt.
commands.moderation.nick.success.title = %extra% Successfully nicked %extra%
commands.moderation.nick.success.description = I successfully nicked %extra%.
-commands.moderation.nick.myself.success.description = I successfully changed my nickname.
+commands.moderation.nick.myself.success.description = Ich habe meinen Spitznamen erfolgreich geändert.
commands.moderation.nick.massnick.success.description = I successfully nicked %extra% Members.
-commands.moderation.nick.help.description = Rename a one or more user.
-commands.moderation.regionchange.regions.title = All regions
-commands.moderation.regionchange.success.title = Successfully set region
-commands.moderation.regionchange.success.description = I successfully set the new server region to %extra%.
+commands.moderation.nick.help.description = Benennt einen oder mehrere Benutzer um.
+commands.moderation.regionchange.regions.title = Alle Regionen
+commands.moderation.regionchange.success.title = Region erfolgreich gesetzt
+commands.moderation.regionchange.success.description = Ich habe die neue Serverregion erfolgreich zu %extra% geändert.
commands.moderation.regionchange.help.description = Changes the server region to locked regions.
commands.moderation.role.add.success.title = %extra% Successfully added role(s) %extra%
commands.moderation.role.add.success.description = I successfully added %extra% roles to %extra_two% members.
@@ -141,29 +134,44 @@ commands.moderation.role.remove.success.description = I successfully removed %ex
commands.moderation.role.help.description = Adds and removes one or more role(s) from one or more user(s)
commands.moderation.rules.setup.title = Set up rules
commands.moderation.rules.setup.description = Welcome to the Hadder rules setup. Please mention the channel in which I should send the rules. Your message should look like\: \#rules or \#verify.
-commands.moderation.rules.channel.error.title = Channel not found
-commands.moderation.rules.channel.error.description = I can't find the specified channel. Please start the setup again.
-commands.moderation.rules.rules.title = Rules
-commands.moderation.rules.rules.description = The channel was successfully set to %extra%. Please send me the rules now.
+commands.moderation.rules.channel.error.title = Kanal konnte nicht gefunden werden
+commands.moderation.rules.channel.error.description = Ich kann den angegebenen Kanal nicht finden. Bitte starte das Setup erneut.
+commands.moderation.rules.rules.title = Rules message
+commands.moderation.rules.rules.description = Der Kanal wurde erfolgreich auf %extra% gesetzt. Bitte senden Sie mir jetzt die Regeln.
commands.moderation.rules.role.title = Role to assign
commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives after he accepted the rules.
-commands.moderation.rules.role.error.title = Role does not exist
+commands.moderation.rules.role.error.title = Rolle existiert nicht
commands.moderation.rules.role.error.description = The specified role does not exist on this guild.
-commands.moderation.rules.guild.error.title = Wrong Guild
+commands.moderation.rules.guild.error.title = Falsche Guild
commands.moderation.rules.guild.error.description = The mentioned channel must be on this guild\!
commands.moderation.rules.emote.accept.title = Custom Accept Emote
commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified.
commands.moderation.rules.emote.decline.title = Custom Decline Emote
commands.moderation.rules.emote.decline.description = The first emote has been successfully set to %extra%. Please send me now the decline emote.
-commands.moderation.rules.success.title = Successfully set the rules
-commands.moderation.rules.success.description = I successfully send the rules in %extra%.
commands.moderation.rules.emote.error.access.description = I can not access the custom emote(s).
commands.moderation.rules.emote.error.equal.title = Emotes are equal
commands.moderation.rules.emote.error.equal.description = The 1st and 2nd emote equals each other.
commands.moderation.rules.emoji.decline.description = The first emote has been successfully set. Please send me now the decline emote.
commands.moderation.rules.emoji.error.description = The given emote can't be used.
+commands.moderation.rules.success.title = Successfully set the rules
+commands.moderation.rules.success.description = I successfully send the rules in %extra%.
+commands.moderation.rules.error.message.title = Can't write messages
+commands.moderation.rules.error.message.description = I can not write messages in the specified channel
commands.moderation.rules.help.description = Setup the rules on your Discord server
-commands.moderation.starboard.successchannel=Successfully set the Channel\!
+commands.moderation.starboard.success.title = Successfully set the Channel\!
+commands.moderation.editrules.channel.title = Rules channel
+commands.moderation.editrules.channel.description = Please send me the channel with the rules as mention
+commands.moderation.editrules.channel.found.error.title = Kanal konnte nicht gefunden werden
+commands.moderation.editrules.channel.found.error.description = I can't find the specified channel. Please start the edit process again.
+commands.moderation.editrules.channel.message.error.title = No rules message
+commands.moderation.editrules.channel.message.error.description = I can not find the rules message in the specified channel.
+commands.moderation.editrules.message.title = New message
+commands.moderation.editrules.message.description = Please send me the new rules message now.
+commands.moderation.editrules.error.title = No rules
+commands.moderation.editrules.error.description = There is nor rules message in this server. Please setup the rules first with %extra%rules
+commands.moderation.editrules.success.title = Successfully changed
+commands.moderation.editrules.success.description = I successfully changed the rules
+commands.moderation.editrules.help.description = Edits the rules message.
commands.music.join.success.title = Successfully connected
commands.music.join.success.description = I successfully connected to %extra%.
@@ -174,91 +182,69 @@ commands.music.join.error.connecting.trying.description = Hadder is already tryi
commands.music.join.error.channel.title = No Voice Channel
commands.music.join.error.channel.description = You aren't in a Voice Channel.
commands.music.join.help.description = Joins your voice channel
-commands.music.leave.success.title = \= Successfully disconnected
+commands.music.leave.success.title = Successfully disconnected
commands.music.leave.success.description = I successfully disconnected from the Voice Channel
-commands.music.leave.error.tile = Not connected
-commands.music.leave.error.description = I'm currently in no Voice Channel on this Guild
-commands.music.leave.help.description = Leaves a voice channel
+commands.music.leave.error.tile = Nicht verbunden
+commands.music.leave.error.description = Ich bin derzeit in keinem Sprachkanal auf dieser Guild
+commands.music.leave.help.description = Verlässt einen Sprachkanal
+commands.music.play.load.title = %extra% Now loading %extra%
+commands.music.play.load.description = Trying to load the song...
+commands.music.play.success.loading.title = %extra% Now playing %extra%
+commands.music.play.error.load.title = %extra% Load failed %extra%
+commands.music.play.error.load.description = Unfortunately I can not load the given song.
+commands.music.play.error.match.title = %extra% No matches %extra%
+commands.music.play.error.match.description = I can not find a song named this on YouTube.
+commands.music.play.success.title = Title
+commands.music.play.success.author = Author
+commands.music.play.success.length = Length
+commands.music.play.help.description = Plays a song
+commands.music.stop.success.title = Successfully stopped
+commands.music.stop.success.description = I successfully stopped the song.
+commands.music.stop.help.description = Stops the song
+commands.music.queue.error.title = No queue
+commands.music.queue.error.description = There are no queued songs at the moment
+commands.music.queue.success.title = Queue
+commands.music.queue.success.description = This is the queue\: %extra%
-commands.nsfw.gif.error.title = GIF not showing? Click here
-commands.nsfw.img.error.title = Image not showing? Click here
-commands.nsfw.anal.help.description = Shows a random anal gif.
-commands.nsfw.bdsm.help.description = Shows a random BDSM picture.
-commands.nsfw.blowjob.help.description = Shows a random Blowjob picture.
-commands.nsfw.boobs.help.description = Shows a random boob gif.
-commands.nsfw.cum.help.description = Shows a random cum gif.
-commands.nsfw.erotic.help.description = Shows a random erotic picture.
-commands.nsfw.feet.help.description = Shows a random feet gif.
+commands.nsfw.gif.error.title = GIF wird nicht angezeigt? Klicke hier
+commands.nsfw.img.error.title = Bild wird nicht angezeigt? Klicke hier
+commands.nsfw.anal.help.description = Zeigt einen zufälligen Anal GIF.
+commands.nsfw.bdsm.help.description = Zeigt ein zufälliges BDSM Bild.
+commands.nsfw.blowjob.help.description = Zeigt ein zufälliges Blowjob Bild.
+commands.nsfw.boobs.help.description = Zeigt einen zufälligen Boob GIF.
+commands.nsfw.cum.help.description = Zeigt einen zufälligen Cum GIF.
+commands.nsfw.erotic.help.description = Zeigt ein zufälliges Erotik Bild.
+commands.nsfw.feet.help.description = Zeigt einen zufälligen Feet GIF.
commands.nsfw.fingering.help.description = Shows a random fingering gif.
commands.nsfw.linking.help.description = Shows a random licking gif.
-commands.nsfw.porn.help.description = Shows a random porn gif.
-commands.nsfw.pussy.help.description = Shows a random pussy gif.
-commands.nsfw.randomporn.help.description = Shows a completely random porn gif.
-commands.nsfw.solo.help.description = Shows a random solo gif.
+commands.nsfw.porn.help.description = Zeigt einen zufälligen Porn GIF.
+commands.nsfw.pussy.help.description = Zeigt einen zufälligen Pussy GIF.
+commands.nsfw.randomporn.help.description = Zeigt ein völlig zufälliges Porno GIF.
+commands.nsfw.solo.help.description = Zeigt einen zufälligen Solo GIF.
commands.nsfw.spank.help.description = Shows a random spank gif.
-commands.nsfw.trans.help.description = Shows a random trans picture.
+commands.nsfw.trans.help.description = Zeigt ein zufälliges Trans Bild.
commands.owner.eval.success.title = Eval Command
-commands.owner.eval.success.input = Input
-commands.owner.eval.success.output = Output
+commands.owner.eval.success.input = Eingabe
+commands.owner.eval.success.output = Ausgabe
commands.owner.eval.success.timing = Timing
-commands.owner.eval.help.description = Execute the given code
+commands.owner.eval.help.description = Führt den angegebenen Code aus
commands.owner.eval.help.usage =
-commands.owner.guildleave.success.title = Successfully left
-commands.owner.guildleave.success.description = I successfully left %extra%.
+commands.owner.guildleave.success.title = Erfolgreich verlassen
+commands.owner.guildleave.success.description = Ich habe %extra% erfolgreich verlassen.
+commands.owner.guildleave.error.title = Verlassen nicht möglich
+commands.owner.guildleave.error.description = I can not leave from this guild. Maybe this isn't a ID?
commands.owner.guildleave.help.description = Quit from a guild
commands.owner.reboot.help.description = Restart the bot
-commands.owner.shutdown.success.title = Shutdown
+commands.owner.shutdown.success.title = Fährt herrunter
commands.owner.shutdown.help.description = Shuts the Bot down
commands.owner.test.success = TEST my friends
commands.owner.test.help.description = Just a little Test Command
commands.settings.language.success.title = Language set
-commands.settings.language.success.description = %extra% is your new language now.
-commands.settings.language.help.description = Sets the new primary language for a user.
+commands.settings.language.success.description = `%extra%` is your new language now.
+commands.settings.language.help.description = Führt den angegebenen Code aus.
commands.settings.language.help.usage =
commands.settings.prefix.success.title = %extra% Successfully set %extra%
-commands.settings.prefix.success.description = I successfully set the new prefix for you to %extra%.
-commands.settings.prefix.help.description = Sets a new Prefix
-
-commands.moderation.ban.success.title=Successfully banned
-commands.moderation.ban.success.description=I successfully baned
-commands.moderation.ban.error.title=Not possible
-commands.moderation.ban.myself.error.description=I can not ban myself\!
-commands.moderation.ban.yourself.error.description=You can't ban yourself\!
-commands.moderation.ban.help.description=Bans one ore more user from the server
-commands.moderation.clear.number.error.description=You have to choose a number between 1 and 200\!
-commands.moderation.clear.success.description=Successfully deleted 69 messages.
-commands.moderation.clear.help.description=Deletes the specified number of messages.
-commands.moderation.prefix.success.title=Successfully set
-commands.moderation.prefix.success.description=I successfully set the new prefix for the guild to
-commands.moderation.prefix.error.description=The prefix must not contain ****
-commands.moderation.prefix.help.description=Sets the Guild-Prefix.
-commands.moderation.invitedetect.activate.success.title=Successfully activated
-commands.moderation.invitedetect.activate.success.description=I successfully activated the invite link detection for this guild.
-commands.moderation.invitedetect.activate.error.title=Already activated
-commands.moderation.invitedetect.activate.error.description=The invite link detection is already activated on this guild.
-commands.moderation.invitedetect.deactivate.success.title=Successfully deactivated
-commands.moderation.invitedetect.deactivate.success.description=I successfully deactivated the invite link detection for this guild.
-commands.moderation.invitedetect.deactivate.error.title=Already deactivated
-commands.moderation.invitedetect.deactivate.error.description=The invite link detection is already deactivated on this guild.
-commands.moderation.invitedetect.help.description=Activate or deactivate the Discord invite link detection.
-commands.moderation.kick.success.title=Successfully kicked
-commands.moderation.kick.success.description=I successfully kicked
-commands.moderation.kick.myself.error.description=I can not kick myself\!
-commands.moderation.kick.yourself.error.description=You can't kick yourself.
-commands.moderation.kick.mass.success.description=I successfully kicked 69 Members\!
-commands.moderation.kick.help.description=Kicks one or more user from the server.
-commands.moderation.link.request.success.description=If i'm on this guild i sent a message to accept the link.
-commands.moderation.link.error.title=Wait that's illegal.
-commands.moderation.link.request.error.description=You specified the same guild as the guild on which you're reading this
-commands.moderation.link.request.accept.title=Skidder wants to link guilds\!
-commands.moderation.link.request.accept.description=React with the reactions to accept or decline it
-commands.moderation.link.set.title=Set the thing boi
-commands.moderation.link.help.description=Links two or more servers.
-commands.moderation.nick.success.title=Successfully nicked
-commands.moderation.nick.success.description=I successfully nicked
-commands.moderation.nick.myself.success.description=I successfully changed my nickname.
-commands.moderation.nick.mass.success.description=I successfully nicked 69 Members\!
-commands.moderation.nick.help.description=Rename a one or more user.
-commands.moderation.starboard.successchannel=
+commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`.
+commands.settings.prefix.help.description = Sets a new prefix.
diff --git a/src/main/resources/Translations/Translations_en.properties b/src/main/resources/Translations/Translations_en.properties
index c72b94c..2da7c59 100644
--- a/src/main/resources/Translations/Translations_en.properties
+++ b/src/main/resources/Translations/Translations_en.properties
@@ -15,6 +15,8 @@ user+nickname = <@user>
region =
guildid =
content =
+song =
+user/id= [@User]/[ID]
error = Error
none = None
@@ -23,32 +25,32 @@ success\! = Success\!
commands.fun.avatar.success.title = Avatar of %extra%
commands.fun.avatar.help.description = Sends the avatar of the specified member.
commands.fun.gif.error.description = Please try again with another term.
-commands.fun.gif.help.description = Look for a GIF on Giphy
-commands.fun.meme.success.title = Your random meme
-commands.fun.meme.api.error = The request to the meme API could not be processed. Please try it again later.
+commands.fun.gif.help.description = Looks for a GIF on Giphy.
+commands.fun.meme.success.title = Your random meme\:
+commands.fun.meme.api.error = The request to the meme API could not be processed. Please try again later.
commands.fun.meme.help.description = Sends you a random meme.
-commands.fun.clyde.help.description = Send a message as a webhook named Clyde.
+commands.fun.clyde.help.description = Sends a message as a webhook named Clyde.
commands.general.about.success.title = Hadder - About
commands.general.about.success.description = Hadder is an open source Discord bot.
-commands.general.about.success.field.one.title = Support the Developers
-commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it you donate some money [here]%extra%
-commands.general.about.help.description = Shows infos about Hadder
-commands.general.equals.string.first.request = Please send me the first String
-commands.general.equals.string.second.request = Please send me the second String
+commands.general.about.success.field.one.title = Support the developers
+commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it if you donated some money to us. Click [here]%extra% to donate.
+commands.general.about.help.description = Shows information about Hadder.
+commands.general.equals.string.first.request = Please send me the first String.
+commands.general.equals.string.second.request = Please send me the second String.
commands.general.equals.string.equals.true = Yes\! The first string equals the second string\!
commands.general.equals.string.equals.false = Well yes but actually No. This isn't the same.
-commands.general.equals.string.first = First String
-commands.general.equals.string.second = Second String
-commands.general.equals.string.result = Result
+commands.general.equals.string.first = First string\:
+commands.general.equals.string.second = Second string\:
+commands.general.equals.string.result = Result\:
commands.general.equals.help.description = Check if two strings are the same
-commands.general.help.field.usage = Usage
+commands.general.help.field.usage = Usage\:
commands.general.help.error.description = I need the Embed Links Permission to send the Help Menu\!
-commands.general.help.help.description = Shows each command or explains its usage
+commands.general.help.help.description = Shows each command and explains its usage.
commands.general.help.help.label = [CommandName]
commands.general.invite.success.title = Invite me\!
commands.general.invite.success.description = [Invite me here\!]%extra%
-commands.general.invite.help.description = Shows the invitation to invite Hadder to your server
+commands.general.invite.help.description = Shows the invitation link to invite Hadder to your server.
commands.general.ping.help.description = Shows the ping to the Discord API
commands.misc.feedback.title.request.title = Feedback Topic
@@ -56,7 +58,7 @@ commands.misc.feedback.title.request.description = Please send me the feedback t
commands.misc.feedback.description.request.title = Feedback Description
commands.misc.feedback.description.request.description = Please send me the feedback description now.
commands.misc.feedback.help.description = Sends feedback directly to the developers.
-commands.misc.feedback.success.title = Feedback successfully sent
+commands.misc.feedback.success.title = Feedback successfully sent\!
commands.misc.github.link.title = Link your GitHub Account
commands.misc.github.success.title = Information about %extra%
commands.misc.github.success.bio = User bio
@@ -68,21 +70,21 @@ commands.misc.github.success.followers = Followers
commands.misc.github.success.following = Following
commands.misc.github.api.error.description = The GitHub API might be down at the moment\!
commands.misc.github.user.error.description = This user does not exist\!
-commands.misc.github.connect.title = Connect you GH account
+commands.misc.github.connect.title = Connect your GH account
commands.misc.github.connect.description = [Please connect your GitHub account here]%extra%
commands.misc.github.help.description = Displays information about a GitHub user profile.
-commands.misc.screenshare.success.title = Here's your Url to share your Screen
-commands.misc.screenshare.id.error.title = Wait that's illegal
-commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID? \n\nNote\: Make sure the Voice Channel is on this Guild.
-commands.misc.screenshare.channel.error.title = Please Choose a Voice Channel
+commands.misc.screenshare.success.title = Here's your URL to share your Screen
+commands.misc.screenshare.id.error.title = Wait. That's illegal.
+commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID. \n\nNote\: Make sure the Voice Channel is in this Guild.
+commands.misc.screenshare.channel.error.title = Please choose a Voice Channel
commands.misc.screenshare.channel.error.description = There is more than one channel with this name
commands.misc.screenshare.number.error.title = You specified a wrong number\!
commands.misc.screenshare.number.error.description = This isn't a Number.
commands.misc.screenshare.channel.existing.error = Hol' up
-commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is on this Guild.
+commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is in this Guild.
commands.misc.screenshare.help.description = Shows you the link to share your screen.
-commands.moderation.ban.success.title = %extra% Successfully banned %extra%
+commands.moderation.ban.success.title = Successfully banned
commands.moderation.ban.success.description = I successfully baned %extra%
commands.moderation.ban.error.title = Not possible
commands.moderation.ban.myself.error.description = I can not ban myself\!
@@ -91,9 +93,11 @@ commands.moderation.ban.massban.success.description = I successfully baned %extr
commands.moderation.ban.help.description = Bans one ore more user from the server
commands.moderation.lear.all.success.title = Successfully deleted
commands.moderation.lear.all.success.description = I successfully deleted %extra% messages.
-commands.moderation.clear.number.error.description = You have to choose a number between 1 and 99!
-commands.moderation.clear.success.description = Successfully deleted %extra% messages.
-commands.moderation.clear.message.error.title = No messages!
+commands.moderation.clear.number.error.description = You have to choose a number between 1 and 99\!
+commands.moderation.clear.success.title = Successfully cleared
+commands.moderation.clear.success.description.singular = Successfully deleted one message.
+commands.moderation.clear.success.description.plural = Successfully deleted %extra% messages.
+commands.moderation.clear.message.error.title = No messages\!
commands.moderation.clear.message.error.description = There are no messages in this channel.
commands.moderation.clear.help.description = Deletes the specified number of messages.
commands.moderation.prefix.success.title = %extra% Successfully set %extra%
@@ -114,16 +118,9 @@ commands.moderation.kick.success.description = I successfully kicked %extra%.
commands.moderation.kick.error.title = Not possible
commands.moderation.kick.myself.error.description = I can not kick myself\!
commands.moderation.kick.yourself.error.description = You can't kick yourself.
-commands.moderation.kick.mass.success.description = I successfully kicked 69 Members\!
+commands.moderation.kick.mass.success.description = I successfully kicked %extra% Members\!
commands.moderation.kick.help.description = Kicks one or more user from the server.
commands.moderation.kick.masskick.success.description = I successfully kicked %extra% members.
-commands.moderation.link.request.success.description = If i'm on this guild i sent a message to accept the link.
-commands.moderation.link.error.title = Wait that's illegal.
-commands.moderation.link.request.error.description = You specified the same guild as the guild on which you're reading this
-commands.moderation.link.request.accept.title = ) wants to link guilds\!
-commands.moderation.link.request.accept.description = React with the reactions to accept or decline it
-commands.moderation.link.set.title = Set the thing boi
-commands.moderation.link.help.description = Links two or more servers.
commands.moderation.nick.success.title = %extra% Successfully nicked %extra%
commands.moderation.nick.success.description = I successfully nicked %extra%.
commands.moderation.nick.myself.success.description = I successfully changed my nickname.
@@ -142,7 +139,7 @@ commands.moderation.rules.setup.title = Set up rules
commands.moderation.rules.setup.description = Welcome to the Hadder rules setup. Please mention the channel in which I should send the rules. Your message should look like\: \#rules or \#verify.
commands.moderation.rules.channel.error.title = Channel not found
commands.moderation.rules.channel.error.description = I can't find the specified channel. Please start the setup again.
-commands.moderation.rules.rules.title = Rules
+commands.moderation.rules.rules.title = Rules message
commands.moderation.rules.rules.description = The channel was successfully set to %extra%. Please send me the rules now.
commands.moderation.rules.role.title = Role to assign
commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives after he accepted the rules.
@@ -154,15 +151,30 @@ commands.moderation.rules.emote.accept.title = Custom Accept Emote
commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified.
commands.moderation.rules.emote.decline.title = Custom Decline Emote
commands.moderation.rules.emote.decline.description = The first emote has been successfully set to %extra%. Please send me now the decline emote.
-commands.moderation.rules.success.title = Successfully set the rules
-commands.moderation.rules.success.description = I successfully send the rules in %extra%.
commands.moderation.rules.emote.error.access.description = I can not access the custom emote(s).
commands.moderation.rules.emote.error.equal.title = Emotes are equal
commands.moderation.rules.emote.error.equal.description = The 1st and 2nd emote equals each other.
commands.moderation.rules.emoji.decline.description = The first emote has been successfully set. Please send me now the decline emote.
commands.moderation.rules.emoji.error.description = The given emote can't be used.
+commands.moderation.rules.success.title = Successfully set the rules
+commands.moderation.rules.success.description = I successfully send the rules in %extra%.
+commands.moderation.rules.error.message.title = Can't write messages
+commands.moderation.rules.error.message.description = I can not write messages in the specified channel
commands.moderation.rules.help.description = Setup the rules on your Discord server
-commands.moderation.starboard.successchannel=Successfully set the Channel!
+commands.moderation.starboard.success.title = Successfully set the Channel\!
+commands.moderation.editrules.channel.title = Rules channel
+commands.moderation.editrules.channel.description = Please send me the channel with the rules as mention
+commands.moderation.editrules.channel.found.error.title = Channel not found
+commands.moderation.editrules.channel.found.error.description = I can't find the specified channel. Please start the edit process again.
+commands.moderation.editrules.channel.message.error.title = No rules message
+commands.moderation.editrules.channel.message.error.description = I can not find the rules message in the specified channel.
+commands.moderation.editrules.message.title = New message
+commands.moderation.editrules.message.description = Please send me the new rules message now.
+commands.moderation.editrules.error.title = No rules
+commands.moderation.editrules.error.description = There is nor rules message in this server. Please setup the rules first with %extra%rules
+commands.moderation.editrules.success.title = Successfully changed
+commands.moderation.editrules.success.description = I successfully changed the rules
+commands.moderation.editrules.help.description = Edits the rules message.
commands.music.join.success.title = Successfully connected
commands.music.join.success.description = I successfully connected to %extra%.
@@ -173,11 +185,31 @@ commands.music.join.error.connecting.trying.description = Hadder is already tryi
commands.music.join.error.channel.title = No Voice Channel
commands.music.join.error.channel.description = You aren't in a Voice Channel.
commands.music.join.help.description = Joins your voice channel
-commands.music.leave.success.title = \= Successfully disconnected
+commands.music.leave.success.title = Successfully disconnected
commands.music.leave.success.description = I successfully disconnected from the Voice Channel
commands.music.leave.error.tile = Not connected
commands.music.leave.error.description = I'm currently in no Voice Channel on this Guild
commands.music.leave.help.description = Leaves a voice channel
+commands.music.play.load.title = %extra% Now loading %extra%
+commands.music.play.load.description = Trying to load the song...
+commands.music.play.success.loading.title = %extra% Now playing %extra%
+commands.music.play.error.load.title = %extra% Load failed %extra%
+commands.music.play.error.load.description = Unfortunately I can not load the given song.
+commands.music.play.error.match.title = %extra% No matches %extra%
+commands.music.play.error.match.description = I can not find a song named this on YouTube.
+commands.music.play.success.title = Title
+commands.music.play.success.author = Author
+commands.music.play.success.length = Length
+commands.music.play.help.description = Plays a song
+commands.music.stop.success.title = Successfully stopped
+commands.music.stop.success.description = I successfully stopped the song.
+commands.music.info.error.title = No playing track
+commands.music.info.error.description = I am not playing anything at the moment
+commands.music.stop.help.description = Stops the song
+commands.music.queue.error.title = No queue
+commands.music.queue.error.description = There are no queued songs at the moment
+commands.music.queue.success.title = Queue
+commands.music.queue.success.description = This is the queue\: %extra%
commands.nsfw.gif.error.title = GIF not showing? Click here
commands.nsfw.img.error.title = Image not showing? Click here
@@ -220,4 +252,4 @@ commands.settings.language.help.description = Sets the new primary language for
commands.settings.language.help.usage =
commands.settings.prefix.success.title = %extra% Successfully set %extra%
commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`.
-commands.settings.prefix.help.description = Sets a new Prefix
+commands.settings.prefix.help.description = Sets a new prefix.
diff --git a/src/main/resources/Translations/Translations_es.properties b/src/main/resources/Translations/Translations_es.properties
index 8c367dd..660e58c 100644
--- a/src/main/resources/Translations/Translations_es.properties
+++ b/src/main/resources/Translations/Translations_es.properties
@@ -2,21 +2,20 @@
# @author Skidder / GregTCLTK
#
-#
-# @author Skidder / GregTCLTK
-#
-
Hadder = Hadder
+user = <@User>
searchterm =
username =
number = /all
-guildprefix =
prefix =
+userprefix =
vc-name/id =
user+nickname = <@user>
region =
guildid =
+content =
+song =
error = Error
none = None
@@ -25,31 +24,32 @@ success\! = Success\!
commands.fun.avatar.success.title = Avatar of %extra%
commands.fun.avatar.help.description = Sends the avatar of the specified member.
commands.fun.gif.error.description = Please try again with another term.
-commands.fun.gif.help.description = Look for a GIF on Giphy
-commands.fun.meme.success.title = Your random meme
-commands.fun.meme.api.error = The request to the meme API could not be processed. Please try it again later.
+commands.fun.gif.help.description = Looks for a GIF on Giphy.
+commands.fun.meme.success.title = Your random meme\:
+commands.fun.meme.api.error = The request to the meme API could not be processed. Please try again later.
commands.fun.meme.help.description = Sends you a random meme.
+commands.fun.clyde.help.description = Sends a message as a webhook named Clyde.
commands.general.about.success.title = Hadder - About
commands.general.about.success.description = Hadder is an open source Discord bot.
-commands.general.about.success.field.one.title = Support the Developers
-commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it you donate some money [here]%extra%
-commands.general.about.help.description = Shows infos about Hadder
-commands.general.equals.string.first.request = Please send me the first String
-commands.general.equals.string.second.request = Please send me the second String
+commands.general.about.success.field.one.title = Support the developers
+commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it if you donated some money to us. Click [here]%extra% to donate.
+commands.general.about.help.description = Shows information about Hadder.
+commands.general.equals.string.first.request = Please send me the first String.
+commands.general.equals.string.second.request = Please send me the second String.
commands.general.equals.string.equals.true = Yes\! The first string equals the second string\!
commands.general.equals.string.equals.false = Well yes but actually No. This isn't the same.
-commands.general.equals.string.first = First String
-commands.general.equals.string.second = Second String
-commands.general.equals.string.result = Result
+commands.general.equals.string.first = First string\:
+commands.general.equals.string.second = Second string\:
+commands.general.equals.string.result = Result\:
commands.general.equals.help.description = Check if two strings are the same
-commands.general.help.field.usage = Usage
+commands.general.help.field.usage = Usage\:
commands.general.help.error.description = I need the Embed Links Permission to send the Help Menu\!
-commands.general.help.help.description = Shows each command or explains its usage
+commands.general.help.help.description = Shows each command and explains its usage.
commands.general.help.help.label = [CommandName]
commands.general.invite.success.title = Invite me\!
commands.general.invite.success.description = [Invite me here\!]%extra%
-commands.general.invite.help.description = Shows the invitation to invite Hadder to your server
+commands.general.invite.help.description = Shows the invitation link to invite Hadder to your server.
commands.general.ping.help.description = Shows the ping to the Discord API
commands.misc.feedback.title.request.title = Feedback Topic
@@ -57,7 +57,7 @@ commands.misc.feedback.title.request.description = Please send me the feedback t
commands.misc.feedback.description.request.title = Feedback Description
commands.misc.feedback.description.request.description = Please send me the feedback description now.
commands.misc.feedback.help.description = Sends feedback directly to the developers.
-commands.misc.feedback.success.title = Feedback successfully sent
+commands.misc.feedback.success.title = Feedback successfully sent\!
commands.misc.github.link.title = Link your GitHub Account
commands.misc.github.success.title = Information about %extra%
commands.misc.github.success.bio = User bio
@@ -69,18 +69,18 @@ commands.misc.github.success.followers = Followers
commands.misc.github.success.following = Following
commands.misc.github.api.error.description = The GitHub API might be down at the moment\!
commands.misc.github.user.error.description = This user does not exist\!
-commands.misc.github.connect.title = Connect you GH account
+commands.misc.github.connect.title = Connect your GH account
commands.misc.github.connect.description = [Please connect your GitHub account here]%extra%
commands.misc.github.help.description = Displays information about a GitHub user profile.
-commands.misc.screenshare.success.title = Here's your Url to share your Screen
-commands.misc.screenshare.id.error.title = Wait that's illegal
-commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID? \n\nNote\: Make sure the Voice Channel is on this Guild.
-commands.misc.screenshare.channel.error.title = Please Choose a Voice Channel
+commands.misc.screenshare.success.title = Here's your URL to share your Screen
+commands.misc.screenshare.id.error.title = Wait. That's illegal.
+commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID. \n\nNote\: Make sure the Voice Channel is in this Guild.
+commands.misc.screenshare.channel.error.title = Please choose a Voice Channel
commands.misc.screenshare.channel.error.description = There is more than one channel with this name
commands.misc.screenshare.number.error.title = You specified a wrong number\!
commands.misc.screenshare.number.error.description = This isn't a Number.
commands.misc.screenshare.channel.existing.error = Hol' up
-commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is on this Guild.
+commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is in this Guild.
commands.misc.screenshare.help.description = Shows you the link to share your screen.
commands.moderation.ban.success.title = %extra% Successfully banned %extra%
@@ -98,7 +98,7 @@ commands.moderation.clear.message.error.title = No messages\!
commands.moderation.clear.message.error.description = There are no messages in this channel.
commands.moderation.clear.help.description = Deletes the specified number of messages.
commands.moderation.prefix.success.title = %extra% Successfully set %extra%
-commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to %extra%
+commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to `%extra%`.
commands.moderation.prefix.error.description = The prefix must not contain **"**
commands.moderation.prefix.help.description = Sets the Guild-Prefix.
commands.moderation.invitedetect.activate.success.title = Successfully activated
@@ -115,16 +115,9 @@ commands.moderation.kick.success.description = I successfully kicked %extra%.
commands.moderation.kick.error.title = Not possible
commands.moderation.kick.myself.error.description = I can not kick myself\!
commands.moderation.kick.yourself.error.description = You can't kick yourself.
-commands.moderation.kick.mass.success.description = I successfully kicked 69 Members\!
+commands.moderation.kick.mass.success.description = I successfully kicked %extra% Members\!
commands.moderation.kick.help.description = Kicks one or more user from the server.
commands.moderation.kick.masskick.success.description = I successfully kicked %extra% members.
-commands.moderation.link.request.success.description = If i'm on this guild i sent a message to accept the link.
-commands.moderation.link.error.title = Wait that's illegal.
-commands.moderation.link.request.error.description = You specified the same guild as the guild on which you're reading this
-commands.moderation.link.request.accept.title = ) wants to link guilds\!
-commands.moderation.link.request.accept.description = React with the reactions to accept or decline it
-commands.moderation.link.set.title = Set the thing boi
-commands.moderation.link.help.description = Links two or more servers.
commands.moderation.nick.success.title = %extra% Successfully nicked %extra%
commands.moderation.nick.success.description = I successfully nicked %extra%.
commands.moderation.nick.myself.success.description = I successfully changed my nickname.
@@ -143,7 +136,7 @@ commands.moderation.rules.setup.title = Set up rules
commands.moderation.rules.setup.description = Welcome to the Hadder rules setup. Please mention the channel in which I should send the rules. Your message should look like\: \#rules or \#verify.
commands.moderation.rules.channel.error.title = Channel not found
commands.moderation.rules.channel.error.description = I can't find the specified channel. Please start the setup again.
-commands.moderation.rules.rules.title = Rules
+commands.moderation.rules.rules.title = Rules message
commands.moderation.rules.rules.description = The channel was successfully set to %extra%. Please send me the rules now.
commands.moderation.rules.role.title = Role to assign
commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives after he accepted the rules.
@@ -155,15 +148,30 @@ commands.moderation.rules.emote.accept.title = Custom Accept Emote
commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified.
commands.moderation.rules.emote.decline.title = Custom Decline Emote
commands.moderation.rules.emote.decline.description = The first emote has been successfully set to %extra%. Please send me now the decline emote.
-commands.moderation.rules.success.title = Successfully set the rules
-commands.moderation.rules.success.description = I successfully send the rules in %extra%.
commands.moderation.rules.emote.error.access.description = I can not access the custom emote(s).
commands.moderation.rules.emote.error.equal.title = Emotes are equal
commands.moderation.rules.emote.error.equal.description = The 1st and 2nd emote equals each other.
commands.moderation.rules.emoji.decline.description = The first emote has been successfully set. Please send me now the decline emote.
commands.moderation.rules.emoji.error.description = The given emote can't be used.
+commands.moderation.rules.success.title = Successfully set the rules
+commands.moderation.rules.success.description = I successfully send the rules in %extra%.
+commands.moderation.rules.error.message.title = Can't write messages
+commands.moderation.rules.error.message.description = I can not write messages in the specified channel
commands.moderation.rules.help.description = Setup the rules on your Discord server
-commands.moderation.starboard.successchannel=Successfully set the Channel\!
+commands.moderation.starboard.success.title = Successfully set the Channel\!
+commands.moderation.editrules.channel.title = Rules channel
+commands.moderation.editrules.channel.description = Please send me the channel with the rules as mention
+commands.moderation.editrules.channel.found.error.title = Channel not found
+commands.moderation.editrules.channel.found.error.description = I can't find the specified channel. Please start the edit process again.
+commands.moderation.editrules.channel.message.error.title = No rules message
+commands.moderation.editrules.channel.message.error.description = I can not find the rules message in the specified channel.
+commands.moderation.editrules.message.title = New message
+commands.moderation.editrules.message.description = Please send me the new rules message now.
+commands.moderation.editrules.error.title = No rules
+commands.moderation.editrules.error.description = There is nor rules message in this server. Please setup the rules first with %extra%rules
+commands.moderation.editrules.success.title = Successfully changed
+commands.moderation.editrules.success.description = I successfully changed the rules
+commands.moderation.editrules.help.description = Edits the rules message.
commands.music.join.success.title = Successfully connected
commands.music.join.success.description = I successfully connected to %extra%.
@@ -174,11 +182,29 @@ commands.music.join.error.connecting.trying.description = Hadder is already tryi
commands.music.join.error.channel.title = No Voice Channel
commands.music.join.error.channel.description = You aren't in a Voice Channel.
commands.music.join.help.description = Joins your voice channel
-commands.music.leave.success.title = \= Successfully disconnected
+commands.music.leave.success.title = Successfully disconnected
commands.music.leave.success.description = I successfully disconnected from the Voice Channel
commands.music.leave.error.tile = Not connected
commands.music.leave.error.description = I'm currently in no Voice Channel on this Guild
commands.music.leave.help.description = Leaves a voice channel
+commands.music.play.load.title = %extra% Now loading %extra%
+commands.music.play.load.description = Trying to load the song...
+commands.music.play.success.loading.title = %extra% Now playing %extra%
+commands.music.play.error.load.title = %extra% Load failed %extra%
+commands.music.play.error.load.description = Unfortunately I can not load the given song.
+commands.music.play.error.match.title = %extra% No matches %extra%
+commands.music.play.error.match.description = I can not find a song named this on YouTube.
+commands.music.play.success.title = Title
+commands.music.play.success.author = Author
+commands.music.play.success.length = Length
+commands.music.play.help.description = Plays a song
+commands.music.stop.success.title = Successfully stopped
+commands.music.stop.success.description = I successfully stopped the song.
+commands.music.stop.help.description = Stops the song
+commands.music.queue.error.title = No queue
+commands.music.queue.error.description = There are no queued songs at the moment
+commands.music.queue.success.title = Queue
+commands.music.queue.success.description = This is the queue\: %extra%
commands.nsfw.gif.error.title = GIF not showing? Click here
commands.nsfw.img.error.title = Image not showing? Click here
@@ -206,6 +232,8 @@ commands.owner.eval.help.description = Execute the given code
commands.owner.eval.help.usage =
commands.owner.guildleave.success.title = Successfully left
commands.owner.guildleave.success.description = I successfully left %extra%.
+commands.owner.guildleave.error.title = Can not leave
+commands.owner.guildleave.error.description = I can not leave from this guild. Maybe this isn't a ID?
commands.owner.guildleave.help.description = Quit from a guild
commands.owner.reboot.help.description = Restart the bot
commands.owner.shutdown.success.title = Shutdown
@@ -214,9 +242,9 @@ commands.owner.test.success = TEST my friends
commands.owner.test.help.description = Just a little Test Command
commands.settings.language.success.title = Language set
-commands.settings.language.success.description = %extra% is your new language now.
+commands.settings.language.success.description = `%extra%` is your new language now.
commands.settings.language.help.description = Sets the new primary language for a user.
commands.settings.language.help.usage =
commands.settings.prefix.success.title = %extra% Successfully set %extra%
-commands.settings.prefix.success.description = I successfully set the new prefix for you to %extra%.
-commands.settings.prefix.help.description = Sets a new Prefix
+commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`.
+commands.settings.prefix.help.description = Sets a new prefix.
diff --git a/src/main/resources/Translations/Translations_fr.properties b/src/main/resources/Translations/Translations_fr.properties
index 8c367dd..660e58c 100644
--- a/src/main/resources/Translations/Translations_fr.properties
+++ b/src/main/resources/Translations/Translations_fr.properties
@@ -2,21 +2,20 @@
# @author Skidder / GregTCLTK
#
-#
-# @author Skidder / GregTCLTK
-#
-
Hadder = Hadder
+user = <@User>
searchterm =
username =
number = /all
-guildprefix =
prefix =
+userprefix =
vc-name/id =
user+nickname = <@user>
region =
guildid =
+content =
+song =
error = Error
none = None
@@ -25,31 +24,32 @@ success\! = Success\!
commands.fun.avatar.success.title = Avatar of %extra%
commands.fun.avatar.help.description = Sends the avatar of the specified member.
commands.fun.gif.error.description = Please try again with another term.
-commands.fun.gif.help.description = Look for a GIF on Giphy
-commands.fun.meme.success.title = Your random meme
-commands.fun.meme.api.error = The request to the meme API could not be processed. Please try it again later.
+commands.fun.gif.help.description = Looks for a GIF on Giphy.
+commands.fun.meme.success.title = Your random meme\:
+commands.fun.meme.api.error = The request to the meme API could not be processed. Please try again later.
commands.fun.meme.help.description = Sends you a random meme.
+commands.fun.clyde.help.description = Sends a message as a webhook named Clyde.
commands.general.about.success.title = Hadder - About
commands.general.about.success.description = Hadder is an open source Discord bot.
-commands.general.about.success.field.one.title = Support the Developers
-commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it you donate some money [here]%extra%
-commands.general.about.help.description = Shows infos about Hadder
-commands.general.equals.string.first.request = Please send me the first String
-commands.general.equals.string.second.request = Please send me the second String
+commands.general.about.success.field.one.title = Support the developers
+commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it if you donated some money to us. Click [here]%extra% to donate.
+commands.general.about.help.description = Shows information about Hadder.
+commands.general.equals.string.first.request = Please send me the first String.
+commands.general.equals.string.second.request = Please send me the second String.
commands.general.equals.string.equals.true = Yes\! The first string equals the second string\!
commands.general.equals.string.equals.false = Well yes but actually No. This isn't the same.
-commands.general.equals.string.first = First String
-commands.general.equals.string.second = Second String
-commands.general.equals.string.result = Result
+commands.general.equals.string.first = First string\:
+commands.general.equals.string.second = Second string\:
+commands.general.equals.string.result = Result\:
commands.general.equals.help.description = Check if two strings are the same
-commands.general.help.field.usage = Usage
+commands.general.help.field.usage = Usage\:
commands.general.help.error.description = I need the Embed Links Permission to send the Help Menu\!
-commands.general.help.help.description = Shows each command or explains its usage
+commands.general.help.help.description = Shows each command and explains its usage.
commands.general.help.help.label = [CommandName]
commands.general.invite.success.title = Invite me\!
commands.general.invite.success.description = [Invite me here\!]%extra%
-commands.general.invite.help.description = Shows the invitation to invite Hadder to your server
+commands.general.invite.help.description = Shows the invitation link to invite Hadder to your server.
commands.general.ping.help.description = Shows the ping to the Discord API
commands.misc.feedback.title.request.title = Feedback Topic
@@ -57,7 +57,7 @@ commands.misc.feedback.title.request.description = Please send me the feedback t
commands.misc.feedback.description.request.title = Feedback Description
commands.misc.feedback.description.request.description = Please send me the feedback description now.
commands.misc.feedback.help.description = Sends feedback directly to the developers.
-commands.misc.feedback.success.title = Feedback successfully sent
+commands.misc.feedback.success.title = Feedback successfully sent\!
commands.misc.github.link.title = Link your GitHub Account
commands.misc.github.success.title = Information about %extra%
commands.misc.github.success.bio = User bio
@@ -69,18 +69,18 @@ commands.misc.github.success.followers = Followers
commands.misc.github.success.following = Following
commands.misc.github.api.error.description = The GitHub API might be down at the moment\!
commands.misc.github.user.error.description = This user does not exist\!
-commands.misc.github.connect.title = Connect you GH account
+commands.misc.github.connect.title = Connect your GH account
commands.misc.github.connect.description = [Please connect your GitHub account here]%extra%
commands.misc.github.help.description = Displays information about a GitHub user profile.
-commands.misc.screenshare.success.title = Here's your Url to share your Screen
-commands.misc.screenshare.id.error.title = Wait that's illegal
-commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID? \n\nNote\: Make sure the Voice Channel is on this Guild.
-commands.misc.screenshare.channel.error.title = Please Choose a Voice Channel
+commands.misc.screenshare.success.title = Here's your URL to share your Screen
+commands.misc.screenshare.id.error.title = Wait. That's illegal.
+commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID. \n\nNote\: Make sure the Voice Channel is in this Guild.
+commands.misc.screenshare.channel.error.title = Please choose a Voice Channel
commands.misc.screenshare.channel.error.description = There is more than one channel with this name
commands.misc.screenshare.number.error.title = You specified a wrong number\!
commands.misc.screenshare.number.error.description = This isn't a Number.
commands.misc.screenshare.channel.existing.error = Hol' up
-commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is on this Guild.
+commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is in this Guild.
commands.misc.screenshare.help.description = Shows you the link to share your screen.
commands.moderation.ban.success.title = %extra% Successfully banned %extra%
@@ -98,7 +98,7 @@ commands.moderation.clear.message.error.title = No messages\!
commands.moderation.clear.message.error.description = There are no messages in this channel.
commands.moderation.clear.help.description = Deletes the specified number of messages.
commands.moderation.prefix.success.title = %extra% Successfully set %extra%
-commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to %extra%
+commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to `%extra%`.
commands.moderation.prefix.error.description = The prefix must not contain **"**
commands.moderation.prefix.help.description = Sets the Guild-Prefix.
commands.moderation.invitedetect.activate.success.title = Successfully activated
@@ -115,16 +115,9 @@ commands.moderation.kick.success.description = I successfully kicked %extra%.
commands.moderation.kick.error.title = Not possible
commands.moderation.kick.myself.error.description = I can not kick myself\!
commands.moderation.kick.yourself.error.description = You can't kick yourself.
-commands.moderation.kick.mass.success.description = I successfully kicked 69 Members\!
+commands.moderation.kick.mass.success.description = I successfully kicked %extra% Members\!
commands.moderation.kick.help.description = Kicks one or more user from the server.
commands.moderation.kick.masskick.success.description = I successfully kicked %extra% members.
-commands.moderation.link.request.success.description = If i'm on this guild i sent a message to accept the link.
-commands.moderation.link.error.title = Wait that's illegal.
-commands.moderation.link.request.error.description = You specified the same guild as the guild on which you're reading this
-commands.moderation.link.request.accept.title = ) wants to link guilds\!
-commands.moderation.link.request.accept.description = React with the reactions to accept or decline it
-commands.moderation.link.set.title = Set the thing boi
-commands.moderation.link.help.description = Links two or more servers.
commands.moderation.nick.success.title = %extra% Successfully nicked %extra%
commands.moderation.nick.success.description = I successfully nicked %extra%.
commands.moderation.nick.myself.success.description = I successfully changed my nickname.
@@ -143,7 +136,7 @@ commands.moderation.rules.setup.title = Set up rules
commands.moderation.rules.setup.description = Welcome to the Hadder rules setup. Please mention the channel in which I should send the rules. Your message should look like\: \#rules or \#verify.
commands.moderation.rules.channel.error.title = Channel not found
commands.moderation.rules.channel.error.description = I can't find the specified channel. Please start the setup again.
-commands.moderation.rules.rules.title = Rules
+commands.moderation.rules.rules.title = Rules message
commands.moderation.rules.rules.description = The channel was successfully set to %extra%. Please send me the rules now.
commands.moderation.rules.role.title = Role to assign
commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives after he accepted the rules.
@@ -155,15 +148,30 @@ commands.moderation.rules.emote.accept.title = Custom Accept Emote
commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified.
commands.moderation.rules.emote.decline.title = Custom Decline Emote
commands.moderation.rules.emote.decline.description = The first emote has been successfully set to %extra%. Please send me now the decline emote.
-commands.moderation.rules.success.title = Successfully set the rules
-commands.moderation.rules.success.description = I successfully send the rules in %extra%.
commands.moderation.rules.emote.error.access.description = I can not access the custom emote(s).
commands.moderation.rules.emote.error.equal.title = Emotes are equal
commands.moderation.rules.emote.error.equal.description = The 1st and 2nd emote equals each other.
commands.moderation.rules.emoji.decline.description = The first emote has been successfully set. Please send me now the decline emote.
commands.moderation.rules.emoji.error.description = The given emote can't be used.
+commands.moderation.rules.success.title = Successfully set the rules
+commands.moderation.rules.success.description = I successfully send the rules in %extra%.
+commands.moderation.rules.error.message.title = Can't write messages
+commands.moderation.rules.error.message.description = I can not write messages in the specified channel
commands.moderation.rules.help.description = Setup the rules on your Discord server
-commands.moderation.starboard.successchannel=Successfully set the Channel\!
+commands.moderation.starboard.success.title = Successfully set the Channel\!
+commands.moderation.editrules.channel.title = Rules channel
+commands.moderation.editrules.channel.description = Please send me the channel with the rules as mention
+commands.moderation.editrules.channel.found.error.title = Channel not found
+commands.moderation.editrules.channel.found.error.description = I can't find the specified channel. Please start the edit process again.
+commands.moderation.editrules.channel.message.error.title = No rules message
+commands.moderation.editrules.channel.message.error.description = I can not find the rules message in the specified channel.
+commands.moderation.editrules.message.title = New message
+commands.moderation.editrules.message.description = Please send me the new rules message now.
+commands.moderation.editrules.error.title = No rules
+commands.moderation.editrules.error.description = There is nor rules message in this server. Please setup the rules first with %extra%rules
+commands.moderation.editrules.success.title = Successfully changed
+commands.moderation.editrules.success.description = I successfully changed the rules
+commands.moderation.editrules.help.description = Edits the rules message.
commands.music.join.success.title = Successfully connected
commands.music.join.success.description = I successfully connected to %extra%.
@@ -174,11 +182,29 @@ commands.music.join.error.connecting.trying.description = Hadder is already tryi
commands.music.join.error.channel.title = No Voice Channel
commands.music.join.error.channel.description = You aren't in a Voice Channel.
commands.music.join.help.description = Joins your voice channel
-commands.music.leave.success.title = \= Successfully disconnected
+commands.music.leave.success.title = Successfully disconnected
commands.music.leave.success.description = I successfully disconnected from the Voice Channel
commands.music.leave.error.tile = Not connected
commands.music.leave.error.description = I'm currently in no Voice Channel on this Guild
commands.music.leave.help.description = Leaves a voice channel
+commands.music.play.load.title = %extra% Now loading %extra%
+commands.music.play.load.description = Trying to load the song...
+commands.music.play.success.loading.title = %extra% Now playing %extra%
+commands.music.play.error.load.title = %extra% Load failed %extra%
+commands.music.play.error.load.description = Unfortunately I can not load the given song.
+commands.music.play.error.match.title = %extra% No matches %extra%
+commands.music.play.error.match.description = I can not find a song named this on YouTube.
+commands.music.play.success.title = Title
+commands.music.play.success.author = Author
+commands.music.play.success.length = Length
+commands.music.play.help.description = Plays a song
+commands.music.stop.success.title = Successfully stopped
+commands.music.stop.success.description = I successfully stopped the song.
+commands.music.stop.help.description = Stops the song
+commands.music.queue.error.title = No queue
+commands.music.queue.error.description = There are no queued songs at the moment
+commands.music.queue.success.title = Queue
+commands.music.queue.success.description = This is the queue\: %extra%
commands.nsfw.gif.error.title = GIF not showing? Click here
commands.nsfw.img.error.title = Image not showing? Click here
@@ -206,6 +232,8 @@ commands.owner.eval.help.description = Execute the given code
commands.owner.eval.help.usage =
commands.owner.guildleave.success.title = Successfully left
commands.owner.guildleave.success.description = I successfully left %extra%.
+commands.owner.guildleave.error.title = Can not leave
+commands.owner.guildleave.error.description = I can not leave from this guild. Maybe this isn't a ID?
commands.owner.guildleave.help.description = Quit from a guild
commands.owner.reboot.help.description = Restart the bot
commands.owner.shutdown.success.title = Shutdown
@@ -214,9 +242,9 @@ commands.owner.test.success = TEST my friends
commands.owner.test.help.description = Just a little Test Command
commands.settings.language.success.title = Language set
-commands.settings.language.success.description = %extra% is your new language now.
+commands.settings.language.success.description = `%extra%` is your new language now.
commands.settings.language.help.description = Sets the new primary language for a user.
commands.settings.language.help.usage =
commands.settings.prefix.success.title = %extra% Successfully set %extra%
-commands.settings.prefix.success.description = I successfully set the new prefix for you to %extra%.
-commands.settings.prefix.help.description = Sets a new Prefix
+commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`.
+commands.settings.prefix.help.description = Sets a new prefix.
diff --git a/src/main/resources/Translations/Translations_ru.properties b/src/main/resources/Translations/Translations_ru.properties
index 8c367dd..660e58c 100644
--- a/src/main/resources/Translations/Translations_ru.properties
+++ b/src/main/resources/Translations/Translations_ru.properties
@@ -2,21 +2,20 @@
# @author Skidder / GregTCLTK
#
-#
-# @author Skidder / GregTCLTK
-#
-
Hadder = Hadder
+user = <@User>
searchterm =
username =
number = /all
-guildprefix =
prefix =
+userprefix =
vc-name/id =
user+nickname = <@user>
region =
guildid =
+content =
+song =
error = Error
none = None
@@ -25,31 +24,32 @@ success\! = Success\!
commands.fun.avatar.success.title = Avatar of %extra%
commands.fun.avatar.help.description = Sends the avatar of the specified member.
commands.fun.gif.error.description = Please try again with another term.
-commands.fun.gif.help.description = Look for a GIF on Giphy
-commands.fun.meme.success.title = Your random meme
-commands.fun.meme.api.error = The request to the meme API could not be processed. Please try it again later.
+commands.fun.gif.help.description = Looks for a GIF on Giphy.
+commands.fun.meme.success.title = Your random meme\:
+commands.fun.meme.api.error = The request to the meme API could not be processed. Please try again later.
commands.fun.meme.help.description = Sends you a random meme.
+commands.fun.clyde.help.description = Sends a message as a webhook named Clyde.
commands.general.about.success.title = Hadder - About
commands.general.about.success.description = Hadder is an open source Discord bot.
-commands.general.about.success.field.one.title = Support the Developers
-commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it you donate some money [here]%extra%
-commands.general.about.help.description = Shows infos about Hadder
-commands.general.equals.string.first.request = Please send me the first String
-commands.general.equals.string.second.request = Please send me the second String
+commands.general.about.success.field.one.title = Support the developers
+commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it if you donated some money to us. Click [here]%extra% to donate.
+commands.general.about.help.description = Shows information about Hadder.
+commands.general.equals.string.first.request = Please send me the first String.
+commands.general.equals.string.second.request = Please send me the second String.
commands.general.equals.string.equals.true = Yes\! The first string equals the second string\!
commands.general.equals.string.equals.false = Well yes but actually No. This isn't the same.
-commands.general.equals.string.first = First String
-commands.general.equals.string.second = Second String
-commands.general.equals.string.result = Result
+commands.general.equals.string.first = First string\:
+commands.general.equals.string.second = Second string\:
+commands.general.equals.string.result = Result\:
commands.general.equals.help.description = Check if two strings are the same
-commands.general.help.field.usage = Usage
+commands.general.help.field.usage = Usage\:
commands.general.help.error.description = I need the Embed Links Permission to send the Help Menu\!
-commands.general.help.help.description = Shows each command or explains its usage
+commands.general.help.help.description = Shows each command and explains its usage.
commands.general.help.help.label = [CommandName]
commands.general.invite.success.title = Invite me\!
commands.general.invite.success.description = [Invite me here\!]%extra%
-commands.general.invite.help.description = Shows the invitation to invite Hadder to your server
+commands.general.invite.help.description = Shows the invitation link to invite Hadder to your server.
commands.general.ping.help.description = Shows the ping to the Discord API
commands.misc.feedback.title.request.title = Feedback Topic
@@ -57,7 +57,7 @@ commands.misc.feedback.title.request.description = Please send me the feedback t
commands.misc.feedback.description.request.title = Feedback Description
commands.misc.feedback.description.request.description = Please send me the feedback description now.
commands.misc.feedback.help.description = Sends feedback directly to the developers.
-commands.misc.feedback.success.title = Feedback successfully sent
+commands.misc.feedback.success.title = Feedback successfully sent\!
commands.misc.github.link.title = Link your GitHub Account
commands.misc.github.success.title = Information about %extra%
commands.misc.github.success.bio = User bio
@@ -69,18 +69,18 @@ commands.misc.github.success.followers = Followers
commands.misc.github.success.following = Following
commands.misc.github.api.error.description = The GitHub API might be down at the moment\!
commands.misc.github.user.error.description = This user does not exist\!
-commands.misc.github.connect.title = Connect you GH account
+commands.misc.github.connect.title = Connect your GH account
commands.misc.github.connect.description = [Please connect your GitHub account here]%extra%
commands.misc.github.help.description = Displays information about a GitHub user profile.
-commands.misc.screenshare.success.title = Here's your Url to share your Screen
-commands.misc.screenshare.id.error.title = Wait that's illegal
-commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID? \n\nNote\: Make sure the Voice Channel is on this Guild.
-commands.misc.screenshare.channel.error.title = Please Choose a Voice Channel
+commands.misc.screenshare.success.title = Here's your URL to share your Screen
+commands.misc.screenshare.id.error.title = Wait. That's illegal.
+commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID. \n\nNote\: Make sure the Voice Channel is in this Guild.
+commands.misc.screenshare.channel.error.title = Please choose a Voice Channel
commands.misc.screenshare.channel.error.description = There is more than one channel with this name
commands.misc.screenshare.number.error.title = You specified a wrong number\!
commands.misc.screenshare.number.error.description = This isn't a Number.
commands.misc.screenshare.channel.existing.error = Hol' up
-commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is on this Guild.
+commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is in this Guild.
commands.misc.screenshare.help.description = Shows you the link to share your screen.
commands.moderation.ban.success.title = %extra% Successfully banned %extra%
@@ -98,7 +98,7 @@ commands.moderation.clear.message.error.title = No messages\!
commands.moderation.clear.message.error.description = There are no messages in this channel.
commands.moderation.clear.help.description = Deletes the specified number of messages.
commands.moderation.prefix.success.title = %extra% Successfully set %extra%
-commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to %extra%
+commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to `%extra%`.
commands.moderation.prefix.error.description = The prefix must not contain **"**
commands.moderation.prefix.help.description = Sets the Guild-Prefix.
commands.moderation.invitedetect.activate.success.title = Successfully activated
@@ -115,16 +115,9 @@ commands.moderation.kick.success.description = I successfully kicked %extra%.
commands.moderation.kick.error.title = Not possible
commands.moderation.kick.myself.error.description = I can not kick myself\!
commands.moderation.kick.yourself.error.description = You can't kick yourself.
-commands.moderation.kick.mass.success.description = I successfully kicked 69 Members\!
+commands.moderation.kick.mass.success.description = I successfully kicked %extra% Members\!
commands.moderation.kick.help.description = Kicks one or more user from the server.
commands.moderation.kick.masskick.success.description = I successfully kicked %extra% members.
-commands.moderation.link.request.success.description = If i'm on this guild i sent a message to accept the link.
-commands.moderation.link.error.title = Wait that's illegal.
-commands.moderation.link.request.error.description = You specified the same guild as the guild on which you're reading this
-commands.moderation.link.request.accept.title = ) wants to link guilds\!
-commands.moderation.link.request.accept.description = React with the reactions to accept or decline it
-commands.moderation.link.set.title = Set the thing boi
-commands.moderation.link.help.description = Links two or more servers.
commands.moderation.nick.success.title = %extra% Successfully nicked %extra%
commands.moderation.nick.success.description = I successfully nicked %extra%.
commands.moderation.nick.myself.success.description = I successfully changed my nickname.
@@ -143,7 +136,7 @@ commands.moderation.rules.setup.title = Set up rules
commands.moderation.rules.setup.description = Welcome to the Hadder rules setup. Please mention the channel in which I should send the rules. Your message should look like\: \#rules or \#verify.
commands.moderation.rules.channel.error.title = Channel not found
commands.moderation.rules.channel.error.description = I can't find the specified channel. Please start the setup again.
-commands.moderation.rules.rules.title = Rules
+commands.moderation.rules.rules.title = Rules message
commands.moderation.rules.rules.description = The channel was successfully set to %extra%. Please send me the rules now.
commands.moderation.rules.role.title = Role to assign
commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives after he accepted the rules.
@@ -155,15 +148,30 @@ commands.moderation.rules.emote.accept.title = Custom Accept Emote
commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified.
commands.moderation.rules.emote.decline.title = Custom Decline Emote
commands.moderation.rules.emote.decline.description = The first emote has been successfully set to %extra%. Please send me now the decline emote.
-commands.moderation.rules.success.title = Successfully set the rules
-commands.moderation.rules.success.description = I successfully send the rules in %extra%.
commands.moderation.rules.emote.error.access.description = I can not access the custom emote(s).
commands.moderation.rules.emote.error.equal.title = Emotes are equal
commands.moderation.rules.emote.error.equal.description = The 1st and 2nd emote equals each other.
commands.moderation.rules.emoji.decline.description = The first emote has been successfully set. Please send me now the decline emote.
commands.moderation.rules.emoji.error.description = The given emote can't be used.
+commands.moderation.rules.success.title = Successfully set the rules
+commands.moderation.rules.success.description = I successfully send the rules in %extra%.
+commands.moderation.rules.error.message.title = Can't write messages
+commands.moderation.rules.error.message.description = I can not write messages in the specified channel
commands.moderation.rules.help.description = Setup the rules on your Discord server
-commands.moderation.starboard.successchannel=Successfully set the Channel\!
+commands.moderation.starboard.success.title = Successfully set the Channel\!
+commands.moderation.editrules.channel.title = Rules channel
+commands.moderation.editrules.channel.description = Please send me the channel with the rules as mention
+commands.moderation.editrules.channel.found.error.title = Channel not found
+commands.moderation.editrules.channel.found.error.description = I can't find the specified channel. Please start the edit process again.
+commands.moderation.editrules.channel.message.error.title = No rules message
+commands.moderation.editrules.channel.message.error.description = I can not find the rules message in the specified channel.
+commands.moderation.editrules.message.title = New message
+commands.moderation.editrules.message.description = Please send me the new rules message now.
+commands.moderation.editrules.error.title = No rules
+commands.moderation.editrules.error.description = There is nor rules message in this server. Please setup the rules first with %extra%rules
+commands.moderation.editrules.success.title = Successfully changed
+commands.moderation.editrules.success.description = I successfully changed the rules
+commands.moderation.editrules.help.description = Edits the rules message.
commands.music.join.success.title = Successfully connected
commands.music.join.success.description = I successfully connected to %extra%.
@@ -174,11 +182,29 @@ commands.music.join.error.connecting.trying.description = Hadder is already tryi
commands.music.join.error.channel.title = No Voice Channel
commands.music.join.error.channel.description = You aren't in a Voice Channel.
commands.music.join.help.description = Joins your voice channel
-commands.music.leave.success.title = \= Successfully disconnected
+commands.music.leave.success.title = Successfully disconnected
commands.music.leave.success.description = I successfully disconnected from the Voice Channel
commands.music.leave.error.tile = Not connected
commands.music.leave.error.description = I'm currently in no Voice Channel on this Guild
commands.music.leave.help.description = Leaves a voice channel
+commands.music.play.load.title = %extra% Now loading %extra%
+commands.music.play.load.description = Trying to load the song...
+commands.music.play.success.loading.title = %extra% Now playing %extra%
+commands.music.play.error.load.title = %extra% Load failed %extra%
+commands.music.play.error.load.description = Unfortunately I can not load the given song.
+commands.music.play.error.match.title = %extra% No matches %extra%
+commands.music.play.error.match.description = I can not find a song named this on YouTube.
+commands.music.play.success.title = Title
+commands.music.play.success.author = Author
+commands.music.play.success.length = Length
+commands.music.play.help.description = Plays a song
+commands.music.stop.success.title = Successfully stopped
+commands.music.stop.success.description = I successfully stopped the song.
+commands.music.stop.help.description = Stops the song
+commands.music.queue.error.title = No queue
+commands.music.queue.error.description = There are no queued songs at the moment
+commands.music.queue.success.title = Queue
+commands.music.queue.success.description = This is the queue\: %extra%
commands.nsfw.gif.error.title = GIF not showing? Click here
commands.nsfw.img.error.title = Image not showing? Click here
@@ -206,6 +232,8 @@ commands.owner.eval.help.description = Execute the given code
commands.owner.eval.help.usage =
commands.owner.guildleave.success.title = Successfully left
commands.owner.guildleave.success.description = I successfully left %extra%.
+commands.owner.guildleave.error.title = Can not leave
+commands.owner.guildleave.error.description = I can not leave from this guild. Maybe this isn't a ID?
commands.owner.guildleave.help.description = Quit from a guild
commands.owner.reboot.help.description = Restart the bot
commands.owner.shutdown.success.title = Shutdown
@@ -214,9 +242,9 @@ commands.owner.test.success = TEST my friends
commands.owner.test.help.description = Just a little Test Command
commands.settings.language.success.title = Language set
-commands.settings.language.success.description = %extra% is your new language now.
+commands.settings.language.success.description = `%extra%` is your new language now.
commands.settings.language.help.description = Sets the new primary language for a user.
commands.settings.language.help.usage =
commands.settings.prefix.success.title = %extra% Successfully set %extra%
-commands.settings.prefix.success.description = I successfully set the new prefix for you to %extra%.
-commands.settings.prefix.help.description = Sets a new Prefix
+commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`.
+commands.settings.prefix.help.description = Sets a new prefix.
diff --git a/src/main/resources/Translations/Translations_tr.properties b/src/main/resources/Translations/Translations_tr.properties
index 8c367dd..660e58c 100644
--- a/src/main/resources/Translations/Translations_tr.properties
+++ b/src/main/resources/Translations/Translations_tr.properties
@@ -2,21 +2,20 @@
# @author Skidder / GregTCLTK
#
-#
-# @author Skidder / GregTCLTK
-#
-
Hadder = Hadder
+user = <@User>
searchterm =
username =
number = /all
-guildprefix =
prefix =
+userprefix =
vc-name/id =
user+nickname = <@user>
region =
guildid =
+content =
+song =
error = Error
none = None
@@ -25,31 +24,32 @@ success\! = Success\!
commands.fun.avatar.success.title = Avatar of %extra%
commands.fun.avatar.help.description = Sends the avatar of the specified member.
commands.fun.gif.error.description = Please try again with another term.
-commands.fun.gif.help.description = Look for a GIF on Giphy
-commands.fun.meme.success.title = Your random meme
-commands.fun.meme.api.error = The request to the meme API could not be processed. Please try it again later.
+commands.fun.gif.help.description = Looks for a GIF on Giphy.
+commands.fun.meme.success.title = Your random meme\:
+commands.fun.meme.api.error = The request to the meme API could not be processed. Please try again later.
commands.fun.meme.help.description = Sends you a random meme.
+commands.fun.clyde.help.description = Sends a message as a webhook named Clyde.
commands.general.about.success.title = Hadder - About
commands.general.about.success.description = Hadder is an open source Discord bot.
-commands.general.about.success.field.one.title = Support the Developers
-commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it you donate some money [here]%extra%
-commands.general.about.help.description = Shows infos about Hadder
-commands.general.equals.string.first.request = Please send me the first String
-commands.general.equals.string.second.request = Please send me the second String
+commands.general.about.success.field.one.title = Support the developers
+commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it if you donated some money to us. Click [here]%extra% to donate.
+commands.general.about.help.description = Shows information about Hadder.
+commands.general.equals.string.first.request = Please send me the first String.
+commands.general.equals.string.second.request = Please send me the second String.
commands.general.equals.string.equals.true = Yes\! The first string equals the second string\!
commands.general.equals.string.equals.false = Well yes but actually No. This isn't the same.
-commands.general.equals.string.first = First String
-commands.general.equals.string.second = Second String
-commands.general.equals.string.result = Result
+commands.general.equals.string.first = First string\:
+commands.general.equals.string.second = Second string\:
+commands.general.equals.string.result = Result\:
commands.general.equals.help.description = Check if two strings are the same
-commands.general.help.field.usage = Usage
+commands.general.help.field.usage = Usage\:
commands.general.help.error.description = I need the Embed Links Permission to send the Help Menu\!
-commands.general.help.help.description = Shows each command or explains its usage
+commands.general.help.help.description = Shows each command and explains its usage.
commands.general.help.help.label = [CommandName]
commands.general.invite.success.title = Invite me\!
commands.general.invite.success.description = [Invite me here\!]%extra%
-commands.general.invite.help.description = Shows the invitation to invite Hadder to your server
+commands.general.invite.help.description = Shows the invitation link to invite Hadder to your server.
commands.general.ping.help.description = Shows the ping to the Discord API
commands.misc.feedback.title.request.title = Feedback Topic
@@ -57,7 +57,7 @@ commands.misc.feedback.title.request.description = Please send me the feedback t
commands.misc.feedback.description.request.title = Feedback Description
commands.misc.feedback.description.request.description = Please send me the feedback description now.
commands.misc.feedback.help.description = Sends feedback directly to the developers.
-commands.misc.feedback.success.title = Feedback successfully sent
+commands.misc.feedback.success.title = Feedback successfully sent\!
commands.misc.github.link.title = Link your GitHub Account
commands.misc.github.success.title = Information about %extra%
commands.misc.github.success.bio = User bio
@@ -69,18 +69,18 @@ commands.misc.github.success.followers = Followers
commands.misc.github.success.following = Following
commands.misc.github.api.error.description = The GitHub API might be down at the moment\!
commands.misc.github.user.error.description = This user does not exist\!
-commands.misc.github.connect.title = Connect you GH account
+commands.misc.github.connect.title = Connect your GH account
commands.misc.github.connect.description = [Please connect your GitHub account here]%extra%
commands.misc.github.help.description = Displays information about a GitHub user profile.
-commands.misc.screenshare.success.title = Here's your Url to share your Screen
-commands.misc.screenshare.id.error.title = Wait that's illegal
-commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID? \n\nNote\: Make sure the Voice Channel is on this Guild.
-commands.misc.screenshare.channel.error.title = Please Choose a Voice Channel
+commands.misc.screenshare.success.title = Here's your URL to share your Screen
+commands.misc.screenshare.id.error.title = Wait. That's illegal.
+commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID. \n\nNote\: Make sure the Voice Channel is in this Guild.
+commands.misc.screenshare.channel.error.title = Please choose a Voice Channel
commands.misc.screenshare.channel.error.description = There is more than one channel with this name
commands.misc.screenshare.number.error.title = You specified a wrong number\!
commands.misc.screenshare.number.error.description = This isn't a Number.
commands.misc.screenshare.channel.existing.error = Hol' up
-commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is on this Guild.
+commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is in this Guild.
commands.misc.screenshare.help.description = Shows you the link to share your screen.
commands.moderation.ban.success.title = %extra% Successfully banned %extra%
@@ -98,7 +98,7 @@ commands.moderation.clear.message.error.title = No messages\!
commands.moderation.clear.message.error.description = There are no messages in this channel.
commands.moderation.clear.help.description = Deletes the specified number of messages.
commands.moderation.prefix.success.title = %extra% Successfully set %extra%
-commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to %extra%
+commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to `%extra%`.
commands.moderation.prefix.error.description = The prefix must not contain **"**
commands.moderation.prefix.help.description = Sets the Guild-Prefix.
commands.moderation.invitedetect.activate.success.title = Successfully activated
@@ -115,16 +115,9 @@ commands.moderation.kick.success.description = I successfully kicked %extra%.
commands.moderation.kick.error.title = Not possible
commands.moderation.kick.myself.error.description = I can not kick myself\!
commands.moderation.kick.yourself.error.description = You can't kick yourself.
-commands.moderation.kick.mass.success.description = I successfully kicked 69 Members\!
+commands.moderation.kick.mass.success.description = I successfully kicked %extra% Members\!
commands.moderation.kick.help.description = Kicks one or more user from the server.
commands.moderation.kick.masskick.success.description = I successfully kicked %extra% members.
-commands.moderation.link.request.success.description = If i'm on this guild i sent a message to accept the link.
-commands.moderation.link.error.title = Wait that's illegal.
-commands.moderation.link.request.error.description = You specified the same guild as the guild on which you're reading this
-commands.moderation.link.request.accept.title = ) wants to link guilds\!
-commands.moderation.link.request.accept.description = React with the reactions to accept or decline it
-commands.moderation.link.set.title = Set the thing boi
-commands.moderation.link.help.description = Links two or more servers.
commands.moderation.nick.success.title = %extra% Successfully nicked %extra%
commands.moderation.nick.success.description = I successfully nicked %extra%.
commands.moderation.nick.myself.success.description = I successfully changed my nickname.
@@ -143,7 +136,7 @@ commands.moderation.rules.setup.title = Set up rules
commands.moderation.rules.setup.description = Welcome to the Hadder rules setup. Please mention the channel in which I should send the rules. Your message should look like\: \#rules or \#verify.
commands.moderation.rules.channel.error.title = Channel not found
commands.moderation.rules.channel.error.description = I can't find the specified channel. Please start the setup again.
-commands.moderation.rules.rules.title = Rules
+commands.moderation.rules.rules.title = Rules message
commands.moderation.rules.rules.description = The channel was successfully set to %extra%. Please send me the rules now.
commands.moderation.rules.role.title = Role to assign
commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives after he accepted the rules.
@@ -155,15 +148,30 @@ commands.moderation.rules.emote.accept.title = Custom Accept Emote
commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified.
commands.moderation.rules.emote.decline.title = Custom Decline Emote
commands.moderation.rules.emote.decline.description = The first emote has been successfully set to %extra%. Please send me now the decline emote.
-commands.moderation.rules.success.title = Successfully set the rules
-commands.moderation.rules.success.description = I successfully send the rules in %extra%.
commands.moderation.rules.emote.error.access.description = I can not access the custom emote(s).
commands.moderation.rules.emote.error.equal.title = Emotes are equal
commands.moderation.rules.emote.error.equal.description = The 1st and 2nd emote equals each other.
commands.moderation.rules.emoji.decline.description = The first emote has been successfully set. Please send me now the decline emote.
commands.moderation.rules.emoji.error.description = The given emote can't be used.
+commands.moderation.rules.success.title = Successfully set the rules
+commands.moderation.rules.success.description = I successfully send the rules in %extra%.
+commands.moderation.rules.error.message.title = Can't write messages
+commands.moderation.rules.error.message.description = I can not write messages in the specified channel
commands.moderation.rules.help.description = Setup the rules on your Discord server
-commands.moderation.starboard.successchannel=Successfully set the Channel\!
+commands.moderation.starboard.success.title = Successfully set the Channel\!
+commands.moderation.editrules.channel.title = Rules channel
+commands.moderation.editrules.channel.description = Please send me the channel with the rules as mention
+commands.moderation.editrules.channel.found.error.title = Channel not found
+commands.moderation.editrules.channel.found.error.description = I can't find the specified channel. Please start the edit process again.
+commands.moderation.editrules.channel.message.error.title = No rules message
+commands.moderation.editrules.channel.message.error.description = I can not find the rules message in the specified channel.
+commands.moderation.editrules.message.title = New message
+commands.moderation.editrules.message.description = Please send me the new rules message now.
+commands.moderation.editrules.error.title = No rules
+commands.moderation.editrules.error.description = There is nor rules message in this server. Please setup the rules first with %extra%rules
+commands.moderation.editrules.success.title = Successfully changed
+commands.moderation.editrules.success.description = I successfully changed the rules
+commands.moderation.editrules.help.description = Edits the rules message.
commands.music.join.success.title = Successfully connected
commands.music.join.success.description = I successfully connected to %extra%.
@@ -174,11 +182,29 @@ commands.music.join.error.connecting.trying.description = Hadder is already tryi
commands.music.join.error.channel.title = No Voice Channel
commands.music.join.error.channel.description = You aren't in a Voice Channel.
commands.music.join.help.description = Joins your voice channel
-commands.music.leave.success.title = \= Successfully disconnected
+commands.music.leave.success.title = Successfully disconnected
commands.music.leave.success.description = I successfully disconnected from the Voice Channel
commands.music.leave.error.tile = Not connected
commands.music.leave.error.description = I'm currently in no Voice Channel on this Guild
commands.music.leave.help.description = Leaves a voice channel
+commands.music.play.load.title = %extra% Now loading %extra%
+commands.music.play.load.description = Trying to load the song...
+commands.music.play.success.loading.title = %extra% Now playing %extra%
+commands.music.play.error.load.title = %extra% Load failed %extra%
+commands.music.play.error.load.description = Unfortunately I can not load the given song.
+commands.music.play.error.match.title = %extra% No matches %extra%
+commands.music.play.error.match.description = I can not find a song named this on YouTube.
+commands.music.play.success.title = Title
+commands.music.play.success.author = Author
+commands.music.play.success.length = Length
+commands.music.play.help.description = Plays a song
+commands.music.stop.success.title = Successfully stopped
+commands.music.stop.success.description = I successfully stopped the song.
+commands.music.stop.help.description = Stops the song
+commands.music.queue.error.title = No queue
+commands.music.queue.error.description = There are no queued songs at the moment
+commands.music.queue.success.title = Queue
+commands.music.queue.success.description = This is the queue\: %extra%
commands.nsfw.gif.error.title = GIF not showing? Click here
commands.nsfw.img.error.title = Image not showing? Click here
@@ -206,6 +232,8 @@ commands.owner.eval.help.description = Execute the given code
commands.owner.eval.help.usage =
commands.owner.guildleave.success.title = Successfully left
commands.owner.guildleave.success.description = I successfully left %extra%.
+commands.owner.guildleave.error.title = Can not leave
+commands.owner.guildleave.error.description = I can not leave from this guild. Maybe this isn't a ID?
commands.owner.guildleave.help.description = Quit from a guild
commands.owner.reboot.help.description = Restart the bot
commands.owner.shutdown.success.title = Shutdown
@@ -214,9 +242,9 @@ commands.owner.test.success = TEST my friends
commands.owner.test.help.description = Just a little Test Command
commands.settings.language.success.title = Language set
-commands.settings.language.success.description = %extra% is your new language now.
+commands.settings.language.success.description = `%extra%` is your new language now.
commands.settings.language.help.description = Sets the new primary language for a user.
commands.settings.language.help.usage =
commands.settings.prefix.success.title = %extra% Successfully set %extra%
-commands.settings.prefix.success.description = I successfully set the new prefix for you to %extra%.
-commands.settings.prefix.help.description = Sets a new Prefix
+commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`.
+commands.settings.prefix.help.description = Sets a new prefix.
diff --git a/src/main/resources/Translations/Translations_zh.properties b/src/main/resources/Translations/Translations_zh.properties
index 8c367dd..660e58c 100644
--- a/src/main/resources/Translations/Translations_zh.properties
+++ b/src/main/resources/Translations/Translations_zh.properties
@@ -2,21 +2,20 @@
# @author Skidder / GregTCLTK
#
-#
-# @author Skidder / GregTCLTK
-#
-
Hadder = Hadder
+user = <@User>
searchterm =
username =
number = /all
-guildprefix =
prefix =
+userprefix =
vc-name/id =
user+nickname = <@user>
region =
guildid =
+content =
+song =
error = Error
none = None
@@ -25,31 +24,32 @@ success\! = Success\!
commands.fun.avatar.success.title = Avatar of %extra%
commands.fun.avatar.help.description = Sends the avatar of the specified member.
commands.fun.gif.error.description = Please try again with another term.
-commands.fun.gif.help.description = Look for a GIF on Giphy
-commands.fun.meme.success.title = Your random meme
-commands.fun.meme.api.error = The request to the meme API could not be processed. Please try it again later.
+commands.fun.gif.help.description = Looks for a GIF on Giphy.
+commands.fun.meme.success.title = Your random meme\:
+commands.fun.meme.api.error = The request to the meme API could not be processed. Please try again later.
commands.fun.meme.help.description = Sends you a random meme.
+commands.fun.clyde.help.description = Sends a message as a webhook named Clyde.
commands.general.about.success.title = Hadder - About
commands.general.about.success.description = Hadder is an open source Discord bot.
-commands.general.about.success.field.one.title = Support the Developers
-commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it you donate some money [here]%extra%
-commands.general.about.help.description = Shows infos about Hadder
-commands.general.equals.string.first.request = Please send me the first String
-commands.general.equals.string.second.request = Please send me the second String
+commands.general.about.success.field.one.title = Support the developers
+commands.general.about.success.field.one.description = Hadder is completely free for everyone. We would appreciate it if you donated some money to us. Click [here]%extra% to donate.
+commands.general.about.help.description = Shows information about Hadder.
+commands.general.equals.string.first.request = Please send me the first String.
+commands.general.equals.string.second.request = Please send me the second String.
commands.general.equals.string.equals.true = Yes\! The first string equals the second string\!
commands.general.equals.string.equals.false = Well yes but actually No. This isn't the same.
-commands.general.equals.string.first = First String
-commands.general.equals.string.second = Second String
-commands.general.equals.string.result = Result
+commands.general.equals.string.first = First string\:
+commands.general.equals.string.second = Second string\:
+commands.general.equals.string.result = Result\:
commands.general.equals.help.description = Check if two strings are the same
-commands.general.help.field.usage = Usage
+commands.general.help.field.usage = Usage\:
commands.general.help.error.description = I need the Embed Links Permission to send the Help Menu\!
-commands.general.help.help.description = Shows each command or explains its usage
+commands.general.help.help.description = Shows each command and explains its usage.
commands.general.help.help.label = [CommandName]
commands.general.invite.success.title = Invite me\!
commands.general.invite.success.description = [Invite me here\!]%extra%
-commands.general.invite.help.description = Shows the invitation to invite Hadder to your server
+commands.general.invite.help.description = Shows the invitation link to invite Hadder to your server.
commands.general.ping.help.description = Shows the ping to the Discord API
commands.misc.feedback.title.request.title = Feedback Topic
@@ -57,7 +57,7 @@ commands.misc.feedback.title.request.description = Please send me the feedback t
commands.misc.feedback.description.request.title = Feedback Description
commands.misc.feedback.description.request.description = Please send me the feedback description now.
commands.misc.feedback.help.description = Sends feedback directly to the developers.
-commands.misc.feedback.success.title = Feedback successfully sent
+commands.misc.feedback.success.title = Feedback successfully sent\!
commands.misc.github.link.title = Link your GitHub Account
commands.misc.github.success.title = Information about %extra%
commands.misc.github.success.bio = User bio
@@ -69,18 +69,18 @@ commands.misc.github.success.followers = Followers
commands.misc.github.success.following = Following
commands.misc.github.api.error.description = The GitHub API might be down at the moment\!
commands.misc.github.user.error.description = This user does not exist\!
-commands.misc.github.connect.title = Connect you GH account
+commands.misc.github.connect.title = Connect your GH account
commands.misc.github.connect.description = [Please connect your GitHub account here]%extra%
commands.misc.github.help.description = Displays information about a GitHub user profile.
-commands.misc.screenshare.success.title = Here's your Url to share your Screen
-commands.misc.screenshare.id.error.title = Wait that's illegal
-commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID? \n\nNote\: Make sure the Voice Channel is on this Guild.
-commands.misc.screenshare.channel.error.title = Please Choose a Voice Channel
+commands.misc.screenshare.success.title = Here's your URL to share your Screen
+commands.misc.screenshare.id.error.title = Wait. That's illegal.
+commands.misc.screenshare.id.error.description = This ID is invalid. \nMaybe you entered a wrong ID. \n\nNote\: Make sure the Voice Channel is in this Guild.
+commands.misc.screenshare.channel.error.title = Please choose a Voice Channel
commands.misc.screenshare.channel.error.description = There is more than one channel with this name
commands.misc.screenshare.number.error.title = You specified a wrong number\!
commands.misc.screenshare.number.error.description = This isn't a Number.
commands.misc.screenshare.channel.existing.error = Hol' up
-commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is on this Guild.
+commands.misc.screenshare.channel.existing.description = There is no Voice Channel named like this. \n\nNote\: Make sure the Voice Channel is in this Guild.
commands.misc.screenshare.help.description = Shows you the link to share your screen.
commands.moderation.ban.success.title = %extra% Successfully banned %extra%
@@ -98,7 +98,7 @@ commands.moderation.clear.message.error.title = No messages\!
commands.moderation.clear.message.error.description = There are no messages in this channel.
commands.moderation.clear.help.description = Deletes the specified number of messages.
commands.moderation.prefix.success.title = %extra% Successfully set %extra%
-commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to %extra%
+commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to `%extra%`.
commands.moderation.prefix.error.description = The prefix must not contain **"**
commands.moderation.prefix.help.description = Sets the Guild-Prefix.
commands.moderation.invitedetect.activate.success.title = Successfully activated
@@ -115,16 +115,9 @@ commands.moderation.kick.success.description = I successfully kicked %extra%.
commands.moderation.kick.error.title = Not possible
commands.moderation.kick.myself.error.description = I can not kick myself\!
commands.moderation.kick.yourself.error.description = You can't kick yourself.
-commands.moderation.kick.mass.success.description = I successfully kicked 69 Members\!
+commands.moderation.kick.mass.success.description = I successfully kicked %extra% Members\!
commands.moderation.kick.help.description = Kicks one or more user from the server.
commands.moderation.kick.masskick.success.description = I successfully kicked %extra% members.
-commands.moderation.link.request.success.description = If i'm on this guild i sent a message to accept the link.
-commands.moderation.link.error.title = Wait that's illegal.
-commands.moderation.link.request.error.description = You specified the same guild as the guild on which you're reading this
-commands.moderation.link.request.accept.title = ) wants to link guilds\!
-commands.moderation.link.request.accept.description = React with the reactions to accept or decline it
-commands.moderation.link.set.title = Set the thing boi
-commands.moderation.link.help.description = Links two or more servers.
commands.moderation.nick.success.title = %extra% Successfully nicked %extra%
commands.moderation.nick.success.description = I successfully nicked %extra%.
commands.moderation.nick.myself.success.description = I successfully changed my nickname.
@@ -143,7 +136,7 @@ commands.moderation.rules.setup.title = Set up rules
commands.moderation.rules.setup.description = Welcome to the Hadder rules setup. Please mention the channel in which I should send the rules. Your message should look like\: \#rules or \#verify.
commands.moderation.rules.channel.error.title = Channel not found
commands.moderation.rules.channel.error.description = I can't find the specified channel. Please start the setup again.
-commands.moderation.rules.rules.title = Rules
+commands.moderation.rules.rules.title = Rules message
commands.moderation.rules.rules.description = The channel was successfully set to %extra%. Please send me the rules now.
commands.moderation.rules.role.title = Role to assign
commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives after he accepted the rules.
@@ -155,15 +148,30 @@ commands.moderation.rules.emote.accept.title = Custom Accept Emote
commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified.
commands.moderation.rules.emote.decline.title = Custom Decline Emote
commands.moderation.rules.emote.decline.description = The first emote has been successfully set to %extra%. Please send me now the decline emote.
-commands.moderation.rules.success.title = Successfully set the rules
-commands.moderation.rules.success.description = I successfully send the rules in %extra%.
commands.moderation.rules.emote.error.access.description = I can not access the custom emote(s).
commands.moderation.rules.emote.error.equal.title = Emotes are equal
commands.moderation.rules.emote.error.equal.description = The 1st and 2nd emote equals each other.
commands.moderation.rules.emoji.decline.description = The first emote has been successfully set. Please send me now the decline emote.
commands.moderation.rules.emoji.error.description = The given emote can't be used.
+commands.moderation.rules.success.title = Successfully set the rules
+commands.moderation.rules.success.description = I successfully send the rules in %extra%.
+commands.moderation.rules.error.message.title = Can't write messages
+commands.moderation.rules.error.message.description = I can not write messages in the specified channel
commands.moderation.rules.help.description = Setup the rules on your Discord server
-commands.moderation.starboard.successchannel=Successfully set the Channel\!
+commands.moderation.starboard.success.title = Successfully set the Channel\!
+commands.moderation.editrules.channel.title = Rules channel
+commands.moderation.editrules.channel.description = Please send me the channel with the rules as mention
+commands.moderation.editrules.channel.found.error.title = Channel not found
+commands.moderation.editrules.channel.found.error.description = I can't find the specified channel. Please start the edit process again.
+commands.moderation.editrules.channel.message.error.title = No rules message
+commands.moderation.editrules.channel.message.error.description = I can not find the rules message in the specified channel.
+commands.moderation.editrules.message.title = New message
+commands.moderation.editrules.message.description = Please send me the new rules message now.
+commands.moderation.editrules.error.title = No rules
+commands.moderation.editrules.error.description = There is nor rules message in this server. Please setup the rules first with %extra%rules
+commands.moderation.editrules.success.title = Successfully changed
+commands.moderation.editrules.success.description = I successfully changed the rules
+commands.moderation.editrules.help.description = Edits the rules message.
commands.music.join.success.title = Successfully connected
commands.music.join.success.description = I successfully connected to %extra%.
@@ -174,11 +182,29 @@ commands.music.join.error.connecting.trying.description = Hadder is already tryi
commands.music.join.error.channel.title = No Voice Channel
commands.music.join.error.channel.description = You aren't in a Voice Channel.
commands.music.join.help.description = Joins your voice channel
-commands.music.leave.success.title = \= Successfully disconnected
+commands.music.leave.success.title = Successfully disconnected
commands.music.leave.success.description = I successfully disconnected from the Voice Channel
commands.music.leave.error.tile = Not connected
commands.music.leave.error.description = I'm currently in no Voice Channel on this Guild
commands.music.leave.help.description = Leaves a voice channel
+commands.music.play.load.title = %extra% Now loading %extra%
+commands.music.play.load.description = Trying to load the song...
+commands.music.play.success.loading.title = %extra% Now playing %extra%
+commands.music.play.error.load.title = %extra% Load failed %extra%
+commands.music.play.error.load.description = Unfortunately I can not load the given song.
+commands.music.play.error.match.title = %extra% No matches %extra%
+commands.music.play.error.match.description = I can not find a song named this on YouTube.
+commands.music.play.success.title = Title
+commands.music.play.success.author = Author
+commands.music.play.success.length = Length
+commands.music.play.help.description = Plays a song
+commands.music.stop.success.title = Successfully stopped
+commands.music.stop.success.description = I successfully stopped the song.
+commands.music.stop.help.description = Stops the song
+commands.music.queue.error.title = No queue
+commands.music.queue.error.description = There are no queued songs at the moment
+commands.music.queue.success.title = Queue
+commands.music.queue.success.description = This is the queue\: %extra%
commands.nsfw.gif.error.title = GIF not showing? Click here
commands.nsfw.img.error.title = Image not showing? Click here
@@ -206,6 +232,8 @@ commands.owner.eval.help.description = Execute the given code
commands.owner.eval.help.usage =
commands.owner.guildleave.success.title = Successfully left
commands.owner.guildleave.success.description = I successfully left %extra%.
+commands.owner.guildleave.error.title = Can not leave
+commands.owner.guildleave.error.description = I can not leave from this guild. Maybe this isn't a ID?
commands.owner.guildleave.help.description = Quit from a guild
commands.owner.reboot.help.description = Restart the bot
commands.owner.shutdown.success.title = Shutdown
@@ -214,9 +242,9 @@ commands.owner.test.success = TEST my friends
commands.owner.test.help.description = Just a little Test Command
commands.settings.language.success.title = Language set
-commands.settings.language.success.description = %extra% is your new language now.
+commands.settings.language.success.description = `%extra%` is your new language now.
commands.settings.language.help.description = Sets the new primary language for a user.
commands.settings.language.help.usage =
commands.settings.prefix.success.title = %extra% Successfully set %extra%
-commands.settings.prefix.success.description = I successfully set the new prefix for you to %extra%.
-commands.settings.prefix.help.description = Sets a new Prefix
+commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`.
+commands.settings.prefix.help.description = Sets a new prefix.