From 9220cf82aa7e47ba2a32e622f01b972dbce955ed Mon Sep 17 00:00:00 2001 From: mei Date: Wed, 29 Jul 2026 11:24:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(drivers):=20=E9=A5=AD=E7=A2=97=E8=AD=A6?= =?UTF-8?q?=E5=91=8A(WIP)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + drivers/dingtalk/runner.go | 2 - drivers/fwalert/fwalert.go | 21 ++++++++++ drivers/fwalert/model.go | 8 ++++ drivers/fwalert/ruleConfigCehcker.go | 62 ++++++++++++++++++++++++++++ drivers/fwalert/runner.go | 29 +++++++++++++ handler/runner/interface.go | 2 + internal/ruleConfigChecker/reg.go | 2 + 8 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 drivers/fwalert/fwalert.go create mode 100644 drivers/fwalert/model.go create mode 100644 drivers/fwalert/ruleConfigCehcker.go create mode 100644 drivers/fwalert/runner.go diff --git a/README.md b/README.md index 54a46d5..0dea3a1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # goodBaby v2 + ![GitHub go.mod Go version (subdirectory of monorepo)](https://img.shields.io/github/go-mod/go-version/ssdomei232/goodBaby) ![GitHub](https://img.shields.io/github/license/ssdomei232/goodBaby) ![GitHub tag (with filter)](https://img.shields.io/github/v/tag/ssdomei232/goodBaby) diff --git a/drivers/dingtalk/runner.go b/drivers/dingtalk/runner.go index 0f49e2a..5d0439f 100644 --- a/drivers/dingtalk/runner.go +++ b/drivers/dingtalk/runner.go @@ -9,8 +9,6 @@ import ( ) // DingTalkExecutor 钉钉机器人执行器 -// -// 之前只注册了校验器却没有执行器,导致钉钉规则可以创建但永远不会被执行。 type DingTalkExecutor struct{} func (e *DingTalkExecutor) GetType() string { diff --git a/drivers/fwalert/fwalert.go b/drivers/fwalert/fwalert.go new file mode 100644 index 0000000..20d3b42 --- /dev/null +++ b/drivers/fwalert/fwalert.go @@ -0,0 +1,21 @@ +package fwalert + +import ( + "fmt" + + "github.com/go-resty/resty/v2" +) + +// send 发送消息 +func send(config *FwAlertRuleConfig) error { + restyClient := resty.New() + req := restyClient.R() + resp, err := req.Execute("GET", config.WebhookURL+"?message="+config.Msg) + if err != nil { + return err + } + if resp.StatusCode() != 200 { + return fmt.Errorf("发送饭碗警告失败: %s", resp.Status()) + } + return nil +} diff --git a/drivers/fwalert/model.go b/drivers/fwalert/model.go new file mode 100644 index 0000000..7918dd6 --- /dev/null +++ b/drivers/fwalert/model.go @@ -0,0 +1,8 @@ +package fwalert + +const RuleTypeFwalert = "fwalert" + +type FwAlertRuleConfig struct { + WebhookURL string `json:"webhook_url"` + Msg string `json:"msg"` +} diff --git a/drivers/fwalert/ruleConfigCehcker.go b/drivers/fwalert/ruleConfigCehcker.go new file mode 100644 index 0000000..42d36a9 --- /dev/null +++ b/drivers/fwalert/ruleConfigCehcker.go @@ -0,0 +1,62 @@ +package fwalert + +import ( + "encoding/json" + "fmt" + "net/url" + + "github.com/ssdomei232/goodBaby/internal/meta" +) + +type FwalertRuleValidator struct{} + +func (v *FwalertRuleValidator) GetType() string { + return RuleTypeFwalert +} + +func (v *FwalertRuleValidator) Validate(configJSON string) error { + var config FwAlertRuleConfig + if err := json.Unmarshal([]byte(configJSON), &config); err != nil { + return fmt.Errorf("解析饭碗警告规则配置失败: %v", err) + } + + parsed, err := url.Parse(config.WebhookURL) + if err != nil { + return fmt.Errorf("饭碗警告规则配置中 webhook_url 格式不正确: %v", err) + } + if parsed.Scheme != "http" && parsed.Scheme != "https" { + return fmt.Errorf("饭碗警告规则配置中 webhook_url 必须是 HTTP 或 HTTPS URL") + } + + if config.Msg == "" { + return fmt.Errorf("饭碗警告规则配置中 msg 不能为空") + } + if len([]rune(config.Msg)) > 1000 { + return fmt.Errorf("饭碗警告内容过长") + } + + return nil +} + +func (v *FwalertRuleValidator) Meta() meta.RuleMeta { + return meta.RuleMeta{ + Type: RuleTypeFwalert, + Label: "发送饭碗警告", + Description: "触发时发送饭碗警告消息。", + Docs: "docs/fwalert-config.md", + AccountType: "", + Fields: []meta.Field{ + {Key: "webhook_url", Label: "Webhook URL", Type: meta.FieldString, Required: true, Help: "饭碗警告的触发地址", Placeholder: "https://fwalert.com/xxx-xxx-xxx-xxx-xxx"}, + {Key: "msg", Label: "消息内容", Type: meta.FieldTextarea, Required: true, Help: "最大长度 1000 个字符"}, + }, + } +} + +// ParseRuleConfig 解析饭碗警告规则配置 +func ParseRuleConfig(configJSON string) (*FwAlertRuleConfig, error) { + var config FwAlertRuleConfig + if err := json.Unmarshal([]byte(configJSON), &config); err != nil { + return nil, fmt.Errorf("解析饭碗警告规则配置失败: %v", err) + } + return &config, nil +} diff --git a/drivers/fwalert/runner.go b/drivers/fwalert/runner.go new file mode 100644 index 0000000..21149f8 --- /dev/null +++ b/drivers/fwalert/runner.go @@ -0,0 +1,29 @@ +package fwalert + +import ( + "context" + "log" + + "github.com/ssdomei232/goodBaby/internal/retry" + "github.com/ssdomei232/goodBaby/model" +) + +// FwalertExecutor 饭碗警告执行器 +type FwalertExecutor struct{} + +func (e *FwalertExecutor) GetType() string { + return RuleTypeFwalert +} + +func (e *FwalertExecutor) Execute(ctx context.Context, rule *model.Rule) error { + log.Printf("执行饭碗警告规则: %s (ID: %d)", rule.Name, rule.ID) + + config, err := ParseRuleConfig(rule.ConfigJson) + if err != nil { + return err + } + + return retry.Do(ctx, func() error { + return send(config) + }) +} diff --git a/handler/runner/interface.go b/handler/runner/interface.go index 6ad53ef..e052846 100644 --- a/handler/runner/interface.go +++ b/handler/runner/interface.go @@ -9,6 +9,7 @@ import ( "github.com/ssdomei232/goodBaby/drivers/bilibili" "github.com/ssdomei232/goodBaby/drivers/dingtalk" "github.com/ssdomei232/goodBaby/drivers/email" + "github.com/ssdomei232/goodBaby/drivers/fwalert" "github.com/ssdomei232/goodBaby/drivers/github" "github.com/ssdomei232/goodBaby/drivers/onebot" "github.com/ssdomei232/goodBaby/model" @@ -76,6 +77,7 @@ func InitExecutorRegistry() *ExecutorRegistry { registry.Register(&github.GithubMakeRepoPublicExecutor{}) registry.Register(&onebot.OneBotExecutor{}) registry.Register(&dingtalk.DingTalkExecutor{}) + registry.Register(&fwalert.FwalertExecutor{}) // 未来添加新规则类型时,在这里注册即可 globalExecutorRegistry = registry diff --git a/internal/ruleConfigChecker/reg.go b/internal/ruleConfigChecker/reg.go index a2af8b6..f3f6a8d 100644 --- a/internal/ruleConfigChecker/reg.go +++ b/internal/ruleConfigChecker/reg.go @@ -6,6 +6,7 @@ import ( "github.com/ssdomei232/goodBaby/drivers/bilibili" "github.com/ssdomei232/goodBaby/drivers/dingtalk" "github.com/ssdomei232/goodBaby/drivers/email" + "github.com/ssdomei232/goodBaby/drivers/fwalert" "github.com/ssdomei232/goodBaby/drivers/github" "github.com/ssdomei232/goodBaby/drivers/onebot" ) @@ -27,6 +28,7 @@ func InitValidatorRegistry() *ValidatorRegistry { r.Register(&onebot.OneBotRuleValidator{}) r.Register(&dingtalk.DingTalkRuleValidator{}) r.Register(&github.GithubMakeRepositoryPublicRuleValidator{}) + r.Register(&fwalert.FwalertRuleValidator{}) registry = r })