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
128 lines
3.3 KiB
Go
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())
|
|
}
|
|
}
|