1
0
mirror of https://github.com/fumiama/NanoBot.git synced 2026-06-06 03:00:24 +08:00
This commit is contained in:
源文雨
2023-10-16 00:26:04 +09:00
parent 6a1019d201
commit ce34c996ef
25 changed files with 2844 additions and 8 deletions

69
codegen/engine/engine.yml Normal file
View 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
View 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)
}
}
}