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
", len(online)) for _, u := range online { fmt.Fprintf(&pm, "[ %s ] 已在线 %.1f 分钟\n", u.Username, time.Since(u.JoinTime).Minutes()) } pm.WriteString("
\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("
无法置顶用户列表消息,请检查机器人是否拥有对应的权限,您也可以手动置顶此消息
") } _, 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()) } }