Giter Site home page Giter Site logo

maimai-bot's Introduction

maimaiBot

一个基于 mirai舞萌 DX 查分器 以及 Xray Bot 别名信息 编写的 maimai DX QQ 机器人插件。

本项目是在 Kotlin 平台对 mai-bot 项目大部分功能进行重新实现,旨在提高生成速度及降低部署门槛。

支持的功能

  • b50
  • 查歌
  • XXX 是什么歌
  • 谱面详情(例:紫id11154)
  • 歌曲分数信息(例:info 潘)
  • 随机歌曲(例:随个紫12+)
  • 别名查询(例:11514有什么别名)
  • 定数查歌
  • 分数线
  • 猜歌
  • 随机推分金曲(例:mai什么加2分;随机推分金曲)
  • 随机推分列表
  • 牌子进度(例:晓极进度)
  • 牌子完成表(例:橙将完成表)
  • 等级进度(例:13ss+进度,11ap进度,10fdx进度,14clear进度)
  • 等级完成表(例:13+完成表)
  • 等级分数列表(例:14分数列表)

部署指南

点我下载

本插件开箱即用,只需和其他插件一样放入 MCL 或其他版本的 Mirai 控制台 的 plugins 目录即可。

如果您尚不清楚 Mirai 如何安装,请阅读 Mirai 官方教程 ,在安装好控制台后再安装本插件使用。

常见问题

插件指令完全没反应?

注意!!请不要给 *:* 权限,这会导致插件误认为该群禁用了所有功能。请删除 *:*

如何在特定群关闭本插件功能?

在控制台输入 /perm grant g114514 maimaiBot:denyall,其中 114514 请替换成需要关闭插件的群号。

如何修改字体?

修改 config/xyz.xszq.maimai-bot/主题名/theme.yml 中的 fontName值即可。

如何更新歌曲别名?

对于更新了新版本的用户:删除 config/xyz.xszq.maimai-bot/aliases.csv 并重启即可更新成新版本内置的别名表。

本项目内置的别名来自 Xray Bot ,bot 在启动时会自动更新。如需手动增加别名,请修改 config/xyz.xszq.maimai-bot/aliases.csv,未来版本将会支持通过指令修改。

查不到任何歌曲谱面信息?

请检查 舞萌 DX 查分器 是否可以访问,同时请检查您的网络连接是否畅通,是否开启了无效的代理设置等。

更新插件后部分内容没更新或者有误?

请关闭 bot 后删除 config/xyz.xszq.maimai-bot 文件夹和 data/xyz.xszq.maimai-bot 文件夹。

配置文件

config/xyz.xszq.maimai-bot/settings.yml 为本插件的主配置文件,默认情况下无需修改。

配置各项说明如下:

  • theme: portrait 设置要使用的 b40 / b50 主题名称。config/xyz.xszq.maimai-bot 下的各文件夹为主题文件夹,文件夹名即主题名。插件自带的 portrait 主题为竖式 b40 / b50 ,classical 为经典的横式 b40 / b50。
  • multiAccountsMode: false 开启多账号登录支持。开启后如果 bot 多个号在一个群内时,对同一请求不会处理两次。
  • coverSource: WAHLAP 封面下载源。如果无法下载或者没有更新后新增的曲子,请尝试改成 ZETARAKU
  • maidataJsonUrls: 封面下载源为 WAHLAP 时,包含图片文件名信息的 maidata.json 的下载地址。您可以根据网络情况更换为能访问的 GitHub Raw 镜像网址。
  • zetarakuSite: ZETARAKU 下载源服务器地址。如果无法下载,请访问 maimai-songs 并用开发者工具获取新的服务器地址。
  • xrayAliasUrl: 本插件的别名数据来自于 Xray Bot 公开的别名信息,设置该项值可以指定从何处获取最新别名。
  • prefix: '' 设置命令的前缀。例如,设为 '/mai' 后,生成 b50 需要输入 /mai b50 才能调用
  • enableMemCache: true 是否提前载入图片到内存。如果您内存不够或者堆栈设置偏小,可以将这项设为 false 避免 Java heap size 等爆内存的情况。
  • hintOnGeneration: false 开启后将在生成 b50 或完成表时提醒现在正在生成中

