From f2a642bf799e4767d2fe7d2099e2a77cd6b3aa37 Mon Sep 17 00:00:00 2001 From: J3n5en Date: Mon, 28 Aug 2023 14:38:09 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Add=20Telegram=20push=20hoo?= =?UTF-8?q?k=20functionality=20and=20configuration=20options?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add "tgChatId" and "tgBotToken" fields to configuration files - Modify "config.go" to include new configuration fields - Implement Telegram push hook functionality in "telegram_push.go" - Add test file "telegram_push_test.go" to test Telegram push hook functionality --- server/config/config.dev.json | 2 + server/config/config.go | 2 + server/config/config.json | 2 + server/config/config_mysql.json | 2 + server/hooks/base.go | 2 + server/hooks/telegram_push/telegram_push.go | 96 +++++++++++++++++++ .../hooks/telegram_push/telegram_push_test.go | 21 ++++ 7 files changed, 127 insertions(+) create mode 100644 server/hooks/telegram_push/telegram_push.go create mode 100644 server/hooks/telegram_push/telegram_push_test.go diff --git a/server/config/config.dev.json b/server/config/config.dev.json index 53d8bce..1638afc 100644 --- a/server/config/config.dev.json +++ b/server/config/config.dev.json @@ -12,6 +12,8 @@ "weChatPushSecret": "", "weChatPushTemplateId": "", "weChatPushUserId": "", + "tgChatId": "", + "tgBotToken": "", "isInit": true, "httpsEnabled": 2 } \ No newline at end of file diff --git a/server/config/config.go b/server/config/config.go index 4ecd42e..e829c3f 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -24,6 +24,8 @@ type Config struct { WeChatPushSecret string `json:"weChatPushSecret"` WeChatPushTemplateId string `json:"weChatPushTemplateId"` WeChatPushUserId string `json:"weChatPushUserId"` + TgBotToken string `json:"tgBotToken"` + TgChatId string `json:"tgChatId"` IsInit bool `json:"isInit"` HttpsEnabled int `json:"httpsEnabled"` //后台页面是否启用https,0默认(启用),1启用,2不启用 Tables map[string]string `json:"-"` diff --git a/server/config/config.json b/server/config/config.json index 53d8bce..1638afc 100644 --- a/server/config/config.json +++ b/server/config/config.json @@ -12,6 +12,8 @@ "weChatPushSecret": "", "weChatPushTemplateId": "", "weChatPushUserId": "", + "tgChatId": "", + "tgBotToken": "", "isInit": true, "httpsEnabled": 2 } \ No newline at end of file diff --git a/server/config/config_mysql.json b/server/config/config_mysql.json index afedb10..d02d7ec 100644 --- a/server/config/config_mysql.json +++ b/server/config/config_mysql.json @@ -12,6 +12,8 @@ "weChatPushSecret": "", "weChatPushTemplateId": "", "weChatPushUserId": "", + "tgChatId": "", + "tgBotToken": "", "isInit": true, "httpsEnabled": 2 } \ No newline at end of file diff --git a/server/hooks/base.go b/server/hooks/base.go index dc57de2..f703b8d 100644 --- a/server/hooks/base.go +++ b/server/hooks/base.go @@ -3,6 +3,7 @@ package hooks import ( "pmail/dto" "pmail/dto/parsemail" + "pmail/hooks/telegram_push" "pmail/hooks/wechat_push" ) @@ -24,5 +25,6 @@ var HookList []EmailHook func Init() { HookList = []EmailHook{ wechat_push.NewWechatPushHook(), + telegram_push.NewTelegramPushHook(), } } diff --git a/server/hooks/telegram_push/telegram_push.go b/server/hooks/telegram_push/telegram_push.go new file mode 100644 index 0000000..8f2079f --- /dev/null +++ b/server/hooks/telegram_push/telegram_push.go @@ -0,0 +1,96 @@ +package telegram_push + +import ( + "encoding/json" + "fmt" + "net/http" + "pmail/config" + "pmail/dto" + "pmail/dto/parsemail" + "strings" + + log "github.com/sirupsen/logrus" +) + +type TelegramPushHook struct { + chatId string + botToken string + httpsEnabled int + webDomain string +} + +func (w *TelegramPushHook) SendBefore(ctx *dto.Context, email *parsemail.Email) { + +} + +func (w *TelegramPushHook) SendAfter(ctx *dto.Context, email *parsemail.Email, err map[string]error) { + +} + +func (w *TelegramPushHook) ReceiveParseBefore(email []byte) { + +} + +func (w *TelegramPushHook) ReceiveParseAfter(email *parsemail.Email) { + if w.chatId == "" || w.botToken == "" { + return + } + + w.sendUserMsg(nil, email) +} + +type SendMessageRequest struct { + ChatID string `json:"chat_id"` + Text string `json:"text"` + ReplyMarkup ReplyMarkup `json:"reply_markup"` + ParseMode string `json:"parse_mode"` +} + +type ReplyMarkup struct { + InlineKeyboard [][]InlineKeyboardButton `json:"inline_keyboard"` +} + +type InlineKeyboardButton struct { + Text string `json:"text"` + URL string `json:"url"` +} + +func (w *TelegramPushHook) sendUserMsg(ctx *dto.Context, email *parsemail.Email) { + url := w.webDomain + if w.httpsEnabled > 1 { + url = "http://" + url + } else { + url = "https://" + url + } + sendMsgReq, _ := json.Marshal(SendMessageRequest{ + ChatID: w.chatId, + Text: fmt.Sprintf("📧%s<%s>\n\n%s", email.Subject, email.From.EmailAddress, string(email.Text)), + ParseMode: "HTML", + ReplyMarkup: ReplyMarkup{ + InlineKeyboard: [][]InlineKeyboardButton{ + { + { + Text: "查收邮件", + URL: url, + }, + }, + }, + }, + }) + + _, err := http.Post(fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", w.botToken), "application/json", strings.NewReader(string(sendMsgReq))) + if err != nil { + log.WithContext(ctx).Errorf("telegram push error %+v", err) + } + +} +func NewTelegramPushHook() *TelegramPushHook { + ret := &TelegramPushHook{ + botToken: config.Instance.TgBotToken, + chatId: config.Instance.TgChatId, + webDomain: config.Instance.WebDomain, + httpsEnabled: config.Instance.HttpsEnabled, + } + return ret + +} diff --git a/server/hooks/telegram_push/telegram_push_test.go b/server/hooks/telegram_push/telegram_push_test.go new file mode 100644 index 0000000..ec258dd --- /dev/null +++ b/server/hooks/telegram_push/telegram_push_test.go @@ -0,0 +1,21 @@ +package telegram_push + +import ( + "pmail/config" + "pmail/dto/parsemail" + "testing" +) + +func testInit() { + + config.Init() + +} +func TestWeChatPushHook_ReceiveParseAfter(t *testing.T) { + testInit() + + w := NewTelegramPushHook() + w.ReceiveParseAfter(&parsemail.Email{Subject: "标题", Text: []byte("文本内容"), From: &parsemail.User{ + EmailAddress: "hello@gmail.com", + }}) +}