新增tg通知

This commit is contained in:
chaos-zhu 2024-12-22 17:36:27 +08:00
parent 6252f481d5
commit 9df142ccde
10 changed files with 1100 additions and 33 deletions

View File

@ -1,3 +1,5 @@
const path = require('path')
const decryptAndExecuteAsync = require('../utils/decrypt-file')
const { sendServerChan, sendEmail } = require('../utils/notify') const { sendServerChan, sendEmail } = require('../utils/notify')
const { NotifyConfigDB, NotifyDB } = require('../utils/db-class') const { NotifyConfigDB, NotifyDB } = require('../utils/db-class')
const notifyDB = new NotifyDB().getInstance() const notifyDB = new NotifyDB().getInstance()
@ -5,7 +7,6 @@ const notifyConfigDB = new NotifyConfigDB().getInstance()
async function getNotifyConfig({ res }) { async function getNotifyConfig({ res }) {
const data = await notifyConfigDB.findOneAsync({}) const data = await notifyConfigDB.findOneAsync({})
console.log(data)
return res.success({ data }) return res.success({ data })
} }
@ -13,6 +14,7 @@ async function updateNotifyConfig({ res, request }) {
let { body: { noticeConfig } } = request let { body: { noticeConfig } } = request
let { type } = noticeConfig let { type } = noticeConfig
try { try {
// console.log('noticeConfig: ', noticeConfig[type])
switch (type) { switch (type) {
case 'sct': case 'sct':
await sendServerChan(noticeConfig[type]['sendKey'], 'EasyNode通知测试', '这是一条测试通知') await sendServerChan(noticeConfig[type]['sendKey'], 'EasyNode通知测试', '这是一条测试通知')
@ -20,6 +22,12 @@ async function updateNotifyConfig({ res, request }) {
case 'email': case 'email':
await sendEmail(noticeConfig[type], 'EasyNode通知测试', '这是一条测试通知') await sendEmail(noticeConfig[type], 'EasyNode通知测试', '这是一条测试通知')
break break
case 'tg':
let { sendTg } = await decryptAndExecuteAsync(path.join(__dirname, '../utils/plus.js')) || {}
console.log('sendTg: ', sendTg)
if (!sendTg) return res.fail({ msg: 'Plus功能解析失败' })
await sendTg(noticeConfig[type], 'EasyNode通知测试', '这是一条测试通知')
break
} }
await notifyConfigDB.update({}, { $set: noticeConfig }, { upsert: true }) await notifyConfigDB.update({}, { $set: noticeConfig }, { upsert: true })
return res.success({ msg: '测试通过 | 保存成功' }) return res.success({ msg: '测试通过 | 保存成功' })

View File

@ -1 +1 @@
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

View File

@ -71,8 +71,7 @@ async function initNotifyDB() {
async function initNotifyConfigDB() { async function initNotifyConfigDB() {
const notifyConfigDB = new NotifyConfigDB().getInstance() const notifyConfigDB = new NotifyConfigDB().getInstance()
let count = await notifyConfigDB.countAsync({}) let notifyConfig = await notifyConfigDB.findOneAsync({})
if (count !== 0) return
consola.log('初始化NotifyConfigDB✔') consola.log('初始化NotifyConfigDB✔')
const defaultData = { const defaultData = {
type: 'sct', type: 'sct',
@ -83,8 +82,17 @@ async function initNotifyConfigDB() {
service: 'QQ', service: 'QQ',
user: '', user: '',
pass: '' pass: ''
},
tg: {
token: '',
chatId: ''
} }
} }
if (notifyConfig) {
await notifyConfigDB.removeAsync({ _id: notifyConfig._id })
delete notifyConfig._id
return notifyConfigDB.insertAsync(Object.assign({}, defaultData, notifyConfig))
}
return notifyConfigDB.insertAsync(defaultData) return notifyConfigDB.insertAsync(defaultData)
} }

View File

@ -1 +1 @@
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

View File

@ -1,3 +1,5 @@
const path = require('path')
const decryptAndExecuteAsync = require('./decrypt-file')
const nodemailer = require('nodemailer') const nodemailer = require('nodemailer')
const axios = require('axios') const axios = require('axios')
const commonTemp = require('../template/commonTemp') const commonTemp = require('../template/commonTemp')
@ -6,7 +8,6 @@ const notifyConfigDB = new NotifyConfigDB().getInstance()
const notifyDB = new NotifyDB().getInstance() const notifyDB = new NotifyDB().getInstance()
function sendServerChan(sendKey, title, content) { function sendServerChan(sendKey, title, content) {
if (!sendKey) return consola.error('发送server酱通知失败, sendKey 为空')
return new Promise((async (resolve, reject) => { return new Promise((async (resolve, reject) => {
try { try {
consola.info('server酱通知预发送: ', title) consola.info('server酱通知预发送: ', title)
@ -28,7 +29,6 @@ function sendServerChan(sendKey, title, content) {
} }
function sendEmail({ service, user, pass }, title, content) { function sendEmail({ service, user, pass }, title, content) {
if (!service || !user || !pass) return consola.info('发送通知失败, 邮箱配置信息不完整: ', { service, user, pass })
return new Promise((async (resolve, reject) => { return new Promise((async (resolve, reject) => {
try { try {
consola.info('邮箱通知预发送: ', title) consola.info('邮箱通知预发送: ', title)
@ -60,8 +60,8 @@ async function sendNoticeAsync(noticeAction, title, content) {
try { try {
let notifyList = await notifyDB.findAsync({}) let notifyList = await notifyDB.findAsync({})
let { sw } = notifyList.find((item) => item.type === noticeAction) // 获取对应动作的通知开关 let { sw } = notifyList.find((item) => item.type === noticeAction) // 获取对应动作的通知开关
console.log('notify swtich: ', noticeAction, sw) // console.log('notify swtich: ', noticeAction, sw)
if (!sw) return if (!sw) return consola.info('通知开关关闭, 不发送通知: ', noticeAction)
let notifyConfig = await notifyConfigDB.findOneAsync({}) let notifyConfig = await notifyConfigDB.findOneAsync({})
let { type } = notifyConfig let { type } = notifyConfig
if (!type) return consola.error('通知类型不存在: ', type) if (!type) return consola.error('通知类型不存在: ', type)
@ -78,7 +78,15 @@ async function sendNoticeAsync(noticeAction, title, content) {
if (!service || !user || !pass) return consola.info('未发送邮件通知通知, 未配置邮箱: ', { service, user, pass }) if (!service || !user || !pass) return consola.info('未发送邮件通知通知, 未配置邮箱: ', { service, user, pass })
await sendEmail({ service, user, pass }, title, content) await sendEmail({ service, user, pass }, title, content)
break 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: default:
consola.info('未配置通知类型: ', type)
break break
} }
} catch (error) { } catch (error) {

1
server/app/utils/plus.js Normal file
View File

@ -0,0 +1 @@
U2FsdGVkX1+Gus2FIC0WsNp0rUXPA+Ui1NQUjtnqP6Ycb1pyHglCADvKu51oxYaGJ0ZdoRZYo7YP3tQgIhp3f96WxP1/QFdypVrVlS7+jbAH6Gzc4CPlD3UeFsCm1j32ArFX60tPSSkq6+DJ3OF6pIVxstGIbCkmv5NQaf0J95zCxgqGm+fo/nZmZ6oj21uspGWZjhHssFRol0KpzINFDSWE9+/hJ43ybT5G6OHvEiaF83YH6h3CXAa6zz2zV18LKvnO8A4nTYR2/EBmGiP6NE3YqQ7hTE7SFmEDtRaxKJfyBxs0bHDCcFifVZh8GE25VyDwvOihUHztgvIRMh9vkgehzx9YN3sZdAsBJqcWyqi1mEPZU/l+zq2tbO+EczCvz6JQ77RZToQxm0vXzJc/ctcCEoVvjDx1pJhsQiTj5tJirFgcYz4VC7ihFYIq2XUQNISZaLynpYUUPdjvIfXGcvk0500SK9VAKb6603Z3fABdsENDGuxl2UKXMed4sL/PFwLy9siEX3BgMg1hFFiwoqqEp/x75341BoeRavEIJBEv8BdTS66mel1lUa/L3so7LyjGpdgfzOZlv+0t6Uhzy82HwYkAWmvuYpK6s6JItsG1ftYrOBzHZbpu36wn0e4N4NLqBnm6Hx1+tQJY7lTmgokgUy+5sVtp4LEsTbgE64HbDLYhME4m/3Yw5ij5D1OhoNwm/9r6MEYyJOyv8j8nDjudLRe1YQ0D2JLQsr04LYpVrjU1+Tsg780K0j0JdnFfVhe/SdkVU8nbkIIfRkv/86N6U2ZQaCYaScZmKYdBQmsK//I2yuYym0tM5q2d5kesYTxy8uAtVIXL1rE065eZFPlg/7Mgu0sqUsspG+EeDJE=

View File

@ -1,6 +1,6 @@
{ {
"name": "server", "name": "server",
"version": "3.0.2", "version": "3.0.3",
"description": "easynode-server", "description": "easynode-server",
"bin": "./bin/www", "bin": "./bin/www",
"scripts": { "scripts": {
@ -43,6 +43,7 @@
"node-os-utils": "^1.3.7", "node-os-utils": "^1.3.7",
"node-rsa": "^1.1.1", "node-rsa": "^1.1.1",
"node-schedule": "^2.1.1", "node-schedule": "^2.1.1",
"node-telegram-bot-api": "^0.66.0",
"nodemailer": "^6.9.14", "nodemailer": "^6.9.14",
"qrcode": "^1.5.4", "qrcode": "^1.5.4",
"socket.io": "^4.7.5", "socket.io": "^4.7.5",

View File

@ -1,6 +1,6 @@
{ {
"name": "web", "name": "web",
"version": "3.0.2", "version": "3.0.3",
"description": "easynode-web", "description": "easynode-web",
"private": true, "private": true,
"scripts": { "scripts": {

View File

@ -69,20 +69,56 @@
/> />
</el-form-item> </el-form-item>
</template> </template>
<!-- Telegram -->
<template v-if="noticeConfig.type === 'tg'">
<el-form-item label="Token" prop="tg.token" class="form_item">
<el-input
v-model.trim="noticeConfig.tg.token"
clearable
placeholder="Telegram Token"
autocomplete="off"
class="input"
/>
</el-form-item>
<el-form-item label="ChatId" prop="tg.chatId" class="form_item">
<el-input
v-model="noticeConfig.tg.chatId"
clearable
placeholder="Telegram ChatId"
autocomplete="off"
class="input"
/>
<span class="tips">Telegram Token/ChatId 获取: <a class="link" href="https://easynode.chaoszhu.com/zh/guide/get-tg-token" target="_blank">查看教程</a> </span>
</el-form-item>
</template>
<el-form-item label="" class="form_item"> <el-form-item label="" class="form_item">
<el-button type="primary" :loading="loading" @click="handleSave"> <el-button
v-if="noticeConfig.type !== 'tg'"
type="primary"
:loading="loading"
@click="handleSave"
>
测试并保存 测试并保存
</el-button> </el-button>
<!-- <el-tooltip effect="dark" content="重复添加的邮箱将会被覆盖" placement="right"> <PlusSupportTip>
</el-tooltip> --> <el-button
type="primary"
:disabled="!isPlusActive"
:loading="loading"
@click="handleSave"
>
测试并保存
</el-button>
</PlusSupportTip>
</el-form-item> </el-form-item>
</el-form> </el-form>
</template> </template>
<script setup> <script setup>
import { ref, reactive, onMounted, getCurrentInstance } from 'vue' import { ref, reactive, onMounted, getCurrentInstance, computed } from 'vue'
import PlusSupportTip from '@/components/common/PlusSupportTip.vue'
const { proxy: { $api, $notification } } = getCurrentInstance() const { proxy: { $api, $notification, $store } } = getCurrentInstance()
const loading = ref(false) const loading = ref(false)
const noticeConfig = ref({}) const noticeConfig = ref({})
@ -95,14 +131,28 @@ const noticeTypeList = ref([
type: 'sct', type: 'sct',
desc: 'Server酱' desc: 'Server酱'
}, },
{
type: 'tg',
desc: 'Telegram'
},
]) ])
const formRef = ref(null) const formRef = ref(null)
const isPlusActive = computed(() => $store.isPlusActive)
const rules = reactive({ const rules = reactive({
'sct.sendKey': { required: true, message: '需输入sendKey', trigger: 'change' }, 'sct.sendKey': { required: true, message: '需输入sendKey', trigger: 'change' },
'email.service': { required: true, message: '需输入邮箱提供商', trigger: 'change' }, 'email.service': { required: true, message: '需输入邮箱提供商', trigger: 'change' },
'email.user': { required: true, type: 'email', message: '需输入邮箱', trigger: 'change' }, 'email.user': { required: true, type: 'email', message: '需输入邮箱', trigger: 'change' },
'email.pass': { required: true, message: '需输入邮箱SMTP授权码', trigger: 'change' } 'email.pass': { required: true, message: '需输入邮箱SMTP授权码', trigger: 'change' },
'tg.token': { required: true, message: '需输入Telegram Token', trigger: 'change' },
'tg.chatId': [
{ required: true, message: '需输入Telegram ChatId', trigger: 'change' },
{
pattern: /^-?\d+$/,
message: 'ChatId必须为数字',
trigger: ['blur', 'change',]
},
]
}) })
const handleSave = () => { const handleSave = () => {

1023
yarn.lock

File diff suppressed because it is too large Load Diff