From 17e625474a1265dd36444f4bfc1dfe3e649cbf62 Mon Sep 17 00:00:00 2001 From: "Casper V. Kristensen" Date: Wed, 9 Oct 2019 21:42:07 +0200 Subject: [PATCH] Initial. --- .gitignore | 358 ++++++++++++++++++ LICENSE.txt | 674 ++++++++++++++++++++++++++++++++++ README.md | 43 +++ images/basic.png | Bin 0 -> 150922 bytes setup.py | 56 +++ wau/__init__.py | 7 + wau/__main__.py | 3 + wau/addons.py | 138 +++++++ wau/cli.py | 161 ++++++++ wau/config.py | 34 ++ wau/http.py | 61 +++ wau/providers/__init__.py | 15 + wau/providers/base.py | 18 + wau/providers/curseforge.py | 75 ++++ wau/providers/git.py | 64 ++++ wau/providers/github.py | 13 + wau/providers/web.py | 37 ++ wau/providers/wowinterface.py | 17 + 18 files changed, 1774 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 images/basic.png create mode 100644 setup.py create mode 100644 wau/__init__.py create mode 100644 wau/__main__.py create mode 100644 wau/addons.py create mode 100644 wau/cli.py create mode 100644 wau/config.py create mode 100644 wau/http.py create mode 100644 wau/providers/__init__.py create mode 100644 wau/providers/base.py create mode 100644 wau/providers/curseforge.py create mode 100644 wau/providers/git.py create mode 100644 wau/providers/github.py create mode 100644 wau/providers/web.py create mode 100644 wau/providers/wowinterface.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..50c49f2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,358 @@ + +# Created by https://www.gitignore.io/api/python,pycharm,pycharm+all,pycharm+iml,emacs +# Edit at https://www.gitignore.io/?templates=python,pycharm,pycharm+all,pycharm+iml,emacs + +### Emacs ### +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +# directory configuration +.dir-locals.el + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### PyCharm+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### PyCharm+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### PyCharm+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff + +# Generated files + +# Sensitive or high-churn files + +# Gradle + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake + +# Mongo Explorer plugin + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client + +# Android studio 3.1+ serialized cache file + +### PyCharm+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +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 +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# 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 + +# celery beat schedule file +celerybeat-schedule + +# 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/ + +### Python Patch ### +.venv/ + +### Python.VirtualEnv Stack ### +# Virtualenv +# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Ss]cripts +pyvenv.cfg +pip-selfcheck.json + +# End of https://www.gitignore.io/api/python,pycharm,pycharm+all,pycharm+iml,emacs diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f3adaad --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# wau: *World of Warcraft AddOn Updater* + +## Installation +The easiest way to install the application is to use pip: +```bash +pip3 install --upgrade https://git.caspervk.net/caspervk/wau/archive/master.tar.gz +``` +**It requires Python 3.7 or later.** + +## Usage +The program can be started by running `wau` or `python3 -m wau`, depending on system configuration. +```text +usage: wau [-h] [-v] {install,remove,update,list,clean,export} ... + +World of Warcraft AddOn Updater v0.0.1 by Casper V. Kristensen. + +positional arguments: + {install,remove,update,list,clean,export} + install Install a new AddOn. + remove Remove a previously installed AddOn. + update Install newest version of all AddOns. + list List installed AddOn. + clean Clear out the local cache of retrieved files. + export Export the list of installed AddOns for install + elsewhere. + +optional arguments: + -h, --help show this help message and exit + -v, --verbose Increase verbosity level. Can be used multiple times. + +For more information, see . +``` + +## Supported AddOn Providers + - CurseForge.com + - WowInterface.com + - Git + - ~~GitHub Releases~~ (coming soon™) + - HTTP + + +## Screenshots +![Basic Interaction](images/basic.png) diff --git a/images/basic.png b/images/basic.png new file mode 100644 index 0000000000000000000000000000000000000000..76dc1babf4b15c393825beeec42e7486ba741c2c GIT binary patch literal 150922 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 literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..20856fc --- /dev/null +++ b/setup.py @@ -0,0 +1,56 @@ +# Always prefer setuptools over distutils +from setuptools import setup, find_packages +# To use a consistent encoding +from codecs import open +from os import path + +from wau import __author__, __version__, __licence__, __url__ + + +here = path.abspath(path.dirname(__file__)) + +# Get the long description from the README file +with open(path.join(here, "README.md"), encoding="utf-8") as f: + long_description = f.read() + + +setup( + name="wau", + version=__version__, + description="World of Warcraft AddOn Updater", + long_description=long_description, + long_description_content_type="text/markdown", + url=__url__, + project_urls={ + "Source": __url__ + }, + author=__author__, + classifiers=[ + "Development Status :: 3 - Alpha", + "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", + "Programming Language :: Python :: 3", + ], + python_requires=">=3.7", + keywords="world of warcraft wow addon updater", + license=__licence__, + packages=find_packages(exclude=["tests"]), + include_package_data=True, + package_data={ + "wau": [ + "*.default" + ] + }, + install_requires=[ + "tabulate" + ], + extras_require={ + "dev": [ + "wheel" + ] + }, + entry_points={ + "console_scripts": [ + "wau = wau.cli:main" + ] + }, +) diff --git a/wau/__init__.py b/wau/__init__.py new file mode 100644 index 0000000..efb4a0b --- /dev/null +++ b/wau/__init__.py @@ -0,0 +1,7 @@ +__version__ = "0.0.1" +__author__ = "Casper V. Kristensen" +__licence__ = "GPLv3" +__url__ = "https://git.caspervk.net/caspervk/wau" + +import sys +assert sys.version_info >= (3, 7), "wau requires python 3.7 or later." diff --git a/wau/__main__.py b/wau/__main__.py new file mode 100644 index 0000000..4ca25bb --- /dev/null +++ b/wau/__main__.py @@ -0,0 +1,3 @@ +if __name__ == "__main__": + from .cli import main + main() diff --git a/wau/addons.py b/wau/addons.py new file mode 100644 index 0000000..261cf64 --- /dev/null +++ b/wau/addons.py @@ -0,0 +1,138 @@ +from __future__ import annotations + +import json +import logging +import re +import shutil +from dataclasses import dataclass, field +from pathlib import Path +from typing import Iterable, List + +from . import config, providers + +logger = logging.getLogger(__name__) + + +@dataclass +class Addon: + name: str = None + url: str = None + dirs: List[Path] = field(default_factory=list) + provider: str = None + provider_data: dict = field(default_factory=dict) + + @property + def to_json(self) -> dict: + return { + "name": self.name, + "url": self.url, + "dirs": [str(d) for d in self.dirs], + "provider": self.provider, + "provider_data": self.provider_data + } + + @classmethod + def from_json(cls, data) -> Addon: + return cls( + name=data["name"], + url=data["url"], + dirs=[Path(d) for d in data["dirs"]], + provider=data["provider"], + provider_data=data["provider_data"] + ) + + @property + def download_dir(self) -> Path: + return config.CACHE_DIR.joinpath(get_valid_dir_filename(self.url)) + + def create_download_dir(self, recreate=False): + if recreate: + shutil.rmtree(self.download_dir, ignore_errors=True) + self.download_dir.mkdir(parents=True, exist_ok=True) + + def is_cached(self) -> bool: + return self.dirs and all(d.is_dir() for d in self.dirs) + + def get_provider(self) -> providers.Provider: + if self.provider is not None: + return providers.PROVIDERS[self.provider] + + for provider_name, provider in providers.PROVIDERS.items(): + if provider.is_supported(self.url): + self.provider = provider_name + logger.debug("%s is supported by %s", self, provider.__name__) + return provider + raise ValueError(f"No AddOn provider for {self}") + + def download(self) -> bool: + logger.info("Downloading %s", self.url) + self.create_download_dir() + provider = self.get_provider() + changed = provider.download(self) + return changed + + def install(self) -> None: + logger.info("Installing %s", self) + self.dirs = find_addon_dirs(self.download_dir) + for dir in self.dirs: + shutil.copytree(str(dir), config.ADDONS_DIR.joinpath(dir.name)) + + if self.name is None: # didn't get AddOn name from provider + if len(self.dirs) == 1: + self.name = self.dirs[0].name + else: + print(f"Please enter AddOn name for {self.url}:") + self.name = input() + + def uninstall(self) -> None: + logger.info("Uninstalling %s", self) + shutil.rmtree(self.download_dir, ignore_errors=True) + for dir in self.dirs: + shutil.rmtree(config.ADDONS_DIR.joinpath(dir.name)) + + +def find_addon_dirs(path: Path) -> List[Path]: + """ + Find and return AddOns in the given path. + + Each WoW AddOn is identified by a .toc-file whose filename matches its containing folder. The algorithm traverses + the path in a breadth-first fashion, returning all found AddOns in the first level which contains any AddOns. + This ensures we find AddOns 'Foo' and 'Foo_Config'. + """ + level = [path] + while level: + addon_dirs = [] + for p in level: + if any(toc.stem == p.name for toc in p.glob("*.toc")): + addon_dirs.append(p) + if addon_dirs: + logger.debug("Found AddOn dirs: %s in '%s'", addon_dirs, path) + return addon_dirs + level = [c + for p in level + for c in p.iterdir() + if c.is_dir()] + raise FileNotFoundError(f"No AddOn dirs found in {path}") + + +def get_valid_dir_filename(s: str) -> str: + """ + From https://github.com/django/django/blob/master/django/utils/text.py + """ + s = str(s).strip().replace(" ", "_") + return re.sub(r"(?u)[^-\w.]", "", s) + + +def load_installed_addons() -> List[Addon]: + logger.debug("Loading list of installed AddOns from %s", config.CONFIG_FILE) + try: + with config.CONFIG_FILE.open() as cf: + return [Addon.from_json(a) for a in json.load(cf)["installed_addons"]] + except FileNotFoundError: + return [] + + +def save_installed_addons(addons: Iterable[Addon]) -> None: + logger.debug("Saving list of installed AddOns to %s", config.CONFIG_FILE) + with config.CONFIG_FILE.open("w") as cf: + json.dump(dict(installed_addons=[a.to_json for a in addons]), cf) diff --git a/wau/cli.py b/wau/cli.py new file mode 100644 index 0000000..d5302f3 --- /dev/null +++ b/wau/cli.py @@ -0,0 +1,161 @@ +import argparse +import logging +import logging.config +import shutil +import textwrap + +from . import __url__, __author__, __version__, config, providers, addons +from .addons import Addon + +logger = logging.getLogger(__name__) + + +class CLI: + def __init__(self) -> None: + self.validate_addons_dir() + self.installed_addons = addons.load_installed_addons() + + def validate_addons_dir(self) -> None: + if not config.ADDONS_DIR.joinpath("../../Wow.exe").is_file(): + a = input("Error: The application must be run from the Interface/AddOns directory. Continue anyway [y/N]? ") + if a.lower() != "y": + exit() + + def parse_args(self): + parser = argparse.ArgumentParser( + prog="wau", + description=f"World of Warcraft AddOn Updater v{__version__} by {__author__}.", + epilog=f"For more information, see <{__url__}>." + ) + parser.set_defaults(func=lambda a: parser.print_help()) + parser.add_argument( + "-v", "--verbose", + action="count", + default=0, + help="Increase verbosity level. Can be used multiple times." + ) + + subparsers = parser.add_subparsers() + + install_parser = subparsers.add_parser( + name="install", + help="Install a new AddOn." + ) + install_parser.set_defaults(func=self.install) + install_parser.add_argument( + dest="urls", + nargs='+', + help="URL of AddOn(s).", + ) + + remove_parser = subparsers.add_parser( + name="remove", + help="Remove a previously installed AddOn." + ) + remove_parser.set_defaults(func=self.remove) + remove_parser.add_argument( + dest="addons", + nargs='*', + help="URL or name of AddOn(s).", + ) + + remove_parser.add_argument( + "--all", + action="store_true", + help="Remove all AddOns.") + + update_parser = subparsers.add_parser( + name="update", + help="Install newest version of all AddOns." + ) + update_parser.set_defaults(func=self.update) + + list_parser = subparsers.add_parser( + name="list", + help="List installed AddOn.", + + ) + list_parser.set_defaults(func=self.list) + + clean_parser = subparsers.add_parser( + name="clean", + help="Clear out the local cache of retrieved files." + ) + clean_parser.set_defaults(func=self.clean) + + export_parser = subparsers.add_parser( + name="export", + help="Export the list of installed AddOns for install elsewhere." + ) + export_parser.set_defaults(func=self.export) + + return parser.parse_args() + + def run(self): + args = self.parse_args() + logging.config.dictConfig(config.get_logging_config(level=("WARNING", "INFO", "DEBUG")[min(args.verbose, 2)])) + logger.debug("Args: %s", args) + args.func(args) + + def install(self, args) -> None: + already_installed_urls = {a.url for a in self.installed_addons} + for url in set(args.urls): # set removes duplicates + if url in already_installed_urls: + print(f"{url} is already installed") + continue + print(f"Installing AddOn from {url}") + addon = Addon(url=url) + addon.download() + addon.install() + self.installed_addons.append(addon) + addons.save_installed_addons(self.installed_addons) + + def remove(self, args) -> None: + if args.all: + remove = self.installed_addons.copy() + else: + remove = [addon + for addon in self.installed_addons + if addon.name in args.addons] + for addon in remove: + print(f"Removing {addon.name}") + addon.uninstall() + self.installed_addons.remove(addon) + addons.save_installed_addons(self.installed_addons) + + def update(self, args) -> None: + for addon in self.installed_addons: + print(f"Updating {addon.name}..", end=" ") + changed = addon.download() + if changed: + addon.uninstall() + addon.install() + print("Done" if changed else "Already up to date") + addons.save_installed_addons(self.installed_addons) + + def list(self, args) -> None: + table = [] + for addon in self.installed_addons: + table.append({ + "Name": addon.name, + "Provider": addon.get_provider().__name__, + "URL": addon.url, + "Directories": textwrap.fill(", ".join(d.name for d in addon.dirs), width=40) + }) + from tabulate import tabulate + print(tabulate(table, headers="keys", tablefmt="orgtbl")) + + def clean(self, args) -> None: + shutil.rmtree(config.CACHE_DIR, ignore_errors=True) + + def export(self, args) -> None: + print(" ".join(a.url for a in self.installed_addons)) + + +def main(): + cli = CLI() + cli.run() + + +if __name__ == '__main__': + main() diff --git a/wau/config.py b/wau/config.py new file mode 100644 index 0000000..3bcf844 --- /dev/null +++ b/wau/config.py @@ -0,0 +1,34 @@ +import logging +from pathlib import Path + +logger = logging.getLogger(__name__) + +CONFIG_FILE = Path(".wau.json") +ADDONS_DIR = Path.cwd() # for now. Maybe change to reading a config file or something in the future +CACHE_DIR = Path(".wau-cache") + + +def get_logging_config(level="WARNING") -> dict: + return { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "standard": { + "format": "%(asctime)s [%(levelname)-7s] %(name)s:%(funcName)s - %(message)s" + } + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "stream": "ext://sys.stdout", + "formatter": "standard", + "level": level, + } + }, + "loggers": { + "wau": { + "level": "DEBUG", + "handlers": ["console"] + } + }, + } diff --git a/wau/http.py b/wau/http.py new file mode 100644 index 0000000..4ce8eaf --- /dev/null +++ b/wau/http.py @@ -0,0 +1,61 @@ +import json +import logging +import shutil +import tempfile +import urllib.parse +import urllib.request +import zipfile +from functools import lru_cache +from http.client import HTTPResponse +from pathlib import Path +from typing import Mapping +from urllib.request import Request + + +logger = logging.getLogger(__name__) + +HTTP_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0" +HTTP_TIMEOUT = 3 + + +class Response: + def __init__(self, http_response: HTTPResponse) -> None: + self.http_response = http_response + + @property + @lru_cache() + def bytes(self) -> bytes: + logger.debug("GET %s", self.http_response.geturl()) + return self.http_response.read() + + @property + @lru_cache() + def text(self) -> str: + return self.bytes.decode() # TODO: Detect encoding + + @lru_cache() + def head(self) -> dict: + logger.debug("HEAD %s", self.http_response.geturl()) + return dict(self.http_response.info()) + + @lru_cache() + def json(self) -> dict: + return json.loads(self.bytes) + + +def open(url: str, params: Mapping = None) -> Response: + if params is not None: + url += "?" + urllib.parse.urlencode(params) + request = Request(url) + request.add_header("User-Agent", HTTP_USER_AGENT) + http_response = urllib.request.urlopen(request, timeout=HTTP_TIMEOUT) + return Response(http_response) + + +def download_zip(url: str, dest: Path) -> None: + logger.debug("Downloading '%s' to %s", url, dest) + with tempfile.TemporaryFile() as tmp: + with urllib.request.urlopen(url) as response: + shutil.copyfileobj(response, tmp) + with zipfile.ZipFile(tmp) as zip: + zip.extractall(path=dest) diff --git a/wau/providers/__init__.py b/wau/providers/__init__.py new file mode 100644 index 0000000..baba41c --- /dev/null +++ b/wau/providers/__init__.py @@ -0,0 +1,15 @@ +from .base import Provider +from .curseforge import CurseForge +from .git import Git +#from .github import GitHub +from .web import Web +from .wowinterface import WowInterface + + +PROVIDERS = { # in order of preference + "curse": CurseForge, + "wowinterface": WowInterface, + #"github": GitHub, + "git": Git, + "web": Web +} diff --git a/wau/providers/base.py b/wau/providers/base.py new file mode 100644 index 0000000..a6b1f0a --- /dev/null +++ b/wau/providers/base.py @@ -0,0 +1,18 @@ +from ..addons import Addon + + +class Provider: + @classmethod + def is_supported(cls, url: str) -> bool: + """ + Returns True if the given URL is supported by this provider. + """ + raise NotImplemented + + @classmethod + def download(cls, addon: Addon) -> bool: + """ + Download the provided AddOn. + Returns True if the AddOn data was changed (i.e. downloaded/updated), False otherwise. + """ + raise NotImplemented diff --git a/wau/providers/curseforge.py b/wau/providers/curseforge.py new file mode 100644 index 0000000..b70f190 --- /dev/null +++ b/wau/providers/curseforge.py @@ -0,0 +1,75 @@ +import logging + +from .base import Provider +from .. import http +from ..addons import Addon + +logger = logging.getLogger(__name__) + + +class CurseForge(Provider): + api_url = "https://addons-ecs.forgesvc.net" + + @classmethod + def is_supported(cls, url: str) -> bool: + return "curseforge.com/wow/addons/" in url + + @classmethod + def download(cls, addon: Addon) -> bool: + """ + Twitch API from: https://github.com/Gaz492/TwitchAPI. Thanks Gareth! <3 + """ + latest_file_url = cls._get_latest_file_url(addon) + try: + if addon.is_cached() and latest_file_url == addon.provider_data["file_url"]: + return False + except KeyError: + pass + + addon.create_download_dir(recreate=True) # clean download dir + http.download_zip(latest_file_url, addon.download_dir) + addon.provider_data["file_url"] = latest_file_url + return True + + @classmethod + def _get_curse_id(cls, addon: Addon) -> int: + try: + return addon.provider_data["curse_id"] + except KeyError: + pass + + logger.debug("Getting CurseForge AddOn ID") + slug = addon.url.split("/addons/")[-1] + query = " ".join(( # slug "big-wigs" becomes query "big-wigs bigwigs big wigs" + slug, + slug.replace("-", ""), + slug.replace("-", " ") + )) + addons = http.open( + url=f"{cls.api_url}/api/v2/addon/search", + params={ + "gameId": 1, # World of Warcraft + "pageSize": 10, + "searchFilter": query + } + ).json() + for a in addons: + if a["slug"] == slug: + addon.provider_data["curse_id"] = a["id"] + addon.name = a["name"] + return a["id"] + raise ValueError("AddOn slug not found in CurseForge search results.") + + @classmethod + def _get_curse_addon_info(cls, addon: Addon) -> dict: + curse_id = cls._get_curse_id(addon) + logger.debug("Getting latest AddOn info from CurseForge") + return http.open(f"{cls.api_url}/api/v2/addon/{curse_id}").json() + + @classmethod + def _get_latest_file_url(cls, addon: Addon) -> str: + info = cls._get_curse_addon_info(addon) + for file in info["latestFiles"]: + if file["gameVersionFlavor"] == "wow_classic" and file["releaseType"] == 1: # 1: release, 2: beta, 3: alpha + return file["downloadUrl"] + raise ValueError("No file found") diff --git a/wau/providers/git.py b/wau/providers/git.py new file mode 100644 index 0000000..657b849 --- /dev/null +++ b/wau/providers/git.py @@ -0,0 +1,64 @@ +import logging +import subprocess +from pathlib import Path + +from .base import Provider +from ..addons import Addon + +logger = logging.getLogger(__name__) + + +class Git(Provider): + @classmethod + def is_supported(cls, url: str) -> bool: + logger.debug("Performing 'git ls-remote' on %s", url) + try: + subprocess.run( + ["git", "ls-remote", "-h", "--exit-code", url], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + timeout=3, + check=True + ) + return True + except subprocess.CalledProcessError: + return False + + @classmethod + def download(cls, addon: Addon) -> bool: + if addon.is_cached(): + return cls._pull(addon) + cls._clone(addon) + return True + + @classmethod + def _clone(cls, addon: Addon) -> None: + logger.debug("Git clone %s", addon.url) + subprocess.call( + ["git", "clone", + *addon.url.replace("#", " -b ").split(), # allows for '#' syntax + "--depth", "1", + "--single-branch", + "--quiet"], + cwd=str(addon.download_dir) + ) + addon.name = next(x for x in addon.download_dir.iterdir() if x.is_dir()).name + + @classmethod + def _pull(cls, addon: Addon) -> bool: + logger.debug("Git pull %s", addon) + head = cls._head(addon.dirs[0]) # git doesn't care which AddOn dir, as long as we're in the repo + subprocess.run( + ["git", "pull", "--quiet"], + cwd=str(addon.dirs[0]) + ) + return head != cls._head(addon.dirs[0]) + + @classmethod + def _head(cls, path: Path) -> bytes: + p = subprocess.run( + ["git", "rev-parse", "HEAD"], + capture_output=True, + cwd=str(path) + ) + return p.stdout diff --git a/wau/providers/github.py b/wau/providers/github.py new file mode 100644 index 0000000..1fdcfee --- /dev/null +++ b/wau/providers/github.py @@ -0,0 +1,13 @@ +import re + +from ..addons import Addon + + +class Provider: + @classmethod + def is_supported(cls, url: str) -> bool: + return bool(re.search("github.com/.*/.*/releases", url, flags=re.IGNORECASE)) + + @classmethod + def download(cls, addon: Addon) -> bool: + raise NotImplemented diff --git a/wau/providers/web.py b/wau/providers/web.py new file mode 100644 index 0000000..724904d --- /dev/null +++ b/wau/providers/web.py @@ -0,0 +1,37 @@ +import logging +import urllib.error +import urllib.request + +from .base import Provider +from .. import http +from ..addons import Addon + +logger = logging.getLogger(__name__) + + +class Web(Provider): + user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0" + + @classmethod + def is_supported(cls, url: str) -> bool: + try: + http.open(url).head() + return True + except (urllib.error.HTTPError, urllib.error.URLError) as e: + logger.debug(e) + return False + + @classmethod + def download(cls, addon: Addon, url: str = None) -> bool: + url = url or addon.url + head = http.open(url).head() + try: + if addon.is_cached() and head["Last-Modified"] == addon.provider_data["Last-Modified"]: + return False + except KeyError: + pass + + addon.create_download_dir(recreate=True) # clean download dir + http.download_zip(url, addon.download_dir) + addon.provider_data["Last-Modified"] = head.get("Last-Modified") + return True diff --git a/wau/providers/wowinterface.py b/wau/providers/wowinterface.py new file mode 100644 index 0000000..94e762a --- /dev/null +++ b/wau/providers/wowinterface.py @@ -0,0 +1,17 @@ +import re + +from .web import Web +from ..addons import Addon + + +class WowInterface(Web): + @classmethod + def is_supported(cls, url: str) -> bool: + return "wowinterface.com/downloads/info" in url + + @classmethod + def download(cls, addon: Addon, url: str = None) -> bool: + addon_id, addon_name = re.search(r"info(\d+)-?(.*)", addon.url).groups() + if addon_name: + addon.name = addon_name.replace(".html", "") + return super().download(addon, url=f"https://cdn.wowinterface.com/downloads/file{addon_id}/")