psyduck/bot.js
2025-03-25 15:41:10 +08:00

129 lines
4.2 KiB
JavaScript
Executable File

import TelegramBot from "node-telegram-bot-api"
import ini from "ini"
import qs from "qs"
import fs from "fs"
import path from 'path';
import SocksProxyAgent from 'socks-proxy-agent'
import {
fileURLToPath,
pathToFileURL
} from 'url';
import {
spawnSync,
spawn
} from "child_process"
let dirpath = fileURLToPath(
import.meta.url);
let abspath = path.dirname(dirpath);
let scripts = []
let iniPath = `${abspath}/config/config.ini`
let iniText = fs.readFileSync(iniPath, 'UTF-8')
iniPath = pathToFileURL(iniPath).href
const psyduck = ini.parse(iniText)
const bot = psyduck.bot
let request = {}
let nodePath = '/usr/bin/node'
let nodeList = ['/usr/bin/node', '/usr/local/bin/node']
for (nodePath of nodeList) {
let d = spawnSync(nodePath, ['-v'], {
encoding: 'utf-8',
})
if (d.output) {
break
}
}
if (bot.BOT_PROXY) {
if (bot.BOT_PROXY.toLowerCase().includes("socks")) {
var agent = new SocksProxyAgent(bot.BOT_PROXY.toLowerCase());
request.agent = agent
}
else {
request.proxy = bot.BOT_PROXY
}
}
let dir = fs.readdirSync(`${abspath}/parse`);
dir.forEach(async function(item, index) {
let stat = fs.lstatSync(`${abspath}/parse/` + item)
if (stat.isDirectory() === true) {
for (let script of fs.readdirSync(`${abspath}/parse/${item}`)) {
let ff = script.match(/jd_task_(\w+)/)
if (ff) {
scripts.push(ff[1])
}
}
}
});
!(async () => {
const bots = new TelegramBot(bot.BOT_TOKEN, {
polling: true,
request,
});
const wait = function(t) {
return new Promise(e => setTimeout(e, t))
}
const sendMessage = async function(id, echo, params = {}, timeout = 0) {
bots.sendMessage(id, echo, params || {}).then(async (res) => {
if (timeout) {
await wait(parseInt(timeout))
console.log(`删除消息: ${echo}`)
bots.deleteMessage(res.chat.id, res.message_id)
}
});
}
bots.on('text', async (msg) => {
let sm = sendMessage
let chat = msg.chat
let from = msg.from
let id = from.id
let messageId = msg.message_id
let chatId = chat.id
let text = msg.text
let admin = bot.BOT_ROOT.includes(id.toString())
if (text.match(/^task\s+\w+_\w+/) && admin) {
let filename = text.match(/task\s*(\w+)\s*/)[1]
let argv = text.split(filename)
let params = []
if (argv.length>1 && argv[1]) {
params = argv[1].split(" ")
}
let command = spawn(nodePath, [...['main', filename], ...params], {
encoding: 'utf-8',
})
command.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
if (data.includes("即将运行")) {
console.log(`正在运行: ${filename}`)
sm(chatId, `正在运行: ${filename}`, '', 3456)
}
});
}
else if (text.match(/^\w+\s+\w+/)) {
let tt = text.match(/^(\w+)\s+(\w+)/)
if (scripts.includes(tt[1]) && admin) {
let filename = `jd_task_${tt[1]}`;
let params = tt[2] == 'start' ? [] : ['-custom', tt[2]];
let command = spawn(nodePath, [...['main', filename], ...params], {
encoding: 'utf-8',
})
command.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
if (data.includes("即将运行")) {
if (tt[2] == 'start') {
console.log(`正在运行: ${filename}`)
sm(chatId, `正在运行: ${filename}`, '', 3456)
}
else {
console.log(`正在运行: ${filename} -custom ${tt[2]}`)
sm(chatId, `正在运行: ${filename} -custom ${tt[2]}`, '', 3456)
}
}
});
}
}
})
})().catch((e) => {
console.log(e)
}).finally(() => {
});