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'
|
2023-05-10 05:55:21 +08:00
|
|
|
|
import MysUtil from './MysUtil.js'
|
2023-05-08 05:11:29 +08:00
|
|
|
|
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()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2023-06-01 03:28:35 +08:00
|
|
|
|
* OLD Func {{
|
2023-03-04 14:30:13 +08:00
|
|
|
|
*/
|
2023-06-01 03:28:35 +08:00
|
|
|
|
|
|
|
|
|
get uid () {
|
|
|
|
|
console.warn('NoteUser.uid 默认返回原神UID,可更改为 user.getUid(game)')
|
|
|
|
|
return this.getUid()
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
// 获取绑定CK的UID列表,如未绑定CK则返回空数组
|
2023-03-04 14:30:13 +08:00
|
|
|
|
get ckUids () {
|
2023-06-01 03:28:35 +08:00
|
|
|
|
console.warn('NoteUser.ckUids 默认返回原神UID,可更改为 user.getCkUidList(game)')
|
|
|
|
|
let uids = this.getCkUidList('gs')
|
|
|
|
|
return lodash.map(uids, (ds) => ds.uid)
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取当前用户的所有ck
|
|
|
|
|
* @returns { {ltuid:{ckData, ck, uids}} }
|
|
|
|
|
*/
|
|
|
|
|
get cks () {
|
2023-06-01 03:28:35 +08:00
|
|
|
|
console.warn('NoteUser.cks 即将废弃')
|
2023-05-09 11:03:38 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* End OLD Func }}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// 当前用户是否具备CK
|
|
|
|
|
get hasCk () {
|
|
|
|
|
return !lodash.isEmpty(this.mysUsers)
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-04 14:30:13 +08:00
|
|
|
|
/**
|
2023-05-08 05:11:29 +08:00
|
|
|
|
* 创建NoteUser实例
|
|
|
|
|
* @param qq NoterUser对应id(qq)
|
2023-05-09 11:32:39 +08:00
|
|
|
|
* @param db
|
2023-05-08 05:11:29 +08:00
|
|
|
|
* * 若传入e对象则会识别e.user_id,并将user对象添加至e.user
|
|
|
|
|
* @param data 用户对应MysCookie数据,为空则自动读取
|
|
|
|
|
* @returns {Promise<NoteUser|*>}
|
2023-03-04 14:30:13 +08:00
|
|
|
|
*/
|
2023-05-09 11:32:39 +08:00
|
|
|
|
static async create (qq, db = false) {
|
2023-05-08 05:11:29 +08:00
|
|
|
|
// 兼容处理传入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-08 05:11:29 +08:00
|
|
|
|
|
2023-05-09 11:03:38 +08:00
|
|
|
|
let user = new NoteUser(qq)
|
|
|
|
|
await user.initDB(db)
|
2023-05-08 05:11:29 +08:00
|
|
|
|
|
|
|
|
|
// 传入data则使用,否则读取
|
|
|
|
|
return user
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-08 05:11:29 +08:00
|
|
|
|
static async forEach (fn) {
|
2023-05-09 11:03:38 +08:00
|
|
|
|
let dbs = await UserDB.findAll()
|
2023-05-31 03:19:27 +08:00
|
|
|
|
await Data.forEach(dbs, async (db) => {
|
2023-05-09 11:03:38 +08:00
|
|
|
|
let user = await NoteUser.create(db.id, db)
|
|
|
|
|
return await fn(user)
|
|
|
|
|
})
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-08 05:11:29 +08:00
|
|
|
|
// 初始化数据
|
2023-05-09 11:03:38 +08:00
|
|
|
|
async initDB (db = false) {
|
|
|
|
|
if (this.db && !db) {
|
2023-05-08 05:11:29 +08:00
|
|
|
|
return
|
|
|
|
|
}
|
2023-06-01 03:28:35 +08:00
|
|
|
|
if (db && db !== true) {
|
|
|
|
|
this.db = db
|
|
|
|
|
} else {
|
|
|
|
|
this.db = await UserDB.find(this.qq, 'qq')
|
|
|
|
|
}
|
2023-05-09 11:03:38 +08:00
|
|
|
|
await this.initMysUser()
|
2023-06-04 05:03:50 +08:00
|
|
|
|
this._games = this.db.games
|
2023-05-11 06:08:03 +08:00
|
|
|
|
await this.save()
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-08 05:11:29 +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
|
|
|
|
}
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 11:03:38 +08:00
|
|
|
|
async save () {
|
|
|
|
|
await this.db.saveDB(this)
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
|
|
|
|
|
getUidMapList (game = 'gs', type = 'all') {
|
|
|
|
|
if (this._map?.[game]?.[type]) {
|
|
|
|
|
return this._map[game][type]
|
|
|
|
|
}
|
|
|
|
|
game = this.gameKey(game)
|
|
|
|
|
let uidMap = {}
|
|
|
|
|
let uidList = []
|
|
|
|
|
lodash.forEach(this.mysUsers, (mys) => {
|
|
|
|
|
if (!mys) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
lodash.forEach(mys.uids[game] || [], (uid) => {
|
|
|
|
|
uid = uid + ''
|
|
|
|
|
if (uid && !uidMap[uid]) {
|
|
|
|
|
uidMap[uid] = mys.getUidData(uid, game)
|
|
|
|
|
uidList.push(uidMap[uid])
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
if (type === 'all') {
|
|
|
|
|
let gameDs = this.getGameDs(game)
|
|
|
|
|
lodash.forEach(gameDs.data, (ds) => {
|
|
|
|
|
if (ds.uid && !uidMap[ds.uid]) {
|
|
|
|
|
uidMap[ds.uid] = ds
|
|
|
|
|
uidList.push(ds)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this._map = this._map || {}
|
|
|
|
|
this._map[game] = this._map[game] || {}
|
|
|
|
|
this._map[game][type] = {
|
|
|
|
|
map: uidMap,
|
|
|
|
|
list: uidList
|
|
|
|
|
}
|
|
|
|
|
return this._map[game][type]
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
|
|
|
|
|
getUidData (uid = '', game = 'gs') {
|
|
|
|
|
if (!uid) {
|
|
|
|
|
uid = this.getUid(game)
|
2023-05-09 11:03:38 +08:00
|
|
|
|
}
|
2023-06-01 03:28:35 +08:00
|
|
|
|
return this.getUidMapList(game, 'all').map[uid]
|
2023-05-09 11:03:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
/** 有Uid */
|
|
|
|
|
hasUid (uid = '', game = '') {
|
|
|
|
|
if (!uid) {
|
|
|
|
|
return this.getUidMapList(game, 'all').list?.length > 0
|
|
|
|
|
}
|
|
|
|
|
return !!this.getUidData(uid, game)
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
/** 获取CK-Uid */
|
|
|
|
|
getCkUid (game = 'gs') {
|
2023-05-08 05:11:29 +08:00
|
|
|
|
let uid = this.getUid(game)
|
2023-06-01 03:28:35 +08:00
|
|
|
|
let { map, list } = this.getUidMapList(game, 'ck')
|
|
|
|
|
return (map[uid] ? uid : list[0]?.uid) || ''
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 获取CK-Uid列表 */
|
|
|
|
|
getCkUidList (game = 'gs') {
|
|
|
|
|
return this.getUidMapList(game, 'ck').list
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 获取当前UID */
|
|
|
|
|
getUid (game = 'gs') {
|
2023-06-04 05:46:21 +08:00
|
|
|
|
game = this.gameKey(game)
|
2023-06-01 03:28:35 +08:00
|
|
|
|
// todo 刷新uid
|
2023-06-04 05:03:50 +08:00
|
|
|
|
let ds = this.getGameDs(game)
|
|
|
|
|
if (!ds.uid) {
|
|
|
|
|
this.setMainUid('', game)
|
|
|
|
|
}
|
|
|
|
|
return ds.uid || ''
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
/** 获取UID列表 */
|
|
|
|
|
getUidList (game = 'gs') {
|
|
|
|
|
return this.getUidMapList(game, 'all').list
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 获取当前的MysUser对象 */
|
2023-05-08 05:11:29 +08:00
|
|
|
|
getMysUser (game = 'gs') {
|
|
|
|
|
if (lodash.isEmpty(this.mysUsers)) {
|
|
|
|
|
return false
|
|
|
|
|
}
|
2023-06-01 03:28:35 +08:00
|
|
|
|
let uid = this.getCkUid(game)
|
|
|
|
|
if (!uid) {
|
|
|
|
|
return false
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
2023-06-01 03:28:35 +08:00
|
|
|
|
let uidData = this.getUidData(uid, game)
|
|
|
|
|
return this.mysUsers[uidData.ltuid]
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加UID
|
2023-06-04 05:03:50 +08:00
|
|
|
|
addRegUid (uid, game = 'gs', save = true) {
|
2023-06-01 03:28:35 +08:00
|
|
|
|
game = this.gameKey(game)
|
2023-05-11 06:08:03 +08:00
|
|
|
|
uid = uid + ''
|
2023-06-01 03:28:35 +08:00
|
|
|
|
let gameDs = this.getGameDs(game)
|
2023-06-04 05:03:50 +08:00
|
|
|
|
gameDs.data[uid] = { uid, type: 'reg' }
|
|
|
|
|
this._map = false
|
|
|
|
|
this.setMainUid(uid, game, false)
|
|
|
|
|
if (save) {
|
|
|
|
|
this.save()
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除UID
|
2023-06-01 03:28:35 +08:00
|
|
|
|
delRegUid (uid, game = 'gs') {
|
|
|
|
|
game = this.gameKey(game)
|
|
|
|
|
let gameDs = this.getGameDs(game)
|
|
|
|
|
let dsData = gameDs.data
|
|
|
|
|
delete dsData[uid]
|
|
|
|
|
gameDs.data = dsData
|
|
|
|
|
this._map = false
|
|
|
|
|
if (gameDs.uid === uid) {
|
2023-06-04 05:03:50 +08:00
|
|
|
|
this.setMainUid('', game, false)
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
2023-06-01 03:28:35 +08:00
|
|
|
|
this.save()
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
getGameDs (game = 'gs') {
|
2023-06-04 05:32:19 +08:00
|
|
|
|
game = this.gameKey(game)
|
2023-06-04 05:03:50 +08:00
|
|
|
|
if (!this._games[game]) {
|
|
|
|
|
this._games[game] = {
|
|
|
|
|
uid: '',
|
|
|
|
|
data: {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return this._games[game]
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-04 05:03:50 +08:00
|
|
|
|
|
2023-03-04 14:30:13 +08:00
|
|
|
|
/**
|
2023-05-08 05:11:29 +08:00
|
|
|
|
* 设置当前用户的绑定uid
|
|
|
|
|
* @param uid 要绑定的uid
|
2023-05-09 11:03:38 +08:00
|
|
|
|
* @param game
|
2023-03-04 14:30:13 +08:00
|
|
|
|
*/
|
2023-06-01 03:28:35 +08:00
|
|
|
|
autoRegUid (uid = '', game = 'gs') {
|
|
|
|
|
if (this.getUid(game)) {
|
2023-05-09 11:03:38 +08:00
|
|
|
|
return uid
|
|
|
|
|
}
|
2023-06-01 03:28:35 +08:00
|
|
|
|
this.addRegUid(uid, game)
|
2023-05-09 11:03:38 +08:00
|
|
|
|
return uid
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 切换绑定CK生效的UID
|
2023-06-04 05:03:50 +08:00
|
|
|
|
setMainUid (uid = '', game = 'gs', save = true) {
|
2023-06-01 03:28:35 +08:00
|
|
|
|
this._map = false
|
|
|
|
|
game = this.gameKey(game)
|
|
|
|
|
if (uid < 100 || !uid) {
|
|
|
|
|
let uids = this.getUidList(game)
|
2023-06-04 05:08:33 +08:00
|
|
|
|
uid = (uids?.[uid] || uids?.[0])?.uid || ''
|
|
|
|
|
}
|
|
|
|
|
if (!uid) {
|
|
|
|
|
return false
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
2023-06-01 03:28:35 +08:00
|
|
|
|
if (this.hasUid(uid, game)) {
|
|
|
|
|
let gameDs = this.getGameDs(game)
|
|
|
|
|
gameDs.uid = uid
|
2023-06-04 05:03:50 +08:00
|
|
|
|
}
|
|
|
|
|
if (save) {
|
|
|
|
|
this.save()
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
2023-03-04 14:30:13 +08:00
|
|
|
|
|
2023-05-08 05:11:29 +08:00
|
|
|
|
// 添加MysUser
|
2023-06-01 03:28:35 +08:00
|
|
|
|
async addMysUser (mysUser) {
|
2023-05-08 05:11:29 +08:00
|
|
|
|
this.mysUsers[mysUser.ltuid] = mysUser
|
2023-06-01 03:28:35 +08:00
|
|
|
|
this._map = false
|
|
|
|
|
MysUtil.eachGame((game) => {
|
|
|
|
|
let uid = mysUser.getUid(game)
|
2023-09-29 04:05:44 +08:00
|
|
|
|
if (uid && this.getUid(game) == '') {
|
2023-06-04 05:03:50 +08:00
|
|
|
|
this.setMainUid(uid, game, false)
|
2023-06-01 03:28:35 +08:00
|
|
|
|
}
|
|
|
|
|
})
|
2023-06-04 05:03:50 +08:00
|
|
|
|
this.save()
|
2023-05-08 05:11:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除当前用户绑定CK
|
2023-05-11 06:08:03 +08:00
|
|
|
|
async delCk (ltuid = '') {
|
2023-06-01 03:28:35 +08:00
|
|
|
|
console.warn('delCk即将废弃')
|
2023-05-11 06:08:03 +08:00
|
|
|
|
return await this.delMysUser(ltuid)
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 03:28:35 +08:00
|
|
|
|
async delMysUser (mysUser = '') {
|
|
|
|
|
let ltuid = mysUser.ltuid || mysUser
|
2023-05-11 06:08:03 +08:00
|
|
|
|
if (ltuid && this.mysUsers[ltuid]) {
|
|
|
|
|
let mys = this.mysUsers[ltuid]
|
2023-06-01 03:28:35 +08:00
|
|
|
|
this.mysUsers[ltuid] = false
|
|
|
|
|
this._map = false
|
2023-05-11 06:08:03 +08:00
|
|
|
|
await mys.del()
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
2023-06-01 03:28:35 +08:00
|
|
|
|
this._map = false
|
2023-05-11 06:08:03 +08:00
|
|
|
|
await this.save()
|
2023-03-04 14:30:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-06-01 04:27:21 +08:00
|
|
|
|
async eachMysUser (fn) {
|
|
|
|
|
await Data.forEach(this.mysUsers, async (mys, ltuid) => {
|
|
|
|
|
if (!mys) {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return fn(mys, ltuid)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async eachAllMysUser (fn) {
|
|
|
|
|
return MysUser.forEach(fn)
|
|
|
|
|
}
|
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
}
|