|
| 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 | +} |
0 commit comments