maimai-bot's People

Contributors

xszqxszq avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

maimai-bot's Issues

使用 classical 时,出现错误;求助如何更新查询页面 UI

 E/MaimaiBot: Exception in coroutine Plugin xyz.xszq.maimai-bot of MaimaiBot
kotlinx.serialization.MissingFieldException: Fields [dsList, info] are required for type with serial name 'xyz.xszq.MaimaiPicTheme', but they were missing
        at kotlinx.serialization.internal.PluginExceptionsKt.throwMissingFieldException(PluginExceptions.kt:20)
        at maimai-bot-1.3.6.mirai.jar//xyz.xszq.MaimaiPicTheme.<init>(DrawImage.kt:513)
        at maimai-bot-1.3.6.mirai.jar//xyz.xszq.MaimaiPicTheme$$serializer.deserialize(DrawImage.kt:513)
        at maimai-bot-1.3.6.mirai.jar//xyz.xszq.MaimaiPicTheme$$serializer.deserialize(DrawImage.kt:513)
        at net.mamoe.yamlkt.Yaml.decodeFromString(Yaml.kt:162)
        at maimai-bot-1.3.6.mirai.jar//xyz.xszq.MaimaiBot.reload(MaimaiBot.kt:1154)
        at maimai-bot-1.3.6.mirai.jar//xyz.xszq.MaimaiBot.access$reload(MaimaiBot.kt:79)
        at maimai-bot-1.3.6.mirai.jar//xyz.xszq.MaimaiBot$reload$1.invokeSuspend(MaimaiBot.kt)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at maimai-bot-1.3.6.mirai.jar//io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:191)
        at maimai-bot-1.3.6.mirai.jar//io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:147)
        at maimai-bot-1.3.6.mirai.jar//io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:15)
        at maimai-bot-1.3.6.mirai.jar//io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:93)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
        at maimai-bot-1.3.6.mirai.jar//io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:191)
        at maimai-bot-1.3.6.mirai.jar//io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:147)
        at maimai-bot-1.3.6.mirai.jar//io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:15)
        at maimai-bot-1.3.6.mirai.jar//io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:93)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
        at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

查询页面 UI 如图:(感觉需要更新)
QQ图片20230430100829

1.3.0版本下指令没有任何反应

问题描述

在插件最新版本1.3.0和旧版本1.2.0时,输入b40 /b40等指令均无法相应,在1.3.0仅启用了该插件时仍对指令无相应

运行环境

系统环境:ubuntu 20.04
java环境:openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.2+8-Ubuntu-120.04, mixed mode, sharing)
-Djava.awt.headless=true

mcl及mirai-core均为最新

尝试过的方法

将其他插件移出plugins目录,仅启用maibot插件。

运行日志

仅启用maibot插件时日志如下

  10:24:08 [INFO] Verifying "net.mamoe:mirai-console" v2.12.1
  10:24:08 [INFO] Verifying "net.mamoe:mirai-console-terminal" v2.12.1
  10:24:08 [INFO] Verifying "net.mamoe:mirai-core-all" v2.12.1
  10:24:08 [INFO] Verifying "org.itxtech:mcl-addon" v2.0.2
