From 3d3a87bd795cb326bf435463d9ba76d3498c6124 Mon Sep 17 00:00:00 2001 From: bossgeekgo Date: Sun, 11 Feb 2024 18:42:36 +0800 Subject: [PATCH] set send dingtalk message with delay --- main/index.mjs | 4 +-- plugin/DingtalkPlugin/dingtalk.mjs | 17 ++++++----- plugin/DingtalkPlugin/index.mjs | 49 +++++++++++++++++++++++++++--- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/main/index.mjs b/main/index.mjs index ea5056d..94e09ea 100644 --- a/main/index.mjs +++ b/main/index.mjs @@ -258,11 +258,11 @@ async function mainLoop (hooks) { throw err } case 'STARTUP_CHAT_ERROR_WITH_UNKNOWN_ERROR': { - hooks.errorEncounter.call(err) + hooks.errorEncounter.call([err.message, err.stack].join('\n')) throw err } default: { - hooks.errorEncounter.call(err) + hooks.errorEncounter.call([err.message, err.stack].join('\n')) throw err } } diff --git a/plugin/DingtalkPlugin/dingtalk.mjs b/plugin/DingtalkPlugin/dingtalk.mjs index 8fae098..20af071 100644 --- a/plugin/DingtalkPlugin/dingtalk.mjs +++ b/plugin/DingtalkPlugin/dingtalk.mjs @@ -1,13 +1,16 @@ export function createTextMessage (text) { - return JSON.stringify({ - "msgtype": "text", - "text": { - "content": `${text}【bossgeekgo】` - } - }) + return { + "dingtalkRequestBody": { + "msgtype": "text", + "text": { + "content": `${text}` + }, + }, + insertedTime: new Date(), + } } -export async function requestDingTalkNotify (dingTalkAccessToken, body) { +export async function requestDingtalkNotify (dingTalkAccessToken, body) { const url = new URL(`https://oapi.dingtalk.com/robot/send`) url.searchParams.append( 'access_token', diff --git a/plugin/DingtalkPlugin/index.mjs b/plugin/DingtalkPlugin/index.mjs index 2286e1a..13a5bc9 100644 --- a/plugin/DingtalkPlugin/index.mjs +++ b/plugin/DingtalkPlugin/index.mjs @@ -1,19 +1,60 @@ -import { requestDingTalkNotify, createTextMessage } from './dingtalk.mjs' +import { requestDingtalkNotify, createTextMessage } from './dingtalk.mjs' +import dayjs from 'dayjs' + +let sendQueueTimer = 0 +let collectedMessageList = [] + export default class DingtalkPlugin { constructor (dingtalkAccessToken) { this.dingtalkAccessToken = dingtalkAccessToken } + setSendQueueTimer () { + const _this = this + const interval = 2 * 60 * 1000 + sendQueueTimer = setTimeout(function sendMergedMessage () { + if (collectedMessageList.length === 0) { + } else if (collectedMessageList.length === 1) { + collectedMessageList[0].dingtalkRequestBody.text.content += `\n${dayjs(collectedMessageList[0].insertedTime).format('MM-DD HH:mm:ss')}\n\n【bossgeekgo】` + requestDingtalkNotify( + _this.dingtalkAccessToken, JSON.stringify(collectedMessageList[0].dingtalkRequestBody) + ) + } else { + requestDingtalkNotify( + _this.dingtalkAccessToken, JSON.stringify((createTextMessage( + collectedMessageList.map(it => { + return `${it.dingtalkRequestBody.text.content}\n${dayjs(it.insertedTime).format('MM-DD HH:mm:ss')}\n` + }).join('-----\n') + '\n【bossgeekgo】' + )).dingtalkRequestBody) + ) + } + collectedMessageList.length = 0 + sendQueueTimer = setTimeout(sendMergedMessage, interval) + }, interval) + } + destroySendQueueTimer () { + clearTimeout(sendQueueTimer) + } apply (hooks) { if (!this.dingtalkAccessToken) { console.log(`[DingtalkPlugin] AccessToken is empty, which makes the plugin won't do anything.`) return } + this.destroySendQueueTimer() + this.setSendQueueTimer() hooks.errorEncounter.tap( 'DingtalkPlugin', (errorInfo) => { - requestDingTalkNotify( - this.dingtalkAccessToken, createTextMessage(errorInfo) - ) + collectedMessageList.push(createTextMessage(errorInfo)) + } + ) + hooks.newChatStartup.tap( + 'DingtalkPlugin', + ({jobInfo, bossInfo}) => { + collectedMessageList.push(createTextMessage( + `${bossInfo.brandName} ${bossInfo.name} +${jobInfo.jobName} ${jobInfo.salaryDesc} +Chat has startup!` + )) } ) }