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, "_", "\\_") }