Miao-Yunzai/plugins/genshin/model/mys/NoteUser.js

358 lines
8.7 KiB
JavaScript
Raw Normal View History

2023-03-04 14:30:13 +08:00
/**
* Bot实际User用户类
* 主键QQ
*
* User可以注册UID通过 getRegUid / setRegUid
* 一个User可以绑定多个MysUser CK绑定MysUser
*/
import BaseModel from './BaseModel.js'
import lodash from 'lodash'
import MysUser from './MysUser.js'
import MysUtil from './MysUtil.js'
2023-03-04 14:30:13 +08:00
import gsCfg from '../gsCfg.js'
import { UserDB } from '../db/index.js'
2023-05-09 11:03:38 +08:00
import { Data } from '#miao'
2023-03-04 14:30:13 +08:00
export default class NoteUser extends BaseModel {
2023-05-09 11:03:38 +08:00
constructor (qq) {
2023-03-04 14:30:13 +08:00
super()
// 检查实例缓存
let cacheObj = this._getThis('user', qq)
if (cacheObj) {
return cacheObj
}
this.qq = qq
return this._cacheThis()
}
/**
* 当前用户是否具备CK
*/
get hasCk () {
return !lodash.isEmpty(this.mysUsers)
2023-03-04 14:30:13 +08:00
}
/**
* 获取绑定CK的UID列表如未绑定CK则返回空数组
*/
get ckUids () {
if (!this.hasCk) {
return []
}
return lodash.map(this.ckData, 'uid')
}
/**
* 获取当前生效CK
*
* 返回isMain的uid没有的话返回首位
*/
get mainCk () {
if (this.hasCk) {
return lodash.filter(this.ckData, (ck) => ck.isMain)[0] || lodash.values(this.ckData)[0]
}
return false
}
/**
* 获取当前用户的所有ck
* @returns { {ltuid:{ckData, ck, uids}} }
*/
get cks () {
2023-05-09 11:03:38 +08:00
console.log('NoteUser.cks 即将废弃')
let game = 'gs'
2023-03-04 14:30:13 +08:00
let cks = {}
if (!this.hasCk) {
return cks
}
2023-05-09 11:03:38 +08:00
for (let ltuid in this.mysUsers) {
let mys = this.mysUsers[ltuid]
if (mys && mys.ltuid && mys.uid) {
cks[ltuid] = cks[ltuid] || {
ckData: mys.getCkInfo(game),
ck: mys.ck,
uids: mys.getUids(game)
2023-03-04 14:30:13 +08:00
}
}
}
return cks
}
/**
* 创建NoteUser实例
* @param qq NoterUser对应idqq
* @param db
* * 若传入e对象则会识别e.user_id并将user对象添加至e.user
* @param data 用户对应MysCookie数据为空则自动读取
* @returns {Promise<NoteUser|*>}
2023-03-04 14:30:13 +08:00
*/
static async create (qq, db = false) {
// 兼容处理传入e
if (qq && qq.user_id) {
let e = qq
let user = await NoteUser.create(e.user_id)
e.user = user
return user
2023-03-04 14:30:13 +08:00
}
2023-05-09 11:03:38 +08:00
let user = new NoteUser(qq)
await user.initDB(db)
// 传入data则使用否则读取
return user
2023-03-04 14:30:13 +08:00
}
static async forEach (fn) {
2023-05-09 11:03:38 +08:00
let dbs = await UserDB.findAll()
await Data.forEach(users, async (db) => {
let user = await NoteUser.create(db.id, db)
return await fn(user)
})
2023-03-04 14:30:13 +08:00
}
// 初始化数据
2023-05-09 11:03:38 +08:00
async initDB (db = false) {
if (this.db && !db) {
return
}
// 为后续多类型用户兼容
2023-05-09 11:03:38 +08:00
this.db = db && db !== true ? db : await UserDB.find(this.qq, 'qq')
await this.initMysUser()
this.initUids()
2023-03-04 14:30:13 +08:00
}
// 初始化MysUser对象
async initMysUser () {
let ltuids = this.db?.ltuids || ''
this.mysUsers = {}
for (let ltuid of ltuids.split(',')) {
let mys = await MysUser.create(ltuid)
if (mys) {
this.mysUsers[ltuid] = mys
2023-03-04 14:30:13 +08:00
}
}
}
// 初始化Uid
initUids (mys = false) {
let self = this
self.uid = {}
self.uids = {}
self.uidMap = {}
self.games = {}
const { db, uids, games, uidMap, mysUsers } = self
let gameDBs = {}
lodash.forEach(db?.games, (gameDB) => {
gameDBs[gameDB.game] = gameDB
})
MysUtil.eachGame((key) => {
let gameDB = gameDBs[key]
uidMap[key] = {}
uids[key] = []
games[key] = gameDB
// 优先设置CK UID
lodash.forEach(mysUsers, (mys) => {
lodash.forEach(mys.uids[key] || [], (uid) => {
if (uid && !uidMap[key][uid]) {
uidMap[key][uid] = { uid, type: 'ck', ltuid: mys.ltuid }
uids[key].push(uid)
}
})
// 存在数据库记录则进行设置
if (gameDB) {
let regUids = gameDB.data
// 依次设置verify、reg uid数据
lodash.forEach(['verify', 'reg'], (uidType) => {
lodash.forEach(regUids, (ds, uid) => {
if (uid && ds.type === uidType && !uidMap[key][uid]) {
uidMap[key][uid] = { uid, type: ds.type }
uids[key].push(uid)
}
})
})
// 如果当前选中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] || ''
}
})
}
2023-05-09 11:03:38 +08:00
async save () {
await this.db.saveDB(this)
}
// 获取当前UID
getUid (game = 'gs') {
let gameKey = this.gameKey(game)
return this.uid[gameKey] || this.uids[gameKey][0] || ''
}
2023-05-09 11:03:38 +08:00
getSelfUid (game = 'gs') {
let gameKey = this.gameKey(game)
let uids = this.uidMap[gameKey].filter((v) => v.type === 'ck')
2023-05-09 11:03:38 +08:00
if (uids.length === 0) {
return false
}
let find = lodash.find(uids, (v) => v.uid + '' === uid + '', 0)
return find ? find.uid : uids[0].uid
}
// 获取UID列表
getUidList (game = 'gs') {
let ret = []
let gameKey = this.gameKey(game)
lodash.forEach(this.uids[gameKey], (uid) => {
ret.push(this.uidMap[gameKey][uid])
})
return ret
}
// 获取当前UID数据
getUidData (game = 'gs') {
let gameKey = this.gameKey(game)
let uid = this.getUid(game)
return this.uidMap[gameKey]?.[uid]
}
// 获取当前的MysUser对象
getMysUser (game = 'gs') {
if (lodash.isEmpty(this.mysUsers)) {
return false
}
let uidData = this.getUidData(game)
let ltuid = lodash.keys(this.mysUsers)[0]
if (uidData.type === 'ck') {
ltuid = uidData.ltuid
}
return this.mysUsers[ltuid]
}
// 添加UID
addRegUid (uid, game = 'gs') {
let gameKey = this.gameKey(game)
if (!this.uidMap[gameKey][uid]) {
this.uidMap[gameKey][uid] = { uid, type: 'reg' }
this.uids[gameKey].push(uid)
this.setMainUid(uid, game)
}
}
// 删除UID
delRegUid (uid, game = 'gs') {
let gameKey = this.gameKey(game)
if (this.uidMap[gameKey][uid] && this.uidMap[gameKey][uid].type !== 'ck') {
delete this.uidMap[gameKey][uid]
lodash.remove(this.uids[gameKey], (u) => u === uid)
2023-03-04 14:30:13 +08:00
}
}
/**
* 获取当前用户的绑定UID
* 主要供内部调用建议使用 user.uid 获取用户uid
* @returns {Promise<*>}
2023-03-04 14:30:13 +08:00
*/
async getRegUid (game = 'gs') {
2023-05-09 11:03:38 +08:00
let gameKey = this.gameKey(game)
return this.uid[gameKey] || ''
2023-03-04 14:30:13 +08:00
}
/**
* 设置当前用户的绑定uid
* @param uid 要绑定的uid
2023-05-09 11:03:38 +08:00
* @param game
* @param force 若已存在绑定uid关系是否强制更新
2023-03-04 14:30:13 +08:00
*/
2023-05-09 11:03:38 +08:00
async setRegUid (uid = '', game = 'gs', force = false) {
if (this.getRegUid(game) && false) {
return uid
}
await this.addRegUid(uid, game)
return uid
}
// 切换绑定CK生效的UID
setMainUid (uid = '', game = 'gs') {
let gameKey = this.gameKey(game)
// 兼容传入index
if (uid < 100 && this.uids[gameKey][uid]) {
uid = this.uids[gameKey][uid]
2023-03-04 14:30:13 +08:00
}
if (this.uidMap[gameKey][uid]) {
this.uid[gameKey] = uid
2023-03-04 14:30:13 +08:00
}
}
2023-03-04 14:30:13 +08:00
// 添加MysUser
addMysUser (mysUser) {
this.mysUsers[mysUser.ltuid] = mysUser
this.initUids(mysUser)
}
// 删除当前用户绑定CK
async delCk (ltuid = '', needRefreshCache = true) {
console.log('delCk', ltuid, !!this.mysUsers[ltuid])
if (!ltuid || !this.mysUsers[ltuid]) {
return
2023-03-04 14:30:13 +08:00
}
let mys = this.mysUsers[ltuid]
delete this.mysUsers[ltuid]
mys.del()
await this.initUids()
2023-03-04 14:30:13 +08:00
}
/**
* 检查当前用户绑定的CK状态
*/
async checkCk () {
// TODO:待完善文案
let cks = this.cks
let ret = []
for (let ltuid in cks) {
let ck = cks[ltuid].ck
if (!ltuid || !ck) {
continue
}
let checkRet = await MysUser.checkCkStatus(ck)
// TODO: 若checkRet中返回了不同的uid进行CK保存更新
// 失效
let mysUser = await MysUser.create(ck)
if (mysUser) {
let status = checkRet.status
if (status === 0 || status === 1) {
// status为1时无法查询天赋但仍可查询角色保留CK
await mysUser.initCache()
} else if (status === 2) {
// status为2时无法查询角色删除ck cache
// 因仍能查询体力故保留ck记录不直接删除
await mysUser.del()
} else if (status === 3) {
// status为3时CK完全失效用户删除此CK
await this.delCk(ltuid)
}
}
ret.push({
ltuid,
...checkRet
})
}
return ret
}
}