set send dingtalk message with delay

This commit is contained in:
bossgeekgo
2024-02-11 18:42:36 +08:00
parent e9bba46b50
commit 3d3a87bd79
3 changed files with 57 additions and 13 deletions

View File

@@ -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
}
}

View File

@@ -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',

View File

@@ -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!`
))
}
)
}