101 lines
3.6 KiB
JavaScript
101 lines
3.6 KiB
JavaScript
const path = require('path')
|
||
const decryptAndExecuteAsync = require('./decrypt-file')
|
||
const nodemailer = require('nodemailer')
|
||
const axios = require('axios')
|
||
const commonTemp = require('../template/commonTemp')
|
||
const { NotifyDB, NotifyConfigDB } = require('./db-class')
|
||
const notifyConfigDB = new NotifyConfigDB().getInstance()
|
||
const notifyDB = new NotifyDB().getInstance()
|
||
|
||
function sendServerChan(sendKey, title, content) {
|
||
return new Promise((async (resolve, reject) => {
|
||
try {
|
||
consola.info('server酱通知预发送: ', title)
|
||
const url = `https://sctapi.ftqq.com/${ sendKey }.send`
|
||
const params = new URLSearchParams({ text: title, desp: content })
|
||
let { data } = await axios.post(url, params, {
|
||
headers: {
|
||
'Content-Type': 'application/x-www-form-urlencoded'
|
||
}
|
||
})
|
||
resolve(data)
|
||
consola.info('server酱通知发送成功: ', title)
|
||
} catch (error) {
|
||
reject(error)
|
||
consola.error('server酱通知发送失败: ', error)
|
||
}
|
||
}))
|
||
|
||
}
|
||
|
||
function sendEmail({ service, user, pass }, title, content) {
|
||
return new Promise((async (resolve, reject) => {
|
||
try {
|
||
consola.info('邮箱通知预发送: ', title)
|
||
let transporter = nodemailer.createTransport({
|
||
service,
|
||
auth: {
|
||
user,
|
||
pass
|
||
}
|
||
})
|
||
await transporter.sendMail({
|
||
from: user,
|
||
to: user,
|
||
subject: title,
|
||
// text: '', // 纯文本版本内容,如果收件人的邮件客户端不支持HTML显示,就会显示这个文本
|
||
html: commonTemp(content)
|
||
})
|
||
consola.info('邮件通知发送成功: ', title)
|
||
resolve()
|
||
} catch (error) {
|
||
reject(error)
|
||
consola.error('邮件通知发送失败: ', error)
|
||
}
|
||
}))
|
||
}
|
||
|
||
// 异步发送通知
|
||
async function sendNoticeAsync(noticeAction, title, content) {
|
||
try {
|
||
let notifyList = await notifyDB.findAsync({})
|
||
let { sw } = notifyList.find((item) => item.type === noticeAction) // 获取对应动作的通知开关
|
||
// console.log('notify swtich: ', noticeAction, sw)
|
||
if (!sw) return consola.info('通知开关关闭, 不发送通知: ', noticeAction)
|
||
let notifyConfig = await notifyConfigDB.findOneAsync({})
|
||
let { type } = notifyConfig
|
||
if (!type) return consola.error('通知类型不存在: ', type)
|
||
title = `EasyNode-${ title }`
|
||
content += `\n通知发送时间:${ new Date() }`
|
||
switch (type) {
|
||
case 'sct':
|
||
let { sendKey } = notifyConfig['sct']
|
||
if (!sendKey) return consola.info('未发送server酱通知, sendKey 为空')
|
||
await sendServerChan(sendKey, title, content)
|
||
break
|
||
case 'email':
|
||
let { service, user, pass } = notifyConfig['email']
|
||
if (!service || !user || !pass) return consola.info('未发送邮件通知通知, 未配置邮箱: ', { service, user, pass })
|
||
await sendEmail({ service, user, pass }, title, content)
|
||
break
|
||
case 'tg':
|
||
let { token, chatId } = notifyConfig['tg']
|
||
if (!token || !chatId) return consola.info('未发送Telegram通知, 未配置token或chatId: ', { token, chatId })
|
||
let { sendTg } = await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))
|
||
if (!sendTg) return consola.info('未发送Telegram通知, Plus功能解析失败')
|
||
await sendTg({ token, chatId }, title, content)
|
||
break
|
||
default:
|
||
consola.info('未配置通知类型: ', type)
|
||
break
|
||
}
|
||
} catch (error) {
|
||
consola.error('通知发送失败: ', error)
|
||
}
|
||
}
|
||
|
||
module.exports = {
|
||
sendNoticeAsync,
|
||
sendServerChan,
|
||
sendEmail
|
||
} |