hi-server/internal/logic/common/contactLogic.go

89 lines
2.6 KiB
Go
Raw 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, "_", "\\_")
}