napgram-plugin-slave-market 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +248 -0
- package/dist/commands/admin.commands.d.ts +11 -0
- package/dist/commands/admin.commands.d.ts.map +1 -0
- package/dist/commands/admin.commands.js +268 -0
- package/dist/commands/bank.commands.d.ts +13 -0
- package/dist/commands/bank.commands.d.ts.map +1 -0
- package/dist/commands/bank.commands.js +211 -0
- package/dist/commands/base.commands.d.ts +12 -0
- package/dist/commands/base.commands.d.ts.map +1 -0
- package/dist/commands/base.commands.js +149 -0
- package/dist/commands/economy.commands.d.ts +13 -0
- package/dist/commands/economy.commands.d.ts.map +1 -0
- package/dist/commands/economy.commands.js +221 -0
- package/dist/commands/gameplay.commands.d.ts +15 -0
- package/dist/commands/gameplay.commands.d.ts.map +1 -0
- package/dist/commands/gameplay.commands.js +461 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +47 -0
- package/dist/commands/social.commands.d.ts +13 -0
- package/dist/commands/social.commands.d.ts.map +1 -0
- package/dist/commands/social.commands.js +305 -0
- package/dist/config.d.ts +37 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +35 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.mjs +57 -0
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +40 -0
- package/dist/services/admin.service.d.ts +59 -0
- package/dist/services/admin.service.d.ts.map +1 -0
- package/dist/services/admin.service.js +164 -0
- package/dist/services/bank.service.d.ts +74 -0
- package/dist/services/bank.service.d.ts.map +1 -0
- package/dist/services/bank.service.js +354 -0
- package/dist/services/bodyguard.service.d.ts +36 -0
- package/dist/services/bodyguard.service.d.ts.map +1 -0
- package/dist/services/bodyguard.service.js +102 -0
- package/dist/services/cooldown.service.d.ts +33 -0
- package/dist/services/cooldown.service.d.ts.map +1 -0
- package/dist/services/cooldown.service.js +104 -0
- package/dist/services/farm.service.d.ts +61 -0
- package/dist/services/farm.service.d.ts.map +1 -0
- package/dist/services/farm.service.js +255 -0
- package/dist/services/index.d.ts +16 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +15 -0
- package/dist/services/market.service.d.ts +58 -0
- package/dist/services/market.service.d.ts.map +1 -0
- package/dist/services/market.service.js +286 -0
- package/dist/services/player.service.d.ts +56 -0
- package/dist/services/player.service.d.ts.map +1 -0
- package/dist/services/player.service.js +201 -0
- package/dist/services/ranking.service.d.ts +28 -0
- package/dist/services/ranking.service.d.ts.map +1 -0
- package/dist/services/ranking.service.js +71 -0
- package/dist/services/redpacket.service.d.ts +63 -0
- package/dist/services/redpacket.service.d.ts.map +1 -0
- package/dist/services/redpacket.service.js +207 -0
- package/dist/services/transaction.service.d.ts +48 -0
- package/dist/services/transaction.service.d.ts.map +1 -0
- package/dist/services/transaction.service.js +102 -0
- package/dist/services/vip.service.d.ts +41 -0
- package/dist/services/vip.service.d.ts.map +1 -0
- package/dist/services/vip.service.js +167 -0
- package/dist/services/work.service.d.ts +49 -0
- package/dist/services/work.service.d.ts.map +1 -0
- package/dist/services/work.service.js +258 -0
- package/dist/types/index.d.ts +62 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/utils/helpers.d.ts +40 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +88 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/napgram-plugin.json +15 -0
- package/package.json +56 -0
package/README.md
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# 大牛马时代 🐂🐎
|
|
2
|
+
|
|
3
|
+
一个基于 NapGram 的群聊经济养成游戏插件
|
|
4
|
+
|
|
5
|
+
## 功能特点
|
|
6
|
+
|
|
7
|
+
### 🎮 核心玩法
|
|
8
|
+
- **牛马市场**: 购买、放生、赎身、抢夺其他玩家
|
|
9
|
+
- **打工赚钱**: 稳定的收入来源,牛马为主人贡献分成
|
|
10
|
+
- **种地系统**: 多地块管理,8种作物,收益丰富
|
|
11
|
+
- **抢劫对抗**: 风险与收益并存,支持3种策略(稳健/平衡/激进)
|
|
12
|
+
|
|
13
|
+
### 💰 经济系统
|
|
14
|
+
- **银行系统**: 存款、取款、自动利息计算
|
|
15
|
+
- **贷款系统**: 根据信用等级贷款,支持分期还款
|
|
16
|
+
- **转账交易**: 玩家间转账,支持红包功能
|
|
17
|
+
- **信用等级**: 提升等级扩大存款上限和贷款额度
|
|
18
|
+
|
|
19
|
+
### 🛡️ 防护与特权
|
|
20
|
+
- **保镖系统**: 雇佣保镖防止被抢劫,4种等级可选
|
|
21
|
+
- **VIP 会员**: 转账免手续费、专属福利
|
|
22
|
+
- **装扮系统**: 个性化外观展示(待实现)
|
|
23
|
+
|
|
24
|
+
### 📊 社交互动
|
|
25
|
+
- **排行榜**: 身价、资产、牛马数量排行
|
|
26
|
+
- **红包系统**: 发红包、抢红包,手气最佳奖励
|
|
27
|
+
- **成就系统**: 丰富的成就体系(待实现)
|
|
28
|
+
|
|
29
|
+
## 快速开始
|
|
30
|
+
|
|
31
|
+
### 安装
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 使用 npm
|
|
35
|
+
npm install napgram-plugin-slave-market
|
|
36
|
+
|
|
37
|
+
# 使用 pnpm
|
|
38
|
+
pnpm add napgram-plugin-slave-market
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 配置
|
|
42
|
+
|
|
43
|
+
在 NapGram 配置文件中启用插件:
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
# plugins.yaml
|
|
47
|
+
plugins:
|
|
48
|
+
- name: slave-market
|
|
49
|
+
enabled: true
|
|
50
|
+
config:
|
|
51
|
+
初始余额: 100
|
|
52
|
+
初始身价: 100
|
|
53
|
+
调试日志: false
|
|
54
|
+
管理员列表: []
|
|
55
|
+
VIP配置:
|
|
56
|
+
启用: true
|
|
57
|
+
管理员永久VIP: true
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 数据库配置
|
|
61
|
+
|
|
62
|
+
确保 `DATABASE_URL` 环境变量已设置:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
export DATABASE_URL="postgresql://user:password@localhost:5432/napgram"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
运行 Prisma 迁移:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
cd packages/napgram-plugin-slave-market
|
|
72
|
+
npx prisma migrate dev
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 使用
|
|
76
|
+
|
|
77
|
+
在群聊中发言即可自动注册,输入 `我的信息` 查看状态。
|
|
78
|
+
|
|
79
|
+
## 命令列表
|
|
80
|
+
|
|
81
|
+
### 基础命令 (4个)
|
|
82
|
+
- `注册` - 新玩家注册
|
|
83
|
+
- `我的信息` / `个人信息` - 查看个人资料
|
|
84
|
+
- `玩家帮助` / `帮助` - 查看完整帮助
|
|
85
|
+
- `重开` - 清空数据重新开始
|
|
86
|
+
|
|
87
|
+
### 经济命令 (11个)
|
|
88
|
+
- `打工` - 工作赚钱(冷却2分钟)
|
|
89
|
+
- `监狱打工` / `踩缝纫机` - 服刑期间赚钱
|
|
90
|
+
- `抢劫 [@用户] [策略]` - 抢劫其他玩家(冷却1分钟)
|
|
91
|
+
- 策略:稳健(80%/20%)、平衡(50%/30%)、激进(30%/50%)
|
|
92
|
+
- `转账 [@用户] <金额>` - 转账给其他玩家(手续费5%)
|
|
93
|
+
- `存款 <金额>` - 存入银行
|
|
94
|
+
- `取款 <金额>` - 从银行取出
|
|
95
|
+
- `领取利息` - 领取存款利息(每小时1%)
|
|
96
|
+
- `银行信息` / `银行` - 查看银行账户
|
|
97
|
+
- `升级信用` - 提升信用等级
|
|
98
|
+
- `贷款 <金额>` - 申请贷款
|
|
99
|
+
- `还款 <金额>` - 偿还贷款
|
|
100
|
+
|
|
101
|
+
### 牛马市场 (6个)
|
|
102
|
+
- `牛马市场` / `市场` - 查看可购买玩家
|
|
103
|
+
- `我的牛马` / `牛马列表` - 查看拥有的牛马
|
|
104
|
+
- `购买玩家 [@用户]` - 购买指定玩家(冷却5分钟)
|
|
105
|
+
- `放生 [@用户]` - 解除雇佣关系
|
|
106
|
+
- `赎身` - 支付赎金获得自由(身价x1.2)
|
|
107
|
+
- `抢牛马 [@用户]` - 强制抢夺(2倍价格)
|
|
108
|
+
|
|
109
|
+
### 种地系统 (4个)
|
|
110
|
+
- `开地` - 购买新地块(最多10块)
|
|
111
|
+
- `种地 [作物] [地块]` - 种植作物
|
|
112
|
+
- 作物:小麦、玉米、土豆、胡萝卜、番茄、黄瓜、茄子、辣椒
|
|
113
|
+
- `收获` - 收获所有成熟作物
|
|
114
|
+
- `地块状态` / `农场` - 查看农场状态
|
|
115
|
+
|
|
116
|
+
### 保镖系统 (3个)
|
|
117
|
+
- `保镖市场` / `保镖列表` - 查看可雇佣的保镖
|
|
118
|
+
- `雇佣保镖 <名称>` - 雇佣指定保镖
|
|
119
|
+
- 普通保镖(30分钟)、精英保镖(1小时)、专业保镖(2小时)、贴身保镖(6小时)
|
|
120
|
+
- `保镖状态` - 查看当前保镖状态
|
|
121
|
+
|
|
122
|
+
### VIP系统 (3个)
|
|
123
|
+
- `生成vip卡 <类型> <数量> [小时]` - 生成VIP卡密(仅管理员)
|
|
124
|
+
- 类型:日卡、周卡、月卡、小时卡
|
|
125
|
+
- `vip兑换 <卡密>` - 兑换VIP卡密
|
|
126
|
+
- `vip状态` / `vip` - 查看VIP状态
|
|
127
|
+
|
|
128
|
+
### 红包系统 (2个)
|
|
129
|
+
- `发红包 <金额> <份数>` - 发送群红包(手续费5%)
|
|
130
|
+
- `抢红包 <红包ID>` / `抢` - 抢红包
|
|
131
|
+
|
|
132
|
+
### 排行榜 (3个)
|
|
133
|
+
- `身价排行` / `worth` - 查看身价TOP10
|
|
134
|
+
- `资金排行` / `asset` - 查看资产TOP10(余额+存款)
|
|
135
|
+
- `牛马排行` / `slaves` - 查看牛马数量TOP10
|
|
136
|
+
|
|
137
|
+
### 管理员命令 (8个)
|
|
138
|
+
- `添加管理员 [@用户]` - 添加管理员
|
|
139
|
+
- `移除管理员 [@用户]` - 移除管理员
|
|
140
|
+
- `系统统计` / `stats` - 查看系统统计
|
|
141
|
+
- `重置游戏` - 清空所有游戏数据
|
|
142
|
+
- `清理数据` - 清理过期数据
|
|
143
|
+
- `给钱 [@用户] <金额>` - 给玩家加钱
|
|
144
|
+
- `禁用玩家 [@用户]` - 禁用玩家命令
|
|
145
|
+
- `解禁玩家 [@用户]` - 解禁玩家命令
|
|
146
|
+
|
|
147
|
+
**总计**: 44个命令
|
|
148
|
+
|
|
149
|
+
## 配置说明
|
|
150
|
+
|
|
151
|
+
查看 [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) 了解完整配置项。
|
|
152
|
+
|
|
153
|
+
### 核心配置
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
{
|
|
157
|
+
初始余额: 100, // 新玩家初始余额
|
|
158
|
+
初始身价: 100, // 新玩家初始身价
|
|
159
|
+
初始存款上限: 1000, // 初始银行存款上限
|
|
160
|
+
管理员列表: [], // 管理员 userId 或平台原始ID
|
|
161
|
+
|
|
162
|
+
打工收益比例: 0.1, // 打工收入 = 身价 * 10%
|
|
163
|
+
抢劫收益比例: 0.3, // 抢劫最多抢30%余额
|
|
164
|
+
存款利率: 0.01, // 每小时1%利息
|
|
165
|
+
转账手续费: 0.05, // 转账手续费5%
|
|
166
|
+
|
|
167
|
+
冷却时间: {
|
|
168
|
+
打工: 120000, // 2分钟
|
|
169
|
+
抢劫: 60000, // 1分钟
|
|
170
|
+
转账: 120000, // 2分钟
|
|
171
|
+
购买: 300000, // 5分钟
|
|
172
|
+
种地: 30000, // 30秒
|
|
173
|
+
收获: 10000, // 10秒
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 开发
|
|
179
|
+
|
|
180
|
+
### 构建
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
npm run build
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 开发模式
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
npm run dev
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### 测试
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
npm test
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 类型检查
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
npm run typecheck
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## 数据库结构
|
|
205
|
+
|
|
206
|
+
插件使用以下数据表:
|
|
207
|
+
|
|
208
|
+
- `slave_market_players` - 玩家信息
|
|
209
|
+
- `slave_market_transactions` - 交易记录
|
|
210
|
+
- `slave_market_farm_lands` - 地块信息
|
|
211
|
+
- `slave_market_appearances` - 装扮(待实现)
|
|
212
|
+
- `slave_market_red_packets` - 红包
|
|
213
|
+
- `slave_market_red_packet_grabs` - 红包领取记录
|
|
214
|
+
- `slave_market_vip_cards` - VIP卡密
|
|
215
|
+
- `slave_market_system` - 系统配置
|
|
216
|
+
- `slave_market_admins` - 管理员列表
|
|
217
|
+
|
|
218
|
+
## 贡献指南
|
|
219
|
+
|
|
220
|
+
欢迎提交 Issue 和 Pull Request!
|
|
221
|
+
|
|
222
|
+
### 开发流程
|
|
223
|
+
|
|
224
|
+
1. Fork 本仓库
|
|
225
|
+
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
|
|
226
|
+
3. 提交更改 (`git commit -m 'feat: Add some AmazingFeature'`)
|
|
227
|
+
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
|
228
|
+
5. 开启 Pull Request
|
|
229
|
+
|
|
230
|
+
### 代码规范
|
|
231
|
+
|
|
232
|
+
- 使用 TypeScript 严格模式
|
|
233
|
+
- 遵循 ESLint 规则
|
|
234
|
+
- 提交信息遵循 [Conventional Commits](https://www.conventionalcommits.org/)
|
|
235
|
+
|
|
236
|
+
## 许可证
|
|
237
|
+
|
|
238
|
+
MIT License
|
|
239
|
+
|
|
240
|
+
## 致谢
|
|
241
|
+
|
|
242
|
+
本插件灵感来源于 [koishi-plugin-slave-market-rework](https://github.com/example/koishi-plugin-slave-market-rework)
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
**版本**: 1.0.0
|
|
247
|
+
**维护**: NapGram Team
|
|
248
|
+
**文档**: [GitHub Wiki](https://github.com/magisk317/napgram-plugin-slave-market/wiki)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 管理员命令
|
|
3
|
+
*/
|
|
4
|
+
import type { PluginContext } from '@napgram/sdk';
|
|
5
|
+
import type { SlaveMarketConfig } from '../config';
|
|
6
|
+
import { PlayerService, AdminService } from '../services';
|
|
7
|
+
export declare function registerAdminCommands(ctx: PluginContext, config: SlaveMarketConfig, services: {
|
|
8
|
+
playerService: PlayerService;
|
|
9
|
+
adminService: AdminService;
|
|
10
|
+
}): void;
|
|
11
|
+
//# sourceMappingURL=admin.commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.commands.d.ts","sourceRoot":"","sources":["../../src/commands/admin.commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,wBAAgB,qBAAqB,CACjC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;CAC9B,QAmTJ"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 管理员命令
|
|
3
|
+
*/
|
|
4
|
+
import { createCommand, makeText } from '@napgram/sdk';
|
|
5
|
+
export function registerAdminCommands(ctx, config, services) {
|
|
6
|
+
const { playerService, adminService } = services;
|
|
7
|
+
// 添加管理员命令
|
|
8
|
+
ctx.command(createCommand({
|
|
9
|
+
name: '添加管理员',
|
|
10
|
+
description: '添加管理员(仅管理员)',
|
|
11
|
+
handler: async (event, args) => {
|
|
12
|
+
try {
|
|
13
|
+
const userId = event.sender.userId;
|
|
14
|
+
const player = await playerService.getPlayer(userId);
|
|
15
|
+
if (player?.commandBanned) {
|
|
16
|
+
await event.reply([makeText('❌ 你的命令权限已被禁用')]);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const isAdmin = await playerService.isAdmin(userId);
|
|
20
|
+
if (!isAdmin) {
|
|
21
|
+
await event.reply([makeText('❌ 只有管理员可以执行此操作')]);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const atSegments = event.message.segments.filter(s => s.type === 'at');
|
|
25
|
+
const targetId = atSegments[0]?.data.userId || args[0];
|
|
26
|
+
if (!targetId) {
|
|
27
|
+
await event.reply([makeText('❌ 请@要添加的用户')]);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const targetPlayer = await playerService.getPlayer(targetId);
|
|
31
|
+
if (!targetPlayer) {
|
|
32
|
+
await event.reply([makeText('❌ 目标玩家不存在')]);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await adminService.addAdmin(userId, targetId, targetPlayer.nickname);
|
|
36
|
+
await event.reply([makeText(`✅ 已添加 ${targetPlayer.nickname} 为管理员`)]);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
await event.reply([makeText(`❌ 操作失败:${error.message}`)]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}));
|
|
43
|
+
// 移除管理员命令
|
|
44
|
+
ctx.command(createCommand({
|
|
45
|
+
name: '移除管理员',
|
|
46
|
+
description: '移除管理员(仅管理员)',
|
|
47
|
+
handler: async (event, args) => {
|
|
48
|
+
try {
|
|
49
|
+
const userId = event.sender.userId;
|
|
50
|
+
const player = await playerService.getPlayer(userId);
|
|
51
|
+
if (player?.commandBanned) {
|
|
52
|
+
await event.reply([makeText('❌ 你的命令权限已被禁用')]);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const isAdmin = await playerService.isAdmin(userId);
|
|
56
|
+
if (!isAdmin) {
|
|
57
|
+
await event.reply([makeText('❌ 只有管理员可以执行此操作')]);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const atSegments = event.message.segments.filter(s => s.type === 'at');
|
|
61
|
+
const targetId = atSegments[0]?.data.userId || args[0];
|
|
62
|
+
if (!targetId) {
|
|
63
|
+
await event.reply([makeText('❌ 请@要移除的用户')]);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const targetPlayer = await playerService.getPlayer(targetId);
|
|
67
|
+
if (!targetPlayer) {
|
|
68
|
+
await event.reply([makeText('❌ 目标玩家不存在')]);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
await adminService.removeAdmin(targetId);
|
|
72
|
+
await event.reply([makeText(`✅ 已移除 ${targetPlayer.nickname} 的管理员权限`)]);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
await event.reply([makeText(`❌ 操作失败:${error.message}`)]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
// 系统统计命令
|
|
80
|
+
ctx.command(createCommand({
|
|
81
|
+
name: '系统统计',
|
|
82
|
+
aliases: ['stats'],
|
|
83
|
+
description: '查看系统统计(仅管理员)',
|
|
84
|
+
handler: async (event) => {
|
|
85
|
+
try {
|
|
86
|
+
const userId = event.sender.userId;
|
|
87
|
+
const player = await playerService.getPlayer(userId);
|
|
88
|
+
if (player?.commandBanned) {
|
|
89
|
+
await event.reply([makeText('❌ 你的命令权限已被禁用')]);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const isAdmin = await playerService.isAdmin(userId);
|
|
93
|
+
if (!isAdmin) {
|
|
94
|
+
await event.reply([makeText('❌ 只有管理员可以执行此操作')]);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const stats = await adminService.getSystemStats();
|
|
98
|
+
await event.reply([makeText(`📊 系统统计\n\n👥 总玩家数: ${stats.totalPlayers}\n📝 总交易数: ${stats.totalTransactions}\n💰 总余额: ${stats.totalBalance}\n🏦 总存款: ${stats.totalDeposit}\n👑 当前VIP: ${stats.activeVips}\n⚡ 24h活跃: ${stats.activePlayers24h}\n\n💎 总资产: ${stats.totalBalance + stats.totalDeposit}`)]);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
await event.reply([makeText(`❌ 查询失败:${error.message}`)]);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}));
|
|
105
|
+
// 重置游戏命令
|
|
106
|
+
ctx.command(createCommand({
|
|
107
|
+
name: '重置游戏',
|
|
108
|
+
description: '清空所有游戏数据(仅管理员)',
|
|
109
|
+
handler: async (event) => {
|
|
110
|
+
try {
|
|
111
|
+
const userId = event.sender.userId;
|
|
112
|
+
const player = await playerService.getPlayer(userId);
|
|
113
|
+
if (player?.commandBanned) {
|
|
114
|
+
await event.reply([makeText('❌ 你的命令权限已被禁用')]);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const isAdmin = await playerService.isAdmin(userId);
|
|
118
|
+
if (!isAdmin) {
|
|
119
|
+
await event.reply([makeText('❌ 只有管理员可以执行此操作')]);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const result = await adminService.resetGame();
|
|
123
|
+
await event.reply([makeText(`✅ 游戏数据已重置!\n\n删除数据:\n 玩家: ${result.players}\n 管理员: ${result.admins}\n 交易: ${result.transactions}\n 地块: ${result.farmLands}\n 装扮: ${result.appearances}\n 红包: ${result.redPackets}\n 红包领取: ${result.redPacketGrabs}\n VIP卡密: ${result.vipCards}\n 系统配置: ${result.systemConfigs}\n\n⚠️ 所有游戏数据已清空!`)]);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
await event.reply([makeText(`❌ 重置失败:${error.message}`)]);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
// 清理过期数据命令
|
|
131
|
+
ctx.command(createCommand({
|
|
132
|
+
name: '清理数据',
|
|
133
|
+
description: '清理过期数据(仅管理员)',
|
|
134
|
+
handler: async (event) => {
|
|
135
|
+
try {
|
|
136
|
+
const userId = event.sender.userId;
|
|
137
|
+
const player = await playerService.getPlayer(userId);
|
|
138
|
+
if (player?.commandBanned) {
|
|
139
|
+
await event.reply([makeText('❌ 你的命令权限已被禁用')]);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const isAdmin = await playerService.isAdmin(userId);
|
|
143
|
+
if (!isAdmin) {
|
|
144
|
+
await event.reply([makeText('❌ 只有管理员可以执行此操作')]);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const result = await adminService.cleanupExpiredData();
|
|
148
|
+
await event.reply([makeText(`✅ 清理完成!\n\n清理数据:\n 过期红包: ${result.redPackets}\n 已用卡密: ${result.vipCards}`)]);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
await event.reply([makeText(`❌ 清理失败:${error.message}`)]);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}));
|
|
155
|
+
// 给钱命令
|
|
156
|
+
ctx.command(createCommand({
|
|
157
|
+
name: '给钱',
|
|
158
|
+
description: '给玩家加钱(仅管理员)',
|
|
159
|
+
handler: async (event, args) => {
|
|
160
|
+
try {
|
|
161
|
+
const userId = event.sender.userId;
|
|
162
|
+
const player = await playerService.getPlayer(userId);
|
|
163
|
+
if (player?.commandBanned) {
|
|
164
|
+
await event.reply([makeText('❌ 你的命令权限已被禁用')]);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const isAdmin = await playerService.isAdmin(userId);
|
|
168
|
+
if (!isAdmin) {
|
|
169
|
+
await event.reply([makeText('❌ 只有管理员可以执行此操作')]);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const atSegments = event.message.segments.filter(s => s.type === 'at');
|
|
173
|
+
const targetId = atSegments[0]?.data.userId || args[0];
|
|
174
|
+
if (!targetId) {
|
|
175
|
+
await event.reply([makeText('❌ 请@目标用户')]);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const targetPlayer = await playerService.getPlayer(targetId);
|
|
179
|
+
if (!targetPlayer) {
|
|
180
|
+
await event.reply([makeText('❌ 目标玩家不存在')]);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const amount = Number(args[1] || args[0]);
|
|
184
|
+
if (isNaN(amount)) {
|
|
185
|
+
await event.reply([makeText('❌ 请输入有效的金额')]);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const newBalance = await adminService.giveBalance(targetId, amount);
|
|
189
|
+
await event.reply([makeText(`✅ 已给 ${targetPlayer.nickname} 加钱\n\n💰 金额: ${amount}\n💵 新余额: ${newBalance}`)]);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
await event.reply([makeText(`❌ 操作失败:${error.message}`)]);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}));
|
|
196
|
+
// 禁用玩家命令
|
|
197
|
+
ctx.command(createCommand({
|
|
198
|
+
name: '禁用玩家',
|
|
199
|
+
description: '禁用玩家命令(仅管理员)',
|
|
200
|
+
handler: async (event, args) => {
|
|
201
|
+
try {
|
|
202
|
+
const userId = event.sender.userId;
|
|
203
|
+
const player = await playerService.getPlayer(userId);
|
|
204
|
+
if (player?.commandBanned) {
|
|
205
|
+
await event.reply([makeText('❌ 你的命令权限已被禁用')]);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const isAdmin = await playerService.isAdmin(userId);
|
|
209
|
+
if (!isAdmin) {
|
|
210
|
+
await event.reply([makeText('❌ 只有管理员可以执行此操作')]);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const atSegments = event.message.segments.filter(s => s.type === 'at');
|
|
214
|
+
const targetId = atSegments[0]?.data.userId || args[0];
|
|
215
|
+
if (!targetId) {
|
|
216
|
+
await event.reply([makeText('❌ 请@目标用户')]);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const targetPlayer = await playerService.getPlayer(targetId);
|
|
220
|
+
if (!targetPlayer) {
|
|
221
|
+
await event.reply([makeText('❌ 目标玩家不存在')]);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
await adminService.togglePlayerBan(targetId, true);
|
|
225
|
+
await event.reply([makeText(`✅ 已禁用 ${targetPlayer.nickname} 的命令权限`)]);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
await event.reply([makeText(`❌ 操作失败:${error.message}`)]);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}));
|
|
232
|
+
// 解禁玩家命令
|
|
233
|
+
ctx.command(createCommand({
|
|
234
|
+
name: '解禁玩家',
|
|
235
|
+
description: '解禁玩家命令(仅管理员)',
|
|
236
|
+
handler: async (event, args) => {
|
|
237
|
+
try {
|
|
238
|
+
const userId = event.sender.userId;
|
|
239
|
+
const player = await playerService.getPlayer(userId);
|
|
240
|
+
if (player?.commandBanned) {
|
|
241
|
+
await event.reply([makeText('❌ 你的命令权限已被禁用')]);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const isAdmin = await playerService.isAdmin(userId);
|
|
245
|
+
if (!isAdmin) {
|
|
246
|
+
await event.reply([makeText('❌ 只有管理员可以执行此操作')]);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const atSegments = event.message.segments.filter(s => s.type === 'at');
|
|
250
|
+
const targetId = atSegments[0]?.data.userId || args[0];
|
|
251
|
+
if (!targetId) {
|
|
252
|
+
await event.reply([makeText('❌ 请@目标用户')]);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const targetPlayer = await playerService.getPlayer(targetId);
|
|
256
|
+
if (!targetPlayer) {
|
|
257
|
+
await event.reply([makeText('❌ 目标玩家不存在')]);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
await adminService.togglePlayerBan(targetId, false);
|
|
261
|
+
await event.reply([makeText(`✅ 已解禁 ${targetPlayer.nickname} 的命令权限`)]);
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
await event.reply([makeText(`❌ 操作失败:${error.message}`)]);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 银行命令 - 存款、取款、利息、贷款等
|
|
3
|
+
*/
|
|
4
|
+
import type { PluginContext } from '@napgram/sdk';
|
|
5
|
+
import type { SlaveMarketConfig } from '../config';
|
|
6
|
+
import { BankService, PlayerService, CooldownService, TransactionService } from '../services';
|
|
7
|
+
export declare function registerBankCommands(ctx: PluginContext, config: SlaveMarketConfig, services: {
|
|
8
|
+
playerService: PlayerService;
|
|
9
|
+
bankService: BankService;
|
|
10
|
+
cooldownService: CooldownService;
|
|
11
|
+
transactionService: TransactionService;
|
|
12
|
+
}): void;
|
|
13
|
+
//# sourceMappingURL=bank.commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bank.commands.d.ts","sourceRoot":"","sources":["../../src/commands/bank.commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE9F,wBAAgB,oBAAoB,CAChC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,CAAC;CAC1C,QAsPJ"}
|