Skip to content

Commit d95767b

Browse files
committed
feat: 现在bot的功能将指定具体游戏uid来运行
1 parent 44c5d59 commit d95767b

File tree

10 files changed

+191
-5
lines changed

10 files changed

+191
-5
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ config/
66

77
# 用户信息
88
data/token/
9+
data/userSetting/
910
data/system/versionCache.json
1011

1112
#nodejs

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ git -C ./plugins/Yunzai-Kuro-Plugin/ pull
8888

8989
### 咕咕咕
9090

91-
- [ ] 代码重构: 多uid切换
91+
- [x] 代码重构: 多uid切换
9292
- [ ] 体力查询, 通知
9393
- [ ] 战双签到 指令的时间估计
9494
- [ ] 增加 游戏签到 补签功能

apps/gameCard.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import plugin from '../../../lib/plugins/plugin.js'
22
import puppeteer from '../../../lib/puppeteer/puppeteer.js'
33
import gameCardData from '../model/gameCard.js'
44
import md5 from 'md5'
5+
import { saveAccCurPnsUidIndex } from '../model/userConfig.js'
6+
import kuroLogger from '../components/logger.js'
57

68
export class gameCard extends plugin {
79
constructor() {
@@ -16,14 +18,27 @@ export class gameCard extends plugin {
1618
priority: 1000,
1719
rule: [
1820
{
19-
reg: '^#?战双(帕弥什)?(卡片|面板)$',
21+
reg: '^#?战双(帕弥什)?(卡片|面板)(.*)$',
2022
fnc: 'gameCardPns',
2123
},
2224
],
2325
})
2426
}
2527

