├── .github └── workflows │ └── build.yml ├── .gitignore ├── LICENSE ├── README.md ├── build.gradle.kts ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── src └── main ├── kotlin ├── DXProberApi.kt ├── DrawImage.kt ├── GuessGame.kt ├── MaimaiBot.kt └── Utils.kt └── resources ├── META-INF └── services │ └── net.mamoe.mirai.console.plugin.jvm.JvmPlugin ├── config ├── aliases.csv ├── classical │ ├── b50_bg.png │ ├── category_chugeki.png │ ├── category_niconico.png │ ├── category_original.png │ ├── category_popsanime.png │ ├── category_touhou.png │ ├── category_variety.png │ ├── dani_00.png │ ├── dani_01.png │ ├── dani_02.png │ ├── dani_03.png │ ├── dani_04.png │ ├── dani_05.png │ ├── dani_06.png │ ├── dani_07.png │ ├── dani_08.png │ ├── dani_09.png │ ├── dani_10.png │ ├── dani_11.png │ ├── dani_12.png │ ├── dani_13.png │ ├── dani_14.png │ ├── dani_15.png │ ├── dani_16.png │ ├── dani_17.png │ ├── dani_18.png │ ├── dani_19.png │ ├── dani_20.png │ ├── dani_21.png │ ├── dani_22.png │ ├── dani_23.png │ ├── default_cover.jpg │ ├── default_cover.png │ ├── ds_bg.png │ ├── info.png │ ├── label_Advanced.png │ ├── label_Basic.png │ ├── label_Expert.png │ ├── label_Master.png │ ├── label_ReMASTER.png │ ├── music_icon_a.png │ ├── music_icon_aa.png │ ├── music_icon_aaa.png │ ├── music_icon_ap.png │ ├── music_icon_app.png │ ├── music_icon_b.png │ ├── music_icon_bb.png │ ├── music_icon_bbb.png │ ├── music_icon_c.png │ ├── music_icon_d.png │ ├── music_icon_fc.png │ ├── music_icon_fcp.png │ ├── music_icon_fs.png │ ├── music_icon_fsd.png │ ├── music_icon_fsdp.png │ ├── music_icon_fsp.png │ ├── music_icon_s.png │ ├── music_icon_sp.png │ ├── music_icon_ss.png │ ├── music_icon_ssp.png │ ├── music_icon_sss.png │ ├── music_icon_sssp.png │ ├── rating_base_01.png │ ├── rating_base_02.png │ ├── rating_base_03.png │ ├── rating_base_04.png │ ├── rating_base_05.png │ ├── rating_base_06.png │ ├── rating_base_07.png │ ├── rating_base_08.png │ ├── rating_base_09.png │ ├── rating_base_10.png │ ├── rating_base_11.png │ ├── score_bg.png │ ├── theme.yml │ ├── type_dx.png │ └── type_sd.png ├── portrait │ ├── b50_bg.png │ ├── category_chugeki.png │ ├── category_niconico.png │ ├── category_original.png │ ├── category_popsanime.png │ ├── category_touhou.png │ ├── category_variety.png │ ├── dani_00.png │ ├── dani_01.png │ ├── dani_02.png │ ├── dani_03.png │ ├── dani_04.png │ ├── dani_05.png │ ├── dani_06.png │ ├── dani_07.png │ ├── dani_08.png │ ├── dani_09.png │ ├── dani_10.png │ ├── dani_11.png │ ├── dani_12.png │ ├── dani_13.png │ ├── dani_14.png │ ├── dani_15.png │ ├── dani_16.png │ ├── dani_17.png │ ├── dani_18.png │ ├── dani_19.png │ ├── dani_20.png │ ├── dani_21.png │ ├── dani_22.png │ ├── dani_23.png │ ├── default_cover.png │ ├── ds_bg.png │ ├── info.png │ ├── label_Advanced.png │ ├── label_Basic.png │ ├── label_Expert.png │ ├── label_Master.png │ ├── label_ReMASTER.png │ ├── music_icon_a.png │ ├── music_icon_aa.png │ ├── music_icon_aaa.png │ ├── music_icon_ap.png │ ├── music_icon_app.png │ ├── music_icon_b.png │ ├── music_icon_bb.png │ ├── music_icon_bbb.png │ ├── music_icon_c.png │ ├── music_icon_d.png │ ├── music_icon_fc.png │ ├── music_icon_fcp.png │ ├── music_icon_fs.png │ ├── music_icon_fsd.png │ ├── music_icon_fsdp.png │ ├── music_icon_fsp.png │ ├── music_icon_s.png │ ├── music_icon_sp.png │ ├── music_icon_ss.png │ ├── music_icon_ssp.png │ ├── music_icon_sss.png │ ├── music_icon_sssp.png │ ├── rating_base_01.png │ ├── rating_base_02.png │ ├── rating_base_03.png │ ├── rating_base_04.png │ ├── rating_base_05.png │ ├── rating_base_06.png │ ├── rating_base_07.png │ ├── rating_base_08.png │ ├── rating_base_09.png │ ├── rating_base_10.png │ ├── rating_base_11.png │ ├── score_bg.png │ ├── theme.yml │ ├── type_dx.png │ └── type_sd.png └── portrait_splash │ ├── b50_bg.png │ ├── category_chugeki.png │ ├── category_niconico.png │ ├── category_original.png │ ├── category_popsanime.png │ ├── category_touhou.png │ ├── category_variety.png │ ├── dani_00.png │ ├── dani_01.png │ ├── dani_02.png │ ├── dani_03.png │ ├── dani_04.png │ ├── dani_05.png │ ├── dani_06.png │ ├── dani_07.png │ ├── dani_08.png │ ├── dani_09.png │ ├── dani_10.png │ ├── dani_11.png │ ├── dani_12.png │ ├── dani_13.png │ ├── dani_14.png │ ├── dani_15.png │ ├── dani_16.png │ ├── dani_17.png │ ├── dani_18.png │ ├── dani_19.png │ ├── dani_20.png │ ├── dani_21.png │ ├── dani_22.png │ ├── dani_23.png │ ├── default_cover.png │ ├── ds_bg.png │ ├── info.png │ ├── label_Advanced.png │ ├── label_Basic.png │ ├── label_Expert.png │ ├── label_Master.png │ ├── label_ReMASTER.png │ ├── music_icon_a.png │ ├── music_icon_aa.png │ ├── music_icon_aaa.png │ ├── music_icon_ap.png │ ├── music_icon_app.png │ ├── music_icon_b.png │ ├── music_icon_bb.png │ ├── music_icon_bbb.png │ ├── music_icon_c.png │ ├── music_icon_d.png │ ├── music_icon_fc.png │ ├── music_icon_fcp.png │ ├── music_icon_fs.png │ ├── music_icon_fsd.png │ ├── music_icon_fsdp.png │ ├── music_icon_fsp.png │ ├── music_icon_s.png │ ├── music_icon_sp.png │ ├── music_icon_ss.png │ ├── music_icon_ssp.png │ ├── music_icon_sss.png │ ├── music_icon_sssp.png │ ├── rating_base_01.png │ ├── rating_base_02.png │ ├── rating_base_03.png │ ├── rating_base_04.png │ ├── rating_base_05.png │ ├── rating_base_06.png │ ├── rating_base_07.png │ ├── rating_base_08.png │ ├── rating_base_09.png │ ├── rating_base_10.png │ ├── rating_base_11.png │ ├── score_bg.png │ ├── theme.yml │ ├── type_dx.png │ └── type_sd.png ├── export-rules.txt └── font ├── ariblk.ttf └── bb4171.ttf /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | push: 4 | branches: [ master ] 5 | paths-ignore: 6 | - 'docs/**' 7 | - '.gitignore' 8 | - 'README.md' 9 | pull_request: 10 | branches: [ master ] 11 | workflow_dispatch: 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v2 17 | 18 | - name: Set up JDK 11 19 | uses: actions/setup-java@v1 20 | with: 21 | java-version: '11' 22 | 23 | - name: chmod -R 777 * 24 | run: chmod -R 777 * 25 | 26 | - name: Init gradle project 27 | run: ./gradlew clean --scan && ./gradlew init 28 | 29 | - name: Build 30 | run: ./gradlew buildPlugin 31 | 32 | - name: Upload result 33 | uses: actions/upload-artifact@v2 34 | with: 35 | name: maimai-bot 36 | path: build/mirai/maimai-bot-*.jar -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # User-specific stuff 2 | .idea/ 3 | 4 | *.iml 5 | *.ipr 6 | *.iws 7 | 8 | # IntelliJ 9 | out/ 10 | # mpeltonen/sbt-idea plugin 11 | .idea_modules/ 12 | 13 | # JIRA plugin 14 | atlassian-ide-plugin.xml 15 | 16 | # Compiled class file 17 | *.class 18 | 19 | # Log file 20 | *.log 21 | 22 | # BlueJ files 23 | *.ctxt 24 | 25 | # Package Files # 26 | *.jar 27 | *.war 28 | *.nar 29 | *.ear 30 | *.zip 31 | *.tar.gz 32 | *.rar 33 | 34 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 35 | hs_err_pid* 36 | 37 | *~ 38 | 39 | # temporary files which can be created if a process still has a handle open of a deleted file 40 | .fuse_hidden* 41 | 42 | # KDE directory preferences 43 | .directory 44 | 45 | # Linux trash folder which might appear on any partition or disk 46 | .Trash-* 47 | 48 | # .nfs files are created when an open file is removed but is still being accessed 49 | .nfs* 50 | 51 | # General 52 | .DS_Store 53 | .AppleDouble 54 | .LSOverride 55 | 56 | # Icon must end with two \r 57 | Icon 58 | 59 | # Thumbnails 60 | ._* 61 | 62 | # Files that might appear in the root of a volume 63 | .DocumentRevisions-V100 64 | .fseventsd 65 | .Spotlight-V100 66 | .TemporaryItems 67 | .Trashes 68 | .VolumeIcon.icns 69 | .com.apple.timemachine.donotpresent 70 | 71 | # Directories potentially created on remote AFP share 72 | .AppleDB 73 | .AppleDesktop 74 | Network Trash Folder 75 | Temporary Items 76 | .apdisk 77 | 78 | # Windows thumbnail cache files 79 | Thumbs.db 80 | Thumbs.db:encryptable 81 | ehthumbs.db 82 | ehthumbs_vista.db 83 | 84 | # Dump file 85 | *.stackdump 86 | 87 | # Folder config file 88 | [Dd]esktop.ini 89 | 90 | # Recycle Bin used on file shares 91 | $RECYCLE.BIN/ 92 | 93 | # Windows Installer files 94 | *.cab 95 | *.msi 96 | *.msix 97 | *.msm 98 | *.msp 99 | 100 | # Windows shortcuts 101 | *.lnk 102 | 103 | .gradle 104 | build/ 105 | 106 | # Ignore Gradle GUI config 107 | gradle-app.setting 108 | 109 | # Cache of project 110 | .gradletasknamecache 111 | 112 | **/build/ 113 | 114 | # Common working directory 115 | run/ 116 | 117 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 118 | !gradle-wrapper.jar 119 | 120 | 121 | # Local Test Launch point 122 | src/test/kotlin 123 | debug-sandbox 124 | 125 | # Mirai console files with direct bootstrap 126 | /config 127 | /data 128 | /plugins 129 | /bots 130 | 131 | # Local Test Launch Point working directory 132 | /debug-sandbox 133 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # maimaiBot 2 | 3 | 一个基于 [mirai](https://github.com/mamoe/mirai) 和 [舞萌 DX 查分器](https://www.diving-fish.com/maimaidx/prober) 以及 [Xray Bot 别名信息](https://download.fanyu.site/maimai/alias_uc.json) 编写的 maimai DX QQ 机器人插件。 4 | 5 | 本项目是在 Kotlin 平台对 [mai-bot](https://github.com/Diving-Fish/mai-bot) 项目大部分功能进行重新实现,旨在提高生成速度及降低部署门槛。 6 | 7 | ## 支持的功能 8 | 9 | * b50 10 | * 查歌 11 | * XXX 是什么歌 12 | * 谱面详情(例:紫id11154) 13 | * 歌曲分数信息(例:info 潘) 14 | * 随机歌曲(例:随个紫12+) 15 | * 别名查询(例:11514有什么别名) 16 | * 定数查歌 17 | * 分数线 18 | * 猜歌 19 | * 随机推分金曲(例:mai什么加2分;随机推分金曲) 20 | * 随机推分列表 21 | * 牌子进度(例:晓极进度) 22 | * 牌子完成表(例:橙将完成表) 23 | * 等级进度(例:13ss+进度,11ap进度,10fdx进度,14clear进度) 24 | * 等级完成表(例:13+完成表) 25 | * 等级分数列表(例:14分数列表) 26 | 27 | 28 | ## 部署指南 29 | 30 | [点我下载](https://github.com/xszqxszq/maimai-bot/releases/latest) 31 | 32 | 本插件开箱即用,只需和其他插件一样放入 [MCL](https://github.com/iTXTech/mcl-installer) 或其他版本的 Mirai 控制台 的 ```plugins``` 目录即可。 33 | 34 | 如果您尚不清楚 Mirai 如何安装,请阅读 [Mirai 官方教程](https://github.com/mamoe/mirai/blob/dev/docs/UserManual.md) ,在安装好控制台后再安装本插件使用。 35 | 36 | ## 常见问题 37 | 38 | #### 插件指令完全没反应? 39 | 40 | 注意!!**请不要给 `*:*` 权限**,这会导致插件误认为该群禁用了所有功能。请删除 `*:*`。 41 | 42 | #### 如何在特定群关闭本插件功能? 43 | 44 | 在控制台输入 `/perm grant g114514 maimaiBot:denyall`,其中 114514 请替换成需要关闭插件的群号。 45 | 46 | #### 如何修改字体? 47 | 48 | 修改 ```config/xyz.xszq.maimai-bot/主题名/theme.yml``` 中的 ```fontName```值即可。 49 | 50 | #### 如何更新歌曲别名? 51 | 52 | 对于更新了新版本的用户:删除 `config/xyz.xszq.maimai-bot/aliases.csv` 并重启即可更新成新版本内置的别名表。 53 | 54 | 本项目内置的别名来自 [Xray Bot](https://download.fanyu.site/maimai/alias.json) ,bot 在启动时会自动更新。如需手动增加别名,请修改 ```config/xyz.xszq.maimai-bot/aliases.csv```,未来版本将会支持通过指令修改。 55 | 56 | #### 查不到任何歌曲谱面信息? 57 | 58 | 请检查 [舞萌 DX 查分器](https://www.diving-fish.com/maimaidx/prober) 是否可以访问,同时请检查您的网络连接是否畅通,是否开启了无效的代理设置等。 59 | 60 | #### 更新插件后部分内容没更新或者有误? 61 | 62 | 请关闭 bot 后删除 ```config/xyz.xszq.maimai-bot``` 文件夹和 ```data/xyz.xszq.maimai-bot``` 文件夹。 63 | 64 | 65 | ## 配置文件 66 | 67 | ```config/xyz.xszq.maimai-bot/settings.yml``` 为本插件的主配置文件,默认情况下无需修改。 68 | 69 | 配置各项说明如下: 70 | * `theme: portrait` 设置要使用的 b40 / b50 主题名称。`config/xyz.xszq.maimai-bot` 下的各文件夹为主题文件夹,文件夹名即主题名。插件自带的 *portrait* 主题为竖式 b40 / b50 ,*classical* 为经典的横式 b40 / b50。 71 | * `multiAccountsMode: false` 开启多账号登录支持。开启后如果 bot 多个号在一个群内时,对同一请求不会处理两次。 72 | * `coverSource: WAHLAP` 封面下载源。如果无法下载或者没有更新后新增的曲子,请尝试改成 `ZETARAKU`。 73 | * `maidataJsonUrls:` 封面下载源为 `WAHLAP` 时,包含图片文件名信息的 `maidata.json` 的下载地址。您可以根据网络情况更换为能访问的 GitHub Raw 镜像网址。 74 | * `zetarakuSite:` `ZETARAKU` 下载源服务器地址。如果无法下载,请访问 [maimai-songs](https://maimai-songs.zetaraku.dev/) 并用开发者工具获取新的服务器地址。 75 | * `xrayAliasUrl:` 本插件的别名数据来自于 Xray Bot 公开的别名信息,设置该项值可以指定从何处获取最新别名。 76 | * `prefix: ''` 设置命令的前缀。例如,设为 `'/mai'` 后,生成 b50 需要输入 `/mai b50` 才能调用 77 | * `enableMemCache: true` 是否提前载入图片到内存。如果您内存不够或者堆栈设置偏小,可以将这项设为 `false` 避免 `Java heap size` 等爆内存的情况。 78 | * `hintOnGeneration: false` 开启后将在生成 b50 或完成表时提醒现在正在生成中 -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | @file:Suppress("SpellCheckingInspection") 2 | 3 | plugins { 4 | val kotlinVersion = "1.8.10" 5 | kotlin("jvm") version kotlinVersion 6 | kotlin("plugin.serialization") version kotlinVersion 7 | 8 | id("net.mamoe.mirai-console") version "2.15.0" 9 | } 10 | 11 | group = "xyz.xszq" 12 | version = "1.3.8" 13 | val korlibsVersion = "2.7.0" 14 | val ktorVersion = "1.6.8" 15 | 16 | repositories { 17 | //maven("https://maven.aliyun.com/repository/public") 18 | mavenCentral() 19 | } 20 | 21 | dependencies { 22 | testImplementation("net.mamoe:mirai-core-mock:2.15.0") 23 | implementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.3.0") 24 | implementation("com.github.houbb:opencc4j:1.7.2") 25 | implementation("com.soywiz.korlibs.korim:korim:$korlibsVersion") 26 | implementation("com.soywiz.korlibs.korio:korio:$korlibsVersion") 27 | implementation("io.ktor:ktor-client-core:$ktorVersion") 28 | implementation("io.ktor:ktor-client-okhttp:$ktorVersion") 29 | implementation("io.ktor:ktor-client-serialization:$ktorVersion") 30 | implementation("net.mamoe.yamlkt:yamlkt:0.10.2") 31 | implementation("xyz.xszq:mirai-multi-account:1.1.2") 32 | implementation(kotlin("stdlib-jdk8")) 33 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | kotlin.code.style=official -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "maimai-bot" -------------------------------------------------------------------------------- /src/main/kotlin/DXProberApi.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("unused", "SpellCheckingInspection") 2 | 3 | package xyz.xszq 4 | 5 | import xyz.xszq.MaimaiImage.imgDir 6 | import com.soywiz.korio.async.launch 7 | import com.soywiz.korio.file.writeToFile 8 | import io.ktor.client.* 9 | import io.ktor.client.engine.okhttp.* 10 | import io.ktor.client.features.json.* 11 | import io.ktor.client.features.json.serializer.* 12 | import io.ktor.client.request.* 13 | import io.ktor.client.statement.* 14 | import io.ktor.http.* 15 | import kotlinx.coroutines.coroutineScope 16 | import kotlinx.coroutines.sync.Semaphore 17 | import kotlinx.coroutines.sync.withPermit 18 | import kotlinx.serialization.Serializable 19 | import kotlinx.serialization.decodeFromString 20 | import kotlinx.serialization.json.* 21 | 22 | 23 | @Serializable 24 | data class MaimaiPlayerData(val nickname: String, val rating: Int, val additional_rating: Int ?= null, val username: String, 25 | val charts: Map>) 26 | 27 | @Serializable 28 | open class MaimaiPlayScore(val achievements: Double, val ds: Double, val fc: String, val fs: String, 29 | val level: String, val level_index: Int, val level_label: String, var ra: Int, 30 | val rate: String, val song_id: Int, val title: String, val type: String) 31 | object EmptyMaimaiPlayRecord: MaimaiPlayScore(0.0, .0, "", "", "", 32 | 0, "", 0, "", -1, "", "") 33 | fun List.fillEmpty(target: Int): List { 34 | val result = toMutableList() 35 | for (i in 1..(target-size)) 36 | result.add(EmptyMaimaiPlayRecord) 37 | return result 38 | } 39 | 40 | @Serializable 41 | data class MaimaiMusicInfo(val id: String, val title: String, val type: String, var ds: MutableList, 42 | var level: MutableList, val cids: List, val charts: List, 43 | val basic_info: MaimaiMusicBasicInfo 44 | ) 45 | @Serializable 46 | data class MaimaiChartInfo(val notes: List, val charter: String) 47 | @Serializable 48 | data class MaimaiMusicBasicInfo(val title: String, val artist: String, val genre: String, val bpm: Int, 49 | val release_date: String, val from: String, val is_new: Boolean) 50 | @Serializable 51 | data class MaimaiChartNotes(val tap: Int, val hold: Int, val slide: Int, val break_: Int, val touch: Int ?= null) { 52 | companion object { 53 | fun fromList(notes: List): MaimaiChartNotes? = when (notes.size) { 54 | 4 -> MaimaiChartNotes(notes[0], notes[1], notes[2], notes[3], null) 55 | 5 -> MaimaiChartNotes(notes[0], notes[1], notes[2], notes[4], notes[3]) // Interesting result array 56 | else -> null 57 | } 58 | } 59 | } 60 | 61 | @Serializable 62 | data class MaimaiCharStatResponse( 63 | val charts: HashMap>, 64 | val diff_data: HashMap 65 | ) 66 | @Serializable 67 | data class MaimaiChartStat( 68 | val cnt: Double ?= null, val diff: String ?= null, val fit_diff: Double ?= null, 69 | val avg: Double ?= null, val avg_dx: Double ?= null, val std_dev: Double ?= null, 70 | val dist: List ?= null, val fc_dist: List ?= null 71 | ) 72 | @Serializable 73 | data class MaimaiChartLevelStat( 74 | val achievements: Double, 75 | val dist: List, 76 | val fc_dist: List 77 | ) 78 | 79 | @Serializable 80 | data class MaiDataItem(val title: String, val image_file: String, val artist: String) 81 | 82 | @Serializable 83 | data class ZetarakuResponse(val songs: List) 84 | 85 | @Serializable 86 | data class ZetarakuItem(val title: String, val imageName: String, val artist: String) 87 | 88 | @Serializable 89 | data class MaimaiPlateResponse(val verlist: List) 90 | 91 | @Serializable 92 | data class MaimaiBriefScore( 93 | val achievements: Double, val fc: String, val fs: String, val id: Int, val level: String, 94 | val level_index: Int, val title: String, val type: String) 95 | 96 | object DXProberApi { 97 | private const val site = "https://www.diving-fish.com" 98 | private val json = Json { isLenient = true; ignoreUnknownKeys = true } 99 | private val client = HttpClient(OkHttp) { 100 | install(JsonFeature) { 101 | serializer = KotlinxSerializer(kotlinx.serialization.json.Json { 102 | prettyPrint = true 103 | isLenient = true 104 | ignoreUnknownKeys = true 105 | }) 106 | } 107 | expectSuccess = false 108 | } 109 | suspend fun getMusicList(): Array { 110 | kotlin.runCatching { 111 | return client.get("$site/api/maimaidxprober/music_data") 112 | }.onFailure { 113 | it.printStackTrace() 114 | } 115 | return emptyArray() 116 | } 117 | suspend fun getCovers() { 118 | if (!imgDir.exists()) 119 | imgDir.mkdir() 120 | val covers = imgDir["covers"] 121 | if (!covers.exists()) 122 | covers.mkdir() 123 | MaimaiBot.logger.info("正在缓存歌曲封面中……") 124 | var cnt = 0 125 | val semaphore = Semaphore(32) 126 | coroutineScope { 127 | when (MaimaiConfig.coverSource) { 128 | CoverSource.WAHLAP -> { 129 | var songs = listOf() 130 | MaimaiConfig.maidataJsonUrls.forEach { 131 | kotlin.runCatching { 132 | client.get>(it) 133 | }.onSuccess { 134 | songs = it 135 | return@forEach 136 | } 137 | } 138 | MaimaiBotSharedData.musics.values.forEach { info -> 139 | val target = covers["${info.id}.jpg"] 140 | if (!target.exists()) { 141 | launch { 142 | semaphore.withPermit { 143 | kotlin.runCatching { 144 | val response = client.get( 145 | "https://maimai.wahlap.com/maimai-mobile/img/Music/" + 146 | songs.first { it.title.clean() == info.title.clean() && 147 | it.artist.clean() == info.basic_info.artist.clean() 148 | }.image_file 149 | ) 150 | if (response.status == HttpStatusCode.OK) { 151 | response.readBytes().writeToFile(target) 152 | cnt++ 153 | MaimaiBot.logger.info("${info.id}. ${info.title} 封面下载完成") 154 | } 155 | }.onFailure { e -> 156 | MaimaiBot.logger.verbose(e.stackTraceToString()) 157 | } 158 | } 159 | } 160 | } 161 | } 162 | } 163 | CoverSource.ZETARAKU -> { 164 | val songs = client.get("${MaimaiConfig.zetarakuSite}/maimai/data.json") 165 | MaimaiBotSharedData.musics.values.forEach { info -> 166 | val target = covers["${info.id}.jpg"] 167 | if (!target.exists()) { 168 | launch { 169 | semaphore.withPermit { 170 | kotlin.runCatching { 171 | val response = client.get( 172 | "${MaimaiConfig.zetarakuSite}/maimai/img/cover/" + 173 | songs.songs.first { 174 | it.title.clean() == info.title.clean() && 175 | it.artist.clean() == info.basic_info.artist.clean() 176 | }.imageName 177 | ) 178 | if (response.status == HttpStatusCode.OK) { 179 | response.readBytes().writeToFile(target) 180 | cnt++ 181 | MaimaiBot.logger.info("${info.id}. ${info.title} 封面下载完成") 182 | } 183 | }.onFailure { e -> 184 | MaimaiBot.logger.verbose(e.stackTraceToString()) 185 | } 186 | } 187 | } 188 | } 189 | } 190 | } 191 | } 192 | } 193 | MaimaiBot.logger.info("本次已缓存 $cnt 个歌曲封面。") 194 | } 195 | suspend fun getAliases() { 196 | MaimaiBot.logger.info("正在更新别名……") 197 | kotlin.runCatching { 198 | client.get>>(MaimaiConfig.xrayAliasUrl).forEach { (id, aliases) -> 199 | aliases.forEach { alias -> 200 | MaimaiBotSharedData.aliases[id]?.add(alias) 201 | } 202 | } 203 | }.onFailure { 204 | it.printStackTrace() 205 | } 206 | } 207 | suspend fun getPlayerData(type: String = "qq", id: String): Pair { 208 | val payload = buildJsonObject { 209 | put(type, id) 210 | put("b50", true) 211 | } 212 | kotlin.runCatching { 213 | val result: HttpResponse = client.post("$site/api/maimaidxprober/query/player") { 214 | contentType(ContentType.Application.Json) 215 | body = payload 216 | } 217 | return Pair(result.status, 218 | if (result.status == HttpStatusCode.OK) json.decodeFromString(result.readText()) else null) 219 | }.onFailure { 220 | return Pair(HttpStatusCode.BadGateway, null) 221 | } 222 | return Pair(HttpStatusCode.BadGateway, null) 223 | } 224 | suspend fun getDataByVersion(type: String = "qq", id: String, 225 | versions: List): Pair { 226 | val payload = buildJsonObject { 227 | put(type, id) 228 | put("version", JsonArray(versions.map { JsonPrimitive(it) })) 229 | } 230 | kotlin.runCatching { 231 | val result: HttpResponse = client.post("$site/api/maimaidxprober/query/plate") { 232 | contentType(ContentType.Application.Json) 233 | body = payload 234 | } 235 | return Pair(result.status, 236 | if (result.status == HttpStatusCode.OK) json.decodeFromString(result.readText()) else null) 237 | }.onFailure { 238 | return Pair(HttpStatusCode.BadGateway, null) 239 | } 240 | return Pair(HttpStatusCode.BadGateway, null) 241 | } 242 | suspend fun getChartStat(): HashMap> { 243 | kotlin.runCatching { 244 | return client.get("$site/api/maimaidxprober/chart_stats").charts 245 | }.onFailure { 246 | it.printStackTrace() 247 | } 248 | return hashMapOf() 249 | } 250 | } -------------------------------------------------------------------------------- /src/main/kotlin/DrawImage.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("MemberVisibilityCanBePrivate", "SpellCheckingInspection") 2 | 3 | package xyz.xszq 4 | 5 | import com.soywiz.kds.iterators.fastForEach 6 | import com.soywiz.kmem.toIntFloor 7 | import com.soywiz.korim.bitmap.Bitmap 8 | import com.soywiz.korim.bitmap.Bitmap32 9 | import com.soywiz.korim.bitmap.context2d 10 | import com.soywiz.korim.bitmap.effect.BitmapEffect 11 | import com.soywiz.korim.bitmap.effect.applyEffect 12 | import com.soywiz.korim.bitmap.sliceWithSize 13 | import com.soywiz.korim.color.Colors 14 | import com.soywiz.korim.color.RGBA 15 | import com.soywiz.korim.font.TtfFont 16 | import com.soywiz.korim.format.PNG 17 | import com.soywiz.korim.format.encode 18 | import com.soywiz.korim.format.readNativeImage 19 | import com.soywiz.korim.text.HorizontalAlign 20 | import com.soywiz.korim.text.TextAlignment 21 | import com.soywiz.korim.vector.Context2d 22 | import com.soywiz.korio.file.VfsFile 23 | import com.soywiz.korio.file.baseName 24 | import com.soywiz.korio.file.std.tempVfs 25 | import com.soywiz.korio.file.std.toVfs 26 | import com.soywiz.korio.net.MimeType 27 | import com.soywiz.korio.net.mimeType 28 | import kotlinx.coroutines.GlobalScope 29 | import kotlinx.coroutines.coroutineScope 30 | import kotlinx.coroutines.launch 31 | import kotlinx.coroutines.sync.Mutex 32 | import kotlinx.coroutines.sync.Semaphore 33 | import kotlinx.coroutines.sync.withLock 34 | import kotlinx.coroutines.sync.withPermit 35 | import kotlinx.serialization.Serializable 36 | import net.mamoe.mirai.console.data.AutoSavePluginConfig 37 | import net.mamoe.mirai.console.data.value 38 | import xyz.xszq.MaimaiBot.generateDsList 39 | import xyz.xszq.MaimaiBot.levels 40 | import xyz.xszq.MaimaiImage.resolveCoverCache 41 | import xyz.xszq.MaimaiImage.resolveImageCache 42 | import java.util.concurrent.ConcurrentHashMap 43 | import kotlin.math.min 44 | import kotlin.math.roundToInt 45 | 46 | 47 | @Serializable 48 | class MaiPicPosition(val fontName: String = "", val size: Int = 0, val x: Int, val y: Int, val scale: Double = 1.0) 49 | 50 | object MaimaiImage { 51 | val fonts = mutableMapOf() 52 | val imgDir = MaimaiBot.resolveDataFile("img").toVfs() 53 | val images = mutableMapOf() 54 | val sysFonts = MultiPlatformNativeSystemFontProvider() 55 | lateinit var theme: MaimaiPicTheme 56 | var dsGenerated = false 57 | suspend fun generateBest(info: MaimaiPlayerData): ByteArray { 58 | val config = theme.b50 59 | val result = resolveImageCache(config.bg).clone() 60 | info.charts.values.forEach { type -> 61 | type.fastForEach { 62 | it.ra = getNewRa(it.ds, it.achievements) 63 | } 64 | } 65 | val realRating = info.charts["sd"]!!.sumOf { it.ra } + info.charts["dx"]!!.sumOf { it.ra } 66 | return result.context2d { 67 | resolveImageCache("rating_base_${ratingColor(realRating)}.png").let { ratingBg -> 68 | drawImage(ratingBg, config.pos.getValue("ratingBg").x, config.pos.getValue("ratingBg").y) 69 | } 70 | drawText(info.nickname.toSBC(), config.pos.getValue("name")) 71 | drawText(realRating.toString().toList().joinToString(" "), config.pos.getValue("dxrating"), 72 | Colors.YELLOW, TextAlignment.RIGHT) 73 | if (info.additional_rating != null) { 74 | val dani = config.pos.getValue("dani") 75 | drawImage(resolveImageCache("dani_${rating2dani(info.additional_rating)}.png") 76 | .toBMP32().scaleLinear(dani.scale, dani.scale), dani.x, dani.y) 77 | } 78 | 79 | drawCharts(info.charts["sd"]!!.fillEmpty(35), config.oldCols, 80 | config.pos.getValue("oldCharts").x, config.pos.getValue("oldCharts").y, config) 81 | drawCharts(info.charts["dx"]!!.fillEmpty(15), config.newCols, 82 | config.pos.getValue("newCharts").x, config.pos.getValue("newCharts").y, config) 83 | dispose() 84 | }.encode(PNG) 85 | } 86 | suspend fun generateList(level: String, info: MaimaiPlayerData, l: List, 87 | nowPage: Int, totalPage: Int): ByteArray { 88 | val config = theme.scoreList 89 | val result = resolveImageCache(config.bg).clone() 90 | val realRating = info.charts["sd"]!!.sumOf { it.ra } + info.charts["dx"]!!.sumOf { it.ra } 91 | return result.context2d { 92 | drawText(info.nickname.toSBC(), config.pos.getValue("name")) 93 | drawImage(resolveImageCache("rating_base_${ratingColor(realRating)}.png"), config.pos.getValue("ratingBg").x, config.pos.getValue("ratingBg").y) 94 | drawText(info.nickname.toSBC(), config.pos.getValue("name")) 95 | drawText(realRating.toString().toList().joinToString(" "), config.pos.getValue("dxrating"), 96 | Colors.YELLOW, TextAlignment.RIGHT) 97 | if (info.additional_rating != null) { 98 | val dani = config.pos.getValue("dani") 99 | drawImage(resolveImageCache("dani_${rating2dani(info.additional_rating)}.png") 100 | .toBMP32().scaleLinear(dani.scale, dani.scale), dani.x, dani.y) 101 | } 102 | drawText("${level}分数列表,第 $nowPage 页 (共 $totalPage 页)", config.pos.getValue("info")) 103 | 104 | drawCharts(l.fillEmpty(50), config.oldCols, 105 | config.pos.getValue("oldCharts").x, config.pos.getValue("oldCharts").y, config) 106 | dispose() 107 | }.encode(PNG) 108 | } 109 | 110 | suspend fun reloadImages() { 111 | MaimaiBot.logger.info("正在载入图片中……") 112 | // 载入当前主题的所有图片,避免生成图片时频繁读取小图片 113 | MaimaiBot.resolveConfigFile(MaimaiConfig.theme).toVfs().listRecursive().collect { 114 | if (it.mimeType() in listOf(MimeType.IMAGE_JPEG, MimeType.IMAGE_PNG)) { 115 | runCatching { 116 | images[it.baseName] = it.readNativeImage() 117 | }.onFailure { e -> 118 | e.printStackTrace() 119 | } 120 | } 121 | } 122 | val lock = Mutex() 123 | // 载入封面 124 | if (MaimaiConfig.enableMemCache) { 125 | coroutineScope { 126 | MaimaiBot.resolveDataFile("img/covers").toVfs().listRecursive().collect { 127 | if (it.mimeType() == MimeType.IMAGE_JPEG) { 128 | launch { 129 | runCatching { 130 | val nowImage = it.readNativeImage() 131 | lock.withLock { 132 | images[it.baseName] = nowImage 133 | } 134 | }.onFailure { e -> 135 | e.printStackTrace() 136 | } 137 | } 138 | } 139 | } 140 | } 141 | } 142 | System.gc() 143 | if (!dsGenerated) { 144 | MaimaiBot.logger.info("正在生成定数表${if (MaimaiConfig.enableMemCache) "(请耐心等待)" else ""}……") 145 | dsGenerated = true 146 | val semaphore = Semaphore(if (MaimaiConfig.enableMemCache) 2 else 1) 147 | coroutineScope { 148 | levels.forEachIndexed { _, level -> 149 | launch { 150 | semaphore.withPermit { 151 | val bg = lock.withLock { 152 | resolveImageCache(theme.dsList.bg).clone() 153 | } 154 | val nowDs = generateDsList(level, bg, lock) 155 | tempVfs["ds/${level}.png"].writeBytes(nowDs.encode(PNG)) 156 | if (MaimaiConfig.enableMemCache) { 157 | lock.withLock { 158 | images["ds/${level}.png"] = nowDs 159 | } 160 | } 161 | } 162 | } 163 | } 164 | } 165 | MaimaiBot.logger.info("定数表生成完成。") 166 | } 167 | // 释放内存 168 | System.gc() 169 | 170 | MaimaiBot.logger.info("成功载入所有图片。") 171 | } 172 | fun reloadFonts() { 173 | theme.b50.pos.filterNot { it.value.fontName.isBlank() }.forEach { 174 | fonts[it.value.fontName] = sysFonts.locateFontByName(it.value.fontName) ?: sysFonts.defaultFont() 175 | } 176 | theme.scoreList.pos.filterNot { it.value.fontName.isBlank() }.forEach { 177 | fonts[it.value.fontName] = sysFonts.locateFontByName(it.value.fontName) ?: sysFonts.defaultFont() 178 | } 179 | theme.dsList.pos.filterNot { it.value.fontName.isBlank() }.forEach { 180 | fonts[it.value.fontName] = sysFonts.locateFontByName(it.value.fontName) ?: sysFonts.defaultFont() 181 | } 182 | } 183 | 184 | fun ratingColor(rating: Int): String = when (rating) { 185 | in 0..999 -> "01" 186 | in 1000..1999 -> "02" 187 | in 2000..3999 -> "03" 188 | in 4000..6999 -> "04" 189 | in 7000..9999 -> "05" 190 | in 10000..11999 -> "06" 191 | in 12000..12999 -> "07" 192 | in 13000..13999 -> "08" 193 | in 14000..14499 -> "09" 194 | in 14500..14999 -> "10" 195 | in 15000..40000 -> "11" 196 | else -> "01" 197 | } 198 | fun difficulty2Name(id: Int, english: Boolean = true): String { 199 | return if (english) { 200 | when (id) { 201 | 0 -> "Bas" 202 | 1 -> "Adv" 203 | 2 -> "Exp" 204 | 3 -> "Mst" 205 | 4 -> "ReM" 206 | else -> "" 207 | } 208 | } else { 209 | when (id) { 210 | 0 -> "绿" 211 | 1 -> "黄" 212 | 2 -> "红" 213 | 3 -> "紫" 214 | 4 -> "白" 215 | else -> "" 216 | } 217 | } 218 | } 219 | fun name2Difficulty(name: Char): Int? = 220 | when (name) { 221 | '绿' -> 0 222 | '黄' -> 1 223 | '红' -> 2 224 | '紫' -> 3 225 | '白' -> 4 226 | else -> null 227 | } 228 | fun levelIndex2Label(index: Int): String = 229 | when (index) { 230 | 0 -> "Basic" 231 | 1 -> "Advanced" 232 | 2 -> "Expert" 233 | 3 -> "Master" 234 | 4 -> "Re:MASTER" 235 | else -> "" 236 | } 237 | fun acc2rate(acc: Double): String = 238 | when (acc) { 239 | in 0.0..49.9999 -> "d" 240 | in 50.0..59.9999 -> "c" 241 | in 60.0..69.9999 -> "b" 242 | in 70.0..74.9999 -> "bb" 243 | in 75.0..79.9999 -> "bbb" 244 | in 80.0..89.9999 -> "a" 245 | in 90.0..93.9999 -> "aa" 246 | in 94.0..96.9999 -> "aaa" 247 | in 97.0..97.9999 -> "s" 248 | in 98.0..98.9999 -> "sp" 249 | in 99.0..99.4999 -> "ss" 250 | in 99.5..99.9999 -> "ssp" 251 | in 100.0..100.4999 -> "sss" 252 | in 100.5..101.0 -> "sssp" 253 | else -> "" 254 | } 255 | fun getNewRa(ds: Double, achievement: Double): Int { 256 | val baseRa = when (achievement) { 257 | in 0.0..49.9999 -> 7.0 258 | in 50.0..59.9999 -> 8.0 259 | in 60.0..69.9999 -> 9.6 260 | in 70.0..74.9999 -> 11.2 261 | in 75.0..79.9999 -> 12.0 262 | in 80.0..89.9999 -> 13.6 263 | in 90.0..93.9999 -> 15.2 264 | in 94.0..96.9999 -> 16.8 265 | in 97.0..97.9999 -> 20.0 266 | in 98.0..98.9999 -> 20.3 267 | in 99.0..99.4999 -> 20.8 268 | in 99.5..99.9999 -> 21.1 269 | in 100.0..100.4999 -> 21.6 270 | in 100.5..101.0 -> 22.4 271 | else -> 0.0 272 | } 273 | return (ds * (min(100.5, achievement) / 100) * baseRa).toIntFloor() 274 | } 275 | fun rating2dani(rating: Int): String = when (rating) { 276 | 0 -> "00" 277 | 1 -> "01" 278 | 2 -> "02" 279 | 3 -> "03" 280 | 4 -> "04" 281 | 5 -> "05" 282 | 6 -> "06" 283 | 7 -> "07" 284 | 8 -> "08" 285 | 9 -> "09" 286 | 10 -> "10" 287 | 11 -> "12" 288 | 12 -> "13" 289 | 13 -> "14" 290 | 14 -> "15" 291 | 15 -> "16" 292 | 16 -> "17" 293 | 17 -> "18" 294 | 18 -> "19" 295 | 19 -> "20" 296 | 20 -> "21" 297 | 21 -> "22" 298 | 22 -> "23" 299 | else -> "00" 300 | } 301 | fun genre2filename(genre: String): String = when (genre) { 302 | "舞萌" -> "original" 303 | "流行&动漫" -> "popsanime" 304 | "niconico & VOCALOID" -> "niconico" 305 | "东方Project" -> "touhou" 306 | "音击&中二节奏" -> "chugeki" 307 | "其他游戏" -> "variety" 308 | else -> "variety" 309 | } 310 | suspend fun resolveImageCache(path: String): Bitmap { 311 | return if (images.containsKey(path)) { 312 | images[path]!! 313 | } else { 314 | MaimaiBot.resolveConfigFile(path).toVfs().readNativeImage() 315 | } 316 | 317 | } 318 | suspend fun resolveCoverCache(id: Int): Bitmap { 319 | return if (MaimaiConfig.enableMemCache) { 320 | if (images.containsKey("$id.jpg")) 321 | images["$id.jpg"]!! 322 | else 323 | resolveImageCache("default_cover.png") 324 | } else { 325 | resolveCover(id).readNativeImage() 326 | } 327 | } 328 | suspend fun resolveCover(id: Int): VfsFile { 329 | return if (imgDir["covers/$id.jpg"].exists()) 330 | imgDir["covers/$id.jpg"] 331 | else 332 | MaimaiBot.resolveConfigFile("${MaimaiConfig.theme}/default_cover.png").toVfs() 333 | } 334 | suspend fun resolveCoverOrNull(id: String): VfsFile? { 335 | val target = imgDir["covers/$id.jpg"] 336 | return if (target.exists()) target else null 337 | } 338 | } 339 | 340 | 341 | const val DBC_SPACE = 32 342 | const val SBC_SPACE = 12288 343 | const val DBC_CHAR_START = 33 344 | const val DBC_CHAR_END = 126 345 | const val SBC_CHAR_START = 65281 346 | const val SBC_CHAR_END = 65374 347 | const val CONVERT_STEP = 65248 348 | fun String.toSBC(): String { 349 | val buf = StringBuilder(length) 350 | this.toCharArray().forEach { 351 | buf.append( 352 | when (it.code) { 353 | DBC_SPACE -> SBC_SPACE 354 | in DBC_CHAR_START..DBC_CHAR_END -> it + CONVERT_STEP 355 | else -> it 356 | } 357 | ) 358 | } 359 | return buf.toString() 360 | } 361 | fun String.toDBC(): String { 362 | val buf = StringBuilder(length) 363 | this.toCharArray().forEach { 364 | buf.append( 365 | when (it.code) { 366 | SBC_SPACE -> DBC_SPACE 367 | in SBC_CHAR_START..SBC_CHAR_END -> it - CONVERT_STEP 368 | else -> it 369 | } 370 | ) 371 | } 372 | return buf.toString() 373 | } 374 | 375 | fun Char.isDBC() = this.code in DBC_SPACE..DBC_CHAR_END 376 | fun String.ellipsize(max: Int): String { 377 | var result = "" 378 | var cnt = 0 379 | forEach { 380 | cnt += if (it.isDBC()) 1 else 2 381 | if (cnt > max) return@forEach 382 | result += it 383 | } 384 | return result + if (result.length != length) "…" else "" 385 | } 386 | fun String.limitDecimal(limit: Int = 4): String { 387 | if (toDoubleOrNull() == null) 388 | throw IllegalArgumentException("Only decimal String is allowed") 389 | var result = substringBefore('.') + '.' 390 | val afterPart = substringAfter('.') 391 | result += if (afterPart.length <= limit) 392 | afterPart + "0".repeat(4 - afterPart.length) 393 | else 394 | afterPart.substring(0, limit) 395 | return result 396 | } 397 | fun String.clean(): String { 398 | if (this == "Link(CoF)") 399 | return "Link" 400 | var result = this.toDBC() 401 | while (" " in result) 402 | result = result.replace(" ", " ") 403 | if (result.isBlank()) 404 | return "" 405 | return result 406 | } 407 | 408 | fun Context2d.drawText(text: String, attr: MaiPicPosition, color: RGBA = Colors.BLACK, 409 | align: TextAlignment = TextAlignment.LEFT) { 410 | this.font = MaimaiImage.fonts[attr.fontName] 411 | this.fontSize = attr.size.toDouble() 412 | this.alignment = align 413 | this.fillStyle = createColor(color) 414 | // TODO: Submit issue to korim to fix alignment, this is only a TEMPORARY solution 415 | val offsetx = if (this.alignment.horizontal == HorizontalAlign.RIGHT) -1 * (attr.size - 1) * (text.length / 2) else 0 416 | fillText(text, attr.x.toDouble() + offsetx, attr.y.toDouble()) 417 | } 418 | fun Context2d.drawTextRelative(text: String, x: Int, y: Int, attr: MaiPicPosition, 419 | color: RGBA = Colors.BLACK, align: TextAlignment = TextAlignment.LEFT) { 420 | this.font = MaimaiImage.fonts[attr.fontName] 421 | this.fontSize = attr.size.toDouble() 422 | this.alignment = align 423 | this.fillStyle = createColor(color) 424 | // TODO: Submit issue to korim to fix alignment, this is only a TEMPORARY solution 425 | val offsetx = if (this.alignment.horizontal == HorizontalAlign.RIGHT) -1 * (attr.size - 1) * (text.length / 2) else 0 426 | fillText(text, x + attr.x.toDouble() + offsetx, y + attr.y.toDouble()) 427 | } 428 | suspend fun Context2d.drawCharts(charts: List, cols: Int, startX: Int, startY: Int, 429 | config: MaimaiPicConfig, sort: Boolean = true 430 | ) { 431 | (if (sort) charts.sortedWith(compareBy({ -it.ra }, { -it.achievements })) 432 | else charts).forEachIndexed { index, chart -> 433 | val coverRaw = resolveCoverCache(chart.song_id).toBMP32().scaled(config.coverWidth, config.coverWidth, true) 434 | val newHeight = (coverRaw.width / config.coverRatio).roundToInt() 435 | var cover = coverRaw.sliceWithSize(0, (coverRaw.height - newHeight) / 2, 436 | coverRaw.width, newHeight).extract() 437 | cover = cover.blurFixedSize(2).brightness(-0.01f) 438 | val x = startX + (index % cols) * (cover.width + config.gapX) 439 | val y = startY + (index / cols) * (cover.height + config.gapY) 440 | 441 | state.fillStyle = Colors.BLACK // TODO: Make color changeable 442 | fillRect(x + config.pos.getValue("shadow").x, y + config.pos.getValue("shadow").y, 443 | cover.width, cover.height) 444 | drawImage(cover, x, y) 445 | if (chart.title != "") { 446 | val label = config.pos.getValue("label") 447 | drawImage(resolveImageCache("label_${chart.level_label.replace(":", "")}.png").toBMP32().scaleLinear(label.scale, label.scale), x + label.x, y + label.y) 448 | 449 | // Details 450 | drawTextRelative(chart.title.ellipsize(16), x, y, config.pos.getValue("chTitle"), Colors.WHITE) 451 | drawTextRelative(chart.achievements.toString().limitDecimal(4) + "%", x, y, 452 | config.pos.getValue("chAchievements"), Colors.WHITE) 453 | drawTextRelative("Base: ${chart.ds} -> ${chart.ra}", x, y, config.pos.getValue("chBase"), Colors.WHITE) 454 | 455 | config.pos["type"] ?.let { type -> 456 | drawImage( 457 | resolveImageCache("type_${chart.type.lowercase()}.png").toBMP32() 458 | .scaleLinear(type.scale, type.scale), 459 | x + type.x, y + type.y) 460 | } 461 | 462 | config.pos["rateIcon"] ?.let { rateIcon -> 463 | drawImage( 464 | resolveImageCache("music_icon_${chart.rate}.png").toBMP32() 465 | .scaleLinear(rateIcon.scale, rateIcon.scale), 466 | x + rateIcon.x, y + rateIcon.y 467 | ) 468 | } 469 | if (chart.fc.isNotEmpty()) { 470 | config.pos["fcIcon"] ?.let { fcIcon -> 471 | drawImage( 472 | resolveImageCache("music_icon_${chart.fc}.png").toBMP32() 473 | .scaleLinear(fcIcon.scale, fcIcon.scale), 474 | x + fcIcon.x, y + fcIcon.y 475 | ) 476 | } 477 | } 478 | if (chart.fs.isNotEmpty()) { 479 | config.pos["fsIcon"] ?.let { fsIcon -> 480 | drawImage( 481 | resolveImageCache("music_icon_${chart.fs}.png").toBMP32() 482 | .scaleLinear(fsIcon.scale, fsIcon.scale), 483 | x + fsIcon.x, y + fsIcon.y 484 | ) 485 | } 486 | } 487 | } 488 | } 489 | } 490 | 491 | 492 | fun Bitmap32.blurFixedSize(radius: Int) = applyEffect(BitmapEffect(radius)) 493 | .removeAlpha().sliceWithSize(radius, radius, width, height).extract() 494 | fun Bitmap32.brightness(ratio: Float = 0.6f): Bitmap32 { 495 | if (ratio > 1f || ratio < -1f) 496 | throw IllegalArgumentException("Ratio must be in [-1, 1]") 497 | val real = ratio / 2f + 0.5f 498 | updateColors { 499 | it.times(RGBA.float(real, real, real, 1f)) 500 | } 501 | return this 502 | } 503 | fun Bitmap32.removeAlpha(): Bitmap32 { 504 | forEach { _, x, y -> 505 | this[x, y] = RGBA(this[x, y].r, this[x, y].g, this[x, y].b, 255) 506 | } 507 | return this 508 | } 509 | fun Bitmap.randomSlice(size: Int = 66) = 510 | sliceWithSize((0..width - size).random(), (0..height - size).random(), size, size).extract() 511 | 512 | enum class CoverSource { 513 | WAHLAP, ZETARAKU 514 | } 515 | 516 | object MaimaiConfig: AutoSavePluginConfig("settings") { 517 | val theme: String by value("portrait") 518 | val multiAccountsMode: Boolean by value(false) 519 | val coverSource: CoverSource by value(CoverSource.ZETARAKU) 520 | val maidataJsonUrls: List by value( 521 | listOf( 522 | "https://raw.githubusercontent.com/CrazyKidCN/maimaiDX-CN-songs-database/main/maidata.json", 523 | "https://cdn.jsdelivr.net/gh/CrazyKidCN/maimaiDX-CN-songs-database@main/maidata.json", 524 | "https://raw.fastgit.org/CrazyKidCN/maimaiDX-CN-songs-database/main/maidata.json", 525 | "https://cdn.githubjs.cf/CrazyKidCN/maimaiDX-CN-songs-database/raw/main/maidata.json", 526 | ) 527 | ) 528 | val zetarakuSite: String by value("https://dp4p6x0xfi5o9.cloudfront.net") 529 | val xrayAliasUrl: String by value("https://download.fanyu.site/maimai/alias_uc.json") // Not stable 530 | val prefix: String by value("") 531 | val enableMemCache: Boolean by value(true) 532 | val hintOnGeneration: Boolean by value(false) 533 | val showLoadTime: Boolean by value(false) 534 | } 535 | @Serializable 536 | class MaimaiPicConfig( 537 | val bg: String, val coverWidth: Int, val coverRatio: Double, val oldCols: Int, val newCols: Int, 538 | val gapX: Int, val gapY: Int, 539 | val pos: Map) 540 | 541 | @Serializable 542 | class MaimaiPicTheme(val b50: MaimaiPicConfig, val scoreList: MaimaiPicConfig, 543 | val dsList: MaimaiPicConfig, val info: MaimaiPicConfig) 544 | 545 | val difficulty2Color = listOf(RGBA(124, 216, 79), RGBA(245, 187, 11), RGBA(255, 128, 140), 546 | RGBA(178, 91, 245), RGBA(244, 212, 255)) -------------------------------------------------------------------------------- /src/main/kotlin/GuessGame.kt: -------------------------------------------------------------------------------- 1 | package xyz.xszq 2 | 3 | import com.soywiz.korim.format.PNG 4 | import com.soywiz.korim.format.encode 5 | import com.soywiz.korim.format.readNativeImage 6 | import com.soywiz.korma.math.roundDecimalPlaces 7 | import kotlinx.coroutines.coroutineScope 8 | import kotlinx.coroutines.delay 9 | import kotlinx.coroutines.launch 10 | import net.mamoe.mirai.event.events.GroupMessageEvent 11 | import net.mamoe.mirai.message.data.MessageChainBuilder 12 | import net.mamoe.mirai.message.data.content 13 | import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource 14 | import net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage 15 | import java.util.Collections.synchronizedMap 16 | 17 | object GuessGame { 18 | private val guessStart = synchronizedMap(mutableMapOf()) 19 | private var cooldown = 5000L 20 | private var expectedFinishAfter = (7 * cooldown + 30000L) 21 | private fun isFinished(group: Long) = guessStart[group]?.let { 22 | if (System.currentTimeMillis() - it > expectedFinishAfter) { 23 | reset(group) // Prevent unavailable after exception 24 | true 25 | } else { 26 | false 27 | } 28 | } ?: true 29 | private fun setStart(group: Long) = run { guessStart[group] = System.currentTimeMillis() } 30 | private fun reset(group: Long) = run { guessStart.remove(group) } 31 | suspend fun handle(event: GroupMessageEvent) = event.run { 32 | if (!isFinished(group.id)) { 33 | quoteReply("本群有正在进行的猜歌哦~") 34 | } else { 35 | setStart(group.id) 36 | getRandomHot().let { selected -> 37 | val stat = MaimaiBotSharedData.stats[selected.id]!! 38 | quoteReply("请各位发挥自己的聪明才智,根据我的提示来猜一猜这是哪一首歌曲吧!\n" + 39 | "作答时,歌曲 id、歌曲标题(请尽量回答完整)、歌曲别名都将被视作有效答案哦~\n" + 40 | "(致管理员:您可以使用“猜歌设置”指令开启或者关闭本群的猜歌功能)") 41 | val descriptions = getDescriptions(selected, stat).shuffled().take(6) 42 | val ansList = mutableListOf(selected.id, selected.title) 43 | MaimaiBotSharedData.aliases[selected.id] ?.let { ansList.addAll(it) } 44 | if (selected.type == "SD" && MaimaiBotSharedData.musics.containsKey(selected.id.toDXId())) { 45 | ansList.add(selected.id.toDXId()) 46 | MaimaiBotSharedData.aliases[selected.id.toDXId()] 47 | ?.let { ansList.addAll(it) } 48 | } 49 | val options = if (MaimaiImage.resolveCoverOrNull(selected.id) == null) 6 else 7 50 | ansList.replaceAll { it.lowercase() } 51 | coroutineScope { 52 | var finished = false 53 | launch { 54 | descriptions.forEachIndexed { index, desc -> 55 | delay(cooldown) 56 | if (finished) 57 | return@launch 58 | group.sendMessage("${index + 1}/$options. 这首歌$desc") 59 | } 60 | val last = MessageChainBuilder() 61 | if (options == 7) { 62 | MaimaiImage.resolveCover(selected.id.toInt()).readNativeImage().randomSlice().encode(PNG) 63 | .toExternalResource().use { 64 | last.add("$options/$options. 这首歌的封面部分如图:") 65 | last.add(it.uploadAsImage(group)) 66 | } 67 | } 68 | last.add("\n30秒后将揭晓答案哦~") 69 | delay(cooldown) 70 | if (finished) 71 | return@launch 72 | group.sendMessage(last.build()) 73 | delay(30000L) 74 | } 75 | launch { 76 | kotlin.runCatching { 77 | val answer = nextMessageEvent(expectedFinishAfter) { 78 | ansList.any { ans -> 79 | ans == message.content.lowercase() || 80 | ans in message.content.lowercase() 81 | || (message.content.length >= 5 && message.content.lowercase() in ans) 82 | } 83 | } 84 | finished = true 85 | val reply = MessageChainBuilder() 86 | reply.add("恭喜您猜中了哦~\n") 87 | answer.quoteReply(MaimaiBot.getMusicBriefForSend(selected, event, reply).build()) 88 | reset(group.id) 89 | }.onFailure { 90 | val reply = MessageChainBuilder() 91 | reply.add("很遗憾,没有人猜中哦\n") 92 | group.sendMessage(MaimaiBot.getMusicBriefForSend(selected, event, reply).build()) 93 | reset(group.id) 94 | } 95 | } 96 | } 97 | } 98 | } 99 | } 100 | private fun getRandomHot(): MaimaiMusicInfo { 101 | if (MaimaiBotSharedData.randomHotMusics.isEmpty()) { 102 | MaimaiBotSharedData.randomHotMusics = MaimaiBotSharedData.hotList.mapNotNull { 103 | MaimaiBotSharedData.musics.getOrDefault(it, null) 104 | }.shuffled().toMutableList() 105 | } 106 | val target = MaimaiBotSharedData.randomHotMusics.first() 107 | MaimaiBotSharedData.randomHotMusics.removeFirst() 108 | return target 109 | } 110 | private fun getDescriptions(song: MaimaiMusicInfo, stat: List) = listOf( 111 | "的版本为 ${song.basic_info.from}${if (song.basic_info.is_new) " (计入b15)" else ""}", 112 | "的艺术家为 ${song.basic_info.artist}", 113 | "的分类为 ${song.basic_info.genre}", 114 | "的 BPM 为 ${song.basic_info.bpm}", 115 | "的红谱等级为 ${song.level[2]},查分器拟合定数为${stat[2].fit_diff!!.roundDecimalPlaces(1)}", 116 | "的紫谱等级为 ${song.level[3]},查分器拟合定数为${stat[3].fit_diff!!.roundDecimalPlaces(1)}", 117 | "的紫谱谱师为 ${song.charts[3].charter}", 118 | "${if (song.level.size == 4) "没有" else "有"}白谱", 119 | if (song.type=="DX") "是 DX 谱面" else if (MaimaiBotSharedData.musics 120 | .containsKey(song.id.toDXId())) "既有 DX 谱面也有标准谱面" else "没有 DX 谱面" 121 | ) 122 | private fun tagEnToCh(tag: String) = when (tag) { 123 | "Very Easy" -> "十分简单" 124 | "Easy" -> "简单" 125 | "Medium" -> "中等" 126 | "Hard" -> "困难" 127 | "Very Hard" -> "十分困难" 128 | else -> tag 129 | } 130 | } 131 | fun String.toDXId() = filter { !it.isDigit() } + "10" + filter { it.isDigit() } -------------------------------------------------------------------------------- /src/main/kotlin/Utils.kt: -------------------------------------------------------------------------------- 1 | package xyz.xszq 2 | 3 | import com.github.houbb.opencc4j.util.ZhConverterUtil 4 | import com.soywiz.kds.atomic.kdsFreeze 5 | import com.soywiz.klock.measureTime 6 | import com.soywiz.klock.measureTimeWithResult 7 | import com.soywiz.klock.milliseconds 8 | import com.soywiz.korim.font.DefaultTtfFont 9 | import com.soywiz.korim.font.TtfFont 10 | import com.soywiz.korim.font.TtfNativeSystemFontProvider 11 | import com.soywiz.korio.async.runBlockingNoJs 12 | import com.soywiz.korio.concurrent.atomic.KorAtomicRef 13 | import com.soywiz.korio.file.VfsFile 14 | import com.soywiz.korio.file.baseName 15 | import com.soywiz.korio.file.std.localVfs 16 | import com.soywiz.korio.lang.Environment 17 | import com.soywiz.korio.lang.expand 18 | import kotlinx.coroutines.withTimeout 19 | import net.mamoe.mirai.console.permission.Permission 20 | import net.mamoe.mirai.console.permission.PermissionService.Companion.hasPermission 21 | import net.mamoe.mirai.console.permission.PermitteeId.Companion.permitteeId 22 | import net.mamoe.mirai.contact.Contact 23 | import net.mamoe.mirai.event.EventPriority 24 | import net.mamoe.mirai.event.MessageDsl 25 | import net.mamoe.mirai.event.MessageSubscribersBuilder 26 | import net.mamoe.mirai.event.events.FriendMessageEvent 27 | import net.mamoe.mirai.event.events.GroupMessageEvent 28 | import net.mamoe.mirai.event.events.MessageEvent 29 | import net.mamoe.mirai.event.syncFromEvent 30 | import net.mamoe.mirai.message.MessageReceipt 31 | import net.mamoe.mirai.message.data.Message 32 | import net.mamoe.mirai.message.data.MessageSource.Key.quote 33 | import net.mamoe.mirai.message.data.toPlainText 34 | import net.mamoe.mirai.utils.ExternalResource 35 | import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource 36 | 37 | val pass = {} 38 | 39 | suspend fun MessageEvent.notDenied(permission: Permission, block: suspend () -> T): T? = when (this) { 40 | is GroupMessageEvent -> { 41 | if (group.permitteeId.hasPermission(permission)) 42 | null 43 | else 44 | block.invoke() 45 | } 46 | is FriendMessageEvent -> { 47 | if (sender.permitteeId.hasPermission(permission)) 48 | null 49 | else 50 | block.invoke() 51 | } 52 | else -> null 53 | } 54 | 55 | @PublishedApi // inline, safe to remove in the future 56 | internal inline fun 57 | P.createMapperForGroup(crossinline filter: suspend P.(P) -> Boolean): suspend (P) -> P? = 58 | mapper@{ event -> 59 | if (event !is GroupMessageEvent) return@mapper null 60 | if (!event.isGroupIdenticalWith(this as GroupMessageEvent)) return@mapper null 61 | if (!filter(event, event)) return@mapper null 62 | event 63 | } 64 | @JvmSynthetic 65 | suspend inline fun P.nextMessageEvent( 66 | timeoutMillis: Long = -1, 67 | priority: EventPriority = EventPriority.MONITOR, 68 | noinline filter: suspend P.(P) -> Boolean = { true } 69 | ): MessageEvent { 70 | val mapper: suspend (P) -> P? = createMapperForGroup(filter) 71 | 72 | return (if (timeoutMillis == -1L) { 73 | MaimaiBot.channel.syncFromEvent(priority, mapper) 74 | } else { 75 | withTimeout(timeoutMillis) { 76 | MaimaiBot.channel.syncFromEvent(priority, mapper) 77 | } 78 | }) 79 | } 80 | fun GroupMessageEvent.isGroupIdenticalWith(another: GroupMessageEvent): Boolean { 81 | return this.group == another.group 82 | } 83 | 84 | suspend fun MessageEvent.quoteReply(message: Message): MessageReceipt = 85 | this.subject.sendMessage(this.message.quote() + message) 86 | suspend fun MessageEvent.quoteReply(message: String): MessageReceipt = quoteReply(message.toPlainText()) 87 | 88 | 89 | typealias MessageListener = @MessageDsl suspend T.(String) -> R 90 | @MessageDsl 91 | internal fun MessageSubscribersBuilder.content( 92 | filter: M.(String) -> Boolean, 93 | onEvent: MessageListener 94 | ): Ret = 95 | subscriber(filter) { onEvent(this, it) } 96 | 97 | 98 | fun String.substringAfterPrefix(start: String): String = substring(start.length) 99 | fun String.toSimple(): String = ZhConverterUtil.toSimple(this) 100 | 101 | internal fun MessageSubscribersBuilder.startsWithSimpleImpl( 102 | prefix: String, 103 | removePrefix: Boolean = true, 104 | trim: Boolean = true, 105 | onEvent: @MessageDsl suspend M.(String, String) -> R 106 | ): Ret { 107 | return if (trim) { 108 | val toCheck = prefix.trim() 109 | content({ it.toSimple().lowercase().trimStart().startsWith(toCheck) }) { 110 | if (removePrefix) onEvent(message.contentToString().toSimple().lowercase().substringAfter(toCheck).trim(), 111 | message.contentToString().substringAfterPrefix(toCheck).trim()) 112 | else onEvent(this, message.contentToString().toSimple().lowercase().trim(), 113 | message.contentToString().trim()) 114 | } 115 | } else content({ it.toSimple().lowercase().startsWith(prefix) }) { 116 | if (removePrefix) onEvent(message.contentToString().toSimple().lowercase().removePrefix(prefix), 117 | message.contentToString().substringAfterPrefix(prefix).trim()) 118 | else onEvent(this, message.contentToString().toSimple().lowercase(), 119 | message.contentToString().trim()) 120 | } 121 | } 122 | /** 123 | * startsWith对于繁体增加支持的版本 124 | * M.(简体化且小写后的参数, 原始参数) -> R 125 | */ 126 | @MessageDsl 127 | fun MessageSubscribersBuilder.startsWithSimple( 128 | prefix: String, removePrefix: Boolean = true, trim: Boolean = true, 129 | onEvent: @MessageDsl suspend M.(String, String) -> R 130 | ): Ret = startsWithSimpleImpl(prefix, removePrefix, trim, onEvent) 131 | 132 | fun String.toArgsList(): List = this.trim().split(" +".toRegex()).toMutableList().filter { isNotBlank() } 133 | 134 | suspend fun VfsFile.toExternalResource(): ExternalResource = readBytes().toExternalResource() 135 | 136 | 137 | private val linuxFolders get() = listOf("/usr/share/fonts", "/usr/local/share/fonts", "~/.fonts") 138 | private val windowsFolders get() = listOf("%WINDIR%\\Fonts", "%LOCALAPPDATA%\\Microsoft\\Windows\\Fonts") 139 | private val macosFolders get() = listOf("/System/Library/Fonts/", "/Library/Fonts/", "~/Library/Fonts/", "/Network/Library/Fonts/") 140 | private val iosFolders get() = listOf("/System/Library/Fonts/Cache", "/System/Library/Fonts") 141 | private val androidFolders get() = listOf("/system/Fonts", "/system/font", "/data/fonts") 142 | 143 | // TODO: Remove this after korim fixed the bug 144 | open class MultiPlatformNativeSystemFontProvider( 145 | private val folders: List = linuxFolders + windowsFolders + macosFolders + androidFolders + iosFolders 146 | + listOf(MaimaiBot.resolveDataFile("font").absolutePath), 147 | private val fontCacheFile: String = "~/.korimFontCache" 148 | ) : TtfNativeSystemFontProvider() { 149 | private fun listFontNamesMap(): Map = runBlockingNoJs { 150 | val out = LinkedHashMap() 151 | val time = measureTime { 152 | val fontCacheVfsFile = localVfs(Environment.expand(fontCacheFile)) 153 | val fileNamesToName = LinkedHashMap() 154 | val oldFontCacheVfsFileText = try { 155 | fontCacheVfsFile.readString() 156 | } catch (e: Throwable) { 157 | "" 158 | } 159 | for (line in oldFontCacheVfsFileText.split("\n")) { 160 | val (file, name) = line.split("=", limit = 2) + listOf("", "") 161 | fileNamesToName[file] = name 162 | } 163 | for (folder in folders) { 164 | try { 165 | val file = localVfs(Environment.expand(folder)) 166 | for (f in file.listRecursiveSimple()) { 167 | try { 168 | val name = fileNamesToName.getOrPut(f.baseName) { 169 | val (ttf, _) = measureTimeWithResult { TtfFont.readNames(f) } 170 | //if (totalTime >= 1.milliseconds) println("Compute name size[${f.size()}] '${ttf.ttfCompleteName}' $totalTime") 171 | ttf.ttfCompleteName 172 | } 173 | //println("name=$name, f=$f") 174 | if (name != "") { 175 | out[name] = f 176 | } 177 | } catch (e: Throwable) { 178 | fileNamesToName.getOrPut(f.baseName) { "" } 179 | } 180 | } 181 | } catch (_: Throwable) { 182 | } 183 | } 184 | val newFontCacheVfsFileText = fileNamesToName.map { "${it.key}=${it.value}" }.joinToString("\n") 185 | if (newFontCacheVfsFileText != oldFontCacheVfsFileText) { 186 | try { 187 | fontCacheVfsFile.writeString(newFontCacheVfsFileText) 188 | } catch (e: Throwable) { 189 | e.printStackTrace() 190 | } 191 | } 192 | } 193 | if (time >= 100.milliseconds) { 194 | println("Load System font names in $time") 195 | } 196 | //println("fileNamesToName: $fileNamesToName") 197 | out 198 | } 199 | 200 | private fun listFontNamesMapLC(): Map = listFontNamesMap().mapKeys { it.key.normalizeName() } 201 | override fun defaultFont(): TtfFont = DefaultTtfFont 202 | 203 | override fun listFontNamesWithFiles(): Map = listFontNamesMap() 204 | 205 | private val _namesMapLC = KorAtomicRef?>(null) 206 | private val namesMapLC: Map get() { 207 | if (_namesMapLC.value == null) { 208 | _namesMapLC.value = kdsFreeze(listFontNamesMapLC()) 209 | } 210 | return _namesMapLC.value!! 211 | } 212 | 213 | override fun loadFontByName(name: String, freeze: Boolean): TtfFont? = 214 | runBlockingNoJs { namesMapLC[name.normalizeName()]?.let { TtfFont(it.readAll(), freeze = freeze) } } 215 | } -------------------------------------------------------------------------------- /src/main/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin: -------------------------------------------------------------------------------- 1 | xyz.xszq.MaimaiBot -------------------------------------------------------------------------------- /src/main/resources/config/classical/b50_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/b50_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/category_chugeki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/category_chugeki.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/category_niconico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/category_niconico.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/category_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/category_original.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/category_popsanime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/category_popsanime.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/category_touhou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/category_touhou.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/category_variety.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/category_variety.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_00.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_01.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_02.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_03.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_04.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_05.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_06.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_07.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_08.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_09.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_10.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_11.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_12.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_13.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_14.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_15.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_16.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_17.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_18.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_19.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_20.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_21.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_22.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/dani_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/dani_23.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/default_cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/default_cover.jpg -------------------------------------------------------------------------------- /src/main/resources/config/classical/default_cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/default_cover.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/ds_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/ds_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/info.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/label_Advanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/label_Advanced.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/label_Basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/label_Basic.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/label_Expert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/label_Expert.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/label_Master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/label_Master.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/label_ReMASTER.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/label_ReMASTER.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_a.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_aa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_aa.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_aaa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_aaa.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_ap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_ap.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_app.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_b.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_bb.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_bbb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_bbb.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_c.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_d.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_fc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_fc.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_fcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_fcp.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_fs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_fs.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_fsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_fsd.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_fsdp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_fsdp.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_fsp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_fsp.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_s.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_sp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_sp.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_ss.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_ssp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_ssp.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_sss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_sss.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/music_icon_sssp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/music_icon_sssp.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_01.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_02.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_03.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_04.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_05.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_06.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_07.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_08.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_09.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_10.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/rating_base_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/rating_base_11.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/score_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/score_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/theme.yml: -------------------------------------------------------------------------------- 1 | b50: 2 | bg: b50_bg.png 3 | coverWidth: 190 4 | coverRatio: 1.7777777777777777 5 | oldCols: 7 6 | newCols: 3 7 | gapX: 8 8 | gapY: 8 9 | pos: 10 | name: 11 | fontName: Source Han Sans CN Bold Bold 12 | size: 30 13 | x: 484 14 | y: 60 15 | scale: 1.0 16 | dxrating: 17 | fontName: Arial Black 18 | size: 16 19 | x: 980 20 | y: 55 21 | scale: 1.0 22 | chTitle: 23 | fontName: Source Han Sans CN Bold Bold 24 | size: 20 25 | x: 10 26 | y: 51 27 | scale: 1.0 28 | chAchievements: 29 | fontName: Source Han Sans CN Bold Bold 30 | size: 18 31 | x: 10 32 | y: 76 33 | scale: 1.0 34 | chBase: 35 | fontName: Source Han Sans CN Bold Bold 36 | size: 14 37 | x: 10 38 | y: 96 39 | scale: 1.0 40 | label: 41 | fontName: '' 42 | size: 0 43 | x: -21 44 | y: 0 45 | scale: 1.1875 46 | rateIcon: 47 | fontName: '' 48 | size: 0 49 | x: 110 50 | y: 55 51 | scale: 0.9 52 | fcIcon: 53 | fontName: '' 54 | size: 0 55 | x: 160 56 | y: 50 57 | scale: 0.7 58 | fsIcon: 59 | fontName: '' 60 | size: 0 61 | x: 160 62 | y: 78 63 | scale: 0.7 64 | type: 65 | fontName: '' 66 | size: 0 67 | x: 10 68 | y: 5 69 | scale: 1.0 70 | shadow: 71 | fontName: '' 72 | size: 0 73 | x: 4 74 | y: 4 75 | scale: 1.0 76 | oldCharts: 77 | fontName: '' 78 | size: 0 79 | x: 10 80 | y: 258 81 | scale: 1.0 82 | newCharts: 83 | fontName: '' 84 | size: 0 85 | x: 1444 86 | y: 258 87 | scale: 1.0 88 | ratingBg: 89 | fontName: '' 90 | size: 0 91 | x: 858 92 | y: 33 93 | scale: 1.0 94 | dani: 95 | fontName: '' 96 | size: 0 97 | x: 1000 98 | y: 26 99 | scale: 0.7 100 | scoreList: 101 | bg: score_bg.png 102 | coverWidth: 190 103 | coverRatio: 1.7777777777777777 104 | oldCols: 10 105 | newCols: 3 106 | gapX: 8 107 | gapY: 8 108 | pos: 109 | name: 110 | fontName: Source Han Sans CN Bold Bold 111 | size: 30 112 | x: 484 113 | y: 60 114 | scale: 1.0 115 | dxrating: 116 | fontName: Arial Black 117 | size: 16 118 | x: 980 119 | y: 55 120 | scale: 1.0 121 | chTitle: 122 | fontName: Source Han Sans CN Bold Bold 123 | size: 20 124 | x: 10 125 | y: 51 126 | scale: 1.0 127 | chAchievements: 128 | fontName: Source Han Sans CN Bold Bold 129 | size: 18 130 | x: 10 131 | y: 76 132 | scale: 1.0 133 | chBase: 134 | fontName: Source Han Sans CN Bold Bold 135 | size: 14 136 | x: 10 137 | y: 96 138 | scale: 1.0 139 | info: 140 | fontName: Source Han Sans CN Bold Bold 141 | size: 20 142 | x: 600 143 | y: 124 144 | scale: 1.0 145 | label: 146 | fontName: '' 147 | size: 0 148 | x: -21 149 | y: 0 150 | scale: 1.1875 151 | rateIcon: 152 | fontName: '' 153 | size: 0 154 | x: 110 155 | y: 55 156 | scale: 0.9 157 | fcIcon: 158 | fontName: '' 159 | size: 0 160 | x: 160 161 | y: 50 162 | scale: 0.7 163 | fsIcon: 164 | fontName: '' 165 | size: 0 166 | x: 160 167 | y: 78 168 | scale: 0.7 169 | type: 170 | fontName: '' 171 | size: 0 172 | x: 10 173 | y: 5 174 | scale: 1.0 175 | shadow: 176 | fontName: '' 177 | size: 0 178 | x: 4 179 | y: 4 180 | scale: 1.0 181 | oldCharts: 182 | fontName: '' 183 | size: 0 184 | x: 40 185 | y: 238 186 | scale: 1.0 187 | newCharts: 188 | fontName: '' 189 | size: 0 190 | x: 1444 191 | y: 258 192 | scale: 1.0 193 | ratingBg: 194 | fontName: '' 195 | size: 0 196 | x: 858 197 | y: 33 198 | scale: 1.0 199 | dani: 200 | fontName: '' 201 | size: 0 202 | x: 1000 203 | y: 26 204 | scale: 0.7 205 | dsList: 206 | bg: ds_bg.png 207 | coverWidth: 70 208 | coverRatio: 1.0 209 | oldCols: 10 210 | newCols: 0 211 | gapX: 20 212 | gapY: 20 213 | pos: 214 | title: 215 | fontName: Source Han Sans CN Bold Bold 216 | size: 50 217 | x: 535 218 | y: 145 219 | scale: 1.0 220 | ds: 221 | fontName: Source Han Sans CN Bold Bold 222 | size: 48 223 | x: -140 224 | y: 55 225 | scale: 1.0 226 | list: 227 | fontName: '' 228 | size: 0 229 | scale: 1.0 230 | x: 170 231 | y: 230 232 | rateIcon: 233 | fontName: '' 234 | size: 0 235 | scale: 0.6 236 | x: 0 237 | y: 20 238 | fcIcon: 239 | fontName: '' 240 | size: 0 241 | scale: 1.0 242 | x: 10 243 | y: 12 244 | info: 245 | bg: info.png 246 | coverWidth: 200 247 | coverRatio: 1.0 248 | oldCols: 5 249 | newCols: 0 250 | gapX: 96 251 | gapY: 96 252 | pos: 253 | cover: 254 | fontName: '' 255 | size: 200 256 | scale: 1.0 257 | x: 120 258 | y: 155 259 | title: 260 | fontName: Source Han Sans CN Bold Bold 261 | size: 36 262 | scale: 1.0 263 | x: 344 264 | y: 185 265 | artist: 266 | fontName: Source Han Sans CN Bold Bold 267 | size: 24 268 | scale: 1.0 269 | x: 344 270 | y: 224 271 | details: 272 | fontName: Source Han Sans CN Bold Bold 273 | size: 24 274 | scale: 1.0 275 | x: 344 276 | y: 350 277 | list: 278 | fontName: '' 279 | size: 0 280 | scale: 1.0 281 | x: 261 282 | y: 435 283 | diffInfo: 284 | fontName: Source Han Sans CN Bold Bold 285 | size: 24 286 | scale: 1.0 287 | x: 20 288 | y: 30 289 | ds: 290 | fontName: Source Han Sans CN Bold Bold 291 | size: 24 292 | scale: 1.0 293 | x: 650 294 | y: 30 295 | rateIcon: 296 | fontName: '' 297 | size: 0 298 | scale: 1.3 299 | x: 180 300 | y: 2 301 | fcIcon: 302 | fontName: '' 303 | size: 0 304 | scale: 1.0 305 | x: 300 306 | y: 0 307 | fsIcon: 308 | fontName: '' 309 | size: 0 310 | scale: 1.0 311 | x: 350 312 | y: 0 313 | genre: 314 | fontName: '' 315 | size: 0 316 | scale: 0.55 317 | x: 802 318 | y: 280 -------------------------------------------------------------------------------- /src/main/resources/config/classical/type_dx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/type_dx.png -------------------------------------------------------------------------------- /src/main/resources/config/classical/type_sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/classical/type_sd.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/b50_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/b50_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/category_chugeki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/category_chugeki.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/category_niconico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/category_niconico.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/category_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/category_original.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/category_popsanime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/category_popsanime.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/category_touhou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/category_touhou.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/category_variety.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/category_variety.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_00.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_01.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_02.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_03.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_04.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_05.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_06.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_07.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_08.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_09.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_10.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_11.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_12.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_13.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_14.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_15.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_16.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_17.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_18.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_19.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_20.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_21.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_22.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/dani_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/dani_23.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/default_cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/default_cover.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/ds_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/ds_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/info.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/label_Advanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/label_Advanced.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/label_Basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/label_Basic.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/label_Expert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/label_Expert.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/label_Master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/label_Master.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/label_ReMASTER.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/label_ReMASTER.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_a.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_aa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_aa.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_aaa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_aaa.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_ap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_ap.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_app.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_b.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_bb.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_bbb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_bbb.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_c.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_d.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_fc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_fc.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_fcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_fcp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_fs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_fs.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_fsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_fsd.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_fsdp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_fsdp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_fsp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_fsp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_s.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_sp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_sp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_ss.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_ssp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_ssp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_sss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_sss.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/music_icon_sssp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/music_icon_sssp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_01.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_02.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_03.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_04.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_05.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_06.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_07.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_08.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_09.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_10.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/rating_base_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/rating_base_11.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/score_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/score_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/theme.yml: -------------------------------------------------------------------------------- 1 | b50: 2 | bg: b50_bg.png 3 | coverWidth: 180 4 | coverRatio: 1.7777777777777777 5 | oldCols: 5 6 | newCols: 5 7 | gapX: 10 8 | gapY: 26 9 | pos: 10 | name: 11 | fontName: Source Han Sans CN Bold Bold 12 | size: 30 13 | x: 192 14 | y: 132 15 | scale: 1.0 16 | dxrating: 17 | fontName: Arial Black 18 | size: 15 19 | x: 326 20 | y: 80 21 | scale: 1.0 22 | chTitle: 23 | fontName: Source Han Sans CN Bold Bold 24 | size: 16 25 | x: 10 26 | y: 32 27 | scale: 1.0 28 | chAchievements: 29 | fontName: Source Han Sans CN Bold Bold 30 | size: 18 31 | x: 10 32 | y: 74 33 | scale: 1.0 34 | chBase: 35 | fontName: Source Han Sans CN Bold Bold 36 | size: 12 37 | x: 10 38 | y: 92 39 | scale: 1.0 40 | label: 41 | fontName: '' 42 | size: 0 43 | x: 0 44 | y: -10 45 | scale: 1.0 46 | rateIcon: 47 | fontName: '' 48 | size: 0 49 | x: 100 50 | y: 38 51 | scale: 1.0 52 | fcIcon: 53 | fontName: '' 54 | size: 0 55 | x: 123 56 | y: 72 57 | scale: 0.56 58 | fsIcon: 59 | fontName: '' 60 | size: 0 61 | x: 145 62 | y: 72 63 | scale: 0.56 64 | type: 65 | fontName: '' 66 | size: 0 67 | x: 110 68 | y: -10 69 | scale: 1.0 70 | shadow: 71 | fontName: '' 72 | size: 0 73 | x: 0 74 | y: 2 75 | scale: 1.0 76 | oldCharts: 77 | fontName: '' 78 | size: 0 79 | x: 61 80 | y: 233 81 | scale: 1.0 82 | newCharts: 83 | fontName: '' 84 | size: 0 85 | x: 61 86 | y: 1150 87 | scale: 1.0 88 | ratingBg: 89 | fontName: '' 90 | size: 0 91 | x: 182 92 | y: 54 93 | scale: 1.0 94 | dani: 95 | fontName: '' 96 | size: 0 97 | x: 358 98 | y: 54 99 | scale: 0.58 100 | scoreList: 101 | bg: score_bg.png 102 | coverWidth: 180 103 | coverRatio: 1.7777777777777777 104 | oldCols: 5 105 | newCols: 5 106 | gapX: 10 107 | gapY: 26 108 | pos: 109 | name: 110 | fontName: Source Han Sans CN Bold Bold 111 | size: 30 112 | x: 192 113 | y: 132 114 | scale: 1.0 115 | dxrating: 116 | fontName: Arial Black 117 | size: 15 118 | x: 326 119 | y: 80 120 | scale: 1.0 121 | chTitle: 122 | fontName: Source Han Sans CN Bold Bold 123 | size: 16 124 | x: 10 125 | y: 32 126 | scale: 1.0 127 | chAchievements: 128 | fontName: Source Han Sans CN Bold Bold 129 | size: 18 130 | x: 10 131 | y: 74 132 | scale: 1.0 133 | chBase: 134 | fontName: Source Han Sans CN Bold Bold 135 | size: 12 136 | x: 10 137 | y: 92 138 | scale: 1.0 139 | info: 140 | fontName: Source Han Sans CN Bold Bold 141 | size: 24 142 | x: 360 143 | y: 218 144 | scale: 1.0 145 | label: 146 | fontName: '' 147 | size: 0 148 | x: 0 149 | y: -10 150 | scale: 1.0 151 | rateIcon: 152 | fontName: '' 153 | size: 0 154 | x: 100 155 | y: 38 156 | scale: 1.0 157 | fcIcon: 158 | fontName: '' 159 | size: 0 160 | x: 123 161 | y: 72 162 | scale: 0.56 163 | fsIcon: 164 | fontName: '' 165 | size: 0 166 | x: 145 167 | y: 72 168 | scale: 0.56 169 | type: 170 | fontName: '' 171 | size: 0 172 | x: 110 173 | y: -10 174 | scale: 1.0 175 | shadow: 176 | fontName: '' 177 | size: 0 178 | x: 0 179 | y: 2 180 | scale: 1.0 181 | oldCharts: 182 | fontName: '' 183 | size: 0 184 | x: 61 185 | y: 260 186 | scale: 1.0 187 | ratingBg: 188 | fontName: '' 189 | size: 0 190 | x: 182 191 | y: 54 192 | scale: 1.0 193 | dani: 194 | fontName: '' 195 | size: 0 196 | x: 358 197 | y: 54 198 | scale: 0.58 199 | dsList: 200 | bg: ds_bg.png 201 | coverWidth: 70 202 | coverRatio: 1.0 203 | oldCols: 10 204 | newCols: 0 205 | gapX: 12 206 | gapY: 12 207 | pos: 208 | title: 209 | fontName: Source Han Sans CN Bold Bold 210 | size: 50 211 | x: 535 212 | y: 145 213 | scale: 1.0 214 | ds: 215 | fontName: Source Han Sans CN Bold Bold 216 | size: 48 217 | x: -140 218 | y: 55 219 | scale: 1.0 220 | list: 221 | fontName: '' 222 | size: 0 223 | scale: 1.0 224 | x: 170 225 | y: 230 226 | rateIcon: 227 | fontName: '' 228 | size: 0 229 | scale: 0.86 230 | x: 0 231 | y: 20 232 | fcIcon: 233 | fontName: '' 234 | size: 0 235 | scale: 1.0 236 | x: 12 237 | y: 10 238 | info: 239 | bg: info.png 240 | coverWidth: 200 241 | coverRatio: 1.0 242 | oldCols: 5 243 | newCols: 0 244 | gapX: 96 245 | gapY: 96 246 | pos: 247 | cover: 248 | fontName: '' 249 | size: 200 250 | scale: 1.0 251 | x: 120 252 | y: 155 253 | title: 254 | fontName: Source Han Sans CN Bold Bold 255 | size: 36 256 | scale: 1.0 257 | x: 344 258 | y: 185 259 | artist: 260 | fontName: Source Han Sans CN Bold Bold 261 | size: 24 262 | scale: 1.0 263 | x: 344 264 | y: 224 265 | details: 266 | fontName: Source Han Sans CN Bold Bold 267 | size: 24 268 | scale: 1.0 269 | x: 344 270 | y: 350 271 | list: 272 | fontName: '' 273 | size: 0 274 | scale: 1.0 275 | x: 261 276 | y: 435 277 | diffInfo: 278 | fontName: Source Han Sans CN Bold Bold 279 | size: 24 280 | scale: 1.0 281 | x: 20 282 | y: 30 283 | ds: 284 | fontName: Source Han Sans CN Bold Bold 285 | size: 24 286 | scale: 1.0 287 | x: 650 288 | y: 30 289 | rateIcon: 290 | fontName: '' 291 | size: 0 292 | scale: 1.143 293 | x: 180 294 | y: 2 295 | fcIcon: 296 | fontName: '' 297 | size: 0 298 | scale: 1.0 299 | x: 300 300 | y: -3 301 | fsIcon: 302 | fontName: '' 303 | size: 0 304 | scale: 1.0 305 | x: 350 306 | y: -3 307 | genre: 308 | fontName: '' 309 | size: 0 310 | scale: 0.55 311 | x: 802 312 | y: 280 -------------------------------------------------------------------------------- /src/main/resources/config/portrait/type_dx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/type_dx.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait/type_sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait/type_sd.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/b50_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/b50_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/category_chugeki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/category_chugeki.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/category_niconico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/category_niconico.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/category_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/category_original.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/category_popsanime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/category_popsanime.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/category_touhou.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/category_touhou.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/category_variety.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/category_variety.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_00.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_01.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_02.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_03.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_04.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_05.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_06.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_07.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_08.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_09.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_10.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_11.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_12.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_13.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_14.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_15.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_16.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_17.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_18.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_19.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_20.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_21.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_22.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/dani_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/dani_23.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/default_cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/default_cover.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/ds_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/ds_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/info.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/label_Advanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/label_Advanced.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/label_Basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/label_Basic.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/label_Expert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/label_Expert.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/label_Master.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/label_Master.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/label_ReMASTER.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/label_ReMASTER.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_a.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_aa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_aa.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_aaa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_aaa.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_ap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_ap.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_app.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_b.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_bb.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_bbb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_bbb.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_c.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_d.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_fc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_fc.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_fcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_fcp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_fs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_fs.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_fsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_fsd.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_fsdp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_fsdp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_fsp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_fsp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_s.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_sp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_sp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_ss.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_ssp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_ssp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_sss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_sss.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/music_icon_sssp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/music_icon_sssp.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_01.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_02.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_03.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_04.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_05.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_06.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_07.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_08.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_09.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_10.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/rating_base_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/rating_base_11.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/score_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/score_bg.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/theme.yml: -------------------------------------------------------------------------------- 1 | b50: 2 | bg: b50_bg.png 3 | coverWidth: 180 4 | coverRatio: 1.7777777777777777 5 | oldCols: 5 6 | newCols: 5 7 | gapX: 12 8 | gapY: 12 9 | pos: 10 | name: 11 | fontName: Source Han Sans CN Bold Bold 12 | size: 30 13 | x: 157 14 | y: 98 15 | scale: 1.0 16 | dxrating: 17 | fontName: Arial Black 18 | size: 15 19 | x: 285 20 | y: 47 21 | scale: 1.0 22 | chTitle: 23 | fontName: Source Han Sans CN Bold Bold 24 | size: 20 25 | x: 8 26 | y: 47 27 | scale: 1.0 28 | chAchievements: 29 | fontName: Source Han Sans CN Bold Bold 30 | size: 16 31 | x: 8 32 | y: 70 33 | scale: 1.0 34 | chBase: 35 | fontName: Source Han Sans CN Bold Bold 36 | size: 14 37 | x: 8 38 | y: 91 39 | scale: 1.0 40 | label: 41 | fontName: '' 42 | size: 0 43 | x: 0 44 | y: 0 45 | scale: 1.0 46 | rateIcon: 47 | fontName: '' 48 | size: 0 49 | x: 125 50 | y: 53 51 | scale: 0.42 52 | fcIcon: 53 | fontName: '' 54 | size: 0 55 | x: 130 56 | y: 76 57 | scale: 0.5 58 | fsIcon: 59 | fontName: '' 60 | size: 0 61 | x: 152 62 | y: 76 63 | scale: 0.5 64 | type: 65 | fontName: '' 66 | size: 0 67 | x: 115 68 | y: 2 69 | scale: 1.0 70 | shadow: 71 | fontName: '' 72 | size: 0 73 | x: 2 74 | y: 2 75 | scale: 1.0 76 | oldCharts: 77 | fontName: '' 78 | size: 0 79 | x: 69 80 | y: 206 81 | scale: 1.0 82 | newCharts: 83 | fontName: '' 84 | size: 0 85 | x: 69 86 | y: 1046 87 | scale: 1.0 88 | ratingBg: 89 | fontName: '' 90 | size: 0 91 | x: 140 92 | y: 20 93 | scale: 1.0 94 | dani: 95 | fontName: '' 96 | size: 0 97 | x: 330 98 | y: 20 99 | scale: 0.58 100 | scoreList: 101 | bg: score_bg.png 102 | coverWidth: 180 103 | coverRatio: 1.7777777777777777 104 | oldCols: 5 105 | newCols: 5 106 | gapX: 12 107 | gapY: 12 108 | pos: 109 | name: 110 | fontName: Source Han Sans CN Bold Bold 111 | size: 30 112 | x: 157 113 | y: 98 114 | scale: 1.0 115 | dxrating: 116 | fontName: Arial Black 117 | size: 15 118 | x: 285 119 | y: 47 120 | scale: 1.0 121 | chTitle: 122 | fontName: Source Han Sans CN Bold Bold 123 | size: 20 124 | x: 8 125 | y: 47 126 | scale: 1.0 127 | chAchievements: 128 | fontName: Source Han Sans CN Bold Bold 129 | size: 16 130 | x: 8 131 | y: 70 132 | scale: 1.0 133 | chBase: 134 | fontName: Source Han Sans CN Bold Bold 135 | size: 14 136 | x: 8 137 | y: 91 138 | scale: 1.0 139 | info: 140 | fontName: Source Han Sans CN Bold Bold 141 | size: 16 142 | x: 160 143 | y: 133 144 | scale: 1.0 145 | label: 146 | fontName: '' 147 | size: 0 148 | x: 0 149 | y: 0 150 | scale: 1.0 151 | rateIcon: 152 | fontName: '' 153 | size: 0 154 | x: 125 155 | y: 53 156 | scale: 0.42 157 | fcIcon: 158 | fontName: '' 159 | size: 0 160 | x: 130 161 | y: 76 162 | scale: 0.5 163 | fsIcon: 164 | fontName: '' 165 | size: 0 166 | x: 152 167 | y: 76 168 | scale: 0.5 169 | type: 170 | fontName: '' 171 | size: 0 172 | x: 115 173 | y: 2 174 | scale: 1.0 175 | shadow: 176 | fontName: '' 177 | size: 0 178 | x: 2 179 | y: 2 180 | scale: 1.0 181 | oldCharts: 182 | fontName: '' 183 | size: 0 184 | x: 69 185 | y: 206 186 | scale: 1.0 187 | newCharts: 188 | fontName: '' 189 | size: 0 190 | x: 69 191 | y: 1046 192 | scale: 1.0 193 | ratingBg: 194 | fontName: '' 195 | size: 0 196 | x: 140 197 | y: 20 198 | scale: 1.0 199 | dani: 200 | fontName: '' 201 | size: 0 202 | x: 330 203 | y: 20 204 | scale: 0.58 205 | dsList: 206 | bg: ds_bg.png 207 | coverWidth: 70 208 | coverRatio: 1.0 209 | oldCols: 10 210 | newCols: 0 211 | gapX: 20 212 | gapY: 20 213 | pos: 214 | title: 215 | fontName: Source Han Sans CN Bold Bold 216 | size: 50 217 | x: 535 218 | y: 145 219 | scale: 1.0 220 | ds: 221 | fontName: Source Han Sans CN Bold Bold 222 | size: 48 223 | x: -140 224 | y: 55 225 | scale: 1.0 226 | list: 227 | fontName: '' 228 | size: 0 229 | scale: 1.0 230 | x: 170 231 | y: 230 232 | rateIcon: 233 | fontName: '' 234 | size: 0 235 | scale: 0.6 236 | x: 0 237 | y: 20 238 | fcIcon: 239 | fontName: '' 240 | size: 0 241 | scale: 1.0 242 | x: 10 243 | y: 12 244 | info: 245 | bg: info.png 246 | coverWidth: 200 247 | coverRatio: 1.0 248 | oldCols: 5 249 | newCols: 0 250 | gapX: 96 251 | gapY: 96 252 | pos: 253 | cover: 254 | fontName: '' 255 | size: 200 256 | scale: 1.0 257 | x: 120 258 | y: 155 259 | title: 260 | fontName: Source Han Sans CN Bold Bold 261 | size: 36 262 | scale: 1.0 263 | x: 344 264 | y: 185 265 | artist: 266 | fontName: Source Han Sans CN Bold Bold 267 | size: 24 268 | scale: 1.0 269 | x: 344 270 | y: 224 271 | details: 272 | fontName: Source Han Sans CN Bold Bold 273 | size: 24 274 | scale: 1.0 275 | x: 344 276 | y: 350 277 | list: 278 | fontName: '' 279 | size: 0 280 | scale: 1.0 281 | x: 261 282 | y: 435 283 | diffInfo: 284 | fontName: Source Han Sans CN Bold Bold 285 | size: 24 286 | scale: 1.0 287 | x: 20 288 | y: 30 289 | ds: 290 | fontName: Source Han Sans CN Bold Bold 291 | size: 24 292 | scale: 1.0 293 | x: 650 294 | y: 30 295 | rateIcon: 296 | fontName: '' 297 | size: 0 298 | scale: 0.8 299 | x: 180 300 | y: 2 301 | fcIcon: 302 | fontName: '' 303 | size: 0 304 | scale: 1.0 305 | x: 300 306 | y: 0 307 | fsIcon: 308 | fontName: '' 309 | size: 0 310 | scale: 1.0 311 | x: 350 312 | y: 0 313 | genre: 314 | fontName: '' 315 | size: 0 316 | scale: 0.55 317 | x: 802 318 | y: 280 -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/type_dx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/type_dx.png -------------------------------------------------------------------------------- /src/main/resources/config/portrait_splash/type_sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/config/portrait_splash/type_sd.png -------------------------------------------------------------------------------- /src/main/resources/export-rules.txt: -------------------------------------------------------------------------------- 1 | export-all -------------------------------------------------------------------------------- /src/main/resources/font/ariblk.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/font/ariblk.ttf -------------------------------------------------------------------------------- /src/main/resources/font/bb4171.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xszqxszq/maimai-bot/3c21ba756060d1f90fd1f6c301dd5e0664331b6f/src/main/resources/font/bb4171.ttf --------------------------------------------------------------------------------