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.
Files changed (82) hide show
  1. package/README.md +248 -0
  2. package/dist/commands/admin.commands.d.ts +11 -0
  3. package/dist/commands/admin.commands.d.ts.map +1 -0
  4. package/dist/commands/admin.commands.js +268 -0
  5. package/dist/commands/bank.commands.d.ts +13 -0
  6. package/dist/commands/bank.commands.d.ts.map +1 -0
  7. package/dist/commands/bank.commands.js +211 -0
  8. package/dist/commands/base.commands.d.ts +12 -0
  9. package/dist/commands/base.commands.d.ts.map +1 -0
  10. package/dist/commands/base.commands.js +149 -0
  11. package/dist/commands/economy.commands.d.ts +13 -0
  12. package/dist/commands/economy.commands.d.ts.map +1 -0
  13. package/dist/commands/economy.commands.js +221 -0
  14. package/dist/commands/gameplay.commands.d.ts +15 -0
  15. package/dist/commands/gameplay.commands.d.ts.map +1 -0
  16. package/dist/commands/gameplay.commands.js +461 -0
  17. package/dist/commands/index.d.ts +7 -0
  18. package/dist/commands/index.d.ts.map +1 -0
  19. package/dist/commands/index.js +47 -0
  20. package/dist/commands/social.commands.d.ts +13 -0
  21. package/dist/commands/social.commands.d.ts.map +1 -0
  22. package/dist/commands/social.commands.js +305 -0
  23. package/dist/config.d.ts +37 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +35 -0
  26. package/dist/index.d.ts +22 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +57 -0
  29. package/dist/index.mjs +57 -0
  30. package/dist/models/index.d.ts +10 -0
  31. package/dist/models/index.d.ts.map +1 -0
  32. package/dist/models/index.js +40 -0
  33. package/dist/services/admin.service.d.ts +59 -0
  34. package/dist/services/admin.service.d.ts.map +1 -0
  35. package/dist/services/admin.service.js +164 -0
  36. package/dist/services/bank.service.d.ts +74 -0
  37. package/dist/services/bank.service.d.ts.map +1 -0
  38. package/dist/services/bank.service.js +354 -0
  39. package/dist/services/bodyguard.service.d.ts +36 -0
  40. package/dist/services/bodyguard.service.d.ts.map +1 -0
  41. package/dist/services/bodyguard.service.js +102 -0
  42. package/dist/services/cooldown.service.d.ts +33 -0
  43. package/dist/services/cooldown.service.d.ts.map +1 -0
  44. package/dist/services/cooldown.service.js +104 -0
  45. package/dist/services/farm.service.d.ts +61 -0
  46. package/dist/services/farm.service.d.ts.map +1 -0
  47. package/dist/services/farm.service.js +255 -0
  48. package/dist/services/index.d.ts +16 -0
  49. package/dist/services/index.d.ts.map +1 -0
  50. package/dist/services/index.js +15 -0
  51. package/dist/services/market.service.d.ts +58 -0
  52. package/dist/services/market.service.d.ts.map +1 -0
  53. package/dist/services/market.service.js +286 -0
  54. package/dist/services/player.service.d.ts +56 -0
  55. package/dist/services/player.service.d.ts.map +1 -0
  56. package/dist/services/player.service.js +201 -0
  57. package/dist/services/ranking.service.d.ts +28 -0
  58. package/dist/services/ranking.service.d.ts.map +1 -0
  59. package/dist/services/ranking.service.js +71 -0
  60. package/dist/services/redpacket.service.d.ts +63 -0
  61. package/dist/services/redpacket.service.d.ts.map +1 -0
  62. package/dist/services/redpacket.service.js +207 -0
  63. package/dist/services/transaction.service.d.ts +48 -0
  64. package/dist/services/transaction.service.d.ts.map +1 -0
  65. package/dist/services/transaction.service.js +102 -0
  66. package/dist/services/vip.service.d.ts +41 -0
  67. package/dist/services/vip.service.d.ts.map +1 -0
  68. package/dist/services/vip.service.js +167 -0
  69. package/dist/services/work.service.d.ts +49 -0
  70. package/dist/services/work.service.d.ts.map +1 -0
  71. package/dist/services/work.service.js +258 -0
  72. package/dist/types/index.d.ts +62 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +4 -0
  75. package/dist/utils/helpers.d.ts +40 -0
  76. package/dist/utils/helpers.d.ts.map +1 -0
  77. package/dist/utils/helpers.js +88 -0
  78. package/dist/utils/index.d.ts +5 -0
  79. package/dist/utils/index.d.ts.map +1 -0
  80. package/dist/utils/index.js +4 -0
  81. package/napgram-plugin.json +15 -0
  82. package/package.json +56 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * 银行命令 - 存款、取款、利息、贷款等
