From aad3c9bb54315b77c83ed7ad53bb1e80e92f22c5 Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 9 Dec 2018 00:15:56 -0500 Subject: [PATCH] Initial commit --- .gitignore | 15 + .gitmodules | 9 + .landscape.yaml | 7 + LICENSE | 661 +++++ README.md | 81 + constants/__init__.py | 0 constants/dataTypes.py | 11 + constants/exceptions.py | 54 + constants/rankedStatuses.py | 8 + full_build.sh | 4 + handlers/__init__.py | 0 handlers/apiCacheBeatmapHandler.py | 78 + handlers/apiPPHandler.py | 176 ++ handlers/apiStatusHandler.py | 12 + handlers/banchoConnectHandler.py | 70 + handlers/checkUpdatesHandler.py | 36 + handlers/commentHandler.py | 175 ++ handlers/defaultHandler.py | 53 + handlers/downloadMapHandler.py | 29 + handlers/emptyHandler.py | 12 + handlers/getFullReplayHandler.py | 31 + handlers/getReplayHandler.py | 79 + handlers/getScoresHandler.pyx | 121 + handlers/getScreenshotHandler.py | 41 + handlers/loadTestHandler.py | 18 + handlers/mapsHandler.py | 35 + handlers/osuErrorHandler.py | 11 + handlers/osuSearchHandler.py | 58 + handlers/osuSearchSetHandler.py | 42 + handlers/redirectHandler.py | 14 + handlers/submitModularHandler.pyx | 513 ++++ handlers/uploadScreenshotHandler.py | 74 + helpers/__init__.py | 0 helpers/aeshelper.py | 449 ++++ helpers/binaryHelper.py | 65 + helpers/chatHelper.py | 438 +++ helpers/config.py | 148 ++ helpers/consoleHelper.py | 99 + helpers/exceptionsTracker.py | 17 + helpers/leaderboardHelper.py | 131 + helpers/levbodHelper.py | 51 + helpers/mapsHelper.py | 56 + helpers/osuapiHelper.py | 83 + helpers/replayHelper.py | 134 + lets.py | 243 ++ objects/__init__.py | 0 objects/beatmap.pyx | 340 +++ objects/glob.py | 34 + objects/relaxboard.pyx | 241 ++ objects/rxscore.pyx | 274 ++ objects/score.pyx | 273 ++ objects/scoreboard.pyx | 240 ++ personalBestCache.py | 58 + pp/__init__.py | 0 pp/catch_the_pp/.gitignore | 104 + pp/catch_the_pp/LICENSE | 674 +++++ pp/catch_the_pp/README.md | 39 + pp/catch_the_pp/__init__.py | 0 pp/catch_the_pp/constants.pyx | 9 + pp/catch_the_pp/osu/__init__.py | 0 pp/catch_the_pp/osu/ctb/__init__.py | 0 pp/catch_the_pp/osu/ctb/difficulty.pyx | 268 ++ pp/catch_the_pp/osu_parser/__init__.py | 0 pp/catch_the_pp/osu_parser/beatmap.pyx | 222 ++ pp/catch_the_pp/osu_parser/curves.pyx | 166 ++ pp/catch_the_pp/osu_parser/hitobject.pyx | 169 ++ pp/catch_the_pp/osu_parser/mathhelper.pyx | 124 + pp/catch_the_pp/ppCalc.pyx | 41 + pp/catch_the_pp/reanimate.osu | 899 +++++++ pp/catch_the_pp/sample.py | 31 + pp/catch_the_pp/setup.py | 16 + pp/catch_the_pp/test.osu | 1219 +++++++++ pp/cicciobello.py | 82 + pp/cmyui-testing/CAy.rar | Bin 0 -> 1649048 bytes pp/cmyui-testing/TiS.zip | Bin 0 -> 2027614 bytes pp/oppai-ng/.gitignore | 11 + pp/oppai-ng/.travis.yml | 22 + pp/oppai-ng/README.md | 349 +++ pp/oppai-ng/UNLICENSE | 24 + pp/oppai-ng/build.bat | 11 + pp/oppai-ng/build_containers | 10 + pp/oppai-ng/build_containers.ps1 | 7 + pp/oppai-ng/cflags | 34 + pp/oppai-ng/docker/musl-x86/Dockerfile | 5 + pp/oppai-ng/docker/musl-x86_64/Dockerfile | 5 + pp/oppai-ng/docker/windows/Dockerfile | 26 + pp/oppai-ng/package | 10 + pp/oppai-ng/package.ps1 | 4 + pp/oppai-ng/release | 36 + pp/oppai-ng/release.ps1 | 42 + pp/oppai-ng/test/download_suite | 10 + pp/oppai-ng/test/gentest.py | 254 ++ pp/oppai-ng/vcvarsall17.ps1 | 15 + pp/rippoppai.py | 184 ++ pp/rxoppai.py | 184 ++ pp/rxoppai/b3.py | 31 + pp/rxoppai/oppai | Bin 0 -> 59456 bytes pp/rxoppai/oppai-old | Bin 0 -> 59448 bytes pp/rxoppai/yes.osu | 1179 +++++++++ pp/rxoppai/yes2.osu | 1179 +++++++++ pp/rxoppai/yes3.osu | 2357 +++++++++++++++++ ...i~05f367344c838990e809394850fb2ee794cce14e | 1 + ...i~41cc2cb18015293c90c699e1d2089aa38beec8aa | 1 + pp/wifipiano2.py | 117 + pubSubHandlers/__init__.py | 0 pubSubHandlers/beatmapUpdateHandler.py | 27 + requirements.txt | 10 + run.sh | 2 + secret/achievements/__init__.py | 2 + secret/achievements/common.py | 57 + secret/achievements/generate_sql.py | 58 + secret/achievements/handlers/combo.py | 55 + secret/achievements/handlers/mods.py | 116 + secret/achievements/handlers/playcount.py | 63 + secret/achievements/handlers/skillfc.py | 114 + secret/achievements/handlers/skillpass.py | 112 + secret/achievements/install/db.py | 19 + secret/achievements/install/init.py | 21 + secret/achievements/install/install_glob.py | 1 + secret/achievements/utils.py | 115 + setup.py | 17 + tomejerry.py | 616 +++++ tomejerryrelax.py | 621 +++++ userStatsCache.py | 77 + version | 1 + 125 files changed, 18177 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 .landscape.yaml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 constants/__init__.py create mode 100644 constants/dataTypes.py create mode 100644 constants/exceptions.py create mode 100644 constants/rankedStatuses.py create mode 100644 full_build.sh create mode 100644 handlers/__init__.py create mode 100644 handlers/apiCacheBeatmapHandler.py create mode 100644 handlers/apiPPHandler.py create mode 100644 handlers/apiStatusHandler.py create mode 100644 handlers/banchoConnectHandler.py create mode 100644 handlers/checkUpdatesHandler.py create mode 100644 handlers/commentHandler.py create mode 100644 handlers/defaultHandler.py create mode 100644 handlers/downloadMapHandler.py create mode 100644 handlers/emptyHandler.py create mode 100644 handlers/getFullReplayHandler.py create mode 100644 handlers/getReplayHandler.py create mode 100644 handlers/getScoresHandler.pyx create mode 100644 handlers/getScreenshotHandler.py create mode 100644 handlers/loadTestHandler.py create mode 100644 handlers/mapsHandler.py create mode 100644 handlers/osuErrorHandler.py create mode 100644 handlers/osuSearchHandler.py create mode 100644 handlers/osuSearchSetHandler.py create mode 100644 handlers/redirectHandler.py create mode 100644 handlers/submitModularHandler.pyx create mode 100644 handlers/uploadScreenshotHandler.py create mode 100644 helpers/__init__.py create mode 100644 helpers/aeshelper.py create mode 100644 helpers/binaryHelper.py create mode 100644 helpers/chatHelper.py create mode 100644 helpers/config.py create mode 100644 helpers/consoleHelper.py create mode 100644 helpers/exceptionsTracker.py create mode 100644 helpers/leaderboardHelper.py create mode 100644 helpers/levbodHelper.py create mode 100644 helpers/mapsHelper.py create mode 100644 helpers/osuapiHelper.py create mode 100644 helpers/replayHelper.py create mode 100644 lets.py create mode 100644 objects/__init__.py create mode 100644 objects/beatmap.pyx create mode 100644 objects/glob.py create mode 100644 objects/relaxboard.pyx create mode 100644 objects/rxscore.pyx create mode 100644 objects/score.pyx create mode 100644 objects/scoreboard.pyx create mode 100644 personalBestCache.py create mode 100644 pp/__init__.py create mode 100644 pp/catch_the_pp/.gitignore create mode 100644 pp/catch_the_pp/LICENSE create mode 100644 pp/catch_the_pp/README.md create mode 100644 pp/catch_the_pp/__init__.py create mode 100644 pp/catch_the_pp/constants.pyx create mode 100644 pp/catch_the_pp/osu/__init__.py create mode 100644 pp/catch_the_pp/osu/ctb/__init__.py create mode 100644 pp/catch_the_pp/osu/ctb/difficulty.pyx create mode 100644 pp/catch_the_pp/osu_parser/__init__.py create mode 100644 pp/catch_the_pp/osu_parser/beatmap.pyx create mode 100644 pp/catch_the_pp/osu_parser/curves.pyx create mode 100644 pp/catch_the_pp/osu_parser/hitobject.pyx create mode 100644 pp/catch_the_pp/osu_parser/mathhelper.pyx create mode 100644 pp/catch_the_pp/ppCalc.pyx create mode 100644 pp/catch_the_pp/reanimate.osu create mode 100644 pp/catch_the_pp/sample.py create mode 100644 pp/catch_the_pp/setup.py create mode 100644 pp/catch_the_pp/test.osu create mode 100644 pp/cicciobello.py create mode 100644 pp/cmyui-testing/CAy.rar create mode 100644 pp/cmyui-testing/TiS.zip create mode 100644 pp/oppai-ng/.gitignore create mode 100644 pp/oppai-ng/.travis.yml create mode 100644 pp/oppai-ng/README.md create mode 100644 pp/oppai-ng/UNLICENSE create mode 100644 pp/oppai-ng/build.bat create mode 100644 pp/oppai-ng/build_containers create mode 100644 pp/oppai-ng/build_containers.ps1 create mode 100644 pp/oppai-ng/cflags create mode 100644 pp/oppai-ng/docker/musl-x86/Dockerfile create mode 100644 pp/oppai-ng/docker/musl-x86_64/Dockerfile create mode 100644 pp/oppai-ng/docker/windows/Dockerfile create mode 100644 pp/oppai-ng/package create mode 100644 pp/oppai-ng/package.ps1 create mode 100644 pp/oppai-ng/release create mode 100644 pp/oppai-ng/release.ps1 create mode 100644 pp/oppai-ng/test/download_suite create mode 100644 pp/oppai-ng/test/gentest.py create mode 100644 pp/oppai-ng/vcvarsall17.ps1 create mode 100644 pp/rippoppai.py create mode 100644 pp/rxoppai.py create mode 100644 pp/rxoppai/b3.py create mode 100644 pp/rxoppai/oppai create mode 100644 pp/rxoppai/oppai-old create mode 100644 pp/rxoppai/yes.osu create mode 100644 pp/rxoppai/yes2.osu create mode 100644 pp/rxoppai/yes3.osu create mode 100644 pp/rxoppai~05f367344c838990e809394850fb2ee794cce14e create mode 100644 pp/rxoppai~41cc2cb18015293c90c699e1d2089aa38beec8aa create mode 100644 pp/wifipiano2.py create mode 100644 pubSubHandlers/__init__.py create mode 100644 pubSubHandlers/beatmapUpdateHandler.py create mode 100644 requirements.txt create mode 100644 run.sh create mode 100644 secret/achievements/__init__.py create mode 100644 secret/achievements/common.py create mode 100644 secret/achievements/generate_sql.py create mode 100644 secret/achievements/handlers/combo.py create mode 100644 secret/achievements/handlers/mods.py create mode 100644 secret/achievements/handlers/playcount.py create mode 100644 secret/achievements/handlers/skillfc.py create mode 100644 secret/achievements/handlers/skillpass.py create mode 100644 secret/achievements/install/db.py create mode 100644 secret/achievements/install/init.py create mode 100644 secret/achievements/install/install_glob.py create mode 100644 secret/achievements/utils.py create mode 100644 setup.py create mode 100644 tomejerry.py create mode 100644 tomejerryrelax.py create mode 100644 userStatsCache.py create mode 100644 version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..19c4df1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +**/__pycache__ +**/build +config.ini +.data +runserver.bat +.idea +common_copied +common_refractor +*.c +*.so +*.log +common +gitold/ +test.py +tomejerryrx-unused.py diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..3d2e5af --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "common"] + path = common + url = git@github.com:osuAkatsuki/akatsuki-common.git +[submodule "pp/oppai-ng"] + path = pp/oppai-ng + url = https://github.com/Francesco149/oppai-ng.git +[submodule "pp/catch_the_pp"] + path = pp/catch_the_pp + url = https://github.com/osuripple/catch-the-pp.git diff --git a/.landscape.yaml b/.landscape.yaml new file mode 100644 index 0000000..982ae34 --- /dev/null +++ b/.landscape.yaml @@ -0,0 +1,7 @@ +python-targets: + - 3 +pep8: + none: true +pylint: + disable: + - cyclic-import \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..607c518 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ +GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + +A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + +The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + +An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + +The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU Affero General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + +The Corresponding Source for a work in source code form is that +same work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified +it, and giving a relevant date. + +b) The work must carry prominent notices stating that it is +released under this License and any conditions added under section +7. This requirement modifies the requirement in section 4 to +"keep intact all notices". + +c) You must license the entire work, as a whole, under this +License to anyone who comes into possession of a copy. This +License will therefore apply, along with any applicable section 7 +additional terms, to the whole of the work, and all its parts, +regardless of how they are packaged. This License gives no +permission to license the work in any other way, but it does not +invalidate such permission if you have separately received it. + +d) If the work has interactive user interfaces, each must display +Appropriate Legal Notices; however, if the Program has interactive +interfaces that do not display Appropriate Legal Notices, your +work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + +a) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by the +Corresponding Source fixed on a durable physical medium +customarily used for software interchange. + +b) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by a +written offer, valid for at least three years and valid for as +long as you offer spare parts or customer support for that product +model, to give anyone who possesses the object code either (1) a +copy of the Corresponding Source for all the software in the +product that is covered by this License, on a durable physical +medium customarily used for software interchange, for a price no +more than your reasonable cost of physically performing this +conveying of source, or (2) access to copy the +Corresponding Source from a network server at no charge. + +c) Convey individual copies of the object code with a copy of the +written offer to provide the Corresponding Source. This +alternative is allowed only occasionally and noncommercially, and +only if you received the object code with such an offer, in accord +with subsection 6b. + +d) Convey the object code by offering access from a designated +place (gratis or for a charge), and offer equivalent access to the +Corresponding Source in the same way through the same place at no +further charge. You need not require recipients to copy the +Corresponding Source along with the object code. If the place to +copy the object code is a network server, the Corresponding Source +may be on a different server (operated by you or a third party) +that supports equivalent copying facilities, provided you maintain +clear directions next to the object code saying where to find the +Corresponding Source. Regardless of what server hosts the +Corresponding Source, you remain obligated to ensure that it is +available for as long as needed to satisfy these requirements. + +e) Convey the object code using peer-to-peer transmission, provided +you inform other peers where the object code and Corresponding +Source of the work are being offered to the general public at no +charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + +a) Disclaiming warranty or limiting liability differently from the +terms of sections 15 and 16 of this License; or + +b) Requiring preservation of specified reasonable legal notices or +author attributions in that material or in the Appropriate Legal +Notices displayed by works containing it; or + +c) Prohibiting misrepresentation of the origin of that material, or +requiring that modified versions of such material be marked in +reasonable ways as different from the original version; or + +d) Limiting the use for publicity purposes of names of licensors or +authors of the material; or + +e) Declining to grant rights under trademark law for use of some +trade names, trademarks, or service marks; or + +f) Requiring indemnification of licensors and authors of that +material by anyone who conveys the material (or modified versions of +it) with contractual assumptions of liability to the recipient, for +any liability that these contractual assumptions directly impose on +those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + +13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f1a2773 --- /dev/null +++ b/README.md @@ -0,0 +1,81 @@ +[![Discord](https://discordapp.com/api/guilds/365406575893938177/widget.png?style=shield)](https://discord.gg/5cBtMPW) + +## LETS + +- Origin: https://zxq.co/ripple/lets +- Mirror: https://github.com/osuripple/lets + +## Latest Essential Tatoe Server +This server handles every non real time client feature, so: +- Ingame scoreboards +- Score submission +- Screenshots +- Replays +- osu!direct, thanks to [cheesegull](https://github.com/osuripple/cheesegull) +- Tillerino-like API (partially broken) +- osu!standard and taiko pp calculation with [oppai-ng](https://github.com/francesco149/oppai-ng), made by Franc[e]sco +- osu!mania pp calculation with a slightly edited version of [osu-tools](https://github.com/ppy/osu-tools), made by the osu! team +- catch the beat pp calculation with [catch-the-pp](https://github.com/osuripple/catch-the-pp), made by Sunpy and cythonized by Nyo + +## Requirements +- Python 3.6 +- Cython +- C compiler + +## How to set up LETS +First of all, initialize and update the submodules +``` +$ git submodule init && git submodule update +``` +afterwards, install the required dependencies with pip +``` +$ pip install -r requirements.txt +``` +compile all `*.pyx` files to `*.so` or `*.dll` files using `setup.py` (distutils file). +This compiles `catch-the-pp` as well. +``` +$ python3 setup.py build_ext --inplace +``` +then, run LETS once to create the default config file and edit it +``` +$ python3 lets.py +$ nano config.ini +``` +finally, compile oppai-ng (inside pp/oppai-ng) and osu-tools (inside pp/maniapp-osu-tools). + +## tomejerry.py +`tomejerry.py` is a tool that allows you to calculate pp for specific scores. It's extremely useful to do mass PP recalculations if you mess something up. It uses lets' config and packages, so make sure lets is installed and configured correctly before using it. +``` +usage: tomejerry.py [-h] + [-r | -z | -i ID | -m MODS | -g GAMEMODE | -u USERID | -b BEATMAPID | -fhd] + [-w WORKERS] [-cs CHUNKSIZE] [-v] + +pp recalc tool for ripple, new version. + +optional arguments: + -h, --help show this help message and exit + -r, --recalc calculates pp for all high scores + -z, --zero calculates pp for 0 pp high scores + -i ID, --id ID calculates pp for the score with this score_id + -m MODS, --mods MODS calculates pp for high scores with these mods (flags) + -g GAMEMODE, --gamemode GAMEMODE + calculates pp for scores played on this game mode + (std:0, taiko:1, ctb:2, mania:3) + -u USERID, --userid USERID + calculates pp for high scores set by a specific user + (user_id) + -b BEATMAPID, --beatmapid BEATMAPID + calculates pp for high scores played on a specific + beatmap (beatmap_id) + -fhd, --fixstdhd calculates pp for std hd high scores (14/05/2018 pp + algorithm changes) + -w WORKERS, --workers WORKERS + number of workers. 16 by default. Max 32 + -cs CHUNKSIZE, --chunksize CHUNKSIZE + score chunks size + -v, --verbose verbose/debug mode +``` + +## License +This project is licensed under the GNU AGPL 3 License. +See the "LICENSE" file for more information. diff --git a/constants/__init__.py b/constants/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/constants/dataTypes.py b/constants/dataTypes.py new file mode 100644 index 0000000..8cc816b --- /dev/null +++ b/constants/dataTypes.py @@ -0,0 +1,11 @@ +byte = 0 +uInt16 = 1 +sInt16 = 2 +uInt32 = 3 +sInt32 = 4 +uInt64 = 5 +sInt64 = 6 +string = 7 +ffloat = 8 +bbytes = 9 +rawReplay = 10 diff --git a/constants/exceptions.py b/constants/exceptions.py new file mode 100644 index 0000000..cd3dfeb --- /dev/null +++ b/constants/exceptions.py @@ -0,0 +1,54 @@ +from common.log import logUtils as log + + +class invalidArgumentsException(Exception): + def __init__(self, handler): + log.warning("{} - Invalid arguments".format(handler)) + +class loginFailedException(Exception): + def __init__(self, handler, who): + log.warning("{} - {}'s Login failed".format(handler, who)) + +class userBannedException(Exception): + def __init__(self, handler, who): + log.warning("{} - {} is banned".format(handler, who)) + +class userLockedException(Exception): + def __init__(self, handler, who): + log.warning("{} - {} is locked".format(handler, who)) + +class noBanchoSessionException(Exception): + def __init__(self, handler, who, ip): + log.warning("{handler} - {username} has tried to submit a score from {ip} without an active bancho session from that ip. If this happens often, {username} is trying to use a score submitter.".format(handler=handler, ip=ip, username=who), "bunker") + +class osuApiFailException(Exception): + def __init__(self, handler): + log.warning("{} - Invalid data from osu!api".format(handler)) + +class fileNotFoundException(Exception): + def __init__(self, handler, f): + log.warning("{} - File not found ({})".format(handler, f)) + +class invalidBeatmapException(Exception): + pass + +class unsupportedGameModeException(Exception): + pass + +class beatmapTooLongException(Exception): + def __init__(self, handler): + log.warning("{} - Requested beatmap is too long.".format(handler)) + +class need2FAException(Exception): + def __init__(self, handler, who, ip): + log.warning("{} - 2FA check needed for user {} ({})".format(handler, who, ip)) + +class noAPIDataError(Exception): + pass + +class scoreNotFoundError(Exception): + pass + +class ppCalcException(Exception): + def __init__(self, exception): + self.exception = exception \ No newline at end of file diff --git a/constants/rankedStatuses.py b/constants/rankedStatuses.py new file mode 100644 index 0000000..1b97681 --- /dev/null +++ b/constants/rankedStatuses.py @@ -0,0 +1,8 @@ +UNKNOWN = -2 +NOT_SUBMITTED = -1 +PENDING = 0 +NEED_UPDATE = 1 +RANKED = 2 +APPROVED = 3 +QUALIFIED = 4 +LOVED = 5 diff --git a/full_build.sh b/full_build.sh new file mode 100644 index 0000000..7b2ee9e --- /dev/null +++ b/full_build.sh @@ -0,0 +1,4 @@ +find . -name "*.c" -type f -delete +find . -name "*.o" -type f -delete +find . -name "*.so" -type f -delete +python3 setup.py build_ext --inplace \ No newline at end of file diff --git a/handlers/__init__.py b/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/handlers/apiCacheBeatmapHandler.py b/handlers/apiCacheBeatmapHandler.py new file mode 100644 index 0000000..2a75ab7 --- /dev/null +++ b/handlers/apiCacheBeatmapHandler.py @@ -0,0 +1,78 @@ +import json +import sys +import traceback + +import tornado.gen +import tornado.web +from raven.contrib.tornado import SentryMixin + +from objects import beatmap +from common.log import logUtils as log +from common.web import requestsManager +from constants import exceptions +from helpers import osuapiHelper +from objects import glob +from common.sentry import sentry + +MODULE_NAME = "api/cacheBeatmap" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /api/v1/cacheBeatmap + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncPost(self): + statusCode = 400 + data = {"message": "unknown error"} + try: + # Check arguments + if not requestsManager.checkArguments(self.request.arguments, ["sid", "refresh"]): + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Get beatmap set data from osu api + beatmapSetID = self.get_argument("sid") + refresh = int(self.get_argument("refresh")) + if refresh == 1: + log.debug("Forced refresh") + apiResponse = osuapiHelper.osuApiRequest("get_beatmaps", "s={}".format(beatmapSetID), False) + if len(apiResponse) == 0: + raise exceptions.invalidBeatmapException + + # Loop through all beatmaps in this set and save them in db + data["maps"] = [] + for i in apiResponse: + log.debug("Saving beatmap {} in db".format(i["file_md5"])) + bmap = beatmap.beatmap(i["file_md5"], int(i["beatmapset_id"]), refresh=refresh) + pp = glob.db.fetch("SELECT pp_100 FROM beatmaps WHERE beatmap_id = %s LIMIT 1", [bmap.beatmapID]) + if pp is None: + pp = 0 + else: + pp = pp["pp_100"] + data["maps"].append({ + "id": bmap.beatmapID, + "name": bmap.songName, + "status": bmap.rankedStatus, + "frozen": bmap.rankedStatusFrozen, + "pp": pp, + }) + + # Set status code and message + statusCode = 200 + data["message"] = "ok" + except exceptions.invalidArgumentsException: + # Set error and message + statusCode = 400 + data["message"] = "missing required arguments" + except exceptions.invalidBeatmapException: + statusCode = 400 + data["message"] = "beatmap not found from osu!api." + finally: + # Add status code to data + data["status"] = statusCode + + # Send response + self.write(json.dumps(data)) + self.set_header("Content-Type", "application/json") + #self.add_header("Access-Control-Allow-Origin", "*") + self.set_status(statusCode) \ No newline at end of file diff --git a/handlers/apiPPHandler.py b/handlers/apiPPHandler.py new file mode 100644 index 0000000..9d0d36a --- /dev/null +++ b/handlers/apiPPHandler.py @@ -0,0 +1,176 @@ +import json +import sys +import traceback + +import tornado.gen +import tornado.web +from raven.contrib.tornado import SentryMixin + +from objects import beatmap +from common.constants import gameModes +from common.log import logUtils as log +from common.web import requestsManager +from constants import exceptions +from helpers import osuapiHelper +from objects import glob +from pp import rippoppai +from pp import rxoppai +from common.sentry import sentry + +MODULE_NAME = "api/pp" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /api/v1/pp + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self): + statusCode = 400 + data = {"message": "unknown error"} + try: + # Check arguments + if not requestsManager.checkArguments(self.request.arguments, ["b"]): + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Get beatmap ID and make sure it's a valid number + beatmapID = self.get_argument("b") + if not beatmapID.isdigit(): + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Get mods + if "m" in self.request.arguments: + modsEnum = self.get_argument("m") + if not modsEnum.isdigit(): + raise exceptions.invalidArgumentsException(MODULE_NAME) + modsEnum = int(modsEnum) + else: + modsEnum = 0 + + # Get game mode + if "g" in self.request.arguments: + gameMode = self.get_argument("g") + if not gameMode.isdigit(): + raise exceptions.invalidArgumentsException(MODULE_NAME) + gameMode = int(gameMode) + else: + gameMode = 0 + + # Get acc + if "a" in self.request.arguments: + accuracy = self.get_argument("a") + try: + accuracy = float(accuracy) + except ValueError: + raise exceptions.invalidArgumentsException(MODULE_NAME) + else: + accuracy = -1.0 + + # Print message + log.info("Requested pp for beatmap {}".format(beatmapID)) + + # Get beatmap md5 from osuapi + # TODO: Move this to beatmap object + osuapiData = osuapiHelper.osuApiRequest("get_beatmaps", "b={}".format(beatmapID)) + if osuapiData is None or "file_md5" not in osuapiData or "beatmapset_id" not in osuapiData: + raise exceptions.invalidBeatmapException(MODULE_NAME) + beatmapMd5 = osuapiData["file_md5"] + beatmapSetID = osuapiData["beatmapset_id"] + + # Create beatmap object + bmap = beatmap.beatmap(beatmapMd5, beatmapSetID) + + # Check beatmap length + if bmap.hitLength > 900: + raise exceptions.beatmapTooLongException(MODULE_NAME) + + returnPP = [] + if gameMode == gameModes.STD and bmap.starsStd == 0: + # Mode Specific beatmap, auto detect game mode + if bmap.starsTaiko > 0: + gameMode = gameModes.TAIKO + if bmap.starsCtb > 0: + gameMode = gameModes.CTB + if bmap.starsMania > 0: + gameMode = gameModes.MANIA + + # Calculate pp + if gameMode == gameModes.STD or gameMode == gameModes.TAIKO: + # Std pp + if accuracy < 0 and modsEnum == 0: + # Generic acc + # Get cached pp values + cachedPP = bmap.getCachedTillerinoPP() + if cachedPP != [0,0,0,0]: + log.debug("Got cached pp.") + returnPP = cachedPP + else: + log.debug("Cached pp not found. Calculating pp with oppai...") + # Cached pp not found, calculate them + oppai = rippoppai.oppai(bmap, mods=modsEnum, tillerino=True) + returnPP = oppai.pp + bmap.starsStd = oppai.stars + + # Cache values in DB + log.debug("Saving cached pp...") + if type(returnPP) == list and len(returnPP) == 4: + bmap.saveCachedTillerinoPP(returnPP) + else: + # Specific accuracy, calculate + # Create oppai instance + log.debug("Specific request ({}%/{}). Calculating pp with oppai...".format(accuracy, modsEnum)) + if modsEnum & 128: + oppai = rxoppai.oppai(bmap, mods=modsEnum, tillerino=True) + else: + oppai = rippoppai.oppai(bmap, mods=modsEnum, tillerino=True) + bmap.starsStd = oppai.stars + if accuracy > 0: + returnPP.append(calculatePPFromAcc(oppai, accuracy)) + else: + returnPP = oppai.pp + else: + raise exceptions.unsupportedGameModeException() + + # Data to return + data = { + "song_name": bmap.songName, + "pp": [round(x, 2) for x in returnPP] if type(returnPP) == list else returnPP, + "length": bmap.hitLength, + "stars": bmap.starsStd, + "ar": bmap.AR, + "bpm": bmap.bpm, + } + + # Set status code and message + statusCode = 200 + data["message"] = "ok" + except exceptions.invalidArgumentsException: + # Set error and message + statusCode = 400 + data["message"] = "missing required arguments" + except exceptions.invalidBeatmapException: + statusCode = 400 + data["message"] = "beatmap not found" + except exceptions.beatmapTooLongException: + statusCode = 400 + data["message"] = "requested beatmap is too long" + except exceptions.unsupportedGameModeException: + statusCode = 400 + data["message"] = "Unsupported gamemode" + finally: + # Add status code to data + data["status"] = statusCode + + # Debug output + log.debug(str(data)) + + # Send response + #self.clear() + self.write(json.dumps(data)) + self.set_header("Content-Type", "application/json") + self.set_status(statusCode) + +def calculatePPFromAcc(ppcalc, acc): + ppcalc.acc = acc + ppcalc.calculatePP() + return ppcalc.pp diff --git a/handlers/apiStatusHandler.py b/handlers/apiStatusHandler.py new file mode 100644 index 0000000..71b450f --- /dev/null +++ b/handlers/apiStatusHandler.py @@ -0,0 +1,12 @@ +import json + +from common.web import requestsManager + + +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /api/v1/status + """ + def asyncGet(self): + self.write(json.dumps({"status": 200, "server_status": 1})) + #self.finish() diff --git a/handlers/banchoConnectHandler.py b/handlers/banchoConnectHandler.py new file mode 100644 index 0000000..006a46d --- /dev/null +++ b/handlers/banchoConnectHandler.py @@ -0,0 +1,70 @@ +import sys +import traceback + +import tornado.gen +import tornado.web +from raven.contrib.tornado import SentryMixin + +from common.log import logUtils as log +from common.ripple import userUtils +from common.web import requestsManager +from constants import exceptions +from objects import glob +from common.sentry import sentry + +MODULE_NAME = "bancho_connect" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /web/bancho_connect.php + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self): + try: + # Get request ip + ip = self.getRequestIP() + + # Argument check + if not requestsManager.checkArguments(self.request.arguments, ["u", "h"]): + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Get user ID + username = self.get_argument("u") + userID = userUtils.getID(username) + if userID is None: + raise exceptions.loginFailedException(MODULE_NAME, username) + + # Check login + log.info("{} ({}) wants to connect".format(username, userID)) + if not userUtils.checkLogin(userID, self.get_argument("h"), ip): + raise exceptions.loginFailedException(MODULE_NAME, username) + + # Ban check + if userUtils.isBanned(userID): + raise exceptions.userBannedException(MODULE_NAME, username) + + # Lock check + if userUtils.isLocked(userID): + raise exceptions.userLockedException(MODULE_NAME, username) + + # 2FA check + if userUtils.check2FA(userID, ip): + raise exceptions.need2FAException(MODULE_NAME, username, ip) + + # Update latest activity + userUtils.updateLatestActivity(userID) + + # Get country and output it + country = glob.db.fetch("SELECT country FROM users_stats WHERE id = %s", [userID])["country"] + self.write(country) + except exceptions.invalidArgumentsException: + pass + except exceptions.loginFailedException: + self.write("error: pass\n") + except exceptions.userBannedException: + pass + except exceptions.userLockedException: + pass + except exceptions.need2FAException: + self.write("error: verify\n") diff --git a/handlers/checkUpdatesHandler.py b/handlers/checkUpdatesHandler.py new file mode 100644 index 0000000..5aba291 --- /dev/null +++ b/handlers/checkUpdatesHandler.py @@ -0,0 +1,36 @@ +from urllib.parse import urlencode + +import requests +import tornado.gen +import tornado.web + +from common.log import logUtils as log +from common.web import requestsManager + + +class handler(requestsManager.asyncRequestHandler): + @tornado.web.asynchronous + @tornado.gen.engine + def asyncGet(self): + try: + args = {} + #if "stream" in self.request.arguments: + # args["stream"] = self.get_argument("stream") + #if "action" in self.request.arguments: + # args["action"] = self.get_argument("action") + #if "time" in self.request.arguments: + # args["time"] = self.get_argument("time") + + # Pass all arguments otherwise it doesn't work + for key, _ in self.request.arguments.items(): + args[key] = self.get_argument(key) + + if args["action"].lower() == "put": + self.write("nope") + return + + response = requests.get("https://osu.ppy.sh/web/check-updates.php?{}".format(urlencode(args))) + self.write(response.text) + except Exception as e: + log.error("check-updates failed: {}".format(e)) + self.write("") diff --git a/handlers/commentHandler.py b/handlers/commentHandler.py new file mode 100644 index 0000000..fd79fe9 --- /dev/null +++ b/handlers/commentHandler.py @@ -0,0 +1,175 @@ +import tornado.gen +import tornado.web + +from common.log import logUtils as log +from common.ripple import userUtils +from common.sentry import sentry +from common.web import requestsManager +from constants import exceptions +from objects import glob + +MODULE_NAME = "comments" + +class handler(requestsManager.asyncRequestHandler): + CLIENT_WHO = {"normal": "", "player": "player", "admin": "bat", "donor": "subscriber"} + + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncPost(self): + try: + # Required arguments check + if not requestsManager.checkArguments(self.request.arguments, ("u", "p", "a")): + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Get arguments + username = self.get_argument("u") + password = self.get_argument("p") + action = self.get_argument("a").strip().lower() + + # IP for session check + ip = self.getRequestIP() + + # Login and ban check + userID = userUtils.getID(username) + if userID == 0: + raise exceptions.loginFailedException(MODULE_NAME, userID) + if not userUtils.checkLogin(userID, password, ip): + raise exceptions.loginFailedException(MODULE_NAME, username) + if userUtils.check2FA(userID, ip): + raise exceptions.need2FAException(MODULE_NAME, userID, ip) + if userUtils.isBanned(userID): + raise exceptions.userBannedException(MODULE_NAME, username) + + # Action (depends on 'action' parameter, not on HTTP method) + if action == "get": + self.write(self._getComments()) + elif action == "post": + self._addComment() + except (exceptions.loginFailedException, exceptions.need2FAException, exceptions.userBannedException): + self.write("error: no") + + @staticmethod + def clientWho(y): + return handler.CLIENT_WHO[y["who"]] + ( + ("|{}".format(y["special_format"])) if y["special_format"] is not None else "" + ) + + def _getComments(self): + output = "" + + try: + beatmapID = int(self.get_argument("b", default=0)) + beatmapSetID = int(self.get_argument("s", default=0)) + scoreID = int(self.get_argument("r", default=0)) + except ValueError: + raise exceptions.invalidArgumentsException(MODULE_NAME) + + if beatmapID <= 0: + return + + log.info("Requested comments for beatmap id {}".format(beatmapID)) + + # Merge beatmap, beatmapset and score comments + for x in ( + {"db_type": "beatmap_id", "client_type": "map", "value": beatmapID}, + {"db_type": "beatmapset_id", "client_type": "song", "value": beatmapSetID}, + {"db_type": "score_id", "client_type": "replay", "value": scoreID}, + ): + # Add this set of comments only if the client has set the value + if x["value"] <= 0: + continue + + # Fetch these comments + comments = glob.db.fetchAll( + "SELECT * FROM comments WHERE {} = %s ORDER BY `time`".format(x["db_type"]), + (x["value"],) + ) + + # Output comments + output += "\n".join([ + "{y[time]}\t{client_name}\t{client_who}\t{y[comment]}".format( + y=y, + client_name=x["client_type"], + client_who=self.clientWho(y) + ) for y in comments + ]) + "\n" + return output + + def _addComment(self): + username = self.get_argument("u") + target = self.get_argument("target", default=None) + specialFormat = self.get_argument("f", default=None) + userID = userUtils.getID(username) + + # Technically useless + if userID < 0: + return + + # Get beatmap/set/score ids + try: + beatmapID = int(self.get_argument("b", default=0)) + beatmapSetID = int(self.get_argument("s", default=0)) + scoreID = int(self.get_argument("r", default=0)) + except ValueError: + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Add a comment, removing all illegal characters and trimming after 128 characters + comment = self.get_argument("comment").replace("\r", "").replace("\t", "").replace("\n", "")[:128] + try: + time_ = int(self.get_argument("starttime")) + except ValueError: + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Type of comment + who = "normal" + if target == "replay" and glob.db.fetch( + "SELECT COUNT(*) AS c FROM scores WHERE id = %s AND userid = %s AND completed = 3", + (scoreID, userID) + )["c"] > 0: + # From player, on their score + who = "player" + elif userUtils.isInAnyPrivilegeGroup(userID, ("super admin", "developer", "community manager", "bat")): + # From BAT/Admin + who = "admin" + elif userUtils.isInPrivilegeGroup(userID, "premium"): + # Akatsuki Premium Member + who = "donor" + + if target == "song": + # Set comment + if beatmapSetID <= 0: + return + value = beatmapSetID + column = "beatmapset_id" + elif target == "map": + # Beatmap comment + if beatmapID <= 0: + return + value = beatmapID + column = "beatmap_id" + elif target == "replay": + # Score comment + if scoreID <= 0: + return + value = scoreID + column = "score_id" + else: + # Invalid target + return + + # Make sure the user hasn't submitted another comment on the same map/set/song in a 5 seconds range + if glob.db.fetch( + "SELECT COUNT(*) AS c FROM comments WHERE user_id = %s AND {} = %s AND `time` BETWEEN %s AND %s".format( + column + ), (userID, value, time_ - 5000, time_ + 5000) + )["c"] > 0: + return + + # Store the comment + glob.db.execute( + "INSERT INTO comments ({}, user_id, comment, `time`, who, special_format) " + "VALUES (%s, %s, %s, %s, %s, %s)".format(column), + (value, userID, comment, time_, who, specialFormat) + ) + log.info("Submitted {} ({}) comment, user {}: '{}'".format(column, value, userID, comment)) diff --git a/handlers/defaultHandler.py b/handlers/defaultHandler.py new file mode 100644 index 0000000..2bc248f --- /dev/null +++ b/handlers/defaultHandler.py @@ -0,0 +1,53 @@ +import tornado.gen +import tornado.web + +from common.web import requestsManager + + +class handler(requestsManager.asyncRequestHandler): + @tornado.web.asynchronous + @tornado.gen.engine + def asyncGet(self): + print("404: {}".format(self.request.uri)) + self.write(""" + + + + + +
+
+ +

Howdy, you're still connected to Akatsuki!

+ You can't access osu!'s website if the Server Switcher is On.
+ Please open the Server Switcher and click On/Off to switch server, then refresh this page. +

If you still can't access osu! website even if the switcher is Off, clean your browser cache.

+
+
+ + + """) diff --git a/handlers/downloadMapHandler.py b/handlers/downloadMapHandler.py new file mode 100644 index 0000000..0d18765 --- /dev/null +++ b/handlers/downloadMapHandler.py @@ -0,0 +1,29 @@ +import tornado.gen +import tornado.web + +from common.web import requestsManager +from common.sentry import sentry + +MODULE_NAME = "direct_download" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /d/ + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self, bid): + try: + noVideo = bid.endswith("n") + if noVideo: + bid = bid[:-1] + bid = int(bid) + + self.set_status(302, "Moved Temporarily") + url = "https://bm6.ppy.sh/d/{}{}".format(bid, "?novideo" if noVideo else "") + self.add_header("Location", url) + self.add_header("Cache-Control", "no-cache") + self.add_header("Pragma", "no-cache") + except ValueError: + self.set_status(400) + self.write("Invalid set id") \ No newline at end of file diff --git a/handlers/emptyHandler.py b/handlers/emptyHandler.py new file mode 100644 index 0000000..ed682bc --- /dev/null +++ b/handlers/emptyHandler.py @@ -0,0 +1,12 @@ +import tornado.gen +import tornado.web + +from common.web import requestsManager + + +class handler(requestsManager.asyncRequestHandler): + @tornado.web.asynchronous + @tornado.gen.engine + def asyncGet(self): + #self.set_status(404) + self.write("Not yet") diff --git a/handlers/getFullReplayHandler.py b/handlers/getFullReplayHandler.py new file mode 100644 index 0000000..836481e --- /dev/null +++ b/handlers/getFullReplayHandler.py @@ -0,0 +1,31 @@ +import tornado.gen +import tornado.web + +from common.web import requestsManager +from constants import exceptions +from helpers import replayHelper +from common.sentry import sentry + +MODULE_NAME = "get_full_replay" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /replay/ + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self, replayID): + try: + fullReplay = replayHelper.buildFullReplay(scoreID=replayID) + self.write(fullReplay) + self.add_header("Content-type", "application/octet-stream") + self.set_header("Content-length", len(fullReplay)) + self.set_header("Content-Description", "File Transfer") + self.set_header("Content-Disposition", "attachment; filename=\"{}.osr\"".format(replayID)) + except (exceptions.fileNotFoundException, exceptions.scoreNotFoundError): + fullReplay = replayHelper.rxbuildFullReplay(scoreID=replayID) + self.write(fullReplay) + self.add_header("Content-type", "application/octet-stream") + self.set_header("Content-length", len(fullReplay)) + self.set_header("Content-Description", "File Transfer") + self.set_header("Content-Disposition", "attachment; filename=\"{}.osr\"".format(replayID)) \ No newline at end of file diff --git a/handlers/getReplayHandler.py b/handlers/getReplayHandler.py new file mode 100644 index 0000000..6545ca2 --- /dev/null +++ b/handlers/getReplayHandler.py @@ -0,0 +1,79 @@ +import os +import sys +import traceback + +import tornado.gen +import tornado.web +from raven.contrib.tornado import SentryMixin + +from common.log import logUtils as log +from common.ripple import userUtils +from common.web import requestsManager +from constants import exceptions +from common.constants import mods +from objects import glob +from objects import rxscore +from common.sentry import sentry + +MODULE_NAME = "get_replay" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for osu-getreplay.php + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self): + try: + # Get request ip + ip = self.getRequestIP() + + # Check arguments + if not requestsManager.checkArguments(self.request.arguments, ["c", "u", "h"]): + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Get arguments + username = self.get_argument("u") + password = self.get_argument("h") + replayID = self.get_argument("c") + s = rxscore.score() + # Login check + userID = userUtils.getID(username) + if userID == 0: + raise exceptions.loginFailedException(MODULE_NAME, userID) + if not userUtils.checkLogin(userID, password, ip): + raise exceptions.loginFailedException(MODULE_NAME, username) + if userUtils.check2FA(userID, ip): + raise exceptions.need2FAException(MODULE_NAME, username, ip) + + # Get user ID + if bool(s.mods & 128): # Relax + replayData = glob.db.fetch("SELECT scores_relax.*, users.username AS uname FROM scores_relax LEFT JOIN users ON scores_relax.userid = users.id WHERE scores_relax.id = %s", [replayID]) + # Increment 'replays watched by others' if needed + if replayData is not None: + if username != replayData["uname"]: + userUtils.incrementReplaysWatched(replayData["userid"], replayData["play_mode"], s.mods) + else: + replayData = glob.db.fetch("SELECT scores.*, users.username AS uname FROM scores LEFT JOIN users ON scores.userid = users.id WHERE scores.id = %s", [replayID]) + # Increment 'replays watched by others' if needed + if replayData is not None: + if username != replayData["uname"]: + userUtils.incrementReplaysWatched(replayData["userid"], replayData["play_mode"], s.mods) + + + log.info("Serving replay_{}.osr".format(replayID)) + fileName = ".data/replays/replay_{}.osr".format(replayID) + if os.path.isfile(fileName): + with open(fileName, "rb") as f: + fileContent = f.read() + self.write(fileContent) + else: + self.write("") + log.warning("Replay {} doesn't exist.".format(replayID)) + + except exceptions.invalidArgumentsException: + pass + except exceptions.need2FAException: + pass + except exceptions.loginFailedException: + pass \ No newline at end of file diff --git a/handlers/getScoresHandler.pyx b/handlers/getScoresHandler.pyx new file mode 100644 index 0000000..f9ba323 --- /dev/null +++ b/handlers/getScoresHandler.pyx @@ -0,0 +1,121 @@ +import json +import tornado.gen +import tornado.web + +from objects import beatmap +from objects import scoreboard +from objects import relaxboard +from common.constants import privileges +from common.log import logUtils as log +from common.ripple import userUtils +from common.web import requestsManager +from constants import exceptions +from objects import glob +from common.constants import mods +from common.sentry import sentry + +MODULE_NAME = "get_scores" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /web/osu-osz2-getscores.php + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self): + try: + # Get request ip + ip = self.getRequestIP() + + # Print arguments + if glob.debug: + requestsManager.printArguments(self) + + # TODO: Maintenance check + + # Check required arguments + if not requestsManager.checkArguments(self.request.arguments, ["c", "f", "i", "m", "us", "v", "vv", "mods"]): + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # GET parameters + md5 = self.get_argument("c") + fileName = self.get_argument("f") + beatmapSetID = self.get_argument("i") + gameMode = self.get_argument("m") + username = self.get_argument("us") + password = self.get_argument("ha") + scoreboardType = int(self.get_argument("v")) + scoreboardVersion = int(self.get_argument("vv")) + + # Login and ban check + userID = userUtils.getID(username) + if userID == 0: + raise exceptions.loginFailedException(MODULE_NAME, userID) + if not userUtils.checkLogin(userID, password, ip): + raise exceptions.loginFailedException(MODULE_NAME, username) + if userUtils.check2FA(userID, ip): + raise exceptions.need2FAException(MODULE_NAME, username, ip) + # Ban check is pointless here, since there's no message on the client + #if userHelper.isBanned(userID) == True: + # raise exceptions.userBannedException(MODULE_NAME, username) + + # Hax check + if "a" in self.request.arguments: + if int(self.get_argument("a")) == 1 and not userUtils.getAqn(userID): + log.warning("Found AQN folder on user {} ({})".format(username, userID), "cm") + userUtils.setAqn(userID) + + # Scoreboard type + isDonor = userUtils.getPrivileges(userID) & privileges.USER_DONOR > 0 + country = False + friends = False + modsFilter = -1 + mods = int(self.get_argument("mods")) + if scoreboardType == 4: + # Country leaderboard + country = True + elif scoreboardType == 2: + # Mods leaderboard, replace mods (-1, every mod) with "mods" GET parameters + modsFilter = int(self.get_argument("mods")) + + elif scoreboardType == 3 and isDonor: + # Friends leaderboard + friends = True + + # Console output + fileNameShort = fileName[:32]+"..." if len(fileName) > 32 else fileName[:-4] + if scoreboardType == 1 and int(self.get_argument("mods")) & 128: + log.info("[RELAX] Requested beatmap {} ({})".format(fileNameShort, md5)) + else: + log.info("[VANILLA] Requested beatmap {} ({})".format(fileNameShort, md5)) + + # Create beatmap object and set its data + bmap = beatmap.beatmap(md5, beatmapSetID, gameMode) + + if int(self.get_argument("mods")) & 128: + glob.redis.publish("peppy:update_rxcached_stats", userID) + else: + glob.redis.publish("peppy:update_cached_stats", userID) + + if bool(mods & 128): + sboard = relaxboard.scoreboard(username, gameMode, bmap, setScores=True, country=country, mods=modsFilter, friends=friends) + else: + sboard = scoreboard.scoreboard(username, gameMode, bmap, setScores=True, country=country, mods=modsFilter, friends=friends) + + # Data to return + data = "" + data += bmap.getData(sboard.totalScores, scoreboardVersion) + data += sboard.getScoresData() + self.write(data) + + + # Datadog stats + glob.dog.increment(glob.DATADOG_PREFIX+".served_leaderboards") + except exceptions.need2FAException: + self.write("error: 2fa") + except exceptions.invalidArgumentsException: + self.write("error: meme") + except exceptions.userBannedException: + self.write("error: ban") + except exceptions.loginFailedException: + self.write("error: pass") diff --git a/handlers/getScreenshotHandler.py b/handlers/getScreenshotHandler.py new file mode 100644 index 0000000..e196cca --- /dev/null +++ b/handlers/getScreenshotHandler.py @@ -0,0 +1,41 @@ +import os +import sys +import traceback + +import tornado.gen +import tornado.web +from raven.contrib.tornado import SentryMixin + +from common.log import logUtils as log +from common.web import requestsManager +from constants import exceptions +from objects import glob +from common.sentry import sentry + +MODULE_NAME = "get_screenshot" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /ss/ + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self, screenshotID = None): + try: + # Make sure the screenshot exists + if screenshotID is None or not os.path.isfile(".data/screenshots/{}".format(screenshotID)): + raise exceptions.fileNotFoundException(MODULE_NAME, screenshotID) + + # Read screenshot + with open(".data/screenshots/{}".format(screenshotID), "rb") as f: + data = f.read() + + # Output + log.info("Served screenshot {}".format(screenshotID)) + + # Display screenshot + self.write(data) + self.set_header("Content-type", "image/jpg") + self.set_header("Content-length", len(data)) + except exceptions.fileNotFoundException: + self.set_status(404) diff --git a/handlers/loadTestHandler.py b/handlers/loadTestHandler.py new file mode 100644 index 0000000..95e6ee0 --- /dev/null +++ b/handlers/loadTestHandler.py @@ -0,0 +1,18 @@ +import tornado.gen +import tornado.web + +from common.web import requestsManager +from objects import glob + + +class handler(requestsManager.asyncRequestHandler): + @tornado.web.asynchronous + @tornado.gen.engine + def asyncGet(self): + if not glob.debug: + self.write("Nope") + return + glob.db.fetchAll("SELECT SQL_NO_CACHE * FROM beatmaps") + glob.db.fetchAll("SELECT SQL_NO_CACHE * FROM users") + glob.db.fetchAll("SELECT SQL_NO_CACHE * FROM scores") + self.write("ibmd") diff --git a/handlers/mapsHandler.py b/handlers/mapsHandler.py new file mode 100644 index 0000000..e5e39c9 --- /dev/null +++ b/handlers/mapsHandler.py @@ -0,0 +1,35 @@ +import tornado.gen +import tornado.web + +from common.log import logUtils as log +from common.web import requestsManager +from constants import exceptions +from helpers import osuapiHelper +from common.sentry import sentry + +MODULE_NAME = "maps" +class handler(requestsManager.asyncRequestHandler): + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self, fileName = None): + try: + # Check arguments + if fileName is None: + raise exceptions.invalidArgumentsException(MODULE_NAME) + if fileName == "": + raise exceptions.invalidArgumentsException(MODULE_NAME) + + fileNameShort = fileName[:32]+"..." if len(fileName) > 32 else fileName[:-4] + log.info("Requested .osu file {}".format(fileNameShort)) + + # Get .osu file from osu! server + fileContent = osuapiHelper.getOsuFileFromName(fileName) + if fileContent is None: + # TODO: Sentry capture message here + raise exceptions.osuApiFailException(MODULE_NAME) + self.write(fileContent) + except exceptions.invalidArgumentsException: + self.set_status(500) + except exceptions.osuApiFailException: + self.set_status(500) \ No newline at end of file diff --git a/handlers/osuErrorHandler.py b/handlers/osuErrorHandler.py new file mode 100644 index 0000000..3f0137d --- /dev/null +++ b/handlers/osuErrorHandler.py @@ -0,0 +1,11 @@ +import tornado.gen +import tornado.web + +from common.web import requestsManager + + +class handler(requestsManager.asyncRequestHandler): + @tornado.web.asynchronous + @tornado.gen.engine + def asyncGet(self): + self.write("") diff --git a/handlers/osuSearchHandler.py b/handlers/osuSearchHandler.py new file mode 100644 index 0000000..9332184 --- /dev/null +++ b/handlers/osuSearchHandler.py @@ -0,0 +1,58 @@ +import tornado.gen +import tornado.web + +from common.sentry import sentry +from common.web import requestsManager +from common.web import cheesegull +from constants import exceptions +from common.log import logUtils as log + +MODULE_NAME = "direct" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /web/osu-search.php + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self): + output = "" + try: + try: + # Get arguments + gameMode = self.get_argument("m", None) + if gameMode is not None: + gameMode = int(gameMode) + if gameMode < 0 or gameMode > 3: + gameMode = None + + rankedStatus = self.get_argument("r", None) + if rankedStatus is not None: + rankedStatus = int(rankedStatus) + + query = self.get_argument("q", "") + page = int(self.get_argument("p", "0")) + if query.lower() in ["newest", "top rated", "most played"]: + query = "" + except ValueError: + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Get data from cheesegull API + log.info("Requested osu!direct search: {}".format(query if query != "" else "index")) + searchData = cheesegull.getListing(rankedStatus=cheesegull.directToApiStatus(rankedStatus), page=page * 100, gameMode=gameMode, query=query) + if searchData is None or searchData is None: + raise exceptions.noAPIDataError() + + # Write output + output += "999" if len(searchData) == 100 else str(len(searchData)) + output += "\n" + for beatmapSet in searchData: + try: + output += cheesegull.toDirect(beatmapSet) + "\r\n" + except ValueError: + # Invalid cheesegull beatmap (empty beatmapset, cheesegull bug? See Sentry #LETS-00-32) + pass + except (exceptions.noAPIDataError, exceptions.invalidArgumentsException): + output = "0\n" + finally: + self.write(output) diff --git a/handlers/osuSearchSetHandler.py b/handlers/osuSearchSetHandler.py new file mode 100644 index 0000000..529d1b0 --- /dev/null +++ b/handlers/osuSearchSetHandler.py @@ -0,0 +1,42 @@ +import tornado.gen +import tornado.web + +from common.sentry import sentry +from common.web import requestsManager +from common.web import cheesegull +from common.log import logUtils as log +from constants import exceptions + +MODULE_NAME = "direct_np" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /web/osu-search-set.php + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncGet(self): + output = "" + try: + # Get data by beatmap id or beatmapset id + if "b" in self.request.arguments: + _id = self.get_argument("b") + data = cheesegull.getBeatmap(_id) + elif "s" in self.request.arguments: + _id = self.get_argument("s") + data = cheesegull.getBeatmapSet(_id) + else: + raise exceptions.invalidArgumentsException(MODULE_NAME) + + log.info("Requested osu!direct np: {}/{}".format("b" if "b" in self.request.arguments else "s", _id)) + + # Make sure cheesegull returned some valid data + if data is None or len(data) == 0: + raise exceptions.osuApiFailException(MODULE_NAME) + + # Write the response + output = cheesegull.toDirectNp(data) + "\r\n" + except (exceptions.invalidArgumentsException, exceptions.osuApiFailException, KeyError): + output = "" + finally: + self.write(output) \ No newline at end of file diff --git a/handlers/redirectHandler.py b/handlers/redirectHandler.py new file mode 100644 index 0000000..7c4e62a --- /dev/null +++ b/handlers/redirectHandler.py @@ -0,0 +1,14 @@ +import tornado.web +import tornado.gen + +from common.web import requestsManager + +class handler(requestsManager.asyncRequestHandler): + def initialize(self, destination): + self.destination = destination + + @tornado.web.asynchronous + @tornado.gen.engine + def asyncGet(self, args=()): + self.set_status(302) + self.add_header("location", self.destination.format(args)) diff --git a/handlers/submitModularHandler.pyx b/handlers/submitModularHandler.pyx new file mode 100644 index 0000000..3853a52 --- /dev/null +++ b/handlers/submitModularHandler.pyx @@ -0,0 +1,513 @@ +import base64 +import collections +import json +import sys +import threading +import traceback +from urllib.parse import urlencode + +import requests +import tornado.gen +import tornado.web +import math + +import secret.achievements.utils +from common.constants import gameModes +from common.constants import mods +from common.log import logUtils as log +from common.ripple import userUtils +from common.ripple import scoreUtils +from common.web import requestsManager +from constants import exceptions +from constants import rankedStatuses +from constants.exceptions import ppCalcException +from helpers import aeshelper +from helpers import replayHelper +from helpers import leaderboardHelper +from objects import beatmap +from objects import glob +from objects import score +from objects import scoreboard +from objects import relaxboard +from objects import rxscore +from common import generalUtils + + +MODULE_NAME = "submit_modular" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /web/osu-submit-modular.php + """ + @tornado.web.asynchronous + @tornado.gen.engine + #@sentry.captureTornado + def asyncPost(self): + try: + # Resend the score in case of unhandled exceptions + keepSending = True + + # Get request ip + ip = self.getRequestIP() + + # Print arguments + if glob.debug: + requestsManager.printArguments(self) + + # Check arguments + if not requestsManager.checkArguments(self.request.arguments, ["score", "iv", "pass"]): + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # TODO: Maintenance check + + # Get parameters and IP + scoreDataEnc = self.get_argument("score") + iv = self.get_argument("iv") + password = self.get_argument("pass") + ip = self.getRequestIP() + + # Get bmk and bml (notepad hack check) + if "bmk" in self.request.arguments and "bml" in self.request.arguments: + bmk = self.get_argument("bmk") + bml = self.get_argument("bml") + else: + bmk = None + bml = None + + # Get right AES Key + if "osuver" in self.request.arguments: + aeskey = "osu!-scoreburgr---------{}".format(self.get_argument("osuver")) + else: + aeskey = "h89f2-890h2h89b34g-h80g134n90133" + + # Get score data + log.debug("Decrypting score data...") + scoreData = aeshelper.decryptRinjdael(aeskey, iv, scoreDataEnc, True).split(":") + username = scoreData[1].strip() + + # Login and ban check + userID = userUtils.getID(username) + # User exists check + if userID == 0: + raise exceptions.loginFailedException(MODULE_NAME, userID) + # Bancho session/username-pass combo check + if not userUtils.checkLogin(userID, password, ip): + raise exceptions.loginFailedException(MODULE_NAME, username) + # 2FA Check + if userUtils.check2FA(userID, ip): + raise exceptions.need2FAException(MODULE_NAME, userID, ip) + # Generic bancho session check + #if not userUtils.checkBanchoSession(userID): + # TODO: Ban (see except exceptions.noBanchoSessionException block) + # raise exceptions.noBanchoSessionException(MODULE_NAME, username, ip) + # Ban check + if userUtils.isBanned(userID): + raise exceptions.userBannedException(MODULE_NAME, username) + # Data length check + if len(scoreData) < 16: + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Get restricted + restricted = userUtils.isRestricted(userID) + + # Get variables for relax + used_mods = int(scoreData[13]) + isRelaxing = used_mods & 128 + + # Create score object and set its data + log.info("[{}] {} has submitted a score on {}...".format("RELAX" if isRelaxing else "VANILLA", username, scoreData[0])) + s = rxscore.score() if isRelaxing else score.score() + s.setDataFromScoreData(scoreData) + + if s.completed == -1: + # Duplicated score + log.warning("Duplicated score detected, this is normal right after restarting the server") + return + + # Set score stuff missing in score data + s.playerUserID = userID + + # Get beatmap info + beatmapInfo = beatmap.beatmap() + beatmapInfo.setDataFromDB(s.fileMd5) + + # Make sure the beatmap is submitted and updated + if beatmapInfo.rankedStatus == rankedStatuses.NOT_SUBMITTED or beatmapInfo.rankedStatus == rankedStatuses.NEED_UPDATE or beatmapInfo.rankedStatus == rankedStatuses.UNKNOWN: + log.debug("Beatmap is not submitted/outdated/unknown. Score submission aborted.") + return + + # increment user playtime + length = 0 + if s.passed: + length = userUtils.getBeatmapTime(beatmapInfo.beatmapID) + else: + length = math.ceil(int(self.get_argument("ft")) / 1000) + + userUtils.incrementPlaytime(userID, s.gameMode, length) + # Calculate PP + midPPCalcException = None + try: + s.calculatePP() + except Exception as e: + # Intercept ALL exceptions and bypass them. + # We want to save scores even in case PP calc fails + # due to some rippoppai bugs. + # I know this is bad, but who cares since I'll rewrite + # the scores server again. + log.error("Caught an exception in pp calculation, re-raising after saving score in db") + s.pp = 0 + midPPCalcException = e + + # Restrict obvious cheaters™ + if restricted == False: + if isRelaxing: # Relax + rxGods = [7340, 2137, 6868, 1215, 15066, 14522, 1325, 5798, 21610, 1254] # Yea yea it's a bad way of doing it, kill yourself - cmyui osu gaming + """ + CTBLIST = [] + TAIKOLIST = [] + """ + + if (s.pp >= 2000 and s.gameMode == gameModes.STD) and userID not in rxGods: + userUtils.restrict(userID) + userUtils.appendNotes(userID, "Restricted due to too high pp gain ({}pp)".format(s.pp)) + log.warning("**{}** ({}) has been restricted due to too high pp gain **({}pp)**".format(username, userID, s.pp), "cm") + """ + elif (s.pp >= 10000 and s.gameMode == gameModes.TAIKO) and userID not in TAIKOLIST: + userUtils.restrict(userID) + userUtils.appendNotes(userID, "Restricted due to too high pp gain ({}pp)".format(s.pp)) + log.warning("**{}** ({}) has been restricted due to too high pp gain **({}pp)**".format(username, userID, s.pp), "cm") + elif s.pp >= 10000 and (s.gameMode == gameModes.CTB) and userID not in CTBLIST: + userUtils.restrict(userID) + userUtils.appendNotes(userID, "Restricted due to too high pp gain ({}pp)".format(s.pp)) + log.warning("**{}** ({}) has been restricted due to too high pp gain **({}pp)**".format(username, userID, s.pp), "cm") + """ + else: # Vanilla + if (s.pp >= 700 and s.gameMode == gameModes.STD): + userUtils.restrict(userID) + userUtils.appendNotes(userID, "Restricted due to too high pp gain ({}pp)".format(s.pp)) + log.warning("**{}** ({}) has been restricted due to too high pp gain **({}pp)**".format(username, userID, s.pp), "cm") + """ + elif (s.pp >= 10000 and s.gameMode == gameModes.TAIKO): + userUtils.restrict(userID) + userUtils.appendNotes(userID, "Restricted due to too high pp gain ({}pp)".format(s.pp)) + log.warning("**{}** ({}) has been restricted due to too high pp gain **({}pp)**".format(username, userID, s.pp), "cm") + elif s.pp >= 10000 and (s.gameMode == gameModes.CTB): + userUtils.restrict(userID) + userUtils.appendNotes(userID, "Restricted due to too high pp gain ({}pp)".format(s.pp)) + log.warning("**{}** ({}) has been restricted due to too high pp gain **({}pp)**".format(username, userID, s.pp), "cm") + """ + + # Check notepad hack + if bmk is None and bml is None: + # No bmk and bml params passed, edited or super old client + #log.warning("{} ({}) most likely submitted a score from an edited client or a super old client".format(username, userID), "cm") + pass + elif bmk != bml and not restricted: + # bmk and bml passed and they are different, restrict the user + userUtils.restrict(userID) + userUtils.appendNotes(userID, "Restricted due to notepad hack") + log.warning("**{}** ({}) has been restricted due to notepad hack".format(username, userID), "cm") + return + + # Save score in db + s.saveScoreInDB() + + # Client anti-cheat flags + haxFlags = scoreData[17].count(' ') # 4 is normal, 0 is irregular but inconsistent. + if haxFlags != 4 and haxFlags != 0 and s.completed > 1 and restricted == False: + + flagsReadable = generalUtils.calculateFlags(haxFlags, used_mods, s.gameMode) + userUtils.appendNotes(userID, "-- has received clientside flags: {} [{}] (cheated score id: {})".format(haxFlags, flagsReadable, s.scoreID)) + log.warning("**{}** ({}) has received clientside anti cheat flags.\n\nFlags: {}.\n[{}]\n\nScore ID: {scoreID}\nReplay: https://akatsuki.pw/web/replays/{scoreID}".format(username, userID, haxFlags, flagsReadable, scoreID=s.scoreID), "cm") + + if s.score < 0 or s.score > (2 ** 63) - 1: + userUtils.ban(userID) + userUtils.appendNotes(userID, "Banned due to negative score.") + + # Make sure the score is not memed + if s.gameMode == gameModes.MANIA and s.score > 1000000: + userUtils.ban(userID) + userUtils.appendNotes(userID, "Banned due to mania score > 1000000.") + + # Ci metto la faccia, ci metto la testa e ci metto il mio cuore + if ((s.mods & mods.DOUBLETIME) > 0 and (s.mods & mods.HALFTIME) > 0) \ + or ((s.mods & mods.HARDROCK) > 0 and (s.mods & mods.EASY) > 0) \ + or ((s.mods & mods.SUDDENDEATH) > 0 and (s.mods & mods.NOFAIL) > 0)\ + or ((s.mods & mods.RELAX) > 0 and (s.mods & mods.RELAX2) > 0): + userUtils.ban(userID) + userUtils.appendNotes(userID, "Impossible mod combination ({}).".format(s.mods)) + + # NOTE: Process logging was removed from the client starting from 20180322 + # Save replay for all passed scores + # Make sure the score has an id as well (duplicated?, query error?) + if s.passed and s.scoreID > 0: + if "score" in self.request.files: + # Save the replay if it was provided + log.debug("Saving replay ({})...".format(s.scoreID)) + replay = self.request.files["score"][0]["body"] + with open(".data/replays/replay_{}.osr".format(s.scoreID), "wb") as f: + f.write(replay) + + # Send to cono ALL passed replays, even non high-scores + if glob.conf.config["cono"]["enable"]: + if isRelaxing: + threading.Thread(target=lambda: glob.redis.publish( + "cono:analyze", json.dumps({ + "score_id": s.scoreID, + "beatmap_id": beatmapInfo.beatmapID, + "user_id": s.playerUserID, + "game_mode": s.gameMode, + "pp": s.pp, + "replay_data": base64.b64encode( + replayHelper.rxbuildFullReplay( + s.scoreID, + rawReplay=self.request.files["score"][0]["body"] + ) + ).decode(), + }) + )).start() + else: + # We run this in a separate thread to avoid slowing down scores submission, + # as cono needs a full replay + threading.Thread(target=lambda: glob.redis.publish( + "cono:analyze", json.dumps({ + "score_id": s.scoreID, + "beatmap_id": beatmapInfo.beatmapID, + "user_id": s.playerUserID, + "game_mode": s.gameMode, + "pp": s.pp, + "replay_data": base64.b64encode( + replayHelper.buildFullReplay( + s.scoreID, + rawReplay=self.request.files["score"][0]["body"] + ) + ).decode(), + }) + )).start() + else: + # Restrict if no replay was provided + if not restricted: + userUtils.restrict(userID) + userUtils.appendNotes(userID, "Restricted due to missing replay while submitting a score.") + log.warning("**{}** ({}) has been restricted due to not submitting a replay on map {}.".format( + username, userID, s.fileMd5 + ), "cm") + + # Update beatmap playcount (and passcount) + beatmap.incrementPlaycount(s.fileMd5, s.passed) + + # Let the api know of this score + if s.scoreID: + glob.redis.publish("api:score_submission", s.scoreID) + + # Re-raise pp calc exception after saving score, cake, replay etc + # so Sentry can track it without breaking score submission + if midPPCalcException is not None: + raise ppCalcException(midPPCalcException) + + # If there was no exception, update stats and build score submitted panel + # Get "before" stats for ranking panel (only if passed) + if s.passed: + # Get stats and rank + if isRelaxing: + oldUserData = glob.userStatsCache.rxget(userID, s.gameMode) + oldRank = userUtils.rxgetGameRank(userID, s.gameMode) + else: + oldUserData = glob.userStatsCache.get(userID, s.gameMode) + oldRank = userUtils.getGameRank(userID, s.gameMode) + + # Try to get oldPersonalBestRank from cache + oldPersonalBestRank = glob.personalBestCache.get(userID, s.fileMd5) + if oldPersonalBestRank == 0: + # oldPersonalBestRank not found in cache, get it from db + if isRelaxing: + oldScoreboard = relaxboard.scoreboard(username, s.gameMode, beatmapInfo, False) + else: + oldScoreboard = scoreboard.scoreboard(username, s.gameMode, beatmapInfo, False) + + oldScoreboard.setPersonalBest() + oldPersonalBestRank = oldScoreboard.personalBestRank if oldScoreboard.personalBestRank > 0 else 0 + + # Always update users stats (total/ranked score, playcount, level, acc and pp) + # even if not passed + + log.debug("[{}] Updating {}'s stats...".format("RELAX" if isRelaxing else "VANILLA", username)) + if isRelaxing: + userUtils.rxupdateStats(userID, s) + else: + userUtils.updateStats(userID, s) + + # Get "after" stats for ranking panel + # and to determine if we should update the leaderboard + # (only if we passed that song) + if s.passed: + # Get new stats + if isRelaxing: + newUserData = userUtils.getRelaxStats(userID, s.gameMode) + glob.userStatsCache.rxupdate(userID, s.gameMode, newUserData) + else: + newUserData = userUtils.getUserStats(userID, s.gameMode) + glob.userStatsCache.update(userID, s.gameMode, newUserData) + + # Update leaderboard (global and country) if score/pp has changed + if s.completed == 3 and newUserData["pp"] != oldUserData["pp"]: + if isRelaxing: + leaderboardHelper.rxupdate(userID, newUserData["pp"], s.gameMode) + leaderboardHelper.rxupdateCountry(userID, newUserData["pp"], s.gameMode) + else: + leaderboardHelper.update(userID, newUserData["pp"], s.gameMode) + leaderboardHelper.updateCountry(userID, newUserData["pp"], s.gameMode) + + # TODO: Update total hits and max combo + # Update latest activity + userUtils.updateLatestActivity(userID) + + # IP log + userUtils.IPLog(userID, ip) + + # Score submission and stats update done + log.debug("Score submission and user stats update done!") + + # Score has been submitted, do not retry sending the score if + # there are exceptions while building the ranking panel + keepSending = False + + # At the end, check achievements + if s.passed: + new_achievements = secret.achievements.utils.unlock_achievements(s, beatmapInfo, newUserData) + + # Output ranking panel only if we passed the song + # and we got valid beatmap info from db + if beatmapInfo is not None and beatmapInfo != False and s.passed: + log.debug("Started building ranking panel.") + + + if isRelaxing: # Relax + # Trigger bancho stats cache update + glob.redis.publish("peppy:update_rxcached_stats", userID) + + # Get personal best after submitting the score + newScoreboard = relaxboard.scoreboard(username, s.gameMode, beatmapInfo, True) + + # Get rank info (current rank, pp/score to next rank, user who is 1 rank above us) + rankInfo = leaderboardHelper.rxgetRankInfo(userID, s.gameMode) + + else: # Vanilla + # Trigger bancho stats cache update + glob.redis.publish("peppy:update_cached_stats", userID) + + # Get personal best after submitting the score + newScoreboard = scoreboard.scoreboard(username, s.gameMode, beatmapInfo, True) + + # Get rank info (current rank, pp/score to next rank, user who is 1 rank above us) + rankInfo = leaderboardHelper.getRankInfo(userID, s.gameMode) + + # Output dictionary + output = collections.OrderedDict() + output["beatmapId"] = beatmapInfo.beatmapID + output["beatmapSetId"] = beatmapInfo.beatmapSetID + output["beatmapPlaycount"] = beatmapInfo.playcount + output["beatmapPasscount"] = beatmapInfo.passcount + #output["approvedDate"] = "2015-07-09 23:20:14\n" + output["approvedDate"] = "\n" + output["chartId"] = "overall" + output["chartName"] = "Overall Ranking" + output["chartEndDate"] = "" + output["beatmapRankingBefore"] = oldPersonalBestRank + output["beatmapRankingAfter"] = newScoreboard.personalBestRank + output["rankedScoreBefore"] = oldUserData["rankedScore"] + output["rankedScoreAfter"] = newUserData["rankedScore"] + output["totalScoreBefore"] = oldUserData["totalScore"] + output["totalScoreAfter"] = newUserData["totalScore"] + output["playCountBefore"] = newUserData["playcount"] + output["accuracyBefore"] = float(oldUserData["accuracy"])/100 + output["accuracyAfter"] = float(newUserData["accuracy"])/100 + output["rankBefore"] = oldRank + output["rankAfter"] = rankInfo["currentRank"] + output["toNextRank"] = rankInfo["difference"] + output["toNextRankUser"] = rankInfo["nextUsername"] + output["achievements"] = "" + output["achievements-new"] = secret.achievements.utils.achievements_response(new_achievements) + output["onlineScoreId"] = s.scoreID + + # Build final string + msg = "" + for line, val in output.items(): + msg += "{}:{}".format(line, val) + if val != "\n": + if (len(output) - 1) != list(output.keys()).index(line): + msg += "|" + else: + msg += "\n" + + # Some debug messages + log.debug("Generated output for online ranking screen!") + log.debug(msg) + + # Send message to #announce if we're rank #1 + if newScoreboard.personalBestRank == 1 and s.completed == 3 and not restricted: + annmsg = "[{}] [https://akatsuki.pw/u/{} {}] achieved rank #1 on [https://osu.ppy.sh/b/{} {}] ({})".format( + "RELAX" if isRelaxing else "VANILLA", + userID, + username.encode().decode("ASCII", "ignore"), + beatmapInfo.beatmapID, + beatmapInfo.songName.encode().decode("ASCII", "ignore"), + gameModes.getGamemodeFull(s.gameMode) + ) + params = urlencode({"k": glob.conf.config["server"]["apikey"], "to": "#announce", "msg": annmsg}) + requests.get("{}/api/v1/fokabotMessage?{}".format(glob.conf.config["server"]["banchourl"], params)) + + scoreUtils.newFirst(userID, s.scoreID, s.fileMd5, s.gameMode, isRelaxing) + + # Write message to client + self.write(msg) + else: + # No ranking panel, send just "ok" + self.write("ok") + + # Send username change request to bancho if needed + # (key is deleted bancho-side) + newUsername = glob.redis.get("ripple:change_username_pending:{}".format(userID)) + if newUsername is not None: + log.debug("Sending username change request for user {} to Bancho".format(userID)) + glob.redis.publish("peppy:change_username", json.dumps({ + "userID": userID, + "newUsername": newUsername.decode("utf-8") + })) + + # Datadog stats + glob.dog.increment(glob.DATADOG_PREFIX+".submitted_scores") + except exceptions.invalidArgumentsException: + pass + except exceptions.loginFailedException: + self.write("error: pass") + except exceptions.need2FAException: + # Send error pass to notify the user + # resend the score at regular intervals + # for users with memy connection + self.set_status(408) + self.write("error: 2fa") + except exceptions.userBannedException: + self.write("error: ban") + except exceptions.noBanchoSessionException: + # We don't have an active bancho session. + # Don't ban the user but tell the client to send the score again. + # Once we are sure that this error doesn't get triggered when it + # shouldn't (eg: bancho restart), we'll ban users that submit + # scores without an active bancho session. + # We only log through schiavo atm (see exceptions.py). + self.set_status(408) + self.write("error: pass") + except: + # Try except block to avoid more errors + try: + log.error("Unknown error in {}!\n```{}\n{}```".format(MODULE_NAME, sys.exc_info(), traceback.format_exc())) + if glob.sentry: + yield tornado.gen.Task(self.captureException, exc_info=True) + except: + pass + + # Every other exception returns a 408 error (timeout) + # This avoids lost scores due to score server crash + # because the client will send the score again after some time. + if keepSending: + self.set_status(408) diff --git a/handlers/uploadScreenshotHandler.py b/handlers/uploadScreenshotHandler.py new file mode 100644 index 0000000..162fe5f --- /dev/null +++ b/handlers/uploadScreenshotHandler.py @@ -0,0 +1,74 @@ +import os +import sys +import traceback + +import tornado.gen +import tornado.web +from raven.contrib.tornado import SentryMixin + +from common.log import logUtils as log +from common.ripple import userUtils +from common.web import requestsManager +from constants import exceptions +from common import generalUtils +from objects import glob +from common.sentry import sentry + +MODULE_NAME = "screenshot" +class handler(requestsManager.asyncRequestHandler): + """ + Handler for /web/osu-screenshot.php + """ + @tornado.web.asynchronous + @tornado.gen.engine + @sentry.captureTornado + def asyncPost(self): + try: + if glob.debug: + requestsManager.printArguments(self) + + # Make sure screenshot file was passed + if "ss" not in self.request.files: + raise exceptions.invalidArgumentsException(MODULE_NAME) + + # Check user auth because of sneaky people + if not requestsManager.checkArguments(self.request.arguments, ["u", "p"]): + raise exceptions.invalidArgumentsException(MODULE_NAME) + username = self.get_argument("u") + password = self.get_argument("p") + ip = self.getRequestIP() + userID = userUtils.getID(username) + if not userUtils.checkLogin(userID, password): + raise exceptions.loginFailedException(MODULE_NAME, username) + if userUtils.check2FA(userID, ip): + raise exceptions.need2FAException(MODULE_NAME, username, ip) + + # Rate limit + if glob.redis.get("lets:screenshot:{}".format(userID)) is not None: + self.write("no") + return + glob.redis.set("lets:screenshot:{}".format(userID), 1, 60) + + # Get a random screenshot id + found = False + screenshotID = "" + while not found: + screenshotID = generalUtils.randomString(8) + if not os.path.isfile(".data/screenshots/{}.jpg".format(screenshotID)): + found = True + + # Write screenshot file to .data folder + with open(".data/screenshots/{}.jpg".format(screenshotID), "wb") as f: + f.write(self.request.files["ss"][0]["body"]) + + # Output + log.info("New screenshot ({})".format(screenshotID)) + + # Return screenshot link + self.write("{}/ss/{}.jpg".format(glob.conf.config["server"]["servername"], screenshotID)) + except exceptions.need2FAException: + pass + except exceptions.invalidArgumentsException: + pass + except exceptions.loginFailedException: + pass \ No newline at end of file diff --git a/helpers/__init__.py b/helpers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/helpers/aeshelper.py b/helpers/aeshelper.py new file mode 100644 index 0000000..cca072b --- /dev/null +++ b/helpers/aeshelper.py @@ -0,0 +1,449 @@ +""" +A pure python (slow) implementation of rijndael with a decent interface + +To include - + +from rijndael import rijndael + +To do a key setup - + +r = rijndael(key, block_size = 16) + +key must be a string of length 16, 24, or 32 +blocksize must be 16, 24, or 32. Default is 16 + +To use - + +ciphertext = r.encrypt(plaintext) +plaintext = r.decrypt(ciphertext) + +If any strings are of the wrong length a ValueError is thrown +""" + +# ported from the Java reference code by Bram Cohen, April 2001 +# this code is public domain, unless someone makes +# an intellectual property claim against the reference +# code, in which case it can be made public domain by +# deleting all the comments and renaming all the variables + +import copy +import base64 + +shifts = [[[0, 0], [1, 3], [2, 2], [3, 1]], + [[0, 0], [1, 5], [2, 4], [3, 3]], + [[0, 0], [1, 7], [3, 5], [4, 4]]] + +# [keysize][block_size] +num_rounds = {16: {16: 10, 24: 12, 32: 14}, 24: {16: 12, 24: 12, 32: 14}, 32: {16: 14, 24: 14, 32: 14}} + +A = [[1, 1, 1, 1, 1, 0, 0, 0], + [0, 1, 1, 1, 1, 1, 0, 0], + [0, 0, 1, 1, 1, 1, 1, 0], + [0, 0, 0, 1, 1, 1, 1, 1], + [1, 0, 0, 0, 1, 1, 1, 1], + [1, 1, 0, 0, 0, 1, 1, 1], + [1, 1, 1, 0, 0, 0, 1, 1], + [1, 1, 1, 1, 0, 0, 0, 1]] + +# produce log and alog tables, needed for multiplying in the +# field GF(2^m) (generator = 3) +alog = [1] +for i in range(255): + j = (alog[-1] << 1) ^ alog[-1] + if j & 0x100 != 0: + j ^= 0x11B + alog.append(j) + +log = [0] * 256 +for i in range(1, 255): + log[alog[i]] = i + +# multiply two elements of GF(2^m) +def mul(a, b): + if a == 0 or b == 0: + return 0 + return alog[(log[a & 0xFF] + log[b & 0xFF]) % 255] + +# substitution box based on F^{-1}(x) +box = [[0] * 8 for i in range(256)] +box[1][7] = 1 +for i in range(2, 256): + j = alog[255 - log[i]] + for t in range(8): + box[i][t] = (j >> (7 - t)) & 0x01 + +B = [0, 1, 1, 0, 0, 0, 1, 1] + +# affine transform: box[i] <- B + A*box[i] +cox = [[0] * 8 for i in range(256)] +for i in range(256): + for t in range(8): + cox[i][t] = B[t] + for j in range(8): + cox[i][t] ^= A[t][j] * box[i][j] + +# S-boxes and inverse S-boxes +S = [0] * 256 +Si = [0] * 256 +for i in range(256): + S[i] = cox[i][0] << 7 + for t in range(1, 8): + S[i] ^= cox[i][t] << (7-t) + Si[S[i] & 0xFF] = i + +# T-boxes +G = [[2, 1, 1, 3], + [3, 2, 1, 1], + [1, 3, 2, 1], + [1, 1, 3, 2]] + +AA = [[0] * 8 for i in range(4)] + +for i in range(4): + for j in range(4): + AA[i][j] = G[i][j] + AA[i][i+4] = 1 + +for i in range(4): + pivot = AA[i][i] + if pivot == 0: + t = i + 1 + while AA[t][i] == 0 and t < 4: + t += 1 + assert t != 4, 'G matrix must be invertible' + for j in range(8): + AA[i][j], AA[t][j] = AA[t][j], AA[i][j] + pivot = AA[i][i] + for j in range(8): + if AA[i][j] != 0: + AA[i][j] = alog[(255 + log[AA[i][j] & 0xFF] - log[pivot & 0xFF]) % 255] + for t in range(4): + if i != t: + for j in range(i+1, 8): + AA[t][j] ^= mul(AA[i][j], AA[t][i]) + AA[t][i] = 0 + +iG = [[0] * 4 for i in range(4)] + +for i in range(4): + for j in range(4): + iG[i][j] = AA[i][j + 4] + +def mul4(a, bs): + if a == 0: + return 0 + r = 0 + for b in bs: + r <<= 8 + if b != 0: + r |= mul(a, b) + return r + +T1 = [] +T2 = [] +T3 = [] +T4 = [] +T5 = [] +T6 = [] +T7 = [] +T8 = [] +U1 = [] +U2 = [] +U3 = [] +U4 = [] + +for t in range(256): + s = S[t] + T1.append(mul4(s, G[0])) + T2.append(mul4(s, G[1])) + T3.append(mul4(s, G[2])) + T4.append(mul4(s, G[3])) + + s = Si[t] + T5.append(mul4(s, iG[0])) + T6.append(mul4(s, iG[1])) + T7.append(mul4(s, iG[2])) + T8.append(mul4(s, iG[3])) + + U1.append(mul4(t, iG[0])) + U2.append(mul4(t, iG[1])) + U3.append(mul4(t, iG[2])) + U4.append(mul4(t, iG[3])) + +# round constants +rcon = [1] +r = 1 +for t in range(1, 30): + r = mul(2, r) + rcon.append(r) + +del A +del AA +del pivot +del B +del G +del box +del log +del alog +del i +del j +del r +del s +del t +del mul +del mul4 +del cox +del iG + +class rijndael: + def __init__(self, key, block_size = 16): + if block_size != 16 and block_size != 24 and block_size != 32: + raise ValueError('Invalid block size: ' + str(block_size)) + if len(key) != 16 and len(key) != 24 and len(key) != 32: + raise ValueError('Invalid key size: ' + str(len(key))) + self.block_size = block_size + + ROUNDS = num_rounds[len(key)][block_size] + BC = block_size // 4 + # encryption round keys + Ke = [[0] * BC for i in range(ROUNDS + 1)] + # decryption round keys + Kd = [[0] * BC for i in range(ROUNDS + 1)] + ROUND_KEY_COUNT = (ROUNDS + 1) * BC + KC = len(key) // 4 + + # copy user material bytes into temporary ints + tk = [] + for i in range(0, KC): + tk.append((ord(key[i * 4]) << 24) | (ord(key[i * 4 + 1]) << 16) | + (ord(key[i * 4 + 2]) << 8) | ord(key[i * 4 + 3])) + + # copy values into round key arrays + t = 0 + j = 0 + while j < KC and t < ROUND_KEY_COUNT: + Ke[t // BC][t % BC] = tk[j] + Kd[ROUNDS - (t // BC)][t % BC] = tk[j] + j += 1 + t += 1 + tt = 0 + rconpointer = 0 + while t < ROUND_KEY_COUNT: + # extrapolate using phi (the round key evolution function) + tt = tk[KC - 1] + tk[0] ^= (S[(tt >> 16) & 0xFF] & 0xFF) << 24 ^ \ + (S[(tt >> 8) & 0xFF] & 0xFF) << 16 ^ \ + (S[ tt & 0xFF] & 0xFF) << 8 ^ \ + (S[(tt >> 24) & 0xFF] & 0xFF) ^ \ + (rcon[rconpointer] & 0xFF) << 24 + rconpointer += 1 + if KC != 8: + for i in range(1, KC): + tk[i] ^= tk[i-1] + else: + for i in range(1, KC // 2): + tk[i] ^= tk[i-1] + tt = tk[KC // 2 - 1] + tk[KC // 2] ^= (S[ tt & 0xFF] & 0xFF) ^ \ + (S[(tt >> 8) & 0xFF] & 0xFF) << 8 ^ \ + (S[(tt >> 16) & 0xFF] & 0xFF) << 16 ^ \ + (S[(tt >> 24) & 0xFF] & 0xFF) << 24 + for i in range(KC // 2 + 1, KC): + tk[i] ^= tk[i-1] + # copy values into round key arrays + j = 0 + while j < KC and t < ROUND_KEY_COUNT: + Ke[t // BC][t % BC] = tk[j] + Kd[ROUNDS - (t // BC)][t % BC] = tk[j] + j += 1 + t += 1 + # inverse MixColumn where needed + for r in range(1, ROUNDS): + for j in range(BC): + tt = Kd[r][j] + Kd[r][j] = U1[(tt >> 24) & 0xFF] ^ \ + U2[(tt >> 16) & 0xFF] ^ \ + U3[(tt >> 8) & 0xFF] ^ \ + U4[ tt & 0xFF] + self.Ke = Ke + self.Kd = Kd + + def encrypt(self, plaintext): + if len(plaintext) != self.block_size: + raise ValueError('wrong block length, expected ' + str(self.block_size) + ' got ' + str(len(plaintext))) + Ke = self.Ke + + BC = self.block_size // 4 + ROUNDS = len(Ke) - 1 + if BC == 4: + SC = 0 + elif BC == 6: + SC = 1 + else: + SC = 2 + s1 = shifts[SC][1][0] + s2 = shifts[SC][2][0] + s3 = shifts[SC][3][0] + a = [0] * BC + # temporary work array + t = [] + # plaintext to ints + key + for i in range(BC): + t.append((ord(plaintext[i * 4 ]) << 24 | + ord(plaintext[i * 4 + 1]) << 16 | + ord(plaintext[i * 4 + 2]) << 8 | + ord(plaintext[i * 4 + 3]) ) ^ Ke[0][i]) + # apply round transforms + for r in range(1, ROUNDS): + for i in range(BC): + a[i] = (T1[(t[ i ] >> 24) & 0xFF] ^ + T2[(t[(i + s1) % BC] >> 16) & 0xFF] ^ + T3[(t[(i + s2) % BC] >> 8) & 0xFF] ^ + T4[ t[(i + s3) % BC] & 0xFF] ) ^ Ke[r][i] + t = copy.copy(a) + # last round is special + result = [] + for i in range(BC): + tt = Ke[ROUNDS][i] + result.append((S[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) + result.append((S[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) + result.append((S[(t[(i + s2) % BC] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) + result.append((S[ t[(i + s3) % BC] & 0xFF] ^ tt ) & 0xFF) + return ''.join(map(chr, result)) + + def decrypt(self, ciphertext): + if len(ciphertext) != self.block_size: + raise ValueError('wrong block length, expected ' + str(self.block_size) + ' got ' + str(len(ciphertext))) + Kd = self.Kd + + BC = self.block_size // 4 + ROUNDS = len(Kd) - 1 + if BC == 4: + SC = 0 + elif BC == 6: + SC = 1 + else: + SC = 2 + s1 = shifts[SC][1][1] + s2 = shifts[SC][2][1] + s3 = shifts[SC][3][1] + a = [0] * BC + # temporary work array + t = [0] * BC + # ciphertext to ints + key + for i in range(BC): + t[i] = (ord(ciphertext[i * 4 ]) << 24 | + ord(ciphertext[i * 4 + 1]) << 16 | + ord(ciphertext[i * 4 + 2]) << 8 | + ord(ciphertext[i * 4 + 3]) ) ^ Kd[0][i] + # apply round transforms + for r in range(1, ROUNDS): + for i in range(BC): + a[i] = (T5[(t[ i ] >> 24) & 0xFF] ^ + T6[(t[(i + s1) % BC] >> 16) & 0xFF] ^ + T7[(t[(i + s2) % BC] >> 8) & 0xFF] ^ + T8[ t[(i + s3) % BC] & 0xFF] ) ^ Kd[r][i] + t = copy.copy(a) + # last round is special + result = [] + for i in range(BC): + tt = Kd[ROUNDS][i] + result.append((Si[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) + result.append((Si[(t[(i + s1) % BC] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) + result.append((Si[(t[(i + s2) % BC] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) + result.append((Si[ t[(i + s3) % BC] & 0xFF] ^ tt ) & 0xFF) + return ''.join(map(chr, result)) + +def encrypt(key, block): + return rijndael(key, len(block)).encrypt(block) + +def decrypt(key, block): + return rijndael(key, len(block)).decrypt(block) + + +class zeropad: + def __init__(self, block_size): + assert 0 < block_size < 256 + self.block_size = block_size + + def pad(self, pt): + ptlen = len(pt) + padsize = self.block_size - ((ptlen + self.block_size - 1) % self.block_size + 1) + return pt + "\0" * padsize + + def unpad(self, ppt): + assert len(ppt) % self.block_size == 0 + offset = len(ppt) + if offset == 0: + return '' + end = offset - self.block_size + 1 + while offset > end: + offset -= 1 + if ppt[offset] != "\0": + return ppt[:offset + 1] + assert False + +class cbc: + def __init__(self, padding, cipher, iv): + assert padding.block_size == cipher.block_size + assert len(iv) == cipher.block_size + self.padding = padding + self.cipher = cipher + self.iv = iv + + def encrypt(self, pt): + ppt = self.padding.pad(pt) + offset = 0 + ct = '' + v = self.iv + while offset < len(ppt): + block = ppt[offset:offset + self.cipher.block_size] + block = self.xorblock(block, v) + block = self.cipher.encrypt(block) + ct += block + offset += self.cipher.block_size + v = block + return ct + + def decrypt(self, ct): + assert len(ct) % self.cipher.block_size == 0 + ppt = '' + offset = 0 + v = self.iv + while offset < len(ct): + block = ct[offset:offset + self.cipher.block_size] + decrypted = self.cipher.decrypt(block) + ppt += self.xorblock(decrypted, v) + offset += self.cipher.block_size + v = block + pt = self.padding.unpad(ppt) + return pt + + def xorblock(self, b1, b2): + # sorry, not very Pythonesk + i = 0 + r = '' + while i < self.cipher.block_size: + r += chr(ord(b1[i]) ^ ord(b2[i])) + i += 1 + return r + + + +def decryptRinjdael(key, iv, data, areBase64 = False): + """ + Where the magic happens + + key -- AES key (string) + IV -- IV thing (string) + data -- data to decrypt (string) + areBase64 -- if True, iv and data are passed in base64 + """ + if areBase64: + iv = base64.b64decode(iv).decode("latin_1") + data = base64.b64decode(data).decode("latin_1") + + r = rijndael(key, 32) + p = zeropad(32) + c = cbc(p, r, iv) + return str(c.decrypt(data)) diff --git a/helpers/binaryHelper.py b/helpers/binaryHelper.py new file mode 100644 index 0000000..c2ce258 --- /dev/null +++ b/helpers/binaryHelper.py @@ -0,0 +1,65 @@ +"""That's basically packetHelper.py from pep.py, with some changes to make it work with replay files.""" + +from constants import dataTypes +import struct + +def uleb128Encode(num): + arr = bytearray() + length = 0 + if num == 0: + return bytearray(b"\x00") + while num > 0: + arr.append(num & 127) + num >>= 7 + if num != 0: + arr[length] |= 128 + length+=1 + return arr + +def packData(__data, __dataType): + data = bytes() + pack = True + packType = " 2048 characters + message = message[:2048]+"..." if len(message) > 2048 else message + + # Check for word filters + message = glob.chatFilters.filterMessage(message) + + # Build packet bytes + packet = serverPackets.sendMessage(token.username, toClient, message) + + # Send the message + isChannel = to.startswith("#") + if isChannel: + # CHANNEL + # Make sure the channel exists + if to not in glob.channels.channels: + raise exceptions.channelUnknownException() + + # Make sure the channel is not in moderated mode + if glob.channels.channels[to].moderated and not token.admin: + raise exceptions.channelModeratedException() + + # Make sure we are in the channel + if to not in token.joinedChannels: + # I'm too lazy to put and test the correct IRC error code here... + # but IRC is not strict at all so who cares + raise exceptions.channelNoPermissionsException() + + # Make sure we have write permissions + if not glob.channels.channels[to].publicWrite and not token.admin: + raise exceptions.channelNoPermissionsException() + + # Add message in buffer + token.addMessageInBuffer(to, message) + + # Everything seems fine, build recipients list and send packet + glob.streams.broadcast("chat/{}".format(to), packet, but=[token.token]) + else: + # USER + # Make sure recipient user is connected + recipientToken = glob.tokens.getTokenFromUsername(to) + if recipientToken is None: + raise exceptions.userNotFoundException() + + # Make sure the recipient is not a tournament client + #if recipientToken.tournament: + # raise exceptions.userTournamentException() + + # Make sure the recipient is not restricted or we are FokaBot + if recipientToken.restricted and fro.lower() != glob.BOT_NAME: + raise exceptions.userRestrictedException() + + # TODO: Make sure the recipient has not disabled PMs for non-friends or he's our friend + + # Away check + if recipientToken.awayCheck(token.userID): + sendMessage(to, fro, "\x01ACTION is away: {}\x01".format(recipientToken.awayMessage)) + + # Check message templates (mods/admins only) + if message in messageTemplates.templates and token.admin: + sendMessage(fro, to, messageTemplates.templates[message]) + + # Everything seems fine, send packet + recipientToken.enqueue(packet) + + # Send the message to IRC + if glob.irc and toIRC: + messageSplitInLines = message.encode("latin-1").decode("utf-8").split("\n") + for line in messageSplitInLines: + if line == messageSplitInLines[:1] and line == "": + continue + glob.ircServer.banchoMessage(fro, to, line) + + # Spam protection (ignore FokaBot) + if token.userID > 999: + token.spamProtection() + + # Fokabot message + if isChannel or to == glob.BOT_NAME: + fokaMessage = fokabot.fokabotResponse(token.username, to, message) + if fokaMessage: + sendMessage(glob.BOT_NAME, to if isChannel else fro, fokaMessage) + + # File and discord logs (public chat only) (to make public only, if to.startswith("#") and not) + if not (message.startswith("\x01ACTION is playing") and to.startswith("#spect_")): + if isChannel: + log.chat("[PUBLIC] {fro} @ {to}: {message}".format(fro=token.username, to=to, message=message.encode("latin-1").decode("utf-8"))) + glob.schiavo.sendChatlog("**{fro} @ {to}:** {message}".format(fro=token.username, to=to, message=message.encode("latin-1").decode("utf-8"))) + else: + log.pm("[PRIVATE] {fro} @ {to}: {message}".format(fro=token.username, to=to, message=message.encode("latin-1").decode("utf-8"))) + glob.schiavo.sendChatlog("**{fro} @ {to}:** {message}".format(fro=token.username, to=to, message=message.encode("latin-1").decode("utf-8"))) + return 0 + except exceptions.userSilencedException: + token.enqueue(serverPackets.silenceEndTime(token.getSilenceSecondsLeft())) + log.warning("{} tried to send a message during silence".format(token.username)) + return 404 + except exceptions.channelModeratedException: + log.warning("{} tried to send a message to a channel that is in moderated mode ({})".format(token.username, to)) + return 404 + except exceptions.channelUnknownException: + log.warning("{} tried to send a message to an unknown channel ({})".format(token.username, to)) + return 403 + except exceptions.channelNoPermissionsException: + log.warning("{} tried to send a message to channel {}, but they have no write permissions".format(token.username, to)) + return 404 + except exceptions.userRestrictedException: + log.warning("{} tried to send a message {}, but the recipient is in restricted mode".format(token.username, to)) + return 404 + except exceptions.userTournamentException: + log.warning("{} tried to send a message {}, but the recipient is a tournament client".format(token.username, to)) + return 404 + except exceptions.userNotFoundException: + log.warning("User not connected to IRC/Bancho") + return 401 + except exceptions.invalidArgumentsException: + log.warning("{} tried to send an invalid message to {}".format(token.username, to)) + return 404 + + +""" IRC-Bancho Connect/Disconnect/Join/Part interfaces""" +def fixUsernameForBancho(username): + """ + Convert username from IRC format (without spaces) to Bancho format (with spaces) + + :param username: username to convert + :return: converted username + """ + # If there are no spaces or underscores in the name + # return it + if " " not in username and "_" not in username: + return username + + # Exact match first + result = glob.db.fetch("SELECT id FROM users WHERE username = %s LIMIT 1", [username]) + if result is not None: + return username + + # Username not found, replace _ with space + return username.replace("_", " ") + +def fixUsernameForIRC(username): + """ + Convert an username from Bancho format to IRC format (underscores instead of spaces) + + :param username: username to convert + :return: converted username + """ + return username.replace(" ", "_") + +def IRCConnect(username): + """ + Handle IRC login bancho-side. + Add token and broadcast login packet. + + :param username: username + :return: + """ + userID = userUtils.getID(username) + if not userID: + log.warning("{} doesn't exist".format(username)) + return + glob.tokens.deleteOldTokens(userID) + glob.tokens.addToken(userID, irc=True) + glob.streams.broadcast("main", serverPackets.userPanel(userID)) + log.info("{} logged in from IRC".format(username)) + +def IRCDisconnect(username): + """ + Handle IRC logout bancho-side. + Remove token and broadcast logout packet. + + :param username: username + :return: + """ + token = glob.tokens.getTokenFromUsername(username) + if token is None: + log.warning("{} doesn't exist".format(username)) + return + logoutEvent.handle(token) + log.info("{} disconnected from IRC".format(username)) + +def IRCJoinChannel(username, channel): + """ + Handle IRC channel join bancho-side. + + :param username: username + :param channel: channel name + :return: IRC return code + """ + userID = userUtils.getID(username) + if not userID: + log.warning("{} doesn't exist".format(username)) + return + # NOTE: This should have also `toIRC` = False` tho, + # since we send JOIN message later on ircserver.py. + # Will test this later + return joinChannel(userID, channel) + +def IRCPartChannel(username, channel): + """ + Handle IRC channel part bancho-side. + + :param username: username + :param channel: channel name + :return: IRC return code + """ + userID = userUtils.getID(username) + if not userID: + log.warning("{} doesn't exist".format(username)) + return + return partChannel(userID, channel) + +def IRCAway(username, message): + """ + Handle IRC away command bancho-side. + + :param username: + :param message: away message + :return: IRC return code + """ + userID = userUtils.getID(username) + if not userID: + log.warning("{} doesn't exist".format(username)) + return + glob.tokens.getTokenFromUserID(userID).awayMessage = message + return 305 if message == "" else 306 + diff --git a/helpers/config.py b/helpers/config.py new file mode 100644 index 0000000..88d9da4 --- /dev/null +++ b/helpers/config.py @@ -0,0 +1,148 @@ +import os +import configparser + +class config: + """ + config.ini object + + config -- list with ini data + default -- if true, we have generated a default config.ini + """ + + config = configparser.ConfigParser() + fileName = "" # config filename + default = True + + # Check if config.ini exists and load/generate it + def __init__(self, __file): + """ + Initialize a config object + + __file -- filename + """ + + self.fileName = __file + if os.path.isfile(self.fileName): + # config.ini found, load it + self.config.read(self.fileName) + self.default = False + else: + # config.ini not found, generate a default one + self.generateDefaultConfig() + self.default = True + + + # Check if config.ini has all needed the keys + def checkConfig(self): + """ + Check if this config has the required keys + + return -- True if valid, False if not + """ + + try: + # Try to get all the required keys + self.config.get("db","host") + self.config.get("db","username") + self.config.get("db","password") + self.config.get("db","database") + self.config.get("db","workers") + + self.config.get("redis","host") + self.config.get("redis","port") + self.config.get("redis","database") + self.config.get("redis","password") + + self.config.get("server","host") + self.config.get("server","port") + self.config.get("server", "debug") + self.config.get("server", "beatmapcacheexpire") + self.config.get("server", "serverurl") + self.config.get("server", "banchourl") + self.config.get("server", "threads") + self.config.get("server", "apikey") + + self.config.get("sentry","enable") + self.config.get("sentry","dsn") + + self.config.get("datadog", "enable") + self.config.get("datadog", "apikey") + self.config.get("datadog", "appkey") + + self.config.get("osuapi","enable") + self.config.get("osuapi","apiurl") + self.config.get("osuapi","apikey") + + self.config.get("cheesegull", "apiurl") + + self.config.get("discord","enable") + self.config.get("discord","boturl") + self.config.get("discord", "devgroup") + self.config.get("discord", "secretwebhook") + + self.config.get("cono", "enable") + return True + except: + return False + + + # Generate a default config.ini + def generateDefaultConfig(self): + """Open and set default keys for that config file""" + + # Open config.ini in write mode + f = open(self.fileName, "w") + + # Set keys to config object + self.config.add_section("db") + self.config.set("db", "host", "localhost") + self.config.set("db", "username", "root") + self.config.set("db", "password", "") + self.config.set("db", "database", "ripple") + self.config.set("db", "workers", "16") + + self.config.add_section("redis") + self.config.set("redis", "host", "localhost") + self.config.set("redis", "port", "6379") + self.config.set("redis", "database", "0") + self.config.set("redis", "password", "") + + self.config.add_section("server") + self.config.set("server", "host", "0.0.0.0") + self.config.set("server", "port", "5002") + self.config.set("server", "debug", "False") + self.config.set("server", "beatmapcacheexpire", "86400") + self.config.set("server", "serverurl", "http://127.0.0.1:5002") + self.config.set("server", "banchourl", "http://127.0.0.1:5001") + self.config.set("server", "threads", "16") + self.config.set("server", "apikey", "changeme") + + self.config.add_section("sentry") + self.config.set("sentry", "enable", "False") + self.config.set("sentry", "dsn", "") + + self.config.add_section("datadog") + self.config.set("datadog", "enable", "False") + self.config.set("datadog", "apikey", "") + self.config.set("datadog", "appkey", "") + + self.config.add_section("osuapi") + self.config.set("osuapi", "enable", "True") + self.config.set("osuapi", "apiurl", "https://osu.ppy.sh") + self.config.set("osuapi", "apikey", "YOUR_OSU_API_KEY_HERE") + + self.config.add_section("cheesegull") + self.config.set("cheesegull", "apiurl", "http://cheesegu.ll/api") + + self.config.add_section("discord") + self.config.set("discord", "enable", "False") + self.config.set("discord", "boturl", "") + self.config.set("discord", "devgroup", "") + self.config.set("discord", "secretwebhook", "") + + self.config.add_section("cono") + self.config.set("cono", "enable", "False") + + # Write ini to file and close + self.config.write(f) + f.close() diff --git a/helpers/consoleHelper.py b/helpers/consoleHelper.py new file mode 100644 index 0000000..1aa7e8c --- /dev/null +++ b/helpers/consoleHelper.py @@ -0,0 +1,99 @@ +"""Some console related functions""" + +from common.constants import bcolors +from objects import glob + + +def printServerStartHeader(asciiArt): + """ + Print server start header with optional ascii art + + asciiArt -- if True, will print ascii art too + """ + + if asciiArt: + printColored(" ( ( ", bcolors.YELLOW) + printColored(" )\\ ) * ) )\\ ) ", bcolors.YELLOW) + printColored("(()/( ( ` ) /((()/( ", bcolors.YELLOW) + printColored(" /(_)) )\\ ( )(_))/(_)) ", bcolors.YELLOW) + printColored("(_)) ((_) (_(_())(_)) ", bcolors.YELLOW) + printColored("| | | __||_ _|/ __| ", bcolors.GREEN) + printColored("| |__ | _| | | \\__ \\ ", bcolors.GREEN) + printColored("|____||___| |_| |___/ \n", bcolors.GREEN) + + printColored("> Welcome to the Latest Essential Tatoe Server v{}".format(glob.VERSION), bcolors.GREEN) + printColored("> Made by the Ripple and Akatsuki teams", bcolors.GREEN) + printColored("> {}https://github.com/cmyui/lets".format(bcolors.UNDERLINE), bcolors.GREEN) + printColored("> Press CTRL+C to exit\n", bcolors.GREEN) + + +def printNoNl(string): + """ + Print string without new line at the end + + string -- string to print + """ + + print(string, end="") + + +def printColored(string, color): + """ + Print colored string + + string -- string to print + color -- see bcolors.py + """ + + print("{}{}{}".format(color, string, bcolors.ENDC)) + + +def printError(): + """Print error text FOR LOADING""" + + printColored("Error", bcolors.RED) + + +def printDone(): + """Print error text FOR LOADING""" + + printColored("Done", bcolors.GREEN) + + +def printWarning(): + """Print error text FOR LOADING""" + + printColored("Warning", bcolors.YELLOW) + +def printGetScoresMessage(message): + printColored("[get_scores] {}".format(message), bcolors.PINK) + +def printSubmitModularMessage(message): + printColored("[submit_modular] {}".format(message), bcolors.YELLOW) + +def printBanchoConnectMessage(message): + printColored("[bancho_connect] {}".format(message), bcolors.YELLOW) + +def printGetReplayMessage(message): + printColored("[get_replay] {}".format(message), bcolors.PINK) + +def printMapsMessage(message): + printColored("[maps] {}".format(message), bcolors.PINK) + +def printRippMessage(message): + printColored("[ripp] {}".format(message), bcolors.GREEN) + +# def printRippoppaiMessage(message): +# printColored("[rippoppai] {}".format(message), bcolors.GREEN) + +def printWifiPianoMessage(message): + printColored("[wifipiano] {}".format(message), bcolors.GREEN) + +def printDebugMessage(message): + printColored("[debug] {}".format(message), bcolors.BLUE) + +def printScreenshotsMessage(message): + printColored("[screenshots] {}".format(message), bcolors.YELLOW) + +def printApiMessage(module, message): + printColored("[{}] {}".format(module, message), bcolors.GREEN) diff --git a/helpers/exceptionsTracker.py b/helpers/exceptionsTracker.py new file mode 100644 index 0000000..9845446 --- /dev/null +++ b/helpers/exceptionsTracker.py @@ -0,0 +1,17 @@ +import sys +import traceback +from functools import wraps + +from common.log import logUtils as log + + +def trackExceptions(moduleName=""): + def _trackExceptions(func): + def _decorator(request, *args, **kwargs): + try: + response = func(request, *args, **kwargs) + return response + except: + log.error("Unknown error{}!\n```\n{}\n{}```".format(" in "+moduleName if moduleName != "" else "", sys.exc_info(), traceback.format_exc()), True) + return wraps(func)(_decorator) + return _trackExceptions diff --git a/helpers/leaderboardHelper.py b/helpers/leaderboardHelper.py new file mode 100644 index 0000000..f5952b3 --- /dev/null +++ b/helpers/leaderboardHelper.py @@ -0,0 +1,131 @@ +from common.log import logUtils as log +from common.ripple import scoreUtils +from objects import glob +from common.ripple import userUtils + +def rxgetRankInfo(userID, gameMode): + """ + Get userID's current rank, user above us and pp/score difference + + :param userID: user + :param gameMode: gameMode number + :return: {"nextUsername": "", "difference": 0, "currentRank": 0} + """ + data = {"nextUsername": "", "difference": 0, "currentRank": 0} + k = "ripple:relaxboard:{}".format(scoreUtils.readableGameMode(gameMode)) + position = userUtils.rxgetGameRank(userID, gameMode) - 1 + log.debug("Our position is {}".format(position)) + if position is not None and position > 0: + aboveUs = glob.redis.zrevrange(k, position - 1, position) + log.debug("{} is above us".format(aboveUs)) + if aboveUs is not None and len(aboveUs) > 0 and aboveUs[0].isdigit(): + # Get our rank, next rank username and pp/score difference + myScore = glob.redis.zscore(k, userID) + otherScore = glob.redis.zscore(k, aboveUs[0]) + nextUsername = userUtils.getUsername(aboveUs[0]) + if nextUsername is not None and myScore is not None and otherScore is not None: + data["nextUsername"] = nextUsername + data["difference"] = int(myScore) - int(otherScore) + else: + position = 0 + + data["currentRank"] = position + 1 + return data + +def getRankInfo(userID, gameMode): + """ + Get userID's current rank, user above us and pp/score difference + + :param userID: user + :param gameMode: gameMode number + :return: {"nextUsername": "", "difference": 0, "currentRank": 0} + """ + data = {"nextUsername": "", "difference": 0, "currentRank": 0} + k = "ripple:leaderboard:{}".format(scoreUtils.readableGameMode(gameMode)) + position = userUtils.getGameRank(userID, gameMode) - 1 + log.debug("Our position is {}".format(position)) + if position is not None and position > 0: + aboveUs = glob.redis.zrevrange(k, position - 1, position) + log.debug("{} is above us".format(aboveUs)) + if aboveUs is not None and len(aboveUs) > 0 and aboveUs[0].isdigit(): + # Get our rank, next rank username and pp/score difference + myScore = glob.redis.zscore(k, userID) + otherScore = glob.redis.zscore(k, aboveUs[0]) + nextUsername = userUtils.getUsername(aboveUs[0]) + if nextUsername is not None and myScore is not None and otherScore is not None: + data["nextUsername"] = nextUsername + data["difference"] = int(myScore) - int(otherScore) + else: + position = 0 + + data["currentRank"] = position + 1 + return data + +def rxupdate(userID, newScore, gameMode): + """ + Update gamemode's leaderboard. + Doesn't do anything if userID is banned/restricted. + + :param userID: user + :param newScore: new score or pp + :param gameMode: gameMode number + """ + if userUtils.isAllowed(userID): + log.debug("Updating relaxboard...") + glob.redis.zadd("ripple:relaxboard:{}".format(scoreUtils.readableGameMode(gameMode)), str(userID), str(newScore)) + else: + log.debug("Relaxboard update for user {} skipped (not allowed)".format(userID)) + +def update(userID, newScore, gameMode): + """ + Update gamemode's leaderboard. + Doesn't do anything if userID is banned/restricted. + + :param userID: user + :param newScore: new score or pp + :param gameMode: gameMode number + """ + if userUtils.isAllowed(userID): + log.debug("Updating leaderboard...") + glob.redis.zadd("ripple:leaderboard:{}".format(scoreUtils.readableGameMode(gameMode)), str(userID), str(newScore)) + else: + log.debug("Leaderboard update for user {} skipped (not allowed)".format(userID)) + +def rxupdateCountry(userID, newScore, gameMode): + """ + Update gamemode's country leaderboard. + Doesn't do anything if userID is banned/restricted. + + :param userID: user, country is determined by the user + :param newScore: new score or pp + :param gameMode: gameMode number + :return: + """ + if userUtils.isAllowed(userID): + country = userUtils.getCountry(userID) + if country is not None and len(country) > 0 and country.lower() != "xx": + log.debug("Updating {} country relaxboard...".format(country)) + k = "ripple:relaxboard:{}:{}".format(scoreUtils.readableGameMode(gameMode), country.lower()) + glob.redis.zadd(k, str(userID), str(newScore)) + else: + log.debug("Country relaxboard update for user {} skipped (not allowed)".format(userID)) + + +def updateCountry(userID, newScore, gameMode): + """ + Update gamemode's country leaderboard. + Doesn't do anything if userID is banned/restricted. + + :param userID: user, country is determined by the user + :param newScore: new score or pp + :param gameMode: gameMode number + :return: + """ + if userUtils.isAllowed(userID): + country = userUtils.getCountry(userID) + if country is not None and len(country) > 0 and country.lower() != "xx": + log.debug("Updating {} country leaderboard...".format(country)) + k = "ripple:leaderboard:{}:{}".format(scoreUtils.readableGameMode(gameMode), country.lower()) + glob.redis.zadd(k, str(userID), str(newScore)) + else: + log.debug("Country leaderboard update for user {} skipped (not allowed)".format(userID)) diff --git a/helpers/levbodHelper.py b/helpers/levbodHelper.py new file mode 100644 index 0000000..03babf7 --- /dev/null +++ b/helpers/levbodHelper.py @@ -0,0 +1,51 @@ +import requests +import json + +from constants import exceptions +from objects import glob + +def levbodRequest(handler, params=None): + if params is None: + params = {} + result = requests.get("{}/{}".format(glob.conf.config["levbod"]["url"], handler), params=params) + + try: + data = json.loads(result.text) + except (json.JSONDecodeError, ValueError, requests.RequestException, KeyError, exceptions.noAPIDataError): + return None + + if result.status_code != 200 or "data" not in data: + return None + + return data["data"] + +def getListing(rankedStatus=4, page=0, gameMode=-1, query=""): + return levbodRequest("listing", { + "mode": gameMode, + "status": rankedStatus, + "query": query, + "page": page, + }) + +def getBeatmapSet(id): + return levbodRequest("beatmapset", { + "id": id + }) + +def getBeatmap(id): + return levbodRequest("beatmap", { + "id": id + }) + +def levbodToDirect(data): + s = "{beatmapset_id}.osz|{artist}|{title}|{creator}|{ranked_status}|10.00|0|{beatmapset_id}|".format(**data) + if len(data["beatmaps"]) > 0: + s += "{}|0|0|0||".format(data["beatmaps"][0]["beatmap_id"]) + for i in data["beatmaps"]: + s += "{difficulty_name}@{game_mode},".format(**i) + s = s.strip(",") + s += "|" + return s + +def levbodToDirectNp(data): + return "{beatmapset_id}.osz|{artist}|{title}|{creator}|{ranked_status}|10.00|0|{beatmapset_id}|{beatmapset_id}|0|0|0|".format(**data) \ No newline at end of file diff --git a/helpers/mapsHelper.py b/helpers/mapsHelper.py new file mode 100644 index 0000000..d3f3895 --- /dev/null +++ b/helpers/mapsHelper.py @@ -0,0 +1,56 @@ +import os + +from common import generalUtils +from common.log import logUtils as log +from constants import exceptions +from helpers import osuapiHelper + +def isBeatmap(fileName=None, content=None): + if fileName is not None: + with open(fileName, "rb") as f: + firstLine = f.readline().decode("utf-8-sig").strip() + elif content is not None: + try: + firstLine = content.decode("utf-8-sig").split("\n")[0].strip() + except IndexError: + return False + else: + raise ValueError("Either `fileName` or `content` must be provided.") + return firstLine.lower().startswith("osu file format v") + +def cacheMap(mapFile, _beatmap): + # Check if we have to download the .osu file + download = False + if not os.path.isfile(mapFile): + # .osu file doesn't exist. We must download it + download = True + else: + # File exists, check md5 + if generalUtils.fileMd5(mapFile) != _beatmap.fileMD5 or not isBeatmap(mapFile): + # MD5 don't match, redownload .osu file + download = True + + # Download .osu file if needed + if download: + log.debug("maps ~> Downloading {} osu file".format(_beatmap.beatmapID)) + + # Get .osu file from osu servers + fileContent = osuapiHelper.getOsuFileFromID(_beatmap.beatmapID) + + # Make sure osu servers returned something + if fileContent is None or not isBeatmap(content=fileContent): + raise exceptions.osuApiFailException("maps") + + # Delete old .osu file if it exists + if os.path.isfile(mapFile): + os.remove(mapFile) + + # Save .osu file + with open(mapFile, "wb+") as f: + f.write(fileContent) + else: + # Map file is already in folder + log.debug("maps ~> Beatmap found in cache!") + +def cachedMapPath(beatmap_id): + return ".data/beatmaps/{}.osu".format(beatmap_id) diff --git a/helpers/osuapiHelper.py b/helpers/osuapiHelper.py new file mode 100644 index 0000000..7a297a1 --- /dev/null +++ b/helpers/osuapiHelper.py @@ -0,0 +1,83 @@ +import json +from urllib.parse import quote + +import requests +from common.log import logUtils as log +from common import generalUtils +from objects import glob +from constants import exceptions + + +def osuApiRequest(request, params, getFirst=True): + """ + Send a request to osu!api. + + request -- request type, string (es: get_beatmaps) + params -- GET parameters, without api key or trailing ?/& (es: h=a5b99395a42bd55bc5eb1d2411cbdf8b&limit=10) + return -- dictionary with json response if success, None if failed or empty response. + """ + # Make sure osuapi is enabled + if not generalUtils.stringToBool(glob.conf.config["osuapi"]["enable"]): + log.warning("osu!api is disabled") + return None + + # Api request + resp = None + try: + finalURL = "{}/api/{}?k={}&{}".format(glob.conf.config["osuapi"]["apiurl"], request, glob.conf.config["osuapi"]["apikey"], params) + log.debug(finalURL) + resp = requests.get(finalURL, timeout=5).text + data = json.loads(resp) + if getFirst: + if len(data) >= 1: + resp = data[0] + else: + resp = None + else: + resp = data + finally: + glob.dog.increment(glob.DATADOG_PREFIX+".osu_api.requests") + log.debug(str(resp).encode("utf-8")) + return resp + +def getOsuFileFromName(fileName): + """ + Send a request to osu! servers to download a .osu file from file name + Used to update beatmaps + + fileName -- .osu file name to download + return -- .osu file content if success, None if failed + """ + # Make sure osuapi is enabled + if not generalUtils.stringToBool(glob.conf.config["osuapi"]["enable"]): + log.warning("osuapi is disabled") + return None + response = None + try: + URL = "{}/web/maps/{}".format(glob.conf.config["osuapi"]["apiurl"], quote(fileName)) + req = requests.get(URL, timeout=20) + req.encoding = "utf-8" + response = req.content + finally: + glob.dog.increment(glob.DATADOG_PREFIX+".osu_api.osu_file_requests") + return response + +def getOsuFileFromID(beatmapID): + """ + Send a request to osu! servers to download a .osu file from beatmap ID + Used to get .osu files for oppai + + beatmapID -- ID of beatmap (not beatmapset) to download + return -- .osu file content if success, None if failed + """ + # Make sure osuapi is enabled + if not generalUtils.stringToBool(glob.conf.config["osuapi"]["enable"]): + log.warning("osuapi is disabled") + return None + response = None + try: + URL = "{}/osu/{}".format(glob.conf.config["osuapi"]["apiurl"], beatmapID) + response = requests.get(URL, timeout=20).content + finally: + glob.dog.increment(glob.DATADOG_PREFIX+".osu_api.osu_file_requests") + return response \ No newline at end of file diff --git a/helpers/replayHelper.py b/helpers/replayHelper.py new file mode 100644 index 0000000..d033964 --- /dev/null +++ b/helpers/replayHelper.py @@ -0,0 +1,134 @@ +import os + +from common import generalUtils +from constants import exceptions, dataTypes +from helpers import binaryHelper +from objects import glob + +def rxbuildFullReplay(scoreID=None, scoreData=None, rawReplay=None): + if all(v is None for v in (scoreID, scoreData)) or all(v is not None for v in (scoreID, scoreData)): + raise AttributeError("Either scoreID or scoreData must be provided, not neither or both") + + if scoreData is None: + scoreData = glob.db.fetch( + "SELECT scores_relax.*, users.username FROM scores_relax LEFT JOIN users ON scores_relax.userid = users.id " + "WHERE scores_relax.id = %s", + [scoreID] + ) + else: + scoreID = scoreData["id"] + if scoreData is None or scoreID is None: + raise exceptions.scoreNotFoundError() + + if rawReplay is None: + # Make sure raw replay exists + fileName = ".data/replays/replay_{}.osr".format(scoreID) + if not os.path.isfile(fileName): + raise FileNotFoundError() + + # Read raw replay + with open(fileName, "rb") as f: + rawReplay = f.read() + + # Calculate missing replay data + rank = generalUtils.getRank(int(scoreData["play_mode"]), int(scoreData["mods"]), int(scoreData["accuracy"]), + int(scoreData["300_count"]), int(scoreData["100_count"]), int(scoreData["50_count"]), + int(scoreData["misses_count"])) + magicHash = generalUtils.stringMd5( + "{}p{}o{}o{}t{}a{}r{}e{}y{}o{}u{}{}{}".format(int(scoreData["100_count"]) + int(scoreData["300_count"]), + scoreData["50_count"], scoreData["gekis_count"], + scoreData["katus_count"], scoreData["misses_count"], + scoreData["beatmap_md5"], scoreData["max_combo"], + "True" if int(scoreData["full_combo"]) == 1 else "False", + scoreData["username"], scoreData["score"], rank, + scoreData["mods"], "True")) + # Add headers (convert to full replay) + fullReplay = binaryHelper.binaryWrite([ + [scoreData["play_mode"], dataTypes.byte], + [20150414, dataTypes.uInt32], + [scoreData["beatmap_md5"], dataTypes.string], + [scoreData["username"], dataTypes.string], + [magicHash, dataTypes.string], + [scoreData["300_count"], dataTypes.uInt16], + [scoreData["100_count"], dataTypes.uInt16], + [scoreData["50_count"], dataTypes.uInt16], + [scoreData["gekis_count"], dataTypes.uInt16], + [scoreData["katus_count"], dataTypes.uInt16], + [scoreData["misses_count"], dataTypes.uInt16], + [scoreData["score"], dataTypes.uInt32], + [scoreData["max_combo"], dataTypes.uInt16], + [scoreData["full_combo"], dataTypes.byte], + [scoreData["mods"], dataTypes.uInt32], + [0, dataTypes.byte], + [0, dataTypes.uInt64], + [rawReplay, dataTypes.rawReplay], + [0, dataTypes.uInt32], + [0, dataTypes.uInt32], + ]) + + # Return full replay + return fullReplay + +def buildFullReplay(scoreID=None, scoreData=None, rawReplay=None): + if all(v is None for v in (scoreID, scoreData)) or all(v is not None for v in (scoreID, scoreData)): + raise AttributeError("Either scoreID or scoreData must be provided, not neither or both") + + if scoreData is None: + scoreData = glob.db.fetch( + "SELECT scores.*, users.username FROM scores LEFT JOIN users ON scores.userid = users.id " + "WHERE scores.id = %s", + [scoreID] + ) + else: + scoreID = scoreData["id"] + if scoreData is None or scoreID is None: + raise exceptions.scoreNotFoundError() + + if rawReplay is None: + # Make sure raw replay exists + fileName = ".data/replays/replay_{}.osr".format(scoreID) + if not os.path.isfile(fileName): + raise FileNotFoundError() + + # Read raw replay + with open(fileName, "rb") as f: + rawReplay = f.read() + + # Calculate missing replay data + rank = generalUtils.getRank(int(scoreData["play_mode"]), int(scoreData["mods"]), int(scoreData["accuracy"]), + int(scoreData["300_count"]), int(scoreData["100_count"]), int(scoreData["50_count"]), + int(scoreData["misses_count"])) + magicHash = generalUtils.stringMd5( + "{}p{}o{}o{}t{}a{}r{}e{}y{}o{}u{}{}{}".format(int(scoreData["100_count"]) + int(scoreData["300_count"]), + scoreData["50_count"], scoreData["gekis_count"], + scoreData["katus_count"], scoreData["misses_count"], + scoreData["beatmap_md5"], scoreData["max_combo"], + "True" if int(scoreData["full_combo"]) == 1 else "False", + scoreData["username"], scoreData["score"], rank, + scoreData["mods"], "True")) + # Add headers (convert to full replay) + fullReplay = binaryHelper.binaryWrite([ + [scoreData["play_mode"], dataTypes.byte], + [20150414, dataTypes.uInt32], + [scoreData["beatmap_md5"], dataTypes.string], + [scoreData["username"], dataTypes.string], + [magicHash, dataTypes.string], + [scoreData["300_count"], dataTypes.uInt16], + [scoreData["100_count"], dataTypes.uInt16], + [scoreData["50_count"], dataTypes.uInt16], + [scoreData["gekis_count"], dataTypes.uInt16], + [scoreData["katus_count"], dataTypes.uInt16], + [scoreData["misses_count"], dataTypes.uInt16], + [scoreData["score"], dataTypes.uInt32], + [scoreData["max_combo"], dataTypes.uInt16], + [scoreData["full_combo"], dataTypes.byte], + [scoreData["mods"], dataTypes.uInt32], + [0, dataTypes.byte], + [0, dataTypes.uInt64], + [rawReplay, dataTypes.rawReplay], + [0, dataTypes.uInt32], + [0, dataTypes.uInt32], + ]) + + # Return full replay + return fullReplay \ No newline at end of file diff --git a/lets.py b/lets.py new file mode 100644 index 0000000..0301ec7 --- /dev/null +++ b/lets.py @@ -0,0 +1,243 @@ +# General imports +import os +import sys +from multiprocessing.pool import ThreadPool + +import tornado.gen +import tornado.httpserver +import tornado.ioloop +import tornado.web +from raven.contrib.tornado import AsyncSentryClient +import redis + +from common.constants import bcolors +from common.db import dbConnector +from common.ddog import datadogClient +from common.log import logUtils as log +from common.redis import pubSub +from common.web import schiavo +from handlers import apiCacheBeatmapHandler +from handlers import apiPPHandler +from handlers import apiStatusHandler +from handlers import banchoConnectHandler +from handlers import checkUpdatesHandler +from handlers import defaultHandler +from handlers import downloadMapHandler +from handlers import emptyHandler +from handlers import getFullReplayHandler +from handlers import getReplayHandler +from handlers import getScoresHandler +from handlers import getScreenshotHandler +from handlers import loadTestHandler +from handlers import mapsHandler +from handlers import osuErrorHandler +from handlers import osuSearchHandler +from handlers import osuSearchSetHandler +from handlers import redirectHandler +from handlers import submitModularHandler +from handlers import uploadScreenshotHandler +from handlers import commentHandler +from helpers import config +from helpers import consoleHelper +from common import generalUtils +from common import agpl +from objects import glob +from pubSubHandlers import beatmapUpdateHandler + + +def make_app(): + return tornado.web.Application([ + (r"/web/bancho_connect.php", banchoConnectHandler.handler), + (r"/web/osu-osz2-getscores.php", getScoresHandler.handler), + (r"/web/osu-submit-modular.php", submitModularHandler.handler), + (r"/web/osu-getreplay.php", getReplayHandler.handler), + (r"/web/osu-screenshot.php", uploadScreenshotHandler.handler), + (r"/web/osu-search.php", osuSearchHandler.handler), + (r"/web/osu-search-set.php", osuSearchSetHandler.handler), + (r"/web/check-updates.php", checkUpdatesHandler.handler), + (r"/web/osu-error.php", osuErrorHandler.handler), + (r"/web/osu-comment.php", commentHandler.handler), + (r"/ss/(.*)", getScreenshotHandler.handler), + (r"/web/maps/(.*)", mapsHandler.handler), + (r"/d/(.*)", downloadMapHandler.handler), + (r"/s/(.*)", downloadMapHandler.handler), + (r"/web/replays/(.*)", getFullReplayHandler.handler), + + (r"/p/verify", redirectHandler.handler, dict(destination="https://akatsuki.pw/index.php?p=2")), + (r"/u/(.*)", redirectHandler.handler, dict(destination="https://akatsuki.pw/u/{}")), + + (r"/api/v1/status", apiStatusHandler.handler), + (r"/api/v1/pp", apiPPHandler.handler), + (r"/api/v1/cacheBeatmap", apiCacheBeatmapHandler.handler), + + (r"/letsapi/v1/status", apiStatusHandler.handler), + (r"/letsapi/v1/pp", apiPPHandler.handler), + (r"/letsapi/v1/cacheBeatmap", apiCacheBeatmapHandler.handler), + + # Not done yet + (r"/web/lastfm.php", emptyHandler.handler), + (r"/web/osu-rate.php", emptyHandler.handler), + (r"/web/osu-comment.php", emptyHandler.handler), + (r"/web/osu-checktweets.php", emptyHandler.handler), + + (r"/loadTest", loadTestHandler.handler), + ], default_handler_class=defaultHandler.handler) + + +if __name__ == "__main__": + # AGPL license agreement + try: + agpl.check_license("ripple", "LETS") + except agpl.LicenseError as e: + print(str(e)) + sys.exit(1) + + try: + consoleHelper.printServerStartHeader(True) + + # Read config + consoleHelper.printNoNl("> Reading config file... ") + glob.conf = config.config("config.ini") + + if glob.conf.default: + # We have generated a default config.ini, quit server + consoleHelper.printWarning() + consoleHelper.printColored("[!] config.ini not found. A default one has been generated.", bcolors.YELLOW) + consoleHelper.printColored("[!] Please edit your config.ini and run the server again.", bcolors.YELLOW) + sys.exit() + + # If we haven't generated a default config.ini, check if it's valid + if not glob.conf.checkConfig(): + consoleHelper.printError() + consoleHelper.printColored("[!] Invalid config.ini. Please configure it properly", bcolors.RED) + consoleHelper.printColored("[!] Delete your config.ini to generate a default one", bcolors.RED) + sys.exit() + else: + consoleHelper.printDone() + + # Create data/oppai maps folder if needed + consoleHelper.printNoNl("> Checking folders... ") + paths = [ + ".data", + ".data/replays", + ".data/screenshots", + ".data/oppai", + ".data/catch_the_pp", + ".data/beatmaps" + ] + for i in paths: + if not os.path.exists(i): + os.makedirs(i, 0o770) + consoleHelper.printDone() + + # Connect to db + try: + consoleHelper.printNoNl("> Connecting to MySQL database... ") + glob.db = dbConnector.db(glob.conf.config["db"]["host"], glob.conf.config["db"]["username"], glob.conf.config["db"]["password"], glob.conf.config["db"]["database"], int( + glob.conf.config["db"]["workers"])) + consoleHelper.printNoNl(" ") + consoleHelper.printDone() + except: + # Exception while connecting to db + consoleHelper.printError() + consoleHelper.printColored("[!] Error while connection to database. Please check your config.ini and run the server again", bcolors.RED) + raise + + # Connect to redis + try: + consoleHelper.printNoNl("> Connecting to redis... ") + glob.redis = redis.Redis(glob.conf.config["redis"]["host"], glob.conf.config["redis"]["port"], glob.conf.config["redis"]["database"], glob.conf.config["redis"]["password"]) + glob.redis.ping() + consoleHelper.printNoNl(" ") + consoleHelper.printDone() + except: + # Exception while connecting to db + consoleHelper.printError() + consoleHelper.printColored("[!] Error while connection to redis. Please check your config.ini and run the server again", bcolors.RED) + raise + + # Empty redis cache + try: + glob.redis.eval("return redis.call('del', unpack(redis.call('keys', ARGV[1])))", 0, "lets:*") + except redis.exceptions.ResponseError: + # Script returns error if there are no keys starting with peppy:* + pass + + # Save lets version in redis + glob.redis.set("lets:version", glob.VERSION) + + # Create threads pool + try: + consoleHelper.printNoNl("> Creating threads pool... ") + glob.pool = ThreadPool(int(glob.conf.config["server"]["threads"])) + consoleHelper.printDone() + except: + consoleHelper.printError() + consoleHelper.printColored("[!] Error while creating threads pool. Please check your config.ini and run the server again", bcolors.RED) + + # Check osuapi + if not generalUtils.stringToBool(glob.conf.config["osuapi"]["enable"]): + consoleHelper.printColored("[!] osu!api features are disabled. If you don't have a valid beatmaps table, all beatmaps will show as unranked", bcolors.YELLOW) + if int(glob.conf.config["server"]["beatmapcacheexpire"]) > 0: + consoleHelper.printColored("[!] IMPORTANT! Your beatmapcacheexpire in config.ini is > 0 and osu!api features are disabled.\nWe do not reccoment this, because too old beatmaps will be shown as unranked.\nSet beatmapcacheexpire to 0 to disable beatmap latest update check and fix that issue.", bcolors.YELLOW) + + # Set achievements version + glob.redis.set("lets:achievements_version", glob.ACHIEVEMENTS_VERSION) + consoleHelper.printColored("Achievements version is {}".format(glob.ACHIEVEMENTS_VERSION), bcolors.YELLOW) + + # Discord + if generalUtils.stringToBool(glob.conf.config["discord"]["enable"]): + glob.schiavo = schiavo.schiavo(glob.conf.config["discord"]["boturl"], "**lets**") + else: + consoleHelper.printColored("[!] Warning! Discord logging is disabled!", bcolors.YELLOW) + + # Check debug mods + glob.debug = generalUtils.stringToBool(glob.conf.config["server"]["debug"]) + if glob.debug: + consoleHelper.printColored("[!] Warning! Server running in debug mode!", bcolors.YELLOW) + + # Server port + try: + serverPort = int(glob.conf.config["server"]["port"]) + except: + consoleHelper.printColored("[!] Invalid server port! Please check your config.ini and run the server again", bcolors.RED) + + # Make app + glob.application = make_app() + + # Set up sentry + try: + glob.sentry = generalUtils.stringToBool(glob.conf.config["sentry"]["enable"]) + if glob.sentry: + glob.application.sentry_client = AsyncSentryClient(glob.conf.config["sentry"]["dsn"], release=glob.VERSION) + else: + consoleHelper.printColored("[!] Warning! Sentry logging is disabled!", bcolors.YELLOW) + except: + consoleHelper.printColored("[!] Error while starting Sentry client! Please check your config.ini and run the server again", bcolors.RED) + + # Set up Datadog + try: + if generalUtils.stringToBool(glob.conf.config["datadog"]["enable"]): + glob.dog = datadogClient.datadogClient(glob.conf.config["datadog"]["apikey"], glob.conf.config["datadog"]["appkey"]) + else: + consoleHelper.printColored("[!] Warning! Datadog stats tracking is disabled!", bcolors.YELLOW) + except: + consoleHelper.printColored("[!] Error while starting Datadog client! Please check your config.ini and run the server again", bcolors.RED) + + # Connect to pubsub channels + pubSub.listener(glob.redis, { + "lets:beatmap_updates": beatmapUpdateHandler.handler(), + }).start() + + # Server start message and console output + consoleHelper.printColored("> L.E.T.S. is listening for clients on {}:{}...".format(glob.conf.config["server"]["host"], serverPort), bcolors.GREEN) + log.logMessage("Server started!", discord="bunker", of="info.txt", stdout=False) + + # Start Tornado + glob.application.listen(serverPort, address=glob.conf.config["server"]["host"]) + tornado.ioloop.IOLoop.instance().start() + finally: + # Perform some clean up + print("> Disposing server... ") + glob.fileBuffers.flushAll() + consoleHelper.printColored("Goodbye!", bcolors.GREEN) diff --git a/objects/__init__.py b/objects/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/objects/beatmap.pyx b/objects/beatmap.pyx new file mode 100644 index 0000000..f28ae0c --- /dev/null +++ b/objects/beatmap.pyx @@ -0,0 +1,340 @@ +import time + +from common.log import logUtils as log +from constants import rankedStatuses +from helpers import osuapiHelper +from objects import glob + + +class beatmap: + __slots__ = ["songName", "fileMD5", "rankedStatus", "rankedStatusFrozen", "beatmapID", "beatmapSetID", "offset", + "rating", "starsStd", "starsTaiko", "starsCtb", "starsMania", "AR", "OD", "maxCombo", "hitLength", + "bpm", "playcount" ,"passcount", "refresh"] + + def __init__(self, md5 = None, beatmapSetID = None, gameMode = 0, refresh=False): + """ + Initialize a beatmap object. + + md5 -- beatmap md5. Optional. + beatmapSetID -- beatmapSetID. Optional. + """ + self.songName = "" + self.fileMD5 = "" + self.rankedStatus = rankedStatuses.NOT_SUBMITTED + self.rankedStatusFrozen = 0 + self.beatmapID = 0 + self.beatmapSetID = 0 + self.offset = 0 # Won't implement + self.rating = 10.0 # Won't implement + + self.starsStd = 0.0 # stars for converted + self.starsTaiko = 0.0 # stars for converted + self.starsCtb = 0.0 # stars for converted + self.starsMania = 0.0 # stars for converted + self.AR = 0.0 + self.OD = 0.0 + self.maxCombo = 0 + self.hitLength = 0 + self.bpm = 0 + + # Statistics for ranking panel + self.playcount = 0 + + # Force refresh from osu api + self.refresh = refresh + + if md5 is not None and beatmapSetID is not None: + self.setData(md5, beatmapSetID) + + def addBeatmapToDB(self): + """ + Add current beatmap data in db if not in yet + """ + # Make sure the beatmap is not already in db + bdata = glob.db.fetch("SELECT id, ranked_status_freezed, ranked FROM beatmaps WHERE beatmap_md5 = %s OR beatmap_id = %s LIMIT 1", [self.fileMD5, self.beatmapID]) + if bdata is not None: + # This beatmap is already in db, remove old record + # Get current frozen status + frozen = bdata["ranked_status_freezed"] + if frozen == 1: + self.rankedStatus = bdata["ranked"] + log.debug("Deleting old beatmap data ({})".format(bdata["id"])) + glob.db.execute("DELETE FROM beatmaps WHERE id = %s LIMIT 1", [bdata["id"]]) + else: + # Unfreeze beatmap status + frozen = 0 + + # Add new beatmap data + log.debug("Saving beatmap data in db...") + glob.db.execute("INSERT INTO `beatmaps` (`id`, `beatmap_id`, `beatmapset_id`, `beatmap_md5`, `song_name`, `ar`, `od`, `difficulty_std`, `difficulty_taiko`, `difficulty_ctb`, `difficulty_mania`, `max_combo`, `hit_length`, `bpm`, `ranked`, `latest_update`, `ranked_status_freezed`) VALUES (NULL, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);", [ + self.beatmapID, + self.beatmapSetID, + self.fileMD5, + self.songName.encode("utf-8", "ignore").decode("utf-8"), + self.AR, + self.OD, + self.starsStd, + self.starsTaiko, + self.starsCtb, + self.starsMania, + self.maxCombo, + self.hitLength, + self.bpm, + self.rankedStatus if frozen == 0 else 2, + int(time.time()), + frozen + ]) + + def setDataFromDB(self, md5): + """ + Set this object's beatmap data from db. + + md5 -- beatmap md5 + return -- True if set, False if not set + """ + # Get data from DB + data = glob.db.fetch("SELECT * FROM beatmaps WHERE beatmap_md5 = %s LIMIT 1", [md5]) + + # Make sure the query returned something + if data is None: + return False + + # Make sure the beatmap is not an old one + if data["difficulty_taiko"] == 0 and data["difficulty_ctb"] == 0 and data["difficulty_mania"] == 0: + log.debug("Difficulty for non-std gamemodes not found in DB, refreshing data from osu!api...") + return False + + # Set cached data period + expire = int(glob.conf.config["server"]["beatmapcacheexpire"]) + + # If the beatmap is ranked, we don't need to refresh data from osu!api that often + if data["ranked"] >= rankedStatuses.RANKED and data["ranked_status_freezed"] == 0: + expire *= 3 + + # Make sure the beatmap data in db is not too old + if int(expire) > 0 and time.time() > data["latest_update"]+int(expire): + if data["ranked_status_freezed"] == 1: + self.setDataFromDict(data) + return False + + # Data in DB, set beatmap data + log.debug("Got beatmap data from db") + self.setDataFromDict(data) + return True + + def setDataFromDict(self, data): + """ + Set this object's beatmap data from data dictionary. + + data -- data dictionary + return -- True if set, False if not set + """ + self.songName = data["song_name"] + self.fileMD5 = data["beatmap_md5"] + self.rankedStatus = int(data["ranked"]) + self.rankedStatusFrozen = int(data["ranked_status_freezed"]) + self.beatmapID = int(data["beatmap_id"]) + self.beatmapSetID = int(data["beatmapset_id"]) + self.AR = float(data["ar"]) + self.OD = float(data["od"]) + self.starsStd = float(data["difficulty_std"]) + self.starsTaiko = float(data["difficulty_taiko"]) + self.starsCtb = float(data["difficulty_ctb"]) + self.starsMania = float(data["difficulty_mania"]) + self.maxCombo = int(data["max_combo"]) + self.hitLength = int(data["hit_length"]) + self.bpm = int(data["bpm"]) + # Ranking panel statistics + self.playcount = int(data["playcount"]) if "playcount" in data else 0 + self.passcount = int(data["passcount"]) if "passcount" in data else 0 + + def setDataFromOsuApi(self, md5, beatmapSetID): + """ + Set this object's beatmap data from osu!api. + + md5 -- beatmap md5 + beatmapSetID -- beatmap set ID, used to check if a map is outdated + return -- True if set, False if not set + """ + # Check if osuapi is enabled + mainData = None + dataStd = osuapiHelper.osuApiRequest("get_beatmaps", "h={}&a=1&m=0".format(md5)) + dataTaiko = osuapiHelper.osuApiRequest("get_beatmaps", "h={}&a=1&m=1".format(md5)) + dataCtb = osuapiHelper.osuApiRequest("get_beatmaps", "h={}&a=1&m=2".format(md5)) + dataMania = osuapiHelper.osuApiRequest("get_beatmaps", "h={}&a=1&m=3".format(md5)) + if dataStd is not None: + mainData = dataStd + elif dataTaiko is not None: + mainData = dataTaiko + elif dataCtb is not None: + mainData = dataCtb + elif dataMania is not None: + mainData = dataMania + + # If the beatmap is frozen and still valid from osu!api, return True so we don't overwrite anything + if mainData is not None and self.rankedStatusFrozen == 1: + return True + + # Can't fint beatmap by MD5. The beatmap has been updated. Check with beatmap set ID + if mainData is None: + log.debug("osu!api data is None") + dataStd = osuapiHelper.osuApiRequest("get_beatmaps", "s={}&a=1&m=0".format(beatmapSetID)) + dataTaiko = osuapiHelper.osuApiRequest("get_beatmaps", "s={}&a=1&m=1".format(beatmapSetID)) + dataCtb = osuapiHelper.osuApiRequest("get_beatmaps", "s={}&a=1&m=2".format(beatmapSetID)) + dataMania = osuapiHelper.osuApiRequest("get_beatmaps", "s={}&a=1&m=3".format(beatmapSetID)) + if dataStd is not None: + mainData = dataStd + elif dataTaiko is not None: + mainData = dataTaiko + elif dataCtb is not None: + mainData = dataCtb + elif dataMania is not None: + mainData = dataMania + + if mainData is None: + # Still no data, beatmap is not submitted + return False + else: + # We have some data, but md5 doesn't match. Beatmap is outdated + self.rankedStatus = rankedStatuses.NEED_UPDATE + return True + + + # We have data from osu!api, set beatmap data + log.debug("Got beatmap data from osu!api") + self.songName = "{} - {} [{}]".format(mainData["artist"], mainData["title"], mainData["version"]) + self.fileMD5 = md5 + self.rankedStatus = convertRankedStatus(int(mainData["approved"])) + self.beatmapID = int(mainData["beatmap_id"]) + self.beatmapSetID = int(mainData["beatmapset_id"]) + self.AR = float(mainData["diff_approach"]) + self.OD = float(mainData["diff_overall"]) + + # Determine stars for every mode + self.starsStd = 0.0 + self.starsTaiko = 0.0 + self.starsCtb = 0.0 + self.starsMania = 0.0 + if dataStd is not None: + self.starsStd = float(dataStd["difficultyrating"]) + if dataTaiko is not None: + self.starsTaiko = float(dataTaiko["difficultyrating"]) + if dataCtb is not None: + self.starsCtb = float(dataCtb["difficultyrating"]) + if dataMania is not None: + self.starsMania = float(dataMania["difficultyrating"]) + + self.maxCombo = int(mainData["max_combo"]) if mainData["max_combo"] is not None else 0 + self.hitLength = int(mainData["hit_length"]) + if mainData["bpm"] is not None: + self.bpm = int(float(mainData["bpm"])) + else: + self.bpm = -1 + return True + + def setData(self, md5, beatmapSetID): + """ + Set this object's beatmap data from highest level possible. + + md5 -- beatmap MD5 + beatmapSetID -- beatmap set ID + """ + # Get beatmap from db + dbResult = self.setDataFromDB(md5) + + # Force refresh from osu api. + # We get data before to keep frozen maps ranked + # if they haven't been updated + if dbResult and self.refresh: + dbResult = False + + if not dbResult: + log.debug("Beatmap not found in db") + # If this beatmap is not in db, get it from osu!api + apiResult = self.setDataFromOsuApi(md5, beatmapSetID) + if not apiResult: + # If it's not even in osu!api, this beatmap is not submitted + self.rankedStatus = rankedStatuses.NOT_SUBMITTED + elif self.rankedStatus != rankedStatuses.NOT_SUBMITTED and self.rankedStatus != rankedStatuses.NEED_UPDATE: + # We get beatmap data from osu!api, save it in db + self.addBeatmapToDB() + else: + log.debug("Beatmap found in db") + + log.debug("{}\n{}\n{}\n{}".format(self.starsStd, self.starsTaiko, self.starsCtb, self.starsMania)) + + def getData(self, totalScores=0, version=4): + """ + Return this beatmap's data (header) for getscores + + return -- beatmap header for getscores + """ + # Fix loved maps for old clients + if version < 4 and self.rankedStatus == rankedStatuses.LOVED: + rankedStatusOutput = rankedStatuses.QUALIFIED + else: + rankedStatusOutput = self.rankedStatus + data = "{}|false".format(rankedStatusOutput) + if self.rankedStatus != rankedStatuses.NOT_SUBMITTED and self.rankedStatus != rankedStatuses.NEED_UPDATE and self.rankedStatus != rankedStatuses.UNKNOWN: + # If the beatmap is updated and exists, the client needs more data + data += "|{}|{}|{}\n{}\n{}\n{}\n".format(self.beatmapID, self.beatmapSetID, totalScores, self.offset, self.songName, self.rating) + + # Return the header + return data + + def getCachedTillerinoPP(self): + """ + Returned cached pp values for 100, 99, 98 and 95 acc nomod + (used ONLY with Tillerino, pp is always calculated with oppai when submitting scores) + + return -- list with pp values. [0,0,0,0] if not cached. + """ + data = glob.db.fetch("SELECT pp_100, pp_99, pp_98, pp_95 FROM beatmaps WHERE beatmap_md5 = %s LIMIT 1", [self.fileMD5]) + if data is None: + return [0,0,0,0] + return [data["pp_100"], data["pp_99"], data["pp_98"], data["pp_95"]] + + def saveCachedTillerinoPP(self, l): + """ + Save cached pp for tillerino + + l -- list with 4 default pp values ([100,99,98,95]) + """ + glob.db.execute("UPDATE beatmaps SET pp_100 = %s, pp_99 = %s, pp_98 = %s, pp_95 = %s WHERE beatmap_md5 = %s", [l[0], l[1], l[2], l[3], self.fileMD5]) + + @property + def is_rankable(self): + return self.rankedStatus >= rankedStatuses.RANKED and self.rankedStatus != rankedStatuses.UNKNOWN + +def convertRankedStatus(approvedStatus): + """ + Convert approved_status (from osu!api) to ranked status (for getscores) + + approvedStatus -- approved status, from osu!api + return -- rankedStatus for getscores + """ + + approvedStatus = int(approvedStatus) + if approvedStatus <= 0: + return rankedStatuses.PENDING + elif approvedStatus == 1: + return rankedStatuses.RANKED + elif approvedStatus == 2: + return rankedStatuses.APPROVED + elif approvedStatus == 3: + return rankedStatuses.QUALIFIED + elif approvedStatus == 4: + return rankedStatuses.LOVED + else: + return rankedStatuses.UNKNOWN + +def incrementPlaycount(md5, passed): + """ + Increment playcount (and passcount) for a beatmap + + md5 -- beatmap md5 + passed -- if True, increment passcount too + """ + glob.db.execute("UPDATE beatmaps SET playcount = playcount+1 WHERE beatmap_md5 = %s LIMIT 1", [md5]) + if passed: + glob.db.execute("UPDATE beatmaps SET passcount = passcount+1 WHERE beatmap_md5 = %s LIMIT 1", [md5]) \ No newline at end of file diff --git a/objects/glob.py b/objects/glob.py new file mode 100644 index 0000000..b7bf1b2 --- /dev/null +++ b/objects/glob.py @@ -0,0 +1,34 @@ +import personalBestCache +import userStatsCache +from common.ddog import datadogClient +from common.files import fileBuffer, fileLocks +from common.web import schiavo + +try: + with open("version") as f: + VERSION = f.read().strip() +except: + VERSION = "Unknown" +ACHIEVEMENTS_VERSION = 1 + +DATADOG_PREFIX = "lets" +BOT_NAME = "Charlotte" +db = None +redis = None +conf = None +application = None +pool = None +pascoa = {} + +busyThreads = 0 +debug = False +sentry = False + +# Cache and objects +fLocks = fileLocks.fileLocks() +userStatsCache = userStatsCache.userStatsCache() +personalBestCache = personalBestCache.personalBestCache() +fileBuffers = fileBuffer.buffersList() +dog = datadogClient.datadogClient() +schiavo = schiavo.schiavo() +achievementClasses = {} \ No newline at end of file diff --git a/objects/relaxboard.pyx b/objects/relaxboard.pyx new file mode 100644 index 0000000..54d06bd --- /dev/null +++ b/objects/relaxboard.pyx @@ -0,0 +1,241 @@ +from objects import rxscore +from common.ripple import userUtils +from constants import rankedStatuses +from common.constants import mods as modsEnum +from common.constants import privileges +from objects import glob + + +class scoreboard: + def __init__(self, username, gameMode, beatmap, setScores = True, country = False, friends = False, mods = -1): + """ + Initialize a leaderboard object + + username -- username of who's requesting the scoreboard. None if not known + gameMode -- requested gameMode + beatmap -- beatmap objecy relative to this leaderboard + setScores -- if True, will get personal/top 50 scores automatically. Optional. Default: True + """ + self.scores = [] # list containing all top 50 scores objects. First object is personal best + self.totalScores = 0 + self.personalBestRank = -1 # our personal best rank, -1 if not found yet + self.username = username # username of who's requesting the scoreboard. None if not known + self.userID = userUtils.getID(self.username) # username's userID + self.gameMode = gameMode # requested gameMode + self.beatmap = beatmap # beatmap objecy relative to this leaderboard + self.country = country + self.friends = friends + self.mods = mods + if setScores: + self.setScores() + + def setScores(self): + """ + Set scores list + """ + + isPremium = userUtils.getPrivileges(self.userID) & privileges.USER_PREMIUM + + def buildQuery(params): + return "{select} {joins} {country} {mods} {friends} {order} {limit}".format(**params) + # Reset score list + self.scores = [] + self.scores.append(-1) + + # Make sure the beatmap is ranked + if self.beatmap.rankedStatus < rankedStatuses.RANKED: + return + + # Query parts + cdef str select = "" + cdef str joins = "" + cdef str country = "" + cdef str mods = "" + cdef str friends = "" + cdef str order = "" + cdef str limit = "" + + # Find personal best score + if self.userID != 0: + # Query parts + select = "SELECT id FROM scores_relax WHERE userid = %(userid)s AND beatmap_md5 = %(md5)s AND play_mode = %(mode)s AND completed = 3" + + # Mods + if self.mods > -1: + mods = "AND mods = %(mods)s" + + # Friends ranking + if self.friends: + friends = "AND (scores_relax.userid IN (SELECT user2 FROM users_relationships WHERE user1 = %(userid)s) OR scores_relax.userid = %(userid)s)" + else: + friends = "" + + # Sort and limit at the end + order = "ORDER BY pp DESC" + limit = "LIMIT 1" + + # Build query, get params and run query + query = buildQuery(locals()) + params = {"userid": self.userID, "md5": self.beatmap.fileMD5, "mode": self.gameMode, "mods": self.mods} + personalBestScore = glob.db.fetch(query, params) + else: + personalBestScore = None + + # Output our personal best if found + if personalBestScore is not None: + s = rxscore.score(personalBestScore["id"]) + self.scores[0] = s + else: + # No personal best + self.scores[0] = -1 + + # Get top 50 scores + select = "SELECT *" + joins = "FROM scores_relax STRAIGHT_JOIN users ON scores_relax.userid = users.id STRAIGHT_JOIN users_stats ON users.id = users_stats.id WHERE scores_relax.beatmap_md5 = %(beatmap_md5)s AND scores_relax.play_mode = %(play_mode)s AND scores_relax.completed = 3 AND (users.privileges & 1 > 0 OR users.id = %(userid)s)" + + # Country ranking + if self.country: + """ Honestly this is more of a preference thing than something that should be premium only? + if isPremium: + country = "AND user_clans.clan = (SELECT clan FROM user_clans WHERE user = %(userid)s LIMIT 1)" + else: + """ + country = "AND users_stats.country = (SELECT country FROM users_stats WHERE id = %(userid)s LIMIT 1)" + else: + country = "" + + # Mods ranking (ignore auto, since we use it for pp sorting) + if self.mods > -1: + mods = "AND scores_relax.mods = %(mods)s" + else: + mods = "" + + # Friends ranking + if self.friends: + friends = "AND (scores_relax.userid IN (SELECT user2 FROM users_relationships WHERE user1 = %(userid)s) OR scores_relax.userid = %(userid)s)" + else: + friends = "" + + order = "ORDER BY pp DESC" + + if isPremium: # Premium members can see up to 100 scores on leaderboards + limit = "LIMIT 100" + else: + limit = "LIMIT 50" + + # Build query, get params and run query + query = buildQuery(locals()) + params = {"beatmap_md5": self.beatmap.fileMD5, "play_mode": self.gameMode, "userid": self.userID, "mods": self.mods} + topScores = glob.db.fetchAll(query, params) + + # Set data for all scores + cdef int c = 1 + cdef dict topScore + if topScores is not None: + for topScore in topScores: + # Create score object + s = rxscore.score(topScore["id"], setData=False) + + # Set data and rank from topScores's row + s.setDataFromDict(topScore) + s.setRank(c) + + # Check if this top 50 score is our personal best + if s.playerName == self.username: + self.personalBestRank = c + + # Add this score to scores list and increment rank + self.scores.append(s) + c+=1 + + '''# If we have more than 50 scores, run query to get scores count + if c >= 50: + # Count all scores on this map + select = "SELECT COUNT(*) AS count" + limit = "LIMIT 1" + + # Build query, get params and run query + query = buildQuery(locals()) + count = glob.db.fetch(query, params) + if count == None: + self.totalScores = 0 + else: + self.totalScores = count["count"] + else: + self.totalScores = c-1''' + + # If personal best score was not in top 50, try to get it from cache + if personalBestScore is not None and self.personalBestRank < 1: + self.personalBestRank = glob.personalBestCache.get(self.userID, self.beatmap.fileMD5, self.country, self.friends, self.mods) + + # It's not even in cache, get it from db + if personalBestScore is not None and self.personalBestRank < 1: + self.setPersonalBest() + + # Cache our personal best rank so we can eventually use it later as + # before personal best rank" in submit modular when building ranking panel + if self.personalBestRank >= 1: + glob.personalBestCache.set(self.userID, self.personalBestRank, self.beatmap.fileMD5) + + def setPersonalBest(self): + """ + Set personal best rank ONLY + Ikr, that query is HUGE but xd + """ + # Before running the HUGE query, make sure we have a score on that map + cdef str query = "SELECT id FROM scores_relax WHERE beatmap_md5 = %(md5)s AND userid = %(userid)s AND play_mode = %(mode)s AND completed = 3" + # Mods + if self.mods > -1: + query += " AND scores_relax.mods = %(mods)s" + # Friends ranking + if self.friends: + query += " AND (scores_relax.userid IN (SELECT user2 FROM users_relationships WHERE user1 = %(userid)s) OR scores_relax.userid = %(userid)s)" + # Sort and limit at the end + query += " LIMIT 1" + hasScore = glob.db.fetch(query, {"md5": self.beatmap.fileMD5, "userid": self.userID, "mode": self.gameMode, "mods": self.mods}) + if hasScore is None: + return + + + # We have a score, run the huge query + # Base query + query = """SELECT COUNT(*) AS rank FROM scores_relax STRAIGHT_JOIN users ON scores_relax.userid = users.id STRAIGHT_JOIN users_stats ON users.id = users_stats.id WHERE scores_relax.pp >= ( + SELECT pp FROM scores_relax WHERE beatmap_md5 = %(md5)s AND play_mode = %(mode)s AND completed = 3 AND userid = %(userid)s LIMIT 1 + ) AND scores_relax.beatmap_md5 = %(md5)s AND scores_relax.play_mode = %(mode)s AND scores_relax.completed = 3 AND users.privileges & 1 > 0""" + # Country + if self.country: + query += " AND users_stats.country = (SELECT country FROM users_stats WHERE id = %(userid)s LIMIT 1)" + # Mods + if self.mods > -1: + query += " AND scores_relax.mods = %(mods)s" + # Friends + if self.friends: + query += " AND (scores_relax.userid IN (SELECT user2 FROM users_relationships WHERE user1 = %(userid)s) OR scores_relax.userid = %(userid)s)" + # Sort and limit at the end + query += " ORDER BY pp DESC LIMIT 1" + result = glob.db.fetch(query, {"md5": self.beatmap.fileMD5, "userid": self.userID, "mode": self.gameMode, "mods": self.mods}) + if result is not None: + self.personalBestRank = result["rank"] + + def getScoresData(self): + """ + Return scores data for getscores + + return -- score data in getscores format + """ + data = "" + + # Output personal best + if self.scores[0] == -1: + # We don't have a personal best score + data += "\n" + else: + # Set personal best score rank + self.setPersonalBest() # sets self.personalBestRank with the huge query + self.scores[0].setRank(self.personalBestRank) + data += self.scores[0].getData() + + # Output top 50 scores + for i in self.scores[1:]: + data += i.getData(pp=1) + return data diff --git a/objects/rxscore.pyx b/objects/rxscore.pyx new file mode 100644 index 0000000..7036320 --- /dev/null +++ b/objects/rxscore.pyx @@ -0,0 +1,274 @@ +import time + +from objects import beatmap +from common.constants import gameModes +from common.log import logUtils as log +from common.ripple import userUtils +from constants import rankedStatuses +from common.ripple import scoreUtils +from objects import glob +from pp import rippoppai +from pp import rxoppai +from pp import wifipiano2 +from pp import cicciobello + + +class score: + PP_CALCULATORS = { + gameModes.STD: rxoppai.oppai, + gameModes.TAIKO: rippoppai.oppai, + gameModes.CTB: cicciobello.Cicciobello, + gameModes.MANIA: wifipiano2.piano + } + __slots__ = ["scoreID", "playerName", "score", "maxCombo", "c50", "c100", "c300", "cMiss", "cKatu", "cGeki", + "fullCombo", "mods", "playerUserID","rank","date", "hasReplay", "fileMd5", "passed", "playDateTime", + "gameMode", "completed", "accuracy", "pp", "oldPersonalBest", "rankedScoreIncrease"] + def __init__(self, scoreID = None, rank = None, setData = True): + """ + Initialize a (empty) score object. + + scoreID -- score ID, used to get score data from db. Optional. + rank -- score rank. Optional + setData -- if True, set score data from db using scoreID. Optional. + """ + self.scoreID = 0 + self.playerName = "nospe" + self.score = 0 + self.maxCombo = 0 + self.c50 = 0 + self.c100 = 0 + self.c300 = 0 + self.cMiss = 0 + self.cKatu = 0 + self.cGeki = 0 + self.fullCombo = False + self.mods = 0 + self.playerUserID = 0 + self.rank = rank # can be empty string too + self.date = 0 + self.hasReplay = 0 + + self.fileMd5 = None + self.passed = False + self.playDateTime = 0 + self.gameMode = 0 + self.completed = 0 + + self.accuracy = 0.00 + + self.pp = 0.00 + + self.oldPersonalBest = 0 + self.rankedScoreIncrease = 0 + + if scoreID is not None and setData == True: + self.setDataFromDB(scoreID, rank) + + def calculateAccuracy(self): + """ + Calculate and set accuracy for that score + """ + if self.gameMode == 0: + # std + totalPoints = self.c50*50+self.c100*100+self.c300*300 + totalHits = self.c300+self.c100+self.c50+self.cMiss + if totalHits == 0: + self.accuracy = 1 + else: + self.accuracy = totalPoints/(totalHits*300) + elif self.gameMode == 1: + # taiko + totalPoints = (self.c100*50)+(self.c300*100) + totalHits = self.cMiss+self.c100+self.c300 + if totalHits == 0: + self.accuracy = 1 + else: + self.accuracy = totalPoints / (totalHits * 100) + elif self.gameMode == 2: + # ctb + fruits = self.c300+self.c100+self.c50 + totalFruits = fruits+self.cMiss+self.cKatu + if totalFruits == 0: + self.accuracy = 1 + else: + self.accuracy = fruits / totalFruits + elif self.gameMode == 3: + # mania + totalPoints = self.c50*50+self.c100*100+self.cKatu*200+self.c300*300+self.cGeki*300 + totalHits = self.cMiss+self.c50+self.c100+self.c300+self.cGeki+self.cKatu + self.accuracy = totalPoints / (totalHits * 300) + else: + # unknown gamemode + self.accuracy = 0 + + def setRank(self, rank): + """ + Force a score rank + + rank -- new score rank + """ + self.rank = rank + + def setDataFromDB(self, scoreID, rank = None): + """ + Set this object's score data from db + Sets playerUserID too + + scoreID -- score ID + rank -- rank in scoreboard. Optional. + """ + data = glob.db.fetch("SELECT scores_relax.*, users.username FROM scores_relax LEFT JOIN users ON users.id = scores_relax.userid WHERE scores_relax.id = %s LIMIT 1", [scoreID]) + if data is not None: + self.setDataFromDict(data, rank) + + def setDataFromDict(self, data, rank = None): + """ + Set this object's score data from dictionary + Doesn't set playerUserID + + data -- score dictionarty + rank -- rank in scoreboard. Optional. + """ + #print(str(data)) + self.scoreID = data["id"] + if "username" in data: + self.playerName = userUtils.getClan(data["userid"]) + else: + self.playerName = userUtils.getUsername(data["userid"]) + self.playerUserID = data["userid"] + self.score = data["score"] + self.maxCombo = data["max_combo"] + self.gameMode = data["play_mode"] + self.c50 = data["50_count"] + self.c100 = data["100_count"] + self.c300 = data["300_count"] + self.cMiss = data["misses_count"] + self.cKatu = data["katus_count"] + self.cGeki = data["gekis_count"] + self.fullCombo = True if data["full_combo"] == 1 else False + self.mods = data["mods"] + self.rank = rank if rank is not None else "" + self.date = data["time"] + self.fileMd5 = data["beatmap_md5"] + self.completed = data["completed"] + #if "pp" in data: + self.pp = data["pp"] + self.calculateAccuracy() + + def setDataFromScoreData(self, scoreData): + """ + Set this object's score data from scoreData list (submit modular) + + scoreData -- scoreData list + """ + if len(scoreData) >= 16: + self.fileMd5 = scoreData[0] + self.playerName = scoreData[1].strip() + # %s%s%s = scoreData[2] + self.c300 = int(scoreData[3]) + self.c100 = int(scoreData[4]) + self.c50 = int(scoreData[5]) + self.cGeki = int(scoreData[6]) + self.cKatu = int(scoreData[7]) + self.cMiss = int(scoreData[8]) + self.score = int(scoreData[9]) + self.maxCombo = int(scoreData[10]) + self.fullCombo = True if scoreData[11] == 'True' else False + #self.rank = scoreData[12] + self.mods = int(scoreData[13]) + self.passed = True if scoreData[14] == 'True' else False + self.gameMode = int(scoreData[15]) + #self.playDateTime = int(scoreData[16]) + self.playDateTime = int(time.time()) + self.calculateAccuracy() + #osuVersion = scoreData[17] + self.calculatePP() + # Set completed status + self.setCompletedStatus() + + + def getData(self, pp=True): + """Return score row relative to this score for getscores""" + return "{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|1\n".format( + self.scoreID, + self.playerName, + int(self.pp) if pp else self.score, + self.maxCombo, + self.c50, + self.c100, + self.c300, + self.cMiss, + self.cKatu, + self.cGeki, + self.fullCombo, + self.mods, + self.playerUserID, + self.rank, + self.date) + + def setCompletedStatus(self): + """ + Set this score completed status and rankedScoreIncrease + """ + self.completed = 0 + if self.passed == True and scoreUtils.isRankable(self.mods): + # Get userID + userID = userUtils.getID(self.playerName) + + # Make sure we don't have another score identical to this one + duplicate = glob.db.fetch("SELECT id FROM scores_relax WHERE userid = %s AND beatmap_md5 = %s AND play_mode = %s AND time = %s AND score = %s LIMIT 1", [userID, self.fileMd5, self.gameMode, self.date, self.score]) + if duplicate is not None: + # Found same score in db. Don't save this score. + self.completed = -1 + return + + # No duplicates found. + # Get right "completed" value + personalBest = glob.db.fetch("SELECT id, pp, score FROM scores_relax WHERE userid = %s AND beatmap_md5 = %s AND play_mode = %s AND completed = 3 LIMIT 1", [userID, self.fileMd5, self.gameMode]) + if personalBest is None: + # This is our first score on this map, so it's our best score + self.completed = 3 + self.rankedScoreIncrease = self.score + self.oldPersonalBest = 0 + else: + # Compare personal best's score with current score + if self.pp > personalBest["pp"]: + # New best score + self.completed = 3 + self.rankedScoreIncrease = self.score-personalBest["score"] + self.oldPersonalBest = personalBest["id"] + else: + self.completed = 2 + self.rankedScoreIncrease = 0 + self.oldPersonalBest = 0 + + log.info("Completed status: {}".format(self.completed)) + + def saveScoreInDB(self): + """ + Save this score in DB (if passed and mods are valid) + """ + # Add this score + if self.completed >= 2: + query = "INSERT INTO scores_relax (id, beatmap_md5, userid, score, max_combo, full_combo, mods, 300_count, 100_count, 50_count, katus_count, gekis_count, misses_count, time, play_mode, completed, accuracy, pp) VALUES (NULL, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);" + self.scoreID = int(glob.db.execute(query, [self.fileMd5, userUtils.getID(self.playerName), self.score, self.maxCombo, 1 if self.fullCombo == True else 0, self.mods, self.c300, self.c100, self.c50, self.cKatu, self.cGeki, self.cMiss, self.playDateTime, self.gameMode, self.completed, self.accuracy * 100, self.pp])) + + # Set old personal best to completed = 2 + if self.oldPersonalBest != 0: + glob.db.execute("UPDATE scores_relax SET completed = 2 WHERE id = %s", [self.oldPersonalBest]) + + def calculatePP(self, b = None): + """ + Calculate this score's pp value if completed == 3 + """ + # Create beatmap object + if b is None: + b = beatmap.beatmap(self.fileMd5, 0) + + # Calculate pp + if b.rankedStatus >= rankedStatuses.RANKED and b.rankedStatus != rankedStatuses.LOVED and b.rankedStatus != rankedStatuses.UNKNOWN \ + and scoreUtils.isRankable(self.mods) and self.passed and self.gameMode in score.PP_CALCULATORS: + calculator = score.PP_CALCULATORS[self.gameMode](b, self) + self.pp = calculator.pp + else: + self.pp = 0 diff --git a/objects/score.pyx b/objects/score.pyx new file mode 100644 index 0000000..83f30aa --- /dev/null +++ b/objects/score.pyx @@ -0,0 +1,273 @@ +import time + +from objects import beatmap +from common.constants import gameModes +from common.log import logUtils as log +from common.ripple import userUtils +from constants import rankedStatuses +from common.ripple import scoreUtils +from objects import glob +from pp import rippoppai +from pp import wifipiano2 +from pp import cicciobello + + +class score: + PP_CALCULATORS = { + gameModes.STD: rippoppai.oppai, + gameModes.TAIKO: rippoppai.oppai, + gameModes.CTB: cicciobello.Cicciobello, + gameModes.MANIA: wifipiano2.piano + } + __slots__ = ["scoreID", "playerName", "score", "maxCombo", "c50", "c100", "c300", "cMiss", "cKatu", "cGeki", + "fullCombo", "mods", "playerUserID","rank","date", "hasReplay", "fileMd5", "passed", "playDateTime", + "gameMode", "completed", "accuracy", "pp", "oldPersonalBest", "rankedScoreIncrease"] + def __init__(self, scoreID = None, rank = None, setData = True): + """ + Initialize a (empty) score object. + + scoreID -- score ID, used to get score data from db. Optional. + rank -- score rank. Optional + setData -- if True, set score data from db using scoreID. Optional. + """ + self.scoreID = 0 + self.playerName = "nospe" + self.score = 0 + self.maxCombo = 0 + self.c50 = 0 + self.c100 = 0 + self.c300 = 0 + self.cMiss = 0 + self.cKatu = 0 + self.cGeki = 0 + self.fullCombo = False + self.mods = 0 + self.playerUserID = 0 + self.rank = rank # can be empty string too + self.date = 0 + self.hasReplay = 0 + + self.fileMd5 = None + self.passed = False + self.playDateTime = 0 + self.gameMode = 0 + self.completed = 0 + + self.accuracy = 0.00 + + self.pp = 0.00 + + self.oldPersonalBest = 0 + self.rankedScoreIncrease = 0 + + if scoreID is not None and setData == True: + self.setDataFromDB(scoreID, rank) + + def calculateAccuracy(self): + """ + Calculate and set accuracy for that score + """ + if self.gameMode == 0: + # std + totalPoints = self.c50*50+self.c100*100+self.c300*300 + totalHits = self.c300+self.c100+self.c50+self.cMiss + if totalHits == 0: + self.accuracy = 1 + else: + self.accuracy = totalPoints/(totalHits*300) + elif self.gameMode == 1: + # taiko + totalPoints = (self.c100*50)+(self.c300*100) + totalHits = self.cMiss+self.c100+self.c300 + if totalHits == 0: + self.accuracy = 1 + else: + self.accuracy = totalPoints / (totalHits * 100) + elif self.gameMode == 2: + # ctb + fruits = self.c300+self.c100+self.c50 + totalFruits = fruits+self.cMiss+self.cKatu + if totalFruits == 0: + self.accuracy = 1 + else: + self.accuracy = fruits / totalFruits + elif self.gameMode == 3: + # mania + totalPoints = self.c50*50+self.c100*100+self.cKatu*200+self.c300*300+self.cGeki*300 + totalHits = self.cMiss+self.c50+self.c100+self.c300+self.cGeki+self.cKatu + self.accuracy = totalPoints / (totalHits * 300) + else: + # unknown gamemode + self.accuracy = 0 + + def setRank(self, rank): + """ + Force a score rank + + rank -- new score rank + """ + self.rank = rank + + def setDataFromDB(self, scoreID, rank = None): + """ + Set this object's score data from db + Sets playerUserID too + + scoreID -- score ID + rank -- rank in scoreboard. Optional. + """ + data = glob.db.fetch("SELECT scores.*, users.username FROM scores LEFT JOIN users ON users.id = scores.userid WHERE scores.id = %s LIMIT 1", [scoreID]) + if data is not None: + self.setDataFromDict(data, rank) + + def setDataFromDict(self, data, rank = None): + """ + Set this object's score data from dictionary + Doesn't set playerUserID + + data -- score dictionarty + rank -- rank in scoreboard. Optional. + """ + #print(str(data)) + self.scoreID = data["id"] + if "username" in data: + self.playerName = userUtils.getClan(data["userid"]) + else: + self.playerName = userUtils.getUsername(data["userid"]) + self.playerUserID = data["userid"] + self.score = data["score"] + self.maxCombo = data["max_combo"] + self.gameMode = data["play_mode"] + self.c50 = data["50_count"] + self.c100 = data["100_count"] + self.c300 = data["300_count"] + self.cMiss = data["misses_count"] + self.cKatu = data["katus_count"] + self.cGeki = data["gekis_count"] + self.fullCombo = True if data["full_combo"] == 1 else False + self.mods = data["mods"] + self.rank = rank if rank is not None else "" + self.date = data["time"] + self.fileMd5 = data["beatmap_md5"] + self.completed = data["completed"] + #if "pp" in data: + self.pp = data["pp"] + self.calculateAccuracy() + + def setDataFromScoreData(self, scoreData): + """ + Set this object's score data from scoreData list (submit modular) + + scoreData -- scoreData list + """ + if len(scoreData) >= 16: + self.fileMd5 = scoreData[0] + self.playerName = scoreData[1].strip() + # %s%s%s = scoreData[2] + self.c300 = int(scoreData[3]) + self.c100 = int(scoreData[4]) + self.c50 = int(scoreData[5]) + self.cGeki = int(scoreData[6]) + self.cKatu = int(scoreData[7]) + self.cMiss = int(scoreData[8]) + self.score = int(scoreData[9]) + self.maxCombo = int(scoreData[10]) + self.fullCombo = True if scoreData[11] == 'True' else False + #self.rank = scoreData[12] + self.mods = int(scoreData[13]) + self.passed = True if scoreData[14] == 'True' else False + self.gameMode = int(scoreData[15]) + #self.playDateTime = int(scoreData[16]) + self.playDateTime = int(time.time()) + self.calculateAccuracy() + #osuVersion = scoreData[17] + + # Set completed status + self.setCompletedStatus() + + + def getData(self, pp=False): + """Return score row relative to this score for getscores""" + return "{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|1\n".format( + self.scoreID, + self.playerName, + int(self.pp) if pp else self.score, + self.maxCombo, + self.c50, + self.c100, + self.c300, + self.cMiss, + self.cKatu, + self.cGeki, + self.fullCombo, + self.mods, + self.playerUserID, + self.rank, + self.date) + + def setCompletedStatus(self): + """ + Set this score completed status and rankedScoreIncrease + """ + self.completed = 0 + if self.passed == True and scoreUtils.isRankable(self.mods): + # Get userID + userID = userUtils.getID(self.playerName) + + # Make sure we don't have another score identical to this one + duplicate = glob.db.fetch("SELECT id FROM scores WHERE userid = %s AND beatmap_md5 = %s AND play_mode = %s AND score = %s LIMIT 1", [userID, self.fileMd5, self.gameMode, self.score]) + if duplicate is not None: + # Found same score in db. Don't save this score. + self.completed = -1 + return + + # No duplicates found. + # Get right "completed" value + personalBest = glob.db.fetch("SELECT id, score FROM scores WHERE userid = %s AND beatmap_md5 = %s AND play_mode = %s AND completed = 3 LIMIT 1", [userID, self.fileMd5, self.gameMode]) + if personalBest is None: + # This is our first score on this map, so it's our best score + self.completed = 3 + self.rankedScoreIncrease = self.score + self.oldPersonalBest = 0 + else: + # Compare personal best's score with current score + if self.score > personalBest["score"]: + # New best score + self.completed = 3 + self.rankedScoreIncrease = self.score-personalBest["score"] + self.oldPersonalBest = personalBest["id"] + else: + self.completed = 2 + self.rankedScoreIncrease = 0 + self.oldPersonalBest = 0 + + log.debug("Completed status: {}".format(self.completed)) + + def saveScoreInDB(self): + """ + Save this score in DB (if passed and mods are valid) + """ + # Add this score + if self.completed >= 2: + query = "INSERT INTO scores (id, beatmap_md5, userid, score, max_combo, full_combo, mods, 300_count, 100_count, 50_count, katus_count, gekis_count, misses_count, time, play_mode, completed, accuracy, pp) VALUES (NULL, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);" + self.scoreID = int(glob.db.execute(query, [self.fileMd5, userUtils.getID(self.playerName), self.score, self.maxCombo, 1 if self.fullCombo == True else 0, self.mods, self.c300, self.c100, self.c50, self.cKatu, self.cGeki, self.cMiss, self.playDateTime, self.gameMode, self.completed, self.accuracy * 100, self.pp])) + + # Set old personal best to completed = 2 + if self.oldPersonalBest != 0: + glob.db.execute("UPDATE scores SET completed = 2 WHERE id = %s", [self.oldPersonalBest]) + + def calculatePP(self, b = None): + """ + Calculate this score's pp value if completed == 3 + """ + # Create beatmap object + if b is None: + b = beatmap.beatmap(self.fileMd5, 0) + + # Calculate pp + if b.rankedStatus >= rankedStatuses.RANKED and b.rankedStatus != rankedStatuses.LOVED and b.rankedStatus != rankedStatuses.UNKNOWN \ + and scoreUtils.isRankable(self.mods) and self.passed and self.gameMode in score.PP_CALCULATORS: + calculator = score.PP_CALCULATORS[self.gameMode](b, self) + self.pp = calculator.pp + else: + self.pp = 0 diff --git a/objects/scoreboard.pyx b/objects/scoreboard.pyx new file mode 100644 index 0000000..fcc9a10 --- /dev/null +++ b/objects/scoreboard.pyx @@ -0,0 +1,240 @@ +from objects import score +from common.ripple import userUtils +from constants import rankedStatuses +from common.constants import mods as modsEnum +from common.constants import privileges +from objects import glob + + +class scoreboard: + def __init__(self, username, gameMode, beatmap, setScores = True, country = False, friends = False, mods = -1): + """ + Initialize a leaderboard object + + username -- username of who's requesting the scoreboard. None if not known + gameMode -- requested gameMode + beatmap -- beatmap objecy relative to this leaderboard + setScores -- if True, will get personal/top 50 scores automatically. Optional. Default: True + """ + self.scores = [] # list containing all top 50 scores objects. First object is personal best + self.totalScores = 0 + self.personalBestRank = -1 # our personal best rank, -1 if not found yet + self.username = username # username of who's requesting the scoreboard. None if not known + self.userID = userUtils.getID(self.username) # username's userID + self.gameMode = gameMode # requested gameMode + self.beatmap = beatmap # beatmap objecy relative to this leaderboard + self.country = country + self.friends = friends + self.mods = mods + if setScores: + self.setScores() + + + def setScores(self): + """ + Set scores list + """ + + isPremium = userUtils.getPrivileges(self.userID) & privileges.USER_PREMIUM + + def buildQuery(params): + return "{select} {joins} {country} {mods} {friends} {order} {limit}".format(**params) + # Reset score list + self.scores = [] + self.scores.append(-1) + + # Make sure the beatmap is ranked + if self.beatmap.rankedStatus < rankedStatuses.RANKED: + return + + # Query parts + cdef str select = "" + cdef str joins = "" + cdef str country = "" + cdef str mods = "" + cdef str friends = "" + cdef str order = "" + cdef str limit = "" + + # Find personal best score + if self.userID != 0: + # Query parts + select = "SELECT id FROM scores WHERE userid = %(userid)s AND beatmap_md5 = %(md5)s AND play_mode = %(mode)s AND completed = 3" + + # Mods + if self.mods > -1: + mods = "AND mods = %(mods)s" + + # Friends ranking + if self.friends: + friends = "AND (scores.userid IN (SELECT user2 FROM users_relationships WHERE user1 = %(userid)s) OR scores.userid = %(userid)s)" + + # Sort and limit at the end + order = "ORDER BY score DESC" + limit = "LIMIT 1" + + # Build query, get params and run query + query = buildQuery(locals()) + params = {"userid": self.userID, "md5": self.beatmap.fileMD5, "mode": self.gameMode, "mods": self.mods} + personalBestScore = glob.db.fetch(query, params) + else: + personalBestScore = None + + # Output our personal best if found + if personalBestScore is not None: + s = score.score(personalBestScore["id"]) + self.scores[0] = s + else: + # No personal best + self.scores[0] = -1 + + # Get top 50 scores + select = "SELECT *" + joins = "FROM scores STRAIGHT_JOIN users ON scores.userid = users.id STRAIGHT_JOIN users_stats ON users.id = users_stats.id WHERE scores.beatmap_md5 = %(beatmap_md5)s AND scores.play_mode = %(play_mode)s AND scores.completed = 3 AND (users.privileges & 1 > 0 OR users.id = %(userid)s)" + + # Country ranking + if self.country: + """ Honestly this is more of a preference thing than something that should be premium only? + if isPremium: + country = "AND user_clans.clan = (SELECT clan FROM user_clans WHERE user = %(userid)s LIMIT 1)" + else: + """ + country = "AND users_stats.country = (SELECT country FROM users_stats WHERE id = %(userid)s LIMIT 1)" + else: + country = "" + + # Mods ranking (ignore auto, since we use it for pp sorting) + if self.mods > -1: + mods = "AND scores.mods = %(mods)s" + else: + mods = "" + + # Friends ranking + if self.friends: + friends = "AND (scores.userid IN (SELECT user2 FROM users_relationships WHERE user1 = %(userid)s) OR scores.userid = %(userid)s)" + else: + friends = "" + + order = "ORDER BY score DESC" + + if isPremium: # Premium members can see up to 100 scores on leaderboards + limit = "LIMIT 100" + else: + limit = "LIMIT 50" + + # Build query, get params and run query + query = buildQuery(locals()) + params = {"beatmap_md5": self.beatmap.fileMD5, "play_mode": self.gameMode, "userid": self.userID, "mods": self.mods} + topScores = glob.db.fetchAll(query, params) + + # Set data for all scores + cdef int c = 1 + cdef dict topScore + if topScores is not None: + for topScore in topScores: + # Create score object + s = score.score(topScore["id"], setData=False) + + # Set data and rank from topScores's row + s.setDataFromDict(topScore) + s.setRank(c) + + # Check if this top 50 score is our personal best + if s.playerName == self.username: + self.personalBestRank = c + + # Add this score to scores list and increment rank + self.scores.append(s) + c+=1 + + '''# If we have more than 50 scores, run query to get scores count + if c >= 50: + # Count all scores on this map + select = "SELECT COUNT(*) AS count" + limit = "LIMIT 1" + + # Build query, get params and run query + query = buildQuery(locals()) + count = glob.db.fetch(query, params) + if count == None: + self.totalScores = 0 + else: + self.totalScores = count["count"] + else: + self.totalScores = c-1''' + + # If personal best score was not in top 50, try to get it from cache + if personalBestScore is not None and self.personalBestRank < 1: + self.personalBestRank = glob.personalBestCache.get(self.userID, self.beatmap.fileMD5, self.country, self.friends, self.mods) + + # It's not even in cache, get it from db + if personalBestScore is not None and self.personalBestRank < 1: + self.setPersonalBest() + + # Cache our personal best rank so we can eventually use it later as + # before personal best rank" in submit modular when building ranking panel + if self.personalBestRank >= 1: + glob.personalBestCache.set(self.userID, self.personalBestRank, self.beatmap.fileMD5) + + def setPersonalBest(self): + """ + Set personal best rank ONLY + Ikr, that query is HUGE but xd + """ + # Before running the HUGE query, make sure we have a score on that map + cdef str query = "SELECT id FROM scores WHERE beatmap_md5 = %(md5)s AND userid = %(userid)s AND play_mode = %(mode)s AND completed = 3" + # Mods + if self.mods > -1: + query += " AND scores.mods = %(mods)s" + # Friends ranking + if self.friends: + query += " AND (scores.userid IN (SELECT user2 FROM users_relationships WHERE user1 = %(userid)s) OR scores.userid = %(userid)s)" + # Sort and limit at the end + query += " LIMIT 1" + hasScore = glob.db.fetch(query, {"md5": self.beatmap.fileMD5, "userid": self.userID, "mode": self.gameMode, "mods": self.mods}) + if hasScore is None: + return + + # We have a score, run the huge query + # Base query + query = """SELECT COUNT(*) AS rank FROM scores STRAIGHT_JOIN users ON scores.userid = users.id STRAIGHT_JOIN users_stats ON users.id = users_stats.id WHERE scores.score >= ( + SELECT score FROM scores WHERE beatmap_md5 = %(md5)s AND play_mode = %(mode)s AND completed = 3 AND userid = %(userid)s LIMIT 1 + ) AND scores.beatmap_md5 = %(md5)s AND scores.play_mode = %(mode)s AND scores.completed = 3 AND users.privileges & 1 > 0""" + # Country + if self.country: + query += " AND users_stats.country = (SELECT country FROM users_stats WHERE id = %(userid)s LIMIT 1)" + # Mods + if self.mods > -1: + query += " AND scores.mods = %(mods)s" + # Friends + if self.friends: + query += " AND (scores.userid IN (SELECT user2 FROM users_relationships WHERE user1 = %(userid)s) OR scores.userid = %(userid)s)" + # Sort and limit at the end + query += " ORDER BY score DESC LIMIT 1" + result = glob.db.fetch(query, {"md5": self.beatmap.fileMD5, "userid": self.userID, "mode": self.gameMode, "mods": self.mods}) + if result is not None: + self.personalBestRank = result["rank"] + + def getScoresData(self): + """ + Return scores data for getscores + + return -- score data in getscores format + """ + data = "" + + # Output personal best + if self.scores[0] == -1: + # We don't have a personal best score + data += "\n" + else: + # Set personal best score rank + self.setPersonalBest() # sets self.personalBestRank with the huge query + self.scores[0].setRank(self.personalBestRank) + data += self.scores[0].getData() + + # Output top 50 scores + for i in self.scores[1:]: + data += i.getData(pp=self.mods > -1 and self.mods & modsEnum.AUTOPLAY > 0) + + return data diff --git a/personalBestCache.py b/personalBestCache.py new file mode 100644 index 0000000..3a38259 --- /dev/null +++ b/personalBestCache.py @@ -0,0 +1,58 @@ +from common.log import logUtils as log +from common import generalUtils +from objects import glob + +class cacheMiss(Exception): + pass + +class personalBestCache: + def get(self, userID, fileMd5, country=False, friends=False, mods=-1): + """ + Get cached personal best rank + + :param userID: userID + :param fileMd5: beatmap md5 + :param country: True if country leaderboard, otherwise False + :param friends: True if friends leaderboard, otherwise False + :param mods: leaderboard mods + :return: 0 if cache miss, otherwise rank number + """ + try: + # Make sure the value is in cache + data = glob.redis.get("lets:personal_best_cache:{}".format(userID)) + if data is None: + raise cacheMiss() + + # Unpack cached data + data = data.decode("utf-8").split("|") + cachedpersonalBestRank = int(data[0]) + cachedfileMd5 = str(data[1]) + cachedCountry = generalUtils.stringToBool(data[2]) + cachedFriends = generalUtils.stringToBool(data[3]) + cachedMods = int(data[4]) + + # Check if everything matches + if fileMd5 != cachedfileMd5 or country != cachedCountry or friends != cachedFriends or mods != cachedMods: + raise cacheMiss() + + # Cache hit + log.debug("personalBestCache hit") + return cachedpersonalBestRank + except cacheMiss: + log.debug("personalBestCache miss") + return 0 + + def set(self, userID, rank, fileMd5, country=False, friends=False, mods=-1): + """ + Set userID's redis personal best cache + + :param userID: userID + :param rank: leaderboard rank + :param fileMd5: beatmap md5 + :param country: True if country leaderboard, otherwise False + :param friends: True if friends leaderboard, otherwise False + :param mods: leaderboard mods + :return: + """ + glob.redis.set("lets:personal_best_cache:{}".format(userID), "{}|{}|{}|{}|{}".format(rank, fileMd5, country, friends, mods), 1800) + log.debug("personalBestCache set") diff --git a/pp/__init__.py b/pp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pp/catch_the_pp/.gitignore b/pp/catch_the_pp/.gitignore new file mode 100644 index 0000000..4ecf4a4 --- /dev/null +++ b/pp/catch_the_pp/.gitignore @@ -0,0 +1,104 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +.idea/ +*.c \ No newline at end of file diff --git a/pp/catch_the_pp/LICENSE b/pp/catch_the_pp/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/pp/catch_the_pp/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) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/pp/catch_the_pp/README.md b/pp/catch_the_pp/README.md new file mode 100644 index 0000000..4ea0b13 --- /dev/null +++ b/pp/catch_the_pp/README.md @@ -0,0 +1,39 @@ +# Cythonized catch-the-pp +An osu ctb gamemode star/pp calculator made in Cython. +Original repo: [catch-the-pp](https://github.com/osufx/catch-the-pp) by [Sunpy](https://github.com/EmilySunpy). +*Note: This repo is meant to be used as a Python package, not as a standalone program!* + +## Changes +- Cythonized all files, functions, classes and methods (with static typing as well) +- Replaced `math.pow` with `**`, this gives _a bit_ of extra speed +- Replaced imports +- Minor code cleaning + +## Performance +These are the execution times after running pp calculation (with beatmap parsing and difficulty calculation as well) on `reanimate.osu` 100 times +Pure Python version: `Min: 0.7986021041870117 s, Max: 0.932903528213501 s, Avg: 0.8350819730758667 s` +Cythonized version: `Min: 0.22933077812194824 s, Max: 0.25774192810058594 s, Avg: 0.23836223363876344 s` + + +## Compiling & Usage +``` +$ git clone ... catch_the_pp +$ cd catch_the_pp +$ python3.6 setup.py build_ext --inplace +... +$ cd .. +$ python3.6 -m catch_the_pp.sample +Calculation: +Stars: 1.9046727418899536, PP: 42.187660217285156, MaxCombo: 1286 +$ python3.6 +>>> from catch_the_pp.osu_parser.beatmap import Beatmap +>>> from catch_the_pp.osu.ctb.difficulty import Difficulty +>>> from catch_the_pp.ppCalc import calculate_pp +>>> beatmap = Beatmap("catch_the_pp/test.osu") +>>> difficulty = Difficulty(beatmap=beatmap, mods=0) +>>> difficulty.star_rating +1.9046727418899536 +>>> calculate_pp(diff=difficulty, accuracy=1, combo=beatmap.max_combo, miss=0) +42.187660217285156 +``` +> Note: You must clone the repo in a folder that has no dashes in its name, because Python modules cannot have dashes in their name! In this example, `catch_the_pp` was used. \ No newline at end of file diff --git a/pp/catch_the_pp/__init__.py b/pp/catch_the_pp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pp/catch_the_pp/constants.pyx b/pp/catch_the_pp/constants.pyx new file mode 100644 index 0000000..84b2091 --- /dev/null +++ b/pp/catch_the_pp/constants.pyx @@ -0,0 +1,9 @@ +STAR_SCALING_FACTOR = 0.145 +STRAIN_STEP = 750 +DECAY_WEIGHT = 0.94 +DECAY_BASE = 0.2 +ABSOLUTE_PLAYER_POSITIONING_ERROR = 16 +NORMALIZED_HITOBJECT_RADIUS = 41 +DIRECTION_CHANGE_BONUS = 12.5 + +SLIDER_QUALITY = 50 \ No newline at end of file diff --git a/pp/catch_the_pp/osu/__init__.py b/pp/catch_the_pp/osu/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pp/catch_the_pp/osu/ctb/__init__.py b/pp/catch_the_pp/osu/ctb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pp/catch_the_pp/osu/ctb/difficulty.pyx b/pp/catch_the_pp/osu/ctb/difficulty.pyx new file mode 100644 index 0000000..a5b53b5 --- /dev/null +++ b/pp/catch_the_pp/osu/ctb/difficulty.pyx @@ -0,0 +1,268 @@ +from ... import constants +from ...osu_parser.mathhelper import clamp, sign + + +cdef class DifficultyObject: + """ + Object that holds strain value etc. + + Handled in Difficulty.calculate_strainValues & Difficulty.update_hyperdash_distance. + Used in Difficulty.calculate_difficulty + """ + cdef public float strain, last_movement + cdef public float offset, player_width, scaled_position, hyperdash_distance + cdef public object hitobject + cdef public int error_margin, hyperdash + + def __init__(self, hitobject, player_width): + """ + Hitobject wrapper to do calculation with. + + hitobject -- Hitobject to wrap around (basic) + player_width -- Catcher width (after determined by active mods) + """ + self.strain = 1 + self.offset = 0 + self.last_movement = 0 + self.hitobject = hitobject + self.error_margin = constants.ABSOLUTE_PLAYER_POSITIONING_ERROR + self.player_width = player_width + self.scaled_position = self.hitobject.x * (constants.NORMALIZED_HITOBJECT_RADIUS / self.player_width) + self.hyperdash_distance = 0 + self.hyperdash = False + + cpdef calculate_strain(self, object last, float time_rate): + """ + Calculate strain value by refering last object. + (and sets offset & last_movement info) + + last -- Previous hitobject + time_rate -- Timescale from enabled mods + """ + cdef float time = (self.hitobject.time - last.hitobject.time) / time_rate + cdef float decay = constants.DECAY_BASE ** (time / 1000) + + self.offset = clamp(last.scaled_position + last.offset, + self.scaled_position - (constants.NORMALIZED_HITOBJECT_RADIUS - self.error_margin), + self.scaled_position + (constants.NORMALIZED_HITOBJECT_RADIUS - self.error_margin) + ) - self.scaled_position + + self.last_movement = abs(self.scaled_position - last.scaled_position + self.offset - last.offset) + + cdef float addition = (self.last_movement ** 1.3) / 500 + + if self.scaled_position < last.scaled_position: + self.last_movement *= -1 + + cdef float addition_bonus = 0 + cdef float sqrt_time = max(time, 25) ** 0.5 + + if abs(self.last_movement) > 0.1: + if abs(last.last_movement) > 0.1 and sign(self.last_movement) != sign(last.last_movement): + bonus = constants.DIRECTION_CHANGE_BONUS / sqrt_time + bonus_factor = min(self.error_margin, abs(self.last_movement)) / self.error_margin + + addition += bonus * bonus_factor + + if last.hyperdash_distance <= 10: + addition_bonus += 0.3 * bonus_factor + + addition += 7.5 * min(abs(self.last_movement), constants.NORMALIZED_HITOBJECT_RADIUS * 2) / (constants.NORMALIZED_HITOBJECT_RADIUS * 6) / sqrt_time + + if last.hyperdash_distance <= 10: + if not last.hyperdash: + addition_bonus += 1 + else: + self.offset = 0 + + addition *= 1 + addition_bonus * ((10 - last.hyperdash_distance) / 10) + + addition *= 850 / max(time, 25) + self.strain = last.strain * decay + addition + +cdef class Difficulty: + """ + Difficulty object for calculating star rating. + + Stars: self.star_rating + """ + cdef public object beatmap + cdef public int mods + cdef public list hitobjects_with_ticks, difficulty_objects + cdef public float time_rate, player_width, star_rating + + + def __init__(self, beatmap, mods): + """ + CTB difficulty calculator params. + Calculates the star rating for the given beatmap. + + beatmap -- Beatmap object of parsed beatmap + mods -- Int representation of mods selected / bitmask + """ + self.beatmap = beatmap + self.mods = mods + + #Difficulty modifier by mod + cdef str diff + for diff in self.beatmap.difficulty.keys(): + if diff == "CircleSize": + scala = 1.3 + else: + scala = 1.4 + self.beatmap.difficulty[diff] = self.adjust_difficulty(self.beatmap.difficulty[diff], self.mods, scala) + + cdef object hitobject + self.hitobjects_with_ticks = [] + for hitobject in self.beatmap.hitobjects: + self.hitobjects_with_ticks.append(hitobject) + if 2 & hitobject.type: + for tick in hitobject.ticks: + self.hitobjects_with_ticks.append(tick) + for end_tick in hitobject.end_ticks: + self.hitobjects_with_ticks.append(end_tick) + + self.difficulty_objects = [] + + #Do the calculation + self.time_rate = self.get_time_rate() + self.player_width = 305 / 1.6 * ((102.4 * (1 - 0.7 * (self.beatmap.difficulty["CircleSize"] - 5) / 5)) / 128) * 0.7 + + for hitobject in self.hitobjects_with_ticks: + self.difficulty_objects.append(DifficultyObject(hitobject, self.player_width * 0.4)) + + self.update_hyperdash_distance() + + #Sort the list so its sorted by time (Incase it somehow isnt) + self.difficulty_objects.sort(key=lambda o: o.hitobject.time) + + self.calculate_strain_values() + + self.star_rating = (self.calculate_difficulty() ** 0.5) * constants.STAR_SCALING_FACTOR + + + def adjust_difficulty(self, diff, mods, scala): + """ + Scale difficulty from selected mods. + + diff -- CircleSize + mods -- Int representation of mods selected / bitmask + return -- Scaled difficulty + """ + if mods & 1 << 1 > 0: #EZ + diff = max(0, diff / 2) + if mods & 1 << 4 > 0: #HR + diff = min(10, diff * scala) + + return diff + + def get_time_rate(self): + """ + Get scaled time_rate from mods. (DT / HT) + + return -- time_rate + """ + rate = 1 + + if self.mods & 1 << 6 > 0: #DT + rate += 0.5 + elif self.mods & 1 << 8 > 0: #HT + rate -= 0.25 + + return rate + + cpdef update_hyperdash_distance(self): + """ + Update hyperdash_distance value for every hitobject in the beatmap. + """ + cdef int last_direction = 0, direction, i + cdef float player_width_half = self.player_width / 2 + cdef float last = player_width_half + + cdef object current_object, next_object + + for i in range(len(self.difficulty_objects) - 1): + current_object = self.difficulty_objects[i] + next_object = self.difficulty_objects[i + 1] + + if next_object.hitobject.x > current_object.hitobject.x: + direction = 1 + else: + direction = -1 + + time_to_next = next_object.hitobject.time - current_object.hitobject.time - 4.166667 #ms for 60fps divided by 4 + distance_to_next = abs(next_object.hitobject.x - current_object.hitobject.x) + if last_direction == direction: + distance_to_next -= last + else: + distance_to_next -= player_width_half + + if time_to_next < distance_to_next: + current_object.hyperdash = True + last = player_width_half + else: + current_object.hyperdash_distance = time_to_next - distance_to_next + last = clamp(current_object.hyperdash_distance, 0, player_width_half) + + last_direction = direction + + cpdef calculate_strain_values(self): + """ + Calculate strain values for every hitobject. + + It does this by using distance, decay & previous hitobject strain value. + Time_rate also effects this. + """ + cdef object current_object = self.difficulty_objects[0], next_object + + cdef index = 1 + while index < len(self.difficulty_objects): + next_object = self.difficulty_objects[index] + next_object.calculate_strain(current_object, self.time_rate) + current_object = next_object + index += 1 + + cpdef float calculate_difficulty(self): + """ + Calculates the difficulty for this beatmap. + This is used in the final function to calculate star rating. + DISCLAIMER: This is not the final star rating value. + + return -- difficulty + """ + cdef float strain_step = constants.STRAIN_STEP * self.time_rate + cdef list highest_strains = [] + cdef float interval = strain_step + cdef float max_strain = 0 + + cdef object last = None, difficulty_object + + for difficulty_object in self.difficulty_objects: + while difficulty_object.hitobject.time > interval: + highest_strains.append(max_strain) + + if last is None: + max_strain = 0 + else: + decay = (constants.DECAY_BASE ** ((interval - last.hitobject.time) / 1000)) + max_strain = last.strain * decay + + interval += strain_step + + if difficulty_object.strain > max_strain: + max_strain = difficulty_object.strain + + last = difficulty_object + + cdef float difficulty = 0 + cdef float weight = 1 + + #Sort from high to low strain + highest_strains.sort(key=int, reverse=True) + + cdef float strain + for strain in highest_strains: + difficulty += weight * strain + weight *= constants.DECAY_WEIGHT + + return difficulty diff --git a/pp/catch_the_pp/osu_parser/__init__.py b/pp/catch_the_pp/osu_parser/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pp/catch_the_pp/osu_parser/beatmap.pyx b/pp/catch_the_pp/osu_parser/beatmap.pyx new file mode 100644 index 0000000..7deb020 --- /dev/null +++ b/pp/catch_the_pp/osu_parser/beatmap.pyx @@ -0,0 +1,222 @@ +from . import mathhelper +from .hitobject import HitObject + +cdef class Beatmap(object): + """ + Beatmap object for beatmap parsing and handling + """ + + cdef public str file_name + cdef public int version + cdef public int header + cdef public dict difficulty + cdef public dict timing_points + cdef public float slider_point_distance + cdef public list hitobjects + cdef public int max_combo + + def __init__(self, file_name): + """ + file_name -- Directory for beatmap file (.osu) + """ + self.file_name = file_name + self.version = -1 #Unknown by default + self.header = -1 + self.difficulty = {} + self.timing_points = { + "raw_bpm": {}, #Raw bpm modifier code + "raw_spm": {}, #Raw speed modifier code + "bpm": {}, #Beats pr minute + "spm": {} #Speed modifier + } + self.slider_point_distance = 1 #Changes after [Difficulty] is fully parsed + self.hitobjects = [] + self.max_combo = 0 + self.parse_beatmap() + + if "ApproachRate" not in self.difficulty.keys(): #Fix old osu version + self.difficulty["ApproachRate"] = self.difficulty["OverallDifficulty"] + + cpdef parse_beatmap(self): + """ + Parses beatmap file line by line by passing each line into parse_line. + """ + cdef str line + with open(self.file_name, encoding="utf8") as file_stream: + ver_line = "" + while len(ver_line) < 2: #Find the line where beatmap version is spesified (normaly first line) + ver_line = file_stream.readline() + self.version = int(''.join(list(filter(str.isdigit, ver_line)))) #Set version + for line in file_stream: + self.parse_line(line.replace("\n", "")) + + cpdef parse_line(self, str line): + """ + Parse a beatmapfile line. + + Handles lines that are required for our use case (Difficulty, TimingPoints & hitobjects), + everything else is skipped. + """ + if len(line) < 1: + return + + if line.startswith("["): + if line == "[Difficulty]": + self.header = 0 + elif line == "[TimingPoints]": + self.header = 1 + elif line == "[HitObjects]": + self.header = 2 + self.slider_point_distance = (100 * self.difficulty["SliderMultiplier"]) / self.difficulty["SliderTickRate"] + else: + self.header = -1 + return + + if self.header == -1: #We return if we are reading under a header we dont care about + return + + if self.header == 0: + self.handle_difficulty_propperty(line) + elif self.header == 1: + self.handle_timing_point(line) + elif self.header == 2: + self.handle_hitobject(line) + + cpdef handle_difficulty_propperty(self, str propperty): + """ + Puts the [Difficulty] propperty into the difficulty dict. + """ + prop = propperty.split(":") + self.difficulty[prop[0]] = float(prop[1]) + + cpdef handle_timing_point(self, str timing_point): + """ + Formats timing points used for slider velocity changes, + and store them into self.timing_points dict. + """ + timing_point_split = timing_point.split(",") + timing_point_time = int(float(timing_point_split[0])) #Fixes some special mappers special needs + timing_point_focus = timing_point_split[1] + + timing_point_type = 1 + if len(timing_point_split) >= 7: #Fix for old beatmaps that only stores bpm change and timestamp (only BPM change) [v3?] + timing_point_type = int(timing_point_split[6]) + + if timing_point_type == 0 and not timing_point_focus.startswith("-"): + timing_point_focus = "-100" + + if timing_point_focus.startswith("-"): #If not then its not a slider velocity modifier + self.timing_points["spm"][timing_point_time] = -100 / float(timing_point_focus) #Convert to normalized value and store + self.timing_points["raw_spm"][timing_point_time] = float(timing_point_focus) + else: + if len(self.timing_points["bpm"]) == 0: #Fixes if hitobjects shows up before bpm is set + timing_point_time = 0 + + self.timing_points["bpm"][timing_point_time] = 60000 / float(timing_point_focus)#^ + self.timing_points["raw_bpm"][timing_point_time] = float(timing_point_focus) + #This trash of a game resets the spm when bpm change >.> + self.timing_points["spm"][timing_point_time] = 1 + self.timing_points["raw_spm"][timing_point_time] = -100 + + cpdef handle_hitobject(self, str line): + """ + Puts every hitobject into the hitobjects array. + + Creates hitobjects, hitobject_sliders or skip depending on the given data. + We skip everything that is not important for us for our use case (Spinners) + """ + split_object = line.split(",") + time = int(split_object[2]) + object_type = int(split_object[3]) + + if not (1 & object_type > 0 or 2 & object_type > 0): #We only want sliders and circles as spinners are random bannanas etc. + return + + if 2 & object_type: #Slider + repeat = int(split_object[6]) + pixel_length = float(split_object[7]) + + time_point = self.get_timing_point_all(time) + + tick_distance = (100 * self.difficulty["SliderMultiplier"]) / self.difficulty["SliderTickRate"] + if self.version >= 8: + tick_distance /= (mathhelper.clamp(-time_point["raw_spm"], 10, 1000) / 100) + + curve_split = split_object[5].split("|") + curve_points = [] + for i in range(1, len(curve_split)): + vector_split = curve_split[i].split(":") + vector = mathhelper.Vec2(int(vector_split[0]), int(vector_split[1])) + curve_points.append(vector) + + slider_type = curve_split[0] + if self.version <= 6 and len(curve_points) >= 2: + if slider_type == "L": + slider_type = "B" + + if len(curve_points) == 2: + if (int(split_object[0]) == curve_points[0].x and int(split_object[1]) == curve_points[0].y) or (curve_points[0].x == curve_points[1].x and curve_points[0].y == curve_points[1].y): + del curve_points[0] + slider_type = "L" + + if len(curve_points) == 0: #Incase of ExGon meme (Sliders that acts like hitcircles) + hitobject = HitObject(int(split_object[0]), int(split_object[1]), time, 1) + else: + hitobject = HitObject(int(split_object[0]), int(split_object[1]), time, object_type, slider_type, curve_points, repeat, pixel_length, time_point, self.difficulty, tick_distance) + else: + hitobject = HitObject(int(split_object[0]), int(split_object[1]), time, object_type) + + self.hitobjects.append(hitobject) + self.max_combo += hitobject.get_combo() + + def get_timing_point_all(self, time): + """ + Returns a object of all current timing types + + time -- timestamp + return -- {"raw_bpm": Float, "raw_spm": Float, "bpm": Float, "spm": Float} + """ + types = { + "raw_bpm": 600, + "raw_spm": -100, + "bpm": 100, + "spm": 1 + } #Will return the default value if timing point were not found + for t in types.keys(): + r = self.get_timing_point(time, t) + if r is not None: + types[t] = r + #else: + #print("{} were not found for timestamp {}, using {} instead.".format(t, time, types[t])) + + return types + + def get_timing_point(self, time, timing_type): + """ + Returns latest timing point by timestamp (Current) + + time -- timestamp + timing_type -- mpb, bmp or spm + return -- self.timing_points object + """ + r = None + try: + for key in sorted(self.timing_points[timing_type].keys(), key=lambda k: k): + if key <= time: + r = self.timing_points[timing_type][key] + else: + break + except Exception as e: + print(e) + return r + + def get_object_count(self): + """ + Get the total hitobject count for the parsed beatmap (Normal hitobjects, sliders & sliderticks) + + return -- total hitobjects for parsed beatmap + """ + cdef int count = 0 + for hitobject in self.hitobjects: + count += hitobject.get_points() + return count diff --git a/pp/catch_the_pp/osu_parser/curves.pyx b/pp/catch_the_pp/osu_parser/curves.pyx new file mode 100644 index 0000000..b159f7d --- /dev/null +++ b/pp/catch_the_pp/osu_parser/curves.pyx @@ -0,0 +1,166 @@ +import math +from .. import constants +from . import mathhelper + +class Linear(object): #Because it made sense at the time... + def __init__(self, points): + self.pos = points + +cdef class Bezier(object): + cdef public list points, pos + cdef public int order + + def __init__(self, points): + self.points = points + self.order = len(self.points) + self.pos = [] + self.calc_points() + + cpdef calc_points(self): + if len(self.pos) != 0: #This should never happen but since im working on this I want to warn myself if I fuck up + raise Exception("Bezier was calculated twice!") + + cdef list sub_points = [] + for i in range(len(self.points)): + if i == len(self.points) - 1: + sub_points.append(self.points[i]) + self.bezier(sub_points) + sub_points.clear() + elif len(sub_points) > 1 and self.points[i] == sub_points[-1]: + self.bezier(sub_points) + sub_points.clear() + + sub_points.append(self.points[i]) + + cpdef bezier(self, list points): + cdef int order = len(points) + cdef float step = 0.25 / constants.SLIDER_QUALITY / order #Normaly 0.0025 + cdef float i = 0 + cdef int n = order - 1 + + cdef float x, y + cdef int p + + while i < 1 + step: + x = 0 + y = 0 + + for p in range(n + 1): + a = mathhelper.cpn(p, n) * ((1 - i) ** (n - p)) * (i ** p) + x += a * points[p].x + y += a * points[p].y + + point = mathhelper.Vec2(x, y) + self.pos.append(point) + i += step + + def point_at_distance(self, length): + return { + 0: False, + 1: self.points[0], + }.get(self.order, self.rec(length)) + + def rec(self, length): + return mathhelper.point_at_distance(self.pos, length) + +cdef class Catmull(object): #Yes... I cry deep down on the inside aswell + cdef public list points, pos + cdef public int order + cdef public float step + + def __init__(self, points): + self.points = points + self.order = len(points) + self.step = 2.5 / constants.SLIDER_QUALITY #Normaly 0.025 + self.pos = [] + self.calc_points() + + cpdef calc_points(self): + if len(self.pos) != 0: #This should never happen but since im working on this I want to warn myself if I fuck up + raise Exception("Catmull was calculated twice!") + + cdef int x + cdef float t + cdef object v1, v2, v3 + for x in range(self.order - 1): + t = 0 + while t < self.step + 1: + if x >= 1: + v1 = self.points[x - 1] + else: + v1 = self.points[x] + + v2 = self.points[x] + + if x + 1 < self.order: + v3 = self.points[x + 1] + else: + v3 = v2.calc(1, v2.calc(-1, v1)) + + if x + 2 < self.order: + v4 = self.points[x + 2] + else: + v4 = v3.calc(1, v3.calc(-1, v2)) + + point = get_point([v1, v2, v3, v4], t) + self.pos.append(point) + t += self.step + + def point_at_distance(self, length): + return { + 0: False, + 1: self.points[0], + }.get(self.order, self.rec(length)) + + def rec(self, length): + return mathhelper.point_at_distance(self.pos, length) + +cdef class Perfect(object): + cdef public list points + cdef float cx, cy + cdef float radius + + def __init__(self, points): + self.points = points + self.cx = 0 + self.cy = 0 + self.radius = 0 + self.setup_path() + + def setup_path(self): + self.cx, self.cy, self.radius = get_circum_circle(self.points) + if is_left(self.points): + self.radius *= -1 + + cpdef point_at_distance(self, float length): + cdef float radians = length / self.radius + return rotate(self.cx, self.cy, self.points[0], radians) + +cpdef object get_point(object p, float length): + cdef float x = mathhelper.catmull([o.x for o in p], length) + cdef float y = mathhelper.catmull([o.y for o in p], length) + return mathhelper.Vec2(x, y) + +cpdef tuple get_circum_circle(list p): + cdef float d = 2 * (p[0].x * (p[1].y - p[2].y) + p[1].x * (p[2].y - p[0].y) + p[2].x * (p[0].y - p[1].y)) + + if d == 0: + raise Exception("Invalid circle! Unable to chose angle.") + + cdef float ux = ((pow(p[0].x, 2) + pow(p[0].y, 2)) * (p[1].y - p[2].y) + (pow(p[1].x, 2) + pow(p[1].y, 2)) * (p[2].y - p[0].y) + (pow(p[2].x, 2) + pow(p[2].y, 2)) * (p[0].y - p[1].y)) / d + cdef float uy = ((pow(p[0].x, 2) + pow(p[0].y, 2)) * (p[2].x - p[1].x) + (pow(p[1].x, 2) + pow(p[1].y, 2)) * (p[0].x - p[2].x) + (pow(p[2].x, 2) + pow(p[2].y, 2)) * (p[1].x - p[0].x)) / d + + cdef float px = ux - p[0].x + cdef float py = uy - p[0].y + cdef float r = pow(pow(px, 2) + pow(py, 2), 0.5) + + return ux, uy, r + +cpdef float is_left(object p): + return ((p[1].x - p[0].x) * (p[2].y - p[0].y) - (p[1].y - p[0].y) * (p[2].x - p[0].x)) < 0 + +cpdef object rotate(float cx, float cy, object p, float radians): + cdef float cos = math.cos(radians) + cdef float sin = math.sin(radians) + + return mathhelper.Vec2((cos * (p.x - cx)) - (sin * (p.y - cy)) + cx, (sin * (p.x - cx)) + (cos * (p.y - cy)) + cy) \ No newline at end of file diff --git a/pp/catch_the_pp/osu_parser/hitobject.pyx b/pp/catch_the_pp/osu_parser/hitobject.pyx new file mode 100644 index 0000000..529f2ea --- /dev/null +++ b/pp/catch_the_pp/osu_parser/hitobject.pyx @@ -0,0 +1,169 @@ +import copy +from . import mathhelper +from . import curves + +cdef class SliderTick: + cdef public float x, y, time + + def __init__(self, x, y, time): + self.x = x + self.y = y + self.time = time + +cdef class HitObject(object): + cdef public float x, y, time, end_time, pixel_length, tick_distance, duration + cdef public int type, repeat + cdef public str slider_type + cdef public list curve_points, ticks, end_ticks, path + cdef public dict timing_point + cdef public object difficulty, end + + def __init__(self, x, y, time, object_type, slider_type = None, curve_points = None, repeat = 1, pixel_length = 0, timing_point = None, difficulty = None, tick_distance = 1): + """ + HitObject params for normal hitobject and sliders + + x -- x position + y -- y position + time -- timestamp + object_type -- type of object (bitmask) + + [+] IF SLIDER + slider_type -- type of slider (L, P, B, C) + curve_points -- points in the curve path + repeat -- amount of repeats for the slider (+1) + pixel_length -- length of the slider + timing_point -- ref of current timing point for the timestamp + difficulty -- ref of beatmap difficulty + tick_distance -- distance betwin each slidertick + """ + self.x = x + self.y = y + self.time = time + self.end_time = 0 + self.type = object_type + + #isSlider? + if 2 & self.type: + self.slider_type = slider_type + self.curve_points = [mathhelper.Vec2(self.x, self.y)] + curve_points + self.repeat = repeat + self.pixel_length = pixel_length + + #For slider tick calculations + self.timing_point = timing_point + self.difficulty = difficulty + self.tick_distance = tick_distance + self.duration = (int(self.timing_point["raw_bpm"]) * (pixel_length / (self.difficulty["SliderMultiplier"] * self.timing_point["spm"])) / 100) * self.repeat + + self.ticks = [] + self.end_ticks = [] + self.path = [] + self.end = None + + self.calc_slider() + + def calc_slider(self, calc_path = False): + #Fix broken objects + if self.slider_type == "P" and len(self.curve_points) > 3: + self.slider_type = "B" + elif len(self.curve_points) == 2: + self.slider_type = "L" + + #Make curve + if self.slider_type == "P": #Perfect + try: + curve = curves.Perfect(self.curve_points) + except: + curve = curves.Bezier(self.curve_points) + self.slider_type = "B" + elif self.slider_type == "B": #Bezier + curve = curves.Bezier(self.curve_points) + elif self.slider_type == "C": #Catmull + curve = curves.Catmull(self.curve_points) + + #Quickest to skip this + if calc_path: #Make path if requested (For drawing visual for testing) + if self.slider_type == "L": #Linear + self.path = curves.Linear(self.curve_points).pos + elif self.slider_type == "P": #Perfect + self.path = [] + l = 0 + step = 5 + while l <= self.pixel_length: + self.path.append(curve.point_at_distance(l)) + l += step + elif self.slider_type == "B": #Bezier + self.path = curve.pos + elif self.slider_type == "C": #Catmull + self.path = curve.pos + else: + raise Exception("Slidertype not supported! ({})".format(self.slider_type)) + + #Set slider ticks + current_distance = self.tick_distance + time_add = self.duration * (self.tick_distance / (self.pixel_length * self.repeat)) + + while current_distance < self.pixel_length - self.tick_distance / 8: + if self.slider_type == "L": #Linear + point = mathhelper.point_on_line(self.curve_points[0], self.curve_points[1], current_distance) + else: #Perfect, Bezier & Catmull uses the same function + point = curve.point_at_distance(current_distance) + + self.ticks.append(SliderTick(point.x, point.y, self.time + time_add * (len(self.ticks) + 1))) + current_distance += self.tick_distance + + #Adds slider_ends / repeat_points + repeat_id = 1 + repeat_bonus_ticks = [] + while repeat_id < self.repeat: + dist = (1 & repeat_id) * self.pixel_length + time_offset = (self.duration / self.repeat) * repeat_id + + if self.slider_type == "L": #Linear + point = mathhelper.point_on_line(self.curve_points[0], self.curve_points[1], dist) + else: #Perfect, Bezier & Catmull uses the same function + point = curve.point_at_distance(dist) + + self.end_ticks.append(SliderTick(point.x, point.y, self.time + time_offset)) + + #Adds the ticks that already exists on the slider back (but reversed) + repeat_ticks = copy.deepcopy(self.ticks) + + if 1 & repeat_id: #We have to reverse the timing normalizer + repeat_ticks = list(reversed(repeat_ticks)) + normalize_time_value = self.time + (self.duration / self.repeat) + else: + normalize_time_value = self.time + + #Correct timing + for tick in repeat_ticks: + tick.time = self.time + time_offset + abs(tick.time - normalize_time_value) + + repeat_bonus_ticks += repeat_ticks + + repeat_id += 1 + + self.ticks += repeat_bonus_ticks + + #Add endpoint for slider + dist_end = (1 & self.repeat) * self.pixel_length + if self.slider_type == "L": #Linear + point = mathhelper.point_on_line(self.curve_points[0], self.curve_points[1], dist_end) + else: #Perfect, Bezier & Catmull uses the same function + point = curve.point_at_distance(dist_end) + + self.end_ticks.append(SliderTick(point.x, point.y, self.time + self.duration)) + + def get_combo(self): + """ + Returns the combo given by this object + 1 if normal hitobject, 2+ if slider (adds sliderticks) + """ + if 2 & self.type: #Slider + val = 1 #Start of the slider + val += len(self.ticks) #The amount of sliderticks + val += self.repeat #Reverse slider + else: #Normal + val = 1 #Itself... + + return val diff --git a/pp/catch_the_pp/osu_parser/mathhelper.pyx b/pp/catch_the_pp/osu_parser/mathhelper.pyx new file mode 100644 index 0000000..5abe957 --- /dev/null +++ b/pp/catch_the_pp/osu_parser/mathhelper.pyx @@ -0,0 +1,124 @@ +import math + +cpdef float clamp(float value, float mn, float mx): + return min(max(mn, value), mx) + +cpdef sign(float value): + if value == 0: + return 0 + elif value > 0: + return 1 + else: + return -1 + +cpdef cpn(int p, int n): + if p < 0 or p > n: + return 0 + p = min(p, n - p) + out = 1 + for i in range(1, p + 1): + out = out * (n - p + i) / i + + return out + +cpdef float catmull(p, t): # WARNING: Worst math formula incomming + return 0.5 * ( + (2 * p[1]) + + (-p[0] + p[2]) * t + + (2 * p[0] - 5 * p[1] + 4 * p[2] - p[3]) * (t ** 2) + + (-p[0] + 3 * p[1] - 3 * p[2] + p[3]) * (t ** 3)) + +cpdef Vec2 point_on_line(Vec2 p0, Vec2 p1, float length): + cdef float full_length = (((p1.x - p0.x) ** 2) + ((p1.y - p0.y) ** 2)) ** 0.5 + cdef float n = full_length - length + + if full_length == 0: #Fix for something that seems unknown... (We warn if this happens) + full_length = 1 + + cdef float x = (n * p0.x + length * p1.x) / full_length + cdef float y = (n * p0.y + length * p1.y) / full_length + + return Vec2(x, y) + +cpdef float angle_from_points(Vec2 p0, Vec2 p1): + return math.atan2(p1.y - p0.y, p1.x - p0.x) + +cpdef float distance_from_points(array): + cdef float distance = 0 + cdef int i + + for i in range(1, len(array)): + distance += array[i].distance(array[i - 1]) + + return distance + +cpdef Vec2 cart_from_pol(r, t): + cdef float x = (r * math.cos(t)) + cdef float y = (r * math.sin(t)) + + return Vec2(x, y) + +cpdef point_at_distance(array, float distance): #TODO: Optimize... + cdef int i = 0 + cdef float x, y, current_distance = 0, new_distance = 0, angle + cdef Vec2 coord, cart + + if len(array) < 2: + return Vec2(0, 0) + + if distance == 0: + return array[0] + + if distance_from_points(array) <= distance: + return array[len(array) - 1] + + for i in range(len(array) - 2): + x = (array[i].x - array[i + 1].x) + y = (array[i].y - array[i + 1].y) + + new_distance = math.sqrt(x * x + y * y) + current_distance += new_distance + + if distance <= current_distance: + break + + current_distance -= new_distance + + if distance == current_distance: + return array[i] + else: + angle = angle_from_points(array[i], array[i + 1]) + cart = cart_from_pol((distance - current_distance), angle) + + if array[i].x > array[i + 1].x: + coord = Vec2((array[i].x - cart.x), (array[i].y - cart.y)) + else: + coord = Vec2((array[i].x + cart.y), (array[i].y + cart.y)) + return coord + +cdef class Vec2(object): + cdef public float x + cdef public float y + + def __init__(self, x, y): + self.x = x + self.y = y + + def __richcmp__(x, y, op): + if op == 2:#Py_EQ + return x.__is_equal(y) + else:#Py_NE + return not x.__is_equal(y) + + def __is_equal(self, other): + return self.x == other.x and self.y == other.y + + cpdef float distance(Vec2 self, Vec2 other): + cdef float x = self.x - other.x + cdef float y = self.y - other.y + return (x*x + y*y) ** 0.5 #sqrt, lol + + cpdef Vec2 calc(Vec2 self, float value, Vec2 other): #I dont know what to call this function yet + cdef float x = self.x + value * other.x + cdef float y = self.y + value * other.y + return Vec2(x, y) diff --git a/pp/catch_the_pp/ppCalc.pyx b/pp/catch_the_pp/ppCalc.pyx new file mode 100644 index 0000000..50ef762 --- /dev/null +++ b/pp/catch_the_pp/ppCalc.pyx @@ -0,0 +1,41 @@ +import math + +cpdef calculate_pp(diff, accuracy, combo, miss): + """ + Calculate pp for gameplay + + diff -- Difficulty object + accuracy -- Accuracy of the play (Float 0-1) + combo -- MaxCombo achived during the play (Int) + miss -- Amount of misses during the play (Int) + return -- Total pp for gameplay + """ + cdef float pp = (((5 * diff.star_rating / 0.0049) - 4) ** 2) / 100000 + cdef float length_bonus = 0.95 + 0.4 * min(1, combo / 3000) + if combo > 3000: + length_bonus += math.log10(combo / 3000) * 0.5 + + pp *= length_bonus + pp *= (0.97 ** miss) + pp *= min((combo ** 0.8) / (diff.beatmap.max_combo ** 0.8), 1) + + if diff.beatmap.difficulty["ApproachRate"] > 9: + pp *= 1 + 0.1 * (diff.beatmap.difficulty["ApproachRate"] - 9) + if diff.beatmap.difficulty["ApproachRate"] < 8: + pp *= 1 + 0.025 * (8 - diff.beatmap.difficulty["ApproachRate"]) + + if diff.mods & 1 << 3 > 0: #HD + pp *= 1.05 + 0.075 * (10 - min(10, diff.beatmap.difficulty["ApproachRate"])) + + if diff.mods & 1 << 10 > 0: #FL + pp *= 1.35 * length_bonus + + pp *= (accuracy ** 5.5) + + if diff.mods & 1 << 0 > 0: #NF + pp *= 0.9 + + if diff.mods & 1 << 12 > 0: #SO + pp *= 0.95 + + return pp diff --git a/pp/catch_the_pp/reanimate.osu b/pp/catch_the_pp/reanimate.osu new file mode 100644 index 0000000..7af35b1 --- /dev/null +++ b/pp/catch_the_pp/reanimate.osu @@ -0,0 +1,899 @@ +osu file format v14 + +[General] +AudioFilename: REANIMATE.mp3 +AudioLeadIn: 0 +PreviewTime: 57263 +Countdown: 0 +SampleSet: Soft +StackLeniency: 0.5 +Mode: 2 +LetterboxInBreaks: 0 +WidescreenStoryboard: 0 + +[Editor] +Bookmarks: 13470,24504,35539,41056,46573,50711,57608,68642,79677,90711,101746,112780,118298,119677,129246,140367,145884 +DistanceSpacing: 0.6 +BeatDivisor: 8 +GridSize: 8 +TimelineZoom: 2.372001 + +[Metadata] +Title:REANIMATE +TitleUnicode:REANIMATE +Artist:Warak +ArtistUnicode:Warak +Creator:- Magic Bomb - +Version:Imagination +Source:节奏大师 +Tags:MBomb rhythm master symphonic drumstep JBHyperion Zirox JBH +BeatmapID:1042702 +BeatmapSetID:489190 + +[Difficulty] +HPDrainRate:6 +CircleSize:4 +OverallDifficulty:9.4 +ApproachRate:9.4 +SliderMultiplier:2.1 +SliderTickRate:2 + +[Events] +//Background and Video events +0,0,"REVIVE.png",0,0 +//Break Periods +//Storyboard Layer 0 (Background) +//Storyboard Layer 1 (Fail) +//Storyboard Layer 2 (Pass) +//Storyboard Layer 3 (Foreground) +//Storyboard Sound Samples + +[TimingPoints] +2436,344.827586206897,4,2,77,100,1,0 +13470,-100,4,2,80,100,0,0 +13556,-100,4,2,78,85,0,0 +24160,-100,4,2,77,80,0,0 +24504,-100,4,2,78,80,0,0 +24677,-100,4,2,77,80,0,0 +27263,-100,4,2,78,80,0,0 +27436,-100,4,2,77,80,0,0 +30022,-100,4,2,78,80,0,0 +30194,-100,4,2,77,80,0,0 +32780,-100,4,2,78,80,0,0 +32953,-100,4,2,77,80,0,0 +35539,-100,4,2,78,90,0,0 +35711,-100,4,2,77,90,0,0 +38298,-100,4,2,78,90,0,0 +38470,-100,4,2,77,90,0,0 +41056,-100,4,2,78,90,0,0 +41229,-100,4,2,77,90,0,0 +43815,-100,4,2,78,90,0,0 +45194,-100,4,2,77,90,0,0 +46573,-100,4,2,78,90,0,1 +46746,-100,4,2,78,90,0,1 +48642,-66.6666666666667,4,2,78,90,0,1 +48987,-100,4,2,78,90,0,1 +49677,-66.6666666666667,4,2,78,90,0,1 +49849,-100,4,2,78,90,0,1 +56229,-66.6666666666667,4,2,78,90,0,1 +57263,-66.6666666666667,4,2,78,80,0,0 +57608,-100,4,2,78,90,0,1 +57780,-100,4,2,78,90,0,1 +63125,-100,4,2,78,90,0,1 +63470,-66.6666666666667,4,2,78,90,0,1 +63815,-100,4,2,78,90,0,1 +64332,-66.6666666666667,4,2,78,90,0,1 +64504,-100,4,2,78,90,0,1 +65539,-66.6666666666667,4,2,78,90,0,1 +65711,-100,4,2,78,90,0,1 +65884,-66.6666666666667,4,2,78,90,0,1 +66573,-100,4,2,78,90,0,1 +66918,-83.3333333333333,4,2,78,90,0,1 +67263,-100,4,2,77,80,0,1 +68642,-100,4,2,78,80,0,0 +78298,-100,4,2,77,80,0,0 +79677,-100,4,2,79,70,0,0 +90711,-100,4,2,78,70,0,0 +99073,-100,4,2,77,90,0,0 +100367,-100,4,2,77,80,0,0 +101056,-100,4,2,77,70,0,0 +101746,-100,4,2,77,80,0,0 +111573,-100,4,2,77,50,0,0 +113125,-100,4,2,77,80,0,0 +118298,-66.6666666666667,4,2,78,90,0,1 +118642,-100,4,2,78,90,0,1 +120711,-83.3333333333333,4,2,78,90,0,1 +121056,-100,4,2,78,90,0,1 +124849,-66.6666666666667,4,2,78,90,0,1 +125022,-100,4,2,78,90,0,1 +125539,-66.6666666666667,4,2,78,90,0,1 +125711,-100,4,2,78,90,0,1 +125884,-66.6666666666667,4,2,78,90,0,1 +126056,-100,4,2,78,90,0,1 +126229,-66.6666666666667,4,2,78,90,0,1 +126401,-100,4,2,78,90,0,1 +128987,-100,4,2,78,90,0,0 +129332,-100,4,2,78,90,0,1 +130194,-66.6666666666667,4,2,78,90,0,1 +130367,-100,4,2,78,90,0,1 +130884,-66.6666666666667,4,2,78,90,0,1 +131056,-100,4,2,78,90,0,1 +133470,-66.6666666666667,4,2,78,90,0,1 +133815,-100,4,2,78,90,0,1 +134158,-66.6666666666667,4,2,78,90,0,1 +134418,-100,4,2,78,90,0,1 +138987,-66.6666666666667,4,2,77,100,0,1 +139677,-83.3333333333333,4,2,77,100,0,1 +140022,-100,4,2,77,100,0,1 +140367,-100,4,2,79,80,0,0 +144504,-100,4,2,77,80,0,0 +145194,-100,4,2,77,100,0,1 +145280,-100,4,2,77,40,0,0 + + +[Colours] +Combo1 : 183,47,49 +Combo2 : 223,170,70 +Combo3 : 84,114,98 +Combo4 : 92,107,131 + +[HitObjects] +192,192,2436,5,4,0:0:0:0: +141,200,2522,1,0,0:0:0:0: +102,168,2608,1,0,0:0:0:0: +101,117,2694,1,0,0:0:0:0: +256,192,2780,1,0,0:0:0:0: +144,192,2953,1,0,0:0:0:0: +392,192,3125,2,0,P|504:112|488:64,1,210,2|0,0:0|0:0,0:0:0:0: +432,48,3556,1,0,0:0:0:0: +376,56,3642,1,0,0:0:0:0: +344,95,3728,1,0,0:0:0:0: +496,192,3815,6,0,L|400:152,2,105,2|0|0,0:0|0:0|0:0,0:0:0:0: +16,192,4504,2,0,L|112:152,2,105,2|0|0,0:0|0:0|0:0,0:0:0:0: +448,192,5194,5,4,0:0:0:0: +422,146,5280,1,0,0:0:0:0: +379,117,5366,1,0,0:0:0:0: +327,110,5452,1,0,0:0:0:0: +224,192,5539,1,0,0:0:0:0: +496,192,5711,1,0,0:0:0:0: +160,192,5884,2,0,P|88:80|120:56,1,210,2|0,0:0|0:0,0:0:0:0: +392,192,6401,1,0,0:0:0:0: +96,192,6573,5,2,0:0:0:0: +96,192,6832,1,0,0:0:0:0: +256,192,6918,2,0,B|184:120|184:120|128:120,1,157.5,2|0,0:0|0:0,0:0:0:0: +416,192,7263,1,2,0:0:0:0: +416,192,7522,1,0,0:0:0:0: +256,192,7608,2,0,B|328:120|328:120|384:120,1,157.5,2|0,0:0|0:0,0:0:0:0: +176,192,7953,5,4,0:0:0:0: +112,192,8039,1,0,0:0:0:0: +112,192,8125,1,0,0:0:0:0: +176,192,8211,1,0,0:0:0:0: +272,192,8298,1,0,0:0:0:0: +16,192,8470,1,0,0:0:0:0: +272,192,8642,2,0,L|496:192,1,210,2|0,0:0|0:0,0:0:0:0: +320,192,9160,1,0,0:0:0:0: +482,192,9332,5,2,0:0:0:0: +308,192,9504,2,0,L|244:192,1,52.5 +164,192,9677,2,0,L|220:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +372,192,9849,2,0,L|308:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +116,192,10022,2,0,P|52:88|108:56,1,210,2|0,0:0|0:0,0:0:0:0: +448,192,10539,1,2,0:0:0:0: +256,192,10625,1,0,0:0:0:0: +64,192,10711,5,4,0:0:0:0: +256,192,10970,1,0,0:0:0:0: +448,192,11056,1,2,0:0:0:0: +256,192,11315,1,0,0:0:0:0: +96,192,11401,1,2,0:0:0:0: +256,192,11660,1,0,0:0:0:0: +400,192,11746,1,2,0:0:0:0: +224,192,12004,1,2,0:0:0:0: +224,192,12091,5,0,0:0:0:0: +464,192,12263,2,0,L|411:192,1,52.5 +176,192,12436,2,0,P|96:120|160:88,1,210,2|2,0:0|0:0,0:0:0:0: +208,192,12867,2,0,L|272:192,2,52.5 +144,192,13125,2,0,P|40:128|40:112,1,157.5,2|0,0:0|0:0,0:0:0:0: +288,192,13470,5,4,0:0:0:0: +235,192,13556,1,0,0:0:0:0: +182,192,13642,1,0,0:0:0:0: +130,192,13728,1,0,0:0:0:0: +288,192,13815,2,0,L|392:192,1,105,2|0,0:0|0:0,0:0:0:0: +120,192,14160,2,0,P|47:144|96:80,1,157.5,8|0,0:0|0:0,0:0:0:0: +256,192,14504,2,0,L|320:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +256,192,14677,2,0,L|192:192,1,52.5 +32,192,14849,5,2,0:0:0:0: +176,192,15022,1,2,0:0:0:0: +32,192,15194,2,0,L|192:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +480,192,15539,1,8,0:0:0:0: +368,192,15712,1,0,0:0:0:0: +480,192,15884,2,0,L|320:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +136,192,16229,5,2,0:0:0:0: +186,185,16315,1,0,0:0:0:0: +215,143,16401,1,0,0:0:0:0: +204,93,16487,1,0,0:0:0:0: +128,192,16573,1,2,0:0:0:0: +384,192,16746,1,0,0:0:0:0: +64,192,16918,2,0,P|120:96|216:80,1,210,8|2,0:0|0:0,0:0:0:0: +488,192,17436,1,0,0:0:0:0: +199,192,17608,6,0,L|272:112,1,105,2|2,0:0|0:0,0:0:0:0: +184,192,17867,1,0,0:0:0:0: +16,192,17953,2,0,L|184:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +320,192,18298,1,8,0:0:0:0: +224,192,18557,1,0,0:0:0:0: +392,192,18642,2,0,L|224:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +88,192,18987,5,2,0:0:0:0: +16,192,19073,1,0,0:0:0:0: +16,192,19160,1,0,0:0:0:0: +64,192,19246,1,0,0:0:0:0: +136,192,19332,1,2,0:0:0:0: +408,192,19504,1,0,0:0:0:0: +136,192,19677,2,0,P|224:136|272:184,1,157.5,8|0,0:0|0:0,0:0:0:0: +64,192,20022,2,0,P|32:128|56:120,1,105,2|0,0:0|0:0,0:0:0:0: +320,192,20367,5,2,0:0:0:0: +448,192,20539,2,0,L|392:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +240,192,20711,2,0,L|184:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +344,192,20884,2,0,L|280:192,1,52.5 +128,192,21056,2,0,P|48:112|104:64,1,210,8|2,0:0|0:0,0:0:0:0: +416,192,21573,2,0,L|456:152,1,52.5 +256,192,21746,6,0,L|144:192,1,105,2|0,0:0|0:0,0:0:0:0: +216,192,22004,1,0,0:0:0:0: +368,192,22091,1,0,0:0:0:0: +417,179,22177,1,0,0:0:0:0: +441,134,22263,1,0,0:0:0:0: +425,86,22349,1,0,0:0:0:0: +160,192,22436,2,0,P|72:112|208:48,1,315,8|0,0:0|0:0,0:0:0:0: +352,192,23039,1,0,0:0:0:0: +496,192,23125,5,2,0:0:0:0: +400,192,23298,2,0,L|512:192,1,105,2|2,0:0|0:0,0:0:0:0: +48,192,23814,1,8,0:0:0:0: +176,192,24160,2,0,L|88:136,1,105,2|0,0:0|0:0,0:0:0:0: +352,192,24504,5,2,0:0:0:0: +192,192,24849,2,0,L|416:192,1,210,0|2,0:0|0:0,0:0:0:0: +64,192,25539,2,0,L|288:192,1,210,0|2,0:0|0:0,0:0:0:0: +496,192,26229,2,0,L|272:192,2,210,2|0|2,0:0|0:0|0:0,0:0:0:0: +32,192,27263,6,0,L|120:136,1,105,2|0,0:0|0:0,0:0:0:0: +304,192,27608,2,0,P|384:120|360:88,1,157.5,2|0,0:0|0:0,0:0:0:0: +176,192,27953,2,0,B|384:168|384:168|272:168,1,315,2|0,0:0|0:0,0:0:0:0: +16,192,28642,1,2,0:0:0:0: +176,192,28987,2,0,L|392:192,2,210,2|0|0,0:0|0:0|0:0,0:0:0:0: +496,192,30022,6,0,L|384:192,1,105,2|0,0:0|0:0,0:0:0:0: +112,192,30367,2,0,P|40:104|80:64,1,157.5,2|0,0:0|0:0,0:0:0:0: +168,192,30711,2,0,L|328:192,1,157.5 +168,192,31056,2,0,L|8:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +168,192,31401,2,0,B|464:168|424:72|352:72,1,315,2|0,0:0|0:0,0:0:0:0: +72,72,32091,2,0,B|16:70|-23:166|272:190,1,315,2|0,0:0|0:0,0:0:0:0: +16,192,32780,5,2,0:0:0:0: +256,192,33125,2,0,L|40:192,1,210,2|0,0:0|0:0,0:0:0:0: +352,192,33815,2,0,P|400:112|352:72,1,157.5,2|0,0:0|0:0,0:0:0:0: +176,192,34160,6,0,L|392:192,1,210,2|0,0:0|0:0,0:0:0:0: +256,192,34677,1,0,0:0:0:0: +496,192,34849,2,0,L|280:192,1,210,2|0,0:0|0:0,0:0:0:0: +16,192,35539,6,0,L|128:192,1,105,2|0,0:0|0:0,0:0:0:0: +288,192,35884,2,0,L|184:192,1,105,2|0,0:0|0:0,0:0:0:0: +496,192,36229,2,0,L|384:192,1,105 +224,192,36573,2,0,L|112:192,1,105,2|0,0:0|0:0,0:0:0:0: +384,192,36918,6,0,L|272:192,1,105,2|0,0:0|0:0,0:0:0:0: +24,192,37263,2,0,L|240:192,2,210,0|2|2,0:0|0:0|0:0,0:0:0:0: +176,192,38125,1,0,0:0:0:0: +432,192,38298,6,0,L|328:192,1,105,2|0,0:0|0:0,0:0:0:0: +496,192,38642,2,0,L|384:192,1,105,2|0,0:0|0:0,0:0:0:0: +128,192,38987,2,0,L|8:192,1,105 +192,192,39332,2,0,L|304:192,1,105,2|0,0:0|0:0,0:0:0:0: +23,192,39677,6,0,L|135:192,1,105,2|0,0:0|0:0,0:0:0:0: +383,192,40022,2,0,L|167:192,2,210,0|2|2,0:0|0:0|0:0,0:0:0:0: +480,192,40884,1,0,0:0:0:0: +176,192,41056,5,2,0:0:0:0: +304,192,41229,1,0,0:0:0:0: +24,192,41401,2,0,L|128:192,1,105,2|0,0:0|0:0,0:0:0:0: +400,192,41746,2,0,L|505:192,1,105 +129,192,42091,2,0,L|24:192,1,105,2|0,0:0|0:0,0:0:0:0: +383,192,42436,6,0,L|488:192,2,105,2|0|0,0:0|0:0|0:0,0:0:0:0: +88,192,42953,1,0,0:0:0:0: +344,192,43125,2,0,L|239:192,1,105,2|0,0:0|0:0,0:0:0:0: +496,192,43470,2,0,L|336:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +160,192,43815,6,0,L|48:192,3,105,2|0|2|0,0:0|0:0|0:0|0:0,0:0:0:0: +352,192,44504,2,0,L|464:192,3,105,2|0|2|0,0:0|0:0|0:0|0:0,0:0:0:0: +192,192,45194,5,2,0:0:0:0: +456,192,45539,1,0,0:0:0:0: +32,192,45884,2,0,P|104:96|328:120,1,367.5,2|0,0:0|0:0,0:0:0:0: +184,192,46573,6,0,L|24:192,1,157.5,6|0,0:0|0:0,0:0:0:0: +184,192,46918,1,8,0:0:0:0: +64,192,47091,1,0,0:0:0:0: +344,192,47263,2,0,L|400:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +192,192,47436,2,0,L|136:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +400,192,47608,1,8,0:0:0:0: +128,192,47780,2,0,L|176:168,1,52.5,2|0,0:0|0:0,0:0:0:0: +352,192,47953,6,0,P|404:184|452:160,1,105,2|0,0:0|0:0,0:0:0:0: +180,192,48298,1,8,0:0:0:0: +452,192,48470,2,0,L|396:192,1,52.5 +96,192,48642,1,0,0:0:0:0: +110,155,48685,1,0,0:0:0:0: +137,127,48728,1,0,0:0:0:0: +174,113,48771,1,0,0:0:0:0: +213,114,48814,1,0,0:0:0:0: +248,130,48857,1,0,0:0:0:0: +274,159,48900,1,0,0:0:0:0: +287,196,48943,1,0,0:0:0:0: +128,192,48987,2,0,L|24:192,1,105,8|0,0:0|0:0,0:0:0:0: +320,192,49332,6,0,L|496:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +320,192,49677,2,0,L|224:192,1,78.7500030040742,8|0,0:0|0:0,0:0:0:0: +80,192,49849,2,0,L|136:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +288,192,50022,2,0,L|232:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +64,192,50194,2,0,L|120:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +312,192,50367,2,0,L|272:152,1,52.5,8|0,0:0|0:0,0:0:0:0: +120,192,50539,2,0,L|176:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +336,192,50711,6,0,L|224:192,1,105,2|0,0:0|0:0,0:0:0:0: +496,192,51056,2,0,L|384:192,1,105,8|0,0:0|0:0,0:0:0:0: +224,192,51401,2,0,L|352:192,1,105,2|2,0:0|0:0,0:0:0:0: +272,192,51660,1,2,0:0:0:0: +120,192,51746,2,0,L|8:192,1,105,8|2,0:0|0:0,0:0:0:0: +360,192,52091,6,0,L|464:192,1,105,2|0,0:0|0:0,0:0:0:0: +192,192,52436,1,8,0:0:0:0: +464,192,52608,1,0,0:0:0:0: +484,176,52651,1,0,0:0:0:0: +497,153,52694,1,0,0:0:0:0: +497,127,52737,1,0,0:0:0:0: +360,192,52780,1,2,0:0:0:0: +200,192,52867,1,2,0:0:0:0: +40,192,52953,1,2,0:0:0:0: +360,192,53125,1,8,0:0:0:0: +40,192,53298,2,0,L|88:168,1,52.5 +240,192,53470,5,2,0:0:0:0: +490,192,53642,2,0,L|418:192,1,52.5 +256,192,53815,1,8,0:0:0:0: +112,192,53987,2,0,L|168:192,1,52.5 +328,192,54160,5,0,0:0:0:0: +353,196,54203,1,0,0:0:0:0: +378,188,54246,1,0,0:0:0:0: +395,169,54289,1,0,0:0:0:0: +400,144,54332,1,0,0:0:0:0: +393,119,54375,1,0,0:0:0:0: +374,101,54418,1,0,0:0:0:0: +348,95,54461,1,0,0:0:0:0: +216,192,54504,5,8,0:0:0:0: +190,196,54547,1,0,0:0:0:0: +165,188,54590,1,0,0:0:0:0: +148,169,54633,1,0,0:0:0:0: +143,144,54676,1,0,0:0:0:0: +150,119,54719,1,0,0:0:0:0: +169,101,54762,1,0,0:0:0:0: +195,95,54805,1,0,0:0:0:0: +72,192,54849,6,0,P|24:128|80:64,1,157.5,2|0,0:0|0:0,0:0:0:0: +256,192,55194,1,8,0:0:0:0: +448,192,55280,1,2,0:0:0:0: +256,192,55367,1,2,0:0:0:0: +64,192,55453,1,2,0:0:0:0: +256,192,55539,2,0,L|320:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +116,192,55711,2,0,L|60:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +256,192,55884,2,0,L|320:192,1,52.5,8|0,0:0|0:0,0:0:0:0: +116,192,56056,2,0,L|60:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +336,192,56229,6,0,L|496:192,1,157.500006008148,8|0,0:0|0:0,0:0:0:0: +176,192,56573,2,0,L|16:192,1,157.500006008148,8|0,0:0|0:0,0:0:0:0: +336,192,56918,5,8,0:0:0:0: +410,190,57004,1,2,0:0:0:0: +440,122,57090,1,2,0:0:0:0: +390,66,57176,1,2,0:0:0:0: +176,192,57263,2,0,P|96:112|168:48,1,236.250009012223,8|0,0:0|0:0,0:0:0:0: +352,192,57608,6,0,L|456:192,1,105,6|0,0:0|0:0,0:0:0:0: +192,192,57953,1,8,0:0:0:0: +456,192,58125,2,0,L|400:192,1,52.5 +192,192,58298,2,0,L|192:136,1,52.5,2|0,0:0|0:0,0:0:0:0: +352,192,58470,2,0,L|328:144,1,52.5,2|0,0:0|0:0,0:0:0:0: +128,192,58642,1,8,0:0:0:0: +72,192,58729,2,0,L|176:192,1,105 +328,192,58987,5,2,0:0:0:0: +64,192,59160,2,0,L|8:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +177,192,59332,2,0,L|241:192,1,52.5,8|0,0:0|0:0,0:0:0:0: +64,192,59504,2,0,L|8:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +176,192,59677,2,0,L|232:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +64,192,59849,2,0,L|8:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +192,192,60022,1,8,0:0:0:0: +480,192,60194,2,0,L|432:168,1,52.5 +256,192,60367,6,0,L|368:192,1,105,2|0,0:0|0:0,0:0:0:0: +71,192,60711,2,0,L|175:192,1,105,8|0,0:0|0:0,0:0:0:0: +256,192,60970,1,0,0:0:0:0: +441,192,61056,2,0,L|337:192,1,105,2|2,0:0|0:0,0:0:0:0: +48,192,61401,1,8,0:0:0:0: +30,172,61444,1,0,0:0:0:0: +24,147,61487,1,0,0:0:0:0: +30,122,61530,1,0,0:0:0:0: +48,103,61573,1,0,0:0:0:0: +320,192,61746,5,2,0:0:0:0: +456,192,61918,1,2,0:0:0:0: +192,192,62091,1,8,0:0:0:0: +56,192,62263,1,2,0:0:0:0: +320,192,62436,2,0,L|216:192,1,105,2|2,0:0|0:0,0:0:0:0: +288,192,62694,1,2,0:0:0:0: +448,192,62780,1,8,0:0:0:0: +96,192,62953,1,2,0:0:0:0: +384,192,63125,6,0,L|496:192,1,105,2|0,0:0|0:0,0:0:0:0: +424,192,63384,1,0,0:0:0:0: +176,192,63470,2,0,B|32:192|32:192|51:144|96:120,1,236.250009012223,8|0,0:0|0:0,0:0:0:0: +240,192,63815,1,2,0:0:0:0: +384,192,63901,1,2,0:0:0:0: +240,192,63987,1,2,0:0:0:0: +96,192,64073,1,2,0:0:0:0: +288,192,64160,2,0,L|368:192,1,52.5,8|0,0:0|0:0,0:0:0:0: +192,192,64332,2,0,L|96:192,1,78.7500030040742,2|0,0:0|0:0,0:0:0:0: +288,192,64504,6,0,P|384:136|384:88,1,157.5,2|0,0:0|0:0,0:0:0:0: +224,192,64849,2,0,L|160:192,1,52.5,8|0,0:0|0:0,0:0:0:0: +328,192,65022,2,0,L|392:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +224,192,65194,2,0,L|160:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +344,192,65367,2,0,L|408:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +240,192,65539,2,0,L|160:192,1,78.7500030040742,8|0,0:0|0:0,0:0:0:0: +16,192,65711,2,0,L|80:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +256,192,65884,6,0,B|416:192|416:192|384:144|320:120,1,236.250009012223,2|0,0:0|0:0,0:0:0:0: +128,192,66229,1,8,0:0:0:0: +48,192,66315,2,0,L|208:192,1,157.500006008148 +376,192,66573,1,8,0:0:0:0: +205,192,66660,1,2,0:0:0:0: +120,192,66746,2,0,L|176:192,1,52.5,2|2,0:0|0:0,0:0:0:0: +336,192,66918,2,0,L|208:192,1,125.999996154785,8|2,0:0|0:0,0:0:0:0: +480,192,67263,6,0,B|488:112|480:48|432:24|336:16|232:48,1,367.5,2|0,0:0|0:0,0:0:0:0: +32,192,67953,2,0,B|24:112|32:48|80:24|176:16|280:48,1,367.5,2|0,0:0|0:0,0:0:0:0: +120,192,68642,6,0,P|48:168|48:88,1,157.5,2|0,0:0|0:0,0:0:0:0: +120,192,68987,2,0,P|248:120|248:96,1,157.5,2|0,0:0|0:0,0:0:0:0: +96,192,69332,1,8,0:0:0:0: +352,192,69504,2,0,L|408:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +248,192,69677,2,0,L|192:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +352,192,69849,2,0,L|408:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +232,192,70022,6,0,L|176:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +128,192,70194,1,2,0:0:0:0: +264,192,70367,1,2,0:0:0:0: +392,192,70539,2,0,L|328:192,1,52.5 +168,192,70711,5,8,0:0:0:0: +142,199,70754,1,0,0:0:0:0: +116,199,70797,1,0,0:0:0:0: +91,193,70840,1,0,0:0:0:0: +68,180,70883,1,0,0:0:0:0: +50,162,70926,1,0,0:0:0:0: +36,139,70969,1,0,0:0:0:0: +30,114,71012,1,0,0:0:0:0: +30,87,71055,1,0,0:0:0:0: +37,62,71098,1,0,0:0:0:0: +51,40,71142,1,0,0:0:0:0: +70,22,71185,1,0,0:0:0:0: +93,9,71228,1,0,0:0:0:0: +118,4,71271,1,0,0:0:0:0: +144,5,71314,1,0,0:0:0:0: +169,12,71357,1,0,0:0:0:0: +280,192,71401,6,0,P|392:120|368:72,1,210,2|2,0:0|0:0,0:0:0:0: +160,192,72004,1,0,0:0:0:0: +336,192,72091,1,8,0:0:0:0: +283,192,72177,1,2,0:0:0:0: +230,192,72263,1,2,0:0:0:0: +177,192,72349,1,2,0:0:0:0: +124,192,72435,1,2,0:0:0:0: +88,192,72522,1,2,0:0:0:0: +144,192,72608,1,2,0:0:0:0: +224,192,72694,1,2,0:0:0:0: +400,192,72780,6,0,L|504:192,1,105,2|2,0:0|0:0,0:0:0:0: +416,192,73125,1,0,0:0:0:0: +8,192,73470,2,0,L|120:192,1,105,8|0,0:0|0:0,0:0:0:0: +32,192,73815,2,0,L|192:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +344,192,74160,6,0,L|456:192,1,105,2|0,0:0|0:0,0:0:0:0: +288,192,74504,2,0,L|176:192,1,105,2|0,0:0|0:0,0:0:0:0: +464,192,74849,2,0,L|408:192,1,52.5,8|0,0:0|0:0,0:0:0:0: +256,192,75022,2,0,L|192:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +352,192,75194,2,0,L|296:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +144,192,75367,2,0,L|80:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +240,192,75539,6,0,L|176:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +40,192,75711,1,2,0:0:0:0: +299,192,75884,2,0,L|352:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +496,192,76056,2,0,L|440:192,1,52.5 +280,192,76229,1,8,0:0:0:0: +254,186,76272,1,0,0:0:0:0: +235,168,76315,1,0,0:0:0:0: +227,144,76358,1,0,0:0:0:0: +232,118,76401,1,0,0:0:0:0: +249,99,76444,1,0,0:0:0:0: +274,90,76487,1,0,0:0:0:0: +299,95,76530,1,0,0:0:0:0: +408,192,76573,2,0,P|488:112|464:80,1,157.5 +288,192,76918,6,0,P|176:112|200:64,1,210,2|2,0:0|0:0,0:0:0:0: +352,192,77522,1,0,0:0:0:0: +208,192,77608,1,8,0:0:0:0: +157,199,77694,1,2,0:0:0:0: +112,173,77780,1,2,0:0:0:0: +95,124,77866,1,2,0:0:0:0: +111,76,77952,1,2,0:0:0:0: +155,48,78039,1,2,0:0:0:0: +240,192,78125,1,2,0:0:0:0: +292,192,78211,1,2,0:0:0:0: +144,192,78298,6,0,L|32:192,3,105,2|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0: +368,192,78987,2,0,L|480:192,3,105,2|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0: +136,192,79677,6,0,P|24:96|152:64,1,341.25,4|0,0:0|0:0,0:0:0:0: +376,192,80367,2,0,P|488:96|360:64,1,341.25,8|0,0:0|0:0,0:0:0:0: +96,192,81056,6,0,L|0:144,2,105,2|2|2,0:0|0:0|0:0,0:0:0:0: +504,192,81746,1,8,0:0:0:0: +336,192,82091,2,0,L|448:192,1,105 +160,192,82436,6,0,B|8:192|8:192|56:96|152:80,1,341.25,4|0,0:0|0:0,0:0:0:0: +352,192,83125,2,0,B|504:192|504:192|456:96|360:80,1,341.25,8|0,0:0|0:0,0:0:0:0: +224,192,83815,6,0,L|112:192,2,105,2|2|2,0:0|0:0|0:0,0:0:0:0: +464,192,84504,1,8,0:0:0:0: +336,192,84677,1,0,0:0:0:0: +496,192,84849,1,0,0:0:0:0: +336,192,85022,1,0,0:0:0:0: +48,192,85194,6,0,L|272:192,2,210,4|0|8,0:0|0:0|0:0,0:0:0:0: +464,192,86229,2,0,L|240:192,2,210,0|2|2,0:0|0:0|0:0,0:0:0:0: +248,192,87263,2,0,L|136:192,1,105,8|0,0:0|0:0,0:0:0:0: +264,192,87608,2,0,L|376:192,1,105 +104,192,87953,5,4,0:0:0:0: +8,192,88125,2,0,L|64:192,1,52.5 +120,192,88298,2,0,L|32:136,1,105 +320,192,88642,1,8,0:0:0:0: +424,192,88987,1,0,0:0:0:0: +394,192,89101,1,0,0:0:0:0: +324,192,89216,1,0,0:0:0:0: +112,192,89332,6,0,L|224:192,1,105,2|2,0:0|0:0,0:0:0:0: +384,192,89677,2,0,L|288:192,1,70,2|0,0:0|0:0,0:0:0:0: +224,192,89907,1,0,0:0:0:0: +48,192,90022,2,0,L|128:192,1,70,8|0,0:0|0:0,0:0:0:0: +208,192,90252,1,0,0:0:0:0: +280,192,90367,2,0,L|176:192,1,105,2|0,0:0|0:0,0:0:0:0: +256,192,90625,1,0,0:0:0:0: +416,192,90711,6,0,L|488:192,2,70,6|0|0,0:0|0:0|0:0,0:0:0:0: +208,192,91056,1,0,0:0:0:0: +181,192,91099,1,0,0:0:0:0: +157,184,91142,1,0,0:0:0:0: +136,168,91185,1,0,0:0:0:0: +123,146,91228,1,0,0:0:0:0: +118,120,91271,1,0,0:0:0:0: +122,94,91314,1,0,0:0:0:0: +135,72,91357,1,0,0:0:0:0: +256,192,91401,6,0,L|336:192,2,70,8|0|0,0:0|0:0|0:0,0:0:0:0: +168,192,91746,2,0,L|88:192,2,70 +384,192,92091,5,2,0:0:0:0: +410,191,92134,1,0,0:0:0:0: +434,181,92177,1,0,0:0:0:0: +452,163,92220,1,0,0:0:0:0: +424,192,92263,1,2,0:0:0:0: +397,192,92306,1,0,0:0:0:0: +373,182,92349,1,0,0:0:0:0: +355,164,92392,1,0,0:0:0:0: +232,192,92436,2,0,L|152:192,2,70,2|0|0,0:0|0:0|0:0,0:0:0:0: +432,192,92780,6,0,L|504:192,2,70,8|0|0,0:0|0:0|0:0,0:0:0:0: +337,192,93125,2,0,L|225:192,1,105,2|0,0:0|0:0,0:0:0:0: +496,192,93470,6,0,L|408:192,2,70,2|0|0,0:0|0:0|0:0,0:0:0:0: +320,192,93815,1,0,0:0:0:0: +294,196,93858,1,0,0:0:0:0: +268,191,93901,1,0,0:0:0:0: +246,177,93944,1,0,0:0:0:0: +231,156,93987,1,0,0:0:0:0: +224,131,94030,1,0,0:0:0:0: +226,105,94073,1,0,0:0:0:0: +238,82,94116,1,0,0:0:0:0: +352,192,94160,6,0,L|464:192,2,70,8|0|0,0:0|0:0|0:0,0:0:0:0: +160,192,94504,2,0,L|48:192,2,70 +352,192,94849,5,2,0:0:0:0: +325,192,94892,1,0,0:0:0:0: +299,192,94935,1,0,0:0:0:0: +288,192,94978,1,0,0:0:0:0: +299,192,95022,1,2,0:0:0:0: +325,192,95065,1,0,0:0:0:0: +351,192,95108,1,0,0:0:0:0: +377,192,95151,1,0,0:0:0:0: +272,192,95194,2,0,L|217:144,2,70,2|0|0,0:0|0:0|0:0,0:0:0:0: +72,192,95539,6,0,L|16:144,2,70,8|0|0,0:0|0:0|0:0,0:0:0:0: +280,192,95884,2,0,L|392:192,1,105,2|0,0:0|0:0,0:0:0:0: +96,192,96229,5,2,0:0:0:0: +288,192,96344,1,0,0:0:0:0: +488,192,96458,1,0,0:0:0:0: +256,192,96573,1,0,0:0:0:0: +229,193,96616,1,0,0:0:0:0: +204,185,96659,1,0,0:0:0:0: +183,170,96702,1,0,0:0:0:0: +168,149,96745,1,0,0:0:0:0: +160,124,96788,1,0,0:0:0:0: +160,98,96831,1,0,0:0:0:0: +169,74,96874,1,0,0:0:0:0: +288,192,96918,5,8,0:0:0:0: +480,192,97033,1,0,0:0:0:0: +288,192,97147,1,0,0:0:0:0: +80,192,97263,1,0,0:0:0:0: +272,192,97378,1,0,0:0:0:0: +464,192,97492,1,0,0:0:0:0: +256,192,97608,5,2,0:0:0:0: +232,183,97651,1,0,0:0:0:0: +217,162,97694,1,0,0:0:0:0: +224,136,97737,1,0,0:0:0:0: +256,192,97780,1,2,0:0:0:0: +281,183,97823,1,0,0:0:0:0: +296,162,97866,1,0,0:0:0:0: +297,136,97909,1,0,0:0:0:0: +160,192,97953,2,0,L|80:192,2,70,2|0|0,0:0|0:0|0:0,0:0:0:0: +352,192,98298,6,0,L|432:192,2,70,8|0|0,0:0|0:0|0:0,0:0:0:0: +160,192,98642,2,0,L|40:192,1,105,2|0,0:0|0:0,0:0:0:0: +296,192,98987,5,6,0:0:0:0: +488,192,99102,1,0,0:0:0:0: +296,192,99217,1,0,0:0:0:0: +72,192,99332,1,0,0:0:0:0: +46,189,99375,1,0,0:0:0:0: +24,175,99418,1,0,0:0:0:0: +10,153,99461,1,0,0:0:0:0: +7,127,99504,1,0,0:0:0:0: +17,103,99547,1,0,0:0:0:0: +32,80,99590,1,0,0:0:0:0: +48,72,99633,1,0,0:0:0:0: +152,192,99677,5,2,0:0:0:0: +328,192,99792,1,0,0:0:0:0: +152,192,99907,1,0,0:0:0:0: +440,192,100022,1,0,0:0:0:0: +264,192,100137,1,0,0:0:0:0: +88,192,100252,1,0,0:0:0:0: +264,192,100367,5,4,0:0:0:0: +296,192,100410,1,0,0:0:0:0: +296,192,100453,1,0,0:0:0:0: +264,192,100496,1,0,0:0:0:0: +232,192,100539,1,0,0:0:0:0: +208,192,100582,1,0,0:0:0:0: +208,192,100625,1,0,0:0:0:0: +232,192,100668,1,0,0:0:0:0: +344,192,100711,1,2,0:0:0:0: +152,192,101056,1,2,0:0:0:0: +408,192,101401,1,2,0:0:0:0: +64,192,101746,5,4,0:0:0:0: +20,168,101832,1,0,0:0:0:0: +24,119,101918,1,0,0:0:0:0: +72,104,102004,1,0,0:0:0:0: +160,192,102091,2,0,L|296:192,1,105 +416,192,102436,2,0,L|256:192,1,157.5,2|0,0:0|0:0,0:0:0:0: +336,192,102780,2,0,L|400:192,1,52.5 +288,192,102953,2,0,L|224:192,1,52.5 +80,192,103125,6,0,L|184:192,1,105,2|0,0:0|0:0,0:0:0:0: +464,192,103470,1,2,0:0:0:0: +436,147,103556,1,0,0:0:0:0: +396,113,103642,1,0,0:0:0:0: +350,89,103728,1,0,0:0:0:0: +300,73,103815,1,2,0:0:0:0: +248,66,103901,1,0,0:0:0:0: +195,67,103987,1,0,0:0:0:0: +145,81,104073,1,0,0:0:0:0: +110,118,104159,1,2,0:0:0:0: +124,167,104245,1,0,0:0:0:0: +158,207,104332,1,0,0:0:0:0: +198,241,104418,1,0,0:0:0:0: +360,192,104504,5,4,0:0:0:0: +407,174,104590,1,0,0:0:0:0: +426,127,104676,1,0,0:0:0:0: +403,82,104762,1,0,0:0:0:0: +208,192,104849,2,0,L|104:192,1,105 +384,192,105194,2,0,P|476:146|432:56,1,210,2|0,0:0|0:0,0:0:0:0: +160,192,105711,1,0,0:0:0:0: +456,192,105884,5,2,0:0:0:0: +456,192,106142,1,0,0:0:0:0: +272,192,106229,1,2,0:0:0:0: +220,180,106315,1,0,0:0:0:0: +170,164,106401,1,0,0:0:0:0: +123,141,106487,1,0,0:0:0:0: +91,101,106573,1,2,0:0:0:0: +125,65,106660,1,0,0:0:0:0: +175,51,106746,1,0,0:0:0:0: +227,45,106832,1,0,0:0:0:0: +280,42,106918,1,2,0:0:0:0: +332,42,107004,1,0,0:0:0:0: +385,44,107091,1,0,0:0:0:0: +437,47,107177,1,0,0:0:0:0: +240,192,107263,5,4,0:0:0:0: +168,192,107349,1,0,0:0:0:0: +216,192,107436,1,0,0:0:0:0: +280,192,107522,1,0,0:0:0:0: +440,192,107608,2,0,L|336:192,1,105 +32,192,107953,2,0,P|64:112|176:64,1,210,2|0,0:0|0:0,0:0:0:0: +112,192,108470,1,0,0:0:0:0: +384,192,108642,5,2,0:0:0:0: +480,192,108815,2,0,L|424:192,1,52.5 +256,192,108987,1,2,0:0:0:0: +200,192,109073,1,0,0:0:0:0: +144,192,109159,1,0,0:0:0:0: +98,192,109245,1,0,0:0:0:0: +256,192,109332,1,2,0:0:0:0: +308,192,109418,1,0,0:0:0:0: +361,192,109504,1,0,0:0:0:0: +413,192,109590,1,0,0:0:0:0: +256,192,109677,1,2,0:0:0:0: +16,192,109849,2,0,L|80:192,1,52.5 +256,192,110022,6,0,L|144:192,1,105,4|0,0:0|0:0,0:0:0:0: +100,185,110280,1,0,0:0:0:0: +67,146,110366,1,2,0:0:0:0: +70,95,110452,1,0,0:0:0:0: +107,59,110538,1,0,0:0:0:0: +159,59,110625,1,0,0:0:0:0: +328,192,110711,1,2,0:0:0:0: +373,169,110797,1,0,0:0:0:0: +382,119,110883,1,0,0:0:0:0: +347,82,110969,1,0,0:0:0:0: +256,192,111056,1,2,0:0:0:0: +203,192,111142,1,0,0:0:0:0: +151,192,111228,1,0,0:0:0:0: +304,192,111315,1,0,0:0:0:0: +464,192,111401,5,4,0:0:0:0: +256,192,111573,12,0,112780,0:0:0:0: +224,192,113125,6,0,L|448:192,1,210,2|0,0:0|0:0,0:0:0:0: +16,192,113815,1,2,0:0:0:0: +480,192,114160,6,0,L|152:192,1,315,2|0,0:0|0:0,0:0:0:0: +32,192,114849,2,0,L|256:192,1,210,2|0,0:0|0:0,0:0:0:0: +480,192,115539,2,0,B|360:96|136:104|152:200|112:288|112:288,2,420,2|2|2,0:0|0:0|0:0,0:0:0:0: +400,192,117091,5,0,0:0:0:0: +347,192,117177,1,0,0:0:0:0: +295,192,117263,1,2,0:0:0:0: +224,192,117349,1,0,0:0:0:0: +62,192,117436,2,0,L|126:192,1,52.5 +277,192,117608,1,4,0:0:0:0: +96,192,117953,2,0,P|16:120|32:96,1,157.5 +256,192,118298,6,0,P|360:80|328:48,1,236.250009012223,4|0,0:0|0:0,0:0:0:0: +176,192,118642,1,8,0:0:0:0: +440,192,118815,2,0,L|496:192,1,52.5 +336,192,118987,2,0,L|280:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +440,192,119160,2,0,L|496:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +256,192,119332,1,8,0:0:0:0: +192,192,119418,2,0,L|280:128,1,105 +128,192,119677,5,2,0:0:0:0: +416,192,119849,2,0,L|468:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +264,192,120022,2,0,L|320:192,1,52.5,8|0,0:0|0:0,0:0:0:0: +464,192,120194,2,0,L|408:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +264,192,120367,2,0,L|320:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +488,192,120539,2,0,L|432:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +288,192,120711,2,0,L|216:192,1,62.9999980773926,8|0,0:0|0:0,0:0:0:0: +65,192,120884,2,0,L|16:152,1,62.9999980773926,2|0,0:0|0:0,0:0:0:0: +264,192,121056,6,0,P|344:120|336:80,1,157.5,2|0,0:0|0:0,0:0:0:0: +176,192,121401,1,8,0:0:0:0: +56,192,121573,1,0,0:0:0:0: +328,192,121746,2,0,L|448:192,1,105,2|2,0:0|0:0,0:0:0:0: +160,192,122091,1,8,0:0:0:0: +186,192,122134,1,0,0:0:0:0: +212,192,122177,1,0,0:0:0:0: +238,192,122220,1,0,0:0:0:0: +265,192,122263,1,0,0:0:0:0: +16,192,122436,6,0,L|128:192,1,105,2|0,0:0|0:0,0:0:0:0: +384,192,122780,2,0,L|272:192,1,105,8|0,0:0|0:0,0:0:0:0: +16,192,123125,1,2,0:0:0:0: +160,192,123298,1,2,0:0:0:0: +160,192,123384,1,2,0:0:0:0: +16,192,123470,1,8,0:0:0:0: +288,192,123642,1,2,0:0:0:0: +16,192,123815,6,0,L|128:192,1,105,2|0,0:0|0:0,0:0:0:0: +384,192,124160,1,8,0:0:0:0: +240,192,124332,1,0,0:0:0:0: +496,192,124504,1,2,0:0:0:0: +344,192,124591,1,2,0:0:0:0: +192,192,124677,1,2,0:0:0:0: +40,192,124763,1,2,0:0:0:0: +344,192,124849,2,0,L|424:192,1,78.7500030040742,8|0,0:0|0:0,0:0:0:0: +192,192,125022,2,0,L|136:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +336,192,125194,6,0,P|432:152|432:96,1,157.5,2|0,0:0|0:0,0:0:0:0: +280,192,125539,2,0,L|200:192,1,78.7500030040742,8|0,0:0|0:0,0:0:0:0: +56,192,125711,2,0,L|0:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +176,192,125884,2,0,L|257:192,1,78.7500030040742,2|0,0:0|0:0,0:0:0:0: +400,192,126056,2,0,L|456:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +288,192,126229,2,0,L|208:192,1,78.7500030040742,8|0,0:0|0:0,0:0:0:0: +56,192,126401,2,0,L|56:136,1,52.5,2|0,0:0|0:0,0:0:0:0: +256,192,126573,6,0,P|208:136|136:176,1,157.5,2|0,0:0|0:0,0:0:0:0: +288,192,126918,1,8,0:0:0:0: +32,192,127091,2,0,L|32:128,1,52.5,2|0,0:0|0:0,0:0:0:0: +176,192,127263,1,2,0:0:0:0: +320,192,127349,1,2,0:0:0:0: +176,192,127436,1,2,0:0:0:0: +424,192,127608,2,0,L|424:88,1,105,8|0,0:0|0:0,0:0:0:0: +152,192,127953,6,0,L|40:192,1,105,8|2,0:0|0:0,0:0:0:0: +360,192,128298,2,0,L|472:192,1,105,8|2,0:0|0:0,0:0:0:0: +128,192,128642,1,2,0:0:0:0: +280,192,128729,1,2,0:0:0:0: +424,192,128815,1,2,0:0:0:0: +368,192,128901,1,2,0:0:0:0: +192,192,128987,2,0,P|104:112|120:72,1,157.5,8|0,0:0|0:0,0:0:0:0: +320,192,129332,6,0,P|408:112|392:72,1,157.5,6|0,0:0|0:0,0:0:0:0: +216,192,129677,2,0,L|80:192,1,105,8|0,0:0|0:0,0:0:0:0: +400,192,130022,2,0,L|456:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +304,192,130194,2,0,L|224:192,1,78.7500030040742,2|0,0:0|0:0,0:0:0:0: +64,192,130367,2,0,L|112:160,1,52.5,8|0,0:0|0:0,0:0:0:0: +272,192,130539,2,0,L|208:192,1,52.5 +64,192,130711,6,0,L|120:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +272,192,130884,2,0,L|352:192,1,78.7500030040742,2|0,0:0|0:0,0:0:0:0: +496,192,131056,2,0,P|453:151|352:144,1,157.5,8|0,0:0|0:0,0:0:0:0: +128,192,131401,1,0,0:0:0:0: +102,192,131444,1,0,0:0:0:0: +79,180,131487,1,0,0:0:0:0: +65,158,131530,1,0,0:0:0:0: +64,132,131573,1,0,0:0:0:0: +77,109,131616,1,0,0:0:0:0: +99,96,131659,1,0,0:0:0:0: +125,95,131702,1,0,0:0:0:0: +232,192,131746,1,8,0:0:0:0: +328,192,131918,1,2,0:0:0:0: +48,192,132091,6,0,P|112:112|176:104,1,157.5,2|0,0:0|0:0,0:0:0:0: +328,192,132436,1,8,0:0:0:0: +64,192,132608,1,2,0:0:0:0: +480,192,132780,1,2,0:0:0:0: +328,192,132867,1,0,0:0:0:0: +176,192,132953,1,2,0:0:0:0: +24,192,133039,1,0,0:0:0:0: +176,192,133125,1,8,0:0:0:0: +328,192,133212,1,0,0:0:0:0: +176,192,133298,1,2,0:0:0:0: +24,192,133384,1,0,0:0:0:0: +256,192,133470,5,0,0:0:0:0: +292,206,133513,1,0,0:0:0:0: +330,200,133556,1,0,0:0:0:0: +361,176,133599,1,0,0:0:0:0: +375,140,133642,1,0,0:0:0:0: +370,101,133685,1,0,0:0:0:0: +346,70,133728,1,0,0:0:0:0: +192,192,133815,2,0,L|88:192,1,105,8|0,0:0|0:0,0:0:0:0: +368,192,134160,1,0,0:0:0:0: +405,183,134203,1,0,0:0:0:0: +434,157,134246,1,0,0:0:0:0: +448,120,134289,1,0,0:0:0:0: +442,82,134332,1,0,0:0:0:0: +288,192,134418,1,0,0:0:0:0: +136,192,134504,2,0,P|144:136|192:112,1,105,8|0,0:0|0:0,0:0:0:0: +448,192,134849,6,0,P|480:120|416:80,1,157.5,2|0,0:0|0:0,0:0:0:0: +208,192,135194,1,8,0:0:0:0: +80,192,135367,1,2,0:0:0:0: +352,192,135539,2,0,L|296:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +155,192,135711,2,0,L|211:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +384,192,135884,2,0,L|328:192,1,52.5,8|0,0:0|0:0,0:0:0:0: +187,192,136056,2,0,L|243:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +384,192,136229,6,0,P|440:136|424:112,1,105,2|0,0:0|0:0,0:0:0:0: +144,192,136573,1,8,0:0:0:0: +48,192,136746,2,0,L|104:192,1,52.5 +256,192,136918,2,0,L|296:192,7,26.25,2|0|0|0|0|0|0|0,0:0|0:0|0:0|0:0|0:0|0:0|0:0|0:0,0:0:0:0: +160,192,137263,2,0,L|48:192,1,105,8|0,0:0|0:0,0:0:0:0: +368,192,137608,6,0,P|448:112|432:88,1,157.5,2|0,0:0|0:0,0:0:0:0: +256,192,137953,2,0,L|144:192,1,105,8|0,0:0|0:0,0:0:0:0: +480,192,138298,1,2,0:0:0:0: +328,192,138384,1,2,0:0:0:0: +176,192,138470,1,2,0:0:0:0: +96,192,138556,1,2,0:0:0:0: +256,192,138642,1,8,0:0:0:0: +400,192,138729,1,0,0:0:0:0: +216,192,138815,2,0,L|152:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +352,192,138987,6,0,L|496:120,3,157.500006008148,2|0|0|0,0:0|0:0|0:0|0:0,0:0:0:0: +192,192,139677,2,0,L|56:192,1,125.999996154785,2|0,0:0|0:0,0:0:0:0: +368,192,140022,2,0,L|256:192,1,105,2|0,0:0|0:0,0:0:0:0: +16,192,140367,5,2,0:0:0:0: +48,151,140453,1,0,0:0:0:0: +94,125,140539,1,0,0:0:0:0: +145,118,140625,1,0,0:0:0:0: +304,192,140711,2,0,L|416:192,1,105 +120,192,141056,2,0,P|48:112|104:64,1,157.5,4|0,0:0|0:0,0:0:0:0: +160,192,141401,1,0,0:0:0:0: +212,192,141487,1,0,0:0:0:0: +265,192,141573,1,0,0:0:0:0: +317,192,141659,1,0,0:0:0:0: +160,192,141746,5,2,0:0:0:0: +212,192,141832,1,0,0:0:0:0: +265,192,141918,1,0,0:0:0:0: +317,192,142004,1,0,0:0:0:0: +160,192,142091,2,0,L|56:192,1,105 +317,192,142436,2,0,P|432:128|432:80,1,157.5,4|0,0:0|0:0,0:0:0:0: +256,192,142780,2,0,L|179:192,1,52.5 +152,192,142953,2,0,L|216:192,1,52.5 +376,192,143125,5,2,0:0:0:0: +425,182,143211,1,0,0:0:0:0: +448,137,143297,1,0,0:0:0:0: +426,91,143383,1,0,0:0:0:0: +256,192,143470,2,0,L|360:192,1,105,2|0,0:0|0:0,0:0:0:0: +88,192,143815,2,0,P|32:112|72:72,1,157.5,4|0,0:0|0:0,0:0:0:0: +216,192,144160,2,0,L|280:192,1,52.5,2|0,0:0|0:0,0:0:0:0: +112,192,144332,2,0,L|48:192,1,52.5 +288,192,144504,5,2,0:0:0:0: +448,192,144677,1,0,0:0:0:0: +471,146,144763,1,0,0:0:0:0: +464,94,144849,1,2,0:0:0:0: +428,57,144935,1,2,0:0:0:0: +377,47,145022,1,2,0:0:0:0: +330,69,145108,1,2,0:0:0:0: +64,192,145194,1,4,0:0:0:0: +296,192,145884,5,0,0:0:0:0: +128,192,146229,1,2,0:0:0:0: +280,192,146573,1,0,0:0:0:0: +56,192,146918,1,2,0:0:0:0: +480,192,147263,5,2,0:0:0:0: +288,192,147780,1,0,0:0:0:0: +432,192,147953,1,2,0:0:0:0: +160,192,148298,1,0,0:0:0:0: +472,192,148642,5,2,0:0:0:0: +128,192,149332,1,2,0:0:0:0: +488,192,150022,1,2,0:0:0:0: +16,192,150367,5,2,0:0:0:0: +488,192,150711,1,4,0:0:0:0: diff --git a/pp/catch_the_pp/sample.py b/pp/catch_the_pp/sample.py new file mode 100644 index 0000000..b644b9a --- /dev/null +++ b/pp/catch_the_pp/sample.py @@ -0,0 +1,31 @@ +import os +import sys + +from .osu_parser.beatmap import Beatmap +from .osu.ctb.difficulty import Difficulty +from .ppCalc import calculate_pp + +if len(sys.argv) <= 1: + beatmap = Beatmap(os.path.dirname(os.path.realpath(__file__)) + "/test.osu") # Yes... this be my test file (Will remove when project is done) +else: + beatmap = Beatmap(sys.argv[1]) + +if len(sys.argv) >= 3: + mods = int(sys.argv[2]) +else: + mods = 0 + +difficulty = Difficulty(beatmap, mods) +print("Calculation:") +print("Stars: {}, PP: {}, MaxCombo: {}\n".format( + difficulty.star_rating, calculate_pp(difficulty, 1, beatmap.max_combo, 0), beatmap.max_combo +)) + +""" +m = {"NOMOD": 0, "EASY": 2, "HIDDEN": 8, "HARDROCK": 16, "DOUBLETIME": 64, "HALFTIME": 256, "FLASHLIGHT": 1024} +for key in m.keys(): + difficulty = Difficulty(beatmap, m[key]) + print("Mods: {}".format(key)) + print("Stars: {}".format(difficulty.star_rating)) + print("PP: {}\n".format(calculate_pp(difficulty, 1, beatmap.max_combo, 0))) +""" diff --git a/pp/catch_the_pp/setup.py b/pp/catch_the_pp/setup.py new file mode 100644 index 0000000..d3bd341 --- /dev/null +++ b/pp/catch_the_pp/setup.py @@ -0,0 +1,16 @@ +from distutils.core import setup +from distutils.extension import Extension +from Cython.Build import cythonize +import os + +extensions = [] +for root, dirs, files in os.walk(os.getcwd()): + for file in files: + if file.endswith(".pyx"): + file_path = os.path.relpath(os.path.join(root, file)) + extensions.append(Extension(file_path.replace("/", ".")[:-4], [file_path])) + +setup( + name="catch-the-pp", + ext_modules=cythonize(extensions, nthreads=4), +) diff --git a/pp/catch_the_pp/test.osu b/pp/catch_the_pp/test.osu new file mode 100644 index 0000000..34098fb --- /dev/null +++ b/pp/catch_the_pp/test.osu @@ -0,0 +1,1219 @@ +osu file format v7 + +[General] +AudioFilename: Night of Knights.mp3 +AudioLeadIn: 0 +PreviewTime: 1598 +Countdown: 0 +SampleSet: Soft +StackLeniency: 0 +Mode: 0 +LetterboxInBreaks: 0 + +[Editor] +Bookmarks: 1585,13931,24598,35265,45931,56598,67265,77931,88598,99265,109931,120598,131265,141931,152598,163265,173931,184598,195265 +DistanceSpacing: 0.800000011920929 +BeatDivisor: 4 +GridSize: 32 + +[Metadata] +Title:Night of Knights +Artist:beatMARIO +Creator:DJPop +Version:TAG4 +Source: +Tags:COOL&CREATE Hanabata Touhou Izayoi Sakuya Hong Meiling ignorethis samiljul dksslqj + +[Difficulty] +HPDrainRate:3 +CircleSize:5 +OverallDifficulty:8 +SliderMultiplier:1.92 +SliderTickRate:4 + +[Events] +//Background and Video events +0,0,"Night of Knights 2.png" +Video,0,"Night of Knights.avi" +//Break Periods +//Storyboard Layer 0 (Background) +//Storyboard Layer 1 (Fail) +//Storyboard Layer 2 (Pass) +//Storyboard Layer 3 (Foreground) +//Storyboard Sound Samples +//Background Colour Transformations +3,100,0,0,255 + +[TimingPoints] +1585,392.156862745098,4,1,1,80,1,0 +13932,333.333333333333,4,1,1,80,1,0 +35265,-100,4,1,1,80,0,1 +45930,-100,4,1,1,80,0,0 +45931,-100,4,1,1,80,0,1 +56598,-100,4,1,1,80,0,0 +78015,-100,4,2,1,80,0,0 +97681,-200,4,2,1,80,0,0 +98181,-100,4,2,1,80,0,0 +99098,-100,4,1,1,80,0,0 +99265,-100,4,1,1,80,0,1 +109930,-100,4,1,1,80,0,0 +109931,-100,4,1,1,80,0,1 +120598,-100,4,1,1,80,0,0 +141931,-100,4,1,1,80,0,1 +152597,-100,4,1,1,80,0,0 +152598,-100,4,1,1,80,0,1 +163264,-100,4,1,1,80,0,0 +163265,-100,4,1,1,80,0,1 +173930,-100,4,1,1,80,0,0 +173931,-100,4,1,1,80,0,1 +184598,-100,4,1,1,80,0,0 + +[HitObjects] +480,32,13932,5,4 +416,64,14098,1,0 +352,32,14265,1,0 +352,32,14348,1,0 +288,64,14515,1,0 +224,32,14682,1,0 +160,64,14848,1,0 +128,32,14932,1,8 +96,64,15015,1,0 +64,32,15098,1,0 +32,64,15182,1,0 +464,128,15348,5,0 +432,160,15432,1,0 +368,128,15598,1,0 +336,160,15682,1,0 +272,128,15848,1,0 +208,160,16015,1,0 +144,128,16182,1,0 +112,160,16265,1,12 +48,128,16432,1,0 +480,224,16598,5,4 +416,256,16765,1,0 +352,224,16932,1,0 +352,224,17015,1,0 +288,256,17182,1,0 +224,224,17348,1,0 +160,256,17515,1,0 +128,224,17598,1,8 +96,256,17682,1,0 +64,224,17765,1,0 +32,256,17848,1,0 +464,320,18015,5,0 +432,352,18098,1,0 +368,320,18265,1,0 +336,352,18348,1,0 +272,320,18515,1,0 +208,352,18682,1,0 +144,320,18848,1,0 +112,352,18932,1,12 +48,320,19098,1,0 +32,64,19265,5,4 +96,32,19432,1,0 +160,64,19598,1,0 +160,64,19682,1,0 +224,32,19848,1,0 +288,64,20015,1,0 +352,32,20182,1,0 +384,64,20265,1,12 +416,32,20348,1,0 +448,64,20432,1,0 +480,32,20515,1,0 +32,160,20598,5,4 +64,128,20682,1,0 +96,160,20765,1,0 +160,128,20931,1,0 +192,160,21015,1,0 +256,128,21181,1,0 +320,160,21348,1,0 +384,128,21515,1,0 +416,160,21598,1,12 +480,128,21765,1,0 +32,256,21931,5,4 +96,224,22098,1,0 +160,256,22265,1,0 +160,256,22348,1,0 +224,224,22515,1,0 +256,256,22598,1,4 +288,224,22681,1,0 +352,256,22848,1,0 +384,224,22931,1,8 +416,256,23015,1,0 +448,224,23098,1,0 +480,256,23181,1,0 +32,352,23265,5,4 +64,320,23348,1,0 +96,352,23431,1,0 +160,320,23598,1,4 +160,320,23681,1,0 +224,352,23848,1,0 +256,320,23931,1,4 +288,352,24015,1,0 +320,320,24098,1,0 +352,352,24181,1,0 +384,320,24265,1,8 +416,352,24348,1,0 +448,320,24431,1,0 +480,352,24515,1,0 +480,32,24598,6,0,C|480:128,1,96,4|0 +416,32,24931,2,0,C|416:128,1,96 +352,32,25265,2,0,C|352:128,1,96 +288,32,25598,2,0,C|288:128,1,96,8|0 +32,32,25931,6,0,C|32:128,1,96 +96,32,26264,2,0,C|96:128,1,96 +160,32,26598,2,0,C|160:128,1,96 +224,32,26931,2,0,C|224:128,1,96,12|0 +480,352,27265,6,0,C|480:256,1,96,4|0 +416,352,27598,2,0,C|416:256,1,96 +352,352,27932,2,0,C|352:256,1,96 +288,352,28265,2,0,C|288:256,1,96,8|0 +32,352,28598,6,0,C|32:256,1,96 +96,352,28931,2,0,C|96:256,1,96 +160,352,29265,2,0,C|160:256,1,96 +224,352,29598,2,0,C|224:256,1,96,12|0 +480,32,29931,6,0,C|384:32,1,96,4|0 +480,96,30264,2,0,C|384:96,1,96 +480,352,30598,6,0,C|384:352,1,96,0|0 +480,288,30931,2,0,C|384:288,1,96,12|0 +32,32,31264,6,0,C|128:32,1,96,4|0 +32,96,31597,2,0,C|128:96,1,96 +32,352,31931,6,0,C|128:352,1,96,0|0 +32,288,32264,2,0,C|128:288,1,96,12|0 +256,128,32598,6,0,C|256:32,1,96,4|0 +320,192,32931,6,0,C|416:192,1,96 +256,256,33265,6,0,C|256:352,1,96,4|0 +192,192,33598,6,0,C|96:192,1,96,8|0 +256,32,33931,6,0,C|256:128,1,96,4|0 +416,192,34264,6,0,C|320:192,1,96,4|0 +256,352,34598,6,0,C|256:256,1,96,4|0 +96,192,34931,6,0,C|192:192,1,96,8|0 +480,352,35265,5,4 +480,288,35431,1,0 +480,224,35598,1,8 +448,224,35681,1,0 +416,224,35765,1,0 +416,160,35931,1,0 +480,160,36098,1,0 +480,96,36265,1,8 +480,72,36348,1,0 +480,48,36431,1,0 +480,24,36515,1,0 +288,352,36598,5,0 +288,288,36765,1,0 +288,224,36931,1,8 +320,224,37015,1,0 +352,224,37098,1,0 +352,192,37181,1,0 +352,160,37265,1,2 +288,160,37431,1,2 +288,96,37598,1,10 +288,32,37765,1,2 +32,352,37931,5,0 +32,288,38098,1,0 +32,224,38265,1,8 +64,224,38348,1,0 +96,224,38431,1,0 +96,160,38598,1,0 +32,160,38765,1,0 +32,96,38932,1,8 +32,72,39015,1,0 +32,48,39098,1,0 +32,24,39182,1,0 +224,352,39265,5,0 +224,288,39432,1,0 +224,224,39598,1,8 +192,224,39682,1,0 +160,224,39765,1,0 +160,192,39848,1,0 +160,160,39932,1,2 +224,160,40098,1,2 +224,96,40265,1,10 +224,32,40432,1,2 +480,48,40598,5,4 +416,48,40765,1,0 +416,112,40932,1,8 +416,144,41015,1,0 +416,176,41098,1,0 +480,176,41265,1,0 +480,240,41432,1,0 +416,240,41598,1,8 +416,272,41682,1,0 +416,304,41765,1,0 +416,336,41848,1,0 +288,48,41932,5,0 +352,48,42098,1,0 +352,112,42265,1,8 +352,144,42348,1,0 +352,176,42432,1,0 +352,208,42515,1,0 +352,240,42598,1,2 +288,240,42765,2,0,C|288:272,3,32,2|0|0|10 +288,336,43098,1,2 +32,32,43265,5,6 +96,128,43515,1,0 +96,160,43598,1,8 +96,192,43682,1,0 +96,224,43765,1,0 +32,224,43932,1,6 +96,320,44182,1,0 +96,352,44265,1,8 +32,352,44432,1,0 +224,32,44598,5,6 +224,96,44765,1,0 +192,96,44848,1,0 +160,96,44932,1,14 +160,160,45098,1,0 +192,224,45265,2,0,L|210:240|192:256|174:272|192:288|209:304|192:320|173:336|192:352,1,192,6|8 +480,32,45932,5,4 +416,64,46098,1,0 +352,32,46265,1,8 +320,48,46348,1,0 +288,64,46432,1,0 +224,32,46598,1,0 +160,64,46765,1,0 +96,32,46932,1,8 +72,48,47015,1,0 +48,64,47098,1,0 +24,48,47182,1,0 +480,128,47265,5,0 +416,160,47432,1,0 +352,128,47598,1,8 +320,144,47682,1,0 +288,160,47765,1,0 +256,144,47848,1,0 +224,128,47932,1,2 +160,160,48098,1,2 +96,128,48265,1,10 +32,160,48432,1,2 +480,224,48598,5,0 +416,256,48765,1,0 +352,224,48932,1,8 +320,240,49015,1,0 +288,256,49098,1,0 +224,224,49265,1,0 +160,256,49432,1,0 +96,224,49598,1,8 +72,240,49682,1,0 +48,256,49765,1,0 +24,240,49848,1,0 +480,320,49932,5,0 +416,352,50098,1,0 +352,320,50265,1,8 +288,352,50348,1,0 +256,336,50432,1,0 +224,320,50515,1,0 +192,336,50598,1,2 +160,352,50765,1,2 +96,320,50932,1,10 +32,352,51098,1,2 +32,64,51265,5,4 +96,32,51432,1,0 +160,64,51598,1,8 +192,48,51681,1,0 +224,32,51765,1,0 +288,64,51932,1,0 +352,32,52098,1,0 +416,64,52265,1,8 +440,48,52348,1,0 +464,32,52432,1,0 +488,48,52515,1,0 +48,160,52598,5,4 +112,128,52765,1,0 +176,160,52932,1,8 +208,144,53015,1,0 +240,128,53098,1,0 +272,144,53182,1,0 +304,160,53265,1,2 +368,128,53431,2,0,L|400:128,3,32,2|0|0|10 +464,160,53765,1,2 +32,256,53932,5,6 +152,224,54182,1,0 +184,240,54265,1,8 +216,256,54348,1,0 +248,240,54432,1,0 +320,256,54598,1,6 +384,224,54765,2,0,L|416:224,3,32,0|0|0|8 +480,256,55098,1,0 +32,352,55265,5,6 +96,320,55432,1,0 +160,352,55598,1,12 +224,320,55765,1,0 +256,336,55848,1,0 +288,352,55932,1,4 +320,336,56015,1,0 +352,320,56098,1,0 +384,336,56182,1,0 +416,352,56265,1,12 +480,320,56432,1,0 +448,64,56598,5,4 +384,96,56765,1,0 +320,128,56932,1,0 +320,128,57015,1,0 +320,128,57098,1,0 +192,64,57265,5,0 +128,96,57432,1,0 +64,128,57598,1,0 +64,128,57682,1,0 +64,128,57765,1,0 +64,128,57848,1,0 +448,256,57932,5,0 +384,288,58098,1,0 +320,320,58265,1,0 +320,320,58348,1,0 +320,320,58432,1,0 +320,320,58515,1,0 +320,320,58598,1,0 +192,256,58765,5,0 +128,288,58932,1,0 +64,320,59098,1,0 +64,64,59265,5,0 +128,96,59432,1,0 +192,128,59598,1,0 +192,128,59682,1,0 +192,128,59765,1,0 +320,64,59932,5,0 +384,96,60098,1,0 +448,128,60265,1,0 +448,128,60348,1,0 +448,128,60432,1,0 +448,128,60515,1,0 +64,256,60598,5,0 +128,288,60765,1,0 +192,320,60932,1,0 +192,320,61015,1,0 +192,320,61098,1,0 +192,320,61182,1,0 +320,256,61265,5,0 +384,288,61432,2,0,L|399:295|384:288,3,32 +448,320,61765,1,0 +32,192,61932,5,0 +96,192,62098,1,0 +128,192,62182,1,0 +160,192,62265,1,0 +480,192,62432,5,0 +416,192,62598,1,0 +384,192,62682,1,0 +352,192,62765,1,0 +256,32,62932,5,0 +256,352,63098,5,0 +480,32,63265,5,0 +416,96,63432,1,0 +32,32,63598,5,0 +96,96,63765,1,0 +32,352,63932,5,0 +96,288,64098,1,0 +480,352,64265,5,0 +416,288,64432,1,0 +256,192,64598,5,4 +256,112,64765,1,0 +256,32,64932,1,0 +256,32,65015,1,0 +256,32,65098,1,0 +256,192,65265,5,4 +176,192,65432,1,0 +96,192,65598,1,0 +96,192,65682,1,0 +96,192,65765,1,0 +96,192,65848,1,0 +256,192,65932,5,4 +256,272,66098,1,0 +256,352,66265,1,4 +256,352,66348,1,0 +256,352,66432,1,0 +256,352,66515,1,0 +256,192,66598,5,4 +336,192,66765,2,0,L|352:192|336:192,3,32 +416,192,67098,1,0 +32,32,67265,5,4 +32,32,67432,1,0 +96,96,67598,5,0 +96,96,67682,1,0 +96,96,67765,1,0 +32,160,67932,5,0 +32,160,68098,1,0 +96,224,68265,5,0 +96,224,68348,1,0 +96,224,68432,1,0 +96,224,68515,1,0 +96,224,68598,1,0 +32,288,68765,5,0 +96,352,68932,5,0 +96,352,69015,1,0 +96,352,69098,1,0 +96,352,69182,1,0 +96,352,69265,1,0 +224,352,69431,5,0 +160,288,69598,5,0 +224,224,69765,5,0 +160,160,69932,5,0 +160,160,70098,1,0 +224,96,70265,5,0 +224,96,70348,1,0 +224,96,70432,1,0 +160,32,70598,5,0 +160,32,70765,1,0 +288,32,70932,5,0 +288,32,71015,1,0 +288,32,71098,1,0 +288,32,71182,1,0 +288,32,71265,1,0 +352,96,71432,5,0 +288,160,71598,5,0 +288,160,71682,1,0 +288,160,71765,1,0 +288,160,71848,1,0 +288,160,71932,1,0 +352,224,72098,6,0,L|363:236|352:224,3,32 +288,288,72431,5,0 +352,352,72598,5,4 +480,352,72765,5,0 +480,352,72848,1,0 +480,352,72932,1,0 +416,288,73098,5,0 +480,224,73265,5,0 +480,224,73348,1,0 +480,224,73432,1,0 +416,160,73598,5,0 +480,96,73765,5,0 +416,32,73932,5,4 +96,32,74098,5,0 +96,352,74265,5,0 +416,352,74432,5,0 +352,96,74598,5,0 +160,96,74765,5,0 +160,288,74932,5,4 +352,288,75098,5,0 +256,32,75265,5,4 +256,32,75432,1,0 +96,192,75598,5,0 +96,192,75682,1,0 +96,192,75765,1,0 +256,352,75932,5,4 +256,352,76098,1,0 +416,192,76265,5,0 +416,192,76348,1,0 +416,192,76432,1,0 +416,192,76515,1,0 +416,192,76598,1,4 +256,272,76765,5,0 +336,192,76932,5,4 +336,192,77015,1,0 +336,192,77098,1,0 +336,192,77182,1,0 +336,192,77265,1,4 +256,112,77432,5,0 +176,192,77598,5,4 +256,192,77765,5,0 +32,32,77932,6,0,C|32:128,1,96,4|0 +96,32,78265,2,0,C|96:128,1,96,2|0 +160,32,78598,2,0,C|160:128,1,96,2|0 +224,32,78932,1,2 +288,32,79098,1,2 +480,32,79431,5,0 +480,32,79598,2,0,C|480:128,1,96,2|0 +416,32,79931,2,0,C|416:128,1,96,2|0 +352,32,80265,2,0,C|352:128,1,96,2|0 +480,352,80598,6,0,C|480:256,1,96,2|0 +416,352,80931,2,0,C|416:256,1,96,2|0 +352,352,81265,2,0,C|352:256,1,96,2|0 +288,352,81598,1,2 +224,352,81765,1,2 +32,352,82098,5,0 +32,352,82265,2,0,C|32:256,1,96,2|0 +96,352,82598,2,0,C|96:256,1,96,2|0 +160,352,82931,1,2 +224,352,83098,1,2 +32,32,83265,6,0,C|128:32,1,96,2|0 +32,96,83598,2,0,C|128:96,1,96,2|0 +32,160,83931,2,0,C|128:160,1,96,2|0 +192,128,84265,1,2 +192,64,84431,1,2 +480,32,84765,5,0 +480,32,84931,2,0,C|384:32,1,96,2|0 +480,96,85265,2,0,C|384:96,1,96,2|0 +480,160,85598,2,0,C|384:160,1,96,2|0 +192,352,85931,6,0,C|192:256,1,96,6|0 +256,352,86265,2,0,C|256:256,1,96,2|0 +320,352,86598,2,0,C|320:256,1,96,6|0 +288,192,86931,1,2 +224,192,87098,1,2 +32,352,87265,5,4 +32,32,87598,5,4 +480,32,87931,5,4 +480,352,88265,5,2 +256,352,88431,5,2 +192,32,88598,6,0,C|192:128,1,96,6|0 +256,32,88931,2,0,C|256:128,1,96,2|0 +320,32,89265,2,0,C|320:128,1,96,2|0 +288,192,89598,1,2 +224,192,89765,1,2 +32,352,90098,5,0 +32,352,90265,2,0,C|32:256,1,96,2|0 +96,352,90598,2,0,C|96:256,1,96,2|0 +160,352,90931,1,2 +160,256,91098,1,2 +480,352,91265,6,0,C|480:256,1,96,2|0 +416,352,91598,2,0,C|416:256,1,96,2|0 +352,352,91931,1,2 +352,352,92098,2,0,C|352:256,1,96,2|0 +416,192,92431,1,2 +32,32,92765,5,0 +32,32,92931,2,0,C|128:32,1,96,2|0 +32,96,93265,2,0,C|128:96,1,96,2|0 +32,160,93598,2,0,C|128:160,1,96,2|0 +480,32,93931,6,0,C|384:32,1,96,6|0 +480,96,94265,2,0,C|384:96,1,96,2|0 +480,160,94598,2,0,C|384:160,1,96,2|0 +480,224,94931,1,2 +480,224,95098,2,0,C|384:224,1,96,2|4 +480,352,95431,5,0 +480,352,95598,2,0,C|384:352,1,96,2|0 +480,288,95931,2,0,C|384:288,1,96,2|0 +320,352,96265,1,2 +320,288,96431,1,2 +32,352,96598,6,0,C|128:352,2,96,6|0|0 +32,288,97098,1,2 +32,288,97265,2,0,C|128:288,1,96,6|0 +32,224,97598,1,2 +32,224,97765,2,0,C|128:224,1,96,6|0 +256,32,98265,5,6 +256,96,98431,1,2 +256,160,98598,2,0,C|256:352,1,192,6|4 +480,32,99265,5,4 +448,96,99431,1,0 +416,160,99598,1,8 +416,160,99681,1,0 +416,160,99765,1,0 +448,224,99931,1,0 +480,288,100098,1,0 +448,352,100265,1,8 +448,352,100348,1,0 +448,352,100431,1,0 +448,352,100515,1,0 +448,352,100598,1,0 +320,352,100765,5,0 +352,288,100931,1,8 +320,272,101015,1,0 +288,256,101098,1,0 +320,240,101181,1,0 +352,224,101265,1,2 +320,160,101431,1,2 +288,96,101598,1,10 +320,32,101765,1,2 +32,352,101931,5,0 +64,288,102098,1,0 +96,224,102265,1,8 +96,224,102348,1,0 +96,224,102431,1,0 +64,160,102598,1,0 +32,96,102765,1,0 +64,32,102931,1,8 +64,32,103015,1,0 +64,32,103098,1,0 +64,32,103181,1,0 +64,32,103265,1,0 +192,32,103431,5,0 +160,96,103598,1,8 +192,112,103681,1,0 +224,128,103765,1,0 +192,144,103848,1,0 +160,160,103931,1,2 +192,224,104098,1,2 +224,288,104265,1,10 +192,352,104431,1,2 +480,352,104598,5,4 +416,320,104765,1,0 +384,256,104931,1,8 +384,256,105015,1,0 +384,256,105098,1,0 +416,192,105265,1,0 +480,160,105431,1,0 +480,96,105598,1,8 +448,80,105681,1,0 +416,64,105765,1,0 +448,48,105848,1,0 +480,32,105931,1,0 +320,32,106098,5,0 +288,96,106265,1,8 +304,120,106348,1,0 +320,144,106431,1,0 +304,168,106515,1,0 +288,192,106598,1,2 +320,256,106765,2,0,C|320:288,3,32,2|0|0|10 +288,352,107098,1,2 +32,32,107265,5,6 +112,112,107515,1,0 +80,128,107598,1,8 +48,144,107681,1,0 +32,176,107765,1,0 +104,208,107931,1,6 +32,296,108181,1,0 +48,328,108265,1,8 +112,352,108431,1,0 +224,352,108598,5,6 +176,304,108765,1,0 +208,288,108848,1,0 +176,272,108931,1,14 +224,224,109098,1,0 +192,160,109265,2,0,L|210:144|192:128|174:112|192:96|209:80|192:64|173:48|192:32,1,192,6|8 +464,352,109931,5,4 +432,288,110098,1,0 +400,224,110265,1,8 +400,224,110348,1,0 +400,224,110431,1,0 +464,32,110598,5,0 +432,96,110765,1,0 +400,160,110931,1,8 +400,160,111015,1,0 +400,160,111098,1,0 +400,160,111181,1,0 +368,352,111265,5,0 +336,288,111431,1,0 +304,224,111598,1,8 +304,224,111681,1,0 +304,224,111765,1,0 +304,224,111848,1,0 +304,224,111931,1,2 +368,32,112098,5,2 +336,96,112265,1,10 +304,160,112431,1,2 +48,352,112598,5,0 +80,288,112765,1,0 +112,224,112931,1,8 +112,224,113015,1,0 +112,224,113098,1,0 +48,32,113265,5,0 +80,96,113431,1,0 +112,160,113598,1,8 +112,160,113681,1,0 +112,160,113765,1,0 +112,160,113848,1,0 +144,352,113931,5,0 +176,288,114098,1,0 +208,224,114265,1,8 +208,224,114348,1,0 +208,224,114431,1,0 +208,224,114515,1,0 +208,224,114598,1,2 +144,32,114765,5,2 +176,96,114931,1,10 +208,160,115098,1,2 +448,64,115265,5,4 +384,96,115431,1,0 +320,128,115598,1,8 +320,128,115681,1,0 +320,128,115765,1,0 +448,320,115931,5,0 +384,288,116098,1,0 +320,256,116265,1,8 +320,256,116348,1,0 +320,256,116431,1,0 +320,256,116515,1,0 +64,320,116598,5,4 +128,288,116765,1,0 +192,256,116931,1,8 +192,256,117015,1,0 +192,256,117098,1,0 +192,256,117181,1,0 +64,64,117265,5,2 +128,96,117431,2,0,L|142:104|128:96,3,32,2|0|0|10 +192,128,117765,1,2 +480,192,117931,5,6 +392,192,118181,1,0 +368,192,118265,1,8 +344,192,118348,1,0 +320,192,118431,1,0 +32,192,118598,5,6 +96,192,118765,2,0,C|128:192,3,32,0|0|0|8 +192,192,119098,1,0 +256,352,119265,5,6 +256,288,119431,1,0 +256,224,119598,1,12 +256,32,119765,5,0 +256,40,119848,1,0 +256,48,119931,1,4 +256,56,120015,1,0 +256,64,120098,1,0 +256,72,120181,1,0 +256,80,120265,1,12 +256,160,120431,1,0 +32,320,120598,5,4 +96,352,120765,1,0 +160,320,120931,1,0 +160,320,121015,1,0 +224,352,121181,1,0 +288,320,121348,1,0 +352,352,121515,1,0 +384,320,121598,1,8 +416,352,121681,1,0 +448,320,121765,1,0 +480,352,121848,1,0 +48,224,122015,5,0 +80,256,122098,1,0 +144,224,122265,1,0 +176,256,122348,1,0 +240,224,122515,1,0 +304,256,122681,1,0 +368,224,122848,1,0 +400,256,122931,1,12 +464,224,123098,1,0 +32,128,123265,5,4 +96,160,123431,1,0 +160,128,123598,1,0 +160,128,123681,1,0 +224,160,123848,1,0 +288,128,124015,1,0 +352,160,124181,1,0 +384,128,124265,1,8 +416,160,124348,1,0 +448,128,124431,1,0 +480,160,124515,1,0 +48,32,124681,5,0 +80,64,124765,1,0 +144,32,124931,1,0 +176,64,125015,1,0 +240,32,125181,1,0 +304,64,125348,1,0 +368,32,125515,1,0 +400,64,125598,1,12 +464,32,125765,1,0 +480,352,125931,5,4 +416,320,126098,1,0 +352,352,126265,1,0 +352,352,126348,1,0 +288,320,126515,1,0 +224,352,126681,1,0 +160,320,126848,1,0 +128,352,126931,1,8 +96,320,127015,1,0 +64,352,127098,1,0 +32,320,127181,1,0 +464,256,127348,5,0 +432,224,127431,1,0 +368,256,127598,1,0 +336,224,127681,1,0 +272,256,127848,1,0 +208,224,128015,1,0 +144,256,128181,1,0 +112,224,128265,1,12 +48,256,128431,1,0 +480,160,128598,5,4 +416,128,128765,1,0 +352,160,128931,1,0 +352,160,129015,1,0 +288,128,129181,1,0 +224,160,129348,1,0 +160,128,129515,1,0 +128,160,129598,1,8 +96,128,129681,1,0 +64,160,129765,1,0 +32,128,129848,1,0 +480,64,130015,5,0 +448,32,130098,1,0 +384,64,130265,1,0 +352,32,130348,1,0 +288,64,130515,1,0 +256,32,130598,1,4 +224,64,130681,1,0 +192,32,130765,1,0 +160,64,130848,1,0 +128,32,130931,1,12 +96,64,131015,1,0 +64,32,131098,1,0 +32,64,131181,1,0 +32,352,131265,5,4 +96,288,131431,5,0 +160,352,131598,5,0 +160,352,131681,1,0 +224,288,131848,5,0 +288,352,132015,5,0 +352,288,132181,5,0 +352,288,132265,1,8 +352,288,132348,1,0 +352,288,132431,1,0 +352,288,132515,1,0 +416,352,132681,5,0 +416,352,132765,1,0 +480,288,132931,5,0 +480,288,133015,1,0 +480,160,133181,5,0 +416,224,133348,5,0 +352,160,133515,5,0 +352,160,133598,1,12 +288,224,133765,5,0 +224,160,133931,5,4 +160,224,134098,5,0 +96,160,134265,5,0 +96,160,134348,1,0 +32,224,134515,5,0 +32,96,134681,5,0 +96,32,134848,5,0 +96,32,134931,1,8 +96,32,135015,1,0 +96,32,135098,1,0 +96,32,135181,1,0 +160,96,135348,5,0 +160,96,135431,1,0 +224,32,135598,5,0 +224,32,135681,1,0 +288,96,135848,5,0 +352,32,136015,5,0 +416,96,136181,5,0 +416,96,136265,1,12 +480,32,136431,5,0 +480,320,136598,5,4 +352,320,136765,5,0 +224,320,136931,5,0 +224,320,137015,1,0 +96,320,137181,5,0 +32,256,137348,5,0 +160,256,137515,5,0 +160,256,137598,1,12 +160,256,137681,1,0 +160,256,137765,1,0 +160,256,137848,1,0 +160,256,137931,1,4 +160,256,138015,1,0 +160,256,138098,1,0 +288,256,138265,5,0 +288,256,138348,1,0 +416,256,138515,5,0 +480,192,138681,5,0 +352,192,138848,5,0 +352,192,138931,1,12 +224,192,139098,5,0 +96,192,139265,5,4 +32,128,139431,5,0 +160,128,139598,5,0 +160,128,139681,1,0 +288,128,139848,5,0 +288,128,139931,1,4 +288,128,140015,1,0 +416,128,140181,5,0 +416,128,140265,1,8 +416,128,140348,1,0 +416,128,140431,1,0 +416,128,140515,1,0 +480,64,140598,5,4 +480,64,140681,1,0 +480,64,140765,1,0 +352,64,140931,5,4 +352,64,141015,1,0 +224,64,141181,5,0 +224,64,141265,1,4 +224,64,141348,1,0 +96,64,141515,5,0 +96,64,141598,1,8 +96,64,141681,1,0 +96,64,141765,1,0 +96,64,141848,1,0 +16,352,141931,5,4 +64,304,142098,1,0 +112,256,142265,1,8 +112,256,142348,1,0 +112,256,142431,1,0 +160,304,142598,1,0 +208,352,142765,1,0 +256,304,142931,1,8 +256,304,143015,1,0 +256,304,143098,1,0 +256,304,143181,1,0 +256,304,143265,1,0 +304,256,143431,1,0 +352,304,143598,1,8 +352,304,143681,1,0 +352,304,143765,1,0 +352,304,143848,1,0 +352,304,143931,1,2 +400,352,144098,1,2 +448,304,144265,1,10 +496,256,144431,1,2 +496,32,144598,5,0 +448,80,144765,1,0 +400,128,144931,1,8 +400,128,145015,1,0 +400,128,145098,1,0 +352,80,145265,1,0 +304,32,145431,1,0 +256,80,145598,1,8 +256,80,145681,1,0 +256,80,145765,1,0 +256,80,145848,1,0 +256,80,145931,1,0 +208,128,146098,1,0 +160,80,146265,1,8 +160,80,146348,1,0 +160,80,146431,1,0 +160,80,146515,1,0 +160,80,146598,1,2 +112,32,146765,1,2 +64,80,146931,1,10 +16,128,147098,1,2 +480,256,147265,5,4 +448,320,147431,1,0 +384,352,147598,1,8 +384,352,147681,1,0 +384,352,147765,1,0 +320,320,147931,1,0 +288,256,148098,1,0 +256,320,148265,1,8 +256,320,148348,1,0 +256,320,148431,1,0 +256,320,148515,1,0 +256,320,148598,1,0 +192,352,148765,1,0 +128,320,148931,1,8 +128,320,149015,1,0 +128,320,149098,1,0 +128,320,149181,1,0 +128,320,149265,1,2 +96,256,149431,2,0,C|64:288,3,32,2|0|0|10 +32,352,149765,1,2 +32,160,149931,5,6 +96,64,150181,1,0 +96,64,150265,1,8 +96,64,150348,1,0 +96,64,150431,1,0 +160,64,150598,1,6 +224,160,150848,1,0 +224,160,150931,1,8 +288,160,151098,1,0 +256,96,151265,1,6 +224,32,151431,1,0 +224,32,151515,1,0 +224,32,151598,1,14 +288,32,151765,1,0 +352,64,151931,2,0,L|368:82|384:64|400:46|416:64|432:81|448:64|464:45|480:64,1,192,6|8 +16,352,152598,5,4 +80,320,152765,1,0 +144,288,152931,1,8 +176,272,153015,1,0 +208,256,153098,1,0 +272,224,153265,1,0 +336,192,153431,1,0 +400,160,153598,1,8 +432,144,153681,1,0 +464,128,153765,1,0 +496,112,153848,1,0 +480,32,153931,5,0 +416,64,154098,1,0 +352,96,154265,1,8 +320,112,154348,1,0 +288,128,154431,1,0 +256,144,154515,1,0 +224,160,154598,1,2 +160,192,154765,1,2 +96,224,154931,1,10 +32,256,155098,1,2 +496,352,155265,5,0 +432,320,155431,1,0 +368,288,155598,1,8 +336,272,155681,1,0 +304,256,155765,1,0 +240,224,155931,1,0 +176,192,156098,1,0 +112,160,156265,1,8 +80,144,156348,1,0 +48,128,156431,1,0 +16,112,156515,1,0 +32,32,156598,5,0 +96,64,156765,1,0 +160,96,156931,1,8 +192,112,157015,1,0 +224,128,157098,1,0 +256,144,157182,1,0 +288,160,157265,1,2 +352,192,157432,1,2 +416,224,157598,1,10 +480,256,157765,1,2 +32,352,157932,5,4 +96,320,158098,1,0 +128,256,158265,1,8 +128,256,158348,1,0 +128,256,158432,1,0 +96,192,158598,1,0 +32,160,158765,1,0 +32,96,158932,1,8 +64,80,159015,1,0 +96,64,159098,1,0 +64,48,159182,1,0 +32,32,159265,1,4 +224,352,159431,5,0 +224,288,159598,1,8 +208,256,159682,1,0 +192,224,159765,1,0 +208,192,159848,1,0 +224,160,159932,1,2 +176,112,160098,2,0,C|176:80,3,32,2|0|0|10 +224,32,160432,1,2 +480,32,160598,5,6 +416,128,160848,1,0 +416,144,160932,1,8 +416,160,161015,1,0 +416,176,161098,1,0 +480,208,161265,1,6 +416,304,161515,1,0 +416,320,161598,1,8 +480,352,161765,1,4 +288,32,161932,5,2 +352,64,162098,1,2 +352,96,162182,1,2 +352,128,162265,1,14 +288,160,162432,1,2 +320,224,162598,2,0,L|302:240|320:256|338:272|320:288|303:304|320:320|339:336|320:352,1,192,6|8 +32,352,163265,5,4 +32,288,163432,1,0 +32,224,163598,5,8 +32,192,163682,1,0 +32,160,163765,1,0 +32,96,163932,5,0 +32,32,164098,1,0 +160,352,164265,5,8 +160,320,164348,1,0 +160,288,164432,1,0 +160,256,164515,1,0 +160,224,164598,1,0 +96,192,164765,5,0 +160,160,164932,5,8 +160,128,165015,1,0 +160,96,165098,1,0 +160,64,165182,1,0 +160,32,165265,1,2 +224,352,165431,5,2 +224,192,165598,5,10 +224,32,165765,5,2 +480,352,165932,5,0 +480,288,166098,1,0 +480,224,166265,5,8 +480,192,166348,1,0 +480,160,166432,1,0 +480,96,166598,5,0 +480,32,166765,1,0 +352,352,166931,5,8 +352,320,167015,1,0 +352,288,167098,1,0 +352,256,167182,1,0 +352,224,167265,1,0 +416,192,167432,5,0 +352,160,167598,5,8 +352,128,167682,1,0 +352,96,167765,1,0 +352,64,167848,1,0 +352,32,167932,1,2 +288,352,168098,5,2 +288,192,168265,5,10 +288,32,168432,5,2 +32,32,168598,5,4 +32,96,168765,1,0 +32,160,168932,5,8 +32,192,169015,1,0 +32,224,169098,1,0 +32,288,169265,5,0 +32,352,169432,1,0 +160,32,169598,5,8 +160,64,169682,1,0 +160,96,169765,1,0 +160,128,169848,1,0 +160,160,169931,1,0 +224,32,170098,5,0 +160,224,170265,5,8 +160,256,170348,1,0 +160,288,170432,1,0 +160,320,170515,1,0 +160,352,170598,1,2 +96,192,170765,6,0,L|112:192|96:192,3,32,2|0|0|10 +224,352,171098,5,2 +224,192,171265,5,6 +464,32,171515,5,0 +432,32,171598,1,8 +400,32,171682,1,0 +368,32,171765,1,0 +304,32,171932,5,6 +432,96,172182,5,0 +400,96,172265,1,8 +336,96,172431,5,0 +480,160,172598,5,6 +416,160,172765,5,0 +384,160,172848,1,0 +352,160,172932,1,14 +288,160,173098,5,0 +384,224,173265,6,0,L|366:240|384:256|402:272|384:288|367:304|384:320|403:336|384:352,1,192,6|8 +16,336,173932,5,4 +16,240,174098,5,0 +16,144,174265,5,8 +16,48,174348,5,0 +48,336,174432,5,0 +48,240,174598,5,0 +48,144,174765,5,0 +48,48,174932,5,8 +80,336,175015,5,0 +80,240,175098,5,0 +80,144,175182,5,0 +80,48,175265,5,0 +112,336,175432,5,0 +112,240,175598,5,8 +112,144,175682,5,0 +112,48,175765,5,0 +144,336,175848,5,0 +144,240,175932,5,2 +144,144,176098,5,2 +144,48,176265,5,10 +176,336,176432,5,2 +176,240,176598,5,0 +176,144,176765,5,0 +176,48,176932,5,8 +208,336,177015,5,0 +208,240,177098,5,0 +208,144,177265,5,0 +208,48,177432,5,0 +240,336,177598,5,8 +240,240,177682,5,0 +240,144,177765,5,0 +240,48,177848,5,0 +272,336,177932,5,0 +272,240,178098,5,0 +272,144,178265,5,8 +272,48,178348,5,0 +304,336,178432,5,0 +304,240,178515,5,0 +304,144,178598,5,2 +304,48,178765,5,2 +336,336,178932,5,10 +336,240,179098,5,2 +336,144,179265,5,4 +336,48,179598,5,8 +368,336,179765,5,0 +368,240,179848,5,0 +368,144,179932,5,0 +368,48,180015,5,0 +400,336,180098,5,2 +400,240,180265,5,10 +400,144,180432,5,2 +400,48,180598,5,4 +432,336,180765,5,0 +432,240,180848,5,0 +432,144,180932,5,10 +432,48,181098,5,0 +464,336,181182,5,0 +464,240,181265,5,0 +464,144,181348,5,0 +464,48,181432,5,0 +496,336,181515,5,0 +496,240,181598,5,10 +496,144,181765,5,2 +496,48,181932,5,4 +32,48,182182,5,0 +32,144,182265,5,8 +32,240,182348,5,0 +32,336,182432,5,0 +32,48,182598,5,4 +32,144,182765,5,0 +32,240,182848,5,0 +32,336,182932,5,10 +32,48,183098,5,0 +256,128,183265,6,0,C|256:32,1,96,4|0 +320,192,183598,6,0,C|416:192,1,96,12|0 +256,256,183932,6,0,C|256:352,1,96,4|0 +192,192,184265,6,0,C|96:192,1,96,12|0 +256,192,184598,5,4 \ No newline at end of file diff --git a/pp/cicciobello.py b/pp/cicciobello.py new file mode 100644 index 0000000..57384e8 --- /dev/null +++ b/pp/cicciobello.py @@ -0,0 +1,82 @@ +from common.log import logUtils as log +from common.constants import gameModes +from constants import exceptions +from helpers import mapsHelper + +from pp.catch_the_pp.osu_parser.beatmap import Beatmap as CalcBeatmap +from pp.catch_the_pp.osu.ctb.difficulty import Difficulty +from pp.catch_the_pp import ppCalc + + +class Cicciobello: + def __init__(self, _beatmap, _score=None, accuracy=0, mods=0, combo=-1, misses=0, tillerino=False): + # Beatmap is always present + self.beatmap = _beatmap + + # If passed, set everything from score object + if _score is not None: + self.score = _score + self.accuracy = self.score.accuracy + self.mods = self.score.mods + self.combo = self.score.maxCombo + self.misses = self.score.cMiss + else: + # Otherwise, set acc and mods from params (tillerino) + self.accuracy = accuracy + self.mods = mods + self.combo = combo + if self.combo < 0: + self.combo = self.beatmap.maxCombo + self.misses = misses + + # Multiple acc values computation + self.tillerino = tillerino + + # Result + self.pp = 0 + self.calculate_pp() + + def calculate_pp(self): + try: + # Cache beatmap + mapFile = mapsHelper.cachedMapPath(self.beatmap.beatmapID) + mapsHelper.cacheMap(mapFile, self.beatmap) + + # TODO: Sanizite mods + + # Gamemode check + if self.score and self.score.gameMode != gameModes.CTB: + raise exceptions.unsupportedGameModeException() + + # Accuracy check + if self.accuracy > 1: + raise ValueError("Accuracy must be between 0 and 1") + + # Calculate difficulty + calcBeatmap = CalcBeatmap(mapFile) + difficulty = Difficulty(beatmap=calcBeatmap, mods=self.mods) + + # Calculate pp + if self.tillerino: + results = [] + for acc in [1, 0.99, 0.98, 0.95]: + results.append(ppCalc.calculate_pp( + diff=difficulty, accuracy=acc, combo=self.combo, miss=self.misses + )) + self.pp = results + else: + self.pp = ppCalc.calculate_pp( + diff=difficulty, accuracy=self.accuracy, combo=self.combo, miss=self.misses + ) + except exceptions.osuApiFailException: + log.error("cicciobello ~> osu!api error!") + self.pp = 0 + except exceptions.unsupportedGameModeException: + log.error("cicciobello ~> Unsupported gamemode") + self.pp = 0 + except Exception as e: + log.error("cicciobello ~> Unhandled exception: {}".format(str(e))) + self.pp = 0 + raise + finally: + log.debug("cicciobello ~> Shutting down, pp = {}".format(self.pp)) \ No newline at end of file diff --git a/pp/cmyui-testing/CAy.rar b/pp/cmyui-testing/CAy.rar new file mode 100644 index 0000000000000000000000000000000000000000..f6e5deaf508869cc388581182fcb25ba0cb8eca7 GIT binary patch literal 1649048 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%0D4v_1BXk}@y!`zW3H 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

_vK_P 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%0DAMOb+cbn>8c+M-OuEeCD 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

n&dp0RQV)Qi7 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 paqW2kKpXc)#QiQ;GaHy<%t0;kHOahcXjw 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