fix: 完成ts化

This commit is contained in:
ningmengchongshui 2024-06-09 21:21:20 +08:00
parent a79e7c16bc
commit 52d8992562
19 changed files with 286 additions and 216 deletions

View File

@ -11,7 +11,7 @@ import cfg from './config/config.js'
/**
*
*/
import ListenerLoader from './lib/listener/loader.js'
import ListenerLoader from './core/loader.js'
/**
*
*/
@ -64,6 +64,6 @@ export class Yunzai extends Client {
/** 全局变量 bot */
global.Bot = bot
/** 加载插件 */
return await (await import('./lib/plugins/loader.js')).default.load()
return await (await import('./core/plugins/loader.js')).default.load()
}
}

View File

@ -99,11 +99,11 @@ class Cfg {
* qq
*/
get masterQQ() {
const masterQQ = this.getConfig('other')?.masterQQ || []
if (Array.isArray(masterQQ)) {
return masterQQ.forEach(qq => { qq = String(qq) })
const qqs = this.getConfig('other')?.masterQQ || []
if (Array.isArray(qqs)) {
return qqs.map(qq => String(qq))
} else {
return [String(masterQQ)]
return [String(qqs)]
}
}

View File

@ -99,7 +99,7 @@ export async function makeForwardMsg(
/**
*
*/
if (dec) {
if (dec && !Array.isArray(forwardMsg)) {
/**
*
*/

View File

@ -1,4 +1,4 @@
import PluginsLoader from '../plugins/loader.js'
import PluginsLoader from './plugins/loader.js'
/**
*

View File

@ -5,6 +5,8 @@ import lodash from 'lodash'
*
*/
class ListenerLoader {
client = null
/**
*
* @param client Bot示例
@ -12,7 +14,9 @@ class ListenerLoader {
async load(client) {
this.client = client
const files = fs.readdirSync('./lib/events').filter(file => file.endsWith('.js'))
const files = fs
.readdirSync('./lib/events')
.filter(file => file.endsWith('.js'))
for (let File of files) {
try {
@ -25,13 +29,15 @@ class ListenerLoader {
const on = listener.once ? 'once' : 'on'
if (lodash.isArray(listener.event)) {
listener.event.forEach((type) => {
listener.event.forEach(type => {
const e = listener[type] ? type : 'execute'
this.client[on](listener.prefix + type, event => listener[e](event))
})
} else {
const e = listener[listener.event] ? listener.event : 'execute'
this.client[on](listener.prefix + listener.event, event => listener[e](event))
this.client[on](listener.prefix + listener.event, event =>
listener[e](event)
)
}
} catch (e) {
logger.mark(`监听事件错误:${File}`)

View File

@ -1,5 +1,5 @@
import EventListener from '../listener/listener.js'
import { sleep } from '../../utils/common.js'
import EventListener from './listener.js'
import { sleep } from '../utils/common.js'
import inquirer from 'inquirer'
import lodash from 'lodash'
import fetch from 'node-fetch'
@ -13,15 +13,12 @@ let inSlider = false
*
*/
export default class loginEvent extends EventListener {
client = null
/**
*
*/
constructor() {
/**
*
*/
@ -43,7 +40,9 @@ export default class loginEvent extends EventListener {
* @param event
*/
async qrcode(event) {
logger.mark(`请使用登录当前QQ的手机${logger.green('扫码')}完成登录,如果显示二维码过期,可以按${logger.green('回车键Enter')}刷新,重新输入密码请执行命令:${logger.green('node app login')}`)
logger.mark(
`请使用登录当前QQ的手机${logger.green('扫码')}完成登录,如果显示二维码过期,可以按${logger.green('回车键Enter')}刷新,重新输入密码请执行命令:${logger.green('node app login')}`
)
// logger.info('等待扫码中...')
/** 获取扫码结果 */
@ -70,7 +69,13 @@ export default class loginEvent extends EventListener {
/**
*
*/
inquirer.prompt({ type: 'input', message: '回车刷新二维码,等待扫码中...\n', name: 'enter' }).then(async () => {
inquirer
.prompt({
type: 'input',
message: '回车刷新二维码,等待扫码中...\n',
name: 'enter'
})
.then(async () => {
if (!inSlider) {
clearInterval(interval)
console.log(' 重新刷新二维码...\n\n')
@ -80,26 +85,37 @@ export default class loginEvent extends EventListener {
})
}
/**
* 使PC浏览器已经无效
* @param event
*/
async slider(event) {
inSlider = true
console.log(`\n\n------------------${logger.green('↓↓滑动验证链接↓↓')}----------------------\n`)
console.log(
`\n\n------------------${logger.green('↓↓滑动验证链接↓↓')}----------------------\n`
)
console.log(logger.green(event.url))
console.log('\n--------------------------------------------------------')
console.log(`提示打开上面链接获取ticket可使用${logger.green('【滑动验证app】')}获取`)
console.log(`链接存在${logger.green('有效期')},请尽快操作,多次操作失败可能会被冻结`)
console.log('滑动验证app下载地址https://wwp.lanzouy.com/i6w3J08um92h 密码:3kuu\n')
console.log(
`提示打开上面链接获取ticket可使用${logger.green('【滑动验证app】')}获取`
)
console.log(
`链接存在${logger.green('有效期')},请尽快操作,多次操作失败可能会被冻结`
)
console.log(
'滑动验证app下载地址https://wwp.lanzouy.com/i6w3J08um92h 密码:3kuu\n'
)
const ret = await inquirer.prompt([
{
type: 'list',
name: 'type',
message: '触发滑动验证需要获取ticket通过验证请选择获取方式:',
choices: ['0.自动获取ticket', '1.手动获取ticket', '2.滑动验证app请求码获取']
choices: [
'0.自动获取ticket',
'1.手动获取ticket',
'2.滑动验证app请求码获取'
]
}
])
@ -150,7 +166,11 @@ export default class loginEvent extends EventListener {
console.log(`${logger.green(req)}\n----完成后将自动进行登录----`)
for (let i = 0; i < 40; i++) {
const res = await fetch(req, {
const res: {
data?: {
ticket: null
}
} = await fetch(req, {
method: 'POST',
body: JSON.stringify({ submit: Bot.uin })
}).then(res => res.json())
@ -171,7 +191,9 @@ export default class loginEvent extends EventListener {
code: null,
url: url.replace('ssl.captcha.qq.com', 'txhelper.glitch.me')
}
txhelper.req = await fetch(txhelper.url).catch((err) => console.log(err.toString()))
txhelper.req = await fetch(txhelper.url).catch(err =>
console.log(err.toString())
)
if (!txhelper.req?.ok) return false
@ -181,7 +203,9 @@ export default class loginEvent extends EventListener {
txhelper.code = /\d+/g.exec(txhelper.req)
if (!txhelper.code) return false
console.log(`\n请打开滑动验证app输入请求码${logger.green('【' + txhelper.code + '】')},然后完成滑动验证\n`)
console.log(
`\n请打开滑动验证app输入请求码${logger.green('【' + txhelper.code + '】')},然后完成滑动验证\n`
)
await sleep(200)
@ -193,7 +217,9 @@ export default class loginEvent extends EventListener {
})
//
txhelper.res = await fetch(txhelper.url).catch((err) => console.log(err.toString()))
txhelper.res = await fetch(txhelper.url).catch(err =>
console.log(err.toString())
)
//
if (!txhelper.res) return false
@ -211,14 +237,15 @@ 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`)
console.log(
`\n\n------------------${logger.green('↓↓设备锁验证↓↓')}----------------------\n`
)
const ret = await inquirer.prompt([
{
type: 'list',
@ -233,14 +260,22 @@ export default class loginEvent extends EventListener {
if (ret.type == '1.网页扫码验证') {
console.log('\n' + logger.green(event.url) + '\n')
console.log('请打开上面链接,完成验证后按回车')
await inquirer.prompt({ type: 'input', message: '等待操作中...', name: 'enter' })
await inquirer.prompt({
type: 'input',
message: '等待操作中...',
name: 'enter'
})
await this.client.login()
} else {
console.log('\n')
this.client.sendSmsCode()
await sleep(200)
logger.info(`验证码已发送:${event.phone}\n`)
let res = await inquirer.prompt({ type: 'input', message: '请输入短信验证码:', name: 'sms' })
let res = await inquirer.prompt({
type: 'input',
message: '请输入短信验证码:',
name: 'sms'
})
await this.client.submitSmsCode(res.sms)
}
}
@ -250,9 +285,12 @@ export default class loginEvent extends EventListener {
* @param event
*/
error(event) {
if (Number(event.code) === 1) logger.error('QQ密码错误运行命令重新登录node app login')
if (Number(event.code) === 1)
logger.error('QQ密码错误运行命令重新登录node app login')
if (global.inputTicket && event.code == 237) {
logger.error(`${logger.red('ticket')}输入错误或者已失效,已停止运行,请重新登录验证`)
logger.error(
`${logger.red('ticket')}输入错误或者已失效,已停止运行,请重新登录验证`
)
} else if (event?.message.includes('冻结')) {
logger.error('账号已被冻结,已停止运行')
} else {

24
src/core/message.ts Normal file
View File

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

View File

@ -1,15 +1,13 @@
import EventListener from '../listener/listener.js'
import EventListener from './listener.js'
/**
*
*/
export default class noticeEvent extends EventListener {
/**
*
*/
constructor() {
/**
*
*/

View File

@ -1,18 +1,16 @@
import EventListener from '../listener/listener.js'
import EventListener from './listener.js'
import fetch from 'node-fetch'
import cfg from '../../config/config.js'
import { BOT_NAME } from '../../config/system.js'
import cfg from '../config/config.js'
import { BOT_NAME } from '../config/system.js'
/**
* 线
*/
export default class offlineEvent extends EventListener {
/**
*
*/
constructor() {
/**
*
*/
@ -28,10 +26,14 @@ export default class offlineEvent extends EventListener {
let config = cfg.getConfig('notice')
let title = `${BOT_NAME}(${Bot.nickname})已离线,请关注`
if (config.iyuu) {
await fetch(`https://iyuu.cn/${config.iyuu}.send?text=${title}&desp=${e.message}`)
await fetch(
`https://iyuu.cn/${config.iyuu}.send?text=${title}&desp=${e.message}`
)
}
if (config.sct) {
await fetch(`https://sctapi.ftqq.com/${config.sct}.send?title=${title}&content=${e.message}`)
await fetch(
`https://sctapi.ftqq.com/${config.sct}.send?title=${title}&content=${e.message}`
)
}
if (config.feishu_webhook) {
let offline_content = {
@ -41,15 +43,17 @@ export default class offlineEvent extends EventListener {
'zh-cn': {
title: title,
content: [
[{
tag: "text",
[
{
tag: 'text',
text: e.message
}]
}
]
]
}
}
}
};
}
await fetch(config.feishu_webhook, {
method: 'POST',
headers: {

View File

@ -1,25 +1,23 @@
import EventListener from '../listener/listener.js'
import cfg from '../../config/config.js'
import { relpyPrivate } from '../../core/common.js'
import { BOT_NAME } from '../../config/system.js'
import EventListener from './listener.js'
import cfg from '../config/config.js'
import { relpyPrivate } from '../core/common.js'
import { BOT_NAME } from '../config/system.js'
/**
* 线
*/
export default class onlineEvent extends EventListener {
/**
*
*/
constructor() {
/**
*
*/
super({
event: 'system.online',
once: true,
prefix: undefined,
prefix: undefined
})
}
@ -29,7 +27,9 @@ export default class onlineEvent extends EventListener {
*/
async execute(e) {
logger.mark('----^_^----')
logger.mark(logger.green(`${BOT_NAME} 上线成功 版本v${cfg.package.version}`))
logger.mark(
logger.green(`${BOT_NAME} 上线成功 版本v${cfg.package.version}`)
)
logger.mark(logger.green('https://github.com/yoimiya-kokomi/Miao-Yunzai'))
// logger.mark('-----------')
/** 加载插件 */

View File

@ -111,4 +111,3 @@ const Handler = {
*
*/
export default Handler

View File

@ -6,7 +6,7 @@ import { segment } from 'icqq'
import chokidar from 'chokidar'
import moment from 'moment'
import path from 'node:path'
import Runtime from '../../core/runtime.js'
import Runtime from './runtime.js'
import Handler from './handler.js'
@ -462,7 +462,7 @@ class PluginsLoader {
e.isGuild = true
}
if (e.user_id && cfg.masterQQ.includes(Number(e.user_id) || String(e.user_id))) {
if (e.user_id && cfg.masterQQ.includes(String(e.user_id) || String(e.user_id))) {
e.isMaster = true
}
@ -497,7 +497,7 @@ class PluginsLoader {
* @param data.recallMsg 0-1200
* @param data.at at用户
*/
e.reply = async (msg = '', quote = false, data:any = {}) => {
e.reply = async (msg:any = '', quote = false, data:any = {}) => {
if (!msg) return false
/** 禁言中 */

View File

@ -1,6 +1,6 @@
import * as common from '../utils/common.js'
import cfg from '../config/config.js'
import Handler from '../lib/plugins/handler.js'
import * as common from '../../utils/common.js'
import cfg from '../../config/config.js'
import Handler from './handler.js'
import {
gsCfg,
@ -8,7 +8,7 @@ import {
mysInfo as MysInfo,
NoteUser,
MysUser
} from '../mys/index.js'
} from '../../mys/index.js'
/**
* ********************

24
src/core/request.ts Normal file
View File

@ -0,0 +1,24 @@
import EventListener from './listener.js'
/**
*
*/
export default class requestEvent extends EventListener {
/**
*
*/
constructor() {
/**
*
*/
super({ event: 'request', prefix: undefined, once: undefined })
}
/**
*
* @param e
*/
async execute(e) {
this.plugins.deal(e)
}
}

View File

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

View File

@ -1,26 +0,0 @@
import EventListener from '../listener/listener.js'
/**
*
*/
export default class requestEvent extends EventListener {
/**
*
*/
constructor () {
/**
*
*/
super({ event: 'request' , prefix: undefined, once: undefined})
}
/**
*
* @param e
*/
async execute (e) {
this.plugins.deal(e)
}
}

View File

@ -257,8 +257,24 @@ export default class MysUser extends BaseModel {
* @returns {Promise<boolean|{msg: string, uids: *[], status: number}>}
*/
static async checkCkStatus(ck) {
/**
*
*/
if (!ck) {
return false
}
/**
*
*/
let uids = []
let err = (msg, status = 2) => {
/**
*
* @param msg
* @param status
* @returns
*/
const err = (msg, status = 2) => {
msg = msg + '\n请退出米游社并重新登录后再次获取CK'
return {
status,
@ -266,18 +282,23 @@ export default class MysUser extends BaseModel {
uids
}
}
if (!ck) {
return false
}
/**
* *********
* tudo
* **********
*/
// 检查绑定UID
uids = await MysUser.getCkUid(ck, true, true)
if (!uids.uids || uids.uids.length === 0) {
return err(uids.msg || 'CK失效')
}
uids = uids.uids
let uid = uids[0]
let mys = new MysApi(uid + '', ck, { log: false })
// uids = await MysUser.getCkUid(ck, true, true)
// if (!uids.uids || uids.uids.length === 0) {
// return err(uids.msg || 'CK失效')
// }
// uids = uids.uids
let uid = uids[0] ?? '0'
let mys = new MysApi(String(uid), ck, { log: false })
// 体力查询
let noteRet = await mys.getData('dailyNote')
if (noteRet.retcode !== 0 || lodash.isEmpty(noteRet.data)) {
@ -504,14 +525,21 @@ export default class MysUser extends BaseModel {
}
// 初始化数据
async initDB(db = false) {
async initDB(db) {
// 检查当前实例是否已有数据库连接
if (this.db && !db) {
return
}
// tudo
// ???
db = db && db !== true ? db : await MysUserDB.find(this.ltuid, true)
// 如果传入了 db 参数且 db 参数不为 true则使用传入的 db否则调用 MysUserDB.find 获取 db
if (!db || db === true) {
db = await MysUserDB.find(this.ltuid, true)
}
// 设置实例的 db 属性
this.db = db
// 调用 setCkData 方法,并传入 db
this.setCkData(db)
}
@ -584,9 +612,7 @@ export default class MysUser extends BaseModel {
* @returns
*/
async initCache() {
if (!this.ltuid || !this.ck) {
return
}
if (!this.ltuid || !this.ck) return
let self = this
await MysUtil.eachGame(async game => {
let uids = self.uids[game]

View File

@ -121,7 +121,11 @@ export default class MysApi {
}
if (type === 'getFp' && !data?.Getfp) return this._device_fp
let { url, headers, body } = this.getUrl(type, data)
const UrlData = this.getUrl(type, data)
if (!UrlData) return false
let { url, headers, body } = UrlData
if (!url) return false
@ -156,19 +160,11 @@ export default class MysApi {
} else {
param.method = 'get'
}
let response = {
ok: null,
status: null,
statusText: null
}
let start = Date.now()
try {
response = await fetch(url, param)
} catch (error) {
logger.error(error.toString())
return false
}
let start = Date.now()
try {
const response = await fetch(url, param)
if (!response.ok) {
logger.error(
`[米游社接口][${type}][${this.uid}] ${response.status} ${response.statusText}`
@ -176,20 +172,25 @@ export default class MysApi {
return false
}
if (this.option.log) {
logger.mark(`[米游社接口][${type}][${this.uid}] ${Date.now() - start}ms`)
logger.mark(
`[米游社接口][${type}][${this.uid}] ${Date.now() - start}ms`
)
}
const res = await response.json()
if (!res) {
//
const data: {
api?: any
} = await response.json()
if (!data) {
logger.mark('mys接口没有返回')
return false
}
res.api = type
if (cached) this.cache(res, cacheKey)
return res
data.api = type
if (cached) this.cache(data, cacheKey)
return data
} catch (error) {
logger.error(error.toString())
return false
}
}
/**
@ -227,7 +228,8 @@ export default class MysApi {
'x-rpc-client_type': client.client_type,
'User-Agent': client.User_Agent,
'Referer': client.Referer,
'DS': this.getDs(query, body)
'DS': this.getDs(query, body),
'Cookie': null
}
}

View File

@ -70,7 +70,7 @@ export default class MysInfo {
*/
this.mysButton = segment.button([
{ text: '米游社', link: 'https://miyoushe.com' }
])
] as any)
}
/**
@ -153,7 +153,7 @@ export default class MysInfo {
e.reply(
[
'尚未绑定uid',
segment.button([{ text: '绑定UID', input: '#绑定uid' }])
segment.button([{ text: '绑定UID', input: '#绑定uid' }] as any)
],
false,
{ at }
@ -180,7 +180,7 @@ export default class MysInfo {
e.reply(
[
'请先#绑定uid',
segment.button([{ text: '绑定UID', input: '#绑定uid' }])
segment.button([{ text: '绑定UID', input: '#绑定uid' }] as any)
],
false,
{ at: at || true }
@ -207,7 +207,9 @@ export default class MysInfo {
e.reply(
[
'尚未绑定Cookie',
segment.button([{ text: 'Cookie帮助', callback: '#Cookie帮助' }])
segment.button([
{ text: 'Cookie帮助', callback: '#Cookie帮助' }
] as any)
],
false,
{ at: selfUser.qq }
@ -303,7 +305,8 @@ export default class MysInfo {
for (let ck of pubCks) {
let pubUser = await MysUser.create(ck)
if (pubUser) {
let ret = await pubUser.initCache({ qq: 'pub' })
// await pubUser.initCache({ qq: 'pub' })
let ret = await pubUser.initCache()
if (ret) {
pubCount++
}
@ -419,7 +422,7 @@ export default class MysInfo {
this.e.reply(
[
'请先#绑定uid',
segment.button([{ text: '绑定UID', input: '#绑定uid' }])
segment.button([{ text: '绑定UID', input: '#绑定uid' }] as any)
],
false,
{ at: true }
@ -429,7 +432,7 @@ export default class MysInfo {
if (!this.ckInfo.ck) {
this.e.reply([
'暂无可用CK请绑定更多用户或设置公共ck..',
segment.button([{ text: 'Cookie帮助', callback: '#Cookie帮助' }])
segment.button([{ text: 'Cookie帮助', callback: '#Cookie帮助' }] as any)
])
}