package common import ( "context" "fmt" "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 { if l.svcCtx.TelegramBot == nil { return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "telegram bot not initialized") } 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) 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 } func escapeMarkdown(s string) string { return strings.ReplaceAll(s, "_", "\\_") }