Merge branch 'dev' of https://gitee.com/yoimiya-kokomi/Miao-Yunzai
This commit is contained in:
		
						commit
						9794cc5094
					
				|  | @ -19,10 +19,22 @@ const COLUMNS = { | ||||||
|   // CK
 |   // CK
 | ||||||
|   ck: Types.STRING, |   ck: Types.STRING, | ||||||
|   device: Types.STRING, |   device: Types.STRING, | ||||||
| 
 |   uids: { | ||||||
|   gsUids: Types.STRING, |     type: Types.STRING, | ||||||
| 
 |     get () { | ||||||
|   srUids: Types.STRING |       let data = this.getDataValue('uids') | ||||||
|  |       let ret = {} | ||||||
|  |       try { | ||||||
|  |         ret = JSON.parse(data) | ||||||
|  |       } catch (e) { | ||||||
|  |         ret = {} | ||||||
|  |       } | ||||||
|  |       return ret | ||||||
|  |     }, | ||||||
|  |     set (uids) { | ||||||
|  |       this.setDataValue('uids', JSON.stringify(uids)) | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class MysUserDB extends BaseModel { | class MysUserDB extends BaseModel { | ||||||
|  | @ -45,8 +57,7 @@ class MysUserDB extends BaseModel { | ||||||
|     this.ck = mys.ck |     this.ck = mys.ck | ||||||
|     this.type = mys.type |     this.type = mys.type | ||||||
|     this.device = mys.device |     this.device = mys.device | ||||||
|     this.gsUids = (mys.gsUids || []).join(',') |     this.uids = mys.uids | ||||||
|     this.srUids = (mys.srUids || []).join(',') |  | ||||||
|     await db.save() |     await db.save() | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,7 @@ | ||||||
| import BaseModel from './BaseModel.js' | import BaseModel from './BaseModel.js' | ||||||
| import lodash from 'lodash' | import lodash from 'lodash' | ||||||
|  | import { UserGameDB } from './index.js' | ||||||
|  | import MysUtil from '../mys/MysUtil.js' | ||||||
| 
 | 
 | ||||||
| const { Types } = BaseModel | const { Types } = BaseModel | ||||||
| 
 | 
 | ||||||
|  | @ -23,15 +25,7 @@ const COLUMNS = { | ||||||
|   // 头像
 |   // 头像
 | ||||||
|   face: Types.STRING, |   face: Types.STRING, | ||||||
| 
 | 
 | ||||||
|   ltuids: Types.STRING, |   ltuids: Types.STRING | ||||||
| 
 |  | ||||||
|   // 原神UID
 |  | ||||||
|   gsUid: Types.STRING, |  | ||||||
|   gsRegUids: Types.STRING, |  | ||||||
| 
 |  | ||||||
|   // 星铁UID
 |  | ||||||
|   srUid: Types.STRING, |  | ||||||
|   srRegUids: Types.STRING |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class UserDB extends BaseModel { | class UserDB extends BaseModel { | ||||||
|  | @ -39,7 +33,12 @@ class UserDB extends BaseModel { | ||||||
|     // user_id
 |     // user_id
 | ||||||
|     id = type === 'qq' ? '' + id : type + id |     id = type === 'qq' ? '' + id : type + id | ||||||
|     // DB查询
 |     // DB查询
 | ||||||
|     let user = await UserDB.findByPk(id) |     let user = await UserDB.findByPk(id, { | ||||||
|  |       include: { | ||||||
|  |         model: UserGameDB, | ||||||
|  |         as: 'games' | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|     if (!user) { |     if (!user) { | ||||||
|       user = await UserDB.build({ |       user = await UserDB.build({ | ||||||
|         id, |         id, | ||||||
|  | @ -53,15 +52,29 @@ class UserDB extends BaseModel { | ||||||
|     let db = this |     let db = this | ||||||
|     let ltuids = [] |     let ltuids = [] | ||||||
|     lodash.forEach(user.mysUsers, (mys) => { |     lodash.forEach(user.mysUsers, (mys) => { | ||||||
|       if (mys.ck) { |       if (mys.ck && mys.ltuid) { | ||||||
|         ltuids.push(mys.ltuid) |         ltuids.push(mys.ltuid) | ||||||
|       } |       } | ||||||
|     }) |     }) | ||||||
|     db.ltuids = ltuids.join(',') |     db.ltuids = ltuids.join(',') | ||||||
|     lodash.forEach(['gs', 'sr'], (key) => { |     let games = [] | ||||||
|       db[`${key}Uid`] = user[`${key}Uid`] ? user[`${key}Uid`] : user.uids[key]?.[0] || '' |     await MysUtil.eachGame(async (key) => { | ||||||
|       db[`${key}RegUids`] = JSON.stringify(user.uidMap[key]) |       let game = user.games[key] | ||||||
|  |       if (!game && (user.uid[key] || !lodash.isEmpty(user.uidMap[key]))) { | ||||||
|  |         game = await db.createGame({ | ||||||
|  |           game: key | ||||||
|  |         }) | ||||||
|  |       } | ||||||
|  |       if (game) { | ||||||
|  |         game.uid = user.uid[key] | ||||||
|  |         game.data = user.uidMap[key] | ||||||
|  |         games.push(game) | ||||||
|  |         await game.save() | ||||||
|  |       } | ||||||
|     }) |     }) | ||||||
|  |     if (games.length > 0) { | ||||||
|  |       await this.setGames(games) | ||||||
|  |     } | ||||||
|     await this.save() |     await this.save() | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,43 @@ | ||||||
|  | import BaseModel from './BaseModel.js' | ||||||
|  | import lodash from 'lodash' | ||||||
|  | 
 | ||||||
|  | const { Types } = BaseModel | ||||||
|  | 
 | ||||||
|  | const COLUMNS = { | ||||||
|  |   // 用户ID,qq为数字
 | ||||||
|  |   userId: { | ||||||
|  |     type: Types.STRING | ||||||
|  |   }, | ||||||
|  |   game: Types.STRING, | ||||||
|  |   uid: Types.STRING, | ||||||
|  |   data: { | ||||||
|  |     type: Types.STRING, | ||||||
|  |     get () { | ||||||
|  |       let data = this.getDataValue('data') | ||||||
|  |       let ret = {} | ||||||
|  |       try { | ||||||
|  |         data = JSON.parse(data) | ||||||
|  |       } catch (e) { | ||||||
|  |         data = [] | ||||||
|  |       } | ||||||
|  |       lodash.forEach(data, (ds) => { | ||||||
|  |         if (ds.uid) { | ||||||
|  |           ret[ds.uid] = ds | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  |       return ret | ||||||
|  |     }, | ||||||
|  |     set (data) { | ||||||
|  |       this.setDataValue('data', JSON.stringify(lodash.values(data))) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class UserGameDB extends BaseModel { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | BaseModel.initDB(UserGameDB, COLUMNS) | ||||||
|  | await UserGameDB.sync() | ||||||
|  | 
 | ||||||
|  | export default UserGameDB | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| import UserDB from './UserDB.js' | import UserDB from './UserDB.js' | ||||||
| import MysUserDB from './MysUserDB.js' | import MysUserDB from './MysUserDB.js' | ||||||
|  | import UserGameDB from './UserGameDB.js' | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| UserDB.belongsToMany(MysUserDB, { | UserDB.belongsToMany(MysUserDB, { | ||||||
|  | @ -9,4 +10,15 @@ MysUserDB.belongsToMany(UserDB, { | ||||||
|   through: 'UserLtuids' |   through: 'UserLtuids' | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| export { UserDB, MysUserDB } | UserDB.hasMany(UserGameDB, { | ||||||
|  |   onDelete: 'RESTRICT', | ||||||
|  |   onUpdate: 'RESTRICT', | ||||||
|  |   foreignKey: 'userId', | ||||||
|  |   as: 'games' | ||||||
|  | }) | ||||||
|  | UserGameDB.belongsTo(UserDB, { | ||||||
|  |   foreignKey: 'userId', | ||||||
|  |   as: 'games' | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | export { UserDB, MysUserDB, UserGameDB } | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| import moment from 'moment' | import moment from 'moment' | ||||||
| import BaseModel from './BaseModel.js' | import BaseModel from './BaseModel.js' | ||||||
|  | import MysUtil from './MysUtil.js' | ||||||
| 
 | 
 | ||||||
| const servs = ['mys', 'hoyolab'] | const servs = ['mys', 'hoyolab'] | ||||||
| // 超时时间不必精确,直接定24小时即可
 | // 超时时间不必精确,直接定24小时即可
 | ||||||
|  | @ -38,7 +39,7 @@ export default class DailyCache extends BaseModel { | ||||||
|     if (!uid || game === 'config') { |     if (!uid || game === 'config') { | ||||||
|       key = 'sys:config' |       key = 'sys:config' | ||||||
|     } else { |     } else { | ||||||
|       game = game === 'sr' ? 'sr' : 'gs' |       game = MysUtil.getGameKey(game) | ||||||
|       let serv = /^[6-9]|^hoyo|^os/i.test(uid) ? servs[1] : servs[0] |       let serv = /^[6-9]|^hoyo|^os/i.test(uid) ? servs[1] : servs[0] | ||||||
|       key = `${game}:${serv}` |       key = `${game}:${serv}` | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -264,7 +264,7 @@ export default class MysUser extends BaseModel { | ||||||
| 
 | 
 | ||||||
|   getUids (game = 'gs') { |   getUids (game = 'gs') { | ||||||
|     let gameKey = this.gameKey(game) |     let gameKey = this.gameKey(game) | ||||||
|     return this[`${gameKey}Uids`] || [] |     return this.uids[gameKey] || [] | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  | @ -378,10 +378,10 @@ export default class MysUser extends BaseModel { | ||||||
|     this.ck = data.ck || this.ck || '' |     this.ck = data.ck || this.ck || '' | ||||||
|     this.type = data.type || this.type || 'mys' |     this.type = data.type || this.type || 'mys' | ||||||
|     this.device = data.device || this.device || MysUtil.getDeviceGuid() |     this.device = data.device || this.device || MysUtil.getDeviceGuid() | ||||||
|  |     this.uids = this.uids || {} | ||||||
|     let self = this |     let self = this | ||||||
|     MysUtil.eachGame((game) => { |     MysUtil.eachGame((game) => { | ||||||
|       let key = `${game}Uids` |       self.uids[game] = data?.uids?.[game] || self.uids[game] || [] | ||||||
|       self[key] = lodash.isString(data[key]) ? (data[key] || '').split(',') : (lodash.isArray(data[key]) ? data[key] : (self[key] || [])) |  | ||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -400,7 +400,7 @@ export default class MysUser extends BaseModel { | ||||||
|     uid = '' + uid |     uid = '' + uid | ||||||
|     if (/\d{9}/.test(uid)) { |     if (/\d{9}/.test(uid)) { | ||||||
|       let gameKey = this.gameKey(game) |       let gameKey = this.gameKey(game) | ||||||
|       let uids = this[`${gameKey}Uids`] |       let uids = this.uids[gameKey] | ||||||
|       if (!uids.includes(uid)) { |       if (!uids.includes(uid)) { | ||||||
|         uids.push(uid) |         uids.push(uid) | ||||||
|       } |       } | ||||||
|  | @ -419,7 +419,7 @@ export default class MysUser extends BaseModel { | ||||||
|     } |     } | ||||||
|     let self = this |     let self = this | ||||||
|     await MysUtil.eachGame(async (game) => { |     await MysUtil.eachGame(async (game) => { | ||||||
|       let uids = self[`${game}Uids`] |       let uids = self.uids[game] | ||||||
|       await this.addQueryUid(uids, game) |       await this.addQueryUid(uids, game) | ||||||
|       let cache = self.getCache(game) |       let cache = self.getCache(game) | ||||||
|       let cacheSearchList = await cache.get(tables.del, this.ltuid, true) |       let cacheSearchList = await cache.get(tables.del, this.ltuid, true) | ||||||
|  | @ -445,28 +445,20 @@ export default class MysUser extends BaseModel { | ||||||
|   //
 |   //
 | ||||||
|   /** |   /** | ||||||
|    * 删除缓存, 供User解绑CK时调用 |    * 删除缓存, 供User解绑CK时调用 | ||||||
|    * @param user |  | ||||||
|    * @returns {Promise<boolean>} |    * @returns {Promise<boolean>} | ||||||
|    */ |    */ | ||||||
|   async del (user) { |   async del () { | ||||||
|     if (user && user.qq) { |     // TODO 检查一ltuid多绑定的情况
 | ||||||
|       let qqList = await this.cache.kGet(tables.qq, this.ltuid, true) |  | ||||||
|       let newList = lodash.pull(qqList, user.qq * 1) |  | ||||||
|       await this.cache.kSet(tables.qq, this.ltuid, newList) |  | ||||||
|       if (newList.length > 0) { |  | ||||||
|         // 如果数组还有其他元素,说明该ltuid还有其他绑定,不进行缓存删除
 |  | ||||||
|         return false |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     // 将查询过的uid缓存起来,以备后续重新绑定时恢复
 |     // 将查询过的uid缓存起来,以备后续重新绑定时恢复
 | ||||||
|     let uids = await this.getQueryUids() |     let self = this | ||||||
|     await this.servCache.set(tables.del, uids) |     await MysUtil.eachGame(async (game) => { | ||||||
| 
 |       let uids = await this.getQueryUids(game) | ||||||
|     // 标记ltuid为失效
 |       let cache = self.getCache(game) | ||||||
|     await this.servCache.zDel(tables.detail, this.ltuid) |       await cache.set(tables.del, uids) | ||||||
|     await this.cache.zDel(tables.uid, this.ltuid) |       // 标记ltuid为失效
 | ||||||
|     await this.cache.kDel(tables.ck, this.ltuid) |       await cache.zDel(tables.detail, this.ltuid) | ||||||
|     await this.cache.kDel(tables.qq, this.ltuid) |     }) | ||||||
|  |     await self.db.delete() | ||||||
|     logger.mark(`[删除失效ck][ltuid:${this.ltuid}]`) |     logger.mark(`[删除失效ck][ltuid:${this.ltuid}]`) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -502,13 +494,13 @@ export default class MysUser extends BaseModel { | ||||||
| 
 | 
 | ||||||
|   // 获取当前用户已查询uid列表
 |   // 获取当前用户已查询uid列表
 | ||||||
|   async getQueryUids (game = 'gs') { |   async getQueryUids (game = 'gs') { | ||||||
|     let cache = this.getCache('game') |     let cache = this.getCache(game) | ||||||
|     return await cache.zList(tables.detail, this.ltuid) |     return await cache.zList(tables.detail, this.ltuid) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // 根据uid获取查询ltuid
 |   // 根据uid获取查询ltuid
 | ||||||
|   async getQueryLtuid (uid, game = 'gs') { |   async getQueryLtuid (uid, game = 'gs') { | ||||||
|     let cache = this.getCache('game') |     let cache = this.getCache(game) | ||||||
|     return await cache.zKey(tables.detail, uid) |     return await cache.zKey(tables.detail, uid) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -518,7 +510,7 @@ export default class MysUser extends BaseModel { | ||||||
|       return false |       return false | ||||||
|     } |     } | ||||||
|     let gameKey = this.gameKey(game) |     let gameKey = this.gameKey(game) | ||||||
|     let uids = this[`${gameKey}Uids`] |     let uids = this.uids[gameKey] | ||||||
|     return uids.includes(uid + '') |     return uids.includes(uid + '') | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,7 @@ | ||||||
| import { Data } from '#miao' | import { Data } from '#miao' | ||||||
| 
 | 
 | ||||||
|  | const games = ['gs', 'sr'] | ||||||
|  | 
 | ||||||
| const MysUtil = { | const MysUtil = { | ||||||
|   // 获取标准ltuid
 |   // 获取标准ltuid
 | ||||||
|   getLtuid (data) { |   getLtuid (data) { | ||||||
|  | @ -36,7 +38,7 @@ const MysUtil = { | ||||||
| 
 | 
 | ||||||
|   // 循环game
 |   // 循环game
 | ||||||
|   async eachGame (fn) { |   async eachGame (fn) { | ||||||
|     await Data.forEach(['gs', 'sr'], fn) |     await Data.forEach(games, fn) | ||||||
|   }, |   }, | ||||||
| 
 | 
 | ||||||
|   // 循环server
 |   // 循环server
 | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ | ||||||
| import BaseModel from './BaseModel.js' | import BaseModel from './BaseModel.js' | ||||||
| import lodash from 'lodash' | import lodash from 'lodash' | ||||||
| import MysUser from './MysUser.js' | import MysUser from './MysUser.js' | ||||||
|  | import MysUtil from './MysUtil.js' | ||||||
| import gsCfg from '../gsCfg.js' | import gsCfg from '../gsCfg.js' | ||||||
| import { UserDB } from '../db/index.js' | import { UserDB } from '../db/index.js' | ||||||
| import { Data } from '#miao' | import { Data } from '#miao' | ||||||
|  | @ -24,14 +25,6 @@ export default class NoteUser extends BaseModel { | ||||||
|     return this._cacheThis() |     return this._cacheThis() | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |  | ||||||
|    * 获取当前用户uid |  | ||||||
|    * 如果为绑定用户,优先获取ck对应uid,否则获取绑定uid |  | ||||||
|    */ |  | ||||||
|   get uid () { |  | ||||||
|     return this.getUid() |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** |   /** | ||||||
|    * 当前用户是否具备CK |    * 当前用户是否具备CK | ||||||
|    */ |    */ | ||||||
|  | @ -105,8 +98,6 @@ export default class NoteUser extends BaseModel { | ||||||
|     let user = new NoteUser(qq) |     let user = new NoteUser(qq) | ||||||
|     await user.initDB(db) |     await user.initDB(db) | ||||||
| 
 | 
 | ||||||
|     // 检查绑定uid (regUid)
 |  | ||||||
|     await user.getRegUid() |  | ||||||
|     // 传入data则使用,否则读取
 |     // 传入data则使用,否则读取
 | ||||||
|     return user |     return user | ||||||
|   } |   } | ||||||
|  | @ -143,39 +134,61 @@ export default class NoteUser extends BaseModel { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // 初始化Uid
 |   // 初始化Uid
 | ||||||
|   initUids () { |   initUids (mys = false) { | ||||||
|     let self = this |     let self = this | ||||||
|  |     self.uid = {} | ||||||
|     self.uids = {} |     self.uids = {} | ||||||
|     self.uidMap = {} |     self.uidMap = {} | ||||||
|     const { db, uids, uidMap, mysUsers } = self |     self.games = {} | ||||||
|     lodash.forEach(['gs', 'sr'], (key) => { |     const { db, uids, games, uidMap, mysUsers } = self | ||||||
|       // 绑定UID
 | 
 | ||||||
|  |     let gameDBs = {} | ||||||
|  |     lodash.forEach(db?.games, (gameDB) => { | ||||||
|  |       gameDBs[gameDB.game] = gameDB | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     MysUtil.eachGame((key) => { | ||||||
|  |       let gameDB = gameDBs[key] | ||||||
|       uidMap[key] = {} |       uidMap[key] = {} | ||||||
|       uids[key] = [] |       uids[key] = [] | ||||||
|       // 设置CK UID
 |       games[key] = gameDB | ||||||
|  | 
 | ||||||
|  |       // 优先设置CK UID
 | ||||||
|       lodash.forEach(mysUsers, (mys) => { |       lodash.forEach(mysUsers, (mys) => { | ||||||
|         lodash.forEach(mys[`${key}Uids`], (uid) => { |         lodash.forEach(mys.uids[key] || [], (uid) => { | ||||||
|           if (uid && !uidMap[key][uid]) { |           if (uid && !uidMap[key][uid]) { | ||||||
|             uidMap[key][uid] = { uid, type: 'ck', ltuid: mys.ltuid } |             uidMap[key][uid] = { uid, type: 'ck', ltuid: mys.ltuid } | ||||||
|             uids[key].push(uid) |             uids[key].push(uid) | ||||||
|           } |           } | ||||||
|         }) |         }) | ||||||
|       }) |       }) | ||||||
|       let regUids = db[`${key}RegUids`] || '{}' |       // 存在数据库记录则进行设置
 | ||||||
|       try { |       if (gameDB) { | ||||||
|         regUids = JSON.parse(regUids) |         let regUids = gameDB.data | ||||||
|       } catch (e) { |         // 依次设置verify、reg uid数据
 | ||||||
|         regUids = {} |         lodash.forEach(['verify', 'reg'], (uidType) => { | ||||||
|       } |           lodash.forEach(regUids, (ds, uid) => { | ||||||
|       lodash.forEach(['verify', 'reg'], (uidType) => { |             if (uid && ds.type === uidType && !uidMap[key][uid]) { | ||||||
|         lodash.forEach(regUids, (ds, uid) => { |               uidMap[key][uid] = { uid, type: ds.type } | ||||||
|           if (uid && ds.type === uidType && !uidMap[key][uid]) { |               uids[key].push(uid) | ||||||
|             uidMap[key][uid] = { uid, type: ds.type } |             } | ||||||
|             uids[key].push(uid) |           }) | ||||||
|           } |  | ||||||
|         }) |         }) | ||||||
|       }) | 
 | ||||||
|       self[`${key}Uid`] = self[`${key}Uid`] || db[`${key}Uid`] || uids[key]?.[0] || '' |         // 如果当前选中uid未在记录中,则补充为reg数据
 | ||||||
|  |         let uid = gameDB.uid | ||||||
|  |         if (uid && !uidMap[key][uid]) { | ||||||
|  |           uidMap[key][uid] = { uid, type: 'reg' } | ||||||
|  |           uids[key].push(uid) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       // 设置选中uid
 | ||||||
|  |       if (mys && mys.uids[key]?.[0]) { | ||||||
|  |         self.uid[key] = mys.uids[key]?.[0] || self.uid[key] || '' | ||||||
|  |       } else { | ||||||
|  |         self.uid[key] = self.uid[key] || gameDB?.uid || uids[key]?.[0] || '' | ||||||
|  |       } | ||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -185,12 +198,13 @@ export default class NoteUser extends BaseModel { | ||||||
| 
 | 
 | ||||||
|   // 获取当前UID
 |   // 获取当前UID
 | ||||||
|   getUid (game = 'gs') { |   getUid (game = 'gs') { | ||||||
|     return this.isGs(game) ? this.gsUid : this.srUid |     let gameKey = this.gameKey(game) | ||||||
|  |     return this.uid[gameKey] || this.uids[gameKey][0] || '' | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   getSelfUid (game = 'gs') { |   getSelfUid (game = 'gs') { | ||||||
|     let gameKey = this.gameKey(game) |     let gameKey = this.gameKey(game) | ||||||
|     let uids = this[`${gameKey}UidMap`].filter((v) => v.type === 'ck') |     let uids = this.uidMap[gameKey].filter((v) => v.type === 'ck') | ||||||
|     if (uids.length === 0) { |     if (uids.length === 0) { | ||||||
|       return false |       return false | ||||||
|     } |     } | ||||||
|  | @ -212,7 +226,7 @@ export default class NoteUser extends BaseModel { | ||||||
|   getUidData (game = 'gs') { |   getUidData (game = 'gs') { | ||||||
|     let gameKey = this.gameKey(game) |     let gameKey = this.gameKey(game) | ||||||
|     let uid = this.getUid(game) |     let uid = this.getUid(game) | ||||||
|     return this.uidMap[gameKey][uid] |     return this.uidMap[gameKey]?.[uid] | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // 获取当前的MysUser对象
 |   // 获取当前的MysUser对象
 | ||||||
|  | @ -255,7 +269,7 @@ export default class NoteUser extends BaseModel { | ||||||
|    */ |    */ | ||||||
|   async getRegUid (game = 'gs') { |   async getRegUid (game = 'gs') { | ||||||
|     let gameKey = this.gameKey(game) |     let gameKey = this.gameKey(game) | ||||||
|     return this[`${gameKey}Uid`] || '' |     return this.uid[gameKey] || '' | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  | @ -281,27 +295,27 @@ export default class NoteUser extends BaseModel { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (this.uidMap[gameKey][uid]) { |     if (this.uidMap[gameKey][uid]) { | ||||||
|       if (this.isGs(game)) { |       this.uid[gameKey] = uid | ||||||
|         this.gsUid = uid |  | ||||||
|       } else { |  | ||||||
|         this.srUid = uid |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     this.initUids() | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // 添加MysUser
 |   // 添加MysUser
 | ||||||
|   addMysUser (mysUser) { |   addMysUser (mysUser) { | ||||||
|     this.mysUsers[mysUser.ltuid] = mysUser |     this.mysUsers[mysUser.ltuid] = mysUser | ||||||
|     this.initUids() |     this.initUids(mysUser) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // 删除当前用户绑定CK
 |   // 删除当前用户绑定CK
 | ||||||
|   async delCk (ltuid = '', needRefreshCache = true) { |   async delCk (ltuid = '', needRefreshCache = true) { | ||||||
|     if (!this.mysUsers[ltuid]) { |     if (!ltuid || !this.mysUsers[ltuid]) { | ||||||
|       return false |       return | ||||||
|     } |     } | ||||||
|  |     let mys = this.mysUsers[ltuid] | ||||||
|     delete this.mysUsers[ltuid] |     delete this.mysUsers[ltuid] | ||||||
|     this.initUids() |     mys.del() | ||||||
|  |     await this.initUids() | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ import common from '../../../lib/common/common.js' | ||||||
| import MysInfo from './mys/mysInfo.js' | import MysInfo from './mys/mysInfo.js' | ||||||
| import NoteUser from './mys/NoteUser.js' | import NoteUser from './mys/NoteUser.js' | ||||||
| import MysUser from './mys/MysUser.js' | import MysUser from './mys/MysUser.js' | ||||||
|  | import MysUtil from './mys/MysUtil.js' | ||||||
| import { promisify } from 'node:util' | import { promisify } from 'node:util' | ||||||
| import YAML from 'yaml' | import YAML from 'yaml' | ||||||
| import { Data } from '#miao' | import { Data } from '#miao' | ||||||
|  | @ -58,6 +59,7 @@ export default class User extends base { | ||||||
|       return |       return | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // TODO:独立的mys数据,不走缓存ltuid
 | ||||||
|     let mys = await MysUser.create(param.ltuid) |     let mys = await MysUser.create(param.ltuid) | ||||||
|     let data = {} |     let data = {} | ||||||
|     data.ck = `ltoken=${param.ltoken};ltuid=${param.ltuid || param.login_uid};cookie_token=${param.cookie_token || param.cookie_token_v2}; account_id=${param.ltuid || param.login_uid};` |     data.ck = `ltoken=${param.ltoken};ltuid=${param.ltuid || param.login_uid};cookie_token=${param.cookie_token || param.cookie_token_v2}; account_id=${param.ltuid || param.login_uid};` | ||||||
|  | @ -81,9 +83,10 @@ export default class User extends base { | ||||||
| 
 | 
 | ||||||
|     /** 检查ck是否失效 */ |     /** 检查ck是否失效 */ | ||||||
|     let uidRet = await mys.reqMysUid() |     let uidRet = await mys.reqMysUid() | ||||||
|     console.log('uidRet', uidRet) |  | ||||||
|     if (uidRet.status !== 0) { |     if (uidRet.status !== 0) { | ||||||
|       logger.mark(`绑定cookie错误1:${this.checkMsg || 'cookie错误'}`) |       logger.mark(`绑定cookie错误1:${this.checkMsg || 'cookie错误'}`) | ||||||
|  |       // 清除mys数据
 | ||||||
|  |       mys._delCache() | ||||||
|       return await this.e.reply(`绑定cookie失败:${this.checkMsg || 'cookie错误'}`) |       return await this.e.reply(`绑定cookie失败:${this.checkMsg || 'cookie错误'}`) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -92,10 +95,8 @@ export default class User extends base { | ||||||
|       let userFullInfo = await mys.getUserFullInfo() |       let userFullInfo = await mys.getUserFullInfo() | ||||||
|       if (userFullInfo?.data?.user_info) { |       if (userFullInfo?.data?.user_info) { | ||||||
|         let userInfo = userFullInfo?.data?.user_info |         let userInfo = userFullInfo?.data?.user_info | ||||||
|         /* |         // this.ltuid = userInfo.uid
 | ||||||
|         this.ltuid = userInfo.uid |         // this.ck = `${this.ck}ltuid=${this.ltuid};`
 | ||||||
|         this.ck = `${this.ck}ltuid=${this.ltuid};` |  | ||||||
|          */ |  | ||||||
|       } else { |       } else { | ||||||
|         logger.mark(`绑定cookie错误2:${userFullInfo.message || 'cookie错误'}`) |         logger.mark(`绑定cookie错误2:${userFullInfo.message || 'cookie错误'}`) | ||||||
|         return await this.e.reply(`绑定cookie失败:${userFullInfo.message || 'cookie错误'}`) |         return await this.e.reply(`绑定cookie失败:${userFullInfo.message || 'cookie错误'}`) | ||||||
|  | @ -105,6 +106,7 @@ export default class User extends base { | ||||||
|     logger.mark(`${this.e.logFnc} 检查cookie正常 [ltuid:${mys.ltuid}]`) |     logger.mark(`${this.e.logFnc} 检查cookie正常 [ltuid:${mys.ltuid}]`) | ||||||
| 
 | 
 | ||||||
|     await user.addMysUser(mys) |     await user.addMysUser(mys) | ||||||
|  |     await mys.initCache() | ||||||
|     await user.save() |     await user.save() | ||||||
| 
 | 
 | ||||||
|     logger.mark(`${this.e.logFnc} 保存cookie成功 [ltuid:${mys.ltuid}]`) |     logger.mark(`${this.e.logFnc} 保存cookie成功 [ltuid:${mys.ltuid}]`) | ||||||
|  | @ -133,49 +135,17 @@ export default class User extends base { | ||||||
|     await this.e.reply(msg) |     await this.e.reply(msg) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** 检查ck是否可用 */ |  | ||||||
|   async checkCk (mys, param = {}) { |  | ||||||
|     let res |  | ||||||
|     for (let type of ['mys', 'hoyolab']) { |  | ||||||
|       let roleRes = await mys.getGameRole(type) |  | ||||||
|       if (roleRes?.retcode === 0) { |  | ||||||
|         res = roleRes |  | ||||||
|         /** 国际服的标记 */ |  | ||||||
|         if (type === 'hoyolab' && typeof (param.mi18nLang) === 'string' && !/mi18nLang/.test(mys.ck)) { |  | ||||||
|           mys.ck += ` mi18nLang=${param.mi18nLang};` |  | ||||||
|           mys.type = 'hoyolab' |  | ||||||
|         } |  | ||||||
|         break |  | ||||||
|       } |  | ||||||
|       if (roleRes.retcode === -100) { |  | ||||||
|         this.checkMsg = '该ck已失效,请重新登录获取' |  | ||||||
|       } else { |  | ||||||
|         this.checkMsg = roleRes.message || 'error' |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!res) return false |  | ||||||
|     let playerList = res?.data?.list || [] |  | ||||||
|     if (!playerList || playerList.length <= 0) { |  | ||||||
|       this.checkMsg = '该账号尚未绑定原神或星穹角色!' |  | ||||||
|       return false |  | ||||||
|     } else { |  | ||||||
|       playerList = playerList.filter(v => ['hk4e_cn', 'hkrpg_cn', 'hk4e_global', 'hkrpg_global'].includes(v.game_biz)) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** 米游社默认展示的角色 */ |  | ||||||
|     for (let val of playerList) { |  | ||||||
|       mys.addUid(val.game_uid, ['hk4e_cn', 'hk4e_global'].includes(val.game_biz) ? 'gs' : 'sr') |  | ||||||
|     } |  | ||||||
|     await mys.save() |  | ||||||
|     return mys |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /** 删除绑定ck */ |   /** 删除绑定ck */ | ||||||
|   async delCk (uid = '') { |   async delCk () { | ||||||
|     let user = await this.user() |     let user = await this.user() | ||||||
|     let uids = await user.delCk() |     // 获取当前uid
 | ||||||
|     return `绑定cookie已删除,uid:${uids.join(',')}` |     let uidData = user.getUidData(this.e) | ||||||
|  |     let uidms = user.getUidList(this.e) | ||||||
|  |     if (!uidData || uidData.type !== 'ck' || !uidData.ltuid) { | ||||||
|  |       return `删除失败:当前的UID${uidData.uid}无CK信息` | ||||||
|  |     } | ||||||
|  |     let uids = await user.delCk(uidData.ltuid) | ||||||
|  |     return `绑定cookie已删除}` | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** 绑定uid,若有ck的话优先使用ck-uid */ |   /** 绑定uid,若有ck的话优先使用ck-uid */ | ||||||
|  | @ -192,8 +162,8 @@ export default class User extends base { | ||||||
|   /** #uid */ |   /** #uid */ | ||||||
|   async showUid () { |   async showUid () { | ||||||
|     let user = await this.user() |     let user = await this.user() | ||||||
|     let msg = ['通过【#uid+序号】来切换uid'] |     let msg = [] | ||||||
|     lodash.forEach({ genshin: '原神', star: '星穹铁道' }, (gameName, game) => { |     lodash.forEach({ gs: '原神', sr: '星穹铁道' }, (gameName, game) => { | ||||||
|       let uidList = user.getUidList(game) |       let uidList = user.getUidList(game) | ||||||
|       let currUid = user.getUid(game) |       let currUid = user.getUid(game) | ||||||
|       if (uidList.length === 0) { |       if (uidList.length === 0) { | ||||||
|  | @ -208,7 +178,12 @@ export default class User extends base { | ||||||
|         msg.push(tmp) |         msg.push(tmp) | ||||||
|       }) |       }) | ||||||
|     }) |     }) | ||||||
|     await this.e.reply(msg.join('\n')) |     if (msg.length > 0) { | ||||||
|  |       msg.unshift('通过【#uid+序号】来切换uid') | ||||||
|  |       await this.e.reply(msg.join('\n')) | ||||||
|  |     } else { | ||||||
|  |       await this.e.reply('尚未绑定UID,发送CK或通过【#绑定123456789】命令来绑定UID') | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** 切换uid */ |   /** 切换uid */ | ||||||
|  | @ -220,7 +195,7 @@ export default class User extends base { | ||||||
|       return await this.e.reply('uid序号输入错误') |       return await this.e.reply('uid序号输入错误') | ||||||
|     } |     } | ||||||
|     index = Number(index) - 1 |     index = Number(index) - 1 | ||||||
|     await user.setMainUid(index, game) |     user.setMainUid(index, game) | ||||||
|     await user.save() |     await user.save() | ||||||
|     return await this.showUid() |     return await this.showUid() | ||||||
|   } |   } | ||||||
|  | @ -318,13 +293,16 @@ export default class User extends base { | ||||||
|           ck, |           ck, | ||||||
|           device, |           device, | ||||||
|           ltuid, |           ltuid, | ||||||
|           star: {}, |           uids: {}, | ||||||
|           genshin: {}, |  | ||||||
|           type: /America Server|Europe Server|Asia Server/.test(region) ? 'hoyolab' : 'mys' |           type: /America Server|Europe Server|Asia Server/.test(region) ? 'hoyolab' : 'mys' | ||||||
|         } |         } | ||||||
|         let tmp = ltuids[ltuid] |         let tmp = ltuids[ltuid] | ||||||
|         let game = region === '星穹列车' ? 'star' : 'genshin' |         let game = region === '星穹列车' ? 'sr' : 'gs' | ||||||
|         tmp[game][uid] = uid |         tmp.uids[game] = tmp.uids[game] || [] | ||||||
|  |         let gameUids = tmp.uids[game] | ||||||
|  |         if (!gameUids.includes(uid + '')) { | ||||||
|  |           gameUids.push(uid + '') | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|       if (!qq) { |       if (!qq) { | ||||||
|         continue |         continue | ||||||
|  | @ -334,8 +312,6 @@ export default class User extends base { | ||||||
|         let data = ltuids[ltuid] |         let data = ltuids[ltuid] | ||||||
|         let mys = await MysUser.create(data.ltuid) |         let mys = await MysUser.create(data.ltuid) | ||||||
|         if (mys) { |         if (mys) { | ||||||
|           data.gsUids = lodash.keys(data.genshin) |  | ||||||
|           data.srUids = lodash.keys(data.star) |  | ||||||
|           mys.setCkData(data) |           mys.setCkData(data) | ||||||
|           await mys.save() |           await mys.save() | ||||||
|           user.addMysUser(mys) |           user.addMysUser(mys) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue