hi-server/internal/logic/common/contactLogic.go
shanshanzhong b3edd7e2a6
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 6m2s
feat(contactLogic): 添加通过HTTP API发送Telegram消息的备用方案
当TelegramBot未初始化时,改用HTTP API发送消息。这提高了功能的可靠性,确保在没有直接bot实例时仍能发送通知。
2025-12-21 23:46:30 -08:00

89 lines
2.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package common
import (
"context"
"fmt"
"net/http"
"strconv"
"strings"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/internal/types"
"github.com/perfect-panel/server/pkg/logger"
"github.com/perfect-panel/server/pkg/xerr"
"github.com/pkg/errors"
)
type ContactLogic struct {
logger.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewContactLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ContactLogic {
return &ContactLogic{
Logger: logger.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *ContactLogic) SubmitContact(req *types.ContactRequest) error {
chatIDStr := l.svcCtx.Config.Telegram.GroupChatID
if chatIDStr == "" {
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "telegram group chat id not configured")
}
chatID, err := strconv.ParseInt(chatIDStr, 10, 64)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "invalid group chat id: %v", err.Error())
}
name := escapeMarkdown(req.Name)
email := escapeMarkdown(req.Email)
other := req.OtherContact
if strings.TrimSpace(other) == "" {
other = "无"
}
other = escapeMarkdown(other)
notes := req.Notes
if strings.TrimSpace(notes) == "" {
notes = "无"
}
notes = escapeMarkdown(notes)
text := fmt.Sprintf("新的联系/合作信息\n称呼%s\n邮箱%s\n其他联系方式%s\n优势/备注:%s", name, email, other, notes)
if l.svcCtx.TelegramBot != nil {
msg := tgbotapi.NewMessage(chatID, text)
msg.ParseMode = "markdown"
_, err = l.svcCtx.TelegramBot.Send(msg)
if err != nil {
l.Errorw("send telegram message failed", logger.Field("error", err.Error()))
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "send telegram message failed: %v", err.Error())
}
return nil
}
token := l.svcCtx.Config.Telegram.BotToken
if strings.TrimSpace(token) == "" {
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "telegram bot not initialized")
}
reqHttp, _ := http.NewRequest("GET", "https://api.telegram.org/bot"+token+"/sendMessage", nil)
q := reqHttp.URL.Query()
q.Add("chat_id", chatIDStr)
q.Add("text", text)
q.Add("parse_mode", "markdown")
reqHttp.URL.RawQuery = q.Encode()
resp, err := http.DefaultClient.Do(reqHttp)
if err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "send telegram message failed: %v", err.Error())
}
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "send telegram message failed: http %d", resp.StatusCode)
}
return nil
}
func escapeMarkdown(s string) string {
return strings.ReplaceAll(s, "_", "\\_")
}