Files
trbot/plugins/teamspeak/delete_message.go
2026-03-09 16:14:43 +08:00

112 lines
3.2 KiB
Go

package teamspeak
import (
"context"
"fmt"
"time"
"github.com/go-telegram/bot"
"github.com/reugn/go-quartz/job"
"github.com/reugn/go-quartz/quartz"
"github.com/rs/zerolog"
"trle5.xyz/trbot/utils"
"trle5.xyz/trbot/utils/flaterr"
"trle5.xyz/trbot/utils/task"
)
func (sc *ServerConfig) DeleteMessage(ctx context.Context) (int, error) {
var needDelMsgIDs []int
var keepMsgIDList []OldMessageID
for _, msg := range sc.s.OldMessageID {
if time.Now().Unix() > int64(msg.Date + sc.DeleteTimeoutInMinute * 60) {
needDelMsgIDs = append(needDelMsgIDs, msg.ID)
} else {
keepMsgIDList = append(keepMsgIDList, msg)
}
}
sc.s.OldMessageID = keepMsgIDList
if len(needDelMsgIDs) > 0 {
_, err := botInstance.DeleteMessages(ctx, &bot.DeleteMessagesParams{
ChatID: sc.GroupID,
MessageIDs: needDelMsgIDs,
})
if err != nil {
zerolog.Ctx(ctx).Error().
Err(err).
Ints("msgIDs", needDelMsgIDs).
Int("deleteMessageMinute", sc.DeleteTimeoutInMinute).
Str("content", "teamspeak user change notify").
Msg(flaterr.DeleteMessage.Str())
return 1, err
}
}
return 0, nil
}
// ScheduleDeleteMessageTask 创建定时删除旧通知信息的任务
func (sc *ServerConfig) ScheduleDeleteMessageTask(ctx context.Context) error {
// 根据 sc.DeleteTimeoutInMinute 计划一个任务
// 定时检查 sc.s.OldMessageID 中是否有过期的消息,如果有则删除
err := task.ScheduleTask(ctx, task.Task{
Name: fmt.Sprintf("delete_old_message_%d", sc.GroupID),
Group: "teamspeak3",
Job: job.NewFunctionJobWithDesc(
sc.DeleteMessage,
"delete teamspeak user change notify message",
),
Trigger: quartz.NewSimpleTrigger(time.Minute * time.Duration(sc.DeleteTimeoutInMinute)),
})
if err != nil {
zerolog.Ctx(ctx).Error().Err(err).Msg("Failed to schedule delete message job")
return err
}
sc.s.IsDeleteMessageTaskScheduled = true
sc.s.IsDeleteMessageTaskRunning = true
// 如果 sc.AutoDeleteMessage 不为真,则就是没有启用自动删除消息功能,所以暂停任务
if !sc.AutoDeleteMessage {
sc.PauseDeleteMessageTask(ctx)
}
return nil
}
// ResumeDeleteMessageTask 恢复删除旧通知信息的任务
func (sc *ServerConfig) ResumeDeleteMessageTask(ctx context.Context) {
logger := zerolog.Ctx(ctx).
With().
Str("pluginName", "teamspeak3").
Str(utils.GetCurrentFuncName()).
Logger()
if !tsConfig.s.IsDeleteMessageTaskRunning {
err := task.ResumeTask(ctx, fmt.Sprintf("delete_old_message_%d", tsConfig.GroupID), "teamspeak3")
if err != nil {
logger.Error().Err(err).Msg("Failed to resume delete old message task")
} else {
tsConfig.s.IsDeleteMessageTaskRunning = true
}
}
}
// PauseDeleteMessageTask 暂停删除旧通知信息的任务
func (sc *ServerConfig) PauseDeleteMessageTask(ctx context.Context) {
logger := zerolog.Ctx(ctx).
With().
Str("pluginName", "teamspeak3").
Str(utils.GetCurrentFuncName()).
Logger()
if tsConfig.s.IsDeleteMessageTaskRunning {
err := task.PauseTask(ctx, fmt.Sprintf("delete_old_message_%d", tsConfig.GroupID), "teamspeak3")
if err != nil {
logger.Error().Err(err).Msg("Failed to pause delete old message task")
} else {
tsConfig.s.IsDeleteMessageTaskRunning = false
}
}
}