Files
trbot/plugins/teamspeak/notice.go
Hubert Chen 2c3c216f08 optimize teamspeak plugin
optimize check client logic
show network message at pinned message
determine the user by database id
track user's username
use strings.Builder to combine messages
2026-06-02 14:51:16 +08:00

128 lines
3.3 KiB
Go

package teamspeak
import (
"context"
"fmt"
"strings"
"time"
"github.com/go-telegram/bot"
"github.com/go-telegram/bot/models"
"github.com/rs/zerolog"
"trle5.xyz/trbot/utils"
"trle5.xyz/trbot/utils/flaterr"
)
// NotifyClientChange 通过在对话中发送信息的方式来通知用户变化
func (sc *ServerConfig) NotifyClientChange(ctx context.Context, add, remove []Client) {
logger := zerolog.Ctx(ctx).
With().
Str("pluginName", "teamspeak3").
Str(utils.GetCurrentFuncName()).
Logger()
var pm strings.Builder
if len(add) > 0 {
pm.WriteString("以下用户进入了服务器:\n")
for _, u := range add {
fmt.Fprintf(&pm, "用户 [ %s ]\n", u.Username)
}
}
if len(remove) > 0 {
pm.WriteString("以下用户离开了服务器:\n")
for _, u := range remove {
fmt.Fprintf(&pm, "用户 [ %s ]\n", u.Username)
}
}
msg, err := botInstance.SendMessage(ctx, &bot.SendMessageParams{
ChatID: sc.GroupID,
Text: pm.String(),
ParseMode: models.ParseModeHTML,
})
if err != nil {
logger.Error().
Err(err).
Int64("chatID", sc.GroupID).
Str("content", "teamspeak user change notify").
Msg(flaterr.SendMessage.Str())
}
if tsConfig.s.IsDeleteMessageTaskScheduled {
if tsConfig.AutoDeleteMessage {
tsConfig.ResumeDeleteMessageTask(ctx)
tsConfig.s.OldMessageID = append(tsConfig.s.OldMessageID, OldMessageID{
Date: msg.Date,
ID: msg.ID,
})
} else if tsConfig.s.IsDeleteMessageTaskRunning {
tsConfig.PauseDeleteMessageTask(ctx)
tsConfig.s.OldMessageID = []OldMessageID{}
}
}
}
// ChangePinnedMessage 通过编辑置顶消息的方式来通知用户变化
func (sc *ServerConfig) ChangePinnedMessage(ctx context.Context, online []Client, add, remove []Client) {
logger := zerolog.Ctx(ctx).
With().
Str("pluginName", "teamspeak3").
Str(utils.GetCurrentFuncName()).
Logger()
// 没有新加入和离开用户,等待一阵子后再更新用户在线时间
if len(add) + len(remove) == 0 && sc.s.CheckCount < (60 / tsConfig.PollingInterval) {
sc.s.CheckCount++
return
} else {
sc.s.CheckCount = 0
}
var pm strings.Builder
fmt.Fprintf(&pm, "%s | ", time.Now().Format("15:04"))
if len(online) > 0 {
fmt.Fprintf(&pm, "有 %d 位用户在线:\n<blockquote>", len(online))
for _, u := range online {
fmt.Fprintf(&pm, "[ %s ] 已在线 %.1f 分钟\n", u.Username, time.Since(u.JoinTime).Minutes())
}
pm.WriteString("</blockquote>\n")
} else {
pm.WriteString("没有用户在线\n\n")
}
if len(add) > 0 {
pm.WriteString("以下用户进入了服务器:\n")
for _, u := range add {
fmt.Fprintf(&pm, "用户 [ %s ]\n", u.Username)
}
}
if len(remove) > 0 {
pm.WriteString("以下用户离开了服务器:\n")
for _, u := range remove {
fmt.Fprintf(&pm, "用户 [ %s ]\n", u.Username)
}
}
if !sc.s.IsMessagePinned {
pm.WriteString("<blockquote expandable>无法置顶用户列表消息,请检查机器人是否拥有对应的权限,您也可以手动置顶此消息</blockquote>")
}
_, err := botInstance.EditMessageText(ctx, &bot.EditMessageTextParams{
ChatID: sc.GroupID,
MessageID: sc.PinnedMessageID,
Text: pm.String(),
ParseMode: models.ParseModeHTML,
})
if err != nil {
logger.Error().
Err(err).
Int64("chatID", sc.GroupID).
Str("content", "teamspeak user change notify").
Msg(flaterr.EditMessageText.Str())
}
}