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.