2022-08-16 10:24:09 I/main: Starting mirai-console...
2022-08-16 10:24:09 I/main: Backend: version 2.12.1, built on 2022-07-31 17:49:27.
2022-08-16 10:24:09 I/main: Frontend Terminal: version 2.12.1, provided by Mamoe Technologies
2022-08-16 10:24:09 I/main: Welcome to visit https://mirai.mamoe.net/
2022-08-16 10:24:09 W/stderr: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
2022-08-16 10:24:09 W/stderr: SLF4J: Defaulting to no-operation (NOP) logger implementation
2022-08-16 10:24:09 W/stderr: SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2022-08-16 10:24:10 I/plugin: Successfully loaded plugin MaimaiBot v1.3.0
2022-08-16 10:24:10 I/plugin: Successfully loaded plugin MCL Addon v2.0.2
2022-08-16 10:24:10 I/main: Prepared built-in commands: autoLogin, help, login, logout, permission, status, stop
2022-08-16 10:24:10 I/MCL Addon: iTXTech MCL Version: 2.1.0-71ec418
2022-08-16 10:24:10 W/MCL Addon: iTXTech Soyuz 未安装,Soyuz MCL Handler 特性已禁用
2022-08-16 10:24:10 I/main: 2 plugin(s) enabled.
2022-08-16 10:24:10 I/main: Auto-login 3074512344
2022-08-16 10:24:11 W/stderr: ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
2022-08-16 10:24:11 I/Bot.3074512344: Loaded account secrets from local cache.
2022-08-16 10:24:12 I/Bot.3074512344: Saved account secrets to local cache for fast login.
2022-08-16 10:24:12 I/Bot.3074512344: Login successful.
2022-08-16 10:24:12 I/stdout: UNSUPPORTED CMAP format = 0
2022-08-16 10:24:13 V/Bot.3074512344: Event: BotOnlineEvent(bot=Bot(3074512344))
2022-08-16 10:24:13 I/Bot.3074512344: Bot login successful.
2022-08-16 10:24:13 I/main: mirai-console started successfully.
2022-08-16 10:24:15 I/MaimaiBot: 成功载入所有图片。
2022-08-16 10:24:15 W/stderr: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
2022-08-16 10:24:15 W/stderr: SLF4J: Defaulting to no-operation (NOP) logger implementation
2022-08-16 10:24:15 W/stderr: SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2022-08-16 10:24:15 I/MaimaiBot: maimai-bot 插件加载完毕。
2022-08-16 10:24:15 I/MaimaiBot: 正在缓存歌曲封面中……
2022-08-16 10:24:22 I/MaimaiBot: 本次已缓存 0 个歌曲封面。
2022-08-16 10:24:38 V/Bot.3074512344: [debug//(1093893936)] Strings1eaf(1752269559) -> b40
2022-08-16 10:24:42 V/Bot.3074512344: [debug//(1093893936)] Strings1eaf(1752269559) -> /b40
> help
◆ /autoLogin add <account> <password> [passwordKind]    # 添加自动登录, passwordKind 可选 PLAIN 或 MD5
  /autoLogin clear    # 清除所有配置
  /autoLogin list    # 查看自动登录账号列表
  /autoLogin remove <account>    # 删除一个账号
  /autoLogin removeConfig <account> <configKey>    # 删除一个账号的一个配置项
  /autoLogin setConfig <account> <configKey> <value>    # 设置一个账号的一个配置项
◆ /help     # 查看指令帮助
◆ /login <qq> [password] [protocol]    # 登录一个账号
◆ /logout <qq>    # 登出一个账号
◆ /permission cancel <被许可人 ID> <权限 ID>    # 撤销一个权限
  /permission deny <被许可人 ID> <权限 ID>    # 撤销一个权限
  /permission remove <被许可人 ID> <权限 ID>    # 撤销一个权限
  /permission cancelAll <被许可人 ID> <权限 ID>    # 撤销一个权限及其所有子权限
  /permission denyAll <被许可人 ID> <权限 ID>    # 撤销一个权限及其所有子权限
  /permission removeAll <被许可人 ID> <权限 ID>    # 撤销一个权限及其所有子权限
  /permission listPermissions    # 查看所有权限列表
  /permission lp    # 查看所有权限列表
  /permission permit <被许可人 ID> <权限 ID>    # 授权一个权限
  /permission grant <被许可人 ID> <权限 ID>    # 授权一个权限
  /permission add <被许可人 ID> <权限 ID>    # 授权一个权限
  /permission permittedPermissions <被许可人 ID> [显示全部]    # 查看被授权权限列表
  /permission pp <被许可人 ID> [显示全部]    # 查看被授权权限列表
  /permission grantedPermissions <被许可人 ID> [显示全部]    # 查看被授权权限列表
  /permission gp <被许可人 ID> [显示全部]    # 查看被授权权限列表
◆ /status     # 获取 Mirai Console 运行状态
◆ /stop     # 关闭 Mirai Console
◆ /mclc <MCL命令行参数>
◆ /mcl info <package>    # 获取包信息
  /mcl install <package> [channel] [type] [version] [lock or unlock]    # 安装包
  /mcl list    # 列出已安装的包
  /mcl remove <package>    # 移除包
  /mcl run <script>    # 执行模块load阶段
  /mcl update    # 执行updater模块

等级完成表的bug(?

插件刚启动会缓存若干初始等级封面表
然后代码逻辑会将每次查询等级表后印好用户成绩的表覆盖这张初始的表
导致每查询一次会越来越黑逐渐看不见歌曲封面,也能隐约看到上一个查询用户的成绩(
总之查多几次就用不了了

加载插件时抛出 java.lang.LinkageError 错误

相关日志:

2022-11-14 22:01:26 I/MaimaiBot: 正在生成歌曲封面缓存图……
2022-11-14 22:01:30 I/MaimaiBot: 正在生成定数表……
2022-11-14 22:01:52 I/MaimaiBot: 成功载入所有图片。
2022-11-14 22:01:52 E/MaimaiBot: Exception in coroutine Plugin xyz.xszq.maimai-bot of MaimaiBot
java.lang.LinkageError: loader constraint violation: when resolving method 'org.slf4j.ILoggerFactory org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()' the class loader 'maimai-bot-1.3.2.mirai.jar' @79d82f66 of the current class, org/slf4j/LoggerFactory, and the class loader 'onebot-mirai-0.3.4-all.jar' @35c4e864 for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature (org.slf4j.LoggerFactory is in unnamed module of loader 'maimai-bot-1.3.2.mirai.jar' @79d82f66, parent loader 'global-shared' @4b65d9f4; org.slf4j.impl.StaticLoggerBinder is in unnamed module of loader 'onebot-mirai-0.3.4-all.jar' @35c4e864, parent loader 'global-shared' @4b65d9f4)
        at maimai-bot-1.3.2.mirai.jar//org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:423)
        at maimai-bot-1.3.2.mirai.jar//org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362)
        at maimai-bot-1.3.2.mirai.jar//mu.KotlinLogging.logger(KotlinLogging.kt:32)
        at maimai-bot-1.3.2.mirai.jar//com.github.doyaaaaaken.kotlincsv.client.CsvFileReader.<init>(CsvFileReader.kt:22)
        at maimai-bot-1.3.2.mirai.jar//com.github.doyaaaaaken.kotlincsv.client.CsvReader.openAsync(CsvReader.kt:182)
        at maimai-bot-1.3.2.mirai.jar//com.github.doyaaaaaken.kotlincsv.client.CsvReader.openAsync(CsvReader.kt:143)
        at maimai-bot-1.3.2.mirai.jar//xyz.xszq.MaimaiBot.reloadAliases(MaimaiBot.kt:308)
        at maimai-bot-1.3.2.mirai.jar//xyz.xszq.MaimaiBot.reload(MaimaiBot.kt:305)
        at maimai-bot-1.3.2.mirai.jar//xyz.xszq.MaimaiBot.access$reload(MaimaiBot.kt:75)
        at maimai-bot-1.3.2.mirai.jar//xyz.xszq.MaimaiBot$reload$1.invokeSuspend(MaimaiBot.kt)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.UndispatchedCoroutine.afterResume(CoroutineContext.kt:233)
        at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
        at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

此外,在加载 mcmotd-1.1.8.mirai.jar 插件时,也会抛出该错误,相关日志如下:

2022-11-14 21:52:42 I/MaimaiBot: 正在生成歌曲封面缓存图……
2022-11-14 21:52:50 I/MaimaiBot: 正在生成定数表……
2022-11-14 21:53:12 I/MaimaiBot: 成功载入所有图片。
2022-11-14 21:53:12 E/MaimaiBot: Exception in coroutine Plugin xyz.xszq.maimai-bot of MaimaiBot
java.lang.LinkageError: loader constraint violation: when resolving method 'org.slf4j.ILoggerFactory org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()' the class loader 'maimai-bot-1.3.2.mirai.jar' @79d82f66 of the current class, org/slf4j/LoggerFactory, and the class loader 'mcmotd-1.1.8.mirai.jar' @1e977098 for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature (org.slf4j.LoggerFactory is in unnamed module of loader 'maimai-bot-1.3.2.mirai.jar' @79d82f66, parent loader 'global-shared' @4b65d9f4; org.slf4j.impl.StaticLoggerBinder is in unnamed module of loader 'mcmotd-1.1.8.mirai.jar' @1e977098, parent loader 'global-shared' @4b65d9f4)
        at maimai-bot-1.3.2.mirai.jar//org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:423)
        at maimai-bot-1.3.2.mirai.jar//org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362)
        at maimai-bot-1.3.2.mirai.jar//mu.KotlinLogging.logger(KotlinLogging.kt:32)
        at maimai-bot-1.3.2.mirai.jar//com.github.doyaaaaaken.kotlincsv.client.CsvFileReader.<init>(CsvFileReader.kt:22)
        at maimai-bot-1.3.2.mirai.jar//com.github.doyaaaaaken.kotlincsv.client.CsvReader.openAsync(CsvReader.kt:182)
        at maimai-bot-1.3.2.mirai.jar//com.github.doyaaaaaken.kotlincsv.client.CsvReader.openAsync(CsvReader.kt:143)
        at maimai-bot-1.3.2.mirai.jar//xyz.xszq.MaimaiBot.reloadAliases(MaimaiBot.kt:308)
        at maimai-bot-1.3.2.mirai.jar//xyz.xszq.MaimaiBot.reload(MaimaiBot.kt:305)
        at maimai-bot-1.3.2.mirai.jar//xyz.xszq.MaimaiBot.access$reload(MaimaiBot.kt:75)
        at maimai-bot-1.3.2.mirai.jar//xyz.xszq.MaimaiBot$reload$1.invokeSuspend(MaimaiBot.kt)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.UndispatchedCoroutine.afterResume(CoroutineContext.kt:233)
        at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
        at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

希望能加入自定义机厅和排卡功能

希望能加入自定义机厅和排卡功能,实现群内玩家自助报机厅人数。这个功能在[https://github.com/Yuri-YuzuChaN/maimaiDX]里已经实现,但部署难度太大,希望能加入插件内

希望可以有一个命令的帮助

感谢大佬的制作,但是希望能够有一个help或者帮助的命令能够输出各项命令具体用什么来触发,还有就是b40和b50这样的,第一次生成比较慢,希望可以有一个正在生成的提示,不然也不知道到底出发没。希望大佬考虑一下~

bot插件运行一段时候后报错

2023-10-10 15:11:29 V/Bot.1919755643: Group(735538390) <- [mirai:quote:[mirai:source:ids=[82488], internalIds=[470522755], from group 2098714594 to 735538390 at 1696921887], content=info 清华][mirai:image:{6424F48F-A6B9-EA03-D783-C42BF3783089}.png, width=1080, height=960, size=527569, type=PNG, isEmoji=false]
2023-10-10 15:11:30 V/Bot.1919755643: [青陨的超级面包工坊(849985512)] 星穹铁道高手(1377369041) -> [mirai:image:{0721174B-B1BC-27F5-50C8-3409966F7FD0}.jpg, width=606, height=970, size=65480, type=JPG, isEmoji=true]
2023-10-10 15:11:32 V/Bot.1919755643: [广东- DCY 发癫总部(928032323)] 亦 ⁧ ~giao(271272008) -> b50
2023-10-10 15:11:33 V/Bot.1919755643: Group(928032323) <- [mirai:quote:[mirai:source:ids=[608], internalIds=[1165801476], from group 271272008 to 928032323 at 1696921892], content=b50]正在生成中……
2023-10-10 15:11:35 V/Bot.1919755643: [雀尼玛魂群(735538390)] 阴暗的蠕动(2098714594) -> [mirai:image:{DEDC6D68-82B0-9E3C-DF9D-E92B87431C0D}.png, width=1080, height=1116, size=53959, type=JPG, isEmoji=true]
2023-10-10 15:11:37 V/Bot.1919755643: [雀尼玛魂群(735538390)] BlackY vs. WAiKURO(2353595896) -> oboro没古神高
2023-10-10 15:11:37 V/Bot.1919755643: [雀尼玛魂群(735538390)] 棉兔子(384442008) -> 已收到
2023-10-10 15:11:38 V/Bot.1919755643: [雀尼玛魂群(735538390)] BlackY vs. WAiKURO(2353595896) -> 笑了
2023-10-10 15:11:38 V/Bot.1919755643: [饭饭第三心窝窝(334113448)] 金步戈(610611251) -> [mirai:quote:[mirai:source:ids=[50803], internalIds=[213743232], from 3211617364 to 334113448 at 1696921729], content=][mirai:at:3211617364] ?
2023-10-10 15:11:41 V/Bot.1919755643: [雀尼玛魂群(735538390)] 棉兔子(384442008) -> 在观摩
2023-10-10 15:11:43 V/Bot.1919755643: [饭饭第三心窝窝(334113448)] 金步戈(610611251) -> [mirai:image:{0B158273-A9D8-89C8-5311-CA57A51AD8B1}.jpg, width=300, height=294, size=13469, type=JPG, isEmoji=true]
2023-10-10 15:11:44 V/Bot.1919755643: [雀尼玛魂群(735538390)] 棉兔子(384442008) -> 美妙的玉米棒
2023-10-10 15:11:48 V/Bot.1919755643: [放学后音趴会社(852257356)] 乌有的乌有(2905706142) -> OK
2023-10-10 15:11:52 V/Bot.1919755643: [珠海舞萌生活群(437189122)] 只会红谱,图个喜庆(3168737024) -> info 茄子
2023-10-10 15:11:53 E/MaimaiBot: Exception in coroutine Plugin xyz.xszq.maimai-bot of MaimaiBot
java.lang.IllegalStateException: running
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.AbstractEmulator.emulate(AbstractEmulator.java:352)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.thread.Function64.run(Function64.java:39)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.thread.MainTask.dispatch(MainTask.java:19)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.thread.UniThreadDispatcher.run(UniThreadDispatcher.java:175)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.thread.UniThreadDispatcher.runMainForResult(UniThreadDispatcher.java:99)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.AbstractEmulator.runMainForResult(AbstractEmulator.java:340)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.arm.AbstractARM64Emulator.eFunc(AbstractARM64Emulator.java:262)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.Module.emulateFunction(Module.java:163)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.linux.android.dvm.DvmObject.callJniMethod(DvmObject.java:135)
at qsign-1.1.0-beta.mirai2.jar//com.github.unidbg.linux.android.dvm.DvmObject.callJniMethodObject(DvmObject.java:93)
at qsign-1.1.0-beta.mirai2.jar//com.tencent.mobileqq.qsec.qsecurity.QSec.getEst(QSec.kt:16)
at qsign-1.1.0-beta.mirai2.jar//moe.fuqiuluo.api.UnidbgFetchQSign.sign(UnidbgFetchQSign.kt:172)
at qsign-1.1.0-beta.mirai2.jar//moe.fuqiuluo.api.UnidbgFetchQSign.sign$default(UnidbgFetchQSign.kt:146)
at qsign-1.1.0-beta.mirai2.jar//top.mrxiaom.qsign.QSignService$qSecurityGetSign$data$1.invokeSuspend(QSignService.kt:99)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:284)
at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
at qsign-1.1.0-beta.mirai2.jar//top.mrxiaom.qsign.QSignService.qSecurityGetSign(QSignService.kt:98)
at net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketKt.buildRawUniPacket(OutgoingPacket.kt:139)
at net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbSendMsg.createToGroupImpl$mirai_core(MessageSvc.PbSendMsg.kt:744)
at net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvc_PbSendMsgKt.createToGroup(MessageSvc.PbSendMsg.kt:585)
at net.mamoe.mirai.internal.message.protocol.outgoing.GroupMessageProtocolStrategy.createPacketsForGeneralMessage$suspendImpl(MessageProtocolStrategy.kt:150)
at net.mamoe.mirai.internal.message.protocol.outgoing.GroupMessageProtocolStrategy.createPacketsForGeneralMessage(MessageProtocolStrategy.kt)
at net.mamoe.mirai.internal.message.protocol.outgoing.GroupMessageProtocolStrategy.createPacketsForGeneralMessage(MessageProtocolStrategy.kt:139)
at net.mamoe.mirai.internal.message.protocol.impl.GeneralMessageSenderProtocol$GeneralMessageSender.process(GeneralMessageSenderProtocol.kt:66)
at net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageProcessorAdapter.process(OutgoingMessagePipelineProcessor.kt:26)
at net.mamoe.mirai.internal.message.protocol.outgoing.OutgoingMessageProcessorAdapter.process(OutgoingMessagePipelineProcessor.kt:20)
at net.mamoe.mirai.internal.pipeline.AbstractProcessorPipeline.process$suspendImpl(ProcessorPipeline.kt:287)
at net.mamoe.mirai.internal.pipeline.AbstractProcessorPipeline.process(ProcessorPipeline.kt)
at net.mamoe.mirai.internal.message.protocol.MessageProtocolFacadeImpl.preprocessAndSendOutgoingImpl(MessageProtocolFacade.kt:361)
at net.mamoe.mirai.internal.message.protocol.MessageProtocolFacadeImpl.preprocessAndSendOutgoing(MessageProtocolFacade.kt:345)
at net.mamoe.mirai.internal.message.protocol.MessageProtocolFacade$INSTANCE.preprocessAndSendOutgoing(MessageProtocolFacade.kt)
at net.mamoe.mirai.internal.contact.AbstractUserKt.sendMessageImpl(AbstractUser.kt:263)
at net.mamoe.mirai.internal.contact.CommonGroupImpl.sendMessage$suspendImpl(GroupImpl.kt:221)
at net.mamoe.mirai.internal.contact.CommonGroupImpl.sendMessage(GroupImpl.kt)
at maimai-bot-1.3.8.mirai.jar//xyz.xszq.UtilsKt.quoteReply(Utils.kt:85)
at maimai-bot-1.3.8.mirai.jar//xyz.xszq.MaimaiBot$generateMusicInfo$2.invokeSuspend(MaimaiBot.kt:1163)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(Scopes.kt:33)
at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

本项目暂停维护

由于腾讯加大风控力度,无法对代码进行更多测试,故本项目暂停维护,感谢大家的支持。

本项目所有功能已迁移至使用腾讯官方接口的机器人可怜Bot

对猜歌功能的一个建议

我群群友今日沉迷猜歌,但是bot会出现重复多次出现同一题的情况,频率非常的高
所以希望可能调整一下猜歌出题的频率或者检测出题次数过多的歌暂时不能出题?

对随机推分功能的一个建议

今天群友在roll推分的时候跟我抱怨说一个一个roll太麻烦了,而且随机出来的歌的难度范围有点难以预测。
所以在想能不能加一个随机推分列表的功能
或者是指定某一个等级难度进行列表的抽取

user note:不影响运行的报错

在运行过程中会出现如下警告,但是不影响运行,担心未来是否会出现问题
2022-12-01 01:00:51 W/stderr: Exception in thread "DefaultDispatcher-worker-10" java.lang.NoSuchMethodError: 'net.mamoe.mirai.data.GroupHonorType net.mamoe.mirai.event.events.MemberHonorChangeEvent$Achieve.getHonorType()' 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.EventKt.convertBotEvent(event.kt:119) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.ConvertorKt.toDTO(convertor.kt:44) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.http.HttpAdapter.onReceiveBotEvent(HttpAdapter.kt:42) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.context.MahContext$handleBotEvent$1$1.invokeSuspend(MahContext.kt:116) 2022-12-01 01:00:51 W/stderr: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664) 2022-12-01 01:00:51 W/stderr: Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@62bf69f, Dispatchers.Default] 2022-12-01 01:00:51 W/stderr: Exception in thread "DefaultDispatcher-worker-15" Exception in thread "DefaultDispatcher-worker-1" java.lang.NoSuchMethodError: 'net.mamoe.mirai.data.GroupHonorType net.mamoe.mirai.event.events.MemberHonorChangeEvent$Achieve.getHonorType()' 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.EventKt.convertBotEvent(event.kt:119) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.ConvertorKt.toDTO(convertor.kt:44) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.http.HttpAdapter.onReceiveBotEvent(HttpAdapter.kt:42) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.context.MahContext$handleBotEvent$1$1.invokeSuspend(MahContext.kt:116) 2022-12-01 01:00:51 W/stderr: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664) 2022-12-01 01:00:51 W/stderr: Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@580feb80, Dispatchers.Default] 2022-12-01 01:00:51 W/stderr: Exception in thread "DefaultDispatcher-worker-7" java.lang.NoSuchMethodError: 'net.mamoe.mirai.data.GroupHonorType net.mamoe.mirai.event.events.MemberHonorChangeEvent$Achieve.getHonorType()' 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.EventKt.convertBotEvent(event.kt:119) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.ConvertorKt.toDTO(convertor.kt:44) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.http.HttpAdapter.onReceiveBotEvent(HttpAdapter.kt:42) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.context.MahContext$handleBotEvent$1$1.invokeSuspend(MahContext.kt:116) 2022-12-01 01:00:51 W/stderr: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664) 2022-12-01 01:00:51 W/stderr: Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@6bcab241, Dispatchers.Default] 2022-12-01 01:00:51 W/stderr: Exception in thread "DefaultDispatcher-worker-4" java.lang.NoSuchMethodError: 'net.mamoe.mirai.data.GroupHonorType net.mamoe.mirai.event.events.MemberHonorChangeEvent$Achieve.getHonorType()' 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.EventKt.convertBotEvent(event.kt:119) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.ConvertorKt.toDTO(convertor.kt:44) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.http.HttpAdapter.onReceiveBotEvent(HttpAdapter.kt:42) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.context.MahContext$handleBotEvent$1$1.invokeSuspend(MahContext.kt:116) 2022-12-01 01:00:51 W/stderr: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664) 2022-12-01 01:00:51 W/stderr: Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@4674fd33, Dispatchers.Default] 2022-12-01 01:00:51 W/stderr: java.lang.NoSuchMethodError: 'net.mamoe.mirai.data.GroupHonorType net.mamoe.mirai.event.events.MemberHonorChangeEvent$Achieve.getHonorType()' 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.EventKt.convertBotEvent(event.kt:119) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.internal.convertor.ConvertorKt.toDTO(convertor.kt:44) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.adapter.http.HttpAdapter.onReceiveBotEvent(HttpAdapter.kt:42) 2022-12-01 01:00:51 W/stderr: at mirai-api-http-2.6.2.jar//net.mamoe.mirai.api.http.context.MahContext$handleBotEvent$1$1.invokeSuspend(MahContext.kt:116) 2022-12-01 01:00:51 W/stderr: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677) 2022-12-01 01:00:51 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664) 2022-12-01 01:00:51 W/stderr: Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@506c869e, Dispatchers.Default]

