commit 12a219eb3a5504c6df88de653e4ab5a154df28e9 Author: ionburger Date: Thu Jan 19 21:37:39 2023 -0700 yes diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..607877c --- /dev/null +++ b/.gitignore @@ -0,0 +1,135 @@ +*workspace* +*.conf +*.shlf +*test* +*TOKEN* +config.txt +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..677f7a7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,342 @@ +As a alternative to the license below, dual licensing is available. Contact me at ionburgger@gmail.com or on discord ionburger#0001. + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7f3afd3 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# turdbot +An all purpose discord bot written in discord.py diff --git a/html/about.html b/html/about.html new file mode 100644 index 0000000..9ceb7b2 --- /dev/null +++ b/html/about.html @@ -0,0 +1,35 @@ + + + + + + + + Document + + + + home page + photo + aa + google + email + coffee +

html

+ Lorem ipsum dolor sit, amet consectetur adipisicing elit. Molestias est consequatur veritatis possimus reprehenderit suscipit corporis aperiam optio tempora tenetur dicta mollitia, doloribus enim soluta libero voluptas nesciunt sapiente reiciendis labore blanditiis praesentium ipsam. Vel optio atque neque maxime commodi, dicta voluptatum, voluptatem error ut nobis est suscipit quae vitae! A voluptate ipsa ut atque consequatur perferendis repudiandae commodi corrupti nihil maxime nemo eveniet esse ad ab enim, illum dolor modi adipisci blanditiis sapiente aut nostrum tenetur? Minus necessitatibus blanditiis consectetur accusamus iusto fugiat magni. Doloribus corrupti quia blanditiis possimus. Ratione cumque molestias nostrum similique perferendis debitis omnis, eaque laborum praesentium asperiores assumenda, eveniet maiores amet. Explicabo, ea. Debitis unde natus sint, modi, obcaecati eum itaque id voluptatem, omnis odit commodi alias reprehenderit quaerat rerum vel. Delectus assumenda quia natus iste doloremque amet! Nemo fugiat corporis excepturi, vel ut quisquam reprehenderit dolorum tempore pariatur deleniti nulla, quam labore cupiditate voluptatibus tempora. Sit accusamus eius sunt rem sint, id molestias, repellat consequuntur esse corporis ipsum similique dolores porro a qui doloribus iusto doloremque ipsa iste praesentium fuga veniam. Corporis tempore totam officia dolorum repellat cupiditate amet rem fuga, quos quia unde iste est eligendi iure repellendus excepturi a ea accusantium nisi maxime! Distinctio, corrupti a excepturi, culpa ad ab molestias deserunt quisquam facere, laudantium cum aperiam officia minus sequi voluptatem. Animi cumque repellat ut eum rerum eligendi veniam fugiat mollitia, iste deleniti dignissimos neque maxime eius et dolorem ea quam delectus sint ex! Minus non maxime vero est deserunt? In aperiam incidunt similique sint repudiandae molestias accusamus non facere hic eaque sunt facilis totam eos, quos cumque aspernatur, velit pariatur soluta enim nobis beatae architecto consequuntur ipsam ex. Quas in, doloremque asperiores consequuntur nostrum eius facilis officia assumenda iusto ab omnis labore excepturi dignissimos numquam consequatur veritatis vitae suscipit voluptates ipsam rerum necessitatibus aperiam amet quos commodi! Consequatur adipisci, aliquid magni illo nam impedit aspernatur deleniti laborum perferendis et doloremque ut earum illum veniam corrupti aliquam quae repellat, quod laudantium vel nulla velit modi? Expedita fuga tempore ut repellendus dolor facere minus, ab necessitatibus sunt eius laborum. Dolor repudiandae delectus iure! Rem cumque magni amet porro recusandae consequatur beatae optio possimus distinctio? Quae molestiae consequatur veniam? Nesciunt est in consequuntur quas illum officia sit repellat commodi inventore, modi porro fuga saepe iure cumque, similique, eligendi nobis ex! Saepe ab voluptatibus dolores asperiores minus sed atque recusandae, voluptatum modi quia, nihil, tenetur eligendi similique. Voluptatibus, nesciunt accusamus? Id voluptatibus nisi, animi quia ullam cum laborum aperiam distinctio velit rerum rem dignissimos error eius fugiat sit illo suscipit maiores aliquid provident sequi. Animi quis amet iusto laborum ab totam distinctio reprehenderit accusamus nihil optio harum, minima, voluptatem praesentium earum, ipsum maxime. Voluptatum minima veritatis a consequuntur dolor architecto laudantium sed cupiditate fuga voluptas rerum iure quisquam quidem tempore, cumque rem, quas aliquid esse pariatur, aliquam animi. Quisquam nihil nostrum sequi at architecto! Distinctio quis vero minus odio molestiae ratione praesentium nesciunt unde ipsam quia sequi, magnam quod. Quae, culpa ex sit ipsum beatae praesentium repellendus repellat nisi alias laboriosam recusandae porro eius nemo voluptatum consequuntur voluptatibus animi quam earum sint aut. Quasi, voluptas excepturi soluta molestias tenetur labore totam impedit. Exercitationem iure harum, nostrum quis, voluptate labore vitae aliquid, aspernatur quisquam repellat perspiciatis et consequatur nam? Quibusdam perspiciatis deleniti nihil, esse omnis exercitationem blanditiis ratione dolor. Adipisci magnam tempore assumenda laboriosam culpa dicta fugiat asperiores, rerum nulla eum totam ab error atque saepe. Maxime doloremque minus ducimus aspernatur eum rem nisi blanditiis. Repellendus consequatur nobis sequi numquam placeat enim eos ea vel molestiae praesentium iure eveniet maxime quod non recusandae, ullam beatae, debitis totam! Enim sint perspiciatis expedita nam nihil iste asperiores reprehenderit vel. Labore quia aut iusto autem velit rem quos, unde dolore soluta error quisquam blanditiis illum numquam deleniti iste quasi, expedita consectetur? Quaerat quidem commodi, iste soluta provident non, blanditiis atque ipsa perspiciatis fugit quam expedita ex laborum vitae! Magnam voluptatibus hic distinctio, dolorem quaerat neque? Pariatur voluptates, sunt aut asperiores unde qui ipsam, quasi voluptatum nulla dolore et amet eum minima delectus, quos non. Similique dolorem officiis perferendis voluptatum distinctio nam facilis, eum eveniet quaerat sint temporibus, tempora aliquam nisi dolores explicabo asperiores blanditiis deserunt laborum inventore debitis ipsa omnis hic quibusdam voluptates? Consequuntur tempora suscipit voluptatem iusto aut similique, pariatur aliquid facilis libero dolore quam dolorum necessitatibus, corporis officiis non, tenetur sunt at illum minus veniam sed in. Error similique cum facilis ullam tenetur, eveniet soluta quidem vitae. Aliquam nobis natus porro vel voluptatibus voluptatum totam repudiandae quos corrupti alias id culpa magnam quibusdam architecto nisi ipsum nulla et deserunt, quidem esse ducimus quam error reiciendis. Quae, repellat fugiat? Voluptatibus animi, tenetur dolorum facilis consectetur sint deserunt praesentium vero deleniti minima quidem temporibus, sequi nisi aut porro laboriosam fugit. Dolorum, itaque exercitationem. Rem harum ipsa, hic iusto aut non impedit sequi cupiditate velit eum nostrum sapiente porro ducimus numquam nobis, nisi id quam molestias assumenda laboriosam voluptatibus. Itaque maxime veritatis voluptate dolorum tempore non iste eos quibusdam molestias quo? Nulla sequi provident corporis architecto libero eaque quia non eius vitae, consectetur ducimus earum dignissimos minima amet vel! Unde suscipit expedita commodi? Aliquid in voluptates nisi tempora esse cumque repellat, quasi molestiae fuga libero sapiente provident mollitia ex error fugiat iusto laboriosam doloribus reiciendis, corporis debitis vitae iste officiis numquam? Voluptatem accusamus cum iste. Minima harum commodi eveniet quis sed eaque iusto distinctio beatae amet ea tenetur voluptatum, error soluta quo veniam repellat praesentium corrupti! Ad totam impedit iure debitis quibusdam repudiandae mollitia itaque vero blanditiis sint ex ab alias fugiat, quos nam, eos earum quam ipsa necessitatibus! Dolores voluptatem, exercitationem earum mollitia velit cum minus esse facere quisquam, maiores dolore temporibus. Debitis dolorem sequi dolore pariatur. Dolore eveniet et ullam voluptates labore earum, quos porro, maxime aperiam nihil optio alias error beatae aspernatur deserunt cupiditate eius ab modi dolor sed, rem minima nam exercitationem! Inventore quae, quisquam laudantium officia ea dolor atque esse deleniti repellendus error, soluta ipsum enim dolores ad. Incidunt, quisquam vitae similique quod iste ad rem quia porro in corrupti nihil amet nostrum doloribus, veritatis deserunt repudiandae expedita possimus. Soluta rerum dicta repudiandae fuga fugit recusandae consectetur tenetur iure voluptate, doloremque nisi repellat enim eius suscipit, et blanditiis in illo tempore ea accusamus id velit quia fugiat. Vitae officiis repellendus porro culpa modi recusandae reprehenderit, iste impedit veritatis voluptas laboriosam quod cumque itaque ut aspernatur voluptates necessitatibus harum. Ut tenetur beatae eveniet quae delectus iusto repellat, neque rem, dolor consequatur eligendi rerum autem labore nulla laboriosam quos magnam omnis tempore dolore ab! Id blanditiis quam aut nobis dicta, nulla fugiat. Dignissimos placeat quos numquam! Sint quia doloremque quo aperiam at ullam tenetur quae nulla maxime officia odio nam suscipit amet unde voluptates, obcaecati nisi voluptatum, ipsam consequatur dolore fugiat! Debitis officia nobis optio nesciunt temporibus culpa quibusdam esse consequuntur iusto, sapiente veniam laudantium, laboriosam illo sed saepe animi consectetur enim voluptatum dignissimos, porro corrupti cumque? Ex praesentium nobis, voluptas architecto asperiores ea excepturi modi cupiditate repellat in autem atque. Eos temporibus rem et mollitia consectetur dignissimos aliquid sequi veritatis, officia voluptates doloremque totam, suscipit dolor harum, necessitatibus maxime ab? Mollitia quos aut autem omnis. Magnam quas saepe vero eveniet asperiores ea libero eos ipsa tenetur obcaecati deleniti quibusdam debitis alias ducimus minus cum eius sint tempora totam nisi quasi, molestias, rerum quos. Accusantium autem itaque excepturi blanditiis quibusdam aliquid in exercitationem fugit quia sed unde, esse id commodi, ducimus, modi corporis non? Aliquid, cumque quo doloribus modi repellat, blanditiis vero esse unde facilis sit recusandae debitis nemo! Tenetur iure illum voluptas voluptatem molestiae consequuntur quas. Possimus qui vitae distinctio rerum quibusdam? Odit perferendis eveniet obcaecati fuga, soluta deleniti cumque est? Beatae vel voluptatem dolores quibusdam excepturi provident debitis obcaecati numquam. Temporibus, perferendis hic quod labore repellat quaerat deserunt suscipit nesciunt recusandae nisi, aspernatur, consectetur iste molestias veniam totam modi exercitationem perspiciatis vero quisquam accusamus. Eveniet totam tempora atque molestias quibusdam labore repudiandae, laboriosam quam nesciunt, est sed fuga modi corporis ipsum aliquam sit dicta velit numquam quisquam deserunt harum culpa aperiam eaque. Officia neque numquam ipsum veniam nesciunt, necessitatibus molestias repudiandae aperiam fuga error eum eius ullam, vitae hic dignissimos molestiae distinctio. Eius incidunt nemo illo exercitationem pariatur ratione inventore earum odio impedit in. Et sint, rerum, quas aliquid rem officia similique facilis vitae quis id aliquam eaque alias nulla, nisi sit. Magnam nam minus deleniti explicabo temporibus odit eligendi sunt doloribus officia rerum? Ipsa asperiores porro consectetur dolor. Atque magni excepturi error, blanditiis, enim nulla odit, ea quas quasi omnis cupiditate animi aspernatur incidunt magnam doloribus. Eos, sint dolorem minima excepturi id, reiciendis ea deleniti maxime inventore neque molestiae possimus assumenda obcaecati. Incidunt quibusdam sunt consequatur dolores animi eaque vitae sint in, quis quisquam ut, cum voluptatem quo eligendi amet atque iste perspiciatis perferendis similique, vero dicta. Voluptas magnam porro necessitatibus nesciunt aliquid quos numquam molestiae recusandae delectus? Consectetur cumque quidem, earum deleniti nostrum doloribus molestiae, vitae non doloremque rem sit nulla ullam laborum nesciunt sunt architecto alias excepturi amet reprehenderit voluptatibus officia ipsam atque qui. Voluptate repudiandae, sunt autem labore eius non sint vero corrupti amet voluptatem expedita repellendus dignissimos quaerat corporis numquam possimus adipisci saepe qui, eligendi maxime! Corrupti dolorem eos fuga cupiditate, nostrum perferendis rem obcaecati maiores mollitia? Accusamus numquam tempora ipsum hic rerum harum ullam officiis iusto a commodi, recusandae nihil, quibusdam corporis voluptatibus error natus tenetur ratione laudantium? Explicabo officiis sed, voluptas error commodi architecto ducimus, excepturi officia aspernatur, repudiandae vero expedita in ratione repellendus. Quo perferendis veritatis eveniet harum. Quidem, itaque odit accusantium esse consequatur vitae alias natus perspiciatis vero nemo minima aliquam minus at cum nulla modi consectetur explicabo optio nisi. Possimus veniam at error eum tempora saepe? Consectetur alias quo accusantium quae distinctio nostrum, laudantium ratione sit ducimus iusto numquam tenetur id dolores reprehenderit animi commodi laboriosam hic deleniti excepturi quas possimus blanditiis quis eligendi harum. Vitae illum corrupti, officia voluptas repellat aperiam, debitis voluptatem magnam cupiditate nam ratione consequuntur. Quaerat dolorum accusantium facere omnis facilis, numquam est repellat blanditiis impedit doloremque sequi possimus, veniam reprehenderit. Laboriosam possimus facere est? Dolore iste quasi velit laboriosam blanditiis repudiandae non dignissimos, numquam eaque dicta reiciendis nesciunt libero autem placeat adipisci labore? Tenetur quasi a veritatis dicta at laboriosam, optio eos dolore cumque autem dolores fugit consequuntur qui. Magnam dolorum aut natus, nisi praesentium voluptate labore aperiam quod eligendi perspiciatis illo ab sed fuga mollitia quis, doloribus repellat animi, blanditiis ut. Harum consectetur et quis delectus minus ut aliquam. Laudantium, unde hic. Unde eum fugit repellendus, accusantium laborum placeat eaque! Modi quia facere nostrum sapiente eius id amet excepturi recusandae fugit aut atque libero similique nisi, esse velit ullam quis fugiat porro animi ipsam! Facilis dolorem suscipit aut reprehenderit maiores quisquam alias veniam reiciendis! Earum optio a pariatur rerum dolorem error eius repellat exercitationem enim delectus. Et nobis obcaecati deserunt voluptas nam sed corrupti eum aut porro nostrum vero non reprehenderit id praesentium ab quidem tempore error, fugit quisquam provident dolorem. Culpa qui dolores aliquam impedit in repellendus consectetur quas vel eveniet cum doloribus, ea doloremque provident quae voluptates, dolorum, ullam temporibus! Officiis sunt enim cumque fugit suscipit molestiae sapiente maiores laboriosam mollitia! Tenetur facilis pariatur neque nam quis necessitatibus architecto ducimus aliquam delectus in, voluptatibus itaque modi doloribus labore, nesciunt iste culpa dolorem? Ipsam culpa et ea. Mollitia sit id culpa, possimus iste magni at laboriosam? Officiis quam nihil asperiores necessitatibus voluptate provident, vel error autem quod voluptas facere corrupti animi alias in voluptatibus excepturi sit. Exercitationem, alias harum. Vel adipisci quam expedita vitae dolor omnis numquam voluptatibus, perspiciatis in, quisquam impedit quis necessitatibus consectetur blanditiis, iure voluptatum facilis. Magnam soluta repellendus suscipit natus, nostrum sed, molestiae culpa eligendi labore eaque illum velit minus facilis voluptatum quia, laboriosam quis nemo reiciendis! Perferendis, sunt hic quod sequi ad consequuntur aliquid ipsam veritatis at culpa excepturi eligendi eius doloremque fugiat aut odit dolorum quibusdam dolore ducimus molestias nihil, fugit sapiente quidem. Praesentium expedita iure nisi ratione alias. Suscipit repudiandae quo illo. Ut mollitia quae commodi officia cumque beatae a deserunt! +

