Smail/plugins/pmail_telegram_push/hook/hook.go

123 lines
3.8 KiB
Go

package hook
import (
"encoding/json"
"errors"
"strings"
"git.pcux.cn/xuans/Smail/dto/parsemail"
"git.pcux.cn/xuans/Smail/hooks/framework"
"git.pcux.cn/xuans/Smail/models"
"git.pcux.cn/xuans/Smail/utils/context"
"github.com/go-telegram/bot"
"github.com/ydzydzydz/pmail_telegram_push/logger"
telegrammodel "github.com/ydzydzydz/pmail_telegram_push/model"
)
const PLUGIN_NAME = "telegram_push"
type PmailTelegramPushHook struct {
bot *bot.Bot
pluginConfig pluginSettings
settings *settingStore
}
func NewPmailTelegramPushHook() *PmailTelegramPushHook {
return &PmailTelegramPushHook{settings: newSettingStore()}
}
var _ framework.EmailHook = (*PmailTelegramPushHook)(nil)
var _ framework.CapabilityProvider = (*PmailTelegramPushHook)(nil)
var _ framework.ConfigurableHook = (*PmailTelegramPushHook)(nil)
var _ framework.UserSettingsConfigurer = (*PmailTelegramPushHook)(nil)
var _ framework.BotInfoProvider = (*PmailTelegramPushHook)(nil)
var _ framework.TestMessageProvider = (*PmailTelegramPushHook)(nil)
func (h *PmailTelegramPushHook) Capabilities() framework.Capabilities {
return framework.Capabilities{
PluginID: PLUGIN_NAME,
Capabilities: []string{"network", "userSettings", "settingsHtml"},
Settings: []string{"proxy", "timeout", "debug", "webDomain", "httpsEnabled"},
Protocol: 1,
}
}
func (h *PmailTelegramPushHook) ValidateConfig(data json.RawMessage) error {
_, _, _, err := parseRuntimeConfig(data)
return err
}
func (h *PmailTelegramPushHook) Configure(data json.RawMessage) error {
_, settings, token, err := parseRuntimeConfig(data)
if err != nil {
return err
}
newBot, err := NewBot(settings, token)
if err != nil {
return errors.New("Telegram Bot 初始化失败")
}
h.pluginConfig = settings
h.bot = newBot
return nil
}
func (h *PmailTelegramPushHook) Health() error {
if h.bot == nil {
return errors.New("Telegram Bot 尚未配置")
}
return nil
}
func (h *PmailTelegramPushHook) GetName(ctx *context.Context) string {
return PLUGIN_NAME
}
func (h *PmailTelegramPushHook) ReceiveSaveAfter(ctx *context.Context, email *parsemail.Email, ue []*models.UserEmail) {
if h.bot == nil || email == nil || email.MessageId <= 0 {
return
}
for _, userEmail := range ue {
if userEmail == nil || userEmail.IsRead != 0 || userEmail.Status != 0 {
continue
}
setting := h.settings.get(userEmail.UserID)
if setting.ChatID == "" {
continue
}
telegramSettingModel := &telegrammodel.TelegramPushSetting{
ChatID: setting.ChatID,
ShowContent: setting.ShowContent,
SpoilerContent: setting.SpoilerContent,
SendAttachments: setting.SendAttachments,
DisableLinkPreview: setting.DisableLinkPreview,
}
if err := h.sendNotification(email, telegramSettingModel); err != nil {
logger.PluginLogger.Error().Err(err).Int64("email_message_id", email.MessageId).Msg("发送通知失败")
}
}
}
func (h *PmailTelegramPushHook) ReceiveParseBefore(ctx *context.Context, email *[]byte) {}
func (h *PmailTelegramPushHook) ReceiveParseAfter(ctx *context.Context, email *parsemail.Email) {}
func (h *PmailTelegramPushHook) SendAfter(ctx *context.Context, email *parsemail.Email, err map[string]error) {
}
func (h *PmailTelegramPushHook) SendBefore(ctx *context.Context, email *parsemail.Email) {}
func (h *PmailTelegramPushHook) SettingsHtml(ctx *context.Context, url string, requestData string) string {
if ctx == nil {
return ErrorResponse("用户上下文无效").Json()
}
switch {
case strings.Contains(url, "getSetting"):
return h.getSetting(ctx.UserID)
case strings.Contains(url, "getBotInfo"):
return h.getBotInfo()
case strings.Contains(url, "updateSetting"):
return h.updateSetting(ctx.UserID, requestData)
case strings.Contains(url, "testMessage"):
return h.testMessage(ctx.UserID, requestData)
default:
return settingPage()
}
}