docs: 统一注释风格

This commit is contained in:
ningmengchongshui 2024-06-09 11:40:24 +08:00
parent 2962a58d34
commit 01223c6d59
40 changed files with 1241 additions and 154 deletions

View File

@ -17,12 +17,21 @@ import ListenerLoader from './lib/listener/loader.js'
*/
import { Client } from 'icqq'
export class Yunzai extends Client {
// eslint-disable-next-line no-useless-constructor
/**
*
* @param conf
*/
constructor(conf) {
/**
*
*/
super(conf)
}
/** 登录机器人 */
/**
*
* @returns
*/
static async run() {
const bot = new Yunzai(cfg.bot)
/** 加载监听事件 */
@ -40,7 +49,11 @@ export class Yunzai extends Client {
return bot
}
/** 跳过登录ICQQ */
/**
* ICQQ
* @param bot
* @returns
*/
static async skip_login(bot) {
bot.uin = 88888
bot[bot.uin] = bot

View File

@ -1,7 +1,9 @@
import { MessageCallBackType } from './types.js'
import { plugin } from './plugin.js'
// 插件super默认值
/**
* super默认值
*/
export const PluginSuperDefine = {
name: 'group-app',
dsc: 'group-dsc',
@ -9,13 +11,21 @@ export const PluginSuperDefine = {
priority: 9999
}
// 消息
/**
*
*/
export class Messages {
count = 0
rule: {
reg: RegExp
fnc: string
}[] = []
/**
*
* @param reg
* @param fnc
*/
response(reg: RegExp, fnc: MessageCallBackType) {
this.count++
const propName = `prop_${this.count}`
@ -25,8 +35,10 @@ export class Messages {
fnc: propName
})
}
/**
*
*/
get ok() {
// eslint-disable-next-line @typescript-eslint/no-this-alias
const App = this
class Children extends plugin {
constructor() {
@ -49,14 +61,30 @@ export class Messages {
*
*/
export class Events {
/**
*
*/
count = 0
/**
*
*/
data: {
[key: string]: typeof plugin
} = {}
/**
*
* @param val
*/
use(val: typeof plugin) {
this.count++
this.data[this.count] = val
}
/**
*
*/
get ok() {
return this.data
}

View File

@ -1 +0,0 @@
export * from '#miao'

View File

@ -1,4 +1,4 @@
import { Common } from './local.js'
import { Common } from '../local.js'
import { EventType } from './types.js'
const stateArr = {}

View File

@ -22,10 +22,13 @@ export default class Runtime {
_mysInfo = null
handler = null
/**
*
* @param e
*/
constructor(e) {
this.e = e
this._mysInfo = {}
this.handler = {
has: Handler.has,
call: Handler.call,
@ -33,26 +36,44 @@ export default class Runtime {
}
}
/**
*
*/
get uid() {
return this.user?.uid
}
/**
*
*/
get hasCk() {
return this.user?.hasCk
}
/**
*
*/
get user() {
return this.e.user
}
/**
*
*/
get cfg() {
return cfg
}
/**
*
*/
get gsCfg() {
return gsCfg
}
/**
*
*/
get common() {
return common
}
@ -64,14 +85,23 @@ export default class Runtime {
return null
}
/**
*
*/
get MysInfo() {
return MysInfo
}
/**
*
*/
get NoteUser() {
return NoteUser
}
/**
*
*/
get MysUser() {
return MysUser
}

View File

@ -1,18 +1,34 @@
import { type GroupMessage } from 'icqq'
// 机器人事件类型
/**
*
*/
export interface EventType extends GroupMessage {
/**
*
*/
isMaster: boolean
/**
*
*/
group: {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
recallMsg: (...arg) => any
}
/**
*
*/
msg: string
// eslint-disable-next-line @typescript-eslint/no-explicit-any
/**
*
* @param arg
* @returns
*/
reply: (...arg) => Promise<any>
}
// 函数式回调类型
/**
*
*/
export type MessageCallBackType = (
e: EventType
) => Promise<boolean | undefined | void>

View File

@ -1,18 +1,29 @@
import { Sequelize, DataTypes, Model } from 'sequelize'
import { Data } from './local.js'
import { Data } from '../local.js'
import { join } from 'path'
/**
*
*/
Data.createDir('/data/db', 'root')
let dbPath = process.cwd() + '/data/db/data.db'
// TODO DB自定义
/**
* DB自定义
*/
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: dbPath,
storage: join(process.cwd(), '/data/db/data.db'),
logging: false
})
/**
*
*/
await sequelize.authenticate()
/**
*
*/
export default class BaseModel extends Model {
static Types = DataTypes
@ -23,4 +34,8 @@ export default class BaseModel extends Model {
model.COLUMNS = columns
}
}
/**
*
*/
export { sequelize }

View File

@ -2,6 +2,9 @@ import BaseModel from './BaseModel.js'
const { Types } = BaseModel
/**
*
*/
const COLUMNS = {
// 用户IDqq为数字
ltuid: {
@ -37,6 +40,9 @@ const COLUMNS = {
}
}
/**
*
*/
class MysUserDB extends BaseModel {
static async find(ltuid = '', create = false) {
// DB查询
@ -62,7 +68,17 @@ class MysUserDB extends BaseModel {
}
}
/**
*
*/
BaseModel.initDB(MysUserDB, COLUMNS)
/**
*
*/
await MysUserDB.sync()
/**
*
*/
export default MysUserDB

View File

@ -2,8 +2,14 @@ import BaseModel from './BaseModel.js'
import lodash from 'lodash'
import MysUtil from '../mys/MysUtil.js'
/**
*
*/
const { Types } = BaseModel
/**
*
*/
const COLUMNS = {
// 用户IDqq为数字
id: {
@ -51,7 +57,16 @@ const COLUMNS = {
data: Types.STRING
}
/**
*
*/
class UserDB extends BaseModel {
/**
*
* @param id
* @param type
* @returns
*/
static async find(id, type = 'qq') {
// user_id
id = type === 'qq' ? '' + id : type + id
@ -66,6 +81,10 @@ class UserDB extends BaseModel {
return user
}
/**
*
* @param user
*/
async saveDB(user) {
let db = this
let ltuids = []
@ -93,7 +112,17 @@ class UserDB extends BaseModel {
}
}
/**
*
*/
BaseModel.initDB(UserDB, COLUMNS)
/**
*
*/
await UserDB.sync()
/**
*
*/
export default UserDB

View File

@ -1,8 +1,14 @@
import BaseModel from './BaseModel.js'
import lodash from 'lodash'
/**
*
*/
const { Types } = BaseModel
/**
*
*/
const COLUMNS = {
// 用户IDqq为数字
userId: {
@ -33,9 +39,22 @@ const COLUMNS = {
}
}
/**
*
*/
class UserGameDB extends BaseModel {}
/**
*
*/
BaseModel.initDB(UserGameDB, COLUMNS)
/**
*
*/
await UserGameDB.sync()
/**
*
*/
export default UserGameDB

View File

@ -1 +0,0 @@
export * from '#miao'

View File

@ -50,6 +50,11 @@ async function downFile (fileUrl, savePath, param = {}) {
}
}
/**
*
* @param dirname
* @returns
*/
function mkdirs (dirname) {
if (fs.existsSync(dirname)) {
return true
@ -129,4 +134,7 @@ async function makeForwardMsg (e, msg = [], dec = '', msgsscr = false) {
return forwardMsg
}
/**
*
*/
export default { sleep, relpyPrivate, downFile, makeForwardMsg }

View File

@ -1,9 +1,11 @@
import fs from 'fs'
import { createRequire } from 'module'
const require = createRequire(import.meta.url)
const { exec } = require('child_process')
import { exec } from 'child_process'
export async function checkRun () {
/**
*
* @returns
*/
export async function checkRun() {
if (process.argv[1].includes('pm2')) return
if (process.argv[1].includes('test')) return
@ -17,7 +19,12 @@ export async function checkRun () {
}
}
async function execSync (cmd) {
/**
*
* @param cmd
* @returns
*/
async function execSync(cmd) {
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {
resolve({ error, stdout, stderr })
@ -25,7 +32,11 @@ async function execSync (cmd) {
})
}
function pm2Cfg () {
/**
*
* @returns
*/
function pm2Cfg() {
let cfg = fs.readFileSync('./config/pm2/pm2.json')
cfg = JSON.parse(cfg)
return cfg

View File

@ -2,18 +2,25 @@ import YAML from 'yaml'
import fs from 'node:fs'
import chokidar from 'chokidar'
/** 配置文件 */
/**
* ********
*
* ********
*/
class Cfg {
config = {}
/** 监听文件 */
watcher = { config: {}, defSet: {} }
constructor () {
this.config = {}
/** 监听文件 */
this.watcher = { config: {}, defSet: {} }
this.initCfg()
}
/** 初始化配置 */
/**
*
*/
initCfg () {
let path = 'config/config/'
let pathDef = 'config/default_config/'
@ -27,17 +34,23 @@ class Cfg {
if (!fs.existsSync("resources")) fs.mkdirSync("resources")
}
/** 机器人qq号 */
/**
* qq号
*/
get qq () {
return Number(this.getConfig('qq').qq)
}
/** 密码 */
/**
*
*/
get pwd () {
return this.getConfig('qq').pwd
}
/** icqq配置 */
/**
* icqq配置
*/
get bot () {
let bot = this.getConfig('bot')
let defbot = this.getdefSet('bot')
@ -52,23 +65,37 @@ class Cfg {
return bot
}
/**
*
*/
get other () {
return this.getConfig('other')
}
/**
*
*/
get redis () {
return this.getConfig('redis')
}
/**
*
*/
get renderer() {
return this.getConfig('renderer');
}
/**
*
*/
get notice() {
return this.getConfig('notice');
}
/** 主人qq */
/**
* qq
*/
get masterQQ () {
let masterQQ = this.getConfig('other').masterQQ || []
@ -80,7 +107,9 @@ class Cfg {
return masterQQ
}
/** package.json */
/**
* package.json
*/
get package () {
if (this._package) return this._package
@ -88,7 +117,11 @@ class Cfg {
return this._package
}
/** 群配置 */
/**
*
* @param groupId
* @returns
*/
getGroup (groupId = '') {
let config = this.getConfig('group')
let defCfg = this.getdefSet('group')
@ -98,14 +131,20 @@ class Cfg {
return { ...defCfg.default, ...config.default }
}
/** other配置 */
/**
* other配置
* @returns
*/
getOther () {
let def = this.getdefSet('other')
let config = this.getConfig('other')
return { ...def, ...config }
}
/** notice配置 */
/**
* notice配置
* @returns
*/
getNotice () {
let def = this.getdefSet('notice')
let config = this.getConfig('notice')
@ -113,14 +152,19 @@ class Cfg {
}
/**
* @param app
*
* @param name
* @returns
*/
getdefSet (name) {
return this.getYaml('default_config', name)
}
/** 用户配置 */
/**
*
* @param name
* @returns
*/
getConfig (name) {
return this.getYaml('config', name)
}
@ -144,7 +188,13 @@ class Cfg {
return this.config[key]
}
/** 监听配置文件 */
/**
*
* @param file
* @param name
* @param type
* @returns
*/
watch (file, name, type = 'default_config') {
let key = `${type}.${name}`
@ -163,16 +213,30 @@ class Cfg {
this.watcher[key] = watcher
}
/**
*
* @returns
*/
change_qq () {
if (process.argv.includes('login') || !this.qq) return
logger.info('修改机器人QQ或密码请手动重启')
}
/**
*
*/
async change_bot () {
/** 修改日志等级 */
let log = await import('./log.js')
log.default()
}
}
/**
* **********
*
* ***
*/
export default new Cfg()

View File

@ -8,6 +8,9 @@ import yaml from "yaml"
/** 设置标题 */
process.title = "Miao-Yunzai"
/**
*
*/
async function UpdateTitle() {
// 添加一些多余的标题内容
let title = "Miao-Yunzai"
@ -70,7 +73,9 @@ process.on("exit", async code => {
await checkInit()
/** 初始化事件 */
/**
*
*/
async function checkInit() {
/** 检查node_modules */
if (!fs.existsSync("./node_modules") || !fs.existsSync("./node_modules/icqq")) {

View File

@ -87,6 +87,9 @@ export default function setLog () {
logColor()
}
/**
*
*/
function logColor () {
logger.chalk = chalk
logger.red = chalk.red

View File

@ -11,10 +11,24 @@ import chalk from 'chalk'
export default async function createQQ () {
/** 跳过登录ICQQ */
if(cfg.bot.skip_login) return
/**
*
*/
if (cfg.qq && !process.argv.includes('login')) {
return
}
/**
*
*/
console.log(`欢迎使用${chalk.green('Miao-Yunzai v' + cfg.package.version)}\n请按提示输入完成QQ配置`)
/**
*
*/
let propmtList = [
{
type: 'Input',
@ -56,6 +70,9 @@ export default async function createQQ () {
// }
]
/**
*
*/
if (!process.argv.includes('login')) {
propmtList.push({
type: 'Input',
@ -63,13 +80,24 @@ export default async function createQQ () {
name: 'masterQQ'
})
}
/**
*
*/
propmtList.push({
type: 'input',
message: '请输入签名API地址可留空',
name: 'signAPI'
})
/**
*
*/
const ret = await inquirer.prompt(propmtList)
/**
*
*/
let file = './config/config/'
let fileDef = './config/default_config/'
@ -83,12 +111,18 @@ export default async function createQQ () {
let bot = fs.readFileSync(`${fileDef}bot.yaml`, 'utf8')
// bot = bot.replace(/proxyAddress:/g, `proxyAddress: ${ret.proxyAddress}`)
/**
*
*/
if (ret.masterQQ) {
let other = fs.readFileSync(`${fileDef}other.yaml`, 'utf8')
other = other.replace(/masterQQ:/g, `masterQQ:\n - ${ret.masterQQ}`)
fs.writeFileSync(`${file}other.yaml`, other, 'utf8')
}
/**
*
*/
if (ret.signAPI) {
bot = bot.replace(/sign_api_addr:/g, `sign_api_addr: ${ret.signAPI}`)
}
@ -97,5 +131,8 @@ export default async function createQQ () {
console.log(`\nQQ配置完成正在登录\n后续修改账号可以运行命令 ${chalk.green('node app login')}\n`)
/**
*
*/
await common.sleep(2000)
}

View File

@ -3,8 +3,10 @@ import common from "../common/common.js"
import { createClient } from "redis"
import { exec } from "node:child_process"
/**
* redis客户端
* @returns
*/
export default async function redisInit() {
const rc = cfg.redis
@ -49,6 +51,10 @@ export default async function redisInit() {
return client
}
/**
*
* @returns
*/
async function aarch64() {
if (process.platform == "win32")
return ""
@ -67,6 +73,11 @@ async function aarch64() {
return ""
}
/**
*
* @param cmd
* @returns
*/
function execSync (cmd) {
return new Promise((resolve, reject) => {
exec(cmd, (error, stdout, stderr) => {

View File

@ -8,8 +8,20 @@ import fetch from 'node-fetch'
* 线
*/
let inSlider = false
/**
*
*/
export default class loginEvent extends EventListener {
/**
*
*/
constructor () {
/**
*
*/
super({
prefix: 'system.login.',
event: ['qrcode', 'slider', 'device', 'error'],
@ -17,10 +29,16 @@ export default class loginEvent extends EventListener {
})
}
async execute (event) {
}
/**
*
* @param event
*/
async execute (event) {}
/** 扫码登录现在仅能在同一ip下进行 */
/**
* ip下进行
* @param event
*/
async qrcode (event) {
logger.mark(`请使用登录当前QQ的手机${logger.green('扫码')}完成登录,如果显示二维码过期,可以按${logger.green('回车键Enter')}刷新,重新输入密码请执行命令:${logger.green('node app login')}`)
// logger.info('等待扫码中...')
@ -57,8 +75,10 @@ export default class loginEvent extends EventListener {
})
}
/**
* 使PC浏览器已经无效
* @param event
*/
async slider (event) {
inSlider = true
@ -109,6 +129,11 @@ export default class loginEvent extends EventListener {
this.client.submitSlider(ticket.trim())
}
/**
*
* @param url
* @returns
*/
async getTicket (url) {
let req = `https://hlhs-nb.cn/captcha/slider?key=${Bot.uin}`
await fetch(req, {
@ -130,6 +155,11 @@ export default class loginEvent extends EventListener {
}
}
/**
*
* @param url
* @returns
*/
async requestCode (url) {
let txhelper = {
url: url.replace('ssl.captcha.qq.com', 'txhelper.glitch.me')
@ -167,7 +197,11 @@ export default class loginEvent extends EventListener {
return lodash.trim(txhelper.res)
}
/** 设备锁 */
/**
*
* @param event
*/
async device (event) {
global.inputTicket = false
console.log(`\n\n------------------${logger.green('↓↓设备锁验证↓↓')}----------------------\n`)
@ -197,7 +231,10 @@ export default class loginEvent extends EventListener {
}
}
/** 登录错误 */
/**
*
* @param event
*/
error (event) {
if (Number(event.code) === 1) logger.error('QQ密码错误运行命令重新登录node app login')
if (global.inputTicket && event.code == 237) {
@ -207,7 +244,6 @@ export default class loginEvent extends EventListener {
} else {
logger.error('登录错误,已停止运行')
}
process.exit()
}
}

View File

@ -1,13 +1,27 @@
import EventListener from '../listener/listener.js'
/**
*
*/
export default class messageEvent extends EventListener {
/**
*
*/
constructor () {
/**
*
*/
super({ event: 'message' })
}
/**
*
* @param e
*/
async execute (e) {
this.plugins.deal(e)
}

View File

@ -4,10 +4,22 @@ import EventListener from '../listener/listener.js'
*
*/
export default class noticeEvent extends EventListener {
/**
*
*/
constructor () {
/**
*
*/
super({ event: 'notice' })
}
/**
*
* @param e
*/
async execute (e) {
this.plugins.deal(e)
}

View File

@ -6,11 +6,22 @@ import cfg from '../config/config.js'
* 线
*/
export default class offlineEvent extends EventListener {
/**
*
*/
constructor () {
/**
*
*/
super({ event: 'system.offline' })
}
/** 默认方法 */
/**
*
* @param e
*/
async execute (e) {
logger.mark('掉线了')
let config = cfg.getConfig('notice')

View File

@ -6,14 +6,25 @@ import common from '../common/common.js'
* 线
*/
export default class onlineEvent extends EventListener {
/**
*
*/
constructor () {
/**
*
*/
super({
event: 'system.online',
once: true
})
}
/** 默认方法 */
/**
*
* @param e
*/
async execute (e) {
logger.mark('----^_^----')
logger.mark(logger.green(`Miao-Yunzai 上线成功 版本v${cfg.package.version}`))
@ -26,6 +37,10 @@ export default class onlineEvent extends EventListener {
this.loginMsg()
}
/**
*
* @returns
*/
async loginMsg () {
if (!cfg.bot.online_msg) return
if (!cfg.masterQQ || !cfg.masterQQ[0]) return

View File

@ -4,10 +4,22 @@ import EventListener from '../listener/listener.js'
*
*/
export default class requestEvent extends EventListener {
/**
*
*/
constructor () {
/**
*
*/
super({ event: 'request' })
}
/**
*
* @param e
*/
async execute (e) {
this.plugins.deal(e)
}

View File

@ -1,5 +1,8 @@
import PluginsLoader from '../plugins/loader.js'
/**
*
*/
export default class EventListener {
prefix = ''
event = null

View File

@ -41,4 +41,7 @@ class ListenerLoader {
}
}
/**
*
*/
export default new ListenerLoader()

View File

@ -1,8 +1,20 @@
import util from 'node:util'
import lodash from 'lodash'
let events = {}
let Handler = {
/**
*
*/
const events = {}
/**
*
*/
const Handler = {
/**
*
* @param cfg
* @returns
*/
add (cfg) {
let { ns, fn, self, property = 50 } = cfg
let key = cfg.key || cfg.event
@ -21,6 +33,12 @@ let Handler = {
})
events[key] = lodash.orderBy(events[key], ['priority'], ['asc'])
},
/**
*
* @param ns
* @param key
* @returns
*/
del (ns, key = '') {
if (!key) {
for (let key in events) {
@ -39,10 +57,24 @@ let Handler = {
}
}
},
/**
*
* @param key
* @param e
* @param args
*/
async callAll (key, e, args) {
// 暂时屏蔽调用
// return Handler.call(key, e, args, true)
},
/**
*
* @param key
* @param e
* @param args
* @param allHandler
* @returns
*/
async call (key, e, args, allHandler = false) {
let ret
for (let obj of events[key]) {
@ -65,9 +97,18 @@ let Handler = {
}
return ret
},
/**
*
* @param key
* @returns
*/
has (key) {
return !!events[key]
}
}
/**
*
*/
export default Handler

View File

@ -19,11 +19,15 @@ class PluginsLoader {
task = []
dir = 'plugins'
/** 命令冷却cd */
/**
* cd
*/
groupGlobalCD = {}
singleCD = {}
/** 插件监听 */
/**
*
*/
watcher = {}
eventMap = {
@ -34,10 +38,16 @@ class PluginsLoader {
msgThrottle = {}
/** 星铁命令前缀 */
/**
*
*/
srReg = /^#?(\*|星铁|星轨|穹轨|星穹|崩铁|星穹铁道|崩坏星穹铁道|铁道)+/
/**
*
* @returns
*/
async getPlugins() {
const files = await fs.readdir(this.dir, { withFileTypes: true })
const ret = []
@ -102,6 +112,11 @@ class PluginsLoader {
this.priority = lodash.orderBy(this.priority, ['priority'], ['asc'])
}
/**
*
* @param file
* @param packageErr
*/
async importPlugin(file, packageErr) {
try {
let app = await import(file.path)
@ -125,6 +140,12 @@ class PluginsLoader {
}
}
/**
*
* @param file
* @param p
* @returns
*/
async loadPlugin(file, p) {
if (!p?.prototype) return
this.pluginCount++
@ -153,6 +174,11 @@ class PluginsLoader {
}
}
/**
*
* @param packageErr
* @returns
*/
packageTips(packageErr) {
if (!packageErr || packageErr.length <= 0) return
logger.mark('--------插件载入错误--------')
@ -276,7 +302,12 @@ class PluginsLoader {
}
}
/** 过滤事件 */
/**
*
* @param e
* @param v
* @returns
*/
filtEvent(e, v) {
if (!v.event) return false
const event = v.event.split(".")
@ -291,7 +322,13 @@ class PluginsLoader {
return v.event == newEvent.join(".")
}
/** 判断权限 */
/**
*
* @param e
* @param v
* @returns
*/
filtPermission(e, v) {
if (v.permission == 'all' || !v.permission) return true
@ -338,12 +375,10 @@ class PluginsLoader {
* @param e.isMaster
* @param e.logText
* @param e.logFnc
*
* @param e.isGuild
* @param e.at tiny_id
* @param e.atBot
*/
dealMsg(e) {
if (e.message) {
@ -446,7 +481,10 @@ class PluginsLoader {
}
}
/** 处理回复,捕获发送失败异常 */
/**
* ,
* @param e
*/
reply(e) {
if (e.reply) {
e.replyNew = e.reply
@ -532,6 +570,11 @@ class PluginsLoader {
}
}
/**
*
* @param e
* @param msg
*/
count(e, msg) {
let screenshot = false
if (msg && msg?.file && Buffer.isBuffer(msg?.file)) {
@ -547,6 +590,11 @@ class PluginsLoader {
}
}
/**
*
* @param type
* @param groupId
*/
saveCount(type, groupId = '') {
let key = 'Yz:count:'
@ -565,20 +613,28 @@ class PluginsLoader {
redis.expire(monthKey, 3600 * 24 * 30)
}
/**
*
*/
delCount() {
let key = 'Yz:count:'
redis.set(`${key}sendMsg:total`, '0')
redis.set(`${key}screenshot:total`, '0')
}
/** 收集定时任务 */
/**
*
* @param task
*/
collectTask(task) {
for (const i of Array.isArray(task) ? task : [task])
if (i.cron && i.name)
this.task.push(i)
}
/** 创建定时任务 */
/**
*
*/
createTask() {
for (const i of this.task)
i.job = schedule.scheduleJob(i.cron, async () => {
@ -595,7 +651,11 @@ class PluginsLoader {
})
}
/** 检查命令冷却cd */
/**
* cd
* @param e
* @returns
*/
checkLimit(e) {
/** 禁言中 */
if (e.isGroup && e?.group?.mute_left > 0) return false
@ -624,7 +684,11 @@ class PluginsLoader {
return true
}
/** 设置冷却cd */
/**
* cd
* @param e
* @returns
*/
setLimit(e) {
if (!e.message || e.isPrivate) return
let config = cfg.getGroup(e.group_id)
@ -644,7 +708,11 @@ class PluginsLoader {
}
}
/** 是否只关注主动at */
/**
* at
* @param e
* @returns
*/
onlyReplyAt(e) {
if (!e.message || e.isPrivate) return true
@ -665,12 +733,20 @@ class PluginsLoader {
return false
}
/** 判断频道消息 */
/**
*
* @param e
* @returns
*/
checkGuildMsg(e) {
return cfg.getOther().disableGuildMsg && e.detail_type == 'guild'
}
/** 判断黑白名单 */
/**
*
* @param e
* @returns
*/
checkBlack(e) {
const other = cfg.getOther()
@ -698,7 +774,11 @@ class PluginsLoader {
return true
}
/** 判断是否启用功能 */
/**
*
* @param p
* @returns
*/
checkDisable(p) {
const groupCfg = cfg.getGroup(p.e.group_id)
if (groupCfg.disable?.length && groupCfg.disable.includes(p.name))
@ -708,6 +788,10 @@ class PluginsLoader {
return true
}
/**
*
* @param key
*/
async changePlugin(key) {
try {
let app = await import(`../../${this.dir}/${key}?${moment().format('x')}`)
@ -727,7 +811,12 @@ class PluginsLoader {
}
}
/** 监听热更新 */
/**
*
* @param dirName
* @param appName
* @returns
*/
watch(dirName, appName) {
this.watchDir(dirName)
if (this.watcher[`${dirName}.${appName}`]) return
@ -757,7 +846,12 @@ class PluginsLoader {
this.watcher[`${dirName}.${appName}`] = watcher
}
/** 监听文件夹更新 */
/**
*
* @param dirName
* @returns
*/
watchDir(dirName) {
if (this.watcher[dirName]) return
const watcher = chokidar.watch(`./${this.dir}/${dirName}/`)
@ -780,6 +874,11 @@ class PluginsLoader {
}, 10000)
this.watcher[dirName] = watcher
}
}
/**
*
*/
export default new PluginsLoader()

View File

@ -11,7 +11,13 @@ export default class BaseModel {
return this
}
// 获取缓存
/**
*
* @param model
* @param id
* @param time
* @returns
*/
_getThis(model, id = '', time = 10 * 60) {
const uuid = `${model}:${id}`
this._uuid = uuid
@ -20,7 +26,13 @@ export default class BaseModel {
}
}
// 设置缓存
/**
*
* @param model
* @param id
* @param time
* @returns
*/
_cacheThis(model, id, time = 10 * 60) {
const uuid = this._uuid || `${model}:${id}`
this._uuid = uuid
@ -32,7 +44,11 @@ export default class BaseModel {
return this
}
// 设置超时时间
/**
*
* @param time
* @returns
*/
_expire(time = 10 * 60) {
let id = this._uuid
reFn[id] && clearTimeout(reFn[id])
@ -48,6 +64,9 @@ export default class BaseModel {
}
}
/**
*
*/
_delCache() {
let id = this._uuid
reFn[id] && clearTimeout(reFn[id])
@ -55,14 +74,29 @@ export default class BaseModel {
delete cacheMap[id]
}
/**
*
* @param game
* @returns
*/
gameKey(game = 'gs') {
return MysUtil.getGameKey(game)
}
/**
*
* @param game
* @returns
*/
isGs(game = 'gs') {
return this.gameKey(game) === 'gs'
}
/**
*
* @param game
* @returns
*/
isSr(game = 'gs') {
return this.gameKey(game) === 'sr'
}

View File

@ -7,7 +7,19 @@ const servs = ['mys', 'hoyolab']
const EX = 3600 * 24
const redisKeyRoot = 'Yz:cache:'
/**
* ************
* tudo
* ***********
*
*/
export default class DailyCache extends BaseModel {
/**
*
* @param uid
* @param game
* @returns
*/
constructor(uid, game = 'config') {
super()
const storeKey = DailyCache.getStoreKey(uid, game)
@ -33,7 +45,12 @@ export default class DailyCache extends BaseModel {
return new DailyCache(uid, game)
}
// 内部方法获取redis表前缀
/**
* redis表前缀
* @param uid
* @param game
* @returns
*/
static getStoreKey(uid, game = 'config') {
let key
if (!uid || game === 'config') {
@ -78,7 +95,12 @@ export default class DailyCache extends BaseModel {
}
}
// 内部方法用于decode value
/**
* decode value
* @param value
* @param decode
* @returns
*/
static decodeValue(value, decode = false) {
if (value && decode) {
try {
@ -90,7 +112,11 @@ export default class DailyCache extends BaseModel {
return value
}
// 内部方法用于encode value
/**
* encode value
* @param value
* @returns
*/
static encodeValue(value) {
if (typeof value === 'object') {
return JSON.stringify(value) || ''
@ -102,7 +128,13 @@ export default class DailyCache extends BaseModel {
}
/** ---- 基础方法 ---- **/
// 内部方法获取redis表key键值
/**
* redis表key键值
* @param key
* @param sub
* @returns
*/
getTableKey(key, sub = '') {
if (sub) {
return `${this.keyPre}:${key}-${sub}`

View File

@ -15,7 +15,7 @@ import fetch from 'node-fetch'
import { MysUserDB, UserDB } from '../db/index.js'
import { Data } from './local.js'
import { Data } from '../local.js'
const tables = {
// ltuid-uid 查询表
@ -40,7 +40,17 @@ const tables = {
del: 'del-detail'
}
/**
* **********
* tudo
* ***********
*/
export default class MysUser extends BaseModel {
/**
*
* @param ltuid
* @returns
*/
constructor(ltuid) {
super()
if (!ltuid) {
@ -55,13 +65,19 @@ export default class MysUser extends BaseModel {
return self._cacheThis()
}
// 可传入ltuid、cookie、ck对象来创建MysUser实例
/**
* ltuidcookieck对象来创建MysUser实例
*/
get uid() {
return this.uids?.gs?.[0] || ''
}
// 在仅传入ltuid时必须是之前传入过的才能被识别
/**
* ltuid时
* @param ltuid
* @param db
* @returns
*/
static async create(ltuid, db = false) {
ltuid = MysUtil.getLtuid(ltuid)
if (!ltuid) {
@ -72,6 +88,10 @@ export default class MysUser extends BaseModel {
return mys
}
/**
*
* @param fn
*/
static async forEach(fn) {
let dbs = await MysUserDB.findAll()
await Data.forEach(dbs, async db => {
@ -80,7 +100,13 @@ export default class MysUser extends BaseModel {
})
}
// 根据uid获取查询MysUser
/**
* uid获取查询MysUser
* @param uid
* @param game
* @param onlySelfCk
* @returns
*/
static async getByQueryUid(uid, game = 'gs', onlySelfCk = false) {
let servCache = DailyCache.create(uid, game)
// 查找已经查询过的ltuid || 分配最少查询的ltuid
@ -127,6 +153,10 @@ export default class MysUser extends BaseModel {
return false
}
/**
*
* @param fn
*/
static async eachServ(fn) {
await MysUtil.eachServ(async serv => {
await MysUtil.eachGame(async game => {
@ -136,7 +166,9 @@ export default class MysUser extends BaseModel {
})
}
// 清除当日缓存
/**
*
*/
static async clearCache() {
await MysUser.eachServ(async function (servCache) {
await servCache.empty(tables.detail)
@ -147,7 +179,10 @@ export default class MysUser extends BaseModel {
await cache.empty(tables.qq)
}
// 获取用户统计数据
/**
*
* @returns
*/
static async getStatData() {
let totalCount = {}
let ret = { servs: {} }
@ -261,7 +296,11 @@ export default class MysUser extends BaseModel {
}
}
// 不建议使用,为了兼容老数据格式,后续废弃
/**
* 使
* @param game
* @returns
*/
getCkInfo(game = 'gs') {
return {
ck: this.ck,
@ -271,6 +310,12 @@ export default class MysUser extends BaseModel {
}
}
/**
*
* @param uid
* @param game
* @returns
*/
getUidData(uid, game = 'gs') {
game = this.gameKey(game)
if (!this.hasUid(uid, game)) {
@ -284,20 +329,40 @@ export default class MysUser extends BaseModel {
}
}
/**
*
* @param uid
* @param game
* @returns
*/
hasUid(uid, game = 'gs') {
game = this.gameKey(game)
return this.uids[game].includes(uid + '')
}
/**
*
* @param game
* @returns
*/
getUid(game = 'gs') {
return this.getUids(game)[0]
}
/**
*
* @param game
* @returns
*/
getUids(game = 'gs') {
let gameKey = this.gameKey(game)
return this.uids[gameKey] || []
}
/**
*
* @returns
*/
getUidInfo() {
let ret = []
MysUtil.eachGame((game, gameDs) => {
@ -360,6 +425,11 @@ export default class MysUser extends BaseModel {
return { status: 0, msg: '' }
}
/**
*
* @param serv
* @returns
*/
async getGameRole(serv = 'mys') {
let ck = this.ck
let url = {
@ -375,7 +445,11 @@ export default class MysUser extends BaseModel {
return res
}
// 获取米游社通行证id
/**
* id
* @param serv
* @returns
*/
async getUserFullInfo(serv = 'mys') {
let ck = this.ck
let url = {
@ -398,6 +472,11 @@ export default class MysUser extends BaseModel {
return res
}
/**
*
* @param game
* @returns
*/
getCache(game = 'gs') {
if (!this.cache) {
this.cache = {}
@ -422,7 +501,10 @@ export default class MysUser extends BaseModel {
this.setCkData(db)
}
// 设置ck数据
/**
* ck数据
* @param data
*/
setCkData(data = {}) {
this.ck = data.ck || this.ck || ''
this.type = data.type || this.type || 'mys'
@ -434,11 +516,19 @@ export default class MysUser extends BaseModel {
})
}
/**
*
*/
async save() {
await this.db.saveDB(this)
}
// 为当前MysUser绑定uid
/**
* MysUser绑定uid
* @param uid
* @param game
* @returns
*/
addUid(uid, game = 'gs') {
if (lodash.isArray(uid)) {
for (let u of uid) {
@ -457,12 +547,20 @@ export default class MysUser extends BaseModel {
return true
}
/**
*
* @param game
* @returns
*/
hasGame(game = 'gs') {
game = this.gameKey(game)
return this.uids[game]?.length > 0
}
// 初始化当前MysUser缓存记录
/**
* MysUser缓存记录
* @returns
*/
async initCache() {
if (!this.ltuid || !this.ck) {
return
@ -486,13 +584,16 @@ export default class MysUser extends BaseModel {
return true
}
/**
*
* @param game
*/
async disable(game = 'gs') {
let cache = this.getCache(game)
await cache.zDel(tables.detail, this.ltuid)
logger.mark(`[标记无效ck][game:${game}, ltuid:${this.ltuid}`)
}
//
/**
* , User解绑CK时调用
* @returns {Promise<boolean>}
@ -513,7 +614,10 @@ export default class MysUser extends BaseModel {
logger.mark(`[删除失效ck][ltuid:${this.ltuid}]`)
}
// 删除MysUser用户记录会反向删除User中的记录及绑定关系
/**
* MysUser用户记录User中的记录及绑定关系
* @param game
*/
async delWithUser(game = 'gs') {
// 查找用户
let cache = this.getCache(game)
@ -530,7 +634,12 @@ export default class MysUser extends BaseModel {
await this.del()
}
// 为当前用户添加uid查询记录
/**
* uid查询记录
* @param uid
* @param game
* @returns
*/
async addQueryUid(uid, game = 'gs') {
if (lodash.isArray(uid)) {
for (let u of uid) {
@ -544,19 +653,33 @@ export default class MysUser extends BaseModel {
}
}
// 获取当前用户已查询uid列表
/**
* uid列表
* @param game
* @returns
*/
async getQueryUids(game = 'gs') {
let cache = this.getCache(game)
return await cache.zList(tables.detail, this.ltuid)
}
// 根据uid获取查询ltuid
/**
* uid获取查询ltuid
* @param uid
* @param game
* @returns
*/
async getQueryLtuid(uid, game = 'gs') {
let cache = this.getCache(game)
return await cache.zKey(tables.detail, uid)
}
// 检查指定uid是否为当前MysUser所有
/**
* uid是否为当前MysUser所有
* @param uid
* @param game
* @returns
*/
ownUid(uid, game = 'gs') {
if (!uid) {
return false

View File

@ -1,12 +1,22 @@
import { Data } from './local.js'
import { Data } from '../local.js'
/**
*
*/
const games = [
{ key: 'gs', name: '原神' },
{ key: 'sr', name: '星穹铁道' }
]
/**
*
*/
const MysUtil = {
// 获取标准ltuid
/**
* ltuid
* @param data
* @returns
*/
getLtuid(data) {
if (!data) {
return false
@ -21,7 +31,11 @@ const MysUtil = {
return false
},
// 获取标准gameKey
/**
* gameKey
* @param game
* @returns
*/
getGameKey(game) {
// 兼容e的处理
if (game.user_id) {
@ -30,7 +44,10 @@ const MysUtil = {
return ['sr', 'star'].includes(game) ? 'sr' : 'gs'
},
// 生成设备guid
/**
* guid
* @returns
*/
getDeviceGuid() {
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
@ -52,16 +69,26 @@ const MysUtil = {
)
},
// 循环game
/**
* game
* @param fn
*/
async eachGame(fn) {
await Data.forEach(games, ds => {
return fn(ds.key, ds)
})
},
// 循环server
/**
* server
* @param fn
*/
async eachServ(fn) {
await Data.forEach(['mys', 'hoyolab'], fn)
}
}
/**
*
*/
export default MysUtil

View File

@ -1,3 +1,9 @@
import BaseModel from './BaseModel.js'
import lodash from 'lodash'
import MysUser from './MysUser.js'
import MysUtil from './MysUtil.js'
import { UserDB } from '../db/index.js'
import { Data } from '../local.js'
/**
* Bot实际User用户类
* QQ
@ -5,17 +11,12 @@
* User可以注册UID getRegUid / setRegUid
* User可以绑定多个MysUser CKMysUser
*/
import BaseModel from './BaseModel.js'
import lodash from 'lodash'
import MysUser from './MysUser.js'
import MysUtil from './MysUtil.js'
import { UserDB } from '../db/index.js'
//
import { Data } from './local.js'
export default class NoteUser extends BaseModel {
/**
*
* @param qq
* @returns
*/
constructor(qq) {
super()
// 检查实例缓存
@ -109,6 +110,10 @@ export default class NoteUser extends BaseModel {
return user
}
/**
*
* @param fn
*/
static async forEach(fn) {
let dbs = await UserDB.findAll()
await Data.forEach(dbs, async db => {
@ -117,7 +122,11 @@ export default class NoteUser extends BaseModel {
})
}
// 初始化数据
/**
*
* @param db
* @returns
*/
async initDB(db = false) {
if (this.db && !db) {
return
@ -132,7 +141,9 @@ export default class NoteUser extends BaseModel {
await this.save()
}
// 初始化MysUser对象
/**
* MysUser对象
*/
async initMysUser() {
let ltuids = this.db?.ltuids || ''
this.mysUsers = {}
@ -144,10 +155,19 @@ export default class NoteUser extends BaseModel {
}
}
/**
*
*/
async save() {
await this.db.saveDB(this)
}
/**
*
* @param game
* @param type
* @returns
*/
getUidMapList(game = 'gs', type = 'all') {
if (this._map?.[game]?.[type]) {
return this._map[game][type]
@ -186,6 +206,12 @@ export default class NoteUser extends BaseModel {
return this._map[game][type]
}
/**
*
* @param uid
* @param game
* @returns
*/
getUidData(uid = '', game = 'gs') {
if (!uid) {
uid = this.getUid(game)
@ -193,7 +219,12 @@ export default class NoteUser extends BaseModel {
return this.getUidMapList(game, 'all').map[uid]
}
/** 有Uid */
/**
* Uid
* @param uid
* @param game
* @returns
*/
hasUid(uid = '', game = '') {
if (!uid) {
return this.getUidMapList(game, 'all').list?.length > 0
@ -201,19 +232,31 @@ export default class NoteUser extends BaseModel {
return !!this.getUidData(uid, game)
}
/** 获取CK-Uid */
/**
* CK-Uid
* @param game
* @returns
*/
getCkUid(game = 'gs') {
let uid = this.getUid(game)
let { map, list } = this.getUidMapList(game, 'ck')
return (map[uid] ? uid : list[0]?.uid) || ''
}
/** 获取CK-Uid列表 */
/**
* CK-Uid列表
* @param game
* @returns
*/
getCkUidList(game = 'gs') {
return this.getUidMapList(game, 'ck').list
}
/** 获取当前UID */
/**
* UID
* @param game
* @returns
*/
getUid(game = 'gs') {
game = this.gameKey(game)
// todo 刷新uid
@ -224,12 +267,20 @@ export default class NoteUser extends BaseModel {
return ds.uid || ''
}
/** 获取UID列表 */
/**
* UID列表
* @param game
* @returns
*/
getUidList(game = 'gs') {
return this.getUidMapList(game, 'all').list
}
/** 获取当前的MysUser对象 */
/**
* MysUser对象
* @param game
* @returns
*/
getMysUser(game = 'gs') {
if (lodash.isEmpty(this.mysUsers)) {
return false
@ -242,7 +293,12 @@ export default class NoteUser extends BaseModel {
return this.mysUsers[uidData.ltuid]
}
// 添加UID
/**
* UID
* @param uid
* @param game
* @param save
*/
addRegUid(uid, game = 'gs', save = true) {
game = this.gameKey(game)
uid = uid + ''
@ -255,7 +311,11 @@ export default class NoteUser extends BaseModel {
}
}
// 删除UID
/**
* UID
* @param uid
* @param game
*/
delRegUid(uid, game = 'gs') {
game = this.gameKey(game)
let gameDs = this.getGameDs(game)
@ -269,6 +329,11 @@ export default class NoteUser extends BaseModel {
this.save()
}
/**
*
* @param game
* @returns
*/
getGameDs(game = 'gs') {
game = this.gameKey(game)
if (!this._games[game]) {
@ -293,7 +358,13 @@ export default class NoteUser extends BaseModel {
return uid
}
// 切换绑定CK生效的UID
/**
* CK生效的UID
* @param uid
* @param game
* @param save
* @returns
*/
setMainUid(uid = '', game = 'gs', save = true) {
this._map = false
game = this.gameKey(game)
@ -313,7 +384,10 @@ export default class NoteUser extends BaseModel {
}
}
// 添加MysUser
/**
* MysUser
* @param mysUser
*/
async addMysUser(mysUser) {
this.mysUsers[mysUser.ltuid] = mysUser
this._map = false
@ -326,12 +400,20 @@ export default class NoteUser extends BaseModel {
this.save()
}
// 删除当前用户绑定CK
/**
* CK
* @param ltuid
* @returns
*/
async delCk(ltuid = '') {
console.warn('delCk即将废弃')
return await this.delMysUser(ltuid)
}
/**
*
* @param mysUser
*/
async delMysUser(mysUser = '') {
let ltuid = mysUser.ltuid || mysUser
if (ltuid && this.mysUsers[ltuid]) {
@ -344,6 +426,10 @@ export default class NoteUser extends BaseModel {
await this.save()
}
/**
*
* @param fn
*/
async eachMysUser(fn) {
await Data.forEach(this.mysUsers, async (mys, ltuid) => {
if (!mys) {
@ -353,12 +439,18 @@ export default class NoteUser extends BaseModel {
})
}
/**
*
* @param fn
* @returns
*/
async eachAllMysUser(fn) {
return MysUser.forEach(fn)
}
/**
* CK状态
* @returns
*/
async checkCk() {
// TODO:待完善文案

View File

@ -22,6 +22,11 @@ export default class apiTool {
}
}
/**
*
* @param data
* @returns
*/
getUrlMap = (data = {}) => {
let host, hostRecord, hostPublicData
if (

View File

@ -4,25 +4,24 @@ import fs from 'node:fs'
import lodash from 'lodash'
import MysInfo from './mysInfo.js'
import NoteUser from './NoteUser.js'
import { Character, Weapon } from './local.js'
import { Character, Weapon } from '../local.js'
/** 配置文件 */
/**
* ***********
*
* ***********
*/
class GsCfg {
constructor() {
this.isSr = false
/** 默认设置 */
this.defSetPath = './plugins/genshin/defSet/'
this.defSet = {}
/** 用户设置 */
this.configPath = './plugins/genshin/config/'
this.config = {}
/** 监听文件 */
this.watcher = { config: {}, defSet: {} }
this.ignore = ['mys.pubCk', 'gacha.set', 'bot.help', 'role.name']
}
isSr = false
/** 默认设置 */
defSetPath = './plugins/genshin/defSet/'
defSet = {}
/** 用户设置 */
configPath = './plugins/genshin/config/'
config = {}
/** 监听文件 */
watcher = { config: {}, defSet: {} }
ignore = ['mys.pubCk', 'gacha.set', 'bot.help', 'role.name']
get element() {
return {
@ -39,7 +38,12 @@ class GsCfg {
return this.getYaml(app, name, 'defSet')
}
/** 用户配置 */
/**
*
* @param app
* @param name
* @returns
*/
getConfig(app, name) {
if (this.ignore.includes(`${app}.${name}`)) {
return this.getYaml(app, name, 'config')
@ -75,6 +79,13 @@ class GsCfg {
return this[type][key]
}
/**
*
* @param app s
* @param name
* @param type
* @returns
*/
getFilePath(app, name, type) {
if (type == 'defSet') {
return `${this.defSetPath}${app}/${name}.yaml`
@ -83,7 +94,14 @@ class GsCfg {
}
}
/** 监听配置文件 */
/**
*
* @param file
* @param app
* @param name
* @param type
* @returns
*/
watch(file, app, name, type = 'defSet') {
let key = `${app}.${name}`
@ -101,7 +119,11 @@ class GsCfg {
this.watcher[type][key] = watcher
}
/** 读取所有用户绑定的ck */
/**
* ck
* @param game
* @returns
*/
async getBingCk(game = 'gs') {
let ck = {}
let ckQQ = {}
@ -129,13 +151,20 @@ class GsCfg {
/**
* id转换角色名字
* @param id
* @returns
*/
roleIdToName(id) {
let char = Character.get(id)
return char?.name || ''
}
/** 原神角色别名转id */
/**
* id
* @param keyword
* @param isSr
* @returns
*/
roleNameToID(keyword, isSr) {
let char = Character.get(keyword, isSr ? 'sr' : 'gs')
return char?.id || false
@ -157,6 +186,11 @@ class GsCfg {
await MysInfo.initPubCk()
}
/**
*
* @param groupId
* @returns
*/
getGachaSet(groupId = '') {
let config = this.getYaml('gacha', 'set', 'config')
let def = config.default
@ -166,6 +200,11 @@ class GsCfg {
return def
}
/**
*
* @param msg
* @returns
*/
getMsgUid(msg) {
let ret = /([1-9]|18)[0-9]{8}/g.exec(msg)
if (!ret) return false
@ -206,6 +245,11 @@ class GsCfg {
}
}
/**
*
* @param app
* @param name
*/
cpCfg(app, name) {
if (!fs.existsSync('./plugins/genshin/config')) {
fs.mkdirSync('./plugins/genshin/config')
@ -217,7 +261,10 @@ class GsCfg {
}
}
// 仅供内部调用
/**
*
* @returns
*/
_getAbbr() {
if (this[this.isSr ? 'sr_nameID' : 'nameID']) return
@ -250,7 +297,12 @@ class GsCfg {
}
}
// 仅供内部调用
/**
*
* @param keyword
* @param isSr
* @returns
*/
_roleNameToID(keyword, isSr) {
if (isSr) this.isSr = isSr
if (!isNaN(keyword)) keyword = Number(keyword)
@ -259,7 +311,13 @@ class GsCfg {
return roelId || false
}
// 仅供内部调用
/**
*
* @param msg
* @param filterMsg
* @param isSr
* @returns
*/
_getRole(msg, filterMsg = '', isSr = false) {
let alias = msg.replace(/#|老婆|老公|([1-9]|18)[0-9]{8}/g, '').trim()
if (filterMsg) {
@ -280,45 +338,97 @@ class GsCfg {
}
}
/**
*
* @param hash
* @deprecated
* @returns
*/
getWeaponDataByWeaponHash(hash) {
console.log('gsCfg.getWeaponDataByWeaponHash() 已废弃')
return {}
}
/**
*
* @deprecated
* @returns
*/
getAllAbbr() {
console.log('gsCfg.getAllAbbr() 已废弃')
return {}
}
/**
*
* @deprecated
* @param userId
* @returns
*/
getBingCkSingle(userId) {
console.log('gsCfg.getBingCkSingle() 已废弃')
return {}
}
/**
*
* @deprecated
* @param userId
* @param data
*/
saveBingCk(userId, data) {
console.log('gsCfg.saveBingCk() 已废弃')
}
/**
*
* @deprecated
* @param roleName
* @returns
*/
getElementByRoleName(roleName) {
console.log('gsCfg.getElementByRoleName() 已废弃')
return ''
}
/**
*
* @deprecated
* @param skillId
* @param roleName
* @returns
*/
getSkillDataByskillId(skillId, roleName) {
console.log('gsCfg.getSkillDataByskillId() 已废弃')
return {}
}
/**
*
* @deprecated
* @param propId
* @returns
*/
fightPropIdToName(propId) {
console.log('gsCfg.fightPropIdToName() 已废弃')
return ''
}
/**
*
* @deprecated
* @param talentId
* @returns
*/
getRoleTalentByTalentId(talentId) {
console.log('gsCfg.getRoleTalentByTalentId 已废弃')
return {}
}
/**
*
* @deprecated
*/
getAbbr() {
console.log('gsCfg.getAbbr() 已经废弃')
}

View File

@ -35,6 +35,12 @@ export default class MysApi {
return this._device
}
/**
*
* @param type
* @param data
* @returns
*/
getUrl(type, data = {}) {
let urlMap = this.apiTool.getUrlMap({ ...data, deviceId: this.device })
if (!urlMap[type]) return false
@ -49,6 +55,10 @@ export default class MysApi {
return { url, headers, body }
}
/**
*
* @returns
*/
getServer() {
switch (String(this.uid).slice(0, -8)) {
case '1':
@ -69,6 +79,13 @@ export default class MysApi {
return this.isSr ? 'prod_gf_cn' : 'cn_gf01'
}
/**
*
* @param type
* @param data
* @param cached
* @returns
*/
async getData(type, data = {}, cached = false) {
if (
!this._device_fp &&
@ -147,6 +164,12 @@ export default class MysApi {
return res
}
/**
*
* @param query
* @param body
* @returns
*/
getHeaders(query = '', body = '') {
const cn = {
app_version: '2.40.1',
@ -180,6 +203,12 @@ export default class MysApi {
}
}
/**
*
* @param q
* @param b
* @returns
*/
getDs(q = '', b = '') {
let n = ''
if (
@ -195,6 +224,10 @@ export default class MysApi {
return `${t},${r},${DS}`
}
/**
*
* @returns
*/
getGuid() {
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
@ -216,15 +249,31 @@ export default class MysApi {
)
}
/**
*
* @param type
* @param data
* @returns
*/
cacheKey(type, data) {
return 'Yz:genshin:mys:cache:' + md5(this.uid + type + JSON.stringify(data))
}
/**
*
* @param res
* @param cacheKey
* @returns
*/
async cache(res, cacheKey) {
if (!res || res.retcode !== 0) return
redis.setEx(cacheKey, this.cacheCd, JSON.stringify(res))
}
/**
*
* @returns
*/
async getAgent() {
let proxyAddress = cfg.bot.proxyAddress
if (!proxyAddress) return null
@ -249,6 +298,11 @@ export default class MysApi {
return null
}
/**
*
* @param length
* @returns
*/
generateSeed(length = 16) {
const characters = '0123456789abcdef'
let result = ''
@ -259,6 +313,10 @@ export default class MysApi {
}
}
/**
*
* @returns
*/
export function randomRange() {
let randomStr = ''
let charStr = 'abcdef0123456789'

View File

@ -8,9 +8,17 @@ import NoteUser from './NoteUser.js'
import MysUser from './MysUser.js'
import DailyCache from './DailyCache.js'
/**
* *************
* tudo
* *********
*/
export default class MysInfo {
static tips = '请先#绑定Cookie\n发送【Cookie帮助】查看配置教程'
/**
*
* @param e
*/
constructor(e) {
if (e) {
this.e = e
@ -51,6 +59,12 @@ export default class MysInfo {
])
}
/**
*
* @param e
* @param api
* @returns
*/
static async init(e, api) {
await MysInfo.initCache()
@ -328,12 +342,21 @@ export default class MysInfo {
return true
}
/**
*
* @returns
*/
static async getBingCkUid() {
let res = await GsCfg.getBingCk()
return { ...res.ck }
}
// 获取uid绑定的ck信息
/**
* uid绑定的ck信息
* @param uid
* @param game
* @returns
*/
static async checkUidBing(uid, game = 'gs') {
let ckUser = await MysUser.getByQueryUid(uid, game, true)
if (ckUser && ckUser.ck) {
@ -342,6 +365,10 @@ export default class MysInfo {
return false
}
/**
*
* @returns
*/
static async delDisable() {
return await MysUser.delDisable()
}
@ -363,6 +390,10 @@ export default class MysInfo {
return false
}
/**
*
* @returns
*/
async checkReply() {
if (this.e.noTips === true) return
@ -413,6 +444,15 @@ export default class MysInfo {
return this.ckUser?.ck
}
/**
*
* @param res
* @param type
* @param mysApi
* @param data
* @param isTask
* @returns
*/
async checkCode(res, type, mysApi = {}, data = {}, isTask = false) {
if (!res) {
if (!isTask)
@ -558,7 +598,10 @@ export default class MysInfo {
return res
}
/** 删除失效ck */
/**
* ck
* @returns
*/
async delCk() {
if (!this.ckUser) {
return false
@ -568,7 +611,10 @@ export default class MysInfo {
await ckUser.delWithUser()
}
/** 查询次数满,今日内标记失效 */
/**
*
* @param game
*/
async disableToday(game = 'gs') {
/** 统计次数设为超限 */
await this.ckUser.disable(game)

View File

@ -3,6 +3,9 @@ import puppeteer, { Browser } from 'puppeteer'
import { ScreenshotFileOptions } from './types.js'
import { BaseConfig } from './config.js'
/**
*
*/
export const PuppeteerLunchConfig = new BaseConfig<PuppeteerLaunchOptions>({
// 禁用超时
timeout: 0, //otocolTimeout: 0,
@ -26,6 +29,9 @@ export const PuppeteerLunchConfig = new BaseConfig<PuppeteerLaunchOptions>({
// }
})
/**
*
*/
export class Puppeteer {
// 截图次数记录
#pic = 0

View File

@ -1,7 +1,9 @@
import { type ScreenshotOptions, type PuppeteerLifeCycleEvent } from 'puppeteer'
import queryString from 'querystring'
/**
*
*/
export interface ScreenshotFileOptions {
SOptions?: {
type: 'jpeg' | 'png' | 'webp'
@ -11,6 +13,9 @@ export interface ScreenshotFileOptions {
timeout?: number
}
/**
*
*/
export interface ScreenshotUrlOptions {
url: string
time?: number