From 87a0a36162ebcf0989068cfa4818a99b14148888 Mon Sep 17 00:00:00 2001 From: Rim Date: Sat, 4 Jan 2025 09:36:16 -0500 Subject: [PATCH] maint(): refactor directory structure & update build scripts --- assets/{build/icon => }/128x128.png | Bin assets/{build/icon => }/16x16.png | Bin assets/{build/icon => }/256x256.png | Bin assets/{build/icon => }/32x32.png | Bin assets/{build/icon => }/48x48.png | Bin assets/{build/icon => }/512x512.png | Bin assets/{build/icon => }/64x64.png | Bin assets/{build/icon => }/icon.ico | Bin build.bat | 10 - cod_api/LICENSE | 674 +++++++++++++ cod_api/PKG-INFO | 909 +++++++++++++++++ cod_api/README.rst | 891 +++++++++++++++++ cod_api/build.bat | 9 + cod_api/cod_api.egg-info/PKG-INFO | 916 ++++++++++++++++++ cod_api/cod_api.egg-info/SOURCES.txt | 11 + cod_api/cod_api.egg-info/dependency_links.txt | 1 + cod_api/cod_api.egg-info/requires.txt | 7 + cod_api/cod_api.egg-info/top_level.txt | 1 + cod_api/{ => cod_api}/__init__.py | 2 +- cod_api/{ => cod_api}/__init__dev.py | 2 +- cod_api/setup.cfg | 24 + cod_api/setup.py | 9 + deps/build-1.2.2.post1-py3-none-any.whl | Bin 0 -> 22950 bytes deps/cod_api-2.0.2-py3-none-any.whl | Bin 0 -> 28002 bytes deps/colorama-0.4.6-py2.py3-none-any.whl | Bin 0 -> 25335 bytes .../importlib_metadata-8.5.0-py3-none-any.whl | Bin 0 -> 26514 bytes deps/packaging-24.2-py3-none-any.whl | Bin 0 -> 65451 bytes deps/pyproject_hooks-1.2.0-py3-none-any.whl | Bin 0 -> 10216 bytes deps/tomli-2.2.1-py3-none-any.whl | Bin 0 -> 14257 bytes deps/zipp-3.21.0-py3-none-any.whl | Bin 0 -> 9630 bytes .../beautify_data.py | 0 .../beautify_data_match_info.py | 0 .../convert_epoch.py | 0 .../curl/beautify_json.py | 0 .../curl/curl_links.txt | 0 .../curl/get_stats_curl.ps1 | 0 .../fetch_playerdata.py | 0 scripts/build.bat | 10 + build.py => scripts/build.py | 4 +- .../curl_userInfo.ps1 | 0 .../sanitize_userInfo_regex.txt | 0 setup.py | 27 +- 42 files changed, 3473 insertions(+), 34 deletions(-) rename assets/{build/icon => }/128x128.png (100%) rename assets/{build/icon => }/16x16.png (100%) rename assets/{build/icon => }/256x256.png (100%) rename assets/{build/icon => }/32x32.png (100%) rename assets/{build/icon => }/48x48.png (100%) rename assets/{build/icon => }/512x512.png (100%) rename assets/{build/icon => }/64x64.png (100%) rename assets/{build/icon => }/icon.ico (100%) delete mode 100644 build.bat create mode 100644 cod_api/LICENSE create mode 100644 cod_api/PKG-INFO create mode 100644 cod_api/README.rst create mode 100644 cod_api/build.bat create mode 100644 cod_api/cod_api.egg-info/PKG-INFO create mode 100644 cod_api/cod_api.egg-info/SOURCES.txt create mode 100644 cod_api/cod_api.egg-info/dependency_links.txt create mode 100644 cod_api/cod_api.egg-info/requires.txt create mode 100644 cod_api/cod_api.egg-info/top_level.txt rename cod_api/{ => cod_api}/__init__.py (99%) rename cod_api/{ => cod_api}/__init__dev.py (99%) create mode 100644 cod_api/setup.cfg create mode 100644 cod_api/setup.py create mode 100644 deps/build-1.2.2.post1-py3-none-any.whl create mode 100644 deps/cod_api-2.0.2-py3-none-any.whl create mode 100644 deps/colorama-0.4.6-py2.py3-none-any.whl create mode 100644 deps/importlib_metadata-8.5.0-py3-none-any.whl create mode 100644 deps/packaging-24.2-py3-none-any.whl create mode 100644 deps/pyproject_hooks-1.2.0-py3-none-any.whl create mode 100644 deps/tomli-2.2.1-py3-none-any.whl create mode 100644 deps/zipp-3.21.0-py3-none-any.whl rename {depricated_dev_scripts => ref}/beautify_data.py (100%) rename {depricated_dev_scripts => ref}/beautify_data_match_info.py (100%) rename {depricated_dev_scripts => ref}/convert_epoch.py (100%) rename {depricated_dev_scripts => ref}/curl/beautify_json.py (100%) rename {depricated_dev_scripts => ref}/curl/curl_links.txt (100%) rename {depricated_dev_scripts => ref}/curl/get_stats_curl.ps1 (100%) rename {depricated_dev_scripts => ref}/fetch_playerdata.py (100%) create mode 100644 scripts/build.bat rename build.py => scripts/build.py (92%) rename curl_userInfo.ps1 => scripts/curl_userInfo.ps1 (100%) rename sanitize_userInfo_regex.txt => scripts/sanitize_userInfo_regex.txt (100%) diff --git a/assets/build/icon/128x128.png b/assets/128x128.png similarity index 100% rename from assets/build/icon/128x128.png rename to assets/128x128.png diff --git a/assets/build/icon/16x16.png b/assets/16x16.png similarity index 100% rename from assets/build/icon/16x16.png rename to assets/16x16.png diff --git a/assets/build/icon/256x256.png b/assets/256x256.png similarity index 100% rename from assets/build/icon/256x256.png rename to assets/256x256.png diff --git a/assets/build/icon/32x32.png b/assets/32x32.png similarity index 100% rename from assets/build/icon/32x32.png rename to assets/32x32.png diff --git a/assets/build/icon/48x48.png b/assets/48x48.png similarity index 100% rename from assets/build/icon/48x48.png rename to assets/48x48.png diff --git a/assets/build/icon/512x512.png b/assets/512x512.png similarity index 100% rename from assets/build/icon/512x512.png rename to assets/512x512.png diff --git a/assets/build/icon/64x64.png b/assets/64x64.png similarity index 100% rename from assets/build/icon/64x64.png rename to assets/64x64.png diff --git a/assets/build/icon/icon.ico b/assets/icon.ico similarity index 100% rename from assets/build/icon/icon.ico rename to assets/icon.ico diff --git a/build.bat b/build.bat deleted file mode 100644 index b620430..0000000 --- a/build.bat +++ /dev/null @@ -1,10 +0,0 @@ -@echo off - -cd /d %~dp0 :: Change directory to the location of this batch file -call venv\Scripts\activate :: Activate the virtual environment -pyinstaller --noconfirm --onefile --console --icon "assets\build\icon\icon.ico" get_cod_stats.py --distpath="bin" -n "get_cod_stats" - -rmdir /s /q build -del /q "get_cod_stats.spec" - -pause \ No newline at end of file diff --git a/cod_api/LICENSE b/cod_api/LICENSE new file mode 100644 index 0000000..0e27290 --- /dev/null +++ b/cod_api/LICENSE @@ -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) 2022 Todo Lodo + + 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: + + cod-api Copyright (__C) 2022 Todo Lodo & Engineer15 + 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/cod_api/PKG-INFO b/cod_api/PKG-INFO new file mode 100644 index 0000000..11a2d0d --- /dev/null +++ b/cod_api/PKG-INFO @@ -0,0 +1,909 @@ +Metadata-Version: 2.2 +Name: cod_api +Version: 2.0.2 +Summary: Call Of Duty API. +Home-page: https://codapi.dev/ +Author: Todo Lodo +Author-email: me@todolodo.xyz +Maintainer: Engineer15 +Maintainer-email: engineergamer15@gmail.com +License: GPL-3.0 +Project-URL: Source Code, https://github.com/TodoLodo2089/cod-python-api +Project-URL: Issue Tracker, https://github.com/TodoLodo2089/cod-python-api/issues +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Description-Content-Type: text/x-rst +License-File: LICENSE + +=================== +**cod-python-api** +=================== + +.. meta:: + :description: Call Of Duty API Library for python with the implementation of both public and private API used by activision on callofduty.com + :key: CallOfDuty API, CallOfDuty python API, CallOfDuty python + +.. image:: https://github.com/TodoLodo/cod-python-api/actions/workflows/codeql-analysis.yml/badge.svg?branch=main + :target: https://github.com/TodoLodo/cod-python-api.git + +.. image:: https://img.shields.io/endpoint?url=https://cod-python-api.todolodo.xyz/stats?q=version + :target: https://badge.fury.io/py/cod-api + +.. image:: https://img.shields.io/endpoint?url=https://cod-python-api.todolodo.xyz/stats?q=downloads + :target: https://badge.fury.io/gh/TodoLodo2089%2Fcod-python-api + +------------------------------------------------------------------------------------------------------------------------ + +**Call Of Duty API Library** for **python** with the implementation of both public and private API used by activision on +callofduty.com + +==== +Devs +==== +* `Todo Lodo`_ +* `Engineer15`_ + +.. _Todo Lodo: https://todolodo.xyz +.. _Engineer15: https://github.com/Engineer152 + +============ +Contributors +============ +* `Werseter`_ + +.. _Werseter: https://github.com/Werseter + +=============== +Partnered Code +=============== +`Node-CallOfDuty`_ by: `Lierrmm`_ + +.. _Node-CallOfDuty: https://github.com/Lierrmm/Node-CallOfDuty +.. _Lierrmm: https://github.com/Lierrmm + +============= +Documentation +============= +This package can be used directly as a python file or as a python library. + +Installation +============ + +Install cod-api library using `pip`_: + +.. code-block:: bash + + pip install -U cod-api + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + +Usage +===== + +Initiation +---------- + +Import module with its classes: + +.. code-block:: python + + from cod_api import API + + api = API() + + +.. _`logged in`: + +Login with your sso token: + +.. code-block:: python + + api.login('Your sso token') + +Your sso token can be found by longing in at `callofduty`_, opening dev tools (ctr+shift+I), going to Applications > +Storage > Cookies > https://callofduty.com, filter to search 'ACT_SSO_COOKIE' and copy the value. + +.. _callofduty: https://my.callofduty.com/ + +Game/Other sub classes +---------------------- + +Following importation and initiation of the class ``API``, its associated subclasses can be called by +``API.subClassName``. + +Below are the available sub classes: + ++-------------------+----------+ +| sub class | category | ++===================+==========+ +|* `ColdWar`_ | game | ++-------------------+----------+ +|* `ModernWarfare`_ | game | ++-------------------+----------+ +|* `ModernWarfare2`_| game | ++-------------------+----------+ +|* `Vanguard`_ | game | ++-------------------+----------+ +|* `Warzone`_ | game | ++-------------------+----------+ +|* `Warzone2`_ | game | ++-------------------+----------+ +|* `Me`_ | other | ++-------------------+----------+ +|* `Shop`_ | other | ++-------------------+----------+ +|* `Misc`_ | other | ++-------------------+----------+ + + + +For a detailed description, ``__doc__`` (docstring) of each sub class can be called as shown below: + +.. _`ColdWar`: + +``ColdWar``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ColdWar.__doc__) + +.. _`ModernWarfare`: + +``ModernWarfare``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ModernWarfare.__doc__) + +.. _`ModernWarfare2`: + +``ModernWarfare2``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ModernWarfare2.__doc__) + +.. _`Vanguard`: + +``Vanguard``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Vanguard.__doc__) + +.. _`Warzone`: + +``Warzone``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Warzone.__doc__) + +.. _`Warzone2`: + +``Warzone2``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Warzone2.__doc__) + +.. _`Me`: + +``Me``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Me.__doc__) + +.. _`Shop`: + +``Shop``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Shop.__doc__) + + +.. _`Misc`: + +``Misc``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Misc.__doc__) + +Full Profile History +-------------------- + +Any sub class of ``API`` that is of game category, has methods to check a player's combat history. +Note that before calling any sub class methods of ``API`` you must be `logged in`_. +Main method is ``fullData()`` and ``fullDataAsync()`` which is available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2``, ``Vanguard``, ``Warzone`` and ``Warzone2`` classes. + +Here's an example for retrieving **Warzone** full profile history of a player whose gamer tag is **Username#1234** on platform +**Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + import asyncio + + ## sync + # initiating the API class + api = API() + + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + profile = api.Warzone.fullData(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(profile) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + profile = await api.Warzone.fullDataAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(profile) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + + +Combat History +-------------- + +Main methods are ``combatHistory()`` and ``combatHistoryWithDate()`` for sync environments and ``combatHistoryAsync()`` +and ``combatHistoryWithDateAsync()`` for async environments which are available for all ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2``, ``Vanguard``, ``Warzone`` and ``Warzone2`` classes. + +The ``combatHistory()`` and ``combatHistoryAsync()`` takes 2 input parameters which are ``platform`` and ``gamertag`` of +type `cod_api.platforms`_ and string respectively. + +Here's an example for retrieving **Warzone** combat history of a player whose gamer tag is **Username#1234** on platform +**Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + hist = api.Warzone.combatHistory(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + hist = await api.Warzone.combatHistoryAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +The ``combatHistoryWithDate()`` and ``combatHistoryWithDateAsync()`` takes 4 input parameters which are ``platform``, +``gamertag``, ``start`` and ``end`` of type `cod_api.platforms`_, string, int and int respectively. + +``start`` and ``end`` parameters are utc timestamps in microseconds. + +Here's an example for retrieving **ModernWarfare** combat history of a player whose gamer tag is **Username#1234567** on +platform **Activision** with in the timestamps **1657919309** (Friday, 15 July 2022 21:08:29) and **1657949309** +(Saturday, 16 July 2022 05:28:29): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + hist = api.Warzone.combatHistoryWithDate(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + hist = await api.Warzone.combatHistoryWithDateAsync(platforms.Battlenet, "Username#1234", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Additionally the methods ``breakdown()`` and ``breakdownWithDate()`` for sync environments and ``breakdownAsync()`` and +``breakdownWithDateAsync()`` for async environments, can be used to retrieve combat history without details, where only +the platform played on, game title, UTC timestamp, type ID, match ID and map ID is returned for every match. These +methods are available for all ``ColdWar``, ``ModernWarfare``, ``ModernWarfare2``, ``Vanguard``, ``Warzone`` and +``Warzone2`` classes. + +The ``breakdown()`` and `breakdownAsync()`` takes 2 input parameters which are ``platform`` and ``gamertag`` of type +`cod_api.platforms`_ and string respectively. + +Here's an example for retrieving **Warzone** combat history breakdown of a player whose gamer tag is **Username#1234** +on platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history breakdown + hist_b = api.Warzone.breakdown(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist_b) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history breakdown + hist_b = await api.Warzone.breakdownAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist_b) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +The ``breakdownWithDate()`` and ``breakdownWithDateAsync()`` takes 4 input parameters which are ``platform``, +``gamertag``, ``start`` and ``end`` of type `cod_api.platforms`_, string, int and int respectively. + +``start`` and ``end`` parameters are utc timestamps in microseconds. + +Here's an example for retrieving **ModernWarfare** combat history breakdown of a player whose gamer tag is +**Username#1234567** on platform **Activision** with in the timestamps **1657919309** (Friday, 15 July 2022 21:08:29) +and **1657949309** (Saturday, 16 July 2022 05:28:29): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history breakdown + hist_b = api.Warzone.breakdownWithDate(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist_b) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history breakdown + hist_b = await api.Warzone.breakdownWithDateAsync(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist_b) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Match Details +------------- + +To retrieve details of a specific match, the method ``matchInfo()`` for sync environments and ``matchInfoAsync()`` for +async environments can be used. These methods are available for all ``ColdWar``, ``ModernWarfare``, ``ModernWarfare2``, +``Vanguard``, ``Warzone`` and ``Warzone2`` classes. Details returned by this method contains additional data than that +of details returned by the **combat history** methods for a single match. + +The ``matchInfo()`` and ``matchInfoAsync()`` takes 2 input parameters which are ``platform`` and ``matchId`` of type +`cod_api.platforms`_ and integer respectively. + +*Optionally the match ID can be retrieved during your gameplay where it will be visible on bottom left corner* + +Here's an example for retrieving **Warzone** match details of a match where its id is **9484583876389482453** +on platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving match details + details = api.Warzone.matchInfo(platforms.Battlenet, 9484583876389482453) # returns data of type dict + + # printing results to console + print(details) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving match details + details = await api.Warzone.matchInfoAsync(platforms.Battlenet, 9484583876389482453) # returns data of type dict + + # printing results to console + print(details) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Season Loot +----------- + +Using the ``seasonLoot()`` for sync environments and ``seasonLootAsync()`` for async environments, player's obtained +season loot can be retrieved for a specific game and this method is available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2`` and ``Vanguard`` classes. + +The ``seasonLoot()`` and ``seasonLootAsync()`` takes 2 input parameters which are ``platform`` and ``matchId`` of type +`cod_api.platforms`_ and integer respectively. + +Here's an example for retrieving **ColdWar** season loot obtained by a player whose gamer tag is **Username#1234** on +platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving season loot + loot = api.ColdWar.seasonLoot(platforms.Battlenet, "Username#1234") # returns data of type dict) + + # printing results to console + print(loot) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving season loot + loot = await api.ColdWar.seasonLootAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(loot) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Map List +-------- + +Using the ``mapList()`` for sync environments and ``mapListAsync()`` for async environments, all the maps and its +available modes can be retrieved for a specific game. These methods are available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2`` and ``Vanguard`` classes. + +The ``mapList()`` and ``mapListAsync()`` takes 1 input parameters which is ``platform`` of type `cod_api.platforms`_. + +Here's an example for retrieving **Vanguard** map list and available modes respectively on platform PlayStation +(**PSN**): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving maps and respective modes available + maps = api.Vanguard.mapList(platforms.PSN) # returns data of type dict + + # printing results to console + print(maps) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving season loot + maps = await api.Vanguard.mapListAsync(platforms.PSN) # returns data of type dict + + # printing results to console + print(maps) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + + +.. _cod_api.platforms: + +platforms +--------- + +``platforms`` is an enum class available in ``cod_api`` which is used to specify the platform in certain method calls. + +Available ``platforms`` are as follows: + ++----------------------+----------------------------------------+ +|Platform | Remarks | ++======================+========================================+ +|platforms.All | All (no usage till further updates) | ++----------------------+----------------------------------------+ +|platforms.Activision | Activision | ++----------------------+----------------------------------------+ +|platforms.Battlenet | Battlenet | ++----------------------+----------------------------------------+ +|platforms.PSN | PlayStation | ++----------------------+----------------------------------------+ +|platforms.Steam | Steam (no usage till further updates) | ++----------------------+----------------------------------------+ +|platforms.Uno | Uno (activision unique id) | ++----------------------+----------------------------------------+ +|platforms.XBOX | Xbox | ++----------------------+----------------------------------------+ + +``platforms`` can be imported and used as follows: + +.. code-block:: python + + from cod_api import platforms + + platforms.All # All (no usage till further updates) + + platforms.Activision # Activision + + platforms.Battlenet # Battlenet + + platforms.PSN # PlayStation + + platforms.Steam # Steam (no usage till further updates) + + platforms.Uno # Uno (activision unique id) + + platforms.XBOX # Xbox + +User Info +---------- + +Using the ``info()`` method in sub class ``Me`` of ``API`` user information can be retrieved of the sso-token logged in +with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + # login in with sso token + api.login('your_sso_token') + + # retrieving user info + userInfo = api.Me.info() # returns data of type dict + + # printing results to console + print(userInfo) + +User Friend Feed +---------------- + +Using the methods, ``friendFeed()`` for sync environments and ``friendFeedAsync()`` for async environments, in sub class +``Me`` of ``API``, user's friend feed can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user friend feed + friendFeed = api.Me.friendFeed() # returns data of type dict + + # printing results to console + print(friendFeed) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user friend feed + friendFeed = await api.Me.friendFeedAsync() # returns data of type dict + + # printing results to console + print(friendFeed) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Event Feed +---------------- + +Using the methods ``eventFeed()`` for sync environments and ``eventFeedAsync()`` for async environments, in sub class +``Me`` of ``API`` user's event feed can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user event feed + eventFeed = api.Me.eventFeed() # returns data of type dict + + # printing results to console + print(eventFeed) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user event feed + eventFeed = await api.Me.eventFeedAsync() # returns data of type dict + + # printing results to console + print(eventFeed) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Identities +---------------- + +Using the methods ``loggedInIdentities()`` for sync environments and ``loggedInIdentitiesAsync()`` for async +environments, in sub class ``Me`` of ``API`` user's identities can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user identities + identities = api.Me.loggedInIdentities() # returns data of type dict + + # printing results to console + print(identities) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user identities + identities = await api.Me.loggedInIdentitiesAsync() # returns data of type dict + + # printing results to console + print(identities) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User COD Points +---------------- + +Using the methods ``codPoints()`` for sync environments and ``codPointsAsync()`` for async environments, in sub class +``Me`` of ``API`` user's cod points can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user cod points + cp = api.Me.codPoints() # returns data of type dict + + # printing results to console + print(cp) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user cod points + cp = await api.Me.codPointsAsync() # returns data of type dict + + # printing results to console + print(cp) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Accounts +---------------- + +Using the methods ``connectedAccounts()`` for sync environments and ``connectedAccountsAsync()`` for async environments, +in sub class ``Me`` of ``API`` user's connected accounts can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user connected accounts + accounts = api.Me.connectedAccounts() # returns data of type dict + + # printing results to console + print(accounts) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user connected accounts + accounts = await api.Me.connectedAccountsAsync() # returns data of type dict + + # printing results to console + print(accounts) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User settings +---------------- + +Using the methods ``settings()`` for sync environments and ``settingsAsync()`` for async environments, in sub class +``Me`` of ``API`` user's settings can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user settings + settings = api.Me.settings() # returns data of type dict + + # printing results to console + print(settings) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user settings + settings = await api.Me.settingsAsync() # returns data of type dict + + # printing results to console + print(settings) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +------------------------------------------------------------------------------------------------------------------------------- + +Donate +====== + +* `Donate Todo Lodo`_ +* `Donate Engineer152`_ +* `Donate Werseter`_ + +.. _Donate Todo Lodo: https://www.buymeacoffee.com/todolodo2089 +.. _Donate Engineer152: https://www.paypal.com/paypalme/engineer15 +.. _Donate Werseter: https://paypal.me/werseter diff --git a/cod_api/README.rst b/cod_api/README.rst new file mode 100644 index 0000000..94eb087 --- /dev/null +++ b/cod_api/README.rst @@ -0,0 +1,891 @@ +=================== +**cod-python-api** +=================== + +.. meta:: + :description: Call Of Duty API Library for python with the implementation of both public and private API used by activision on callofduty.com + :key: CallOfDuty API, CallOfDuty python API, CallOfDuty python + +.. image:: https://github.com/TodoLodo/cod-python-api/actions/workflows/codeql-analysis.yml/badge.svg?branch=main + :target: https://github.com/TodoLodo/cod-python-api.git + +.. image:: https://img.shields.io/endpoint?url=https://cod-python-api.todolodo.xyz/stats?q=version + :target: https://badge.fury.io/py/cod-api + +.. image:: https://img.shields.io/endpoint?url=https://cod-python-api.todolodo.xyz/stats?q=downloads + :target: https://badge.fury.io/gh/TodoLodo2089%2Fcod-python-api + +------------------------------------------------------------------------------------------------------------------------ + +**Call Of Duty API Library** for **python** with the implementation of both public and private API used by activision on +callofduty.com + +==== +Devs +==== +* `Todo Lodo`_ +* `Engineer15`_ + +.. _Todo Lodo: https://todolodo.xyz +.. _Engineer15: https://github.com/Engineer152 + +============ +Contributors +============ +* `Werseter`_ + +.. _Werseter: https://github.com/Werseter + +=============== +Partnered Code +=============== +`Node-CallOfDuty`_ by: `Lierrmm`_ + +.. _Node-CallOfDuty: https://github.com/Lierrmm/Node-CallOfDuty +.. _Lierrmm: https://github.com/Lierrmm + +============= +Documentation +============= +This package can be used directly as a python file or as a python library. + +Installation +============ + +Install cod-api library using `pip`_: + +.. code-block:: bash + + pip install -U cod-api + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + +Usage +===== + +Initiation +---------- + +Import module with its classes: + +.. code-block:: python + + from cod_api import API + + api = API() + + +.. _`logged in`: + +Login with your sso token: + +.. code-block:: python + + api.login('Your sso token') + +Your sso token can be found by longing in at `callofduty`_, opening dev tools (ctr+shift+I), going to Applications > +Storage > Cookies > https://callofduty.com, filter to search 'ACT_SSO_COOKIE' and copy the value. + +.. _callofduty: https://my.callofduty.com/ + +Game/Other sub classes +---------------------- + +Following importation and initiation of the class ``API``, its associated subclasses can be called by +``API.subClassName``. + +Below are the available sub classes: + ++-------------------+----------+ +| sub class | category | ++===================+==========+ +|* `ColdWar`_ | game | ++-------------------+----------+ +|* `ModernWarfare`_ | game | ++-------------------+----------+ +|* `ModernWarfare2`_| game | ++-------------------+----------+ +|* `Vanguard`_ | game | ++-------------------+----------+ +|* `Warzone`_ | game | ++-------------------+----------+ +|* `Warzone2`_ | game | ++-------------------+----------+ +|* `Me`_ | other | ++-------------------+----------+ +|* `Shop`_ | other | ++-------------------+----------+ +|* `Misc`_ | other | ++-------------------+----------+ + + + +For a detailed description, ``__doc__`` (docstring) of each sub class can be called as shown below: + +.. _`ColdWar`: + +``ColdWar``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ColdWar.__doc__) + +.. _`ModernWarfare`: + +``ModernWarfare``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ModernWarfare.__doc__) + +.. _`ModernWarfare2`: + +``ModernWarfare2``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ModernWarfare2.__doc__) + +.. _`Vanguard`: + +``Vanguard``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Vanguard.__doc__) + +.. _`Warzone`: + +``Warzone``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Warzone.__doc__) + +.. _`Warzone2`: + +``Warzone2``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Warzone2.__doc__) + +.. _`Me`: + +``Me``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Me.__doc__) + +.. _`Shop`: + +``Shop``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Shop.__doc__) + + +.. _`Misc`: + +``Misc``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Misc.__doc__) + +Full Profile History +-------------------- + +Any sub class of ``API`` that is of game category, has methods to check a player's combat history. +Note that before calling any sub class methods of ``API`` you must be `logged in`_. +Main method is ``fullData()`` and ``fullDataAsync()`` which is available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2``, ``Vanguard``, ``Warzone`` and ``Warzone2`` classes. + +Here's an example for retrieving **Warzone** full profile history of a player whose gamer tag is **Username#1234** on platform +**Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + import asyncio + + ## sync + # initiating the API class + api = API() + + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + profile = api.Warzone.fullData(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(profile) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + profile = await api.Warzone.fullDataAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(profile) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + + +Combat History +-------------- + +Main methods are ``combatHistory()`` and ``combatHistoryWithDate()`` for sync environments and ``combatHistoryAsync()`` +and ``combatHistoryWithDateAsync()`` for async environments which are available for all ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2``, ``Vanguard``, ``Warzone`` and ``Warzone2`` classes. + +The ``combatHistory()`` and ``combatHistoryAsync()`` takes 2 input parameters which are ``platform`` and ``gamertag`` of +type `cod_api.platforms`_ and string respectively. + +Here's an example for retrieving **Warzone** combat history of a player whose gamer tag is **Username#1234** on platform +**Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + hist = api.Warzone.combatHistory(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + hist = await api.Warzone.combatHistoryAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +The ``combatHistoryWithDate()`` and ``combatHistoryWithDateAsync()`` takes 4 input parameters which are ``platform``, +``gamertag``, ``start`` and ``end`` of type `cod_api.platforms`_, string, int and int respectively. + +``start`` and ``end`` parameters are utc timestamps in microseconds. + +Here's an example for retrieving **ModernWarfare** combat history of a player whose gamer tag is **Username#1234567** on +platform **Activision** with in the timestamps **1657919309** (Friday, 15 July 2022 21:08:29) and **1657949309** +(Saturday, 16 July 2022 05:28:29): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + hist = api.Warzone.combatHistoryWithDate(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + hist = await api.Warzone.combatHistoryWithDateAsync(platforms.Battlenet, "Username#1234", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Additionally the methods ``breakdown()`` and ``breakdownWithDate()`` for sync environments and ``breakdownAsync()`` and +``breakdownWithDateAsync()`` for async environments, can be used to retrieve combat history without details, where only +the platform played on, game title, UTC timestamp, type ID, match ID and map ID is returned for every match. These +methods are available for all ``ColdWar``, ``ModernWarfare``, ``ModernWarfare2``, ``Vanguard``, ``Warzone`` and +``Warzone2`` classes. + +The ``breakdown()`` and `breakdownAsync()`` takes 2 input parameters which are ``platform`` and ``gamertag`` of type +`cod_api.platforms`_ and string respectively. + +Here's an example for retrieving **Warzone** combat history breakdown of a player whose gamer tag is **Username#1234** +on platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history breakdown + hist_b = api.Warzone.breakdown(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist_b) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history breakdown + hist_b = await api.Warzone.breakdownAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist_b) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +The ``breakdownWithDate()`` and ``breakdownWithDateAsync()`` takes 4 input parameters which are ``platform``, +``gamertag``, ``start`` and ``end`` of type `cod_api.platforms`_, string, int and int respectively. + +``start`` and ``end`` parameters are utc timestamps in microseconds. + +Here's an example for retrieving **ModernWarfare** combat history breakdown of a player whose gamer tag is +**Username#1234567** on platform **Activision** with in the timestamps **1657919309** (Friday, 15 July 2022 21:08:29) +and **1657949309** (Saturday, 16 July 2022 05:28:29): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history breakdown + hist_b = api.Warzone.breakdownWithDate(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist_b) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history breakdown + hist_b = await api.Warzone.breakdownWithDateAsync(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist_b) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Match Details +------------- + +To retrieve details of a specific match, the method ``matchInfo()`` for sync environments and ``matchInfoAsync()`` for +async environments can be used. These methods are available for all ``ColdWar``, ``ModernWarfare``, ``ModernWarfare2``, +``Vanguard``, ``Warzone`` and ``Warzone2`` classes. Details returned by this method contains additional data than that +of details returned by the **combat history** methods for a single match. + +The ``matchInfo()`` and ``matchInfoAsync()`` takes 2 input parameters which are ``platform`` and ``matchId`` of type +`cod_api.platforms`_ and integer respectively. + +*Optionally the match ID can be retrieved during your gameplay where it will be visible on bottom left corner* + +Here's an example for retrieving **Warzone** match details of a match where its id is **9484583876389482453** +on platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving match details + details = api.Warzone.matchInfo(platforms.Battlenet, 9484583876389482453) # returns data of type dict + + # printing results to console + print(details) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving match details + details = await api.Warzone.matchInfoAsync(platforms.Battlenet, 9484583876389482453) # returns data of type dict + + # printing results to console + print(details) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Season Loot +----------- + +Using the ``seasonLoot()`` for sync environments and ``seasonLootAsync()`` for async environments, player's obtained +season loot can be retrieved for a specific game and this method is available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2`` and ``Vanguard`` classes. + +The ``seasonLoot()`` and ``seasonLootAsync()`` takes 2 input parameters which are ``platform`` and ``matchId`` of type +`cod_api.platforms`_ and integer respectively. + +Here's an example for retrieving **ColdWar** season loot obtained by a player whose gamer tag is **Username#1234** on +platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving season loot + loot = api.ColdWar.seasonLoot(platforms.Battlenet, "Username#1234") # returns data of type dict) + + # printing results to console + print(loot) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving season loot + loot = await api.ColdWar.seasonLootAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(loot) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Map List +-------- + +Using the ``mapList()`` for sync environments and ``mapListAsync()`` for async environments, all the maps and its +available modes can be retrieved for a specific game. These methods are available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2`` and ``Vanguard`` classes. + +The ``mapList()`` and ``mapListAsync()`` takes 1 input parameters which is ``platform`` of type `cod_api.platforms`_. + +Here's an example for retrieving **Vanguard** map list and available modes respectively on platform PlayStation +(**PSN**): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving maps and respective modes available + maps = api.Vanguard.mapList(platforms.PSN) # returns data of type dict + + # printing results to console + print(maps) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving season loot + maps = await api.Vanguard.mapListAsync(platforms.PSN) # returns data of type dict + + # printing results to console + print(maps) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + + +.. _cod_api.platforms: + +platforms +--------- + +``platforms`` is an enum class available in ``cod_api`` which is used to specify the platform in certain method calls. + +Available ``platforms`` are as follows: + ++----------------------+----------------------------------------+ +|Platform | Remarks | ++======================+========================================+ +|platforms.All | All (no usage till further updates) | ++----------------------+----------------------------------------+ +|platforms.Activision | Activision | ++----------------------+----------------------------------------+ +|platforms.Battlenet | Battlenet | ++----------------------+----------------------------------------+ +|platforms.PSN | PlayStation | ++----------------------+----------------------------------------+ +|platforms.Steam | Steam (no usage till further updates) | ++----------------------+----------------------------------------+ +|platforms.Uno | Uno (activision unique id) | ++----------------------+----------------------------------------+ +|platforms.XBOX | Xbox | ++----------------------+----------------------------------------+ + +``platforms`` can be imported and used as follows: + +.. code-block:: python + + from cod_api import platforms + + platforms.All # All (no usage till further updates) + + platforms.Activision # Activision + + platforms.Battlenet # Battlenet + + platforms.PSN # PlayStation + + platforms.Steam # Steam (no usage till further updates) + + platforms.Uno # Uno (activision unique id) + + platforms.XBOX # Xbox + +User Info +---------- + +Using the ``info()`` method in sub class ``Me`` of ``API`` user information can be retrieved of the sso-token logged in +with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + # login in with sso token + api.login('your_sso_token') + + # retrieving user info + userInfo = api.Me.info() # returns data of type dict + + # printing results to console + print(userInfo) + +User Friend Feed +---------------- + +Using the methods, ``friendFeed()`` for sync environments and ``friendFeedAsync()`` for async environments, in sub class +``Me`` of ``API``, user's friend feed can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user friend feed + friendFeed = api.Me.friendFeed() # returns data of type dict + + # printing results to console + print(friendFeed) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user friend feed + friendFeed = await api.Me.friendFeedAsync() # returns data of type dict + + # printing results to console + print(friendFeed) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Event Feed +---------------- + +Using the methods ``eventFeed()`` for sync environments and ``eventFeedAsync()`` for async environments, in sub class +``Me`` of ``API`` user's event feed can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user event feed + eventFeed = api.Me.eventFeed() # returns data of type dict + + # printing results to console + print(eventFeed) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user event feed + eventFeed = await api.Me.eventFeedAsync() # returns data of type dict + + # printing results to console + print(eventFeed) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Identities +---------------- + +Using the methods ``loggedInIdentities()`` for sync environments and ``loggedInIdentitiesAsync()`` for async +environments, in sub class ``Me`` of ``API`` user's identities can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user identities + identities = api.Me.loggedInIdentities() # returns data of type dict + + # printing results to console + print(identities) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user identities + identities = await api.Me.loggedInIdentitiesAsync() # returns data of type dict + + # printing results to console + print(identities) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User COD Points +---------------- + +Using the methods ``codPoints()`` for sync environments and ``codPointsAsync()`` for async environments, in sub class +``Me`` of ``API`` user's cod points can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user cod points + cp = api.Me.codPoints() # returns data of type dict + + # printing results to console + print(cp) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user cod points + cp = await api.Me.codPointsAsync() # returns data of type dict + + # printing results to console + print(cp) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Accounts +---------------- + +Using the methods ``connectedAccounts()`` for sync environments and ``connectedAccountsAsync()`` for async environments, +in sub class ``Me`` of ``API`` user's connected accounts can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user connected accounts + accounts = api.Me.connectedAccounts() # returns data of type dict + + # printing results to console + print(accounts) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user connected accounts + accounts = await api.Me.connectedAccountsAsync() # returns data of type dict + + # printing results to console + print(accounts) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User settings +---------------- + +Using the methods ``settings()`` for sync environments and ``settingsAsync()`` for async environments, in sub class +``Me`` of ``API`` user's settings can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user settings + settings = api.Me.settings() # returns data of type dict + + # printing results to console + print(settings) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user settings + settings = await api.Me.settingsAsync() # returns data of type dict + + # printing results to console + print(settings) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +------------------------------------------------------------------------------------------------------------------------------- + +Donate +====== + +* `Donate Todo Lodo`_ +* `Donate Engineer152`_ +* `Donate Werseter`_ + +.. _Donate Todo Lodo: https://www.buymeacoffee.com/todolodo2089 +.. _Donate Engineer152: https://www.paypal.com/paypalme/engineer15 +.. _Donate Werseter: https://paypal.me/werseter diff --git a/cod_api/build.bat b/cod_api/build.bat new file mode 100644 index 0000000..effe69a --- /dev/null +++ b/cod_api/build.bat @@ -0,0 +1,9 @@ +@echo off + +cd /d %~dp0 :: Change directory to the location of this batch file +call ../venv/Scripts/activate :: Activate the virtual environment +python -m build + +mv dist/cod_api-2.0.2-py3-none-any.whl ../deps/. + +pause diff --git a/cod_api/cod_api.egg-info/PKG-INFO b/cod_api/cod_api.egg-info/PKG-INFO new file mode 100644 index 0000000..6c48b6c --- /dev/null +++ b/cod_api/cod_api.egg-info/PKG-INFO @@ -0,0 +1,916 @@ +Metadata-Version: 2.1 +Name: cod_api +Version: 2.0.2 +Summary: Call Of Duty API. +Home-page: https://codapi.dev/ +Author: Todo Lodo +Author-email: me@todolodo.xyz +Maintainer: Engineer15 +Maintainer-email: engineergamer15@gmail.com +License: GPL-3.0 +Project-URL: Source Code, https://github.com/TodoLodo2089/cod-python-api +Project-URL: Issue Tracker, https://github.com/TodoLodo2089/cod-python-api/issues +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: asyncio +Requires-Dist: aiohttp +Requires-Dist: datetime +Requires-Dist: requests +Requires-Dist: uuid +Requires-Dist: urllib3 +Requires-Dist: enum34 + +=================== +**cod-python-api** +=================== + +.. meta:: + :description: Call Of Duty API Library for python with the implementation of both public and private API used by activision on callofduty.com + :key: CallOfDuty API, CallOfDuty python API, CallOfDuty python + +.. image:: https://github.com/TodoLodo/cod-python-api/actions/workflows/codeql-analysis.yml/badge.svg?branch=main + :target: https://github.com/TodoLodo/cod-python-api.git + +.. image:: https://img.shields.io/endpoint?url=https://cod-python-api.todolodo.xyz/stats?q=version + :target: https://badge.fury.io/py/cod-api + +.. image:: https://img.shields.io/endpoint?url=https://cod-python-api.todolodo.xyz/stats?q=downloads + :target: https://badge.fury.io/gh/TodoLodo2089%2Fcod-python-api + +------------------------------------------------------------------------------------------------------------------------ + +**Call Of Duty API Library** for **python** with the implementation of both public and private API used by activision on +callofduty.com + +==== +Devs +==== +* `Todo Lodo`_ +* `Engineer15`_ + +.. _Todo Lodo: https://todolodo.xyz +.. _Engineer15: https://github.com/Engineer152 + +============ +Contributors +============ +* `Werseter`_ + +.. _Werseter: https://github.com/Werseter + +=============== +Partnered Code +=============== +`Node-CallOfDuty`_ by: `Lierrmm`_ + +.. _Node-CallOfDuty: https://github.com/Lierrmm/Node-CallOfDuty +.. _Lierrmm: https://github.com/Lierrmm + +============= +Documentation +============= +This package can be used directly as a python file or as a python library. + +Installation +============ + +Install cod-api library using `pip`_: + +.. code-block:: bash + + pip install -U cod-api + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + +Usage +===== + +Initiation +---------- + +Import module with its classes: + +.. code-block:: python + + from cod_api import API + + api = API() + + +.. _`logged in`: + +Login with your sso token: + +.. code-block:: python + + api.login('Your sso token') + +Your sso token can be found by longing in at `callofduty`_, opening dev tools (ctr+shift+I), going to Applications > +Storage > Cookies > https://callofduty.com, filter to search 'ACT_SSO_COOKIE' and copy the value. + +.. _callofduty: https://my.callofduty.com/ + +Game/Other sub classes +---------------------- + +Following importation and initiation of the class ``API``, its associated subclasses can be called by +``API.subClassName``. + +Below are the available sub classes: + ++-------------------+----------+ +| sub class | category | ++===================+==========+ +|* `ColdWar`_ | game | ++-------------------+----------+ +|* `ModernWarfare`_ | game | ++-------------------+----------+ +|* `ModernWarfare2`_| game | ++-------------------+----------+ +|* `Vanguard`_ | game | ++-------------------+----------+ +|* `Warzone`_ | game | ++-------------------+----------+ +|* `Warzone2`_ | game | ++-------------------+----------+ +|* `Me`_ | other | ++-------------------+----------+ +|* `Shop`_ | other | ++-------------------+----------+ +|* `Misc`_ | other | ++-------------------+----------+ + + + +For a detailed description, ``__doc__`` (docstring) of each sub class can be called as shown below: + +.. _`ColdWar`: + +``ColdWar``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ColdWar.__doc__) + +.. _`ModernWarfare`: + +``ModernWarfare``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ModernWarfare.__doc__) + +.. _`ModernWarfare2`: + +``ModernWarfare2``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.ModernWarfare2.__doc__) + +.. _`Vanguard`: + +``Vanguard``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Vanguard.__doc__) + +.. _`Warzone`: + +``Warzone``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Warzone.__doc__) + +.. _`Warzone2`: + +``Warzone2``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Warzone2.__doc__) + +.. _`Me`: + +``Me``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Me.__doc__) + +.. _`Shop`: + +``Shop``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Shop.__doc__) + + +.. _`Misc`: + +``Misc``: + +.. code-block:: python + + from cod_api import API + + api = API() + + # print out the docstring + print(api.Misc.__doc__) + +Full Profile History +-------------------- + +Any sub class of ``API`` that is of game category, has methods to check a player's combat history. +Note that before calling any sub class methods of ``API`` you must be `logged in`_. +Main method is ``fullData()`` and ``fullDataAsync()`` which is available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2``, ``Vanguard``, ``Warzone`` and ``Warzone2`` classes. + +Here's an example for retrieving **Warzone** full profile history of a player whose gamer tag is **Username#1234** on platform +**Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + import asyncio + + ## sync + # initiating the API class + api = API() + + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + profile = api.Warzone.fullData(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(profile) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + profile = await api.Warzone.fullDataAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(profile) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + + +Combat History +-------------- + +Main methods are ``combatHistory()`` and ``combatHistoryWithDate()`` for sync environments and ``combatHistoryAsync()`` +and ``combatHistoryWithDateAsync()`` for async environments which are available for all ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2``, ``Vanguard``, ``Warzone`` and ``Warzone2`` classes. + +The ``combatHistory()`` and ``combatHistoryAsync()`` takes 2 input parameters which are ``platform`` and ``gamertag`` of +type `cod_api.platforms`_ and string respectively. + +Here's an example for retrieving **Warzone** combat history of a player whose gamer tag is **Username#1234** on platform +**Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + hist = api.Warzone.combatHistory(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + hist = await api.Warzone.combatHistoryAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +The ``combatHistoryWithDate()`` and ``combatHistoryWithDateAsync()`` takes 4 input parameters which are ``platform``, +``gamertag``, ``start`` and ``end`` of type `cod_api.platforms`_, string, int and int respectively. + +``start`` and ``end`` parameters are utc timestamps in microseconds. + +Here's an example for retrieving **ModernWarfare** combat history of a player whose gamer tag is **Username#1234567** on +platform **Activision** with in the timestamps **1657919309** (Friday, 15 July 2022 21:08:29) and **1657949309** +(Saturday, 16 July 2022 05:28:29): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history + hist = api.Warzone.combatHistoryWithDate(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history + hist = await api.Warzone.combatHistoryWithDateAsync(platforms.Battlenet, "Username#1234", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Additionally the methods ``breakdown()`` and ``breakdownWithDate()`` for sync environments and ``breakdownAsync()`` and +``breakdownWithDateAsync()`` for async environments, can be used to retrieve combat history without details, where only +the platform played on, game title, UTC timestamp, type ID, match ID and map ID is returned for every match. These +methods are available for all ``ColdWar``, ``ModernWarfare``, ``ModernWarfare2``, ``Vanguard``, ``Warzone`` and +``Warzone2`` classes. + +The ``breakdown()`` and `breakdownAsync()`` takes 2 input parameters which are ``platform`` and ``gamertag`` of type +`cod_api.platforms`_ and string respectively. + +Here's an example for retrieving **Warzone** combat history breakdown of a player whose gamer tag is **Username#1234** +on platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history breakdown + hist_b = api.Warzone.breakdown(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist_b) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history breakdown + hist_b = await api.Warzone.breakdownAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(hist_b) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +The ``breakdownWithDate()`` and ``breakdownWithDateAsync()`` takes 4 input parameters which are ``platform``, +``gamertag``, ``start`` and ``end`` of type `cod_api.platforms`_, string, int and int respectively. + +``start`` and ``end`` parameters are utc timestamps in microseconds. + +Here's an example for retrieving **ModernWarfare** combat history breakdown of a player whose gamer tag is +**Username#1234567** on platform **Activision** with in the timestamps **1657919309** (Friday, 15 July 2022 21:08:29) +and **1657949309** (Saturday, 16 July 2022 05:28:29): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving combat history breakdown + hist_b = api.Warzone.breakdownWithDate(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist_b) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving combat history breakdown + hist_b = await api.Warzone.breakdownWithDateAsync(platforms.Activision, "Username#1234567", 1657919309, 1657949309) # returns data of type dict + + # printing results to console + print(hist_b) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Match Details +------------- + +To retrieve details of a specific match, the method ``matchInfo()`` for sync environments and ``matchInfoAsync()`` for +async environments can be used. These methods are available for all ``ColdWar``, ``ModernWarfare``, ``ModernWarfare2``, +``Vanguard``, ``Warzone`` and ``Warzone2`` classes. Details returned by this method contains additional data than that +of details returned by the **combat history** methods for a single match. + +The ``matchInfo()`` and ``matchInfoAsync()`` takes 2 input parameters which are ``platform`` and ``matchId`` of type +`cod_api.platforms`_ and integer respectively. + +*Optionally the match ID can be retrieved during your gameplay where it will be visible on bottom left corner* + +Here's an example for retrieving **Warzone** match details of a match where its id is **9484583876389482453** +on platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving match details + details = api.Warzone.matchInfo(platforms.Battlenet, 9484583876389482453) # returns data of type dict + + # printing results to console + print(details) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving match details + details = await api.Warzone.matchInfoAsync(platforms.Battlenet, 9484583876389482453) # returns data of type dict + + # printing results to console + print(details) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Season Loot +----------- + +Using the ``seasonLoot()`` for sync environments and ``seasonLootAsync()`` for async environments, player's obtained +season loot can be retrieved for a specific game and this method is available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2`` and ``Vanguard`` classes. + +The ``seasonLoot()`` and ``seasonLootAsync()`` takes 2 input parameters which are ``platform`` and ``matchId`` of type +`cod_api.platforms`_ and integer respectively. + +Here's an example for retrieving **ColdWar** season loot obtained by a player whose gamer tag is **Username#1234** on +platform **Battlenet**: + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving season loot + loot = api.ColdWar.seasonLoot(platforms.Battlenet, "Username#1234") # returns data of type dict) + + # printing results to console + print(loot) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving season loot + loot = await api.ColdWar.seasonLootAsync(platforms.Battlenet, "Username#1234") # returns data of type dict + + # printing results to console + print(loot) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +Map List +-------- + +Using the ``mapList()`` for sync environments and ``mapListAsync()`` for async environments, all the maps and its +available modes can be retrieved for a specific game. These methods are available for ``ColdWar``, ``ModernWarfare``, +``ModernWarfare2`` and ``Vanguard`` classes. + +The ``mapList()`` and ``mapListAsync()`` takes 1 input parameters which is ``platform`` of type `cod_api.platforms`_. + +Here's an example for retrieving **Vanguard** map list and available modes respectively on platform PlayStation +(**PSN**): + +.. code-block:: python + + from cod_api import API, platforms + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving maps and respective modes available + maps = api.Vanguard.mapList(platforms.PSN) # returns data of type dict + + # printing results to console + print(maps) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving season loot + maps = await api.Vanguard.mapListAsync(platforms.PSN) # returns data of type dict + + # printing results to console + print(maps) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + + +.. _cod_api.platforms: + +platforms +--------- + +``platforms`` is an enum class available in ``cod_api`` which is used to specify the platform in certain method calls. + +Available ``platforms`` are as follows: + ++----------------------+----------------------------------------+ +|Platform | Remarks | ++======================+========================================+ +|platforms.All | All (no usage till further updates) | ++----------------------+----------------------------------------+ +|platforms.Activision | Activision | ++----------------------+----------------------------------------+ +|platforms.Battlenet | Battlenet | ++----------------------+----------------------------------------+ +|platforms.PSN | PlayStation | ++----------------------+----------------------------------------+ +|platforms.Steam | Steam (no usage till further updates) | ++----------------------+----------------------------------------+ +|platforms.Uno | Uno (activision unique id) | ++----------------------+----------------------------------------+ +|platforms.XBOX | Xbox | ++----------------------+----------------------------------------+ + +``platforms`` can be imported and used as follows: + +.. code-block:: python + + from cod_api import platforms + + platforms.All # All (no usage till further updates) + + platforms.Activision # Activision + + platforms.Battlenet # Battlenet + + platforms.PSN # PlayStation + + platforms.Steam # Steam (no usage till further updates) + + platforms.Uno # Uno (activision unique id) + + platforms.XBOX # Xbox + +User Info +---------- + +Using the ``info()`` method in sub class ``Me`` of ``API`` user information can be retrieved of the sso-token logged in +with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + # login in with sso token + api.login('your_sso_token') + + # retrieving user info + userInfo = api.Me.info() # returns data of type dict + + # printing results to console + print(userInfo) + +User Friend Feed +---------------- + +Using the methods, ``friendFeed()`` for sync environments and ``friendFeedAsync()`` for async environments, in sub class +``Me`` of ``API``, user's friend feed can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user friend feed + friendFeed = api.Me.friendFeed() # returns data of type dict + + # printing results to console + print(friendFeed) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user friend feed + friendFeed = await api.Me.friendFeedAsync() # returns data of type dict + + # printing results to console + print(friendFeed) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Event Feed +---------------- + +Using the methods ``eventFeed()`` for sync environments and ``eventFeedAsync()`` for async environments, in sub class +``Me`` of ``API`` user's event feed can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user event feed + eventFeed = api.Me.eventFeed() # returns data of type dict + + # printing results to console + print(eventFeed) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user event feed + eventFeed = await api.Me.eventFeedAsync() # returns data of type dict + + # printing results to console + print(eventFeed) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Identities +---------------- + +Using the methods ``loggedInIdentities()`` for sync environments and ``loggedInIdentitiesAsync()`` for async +environments, in sub class ``Me`` of ``API`` user's identities can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user identities + identities = api.Me.loggedInIdentities() # returns data of type dict + + # printing results to console + print(identities) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user identities + identities = await api.Me.loggedInIdentitiesAsync() # returns data of type dict + + # printing results to console + print(identities) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User COD Points +---------------- + +Using the methods ``codPoints()`` for sync environments and ``codPointsAsync()`` for async environments, in sub class +``Me`` of ``API`` user's cod points can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user cod points + cp = api.Me.codPoints() # returns data of type dict + + # printing results to console + print(cp) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user cod points + cp = await api.Me.codPointsAsync() # returns data of type dict + + # printing results to console + print(cp) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User Accounts +---------------- + +Using the methods ``connectedAccounts()`` for sync environments and ``connectedAccountsAsync()`` for async environments, +in sub class ``Me`` of ``API`` user's connected accounts can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user connected accounts + accounts = api.Me.connectedAccounts() # returns data of type dict + + # printing results to console + print(accounts) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user connected accounts + accounts = await api.Me.connectedAccountsAsync() # returns data of type dict + + # printing results to console + print(accounts) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +User settings +---------------- + +Using the methods ``settings()`` for sync environments and ``settingsAsync()`` for async environments, in sub class +``Me`` of ``API`` user's settings can be retrieved of the sso-token logged in with + +.. code-block:: python + + from cod_api import API + + # initiating the API class + api = API() + + ## sync + # login in with sso token + api.login('your_sso_token') + + # retrieving user settings + settings = api.Me.settings() # returns data of type dict + + # printing results to console + print(settings) + + ## async + # in an async function + async def example(): + # login in with sso token + await api.loginAsync('your_sso_token') + + # retrieving user settings + settings = await api.Me.settingsAsync() # returns data of type dict + + # printing results to console + print(settings) + + # CALL THE example FUNCTION IN AN ASYNC ENVIRONMENT + +------------------------------------------------------------------------------------------------------------------------------- + +Donate +====== + +* `Donate Todo Lodo`_ +* `Donate Engineer152`_ +* `Donate Werseter`_ + +.. _Donate Todo Lodo: https://www.buymeacoffee.com/todolodo2089 +.. _Donate Engineer152: https://www.paypal.com/paypalme/engineer15 +.. _Donate Werseter: https://paypal.me/werseter diff --git a/cod_api/cod_api.egg-info/SOURCES.txt b/cod_api/cod_api.egg-info/SOURCES.txt new file mode 100644 index 0000000..d66c5c2 --- /dev/null +++ b/cod_api/cod_api.egg-info/SOURCES.txt @@ -0,0 +1,11 @@ +LICENSE +README.rst +setup.cfg +setup.py +cod_api/__init__.py +cod_api/__init__dev.py +cod_api.egg-info/PKG-INFO +cod_api.egg-info/SOURCES.txt +cod_api.egg-info/dependency_links.txt +cod_api.egg-info/requires.txt +cod_api.egg-info/top_level.txt \ No newline at end of file diff --git a/cod_api/cod_api.egg-info/dependency_links.txt b/cod_api/cod_api.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/cod_api/cod_api.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/cod_api/cod_api.egg-info/requires.txt b/cod_api/cod_api.egg-info/requires.txt new file mode 100644 index 0000000..eb89e3f --- /dev/null +++ b/cod_api/cod_api.egg-info/requires.txt @@ -0,0 +1,7 @@ +asyncio +aiohttp +datetime +requests +uuid +urllib3 +enum34 diff --git a/cod_api/cod_api.egg-info/top_level.txt b/cod_api/cod_api.egg-info/top_level.txt new file mode 100644 index 0000000..415fb10 --- /dev/null +++ b/cod_api/cod_api.egg-info/top_level.txt @@ -0,0 +1 @@ +cod_api diff --git a/cod_api/__init__.py b/cod_api/cod_api/__init__.py similarity index 99% rename from cod_api/__init__.py rename to cod_api/cod_api/__init__.py index f5ede16..f007a4a 100644 --- a/cod_api/__init__.py +++ b/cod_api/cod_api/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.1" +__version__ = "2.0.2" # Imports import asyncio diff --git a/cod_api/__init__dev.py b/cod_api/cod_api/__init__dev.py similarity index 99% rename from cod_api/__init__dev.py rename to cod_api/cod_api/__init__dev.py index db79e12..bf9554e 100644 --- a/cod_api/__init__dev.py +++ b/cod_api/cod_api/__init__dev.py @@ -1,4 +1,4 @@ -__version__ = "2.0.1" +__version__ = "2.0.2" # Imports import asyncio diff --git a/cod_api/setup.cfg b/cod_api/setup.cfg new file mode 100644 index 0000000..7da3bdd --- /dev/null +++ b/cod_api/setup.cfg @@ -0,0 +1,24 @@ +[metadata] +version = attr: cod_api.__version__ +description-file = README.rst +url = https://codapi.dev/ +project_urls = + Source Code = https://github.com/TodoLodo2089/cod-python-api + Issue Tracker = https://github.com/TodoLodo2089/cod-python-api/issues +license = GPL-3.0 +author = Todo Lodo +author_email = me@todolodo.xyz +maintainer = Engineer15 +maintainer_email = engineergamer15@gmail.com +description = Call Of Duty API. +long_description = file: README.rst +long_description_content_type = text/x-rst +classifiers = + Intended Audience :: Developers + Operating System :: OS Independent + Programming Language :: Python + +[egg_info] +tag_build = +tag_date = 0 + diff --git a/cod_api/setup.py b/cod_api/setup.py new file mode 100644 index 0000000..08d7c0a --- /dev/null +++ b/cod_api/setup.py @@ -0,0 +1,9 @@ +from setuptools import setup + +requirements = ["asyncio", "aiohttp", "datetime", "requests", "uuid", "urllib3", "enum34"] + +setup( + name="cod_api", + packages=['cod_api'], + install_requires=requirements +) diff --git a/deps/build-1.2.2.post1-py3-none-any.whl b/deps/build-1.2.2.post1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..024cea6b74cead707b0b70ea5b249b1147477def GIT binary patch literal 22950 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�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 literal 0 HcmV?d00001 diff --git a/deps/cod_api-2.0.2-py3-none-any.whl b/deps/cod_api-2.0.2-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..de040c60fe3aff545a644985074e4c57c3c013f2 GIT binary patch literal 28002 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�Q~LqSmi59Y*kyLpe_5ELrR~fVAW_nq-vl;tM&k_ z{@k&}+t`ME;rf&70kPF9)VU*1Ox>r5YHJbS3ew9~{67xavA2YEW<>Z0u9%Df_NTxM zUuvZ061zQia|J+c4~@0j(mO+n`nRn+lYyxgSS{Xdq*Z;xqEvEH%@Q@$RVD0Bk;U0S z4RPjEWYqLFp_#vmJN4hA*J>+u)K~D}1RuZV}$R;HrdlAatMfU`LH8h_; z5J*?tszN+iPyA7$Dr{R>|Vj`EQ(~u2`-REu58=V?&(Q@tF*(bqH{&0ErU%v2ifk zG3(@GdZgC`dWTqMJzA&OtxcL@=FoDslEE^8g%h>v8nFsR`Sow;X{ePkJ^*;{c^1=d9dnkq*bE$CuHGe zC5sGXahasyvX$0)@7Pl=S=db{S5(^mfq7L@!_hp;z(0s2PyfdDq3aR$dpQIV$qWjI znhYMuyN<=cLl~t%_A4Sj=4g|@FCi&`o>KfA8Cv4IWFh31sTr4}r`0Q46Sex2Pr$dw zETY6nfy9dN@wY%=;fW8G^q>V@`N7Ov`&Kb+lnxJM}N3g{7G z`UyxrfrXz&K%GkbzUToWaPhCK+wnzxO6SOB?W7Y(^e~Z7(o4-?yV+ALe4gq+vBwOz z4ai&|IFC-veg((U6#n3@Ud9luGQ@i+zZu525)eHsX}JWHefN^a$0B4x$mdir}l%3Xz^sZjB7JbY!S`oG|A}hmjH<<2scS zfzxPrs{g}x3t_Hc9P2?%ld#GCko(hmdQ>$QLoV-JJ(*omDwzII_CC0C>R+1Ue**tz-f>=ePP0ZgH4&3t*{s?bcgO27TH~m!JS`-g%)s24IKN#PYPP3dxs6~f z8siOuiV{y}4U`$$oFr_)xXp-#I>of=wcahm_y6%9sESO;xWN7Gsf$>KG=XNo5H(|P zw5mZ)qUC1#dnd2T5BA$BJQ2Il70edX4NC;4?Z-}8y7~Gv5v$|ae0-vYxQ1eL=QrNf zoz@qL+J?NRF}j6vJN#1t|Mzys_>6C&?^$V6{qp3$1P{*QpWt~!Z4-b48OcIVzS~dg zCn~~;up!WYTc!aXfRm+T8SY4rP_9ivuF+~_yT5;|>jC93%85W5JEi$RY%2k^B{8j!Vc%Bo#VoAo}9xyvGJ(&G-CO-Mo%^5c!Psz5()h+$=*Nkcx zP!Lj5kSWl7m~u+9oUpH=;C>T|LSjfa^@Pn%ys_3Kwkq|6>sZ$8H9i|ym?(e)K(#G*~K5gW&I5;}Q_aDRa z2lzjTcj82%^`S?)XiN_PAQK4yfd79GkCus!fsTpJ#M0S?*3!<*o?b>$SX53~bi`NN z8CyK**84jOiU%hV5y5uC*n2E110o`b=30Ryy`*Ge$p%=Lz4W}T%Bcf zXA{5d%~ju~{~fit{_p!y{pk9WSC@6v-|*SIuPgnt@-OSZy^gcHt5>&_);YfVZ>o8& z&p*p_RV$g_Tf%F$TYG-*hC6k0m#07Bec0UoE;DsyuF=&`#ZMDwVg(y4);@N{xiDT+v;@e zA+2H1| z2Hu{yEwXhrAY8Oco0B}4A@|&K%dq?EFU@~bN-bBRQ<@L$p4bUU z_|_%llqN=I7dhgB|Xq=&3Bo<(d~6M7|qJP=W!)-8nnw2D;*yEq0;mu zEA9hWVf_vgG3rzi4VO+>(Z@b*sYaI3Un5v3lA^h2R*A>1fEBNS z<{261eNggbG3D+exTZazmJ9$?DI)WF`Zz@NMj5vQZt^0yxx_t|a(cN)8wuN28fy`s zpiW@v(35|s z5h@3gznSbznB9K$&(%;OLG#k6mE4M|X|ftN6pgyu|{QF{e&CfqLz zo-A}^_cHw*!(e3Bqi`ytHEOCM3HbaA?q`y$`kgfmZWJ_HQDSYK#x#EsVskE&A>Tr% z>)Kkyu5BbY7?4Cnn}nJGFuF&tn6xWWL=GommT20xgGgy_F_T)D8fjleft6+u>D79P zje*gGxnUSI&2^`qn;~YxiwJqfTWP$Xvm3-fX#ts$kbqE2e4iguxBh6nva8;I**0~~ zBfRi=EV45)1t5engf~DyiT3mY94V2AXcfy@x|X#*6)eR~^K23r(G(_7yhnQ>Rb8h* zQ%x)Q2UwYb<=tBjBRspah~&js|n$5dp@y zR3bigTg-*x_Nb%&xt-tB!|E*E-o{h)lzVj7$jS*V-p@nK@byJsR8U>Pbe>9Gw4^LHtS|LY-i(SUbYj64iU3k0 zSqdhmKA@fWEgmr!C^nnlIr*Trs|hG+JmeK8)B+VG=xnM#T{q!H)Jr?T-&tU zyJ0qKZXbBJafE5aZ1XFiItdgq5w8~d0!Ic_801xI6*8N_!I)~8On<5dDb>Zrw(rDe zU?8=?l_{hQ#eO7GHiZn>tKh*mRU6nxADQ%P{XGGjT)vUX^tFlVlGZbfAG@N;A0a@p z+p57luZ@Yv?oLH+sb8D~nA_RgNZq%G9Olf1bb`;sRv|GzD8DLiqbCq=c^Y8NfQVR` zHMjvuhZeXJ$<07N8t5{%cRA74QCkkQNFfKBe6=r;Zek-aq@}&Wt#f_56?d#BfH`b> z5?hADdv%P%5o0nmuG?#^IY=Rb8U5E1m|z@6U{0sO@Y0j#3^r7%<9$j)lXy)3jp`e>_KU+h0 zXAj{ROITjWuMo__4XWFxa}(enP)!Rsr)-;JT*%lBwP)zM%b=T=DJ(K^ZpKUGMpuFq z^4mH+Ju+^!(6x$|`LYU}YU_0b2!~q9RPb_$AJKKqK~%##2|Ls~{4bcL1=2|FG7YcY z3Ux`ZB9Q8qL_8sVie(YA=gQ>fPXrEwvb6Ewv%x?+GFRCbDNlIqfuQ#dQ-fjyC+L=IRV`=)oKj5g2-wM>yP# z2r;nVt%a-^40^eV>HT$QoI3LLPvnvOT#D+PsNzOw1Qa4naX;Ods^kYakQ{uZpH-y~SeHLs8-R%sj&1CJ+@h$IOK@tbzh~uEYvD-^PZW$O|8ie7p zg7e9gnSrcV-iw~k&He#8ZCrbVUW_jlI;KXXVX<0_cN&Y(Nf|flzL}vGTVNIx6Q5Vj z-XOwMfO7<1;vs6c!x&R+ti0&FI(%%>YN+&nksjjh*SiRUwAnC1wnUqXrA{owDdNGO z3OiOob|>WmQpcmqrOK216LO@VllEtLkf^#a6QDi#NzT>w8$A#o@f-e#NVAeUE20gE0QECw>QwMPU!W}MWRlmip)7ubAvA9-cKE|7fIP^IKrZSaOGYKCq=}`t zU*k|A%6^p)f&vkmG_SQEb8gb;GX-$S>cR{sxz@LW5>FK(??JN3X)3Pxz(-WKY6|@Z ztn(B81-W~ba@kOio6u#>*>3~A7PFa}*!9}P&6QT{&rcu+0TNL;xsSrel3nqxj*$zJ zS|nM34BSS%0GN8#`(pwv=w`EG$;&)%R>3E-FwwiEn{JAYYU>LW7B9Nn%2o=$)v(?I z9ibDu8QlcQNy#XRZBpr$>IPV3rIYz&k&s61O*$a!E)~RXfH|6&1s3R1!_KmYYm^NX z;|Z9WMBcv`R(9{B98Fi35R~;WTAE1`XL%t&@?e6=0z}shKu?|^+<~gl7bPrc^Io`9 zb{eo%?2}D^gvCrC9bbWm@n3KFHs+?Crv?~JSDH5xK4Bn?#0QV2HS<^7)g+TnIJn3^ ziOi4Ctm{5=n%!RkfFmLozt^!G!*~U@uRsfHeEo9|1{#4bQDa&;X!cW(x`bRQ*(7d( zW9)TLgpz&yK%*wq{dP0sRs!?EL&v_VXxTv4Fvjb8ZP(tumpMsGLa$xhP`o;gO)Qo0 z6L8f(-P^DW16mCU&?%{9uX!;Z5}Ro!NYy-Waj3d`m9%*1`1$cDZmRr=&OUd?CZpw% ztH(L$NlQVc6CfZz9@A0_bG9NEPVCQ+A3>bIf@Y6l!bbuzUOo5# zz4;OYa%C^lt74h^f%7iR5pt1o)}UxiU__X65*`-org-)mp?ew2>M8+d;t+%>pGo|n z3rWjHDE4O4v0{oZwIC;rphKgGI*cS0B2zp`@tk8VX`P;EV@+Ujh?4JYq6^dEWJ}Nk z&U{=h1cRx=GsiVh#|ny3eq|T}47Mwjrb}qH@n!;n*d&dZButQlIZGIXLfQ1V4;y4G8Q@)PLyY@9sTkP@?}T}{@gE+%9E!1W zk_2Su((N_jMpRT0d#2hv@NUZn;^Pf<(dJ9`dtieDcq&l=;)eByFvMdKEK@*Xa`BX< zO>H*xi?sC!{N>Q0jA}g!ZoSpusbDHnBuydtAmZWse6^X$+Ea||e?P_l#?3cq zE?(9De6H#DE0>WDK&M9mH|B}(R9Z>o6GsBGSk#T>7sjH(4;s**hBYZU4aj361P)ov zCeg+6LJ|F#3UZlr&j6UO-kFCJBDXPs)enNB3`Yx)Hn(b`$}mtR!B>cr9VSrL&t!;- zqFNdGs1gN-B|9L>mQzKeX1e37S7C--Dzis_3pGw$tkng%n35-naK+p$51Ve8P+ik; zu838{{CN!}QkF++=y10@WnlYw{c%dWzcJU(cclYtRRO-ZiIe*CHK4-ZX8}$YOM!kg zR7huvYV$C{tqj{i?{WRNIdmE!@ zJF_H+GaMQb8D^kx0pzKC6H`Q?+w&2_iLK-FZo^8IeHTR?@!49&3WD-v4xr$DD($$V zE@wPWH=?7*kl{AdbKF;Yk{oWV|GaWjym@Tl-XT$GC)oDSDuj#b%IBVf7-H>3X@3Gk z9%4h>GI`6lo3`*dE29ENG`Nv0MDV?{lns85ZF$v;Yd?8eNWeXi~Xh9}A18E5D zy6nkIRHthRd1Ar2XLyGQo+8IU4MV38M>4PZ70VjLM>d*j2qZt*`;cS_ourSUzds5| z%px?2dBL?5b{r3)J8g9@sUVuuiLq$=P|36Cq!ADqWnUahFM?VSw#PwINOLkS%JjS# zmnyy$#$~E0*RgUhlef)e^os64+S*YWZb(6A2}I~BusG-tXzPk!Kl9+yju$;EB@Rqm zma}|f79kwePPR}8MXPedqOE^os9Ckd1EP7}M)dfmO>O<67NZ*;gje~Jtq5fryOFLm zlkmGI7lx;>_r;E+flpX>CE-zsmbB9P-O6uWe9#v*xKhS3W{M7+^-~=xbi37Da40U@zmq!r-Rf4xm8RlZrq2gfEA< zjO=U@Gz0k{7d|L)#5lSnWcgQ3`w(lzlFIBNARgKUxfZj5B%?Z*lCOX8Kw`UX4+vu^ z4u{hLYoj%U%&3a~9O^p&4#|lCGDenABBrdrK!c3#CH>6M+Ga z^8rLLGRpz9l4b%*y8{vH7R`;4#Lp@n6&jN7Bvdav*X&Sb z&4vPY@RrzZD;$My4b~fAt4#EI$0VcW$>ebJ=NBnAJu__8Q26Rdl#U$B>OSb!q|Kgt z5?|BxbkI>?#1pFaC0+rRX~r#$I0+3zpq`4YzxjEb$c3x@{`JF9Ia+C-MmLFgWJ`cw zL7&yRQ&^BYWbqNFGKccJ8QW29Rwct)49OUoNE%56VjNJJ$P#x1;e~Q#Yll^xD~l40 zrI|8xJ?5zBF0SUx#;W#F6;#9wnuL(Aq88&2x9y_Ka{0>xs( zUbecH1Cb>C-+A|?i#cJN%#5F?(?(@fDI{Y}YOe5k#eNyvne`0`FeJ+2s@2d)v>c^p zBAswOQ_q(zMZ_HqzFx~v6XLO2xF8Iz2Te$&HJI7xqF2FENECJI)itJ5GTVwJ%ZUR5 z27**H2gOFH`08@f>+r$!Tr3Ro_rxb8kHd@D5q&hpx-KCP>6fvL+*7!epQOw~j$UPp zNRp+=jx)X6W0e_cK?4}2a(3Sv(CYD0Oz4;aHbNInze;T8Q2VN@zQhZHgAK%YziE&43Xf-u(^mkGMM)lkBtW?6sSvktCWGM}f;5FF zToIs)Q_|#%ZZlBA^^(miy<$X8v0?VhYjVRPb#);g5H-3HF-iNzKm=bPB$SH{;)R$P zI2^;$aLpJQ#tA;;lo%N9m`EER4B1WOP{~XrAV&w`g5h!)DI&toHwIhw!xQ`B-NndM zxiaB;ihQiP(AM=mS`5Kb*(&v);gacQ*o%LZTM&7dpWPq3ob$V_iou>Uj}jiu zPIOK;HwBb(8uBD*IuDtiaa0p1utSms?gl1lsZO~0Owek=g{FSM!gI5_Z_{@=={xkQ zVl}}#vpRiHc;He+hw%`Pr9&+ybiT$ONOEB=9cBaBCwWKv+deVwHwo@ zxQOZ%#6(0oshZnlwfM@48$#x=-wN9eTRKvO8G=o=^$?-$#Nx4@2R$fGqPE>Z9yFU7 zIqgZ21p=J2BULsS4JsI*%#HnQgG+FSMY;f_c<&5lp{o!?;jkh8_>M?7 z(+2F#`)U0PszS7p2^ixnr!-_P0g1&E`lHo_=u7Oxag0N!seJAA@=%yImIyfrk5xUn zL2YVu;6w&iz6M&3bbg<@1?eIBi0W)XZ}V8X9ufpCLw5k%YX4n;)sJTfKtLKd@xGIm zxA5LBat6LfKxMLxR}y7cW6rX_QG5WyjI^<$)!Iw)CFdZ@IDfPW{}}tR>{E$%XT7amel1$t9oHDCo8wf>7EvBtv|_04(AFtHq5{f4xVphBkuE)<3D z|LN;2U@Galbd5VS99$3X&{*T{?lg9AcXxMpr=f9a+})kV-KBAN*V{9bd*{xV`Twfy zR4S=@_DXi%O4VC?t(~1AlFCIBYG^aK!(SXL_VN@1mpYu!*oqeSWhqU$ZkR9Y9$_KI zN^PjNj8XfW%UUs_MZ^$m2eI;>BR(&ybVx^w&0FGINi#q>+U z<0-@C*JZLE3UNAVzq#0SA}2Zbf}RQefbxe|Dx65Cd_k~4lkXrC{5AOH#DclWm#@A) zJ+0M=KbKp|7ayI#9M%e?#Qn?PP~NwT|Uzn?{Gm^wlzDW zUvOkH!!(y|X>W{@oa$hX&{{l^Ej|;?!ZGT6$e3M*RZgqoCrlkoBTgPR2p|tQT|4y< zR>QYyJ0m_5C*A6j=Bvy@_RzL@wC0`)u>L*lop=pFcp+EUR9KFp->X2|8YV@0j%ZrV z3pMDJ@Bdc&C1=}QC>p99C1q$ECu0&h{yPRB=ZDsq35wnB?TTgzgEXoW!IhA*-n1zv zgM(wRG=>MiCDy6yH$7DW8k{?#EY56Al8@mef$h@S*E2Rse9i&GSpP3vdBP55twu3X zHN$M#X2l26UrIvi=_5Vu zUT(yTKz9D7mNc7vF}B?kr@BB-sj1$Zk%1M)Hn{f_j5DC+X1H?T<+tfx=cGq5%&axZ zdIaCI7Cx4OzAqARW)UKEY~R!Lk0RC{R>?ha`j{Xjv4*}57VMQcb9t`({gAbg%%^p@ z<_`teFS925Bsuo^>5{N1dNsq><3Q#X$U zaH0iK*Eey#^f-aDmo?#L4Ojwk3#{T!Ez|f*GF7BQQL6AWV@3tbS_5_Z2cP~BLkPS1 zOSUSZt+lKMyRi468*d3!$+5B73DZ#j;NWa`B;A4Km%yO4GxFb{TQUIGpKO#lxpP0) zmHgG|&X<7@E@C1T5!f_rxyj;y)!Cb|0tp)dp?zNg^53muU8eM!JA&}0q&H83Ua5;0 z26OkT71z|#hWR%0>p1P`QzViCuz$5DrOba`B4>Jt%zEp-i#mU`))Lxz9&t_7sDFs_ zW)U6Oi^=Nt<;ct%lD|5kR*qaVyW1oQKgiy2sV6nrR&6V<)?OpBh)18il}acMl3$W{5+!5D_aIlG8a zu71Ibmy#!cV;Kkk=J@@0kn3J>%G>`BZJa~j%3QTRIEaz8oh zIdIG?xnw-p^MlM_Y(SR%_8?qVq#}c-G@#Ao_ldT-AKSjsg89JF=1SbtAj(345YZ%J zX0Ex-gg1Qe#JgULFY(HkA^-Al%ESJYz583 z7zC~Nv-qAIj36Ajj$6}>6Wm*)LN3U@rqXv>$YAm@gdRSNHO<4l5t6%!G|ZQ)VSZ#CXr za;DZXJH-TycA(ipQfiRj#8Zn;aR|r|y{%{yu_a@-&awqq^6*3>w^8y|gcqb9vVbm!ojMt0vh@_x6~~QntH1Cp@3ID;;hE zyX#7ZH;Y#CCt2tB{)*p%?Vel3c(E&7vo0d4w>&Osb53$`0%(unLnLlD|rp7bA5@ zOE^Zrv*Vn?cE%}XE4#=r7WjqI%@15H>ly84dgWy~Z(@%%8=YA?!!Vzu`z(Anc~mGd zxkw~GF&-(BnnEDS0y)s~7tTTrw*CR1Klc|a;C+0DNwi8Ze!YNJFdlD>Qto5Q+9UrO z80^f50&#HSK+c${ZQyQN(=y`C=+#rC6S>w$6_ivFAwd*3i;s%?6M zR=ZrZN(P;0Oq|$>+z{C3Y2|p#vG>Qn5;X3K>^p6}GK+XJ;R$C8CtU!!u;yHTc&4Rf z(v&9wxQ{m@Yoh;fvTIwU{luB0?D<2@ithO>$k0HZzB8F!vemCjazBUbI4E_NC=XCL zbgdM7S72? zEg*u9Kv&=evo@yo*c6zb_0qTdW1a+~`z+{?KBoG$j*-e?TbsV(>W^ABD?%sw9@}j? zv7E3gg8%?Q7d8(<{#$gzA!wC{Y(4@l)d55n4eXikFCJ%Bqm#@|V_`MhcBIPplMI$H zM;!`DNWcQ6g|w@Rr&+okI2v4YK8O`7^BN_NTzFm?1(O8OZ@ouI+o6&2(l3_N#q!IA zhGCE>oqM|vOc%%(s3iJ+<&NmK@WYLSv~xLezA*>!XIdZgJf|zXqztsa-DCs@> zoON8}(Uv4UM>5kweRG3OH4IYs%9T!Ao!Ob6*S``W4K*3af?zWE&K(CYzEOA?HThXX zG5WIlF#ePoYMi7rCZaeCGV!Ns%_lrVT8RIxe?E<#GJZ4QUvg9$WEaSXhl5 z@^bLnJ{^;m9|60NIx@A2Gyub}oGcKIY(0ruHXY=8qq1y}DNTM$MLz3`E0i90E}`&) z#pOq!1co*^)Abe5$nZJ{QN&oBmBxTGF6FpN5s4p)iIkySMKLkaq#k<{>qiON>)0>| ziphe2cV62f)GqP?9>q%QL@75rX+HYzU-(=Lxkx;np3t8>G3`Bxn2ywlk4J`Rp^h6E z7ClWlr~I+3z^Nt2?qXeT+v3E0iMcxa=Nd z%Y>mqJ{1ooi$MDg+njBwAsG6XSYho(!mjZLBmsmzJ(t0^mI+tY-OZJ&FHT@xR1M3 zaa?zhMYX8&7k0AIf924*H`o#N$*`ONyZJHq1IVFzdl_PtcQp6Ino#KRx_~6bVRm!2 zow9ppXW%f4q6qp<1Y{#7#X$gb3@b{uR1}AsWavu|yn>7B&k5ggyfy}JwuvQdJ`CRm zYrq3yHXg5R)v-vd!p3o-Y8at0hG6~;v8>T;6J#q2i7ab6T~!DT`C4E^^z43vBTMkc zoNS3eDN2*){R>imrER}i^ifxJjp1ux_jt+@zFl|B!MjvA=@OU8!@z48?_|~CC{yC3 zLX*{=m!b`1W#LE7Z~R|b@#bywdmLK46U)@$hU^tIbm{xeOE%~haj>CT$gF#gkG zUDNWNN!s(}fMn6;rg4>!WKW#rb+%!+>ebAyRhjO?&W**B1o!~Qxck#6r|O;wsp1%T zM>_iBhRe-4?Q+}Rj8Smpy*k{H3E2$5EoH` zvX4qcFdDAcGkkRnjNZ@bm-(Qa1$Qj(@^fRuf(*_yvPn<5u&>el+qs?0VKVVtm^oO- zUnmvr^W@F**3j#QmKI*LPJNs{6|!tCg?G-Ws$jKR#eY8}8hrGgA~2?6ppj40>Nfa- z+RB4JMA^GE8gEAS0U?WiV1wFAzOeNS>w^9p9>8qs^KQn1cN{Ch?-%u{Nm8*x33bRo8E93M zc#C4_qS2nAm)ti*R}{|YYF-F`HlYE7-dm&CSjS)O zSv4p}sLIC+@O`JwaA$`BS}m8S&$V|^--BrS>#7Zuzva^~JWCqh>2APFySsdbK0d2_ zbL_=FnW(gf)4$g>qO@o<-WWImB`v;F-HWL4xsx$th#vsjQX9eA_!a;3r3Oe|Z_8iR zHh`(a{isL-SBk88eWp(iMWpeW*|A4+03L8SwYM~;sXvUJ9hka$JT7!~xAg+g?k5&5 zIqKt7yxax_ranD5x;yHZZhyo@wYNX>ygrm?=;-OuPny|%J$NvDfYy_LIedP5ne=^T z>TXci_!!%9wY9r6bvJOZ=w7G4z)I`B4Lnp|(zC(TDqJ~Wd9>t~#T^LNDvLS^{HoOfSVGf^rwgD!eFrgdFnB)VYcef6U+2~1sp z2%VKU^-HWv2L@@*L-n+rLp?jWNX$Mb@|Be}I^qKc@H%~WI0$|C#|PU7hlkfU_B^CB zi#wh*6)!J70ljU3qf5~^Q84VlvN3ILx~f#)yr^Z|4d(A)4!`*_6$apldt?+i8#sK^ zAiMyNn^e+X4lalYY?r2PtYfHi-CL8_cN1@ksDr%hJOZE2B5$EoS1>|OuMwQ~4m8aH zw=7X#Z8veJjAffI&7z_dIE?!GC)I<6=|`c`*MoT-ytu!$c(=PNXlMIPTh&8;|F9I8 zR_n-~GpcvX!5)uo`vTsom^FRu4n0_)xK(X-V}s@mAXD5v*G-Zx>$nM+MkHi*uOUEn zr0@PB^7rMK-FHR-DW`6z2GT+|VYE+ct3tVD*Oi6_jhzX8BMC~-E7~6IQx8d1hsH}e zhj2Ijy9q;fuDSK|DxA)LPtd8_`qPQR3zE2sYfV0C2Beo>e>{*=gf>_OGk#k!D;$3ucoj zG<*3{^Ysd&Tl#Da_bzEJlVrwe-6_XNCbNCG*n*McX*Ah@p+Hnud3MR6hu zGaJ{JTYH@3W1UjC;D#^aPni3Anwp63=t*qm{_|^Q5A<-} znsrP8_|DbCkbo>!inF#onv$~V*DWgxSiJ!@Yd;G%)(lHd0_kzOYru<#VpHe)9fzwQ zWp8mtkLF@c_{QSdyp(sZ!j$HtK@*+dZ>*+YfTb;edEc!mcbUo0{C!ta9nTdE+ZZHi ztWb0d|F^SC?vxR2O{&kArRQHh@4KfeEtJEA$pX@c0bK+W5{9Y>@RW&0`*j{h=dS!TLt$+@dOG ztMWzlw0w+hoaO#z!q1cfQaE#x+U*7w^sKrL8=X)?s9>GUTyk8h8(lGDx}cWbJ>E13 zbj*GCbJg8IuWvtCn0g(c4$8o-t#58t$IiJpz}8a{I6&5`*!*?wDq8e8y5;5P>424n z&+4K|KtHMz;X_W(we6rQq`}=F8phf8!?}GS3InwbY#@cmRT~PQOVhlc1CGxdNyJ?{ zV%o2q|J;cvHi!>!-tb^KVJazUB@uDl%#Pm$H(qfL; z-zwTrThXl`yigc8o>ENRu%|=F?A9s57bIT3%Ypj#_y%(Njj3~GE9E&dyvTVN@+`sf zIfgFRa7D=+0Ss+3>XLri8Gemd04+^*bsi@jL!`EaLV8ukEW6SHTl82*3ZYj`^O`y27DV1^r8khYWfmu z21RhM+Xw9!Tnq_APXN~k=lU-w44zFqx*4X3+T^6tZa=~Q=luMhc%HF5R4_16GcYjX ze=|Q{PE1uuR7h3mT<6tkjUDiz!}Y$qF|0r;CJdM& z?~TtTbh#PcVib(u7D+XhQQBB`JC`J`(ePe=cf}@MQTZ*mwr6_EfhUe~>s7e6S-CVR z8}|@Ccou-md7tTet=6txtuyq~EOd^Di%BOfD{jPKyu|o3f2(SVpCzsd!U<`YDhpPr zdJde6xY%ZHO}?`Ucngo{wHLV(oz>H=suJZ{y!#L?@i~#V65_Y2SM0Z7RZ_g`^c2=t zO6G?IG;etow^J9faCAXB5lQolt8KMmuGZyopg)nwov+5Gs_c9y_dF*x{w%<<)A8dz zPLRP0!=iv4FP>1ntnH_|Mjduj)K+bJJ=yRADbS?{PWsC9Bqhzq<)PdC__w^UTb z1{D-|p7(q!7{TRgIp~`DWvBAvY`96pN3nj1EbK0|jov?I)QvxkGKuFS9VAaC&v)kK z3(sPWmy3~e_!@MvJAKDX;9&T&i{pwi41&u(X%xZJ%tN~F8=?*u#~F4y~GT6dT z(qu#_j03esY4{>bE}>pUt|!Bro2Q)q+ zX!~%agy3}ZYaojpo2<6WAni8WLDf~YMARTW_*(-4b_gmam`*4L^6|xKlSO3vq3LMK z7eOSe5I587eTDKU%f)DxB_-=5HOLhHnG z77#m8|4+^?5>rltZG6WYnnHW>NSr@sp)ZKzaiS+XPv_Wv2SZ(`=m%@bV$m9Bh_m*% zZTmQEB$QO*;&?;3QpC)+*QA9VOj)gHD^2cC01e*(y$82UC@ z^`f)U>UT-gJ{Hz%L3>*i131 zX$q5TZi&1xpLpoo7BdVvF=1)sj6?%VAv_T~&hj`O5>k+Le;C{>j9*8P zt)$#`?D*tuEDShfrl2Xj+_q|Ga(IeZ6c*XLWkuFgtp(yOdk#95)1TR2A5!E4QEMZI z5qRgul{~-NJPxIjCpm02?z32&u%;_PLXUQh!L}aAG*0BJC0iU7&9em+wL8B=4enj~ zUnnidRhzY^-F8Fs?n;?X$8kAOPA#DG1J}`!2M>`?!@2hwR5=a7lq7c!<&5CD_wIOO z^JH7$GN`loxzYAo=S~O!UYD;b45UKQ(g0D2df~S7aCWo{HO579bT~Dlkoy(1gMr0h zEe?&W)`R5Guf$c%c5p^ij<%8*Q#d8coAI$4)FMQtm8Q0?6e@ENmdHDUXei`bQY_|U zD#ylfWfnMO8c%tn6X%3D;av8M4RNsf`R}$nf=Hnsnst$81X`d$INfmdi846#v<+s(3NR1!UzTg&PFtMP$OmDG9)l`=D^+-Yu$TGlw#t=YsZRS1%-Zt%3fXa zr(;9&GGNgvCD;N2p0E_+Bu#$EN&IeVa!ahgfv&-TxR4DqE0rG3fIk<$!XlQZqK05N z)WTgwB=!ArvZw#K7Yy>@l_tD@dO6!J^YaydF*62!_&p!4fOB!bR(>A8o!uRsNe@Lp z!uKIv3=-kFiRF8RX!KtGvcUhl@>~q-%lF7j7Zjw2HtdZLQ{qu@gJ%r?+%^7x6 zr=_z3;q#b%6ynuay%RH@M0a5hp3wVyrS2qJDHwO2N(g|$3^Y_g;nO>DcI->jHU&#k zY9>6@H~3V*jYfJJe3@2FF>x7|Q`9ye#Pk9pX#@LIt*}11|AsDS?F4kd@a)EqW&wnu z@}>FAykXxL{DPNGfT~#NY_c7j>sHtE_4~zZr}|~y(u2d%G9?CkyWNPNp__DDb(_xY z#(Agb(rMQgS}D1R?ik7a>O&EHD6K^2f_SIr+-aoJl=E8ELs~R^T_vqD_}SSPxQf-n zy?Q}EhU94EEo_FvXA3k>-}zAM;HF2LwchtYB()Eg5@p+doY47>UVJXL5BW7L`T99D z+_8RW)ljy^8&2?i>*YM(Vyyh$QBC&0)?4^w|&fb;%hAi+HT9XO`w6nj7^PH)$-%lK@H zP_2cpLA-!%WhoMEQ+P(7?hn112)-$>@H z6n*+ndr`rplO7c^3BR^;elTD;KLJ%3Rl|~S^A1{NHS%ROlA*4l3hNAstr&3jn6+=Yx z#0oQuj}q3lF$oXjYN$QT``}v83C4%U`=cHou8Gib=a}A_%*+FU<4WDnJ19Ho;<;v8 zby6bR=yTWtgd#88($^DFc~C%-nM%B;?+hUNlEZAp+@0b>&x^#2(5rk2eBJ0^vLZ}6X%J_lkTU<38(?B0|1~9|zcn6g0 zfg&=LC&(-VqvI3NvLsfol|sr;jGol}k=Lb5-ENQO$BW@+ugh(x$NL|hmrc~8y_D5- zNViH%tkb`KpXO0K87V2E1-DLH(74XiVz{`(XW&VGG{KYI(FALQHD$MAv*mpU5Xr zsRPZPU#&n`A-+VW=VZG$e+<>`rI7l|qliqDe->xL(72e^!#EfZy&`$I?=3uTy>EsD zjAKQRf}5H5Nx-Ez;`PlNf{|QDg%OL@wX%Iy)KUNA2e@Q1@6sVMhhze%bikwojP!6<=TaI0&vA4O@$Im>h)db?;ELp_2rgK(7^qj7JcY5YXk!vJf zg6$~De8QqZgql+BbPO%?tpoj9WrkULG5tKh*HkTkJ1d@i=%03FgA^sjX_h426OGX+ zRu0IlrW)JLHs{|kYcIWH0{~~)_lDQQUl09^wcePG^)5IfFfEmghsYn3BB1!w5Wuw* z^#aOL6{Mw~B`GAV8HCX=0d;a~v+M2aN=|K+WYa+te!9p;~>K{G7` z&tJ?{oH~=*YDm#iqkM|k{LqRqz#Vo@CCH4>sV?dp6?!e@mT-TaVc=Y4nT&lr*iH`t z@tr@LE2zgZlJmcMSQg+C)k#FUAMCHXR?d&Av?^TT6ad-*zHM&UavltmI^f4--tBQ; z5uk%AJtyYqw^AAB9_wqJvO9PS`_@hyS1$O;fZhQDmvjkJn~aGfHWIaAp$aD#YCJ8< z-BXl4WwCm}wMa!5&#dQO3>bXJAi9J_?y ztAl9)>B~w#0*k`ZgGCXFEwsWyZIro5_%Vu3!)oJGEy@nro7+~MMn~b}3x6XgIqm2) zbVm!5VHL-cRn*|6Dho6E%#<#}c|*7iscc^1v%3X{`pK!~P|4}_f+W_=_^V%IXLShd zZ!m#CWYXuVEsABq7>(^Ao)rg^1Q5LU!_(X3pL>iS^HcRcTED#LY84hbZ)-5~=Ca%L zyREMGSu(%e?hpF%Yp(&z>_@zlN~-;aQ(>5m$!I#!1uT|y4dUzqrWljA6!emlJF{Od zE~@yVONhQPu;VFR@A%)@ygY3&jlfSAk4M3cTj)oA(#lHs-kFD4ern>%i9hQ+kLu$% zrghPNe*RB;BL_Uu9`x7N(Ei&9|Bbz&E-5A^3*F0%(9eVfJ*`tRy^O>HpU3b7QKU^n zlA-g|08R$2N#yw2)%@;HOV@E;oKeCy3yJX6;Abnz3z});^}erMGaJesJE8}>hl|99 zKt?~0InCDiFjrKjaO6)>zyBFlWjyc<;cqx_e;dWW3Cr2eUeDUZ)x?_7+1*)YQXxWt zeq;~gA0-x=@j&z-@W1vA1Q;06zkw->i6|(Gx=fEbmN9{WP5X3HD8f~@v_xSD&yZ51 z4%)I{H0EQV8j}0I>oCt9M+?|vl~_Mk9F?gLl@;$q|H_8y|K*?hZdbEu)Ao+E`5jbY z7t>78pn0e%Jg@6>F`4no(tqklx*fju{nqDVDQ8ND7YEK8fahmOkF{zacu1W}lH^}w-(%L}^_eJRVD6?F|#mdvMH#F5x@?>m6Tzn6$W4h?$ z*xl>zs=-iVn#;-TIM?t&4b$2u%dy7NZN{2d`65uu`J&{BE-~V*-75{+AWC{(r##Rs#3GZU+Nv3JCn$ z%Rd4CRS@_8XZ&v!IR2XM6MuTlR)U;jk@Q&;~N*$`0nZ;=0`GDR6^nE$vQ_V14HSC_(8|8e$z E0I?+q?*IS* literal 0 HcmV?d00001 diff --git a/deps/colorama-0.4.6-py2.py3-none-any.whl b/deps/colorama-0.4.6-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..f666ce989f84a46703ead9fa296a74c24e60b590 GIT binary patch literal 25335 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ÕI)`KOVX;pDt*! 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 O6}^Hh%N<`kO% literal 0 HcmV?d00001 diff --git a/deps/packaging-24.2-py3-none-any.whl b/deps/packaging-24.2-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..b38a4a5da183fdc2a819cf94b8d58b1a7630378a GIT binary patch literal 65451 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 literal 0 HcmV?d00001 diff --git a/deps/tomli-2.2.1-py3-none-any.whl b/deps/tomli-2.2.1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..64d4afed3dcb7a907526da713851f28c759d8333 GIT binary patch literal 14257 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 literal 0 HcmV?d00001 diff --git a/deps/zipp-3.21.0-py3-none-any.whl b/deps/zipp-3.21.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..ccd19f08b9561e4f43036267afe9add45ec179ae GIT binary patch literal 9630 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 literal 0 HcmV?d00001 diff --git a/depricated_dev_scripts/beautify_data.py b/ref/beautify_data.py similarity index 100% rename from depricated_dev_scripts/beautify_data.py rename to ref/beautify_data.py diff --git a/depricated_dev_scripts/beautify_data_match_info.py b/ref/beautify_data_match_info.py similarity index 100% rename from depricated_dev_scripts/beautify_data_match_info.py rename to ref/beautify_data_match_info.py diff --git a/depricated_dev_scripts/convert_epoch.py b/ref/convert_epoch.py similarity index 100% rename from depricated_dev_scripts/convert_epoch.py rename to ref/convert_epoch.py diff --git a/depricated_dev_scripts/curl/beautify_json.py b/ref/curl/beautify_json.py similarity index 100% rename from depricated_dev_scripts/curl/beautify_json.py rename to ref/curl/beautify_json.py diff --git a/depricated_dev_scripts/curl/curl_links.txt b/ref/curl/curl_links.txt similarity index 100% rename from depricated_dev_scripts/curl/curl_links.txt rename to ref/curl/curl_links.txt diff --git a/depricated_dev_scripts/curl/get_stats_curl.ps1 b/ref/curl/get_stats_curl.ps1 similarity index 100% rename from depricated_dev_scripts/curl/get_stats_curl.ps1 rename to ref/curl/get_stats_curl.ps1 diff --git a/depricated_dev_scripts/fetch_playerdata.py b/ref/fetch_playerdata.py similarity index 100% rename from depricated_dev_scripts/fetch_playerdata.py rename to ref/fetch_playerdata.py diff --git a/scripts/build.bat b/scripts/build.bat new file mode 100644 index 0000000..0f70cea --- /dev/null +++ b/scripts/build.bat @@ -0,0 +1,10 @@ +@echo off + +cd /d %~dp0 :: Change directory to the location of this batch file +call ../venv/Scripts/activate :: Activate the virtual environment +pyinstaller --noconfirm --onefile --console --icon "../assets/icon.ico" get_cod_stats.py --distpath="../build/bin" -n "get_cod_stats" + +rmdir /s /q build +del /q "get_cod_stats.spec" + +pause \ No newline at end of file diff --git a/build.py b/scripts/build.py similarity index 92% rename from build.py rename to scripts/build.py index 9b5a53e..0f798f8 100644 --- a/build.py +++ b/scripts/build.py @@ -5,7 +5,7 @@ import PyInstaller.__main__ # Constants for your project SCRIPT = "get_cod_stats.py" -ICON = "assets/build/icon/icon.ico" +ICON = "assets/icon.ico" NAME = "get_cod_stats" DIST_PATH = "bin" @@ -33,4 +33,4 @@ shutil.rmtree('build', ignore_errors=True) os.remove('get_cod_stats.spec') # Optional: Pause at the end (like the 'pause' in batch script) -input("Press Enter to continue...") \ No newline at end of file +input("Press Enter to continue...") diff --git a/curl_userInfo.ps1 b/scripts/curl_userInfo.ps1 similarity index 100% rename from curl_userInfo.ps1 rename to scripts/curl_userInfo.ps1 diff --git a/sanitize_userInfo_regex.txt b/scripts/sanitize_userInfo_regex.txt similarity index 100% rename from sanitize_userInfo_regex.txt rename to scripts/sanitize_userInfo_regex.txt diff --git a/setup.py b/setup.py index 59bc02f..4b44850 100644 --- a/setup.py +++ b/setup.py @@ -14,20 +14,12 @@ def create_venv(): with open("venv.bat", "w") as f: f.write("venv\\Scripts\\activate") -def upgrade_pip(): - subprocess.check_call([os.path.join('venv', 'Scripts', 'pip'), 'install', '--no-index', '--find-links=deps', 'pip']) +def setup_tools(): + subprocess.check_call([os.path.join('venv', 'Scripts', 'pip'), 'install', '--no-index', '--find-links=deps', 'pip', 'wheel', 'build', 'pyinstaller']) -def install_wheel(): - subprocess.check_call([os.path.join('venv', 'Scripts', 'pip'), 'install', '--no-index', '--find-links=deps', 'wheel']) - -def install_requirements_in_venv(): - # Use the full path to the wheel file - wheel_path = os.path.join('src', 'cod_api-2.0.1-py3-none-any.whl') +def setup_api(): + wheel_path = os.path.join('deps', 'cod_api-2.0.2-py3-none-any.whl') subprocess.check_call([os.path.join('venv', 'Scripts', 'pip'), 'install', '--no-index', '--find-links=deps', wheel_path]) - -def install_build_dependencies(): - subprocess.check_call([os.path.join('venv', 'Scripts', 'pip'), 'install', '--no-index', '--find-links=deps', 'pyinstaller']) - subprocess.check_call([os.path.join('venv', 'Scripts', 'pip'), 'uninstall', 'enum34', '-y']) if __name__ == "__main__": if not deps_exists(): @@ -36,12 +28,7 @@ if __name__ == "__main__": print("Creating virtual environment...") create_venv() - print("Upgrading pip...") - upgrade_pip() - print("Installing wheel...") - install_wheel() - print("Installing packages in the virtual environment...") - install_requirements_in_venv() # Call the function to install the requirements - print("Installing build dependencies...") - install_build_dependencies() + print("Setting up virtual environment...") + setup_tools() + setup_api() print("Setup complete.") \ No newline at end of file