2
0
mirror of https://github.com/ctrlcvs/xiaoyao-cvs-plugin.git synced 2024-12-22 19:10:53 +08:00
xiaoyao-cvs-plugin/model/gsCfg.js

328 lines
6.8 KiB
JavaScript
Raw Normal View History

2022-07-24 11:46:05 +08:00
import YAML from 'yaml'
import chokidar from 'chokidar'
import fs from 'node:fs'
2022-07-29 01:42:35 +08:00
import {
promisify
} from 'node:util'
2022-07-24 11:46:05 +08:00
import lodash from 'lodash'
import {
Data
} from "../components/index.js";
2022-07-29 01:42:35 +08:00
const plugin = "xiaoyao-cvs-plugin"
2022-07-24 11:46:05 +08:00
/** 配置文件 */
class GsCfg {
2022-07-29 01:42:35 +08:00
constructor() {
/** 默认设置 */
this.defSetPath = `./plugins/${plugin}/defSet/`
this.defSet = {}
/** 用户设置 */
this.configPath = `./plugins/${plugin}/config/`
this.config = {}
/** 监听文件 */
this.watcher = {
config: {},
defSet: {}
}
}
2022-08-21 22:40:37 +08:00
async getyunToken(e) {
let file = `${yunpath}/${e.user_id}.yaml`
try {
let ck = fs.readFileSync(file, 'utf-8')
ck = YAML.parse(ck)
e.devId = ck.devId;
e.yuntoken = ck.yuntoken;
return ck
} catch (error) {
return ""
}
}
2022-07-29 01:42:35 +08:00
/**
* @param app 功能
* @param name 配置文件名称
*/
getdefSet(app, name) {
return this.getYaml(app, name, 'defSet')
}
/** 用户配置 */
getConfig(app, name) {
let ignore = ['mys.pubCk', 'gacha.set']
if (ignore.includes(`${app}.${name}`)) {
return this.getYaml(app, name, 'config')
}
return {
...this.getdefSet(app, name),
...this.getYaml(app, name, 'config')
}
}
2022-07-31 12:32:03 +08:00
/** 通用yaml读取*/
getfileYaml(path, name) {
2022-07-29 22:43:28 +08:00
return YAML.parse(
fs.readFileSync(path + name + ".yaml", 'utf8')
2022-07-29 22:43:28 +08:00
)
}
2022-07-29 01:42:35 +08:00
/**
* 获取配置yaml
* @param app 功能
* @param name 名称
* @param type 默认跑配置-defSet用户配置-config
*/
getYaml(app, name, type) {
let file = this.getFilePath(app, name, type)
let key = `${app}.${name}`
if (this[type][key]) return this[type][key]
this[type][key] = YAML.parse(
fs.readFileSync(file, 'utf8')
)
this.watch(file, app, name, type)
return this[type][key]
}
getFilePath(app, name, type) {
if (type == 'defSet') return `${this.defSetPath}${app}/${name}.yaml`
else return `${this.configPath}${app}.${name}.yaml`
}
/** 监听配置文件 */
watch(file, app, name, type = 'defSet') {
let key = `${app}.${name}`
if (this.watcher[type][key]) return
const watcher = chokidar.watch(file)
watcher.on('change', path => {
delete this[type][key]
logger.mark(`[修改配置文件][${type}][${app}][${name}]`)
if (this[`change_${app}${name}`]) {
this[`change_${app}${name}`]()
}
})
this.watcher[type][key] = watcher
}
get element() {
return {
...this.getdefSet('element', 'role'),
...this.getdefSet('element', 'weapon')
}
}
/** 读取用户绑定的ck */
async getBingCk() {
let ck = {}
let ckQQ = {}
let dir = './data/MysCookie/'
let files = fs.readdirSync(dir).filter(file => file.endsWith('.yaml'))
const readFile = promisify(fs.readFile)
let promises = []
files.forEach((v) => promises.push(readFile(`${dir}${v}`, 'utf8')))
const res = await Promise.all(promises)
res.forEach((v) => {
let tmp = YAML.parse(v)
lodash.forEach(tmp, (v, i) => {
ck[String(i)] = v
if (v.isMain && !ckQQ[String(v.qq)]) {
ckQQ[String(v.qq)] = v
}
})
})
return {
ck,
ckQQ
}
}
/** 读取所有用户绑定的stoken */
2022-08-01 23:13:34 +08:00
async getBingStoken() {
let ck = []
let ckQQ = {}
let dir = `plugins/${plugin}/data/yaml/`
let files = fs.readdirSync(dir).filter(file => file.endsWith('.yaml'))
const readFile = promisify(fs.readFile)
let promises = []
2022-07-29 01:42:35 +08:00
2022-08-01 23:13:34 +08:00
files.forEach((v) => promises.push(readFile(`${dir}${v}`, 'utf8')))
const res = await Promise.all(promises)
res.forEach((v, index) => {
2022-08-01 23:13:34 +08:00
let tmp = YAML.parse(v)
ck.push(tmp)
})
return ck
}
2022-07-29 01:42:35 +08:00
getBingCkSingle(userId) {
let file = `./data/MysCookie/${userId}.yaml`
try {
let ck = fs.readFileSync(file, 'utf-8')
ck = YAML.parse(ck)
return ck
} catch (error) {
return {}
}
}
getBingCookie(userId) {
let file = `./data/MysCookie/${userId}.yaml`
try {
let ck = fs.readFileSync(file, 'utf-8')
ck = YAML.parse(ck)
for (let item in ck) {
let login_ticket;
if (!ck[item].isMain) {
continue;
}
login_ticket = ck[item]?.login_ticket
ck = ck[item].ck
return {
ck,
item,
login_ticket
};
2022-07-29 01:42:35 +08:00
}
} catch (error) {
return {}
}
}
saveBingCk(userId, data) {
let file = `./data/MysCookie/${userId}.yaml`
if (lodash.isEmpty(data)) {
fs.existsSync(file) && fs.unlinkSync(file)
} else {
let yaml = YAML.stringify(data)
fs.writeFileSync(file, yaml, 'utf8')
}
}
saveBingStoken(userId, data) {
let file = `./plugins/${plugin}/data/yaml/${userId}.yaml`
if (lodash.isEmpty(data)) {
fs.existsSync(file) && fs.unlinkSync(file)
} else {
fs.exists(file, (exists) => {
if (!exists) {
fs.writeFileSync(file, "", 'utf8')
}
let ck = fs.readFileSync(file, 'utf-8')
let yaml = YAML.stringify(data)
ck = YAML.parse(ck)
if (!ck) {
fs.writeFileSync(file, yaml, 'utf8')
} else {
ck = YAML.stringify(ck)
fs.writeFileSync(file, yaml + ck, 'utf8')
}
})
}
}
2022-07-29 01:42:35 +08:00
/**
* 原神角色id转换角色名字
*/
roleIdToName(id) {
let name = this.getdefSet('role', 'name')
if (name[id]) {
return name[id][0]
}
return ''
}
/** 原神角色别名转id */
roleNameToID(keyword) {
if (!this.nameID) {
this.nameID = new Map()
let nameArr = this.getdefSet('role', 'name')
for (let i in nameArr) {
for (let val of nameArr[i]) {
this.nameID.set(val, i)
}
}
}
if (!isNaN(keyword)) keyword = Number(keyword)
let roelId = this.nameID.get(keyword)
return roelId || false
}
/**
* 原神角色武器长名称缩写
* @param name 名称
* @param isWeapon 是否武器
*/
shortName(name, isWeapon = false) {
let other = {}
if (isWeapon) {
other = this.getdefSet('weapon', 'other')
} else {
other = this.getdefSet('role', 'other')
}
return other.sortName[name] ?? name
}
/** 公共配置ck文件修改hook */
async change_myspubCk() {
let MysInfo = await import('./mys/mysInfo.js').default
await new MysInfo().addPubCk()
}
getGachaSet(groupId = '') {
let config = this.getYaml('gacha', 'set', 'config')
let def = config.default
if (config[groupId]) {
return {
...def,
...config[groupId]
}
}
return def
}
getMsgUid(msg) {
let ret = /[1|2|5][0-9]{8}/g.exec(msg)
if (!ret) return false
return ret[0]
}
/**
* 获取消息内原神角色名称uid
* @param msg 判断消息
* @param filterMsg 过滤消息
* @return roleId 角色id
* @return name 角色名称
* @return alias 当前别名
* @return uid 游戏uid
*/
getRole(msg, filterMsg = '') {
let alias = msg.replace(/#|老婆|老公|[1|2|5][0-9]{8}/g, '').trim()
if (filterMsg) {
alias = alias.replace(new RegExp(filterMsg, 'g'), '').trim()
}
/** 判断是否命中别名 */
let roleId = this.roleNameToID(alias)
if (!roleId) return false
/** 获取uid */
let uid = this.getMsgUid(msg) || ''
return {
roleId,
uid,
alias,
name: this.roleIdToName(roleId)
}
}
2022-07-24 11:46:05 +08:00
}
export default new GsCfg()