diff --git a/back/services/notify.ts b/back/services/notify.ts index 2f8eaf99..33ff770e 100644 --- a/back/services/notify.ts +++ b/back/services/notify.ts @@ -36,7 +36,7 @@ export default class NotificationService { private content = ''; private params!: Omit; private gotOption = { - timeout: 30000, + timeout: 10000, retry: 1, }; @@ -78,33 +78,41 @@ export default class NotificationService { } private async gotify() { - const { gotifyUrl, gotifyToken, gotifyPriority } = this.params; - const res: any = await got - .post(`${gotifyUrl}/message?token=${gotifyToken}`, { - ...this.gotOption, - body: `title=${encodeURIComponent( - this.title, - )}&message=${encodeURIComponent( - this.content, - )}&priority=${gotifyPriority}`, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - }) - .json(); - return typeof res.id === 'number'; + const { gotifyUrl, gotifyToken, gotifyPriority = 1 } = this.params; + try { + const res: any = await got + .post(`${gotifyUrl}/message?token=${gotifyToken}`, { + ...this.gotOption, + body: `title=${encodeURIComponent( + this.title, + )}&message=${encodeURIComponent( + this.content, + )}&priority=${gotifyPriority}`, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }) + .json(); + return typeof res.id === 'number'; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async goCqHttpBot() { const { goCqHttpBotQq, goCqHttpBotToken, goCqHttpBotUrl } = this.params; - const res: any = await got - .post(`${goCqHttpBotUrl}?${goCqHttpBotQq}`, { - ...this.gotOption, - json: { message: `${this.title}\n${this.content}` }, - headers: { Authorization: 'Bearer ' + goCqHttpBotToken }, - }) - .json(); - return res.retcode === 0; + try { + const res: any = await got + .post(`${goCqHttpBotUrl}?${goCqHttpBotQq}`, { + ...this.gotOption, + json: { message: `${this.title}\n${this.content}` }, + headers: { Authorization: 'Bearer ' + goCqHttpBotToken }, + }) + .json(); + return res.retcode === 0; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async serverChan() { @@ -112,49 +120,61 @@ export default class NotificationService { const url = serverChanKey.startsWith('SCT') ? `https://sctapi.ftqq.com/${serverChanKey}.send` : `https://sc.ftqq.com/${serverChanKey}.send`; - const res: any = await got - .post(url, { - ...this.gotOption, - body: `title=${this.title}&desp=${this.content}`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); - return res.errno === 0 || res.data.errno === 0; + try { + const res: any = await got + .post(url, { + ...this.gotOption, + body: `title=${this.title}&desp=${this.content}`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }) + .json(); + return res.errno === 0 || res.data.errno === 0; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async pushDeer() { const { pushDeerKey, pushDeerUrl } = this.params; const url = pushDeerUrl || `https://api2.pushdeer.com/message/push`; - const res: any = await got - .post(url, { - ...this.gotOption, - body: `pushkey=${pushDeerKey}&text=${encodeURIComponent( - this.title, - )}&desp=${encodeURIComponent(this.content)}&type=markdown`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); - return ( - res.content.result.length !== undefined && res.content.result.length > 0 - ); + try { + const res: any = await got + .post(url, { + ...this.gotOption, + body: `pushkey=${pushDeerKey}&text=${encodeURIComponent( + this.title, + )}&desp=${encodeURIComponent(this.content)}&type=markdown`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }) + .json(); + return ( + res.content.result.length !== undefined && res.content.result.length > 0 + ); + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async chat() { const { chatUrl, chatToken } = this.params; const url = `${chatUrl}${chatToken}`; - const res: any = await got - .post(url, { - ...this.gotOption, - body: `payload={"text":"${this.title}\n${this.content}"}`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); - return res.success; + try { + const res: any = await got + .post(url, { + ...this.gotOption, + body: `payload={"text":"${this.title}\n${this.content}"}`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }) + .json(); + return res.success; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async bark() { let { barkPush, barkIcon, barkSound, barkGroup } = this.params; - if (!barkPush.startsWith('http') && !barkPush.startsWith('https')) { + if (!barkPush.startsWith('http')) { barkPush = `https://api.day.app/${barkPush}`; } const url = `${barkPush}/${encodeURIComponent( @@ -162,13 +182,18 @@ export default class NotificationService { )}/${encodeURIComponent( this.content, )}?icon=${barkIcon}&sound=${barkSound}&group=${barkGroup}`; - const res: any = await got - .get(url, { - ...this.gotOption, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); - return res.code === 200; + + try { + const res: any = await got + .get(url, { + ...this.gotOption, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }) + .json(); + return res.code === 200; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async telegramBot() { @@ -200,15 +225,19 @@ export default class NotificationService { https: httpsAgent, }; } - const res: any = await got - .post(url, { - ...this.gotOption, - body: `chat_id=${telegramBotUserId}&text=${this.title}\n\n${this.content}&disable_web_page_preview=true`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - agent, - }) - .json(); - return !!res.ok; + try { + const res: any = await got + .post(url, { + ...this.gotOption, + body: `chat_id=${telegramBotUserId}&text=${this.title}\n\n${this.content}&disable_web_page_preview=true`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + agent, + }) + .json(); + return !!res.ok; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async dingtalkBot() { @@ -222,35 +251,43 @@ export default class NotificationService { secretParam = `×tamp=${dateNow}&sign=${result}`; } const url = `https://oapi.dingtalk.com/robot/send?access_token=${dingtalkBotToken}${secretParam}`; - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - msgtype: 'text', - text: { - content: ` ${this.title}\n\n${this.content}`, + try { + const res: any = await got + .post(url, { + ...this.gotOption, + json: { + msgtype: 'text', + text: { + content: ` ${this.title}\n\n${this.content}`, + }, }, - }, - }) - .json(); - return res.errcode === 0; + }) + .json(); + return res.errcode === 0; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async weWorkBot() { const { weWorkBotKey } = this.params; const url = `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${weWorkBotKey}`; - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - msgtype: 'text', - text: { - content: ` ${this.title}\n\n${this.content}`, + try { + const res: any = await got + .post(url, { + ...this.gotOption, + json: { + msgtype: 'text', + text: { + content: ` ${this.title}\n\n${this.content}`, + }, }, - }, - }) - .json(); - return res.errcode === 0; + }) + .json(); + return res.errcode === 0; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async weWorkApp() { @@ -306,22 +343,26 @@ export default class NotificationService { break; } - const res: any = await got - .post( - `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${tokenRes.access_token}`, - { - ...this.gotOption, - json: { - touser, - agentid, - safe: '0', - ...options, + try { + const res: any = await got + .post( + `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${tokenRes.access_token}`, + { + ...this.gotOption, + json: { + touser, + agentid, + safe: '0', + ...options, + }, }, - }, - ) - .json(); + ) + .json(); - return res.errcode === 0; + return res.errcode === 0; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async aibotk() { @@ -353,85 +394,111 @@ export default class NotificationService { break; } - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - ...json, - }, - }) - .json(); + try { + const res: any = await got + .post(url, { + ...this.gotOption, + json: { + ...json, + }, + }) + .json(); - return res.code === 0; + return res.code === 0; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async iGot() { const { iGotPushKey } = this.params; const url = `https://push.hellyw.com/${iGotPushKey.toLowerCase()}`; - const res: any = await got - .post(url, { - ...this.gotOption, - body: `title=${this.title}&content=${this.content}`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); + try { + const res: any = await got + .post(url, { + ...this.gotOption, + body: `title=${this.title}&content=${this.content}`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }) + .json(); - return res.ret === 0; + return res.ret === 0; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async pushPlus() { const { pushPlusToken, pushPlusUser } = this.params; const url = `https://www.pushplus.plus/send`; - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - token: `${pushPlusToken}`, - title: `${this.title}`, - content: `${this.content.replace(/[\n\r]/g, '
')}`, - topic: `${pushPlusUser || ''}`, - }, - }) - .json(); + try { + const res: any = await got + .post(url, { + ...this.gotOption, + json: { + token: `${pushPlusToken}`, + title: `${this.title}`, + content: `${this.content.replace(/[\n\r]/g, '
')}`, + topic: `${pushPlusUser || ''}`, + }, + }) + .json(); - return res.code === 200; + return res.code === 200; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async lark() { - const { larkKey } = this.params; - const res: any = await got - .post(`https://open.feishu.cn/open-apis/bot/v2/hook/${larkKey}`, { - ...this.gotOption, - json: { - msg_type: 'text', - content: { text: `${this.title}\n\n${this.content}` }, - }, - headers: { 'Content-Type': 'application/json' }, - }) - .json(); - return res.StatusCode === 0; + let { larkKey } = this.params; + + if (!larkKey.startsWith('http')) { + larkKey = `https://open.feishu.cn/open-apis/bot/v2/hook/${larkKey}`; + } + + try { + const res: any = await got + .post(larkKey, { + ...this.gotOption, + json: { + msg_type: 'text', + content: { text: `${this.title}\n\n${this.content}` }, + }, + headers: { 'Content-Type': 'application/json' }, + }) + .json(); + return res.StatusCode === 0; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async email() { const { emailPass, emailService, emailUser } = this.params; - const transporter = nodemailer.createTransport({ - service: emailService, - auth: { - user: emailUser, - pass: emailPass, - }, - }); - const info = await transporter.sendMail({ - from: `"青龙快讯" <${emailUser}>`, - to: `${emailUser}`, - subject: `${this.title}`, - html: `${this.content.replace(/\n/g, '
')}`, - }); + try { + const transporter = nodemailer.createTransport({ + service: emailService, + auth: { + user: emailUser, + pass: emailPass, + }, + }); - transporter.close(); + const info = await transporter.sendMail({ + from: `"青龙快讯" <${emailUser}>`, + to: `${emailUser}`, + subject: `${this.title}`, + html: `${this.content.replace(/\n/g, '
')}`, + }); - return !!info.messageId; + transporter.close(); + + return !!info.messageId; + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private async webhook() { @@ -460,8 +527,12 @@ export default class NotificationService { allowGetBody: true, ...bodyParam, }; - const res = await got(formatUrl, options); - return String(res.statusCode).startsWith('20'); + try { + const res = await got(formatUrl, options); + return String(res.statusCode).startsWith('20'); + } catch (error: any) { + throw new Error(error.response ? error.response.body : error); + } } private formatBody(contentType: string, body: any): object { diff --git a/shell/share.sh b/shell/share.sh index 923a62ac..312b1a3a 100755 --- a/shell/share.sh +++ b/shell/share.sh @@ -449,7 +449,7 @@ patch_version() { fi if [[ $NpmMirror ]]; then cd && pnpm config set registry $NpmMirror - pnpm install -g --prefer-offline --force + pnpm install -g --force fi git config --global pull.rebase false diff --git a/src/pages/setting/notification.tsx b/src/pages/setting/notification.tsx index a016867b..64a2c5a2 100644 --- a/src/pages/setting/notification.tsx +++ b/src/pages/setting/notification.tsx @@ -12,6 +12,7 @@ const NotificationSetting = ({ data }: any) => { const [form] = Form.useForm(); const handleOk = (values: any) => { + setLoading(true); const { type } = values; if (type == 'closed') { values.type = ''; @@ -30,7 +31,8 @@ const NotificationSetting = ({ data }: any) => { }) .catch((error: any) => { console.log(error); - }); + }) + .finally(() => setLoading(false)); }; const notificationModeChange = (value: string) => { @@ -56,7 +58,7 @@ const NotificationSetting = ({ data }: any) => { style={{ maxWidth: 400 }} initialValue={notificationMode} > - {config.notificationModes.map((x) => (