3
+ */
4
+ import { createCommand, makeText } from '@napgram/sdk';
5
+ export function registerBankCommands(ctx, config, services) {
6
+ const { playerService, bankService, cooldownService, transactionService } = 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) {
16
+ await event.reply([makeText('❌ 你还未注册,输入"注册"开始游戏')]);
17
+ return;
18
+ }
19
+ if (player.commandBanned) {
20
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
21
+ return;
22
+ }
23
+ const amount = Number(args[0]);
24
+ if (isNaN(amount) || amount <= 0) {
25
+ await event.reply([makeText('❌ 请输入有效的存款金额')]);
26
+ return;
27
+ }
28
+ const result = await bankService.deposit(userId, amount);
29
+ await event.reply([makeText(`✅ 存款成功!\n\n💰 存款金额:${amount}\n🏦 当前存款:${result.newDeposit}\n💵 剩余余额:${result.newBalance}\n\n💡 提示:存款会产生利息,每小时 ${(config.存款利率 * 100).toFixed(1)}%`)]);
30
+ }
31
+ catch (error) {
32
+ await event.reply([makeText(`❌ 存款失败:${error.message}`)]);
33
+ }
34
+ }
35
+ }));
36
+ // 取款命令
37
+ ctx.command(createCommand({
38
+ name: '取款',
39
+ description: '从银行取出存款',
40
+ handler: async (event, args) => {
41
+ try {
42
+ const userId = event.sender.userId;
43
+ const player = await playerService.getPlayer(userId);
44
+ if (!player) {
45
+ await event.reply([makeText('❌ 你还未注册')]);
46
+ return;
47
+ }
48
+ if (player.commandBanned) {
49
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
50
+ return;
51
+ }
52
+ const amount = Number(args[0]);
53
+ if (isNaN(amount) || amount <= 0) {
54
+ await event.reply([makeText('❌ 请输入有效的取款金额')]);
55
+ return;
56
+ }
57
+ const result = await bankService.withdraw(userId, amount);
58
+ await event.reply([makeText(`✅ 取款成功!\n\n💸 取款金额:${amount}\n🏦 剩余存款:${result.newDeposit}\n💰 当前余额:${result.newBalance}`)]);
59
+ }
60
+ catch (error) {
61
+ await event.reply([makeText(`❌ 取款失败:${error.message}`)]);
62
+ }
63
+ }
64
+ }));
65
+ // 银行信息命令
66
+ ctx.command(createCommand({
67
+ name: '银行信息',
68
+ aliases: ['银行'],
69
+ description: '查看银行账户信息',
70
+ handler: async (event) => {
71
+ try {
72
+ const userId = event.sender.userId;
73
+ const player = await playerService.getPlayer(userId);
74
+ if (!player) {
75
+ await event.reply([makeText('❌ 你还未注册')]);
76
+ return;
77
+ }
78
+ if (player.commandBanned) {
79
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
80
+ return;
81
+ }
82
+ const interest = bankService.calculateInterest(player);
83
+ const loanLimit = bankService.calculateLoanLimit(player);
84
+ const loanInterest = bankService.calculateLoanInterest(player);
85
+ let info = `🏦 银行信息\n\n💰 存款:${player.deposit} / ${player.depositLimit}\n⭐ 信用等级:${player.creditLevel}\n💵 利率:${(config.存款利率 * 100).toFixed(1)}% / 小时`;
86
+ if (interest > 0) {
87
+ info += `\n💎 可领取利息:${interest}`;
88
+ }
89
+ info += `\n\n💳 贷款信息:\n 当前贷款:${player.loanBalance}\n 可用额度:${loanLimit - player.loanBalance}\n 总额度:${loanLimit}`;
90
+ if (loanInterest > 0) {
91
+ info += `\n 待付利息:${loanInterest}`;
92
+ }
93
+ const upgradeCost = Math.floor(1000 * Math.pow(2, player.creditLevel - 1));
94
+ const nextLimit = Math.floor(config.初始存款上限 * Math.pow(2, player.creditLevel));
95
+ info += `\n\n📈 升级信用:\n 下一级存款上限:${nextLimit}\n 升级费用:${upgradeCost}`;
96
+ await event.reply([makeText(info)]);
97
+ }
98
+ catch (error) {
99
+ await event.reply([makeText(`❌ 查询失败:${error.message}`)]);
100
+ }
101
+ }
102
+ }));
103
+ // 领取利息命令
104
+ ctx.command(createCommand({
105
+ name: '领取利息',
106
+ description: '领取存款产生的利息',
107
+ handler: async (event) => {
108
+ try {
109
+ const userId = event.sender.userId;
110
+ const player = await playerService.getPlayer(userId);
111
+ if (!player) {
112
+ await event.reply([makeText('❌ 你还未注册')]);
113
+ return;
114
+ }
115
+ if (player.commandBanned) {
116
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
117
+ return;
118
+ }
119
+ const result = await bankService.claimInterest(userId);
120
+ await event.reply([makeText(`✅ 领取成功!\n\n💎 利息:${result.interest}\n⏰ 累计时长:${result.hours} 小时\n💰 当前余额:${result.newBalance}`)]);
121
+ }
122
+ catch (error) {
123
+ await event.reply([makeText(`❌ 领取失败:${error.message}`)]);
124
+ }
125
+ }
126
+ }));
127
+ // 升级信用命令
128
+ ctx.command(createCommand({
129
+ name: '升级信用',
130
+ description: '提升信用等级,扩大存款上限',
131
+ handler: async (event) => {
132
+ try {
133
+ const userId = event.sender.userId;
134
+ const player = await playerService.getPlayer(userId);
135
+ if (!player) {
136
+ await event.reply([makeText('❌ 你还未注册')]);
137
+ return;
138
+ }
139
+ if (player.commandBanned) {
140
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
141
+ return;
142
+ }
143
+ const result = await bankService.upgradeCredit(userId);
144
+ await event.reply([makeText(`✅ 升级成功!\n\n⭐ 新等级:${result.newLevel}\n🏦 存款上限:${result.newLimit}\n💸 消耗:${result.cost} 金币`)]);
145
+ }
146
+ catch (error) {
147
+ await event.reply([makeText(`❌ 升级失败:${error.message}`)]);
148
+ }
149
+ }
150
+ }));
151
+ // 贷款命令
152
+ ctx.command(createCommand({
153
+ name: '贷款',
154
+ description: '申请贷款',
155
+ handler: async (event, args) => {
156
+ try {
157
+ const userId = event.sender.userId;
158
+ const player = await playerService.getPlayer(userId);
159
+ if (!player) {
160
+ await event.reply([makeText('❌ 你还未注册')]);
161
+ return;
162
+ }
163
+ if (player.commandBanned) {
164
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
165
+ return;
166
+ }
167
+ await bankService.accrueLoanInterest(userId);
168
+ const amount = Number(args[0]);
169
+ if (isNaN(amount) || amount <= 0) {
170
+ await event.reply([makeText('❌ 请输入有效的贷款金额')]);
171
+ return;
172
+ }
173
+ const result = await bankService.applyLoan(userId, amount);
174
+ await event.reply([makeText(`✅ 贷款成功!\n\n💳 贷款金额:${amount}\n💰 当前余额:${result.newBalance}\n⚠️ 贷款总额:${result.newLoanBalance}\n\n💡 提示:贷款利息为 ${(config.贷款系统.利率 * 100).toFixed(1)}% / 小时,请及时还款!`)]);
175
+ }
176
+ catch (error) {
177
+ await event.reply([makeText(`❌ 贷款失败:${error.message}`)]);
178
+ }
179
+ }
180
+ }));
181
+ // 还款命令
182
+ ctx.command(createCommand({
183
+ name: '还款',
184
+ description: '偿还贷款',
185
+ handler: async (event, args) => {
186
+ try {
187
+ const userId = event.sender.userId;
188
+ const player = await playerService.getPlayer(userId);
189
+ if (!player) {
190
+ await event.reply([makeText('❌ 你还未注册')]);
191
+ return;
192
+ }
193
+ if (player.commandBanned) {
194
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
195
+ return;
196
+ }
197
+ await bankService.accrueLoanInterest(userId);
198
+ const amount = Number(args[0]);
199
+ if (isNaN(amount) || amount <= 0) {
200
+ await event.reply([makeText('❌ 请输入有效的还款金额')]);
201
+ return;
202
+ }
203
+ const result = await bankService.repayLoan(userId, amount);
204
+ await event.reply([makeText(`✅ 还款成功!\n\n💸 还款金额:${amount}\n💳 剩余贷款:${result.newLoanBalance} \n💰 当前余额:${result.newBalance} `)]);
205
+ }
206
+ catch (error) {
207
+ await event.reply([makeText(`❌ 还款失败:${error.message} `)]);
208
+ }
209
+ }
210
+ }));
211
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 基础命令 - 注册、个人信息、帮助等
3
+ */
4
+ import type { PluginContext } from '@napgram/sdk';
5
+ import type { SlaveMarketConfig } from '../config';
6
+ import { BankService, PlayerService, TransactionService } from '../services';
7
+ export declare function registerBaseCommands(ctx: PluginContext, config: SlaveMarketConfig, services: {
8
+ playerService: PlayerService;
9
+ bankService: BankService;
10
+ transactionService: TransactionService;
11
+ }): void;
12
+ //# sourceMappingURL=base.commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.commands.d.ts","sourceRoot":"","sources":["../../src/commands/base.commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAgC,MAAM,cAAc,CAAC;AAChF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE7E,wBAAgB,oBAAoB,CAChC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB,EAAE,kBAAkB,CAAC;CAC1C,QA0KJ"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * 基础命令 - 注册、个人信息、帮助等
3
+ */
4
+ import { createCommand, makeText } from '@napgram/sdk';
5
+ export function registerBaseCommands(ctx, config, services) {
6
+ const { playerService, bankService, transactionService } = services;
7
+ // 注册命令
8
+ ctx.command(createCommand({
9
+ name: '注册',
10
+ description: '注册成为牛马玩家',
11
+ handler: async (event) => {
12
+ try {
13
+ const userId = event.sender.userId;
14
+ const nickname = event.sender.userName || event.sender.userId;
15
+ const groupId = event.channelType === 'group' ? event.channelId : undefined;
16
+ const player = await playerService.getOrCreatePlayer(userId, nickname, groupId);
17
+ if (player.commandBanned) {
18
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
19
+ return;
20
+ }
21
+ if (player.registerTime && Date.now() - Number(player.registerTime) > 60000) {
22
+ await event.reply([makeText(`你已经注册过了!\n输入\"我的信息\"查看个人资料`)]);
23
+ return;
24
+ }
25
+ await event.reply([makeText(`🎉 注册成功!\n\n📝 你的信息:\n💰 余额:${player.balance}\n💎 身价:${player.worth}\n🏦 存款上限:${player.depositLimit}\n\n输入\"帮助\"查看所有命令`)]);
26
+ }
27
+ catch (error) {
28
+ ctx.logger.error('[slave-market] Register error:', error);
29
+ await event.reply([makeText(`❌ 注册失败:${error.message}`)]);
30
+ }
31
+ }
32
+ }));
33
+ // 我的信息命令
34
+ ctx.command(createCommand({
35
+ name: '我的信息',
36
+ aliases: ['个人信息', 'profile'],
37
+ description: '查看个人资料',
38
+ handler: async (event) => {
39
+ try {
40
+ const userId = event.sender.userId;
41
+ const player = await playerService.getPlayer(userId);
42
+ if (!player) {
43
+ await event.reply([makeText('❌ 你还未注册,输入\"注册\"开始游戏')]);
44
+ return;
45
+ }
46
+ if (player.commandBanned) {
47
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
48
+ return;
49
+ }
50
+ await bankService.accrueLoanInterest(userId);
51
+ const refreshedPlayer = await playerService.getPlayer(userId);
52
+ if (!refreshedPlayer) {
53
+ await event.reply([makeText('❌ 你还未注册,输入\"注册\"开始游戏')]);
54
+ return;
55
+ }
56
+ const isVip = await playerService.isVip(userId);
57
+ const isAdmin = await playerService.isAdmin(userId);
58
+ const owner = await playerService.getOwner(userId);
59
+ const slaves = await playerService.getSlaves(userId);
60
+ const stats = await transactionService.getStatistics(userId);
61
+ let info = `📊 个人信息\n\n👤 昵称:${refreshedPlayer.nickname}\n💰 余额:${refreshedPlayer.balance}\n💎 身价:${refreshedPlayer.worth}\n🏦 存款:${refreshedPlayer.deposit} / ${refreshedPlayer.depositLimit}\n⭐ 信用等级:${refreshedPlayer.creditLevel}`;
62
+ if (refreshedPlayer.loanBalance > 0) {
63
+ info += `\n💳 贷款:${refreshedPlayer.loanBalance}`;
64
+ }
65
+ if (isVip) {
66
+ const remaining = refreshedPlayer.vipEndTime
67
+ ? Math.ceil((Number(refreshedPlayer.vipEndTime) - Date.now()) / 86400000)
68
+ : '永久';
69
+ info += `\n👑 VIP:${remaining === '永久' ? '永久' : `剩余${remaining}天`}`;
70
+ }
71
+ if (isAdmin) {
72
+ info += `\n🔧 管理员`;
73
+ }
74
+ if (owner) {
75
+ info += `\n\n👔 主人:${owner.nickname}`;
76
+ }
77
+ if (slaves.length > 0) {
78
+ info += `\n🐂 牛马数量:${slaves.length}`;
79
+ const topSlaves = slaves.slice(0, 3);
80
+ info += `\n ${topSlaves.map(s => `${s.nickname}(${s.worth})`).join(', ')}`;
81
+ }
82
+ if (refreshedPlayer.bodyguardName && refreshedPlayer.bodyguardEndTime && Number(refreshedPlayer.bodyguardEndTime) > Date.now()) {
83
+ const remaining = Math.ceil((Number(refreshedPlayer.bodyguardEndTime) - Date.now()) / 60000);
84
+ info += `\n\n🛡️ 保镖:${refreshedPlayer.bodyguardName} (剩余${remaining}分钟)`;
85
+ }
86
+ info += `\n\n📈 统计:\n 累计收入:${stats.totalIncome}\n 累计支出:${stats.totalExpense}\n 交易次数:${stats.transactionCount}`;
87
+ await event.reply([makeText(info)]);
88
+ }
89
+ catch (error) {
90
+ ctx.logger.error('[slave-market] Profile error:', error);
91
+ await event.reply([makeText(`❌ 查询失败:${error.message}`)]);
92
+ }
93
+ }
94
+ }));
95
+ // 帮助命令
96
+ ctx.command(createCommand({
97
+ name: '玩家帮助',
98
+ aliases: ['帮助', 'help'],
99
+ description: '查看游戏帮助',
100
+ handler: async (event) => {
101
+ const userId = event.sender.userId;
102
+ const player = await playerService.getPlayer(userId);
103
+ if (player?.commandBanned) {
104
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
105
+ return;
106
+ }
107
+ await event.reply([makeText(`🎮 大牛马时代 - 命令列表\n\n📝 基础命令:\n 注册 - 注册成为玩家\n 我的信息 - 查看个人资料\n 帮助 - 查看此帮助\n\n💰 经济命令:\n 打工 - 工作赚钱\n 监狱打工/踩缝纫机 - 服刑期间赚钱\n 抢劫 [@用户] [策略] - 抢劫其他玩家\n 存款 <金额> - 存入银行\n 取款 <金额> - 从银行取出\n 领取利息 - 领取存款利息\n 银行信息 - 查看银行账户\n 转账 [@用户] <金额> - 转账\n\n🐂 牛马市场:\n 牛马市场 - 查看可购买玩家\n 我的牛马 - 查看拥有的牛马\n 购买玩家 [@用户] - 购买玩家\n 放生 [@用户] - 解除雇佣关系\n 赎身 - 支付赎金获得自由\n\n🌾 种地系统:\n 开地 - 购买新地块\n 种地 [作物] [地块] - 种植作物\n 收获 - 收获成熟作物\n 地块状态 - 查看农场状态\n\n输入具体命令查看详细说明`)]);
108
+ }
109
+ }));
110
+ // 重开命令
111
+ ctx.command(createCommand({
112
+ name: '重开',
113
+ description: '清空数据重新开始',
114
+ handler: async (event) => {
115
+ try {
116
+ const userId = event.sender.userId;
117
+ const player = await playerService.getPlayer(userId);
118
+ if (!player) {
119
+ await event.reply([makeText('❌ 你还未注册')]);
120
+ return;
121
+ }
122
+ if (player.commandBanned) {
123
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
124
+ return;
125
+ }
126
+ // 删除玩家数据(保留注册记录,重置数值)
127
+ await playerService.updatePlayer(userId, {
128
+ balance: config.初始余额,
129
+ deposit: 0,
130
+ worth: config.初始身价,
131
+ creditLevel: 1,
132
+ depositLimit: config.初始存款上限,
133
+ loanBalance: 0,
134
+ ownerId: null,
135
+ vipEndTime: null,
136
+ lastWorkTime: null,
137
+ lastRobTime: null,
138
+ lastTransferTime: null,
139
+ lastBuyTime: null,
140
+ });
141
+ await event.reply([makeText(`✅ 重开成功!所有数据已重置\n\n💰 初始余额:${config.初始余额}\n💎 初始身价:${config.初始身价}`)]);
142
+ }
143
+ catch (error) {
144
+ ctx.logger.error('[slave-market] Reset error:', error);
145
+ await event.reply([makeText(`❌ 重开失败:${error.message}`)]);
146
+ }
147
+ }
148
+ }));
149
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 经济命令 - 打工、抢劫、转账
3
+ */
4
+ import type { PluginContext } from '@napgram/sdk';
5
+ import type { SlaveMarketConfig } from '../config';
6
+ import { WorkService, PlayerService, CooldownService, TransactionService } from '../services';
7
+ export declare function registerEconomyCommands(ctx: PluginContext, config: SlaveMarketConfig, services: {
8
+ playerService: PlayerService;
9
+ workService: WorkService;
10
+ cooldownService: CooldownService;
11
+ transactionService: TransactionService;
12
+ }): void;
13
+ //# sourceMappingURL=economy.commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"economy.commands.d.ts","sourceRoot":"","sources":["../../src/commands/economy.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,EAAoB,MAAM,aAAa,CAAC;AAEhH,wBAAgB,uBAAuB,CACnC,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,QA8PJ"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * 经济命令 - 打工、抢劫、转账
3
+ */
4
+ import { createCommand, makeText } from '@napgram/sdk';
5
+ export function registerEconomyCommands(ctx, config, services) {
6
+ const { playerService, workService, cooldownService, transactionService } = services;
7
+ // 打工命令
8
+ ctx.command(createCommand({
9
+ name: '打工',
10
+ aliases: ['work'],
11
+ description: '打工赚钱',
12
+ handler: async (event) => {
13
+ try {
14
+ const userId = event.sender.userId;
15
+ const player = await playerService.getPlayer(userId);
16
+ if (!player) {
17
+ await event.reply([makeText('❌ 你还未注册')]);
18
+ return;
19
+ }
20
+ if (player.commandBanned) {
21
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
22
+ return;
23
+ }
24
+ if (player.jailEndTime && Number(player.jailEndTime) > Date.now()) {
25
+ const remaining = Math.ceil((Number(player.jailEndTime) - Date.now()) / 60000);
26
+ await event.reply([makeText(`🚔 你还在监狱中,剩余 ${remaining} 分钟\n\n💡 使用"踩缝纫机"进行监狱打工`)]);
27
+ return;
28
+ }
29
+ // 检查冷却
30
+ const isAdmin = await playerService.isAdmin(userId);
31
+ if (!isAdmin) {
32
+ await cooldownService.ensureReady(userId, '打工');
33
+ }
34
+ // 执行打工
35
+ const result = await workService.work(userId);
36
+ // 更新冷却
37
+ await cooldownService.updateCooldown(userId, '打工');
38
+ let message = `💼 打工完成!\n\n💰 收入:${result.income}`;
39
+ if (result.ownerShare > 0 && result.ownerName) {
40
+ message += `\n👔 主人分成:${result.ownerShare} (给 ${result.ownerName})`;
41
+ }
42
+ message += `\n💵 当前余额:${result.newBalance}`;
43
+ await event.reply([makeText(message)]);
44
+ }
45
+ catch (error) {
46
+ await event.reply([makeText(`❌ 打工失败:${error.message}`)]);
47
+ }
48
+ }
49
+ }));
50
+ // 监狱打工命令
51
+ ctx.command(createCommand({
52
+ name: '监狱打工',
53
+ aliases: ['踩缝纫机'],
54
+ description: '在监狱里踩缝纫机赚取收入',
55
+ handler: async (event) => {
56
+ try {
57
+ const userId = event.sender.userId;
58
+ const player = await playerService.getPlayer(userId);
59
+ if (!player) {
60
+ await event.reply([makeText('❌ 你还未注册')]);
61
+ return;
62
+ }
63
+ if (player.commandBanned) {
64
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
65
+ return;
66
+ }
67
+ if (!player.jailEndTime || Number(player.jailEndTime) <= Date.now()) {
68
+ await event.reply([makeText('🚔 你还没有入狱,无法踩缝纫机')]);
69
+ return;
70
+ }
71
+ const isAdmin = await playerService.isAdmin(userId);
72
+ if (!isAdmin) {
73
+ await cooldownService.ensureReady(userId, '打工');
74
+ }
75
+ const result = await workService.work(userId);
76
+ await cooldownService.updateCooldown(userId, '打工');
77
+ await playerService.updatePlayer(userId, {
78
+ jailWorkIncome: (player.jailWorkIncome || 0) + result.income,
79
+ });
80
+ const remaining = Math.ceil((Number(player.jailEndTime) - Date.now()) / 60000);
81
+ await event.reply([makeText(`🔨 监狱打工完成!\n\n💰 收入:${result.income}\n💵 当前余额:${result.newBalance}\n⏰ 剩余刑期:${remaining} 分钟`)]);
82
+ }
83
+ catch (error) {
84
+ await event.reply([makeText(`❌ 监狱打工失败:${error.message}`)]);
85
+ }
86
+ }
87
+ }));
88
+ // 抢劫命令
89
+ ctx.command(createCommand({
90
+ name: '抢劫',
91
+ aliases: ['rob'],
92
+ description: '抢劫其他玩家(策略:稳健/平衡/激进)',
93
+ handler: async (event, args) => {
94
+ try {
95
+ const userId = event.sender.userId;
96
+ const player = await playerService.getPlayer(userId);
97
+ if (!player) {
98
+ await event.reply([makeText('❌ 你还未注册')]);
99
+ return;
100
+ }
101
+ if (player.commandBanned) {
102
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
103
+ return;
104
+ }
105
+ // 检查是否在监狱
106
+ if (player.jailEndTime && Number(player.jailEndTime) > Date.now()) {
107
+ const remaining = Math.ceil((Number(player.jailEndTime) - Date.now()) / 60000);
108
+ await event.reply([makeText(`❌ 你还在监狱中,剩余 ${remaining} 分钟`)]);
109
+ return;
110
+ }
111
+ // 检查冷却
112
+ const isAdmin = await playerService.isAdmin(userId);
113
+ if (!isAdmin) {
114
+ await cooldownService.ensureReady(userId, '抢劫');
115
+ }
116
+ // 解析目标用户:从 @ 提及中获取
117
+ const atSegments = event.message.segments.filter(s => s.type === 'at');
118
+ const targetId = atSegments[0]?.data.userId || args[0];
119
+ if (!targetId || targetId === userId) {
120
+ await event.reply([makeText('❌ 请@一个有效的目标玩家')]);
121
+ return;
122
+ }
123
+ const targetPlayer = await playerService.getPlayer(targetId);
124
+ if (!targetPlayer) {
125
+ await event.reply([makeText('❌ 目标玩家不存在')]);
126
+ return;
127
+ }
128
+ // 解析策略
129
+ let robStrategy = '平衡';
130
+ const strategy = args[1];
131
+ if (strategy) {
132
+ const s = strategy.trim();
133
+ if (s === '稳健' || s === '激进') {
134
+ robStrategy = s;
135
+ }
136
+ }
137
+ // 执行抢劫
138
+ const result = await workService.rob(userId, targetId, robStrategy);
139
+ // 更新冷却
140
+ await cooldownService.updateCooldown(userId, '抢劫');
141
+ if (result.success) {
142
+ await event.reply([makeText(`✅ 抢劫成功!\n\n💰 抢得:${result.amount}\n💵 当前余额:${result.newBalance}\n🎯 目标余额:${result.targetBalance}\n\n策略:${robStrategy}`)]);
143
+ }
144
+ else {
145
+ await event.reply([makeText(`❌ 抢劫失败!\n\n💸 罚款:${result.penalty}\n⏰ 入狱时间:${result.jailTime} 分钟\n💵 剩余余额:${result.newBalance}\n\n💡 提示:入狱期间可以"踩缝纫机"赚钱`)]);
146
+ }
147
+ }
148
+ catch (error) {
149
+ await event.reply([makeText(`❌ 抢劫失败:${error.message}`)]);
150
+ }
151
+ }
152
+ }));
153
+ // 转账命令
154
+ ctx.command(createCommand({
155
+ name: '转账',
156
+ aliases: ['transfer'],
157
+ description: '转账给其他玩家',
158
+ handler: async (event, args) => {
159
+ try {
160
+ const userId = event.sender.userId;
161
+ const player = await playerService.getPlayer(userId);
162
+ if (!player) {
163
+ await event.reply([makeText('❌ 你还未注册')]);
164
+ return;
165
+ }
166
+ if (player.commandBanned) {
167
+ await event.reply([makeText('❌ 你的命令权限已被禁用')]);
168
+ return;
169
+ }
170
+ // 检查冷却
171
+ const isAdmin = await playerService.isAdmin(userId);
172
+ if (!isAdmin) {
173
+ await cooldownService.ensureReady(userId, '转账');
174
+ }
175
+ // 解析目标用户:从 @ 提及中获取
176
+ const atSegments = event.message.segments.filter(s => s.type === 'at');
177
+ const targetId = atSegments[0]?.data.userId || args[0];
178
+ if (!targetId || targetId === userId) {
179
+ await event.reply([makeText('❌ 请@一个有效的目标玩家')]);
180
+ return;
181
+ }
182
+ const targetPlayer = await playerService.getPlayer(targetId);
183
+ if (!targetPlayer) {
184
+ await event.reply([makeText('❌ 目标玩家不存在')]);
185
+ return;
186
+ }
187
+ // 解析金额
188
+ const amount = Number(args[1] || args[0]);
189
+ if (isNaN(amount) || amount <= 0) {
190
+ await event.reply([makeText('❌ 请输入有效的转账金额')]);
191
+ return;
192
+ }
193
+ // 检查是否为管理员/VIP
194
+ const isVip = await playerService.isVip(userId);
195
+ const transferFree = isAdmin || isVip;
196
+ // 执行转账
197
+ const result = await workService.transfer(userId, targetId, amount, transferFree);
198
+ // 更新冷却
199
+ await cooldownService.updateCooldown(userId, '转账');
200
+ let message = `✅ 转账成功!\n\n💸 转账金额:${result.actualAmount}\n👤 接收人:${targetPlayer.nickname}`;
201
+ if (result.fee > 0) {
202
+ message += `\n💳 手续费:${result.fee} (${(config.转账手续费 * 100).toFixed(1)}%)`;
203
+ }
204
+ else if (isAdmin) {
205
+ message += `\n👑 管理员免手续费`;
206
+ }
207
+ else if (isVip) {
208
+ message += `\n👑 VIP免手续费`;
209
+ }
210
+ else {
211
+ message += `\n👑 免手续费`;
212
+ }
213
+ message += `\n💰 当前余额:${result.newBalance}`;
214
+ await event.reply([makeText(message)]);
215
+ }
216
+ catch (error) {
217
+ await event.reply([makeText(`❌ 转账失败:${error.message}`)]);
218
+ }
219
+ }
220
+ }));
221
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 牛马市场和农场命令
3
+ */
4
+ import type { PluginContext } from '@napgram/sdk';
5
+ import type { SlaveMarketConfig } from '../config';
6
+ import { PlayerService, CooldownService, TransactionService, MarketService, FarmService, BodyguardService } from '../services';
7
+ export declare function registerMarketAndFarmCommands(ctx: PluginContext, config: SlaveMarketConfig, services: {
8
+ playerService: PlayerService;
9
+ cooldownService: CooldownService;
10
+ transactionService: TransactionService;
11
+ marketService: MarketService;
12
+ farmService: FarmService;
13
+ bodyguardService: BodyguardService;
14
+ }): void;
15
+ //# sourceMappingURL=gameplay.commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameplay.commands.d.ts","sourceRoot":"","sources":["../../src/commands/gameplay.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,EACH,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,gBAAgB,EACnB,MAAM,aAAa,CAAC;AAErB,wBAAgB,6BAA6B,CACzC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE;IACN,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;CACtC,QAkhBJ"}