|
1 | 1 | <div align="center"> |
2 | | -<img src="docs/dxkuma.png" width="20%"> |
3 | 2 |
|
4 | | -# 迪拉熊 Bot - Derakkuma Bot |
| 3 | +<img src="docs/dxkuma.png" width="22%"> |
| 4 | + |
| 5 | +# 迪拉熊Bot - Derakkuma Bot |
5 | 6 |
|
6 | 7 | ## 酸橙熊熊 - Limekuma |
7 | 8 |
|
| 9 | +为舞萌DX设计的成绩图片渲染微服务 |
| 10 | + |
8 | 11 | </div> |
9 | 12 |
|
| 13 | + |
| 14 | + |
10 | 15 | [](https://www.codefactor.io/repository/github/derakkumadev/limekuma-printer) |
11 | 16 | [](https://app.codacy.com/gh/DerakkumaDev/limekuma-printer/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) |
12 | | -[](https://qm.qq.com/cgi-bin/qm/qr?k=LyQOTRI7ViXYSTg0zbS2sGgcmkbYrxbP) |
| 17 | +[](https://qun.qq.com/qunpro/robot/qunshare?robot_appid=102613765&robot_uin=3889525249) |
| 18 | +[](https://qm.qq.com/cgi-bin/qm/qr?k=LyQOTRI7ViXYSTg0zbS2sGgcmkbYrxbP) |
| 19 | +[](https://qm.qq.com/cgi-bin/qm/qr?k=g-3hU7eFmvcFUuCKdCE-3COu8Ej9LfnD&jump_from=webapi&authKey=IpqRZXflOY9UKkYPn0Ho2RrVBw+UF2pfTZk6WnhU39idA4AyJt65nAwfuPfn1yZ+) |
13 | 20 |
|
14 | 21 | ## 📖 项目简介 |
15 | 22 |
|
16 | | -酸橙熊熊(青柠熊熊)是一个舞萌 DX 数据渲染服务,提供高性能的图像生成和数据处理能力。项目基于 .NET 构建,采用 gRPC 协议提供高效的远程过程调用服务。 |
17 | | - |
18 | | -## ✨ 主要特性 |
19 | | - |
20 | | -- 🎯 **多数据源支持**: 同时支持落雪和水鱼数据源 |
21 | | -- 🎨 **高质量渲染**: 基于 SixLabors.ImageSharp 的高性能图像渲染引擎 |
22 | | -- 📊 **数据统计**: 提供 Best 50、歌曲列表等多种数据展示 |
23 | | -- 🔄 **实时处理**: 支持流式图像数据传输 |
24 | | -- 🎭 **动画支持**: 可生成动画效果的 Best 50 图片 |
25 | | -- 🎮 **游戏集成**: 专为舞萌 DX 游戏设计的数据处理 |
26 | | - |
27 | | -## 🏗️ 技术架构 |
28 | | - |
29 | | -### 核心技术栈 |
30 | | - |
31 | | -- **运行时**: .NET |
32 | | -- **通信协议**: gRPC |
33 | | -- **图像处理**: SixLabors.ImageSharp.Drawing |
34 | | -- **字体渲染**: SixLabors.Fonts |
35 | | -- **表达式引擎**: NCalc |
36 | | -- **模板引擎**: SmartFormat |
37 | | - |
38 | | -### 项目结构 |
39 | | - |
40 | | -``` |
41 | | -Limekuma/ |
42 | | -├── src/ # 源代码目录 |
43 | | -│ ├── Prober/ # 数据探针模块 |
44 | | -│ │ ├── Common/ # 通用数据模型 |
45 | | -│ │ ├── DivingFish/ # 水鱼数据源 |
46 | | -│ │ └── Lxns/ # 落雪数据源 |
47 | | -│ ├── Render/ # 渲染引擎 |
48 | | -│ │ ├── ExpressionEngine/ # 表达式引擎 |
49 | | -│ │ ├── Nodes/ # 渲染节点 |
50 | | -│ │ └── XmlSceneLoader.cs # XML场景加载器 |
51 | | -│ ├── Services/ # gRPC服务实现 |
52 | | -│ │ ├── BestsService.cs # Best 50服务 |
53 | | -│ │ ├── ListService.cs # 列表服务 |
54 | | -│ │ └── ... |
55 | | -│ ├── Utils/ # 工具类 |
56 | | -│ ├── Protos/ # Protocol Buffers定义 |
57 | | -│ └── Resources/ # 资源文件 |
58 | | -├── docs/ # 文档资源 |
59 | | -└── .github/ # GitHub工作流 |
60 | | -``` |
61 | | - |
62 | | -## 🚀 快速开始 |
63 | | - |
64 | | -### 环境要求 |
65 | | - |
66 | | -- .NET 10.0 SDK |
67 | | -- 支持 HTTP/2 的客户端 |
68 | | - |
69 | | -### 安装与运行 |
| 23 | +酸橙熊熊(青柠熊熊)是一个高性能图片生成后端服务。主要用于接入舞萌DX的查分器数据,为玩家的游玩成绩(如B50、成绩列表等)生成精美的图片,常作为机器人(如迪拉熊Bot)的后端渲染引擎。 |
70 | 24 |
|
71 | | -1. **克隆项目** |
| 25 | +本项目通过纯托管图形库ImageSharp实现了脱离原生环境依赖的图形渲染,并内置了基于XML的灵活布局引擎,能够动态渲染丰富多样的玩家成绩卡片。 |
72 | 26 |
|
73 | | - ```bash |
74 | | - git clone https://github.com/DerakkumaDev/limekuma-printer.git |
75 | | - cd limekuma-printer |
76 | | - ``` |
| 27 | +## 📚 项目文档 |
77 | 28 |
|
78 | | -2. **恢复依赖** |
| 29 | +关于酸橙熊熊的详细介绍、架构设计以及协作者接入指南,请参阅我们的[官方文档](https://dxkuma.srcz.one/collaborator-guide/limekuma-intro.html)。 |
79 | 30 |
|
80 | | - ```bash |
81 | | - dotnet restore |
82 | | - ``` |
| 31 | +## ✨ 核心特性 |
83 | 32 |
|
84 | | -3. **运行服务** |
85 | | - ```bash |
86 | | - dotnet run --project src/Limekuma.csproj |
87 | | - ``` |
| 33 | +- 🚀 **高性能渲染**:基于ImageSharp,无需依赖本地系统GDI或libgdiplus,跨平台支持好。 |
| 34 | +- 📊 **多数据源支持**: |
| 35 | + - 原生支持[落雪咖啡屋 (Lxns)](https://maimai.lxns.net)查分器API |
| 36 | + - 原生支持[水鱼 (Diving-Fish)](https://www.diving-fish.com/maimaidx/prober/)查分器API |
| 37 | +- 🖼️ **丰富的图像生成接口**: |
| 38 | + - **BestsApi**:生成玩家B50成绩图,支持段位、等级、头像细分及动图组合。 |
| 39 | + - **ListApi**:生成玩家特定等级谱面的成绩列表图。 |
| 40 | +- 🔧 **自定义布局引擎**:渲染逻辑与布局分离,基于XML节点定义的灵活布局系统。 |
| 41 | +- 📡 **流式gRPC通信**:基于Protobuf定义,提供流式的图片字节序列返回,降低大图片传输的内存占用。 |
88 | 42 |
|
89 | | -### 服务端点 |
| 43 | +## 🛠️ 技术栈 |
90 | 44 |
|
91 | | -服务默认运行在 HTTP/2 端口,支持以下 gRPC 服务: |
| 45 | +- **核心框架**:.NET |
| 46 | +- **通信协议**:gRPC |
| 47 | +- **图像处理**:ImageSharp |
| 48 | +- **表达式引擎**:NCalc |
| 49 | +- **模板引擎**:SmartFormat |
| 50 | +- **配置管理**:Hocon |
92 | 51 |
|
93 | | -#### BestsApi 服务 |
| 52 | +## 📦 快速开始 |
94 | 53 |
|
95 | | -- `GetFromLxns`: 从落雪获取 Best 50 |
96 | | -- `GetAnimeFromLxns`: 从落雪获取动画版 Best 50 |
97 | | -- `GetFromLxnsWithLevelSeg`: 从落雪获取带等级建议的 Best 50 |
98 | | -- `GetFromDivingFish`: 从水鱼获取 Best 50 |
99 | | -- `GetAnimeFromDivingFish`: 从水鱼获取动画版 Best 50 |
100 | | -- `GetFromDivingFishWithLevelSeg`: 从水鱼获取带等级建议的 Best 50 |
| 54 | +### 1. 环境要求 |
101 | 55 |
|
102 | | -#### ListApi 服务 |
| 56 | +- [.NET 10.0 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) |
103 | 57 |
|
104 | | -- `GetFromLxns`: 从落雪获取达成表 |
105 | | -- `GetFromDivingFish`: 从水鱼获取达成表 |
| 58 | +### 2. 获取源码 |
106 | 59 |
|
107 | | -## 📊 API 使用示例 |
108 | | - |
109 | | -### gRPC 客户端调用 |
110 | | - |
111 | | -```csharp |
112 | | -// 创建gRPC客户端 |
113 | | -var channel = GrpcChannel.ForAddress("https://localhost:5001"); |
114 | | -var client = new BestsApi.BestsApiClient(channel); |
| 60 | +```bash |
| 61 | +git clone <your-repo-url>/limekuma-printer.git |
| 62 | +cd limekuma-printer |
| 63 | +``` |
115 | 64 |
|
116 | | -// 请求落雪Best 50数据 |
117 | | -var request = new LxnsBestsRequest |
118 | | -{ |
119 | | - DevToken = "your_dev_token", |
120 | | - Qq = 123456789, |
121 | | - PersonalToken = "your_personal_token" |
122 | | -}; |
| 65 | +### 3. 安装依赖 |
123 | 66 |
|
124 | | -using var call = client.GetFromLxns(request); |
125 | | -await foreach (var imageResponse in call.ResponseStream.ReadAllAsync()) |
126 | | -{ |
127 | | - // 处理图像数据 |
128 | | - var imageData = imageResponse.Data; |
129 | | -} |
| 67 | +```bash |
| 68 | +dotnet restore |
130 | 69 | ``` |
131 | 70 |
|
132 | | -## 🎨 渲染系统 |
133 | | - |
134 | | -### XML 场景描述 |
135 | | - |
136 | | -项目使用自定义的 XML 格式描述渲染场景: |
137 | | - |
138 | | -```xml |
139 | | -<Canvas width="1200" height="1600" background="#FFFFFFFF"> |
140 | | - <Layer opacity="1"> |
141 | | - <Positioned x="100" y="100"> |
142 | | - <Text value="玩家Best 50" fontFamily="NotoSans" fontSize="24" color="#000000"/> |
143 | | - </Positioned> |
144 | | - <For items="records" var="record" indexVar="i"> |
145 | | - <Positioned x="{100 + (i % 5) * 120}" y="{200 + (i / 5) * 120}"> |
146 | | - <Image namespace="Jacket" id="{record.JacketId}"/> |
147 | | - </Positioned> |
148 | | - </For> |
149 | | - </Layer> |
150 | | -</Canvas> |
151 | | -``` |
| 71 | +### 4. 运行项目 |
152 | 72 |
|
153 | | -### 支持的节点类型 |
154 | | - |
155 | | -- `Canvas`: 画布容器 |
156 | | -- `Layer`: 图层(支持透明度) |
157 | | -- `Positioned`: 定位容器 |
158 | | -- `Image`: 图像节点 |
159 | | -- `Text`: 文本节点 |
160 | | -- `Stack`: 堆叠布局 |
161 | | -- `If`: 条件渲染 |
162 | | -- `For`: 循环渲染 |
163 | | - |
164 | | -## 🔧 配置说明 |
165 | | - |
166 | | -### appsettings.json |
167 | | - |
168 | | -```json |
169 | | -{ |
170 | | - "Logging": { |
171 | | - "LogLevel": { |
172 | | - "Default": "Information", |
173 | | - "Microsoft.AspNetCore": "Warning" |
174 | | - } |
175 | | - }, |
176 | | - "AllowedHosts": "*", |
177 | | - "Kestrel": { |
178 | | - "EndpointDefaults": { |
179 | | - "Protocols": "Http2" |
180 | | - } |
181 | | - } |
182 | | -} |
| 73 | +```bash |
| 74 | +dotnet run --project src/Limekuma.csproj |
183 | 75 | ``` |
184 | 76 |
|
185 | | -## 📈 性能优化 |
| 77 | +项目启动后,将通过配置中指定的端口提供gRPC服务。 |
186 | 78 |
|
187 | | -- **内存管理**: 使用 ImageSharp 的高效内存处理 |
188 | | -- **并行处理**: 支持异步并行图像处理 |
189 | | -- **资源缓存**: 智能资源缓存机制 |
190 | | -- **流式传输**: 支持分块流式图像传输 |
| 79 | +## 📜 接口定义 |
191 | 80 |
|
192 | | -## 🤝 贡献指南 |
| 81 | +API接口均定义在[`src/Protos/kumabot.proto`](src/Protos/kumabot.proto)文件中。 |
193 | 82 |
|
194 | | -1. Fork 本项目 |
195 | | -2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) |
196 | | -3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) |
197 | | -4. 推送到分支 (`git push origin feature/AmazingFeature`) |
198 | | -5. 开启 Pull request |
| 83 | +### 支持的RPC方法 |
199 | 84 |
|
200 | | -## 📄 许可证 |
| 85 | +- **BestsApi** |
| 86 | + - `GetFromLxns` / `GetFromDivingFish`:获取常规B50图片。 |
| 87 | + - `GetAnimeFromLxns` / `GetAnimeFromDivingFish`:获取包含动画版B50图片。 |
| 88 | + - `GetFromLxnsWithLevelSeg` / `GetFromDivingFishWithLevelSeg`:获取带等级建议的B50图片。 |
| 89 | +- **ListApi** |
| 90 | + - `GetFromLxns` / `GetFromDivingFish`:获取指定等级或页码的玩家成绩列表图片。 |
201 | 91 |
|
202 | | -本项目采用 GNU Affero General Public License v3.0 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。 |
| 92 | +## 📄 开源协议 |
| 93 | + |
| 94 | +本项目基于**GNU Affero General Public License v3.0(AGPL-3.0)**协议开源。详细信息请参阅[LICENSE](LICENSE)文件。 |
203 | 95 |
|
204 | 96 | ## 🐛 问题反馈 |
205 | 97 |
|
206 | 98 | 如果您遇到任何问题或有建议,请通过以下方式联系我们: |
207 | 99 |
|
208 | | -- 📧 QQ: 2689340931 |
209 | | -- 🐛 [源域漏洞追踪系统](https://l.srcz.one/kumabugs) |
210 | | - |
211 | | -## 🙏 致谢 |
212 | | - |
213 | | -感谢以下开源项目的支持: |
214 | | - |
215 | | -- [SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp) |
216 | | -- [Grpc.AspNetCore](https://github.com/grpc/grpc-dotnet) |
217 | | -- [NCalc](https://github.com/ncalc/ncalc) |
218 | | -- [SmartFormat](https://github.com/axuno/SmartFormat) |
219 | | - |
220 | | ---- |
221 | | - |
222 | | -<div align="center"> |
223 | | - |
224 | | -**让音游数据渲染更简单** · **Powered by .NET** |
225 | | - |
226 | | -</div> |
| 100 | +- 📧 [迪拉熊开发者交流群](https://qm.qq.com/cgi-bin/qm/qr?k=g-3hU7eFmvcFUuCKdCE-3COu8Ej9LfnD&jump_from=webapi&authKey=IpqRZXflOY9UKkYPn0Ho2RrVBw+UF2pfTZk6WnhU39idA4AyJt65nAwfuPfn1yZ+) |
| 101 | +- 🐛 [Codeberg](https://codeberg.org/Derakkuma/dxkuma-bot) |
0 commit comments