mirror of
https://github.com/fumiama/NanoBot.git
synced 2026-06-06 03:00:24 +08:00
finish
This commit is contained in:
69
codegen/engine/engine.yml
Normal file
69
codegen/engine/engine.yml
Normal file
@@ -0,0 +1,69 @@
|
||||
emptyon:
|
||||
- Message
|
||||
|
||||
- GuildCreate
|
||||
- GuildUpdate
|
||||
- GuildDelete
|
||||
- ChannelCreate
|
||||
- ChannelUpdate
|
||||
- ChannelDelete
|
||||
|
||||
- GuildMemberAdd
|
||||
- GuildMemberUpdate
|
||||
- GuildMemberRemove
|
||||
|
||||
- MessageCreate
|
||||
- MessageDelete
|
||||
|
||||
- MessageReactionAdd
|
||||
- MessageReactionRemove
|
||||
|
||||
- DirectMessageCreate
|
||||
- DirectMessageDelete
|
||||
|
||||
- OpenForumThreadCreate
|
||||
- OpenForumThreadUpdate
|
||||
- OpenForumThreadDelete
|
||||
- OpenForumPostCreate
|
||||
- OpenForumPostDelete
|
||||
- OpenForumReplyCreate
|
||||
- OpenForumReplyDelete
|
||||
|
||||
- AudioOrLiveChannelMemberEnter
|
||||
- AudioOrLiveChannelMemberExit
|
||||
|
||||
- MessageAuditPass
|
||||
- MessageAuditReject
|
||||
|
||||
- ForumThreadCreate
|
||||
- ForumThreadUpdate
|
||||
- ForumThreadDelete
|
||||
- ForumPostCreate
|
||||
- ForumPostDelete
|
||||
- ForumReplyCreate
|
||||
- ForumReplyDelete
|
||||
- ForumPublishAuditResult
|
||||
|
||||
- AudioStart
|
||||
- AudioFinish
|
||||
- AudioOnMic
|
||||
- AudioOffMic
|
||||
|
||||
- AtMessageCreate
|
||||
- PublicMessageDelete
|
||||
|
||||
ruleon:
|
||||
Message:
|
||||
- Message
|
||||
Rule:
|
||||
Prefix: [prefix, string]
|
||||
Suffix: [suffix, string]
|
||||
Command: [commands, string]
|
||||
Regex: [regexPattern, string]
|
||||
Keyword: [keyword, string]
|
||||
FullMatch: [src, string]
|
||||
FullMatchGroup: [src, "[]string"]
|
||||
KeywordGroup: [keywords, "[]string"]
|
||||
CommandGroup: [commands, "[]string"]
|
||||
PrefixGroup: [prefix, "[]string"]
|
||||
SuffixGroup: [suffix, "[]string"]
|
||||
114
codegen/engine/main.go
Normal file
114
codegen/engine/main.go
Normal file
@@ -0,0 +1,114 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
const head = `// Code generated by codegen/engine. DO NOT EDIT.
|
||||
|
||||
package nano
|
||||
`
|
||||
|
||||
const emptyon = `
|
||||
// On[Message] ...
|
||||
func (e *Engine) On[Message](rules ...Rule) *Matcher { return e.On("[Message]", rules...) }
|
||||
|
||||
// On[Message] ...
|
||||
func On[Message](rules ...Rule) *Matcher { return On("[Message]", rules...) }
|
||||
`
|
||||
|
||||
const ruleon = `
|
||||
// On[Message][Rule] ...
|
||||
func On[Message][Rule]([Name] [Type], rules ...Rule) *Matcher {
|
||||
return defaultEngine.On[Message][Rule]([Name], rules...)
|
||||
}
|
||||
|
||||
// On[Message][Rule] ...
|
||||
func (e *Engine) On[Message][Rule]([Name] [Type], rules ...Rule) *Matcher {
|
||||
matcher := &Matcher{
|
||||
Type: "[Message]",
|
||||
Rules: append([]Rule{[Rule]Rule([Name][...])}, rules...),
|
||||
Engine: e,
|
||||
}
|
||||
e.matchers = append(e.matchers, matcher)
|
||||
return StoreMatcher(matcher)
|
||||
}
|
||||
`
|
||||
|
||||
const ruleonshell = `
|
||||
// On[Message]Shell shell命令触发器
|
||||
func On[Message]Shell(command string, model interface{}, rules ...Rule) *Matcher {
|
||||
return defaultEngine.On[Message]Shell(command, model, rules...)
|
||||
}
|
||||
|
||||
// On[Message]Shell shell命令触发器
|
||||
func (e *Engine) On[Message]Shell(command string, model interface{}, rules ...Rule) *Matcher {
|
||||
matcher := &Matcher{
|
||||
Type: "[Message]",
|
||||
Rules: append([]Rule{ShellRule(command, model)}, rules...),
|
||||
Engine: e,
|
||||
}
|
||||
e.matchers = append(e.matchers, matcher)
|
||||
return StoreMatcher(matcher)
|
||||
}
|
||||
`
|
||||
|
||||
type config struct {
|
||||
EmptyOn []string `yaml:"emptyon"`
|
||||
RuleOn struct {
|
||||
Message []string `yaml:"Message"`
|
||||
Rule map[string][2]string `yaml:"Rule"`
|
||||
} `yaml:"ruleon"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
f, err := os.Create("engine_generated.go")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer f.Close()
|
||||
_, err = f.WriteString(head)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
ef, err := os.Open("codegen/engine/engine.yml")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer ef.Close()
|
||||
cfg := config{}
|
||||
err = yaml.NewDecoder(ef).Decode(&cfg)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for _, msg := range cfg.EmptyOn {
|
||||
_, err = f.WriteString(strings.ReplaceAll(emptyon, "[Message]", msg))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
for _, msg := range cfg.RuleOn.Message {
|
||||
for rule, x := range cfg.RuleOn.Rule {
|
||||
s := strings.ReplaceAll(ruleon, "[Message]", msg)
|
||||
s = strings.ReplaceAll(s, "[Rule]", rule)
|
||||
s = strings.ReplaceAll(s, "[Name]", x[0])
|
||||
s = strings.ReplaceAll(s, "[Type]", x[1])
|
||||
if strings.Contains(rule, "Group") {
|
||||
s = strings.ReplaceAll(s, "[...]", "...")
|
||||
} else {
|
||||
s = strings.ReplaceAll(s, "[...]", "")
|
||||
}
|
||||
_, err = f.WriteString(s)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
_, err = f.WriteString(strings.ReplaceAll(ruleonshell, "[Message]", msg))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user