2628
async gameCardPns(e) {
29+
kuroLogger.debug('战双卡片:', e.msg)
30+
// 提取消息文本末尾的数字
31+
let index = this.e.msg
32+
.replace(/|||||:/g, '')
33+
.replace(/,|/g, ',')
34+
.replace(/#| /g, '')
35+
kuroLogger.debug('战双卡片索引:', index)
36+
if (index) {
37+
if (await saveAccCurPnsUidIndex(this.e.user_id, index - 1))
38+
await this.reply(`已切换至第 ${index} 个账号`)
39+
else
40+
await this.reply(`切换账号失败`)
41+
}
2742
let data = await gameCardData.get(this.e, 'gameCardPns', this.e.user_id)
2843
if (!data) return false
2944
let img = await this.cache(data)

data/token/.gitkeep

Whitespace-only changes.

data/userSetting/.gitkeep

Whitespace-only changes.

model/gameCard.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
_ResPath,
88
} from '../data/system/pluginConstants.js'
99
import kuroApi from './kuroApi.js'
10+
import { getAccCurPnsUidIndex } from './userConfig.js'
1011

1112
export default class gameCard {
1213
constructor(e, model) {
@@ -49,9 +50,11 @@ export default class gameCard {
4950
let ret = {
5051
tplFile: `${resPath}/html/${model}/index.html`,
5152
accArr,
53+
accCurPnsUidIndex: await getAccCurPnsUidIndex(e.user_id) +1,
5254
pluResPath: _ResPath,
5355
pluginName,
5456
pluginVer,
57+
countIndex: 0,
5558
}
5659
if (!ret) {
5760
await e.reply(`卡片信息获取失败: 未知错误`)

model/kuroBBSTokenHandler.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ export async function saveToken(uin, kuro_uid, kuro_token, kuro_refreshToken) {
5959
}
6060
}
6161

62+
/**
63+
* 从文件获取用户的 token 数据
64+
* @param {number} uin QQ 号
65+
* @returns {object} 多账号的原始 token 数据
66+
*/
6267
export async function getToken(uin) {
6368
const filePath = dataPath + `/token/${uin}.json`
6469
try {

model/userConfig.js

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
import fs from 'node:fs'
2+
import kuroApi from './kuroApi.js'
3+
import kuroLogger from '../components/logger.js'
4+
import { dataPath } from '../data/system/pluginConstants.js'
5+
import { getToken } from './kuroBBSTokenHandler.js'
6+
7+
/**
8+
* 获取指定 QQ 目前使用的战双 uid 索引
9+
* @param {number} uin QQ
10+
* @returns {number} 索引, -1 为读取失败
11+
*/
12+
export async function getAccCurPnsUidIndex(qq) {
13+
kuroLogger.debug(`获取用户 ${qq} 使用的战双 uid 索引...`)
14+
let kuroapi= new kuroApi(qq)
15+
let {accCurPnsUid, accCurPnsUidInKuroUid} = await getAccCurPnsUidLocal(qq)
16+
if (!accCurPnsUid || !accCurPnsUidInKuroUid) { // 如果没找到使用的 uid, 就设置为第一个 uid
17+
kuroLogger.debug(`用户 ${qq} 未设置使用的战双 uid, 尝试获取第一个 uid...`)
18+
let tokenData = await getToken(qq)
19+
let kuroUidToFetch = 0
20+
let kuroUidIndex = 0
21+
let fetchedUid = 0
22+
do {
23+
kuroLogger.debug(`尝试获取第 ${kuroUidIndex + 1} 个库洛 id 下的 uid...`)
24+
kuroUidToFetch = Object.keys(tokenData)[kuroUidIndex++]
25+
let rsp_roleList = await kuroapi.roleList(kuroUidToFetch, { gameId: 2 })
26+
if (typeof rsp_roleList !== 'string') {
27+
if (rsp_roleList.data.length > 0) {
28+
kuroLogger.debug(`成功在第 ${kuroUidIndex} 个库洛 id 下找到 uid: ${rsp_roleList.data[0].roleId}`)
29+
fetchedUid = rsp_roleList.data[0].roleId
30+
}
31+
}
32+
} while (fetchedUid === 0 && Object.keys(tokenData).length > 0 && kuroUidIndex < Object.keys(tokenData).length)
33+
kuroLogger.debug(`获取到的 uid: ${fetchedUid}`)
34+
35+
if (fetchedUid !== 0) {
36+
kuroLogger.debug(`将 ${qq} 使用的战双 uid 设置为 ${fetchedUid}, 库洛 uid 为 ${kuroUidToFetch}, 保存文件...`)
37+
saveAccCurPnsUid(qq, fetchedUid, kuroUidToFetch)
38+
return kuroUidIndex - 1
39+
}
40+
return -1
41+
}
42+
43+
kuroLogger.debug(`用户 ${qq} 使用的战双 uid 为 ${accCurPnsUid}, 对应库洛帐号 uid 为 ${accCurPnsUidInKuroUid}, 尝试获取索引...`)
44+
// 如果本地获取到uid了, 就查找uid的索引
45+
let uidIndex = 0
46+
let succeed = false
47+
// 先用qq获取到用户绑定的库洛uid
48+
let tokenData = await getToken(qq)
49+
for (const kuro_uid in tokenData) {
50+
if (succeed) break
51+
kuroLogger.debug(`尝试从第 ${uidIndex + 1} 个库洛 id ${kuro_uid} 下查找 uid ${accCurPnsUid}...`)
52+
let rsp_roleList = await kuroapi.roleList(kuro_uid, { gameId: 2 })
53+
if (typeof rsp_roleList !== 'string') {
54+
if (rsp_roleList.data.length > 0) {
55+
kuroLogger.debug(`在第 ${uidIndex + 1} 个库洛 id ${kuro_uid} 下找到 ${rsp_roleList.data.length} 个 uid: ${rsp_roleList.data.map(role => role.roleId).join(', ')}`)
56+
// 遍历data数组查找uid
57+
for (const role of rsp_roleList.data) {
58+
if (role.roleId === accCurPnsUid) {
59+
kuroLogger.debug(`找到 uid: ${accCurPnsUid}, 索引为 ${uidIndex}`)
60+
await saveAccCurPnsUid(qq, accCurPnsUid, kuro_uid)
61+
succeed = true
62+
break
63+
}
64+
uidIndex++
65+
}
66+
}
67+
} else
68+
continue // 如果获取数据失败就跳过吧
69+
}
70+
kuroLogger.debug(`用户 ${qq} 使用的战双 uid 索引 ${succeed ? '已' : '未'} 获取`)
71+
// TODO: 如果没有获取到, 应该再写入一下配置文件, 这里的代码以后再整理
72+
return succeed ? uidIndex : 0
73+
}
74+
75+
/**
76+
* 从本地获取指定 QQ 目前使用的战双 uid
77+
* @param {number} uin QQ
78+
* @returns {object} 战双 uid 和所在的库洛 uid { accCurPnsUid: 0, accCurPnsUidInKuroUid: 0}
79+
*/
80+
export async function getAccCurPnsUidLocal(qq) {
81+
// 从 dataPath/userSetting/qq.json 中读取
82+
let qqData = {}
83+
try {
84+
const fileData = await fs.promises.readFile(dataPath + `/userSetting/${qq}.json`, 'utf-8')
85+
qqData = JSON.parse(fileData)
86+
kuroLogger.debug(`用户设置文件已读取: ${JSON.stringify(qqData)}`)
87+
return { accCurPnsUid: qqData.accCurPnsUid || 0, accCurPnsUidInKuroUid: qqData.accCurPnsUidInKuroUid || 0}
88+
} catch (error) {
89+
kuroLogger.error(`读取用户设置文件时出错: ${error.message}`)
90+
return { accCurPnsUid: 0, accCurPnsUidInKuroUid: 0}
91+
}
92+
}
93+
94+
/**
95+
* 保存指定 QQ 目前使用的战双 uid 和所在的库洛 uid
96+
* @param {number} uin QQ
97+
* @param {number} uid uid
98+
* @param {number} kuro_uid 库洛 uid
99+
* @returns {boolean} 是否成功
100+
*/
101+
export async function saveAccCurPnsUid(qq, uid, kuro_uid) {
102+
kuroLogger.debug(`保存用户 ${qq} 使用的战双 uid ${uid} 和所在库洛 uid ${kuro_uid}...`)
103+
try {
104+
const qqData = { accCurPnsUid: uid, accCurPnsUidInKuroUid: kuro_uid }
105+
const filePath = dataPath + `/userSetting/${qq}.json`
106+
const jsonData = JSON.stringify(qqData)
107+
108+
await fs.promises.mkdir(dataPath + '/userSetting', { recursive: true })
109+
110+
let existingData = {}
111+
try {
112+
const fileData = await fs.promises.readFile(filePath, 'utf-8')
113+
existingData = JSON.parse(fileData)
114+
} catch (error) {
115+
if (error.code !== 'ENOENT') {
116+
kuroLogger.error(`读取用户设置文件时出错: ${error.message}`)
117+
}
118+
}
119+
120+
const newData = { ...existingData, ...qqData }
121+
const newJsonData = JSON.stringify(newData)
122+
123+
await fs.promises.writeFile(filePath, newJsonData)
124+
kuroLogger.debug(`用户设置已保存至文件: ${filePath}`)
125+
return true
126+
} catch (error) {
127+
kuroLogger.warn(`保存用户设置时出错: ${error.message}`)
128+
return false
129+
}
130+
}
131+
132+
/**
133+
* 通过 uid 索引来保存指定 QQ 目前使用的战双 uid
134+
* @param {number} uin QQ
135+
* @param {number} uidIndex uid 索引
136+
* @returns {boolean} 是否成功
137+
*/
138+
export async function saveAccCurPnsUidIndex(qq, uidIndex) {
139+
kuroLogger.debug(`保存用户 ${qq} 使用的战双 uid 索引 ${uidIndex}...`)
140+
let tokenData = await getToken(qq)
141+
let kuroUidIndex = 0
142+
let kuroUidToFetch = Object.keys(tokenData)[kuroUidIndex]
143+
let kuroapi = new kuroApi(qq)
144+
do {
145+
let rsp_roleList = await kuroapi.roleList(kuroUidToFetch, { gameId: 2 })
146+
if (typeof rsp_roleList !== 'string') {
147+
if (rsp_roleList.data.length > 0) {
148+
for (const role of rsp_roleList.data) {
149+
if (uidIndex-- === 0) {
150+
await saveAccCurPnsUid(qq, role.roleId, kuroUidToFetch)
151+
return true
152+
}
153+
}
154+
}
155+
}
156+
kuroUidToFetch = Object.keys(tokenData)[++kuroUidIndex]
157+
} while (kuroUidIndex < Object.keys(tokenData).length)
158+
159+
kuroLogger.warn(`保存用户 ${qq} 使用的战双 uid 索引 ${uidIndex} 失败`)
160+
161+
return false
162+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Yunzai-Kuro-Plugin",
3-
"version": "0.1.8-rel",
3+
"version": "0.1.9-dev",
44
"author": "TomyJan",
55
"description": "Yunzai-Bot plugin for kuro games.",
66
"type": "module",

resources/html/gameCardPns/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
<div class="mr-4 text-14 name" data-v-08c4bfda>{{@item.roleName}}</div>
3333
<div class=level data-v-08c4bfda>{{@item.gameLevel}}级</div>
3434
<div class=show data-v-08c4bfda>
35-
<input name="checkbox" type="checkbox" class="better-checkbox " {{@item.isDefault ? 'checked' : ''
36-
}}>展示
35+
<input name="checkbox" type="checkbox" class="better-checkbox " {{@++countIndex === accCurPnsUidIndex ? 'checked' : ''
36+
}}> {{@countIndex === accCurPnsUidIndex ? '&nbsp;当前' : 'No.' + countIndex}}
3737
</div>
3838
</div>
3939
<div class="sub-info text-12" data-v-08c4bfda>

0 commit comments

Comments
 (0)