css

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Officia doloremque minima quis adipisci doloribus, quibusdam ipsum similique ut eveniet totam necessitatibus unde culpa animi, accusamus impedit ex. Alias eligendi minus vitae ipsa suscipit, voluptatibus nesciunt omnis sed nisi, cupiditate, dolorem magni iste culpa. Modi exercitationem odio ut? Praesentium recusandae eum sed quos reiciendis beatae enim reprehenderit ea, architecto laudantium doloremque provident ipsum totam quo nesciunt, delectus voluptas. Incidunt optio sit quasi veniam quaerat dolorum eaque explicabo repellat illo, necessitatibus quibusdam dolorem voluptas nobis maiores nisi quo perspiciatis obcaecati amet magni animi numquam aliquam libero? Atque ipsum explicabo facere nam. Odio delectus quas blanditiis? Repellat porro harum facilis, recusandae debitis assumenda. Repellendus ad eligendi doloribus nam quibusdam sint blanditiis harum iure repellat odio! Asperiores molestiae ducimus eaque deserunt quia vel porro ipsum? Dolores asperiores molestiae fugiat sit facere eligendi modi eaque, omnis quasi quo vitae! Eius nulla temporibus aliquam obcaecati dolore vel quis, eos officiis delectus doloribus nemo repellendus velit rem voluptatem? Quaerat nemo autem deserunt distinctio. Repudiandae corrupti similique recusandae nemo rem numquam alias impedit laboriosam? Delectus deserunt officiis sapiente quos minus nobis esse atque repellat repellendus cupiditate facilis, rerum, laboriosam aperiam distinctio debitis magni quisquam, suscipit pariatur eveniet temporibus beatae quidem provident. Assumenda ut esse provident est. Molestias aliquam quis itaque. Maiores impedit, quis asperiores atque quidem dolorem dolor, unde reprehenderit recusandae minima in neque excepturi consectetur reiciendis, laborum labore eaque magni ea blanditiis consequuntur. Quo nam excepturi dicta eveniet porro, vitae possimus fugiat voluptas sequi pariatur amet corporis cum at deserunt libero distinctio nobis illo molestias quisquam quam? Alias, eos. Delectus deserunt aliquam laudantium incidunt dolores modi quidem repellendus! Temporibus similique incidunt cupiditate aliquid officia reiciendis, laudantium quae optio quod laborum. Delectus obcaecati optio atque dolor impedit quasi, enim saepe rerum neque iste alias placeat nostrum repudiandae earum ducimus voluptate ut non asperiores accusantium excepturi aspernatur consequatur architecto quibusdam. Consectetur, accusamus et eligendi sint, itaque dolorem, dolore expedita perferendis nostrum blanditiis eaque possimus eius corrupti minus? Laborum omnis nam ad enim, neque numquam! Ipsam sequi ex dicta natus sunt quo qui reiciendis magnam maxime laboriosam accusantium assumenda nemo aut, libero temporibus perspiciatis, commodi asperiores suscipit nam esse itaque a vel nisi. Veniam eaque omnis labore vero itaque dolores molestiae architecto eveniet vel quod tenetur ea debitis aut laborum explicabo, quia magni. Exercitationem blanditiis harum magnam placeat ullam aperiam odio libero non est? Est veniam modi expedita totam eum dicta accusamus minus reprehenderit ex blanditiis aliquam asperiores rem odit ipsam maiores laudantium error pariatur impedit suscipit, voluptate maxime. Obcaecati provident repellendus distinctio, fugiat unde perspiciatis at doloribus modi vitae ad eligendi libero a laboriosam odit. Saepe excepturi cupiditate odit molestiae ipsa quo magnam sint commodi temporibus nemo, ipsam magni? Animi, ipsa officiis et nostrum dolores minus quaerat vero distinctio, dolorem voluptatibus non sint molestiae tempore assumenda iusto sequi eius, deleniti quos! Aut est temporibus dolore iure sunt odit laudantium laborum cumque dolor, minus unde at ipsum omnis ipsa optio, reprehenderit beatae dicta repellat vitae ratione sit quis accusantium aspernatur. + Jump to top + + diff --git a/html/images/a.jpg b/html/images/a.jpg new file mode 100644 index 0000000..e7e75f2 Binary files /dev/null and b/html/images/a.jpg differ diff --git a/html/images/coffee.jpg b/html/images/coffee.jpg new file mode 100644 index 0000000..d5947d7 Binary files /dev/null and b/html/images/coffee.jpg differ diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..c0e402a --- /dev/null +++ b/html/index.html @@ -0,0 +1,18 @@ + + + + + + + + Turdbot Landing + + + + + diff --git a/py/bin/len0.py b/py/bin/len0.py new file mode 100644 index 0000000..e76ee83 --- /dev/null +++ b/py/bin/len0.py @@ -0,0 +1,8 @@ +# length func which works better for indexing lists +def len0(args): + a = len(args) + if a > 0: + return a-1 + else: + return False + diff --git a/py/bin/storage.py b/py/bin/storage.py new file mode 100644 index 0000000..fc99c92 --- /dev/null +++ b/py/bin/storage.py @@ -0,0 +1,26 @@ +class Config: + def __init__(self, serverid,db): + self.serverid = str(serverid) + self.db = db[str(serverid)] + self.default = db['default'] + + def read(self, module, key): + return self.db.find_one({'module': module})[key] + + def write(self, module, key, value): + self.db.update_one({'module': str(module)}, {'$set': {str(key): str(value)}}, upsert=True) + return True + + def updateguild(self): + for doc in self.default.find(): + existing_doc = self.db.find_one({"module": doc["module"]}) + if existing_doc: + for key, value in doc.items(): + if key not in existing_doc: + existing_doc[key] = value + self.db.replace_one({"module": doc["module"]}, existing_doc) + else: + self.db.insert_one(doc) + + + diff --git a/py/bin/update.py b/py/bin/update.py new file mode 100644 index 0000000..d1c943a --- /dev/null +++ b/py/bin/update.py @@ -0,0 +1,29 @@ +from py.bin.old import storage +import os +import shutil +import wget +import sys + +config.read("config/config.conf") +if config["config"]["autoupdate"] == "true": + versionl = version.local() + versionr = version.remote() + if ".".join(versionl)<".".join(versionr): + print("outdated version",versionl,"<",versionr) + print("autoupdate is enabled, attempting to update") + wget.download("https://github.com/ionburger/turdbot/archive/refs/tags/"+versionr+".zip",out = "turdbottmp.zip") + shutil.unpack_archive("turdbottmp.zip","turdbottmp") + for file in os.listdir("turdbottmp/turdbot-"+versionr+"/py/"): + if file.endswith(".py"): + shutil.move("turdbottmp/turdbot-"+versionr+"/py/"+file,file) + with open("VERSION","w") as file: + file.write(versionr) + shutil.rmtree("turdbottmp") + os.remove("turdbottmp.zip") + os.chdir(randir) + os.execl(sys.executable, sys.executable, *sys.argv) + update = True + else: + print("running latest version of turdbot",versionl) +else: + print("autoupdate disabled") diff --git a/py/bin/version.py b/py/bin/version.py new file mode 100644 index 0000000..509812c --- /dev/null +++ b/py/bin/version.py @@ -0,0 +1,10 @@ +import subprocess + +def remote(): + try: + process = subprocess.Popen(["lastversion", "ionburger/turdbot"],stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + return (process.communicate()[0]).strip("\n") + except: + return 0 +def local(): + return open("config/VERSION","r").read().strip("\n") \ No newline at end of file diff --git a/py/bot.py b/py/bot.py new file mode 100644 index 0000000..74e2f25 --- /dev/null +++ b/py/bot.py @@ -0,0 +1,40 @@ +import discord +from discord.ext import bridge, tasks +from pymongo import MongoClient +import logging +import argparse +import configparser + +log = logging.getLogger(__name__) + + +#setup +intents = discord.Intents.all() +bot = bridge.AutoShardedBot(shard_count=4,shard_ids=[2,3],intents=intents,command_prefix=".") +config = configparser.ConfigParser() +config.read("config/config.conf") +bot.db = MongoClient(config["mongodb"]["host"],int(config["mongodb"]["port"]),username=config["mongodb"]["username"],password=config["mongodb"]["password"])['data'] +bot.version = "2.0.0" + +bot.load_extension("cogs.counting") +bot.load_extension("cogs.misc") +bot.load_extension("cogs.triggers") +bot.load_extension("cogs.dad") +bot.load_extension("cogs.quotequeue") + + +#logging +parser = argparse.ArgumentParser() +parser.add_argument("-d","--debug", action="store_true") +args = parser.parse_args() + +if args.debug: + logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',filename='logs/bot.log',filemode='w') + + +else: + logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',filename='logs/bot.log', + filemode='w') + + +bot.run(config["config"]["token"]) \ No newline at end of file diff --git a/py/cogs/counting.py b/py/cogs/counting.py new file mode 100644 index 0000000..996b956 --- /dev/null +++ b/py/cogs/counting.py @@ -0,0 +1,28 @@ +import discord +from discord.ext import commands + +from bin.storage import Config + +class Counting(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_message(self, message): + st = Config(str(message.guild.id),self.bot.db) + if message.author.bot == True or st.read("counting","enabled") == "false" or str(message.channel.id) != st.read("counting","countingchannel",) or not message.content.isnumeric(): + return + + if int(message.content) == int(st.read("counting","countingcount"))+1 and str(message.author) != st.read("counting","countinguser",): + st.write("counting","countingcount",message.content) + st.write("counting","countinguser",message.author) + elif int(message.content) == int(st.read("counting","countingcount"))+1 and str(message.author) == st.read("counting","countinguser",): + await message.channel.send("A user cannot count twice in a row, counting reset to 1") + st.write("counting","countingcount",0) + st.write("counting","countinguser","None") + elif int(message.content) != int(st.read("counting","countingcount"))+1: + await message.channel.send("Wrong number, counting reset to 1") + st.write("counting","countingcount",0) + st.write("counting","countinguser","None") +def setup(bot): + bot.add_cog(Counting(bot)) diff --git a/py/cogs/dad.py b/py/cogs/dad.py new file mode 100644 index 0000000..ffed8e4 --- /dev/null +++ b/py/cogs/dad.py @@ -0,0 +1,24 @@ +import discord +from discord.ext import commands + +from bin.storage import Config + +class Dad(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_message(self, message): + st = Config(str(message.guild.id),self.bot.db) + if message.author.bot == True or st.read("dad","enabled") == "false": + return + msg = message.content.split(" ") + for i in range(len(msg)): + if msg[i].lower() == "i'm" or msg[i].lower() == "im": + await message.channel.send(f"Hi {msg[i+1]}, I'm Dad") + return + + + +def setup(bot): + bot.add_cog(Dad(bot)) \ No newline at end of file diff --git a/py/cogs/misc.py b/py/cogs/misc.py new file mode 100644 index 0000000..cec0142 --- /dev/null +++ b/py/cogs/misc.py @@ -0,0 +1,41 @@ +import discord +from discord.ext import commands + +from bin.storage import Config + +class Misc(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_ready(self): + print(f"Logged in as {self.bot.user}\nPycord version {discord.__version__}\nTurdbot version {self.bot.version}\n") + for guild in self.bot.guilds: + st = Config(guild.id,self.bot.db) + st.updateguild() + + @commands.Cog.listener() + async def on_guild_join(self, guild): + st = Config(guild.id,self.bot.db) + st.updateguild() + + @commands.Cog.listener() + async def on_message(self, message): + st = Config(message.guild.id,self.bot.db) + if message.author.bot == True and st.read("misc","replytobot") == "false": + return + if str(message.content) == ("r"): + self.bot.reload_extension("cogs.misc") + self.bot.reload_extension("cogs.triggers") + self.bot.reload_extension("cogs.counting") + await message.channel.send("r") + + + + + + + + +def setup(bot): + bot.add_cog(Misc(bot)) \ No newline at end of file diff --git a/py/cogs/quotequeue.py b/py/cogs/quotequeue.py new file mode 100644 index 0000000..95e8ea8 --- /dev/null +++ b/py/cogs/quotequeue.py @@ -0,0 +1,26 @@ +import discord +from discord.ext import commands, tasks + +import datetime + +from bin.storage import Config + + + +class Quotequeue(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.db = bot.db + self.quotequeue.start() + + @tasks.loop(seconds=5) + async def quotequeue(self): + channel = self.bot.get_channel(1004178748205187086) + await channel.send("test") + + @quotequeue.before_loop + async def before_quotequeue(self): + await self.bot.wait_until_ready() + +def setup(bot): + bot.add_cog(Quotequeue(bot)) diff --git a/py/cogs/triggers.py b/py/cogs/triggers.py new file mode 100644 index 0000000..bb4b0b4 --- /dev/null +++ b/py/cogs/triggers.py @@ -0,0 +1,28 @@ +import discord +from discord.ext import commands +import random +from bin.storage import Config + +class Triggers(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_message(self, message): + st = Config(message.guild.id,self.bot.db) + if message.author.bot == True and st.read("misc","replytobot") == "false" or st.read("triggers","enabled") == "false" or str(message.channel.id) in st.read("triggers","channelblacklist").split("."): + return + dict = st.read("triggers","data") + for k,v in dict.items(): + if v["mode"] == "lax": + if k in message.content: + await message.channel.send(random.choice(v["replys"].split("/./"))) + elif v["mode"] == "normal": + if k in message.content.split(" "): + await message.channel.send(random.choice(v["replys"].split("/./"))) + elif v["mode"] == "strict": + if k == str(message.content): + await message.channel.send(random.choice(v["replys"].split("/./"))) + +def setup(bot): + bot.add_cog(Triggers(bot)) diff --git a/py/config/VERSION b/py/config/VERSION new file mode 100644 index 0000000..3a1f10e --- /dev/null +++ b/py/config/VERSION @@ -0,0 +1 @@ +1.2.5 \ No newline at end of file diff --git a/py/config/logging.ini b/py/config/logging.ini new file mode 100644 index 0000000..56434a8 --- /dev/null +++ b/py/config/logging.ini @@ -0,0 +1,5 @@ +[loggers] +keys=root,bot,storage,update,version,discord,pymongo,os + +[handlers] +keys=consoleHandler,fileHandler \ No newline at end of file