6 月 8 日后封面混乱的解决方案

删除 data/xyz.xszq.maimai-bot/img 文件夹,清空缓存,然后把 config/xyz.xszq.maimai-bot/settings.yml 中的 coverSource 的值改为 ZETARAKU

新版本正在测试中,请稍安勿躁,不兼容原皮肤格式。待新版本发布后,可能需要手动删除 config/xyz.xszq.maimai-bot 下的所有子文件夹再更新启动。

不要直接使用 GlobalEventChannel

直接从 GlobalEventChannel 得到的监听器不受 插件生命周期管理

var channel: EventChannel<Event> = GlobalEventChannel

你应该使用 CoroutineScope.globalEventChannel() 这个扩展方法,
KotlinPlugin/JvmPlugin 就是 CoroutineScope 的子类实现

所以你可以 直接使用 var channel: EventChannel<Event> = globalEventChannel() 替换原本的代码

关于一些bug

b50调用的歌曲rating还是b40的:
需要用getNewRa()之后再重新排序一下
将牌无法正常生成:
这个应该是queryPlateRecord()调用目录的问题,修改下就能正常生成
橙将和晓将完成表无法正常生成:
都是歌曲封面没有被正常缓存的原因,橙将是因为一首11+叫Link的歌跟maimai plus里面一首也叫Link的歌冲突了,导致插件以为已经有该封面所以没有缓存;
晓将是因为13+的一首D✪N’T ST✪P R✪CKIN’ 的歌,猜测是字符串解析有问题,无法被正常缓存;
把封面手动添加到data里面再修改相应id就可以正常生成。
超系牌完成表生成两次:
list里面写多了一个“超”

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.