Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
7a6f135487
|
4
bot.go
4
bot.go
@@ -251,9 +251,7 @@ func (b *Bot) Run() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := &MsgContext{
|
ctx := &MsgContext{Bot: b, Update: u}
|
||||||
Bot: b, Update: u,
|
|
||||||
}
|
|
||||||
for _, middleware := range b.middlewares {
|
for _, middleware := range b.middlewares {
|
||||||
middleware.Execute(ctx, b.dbContext)
|
middleware.Execute(ctx, b.dbContext)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ func (b *Bot) handleMessage(update *Update, ctx *MsgContext) {
|
|||||||
ctx.Text = strings.TrimSpace(text[len(cmd):])
|
ctx.Text = strings.TrimSpace(text[len(cmd):])
|
||||||
ctx.Args = strings.Split(ctx.Text, " ")
|
ctx.Args = strings.Split(ctx.Text, " ")
|
||||||
|
|
||||||
|
if !plugin.executeMiddlewares(ctx, b.dbContext) {
|
||||||
|
return
|
||||||
|
}
|
||||||
go plugin.Execute(cmd, ctx, b.dbContext)
|
go plugin.Execute(cmd, ctx, b.dbContext)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -65,6 +68,10 @@ func (b *Bot) handleCallback(update *Update, ctx *MsgContext) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !plugin.executeMiddlewares(ctx, b.dbContext) {
|
||||||
|
return
|
||||||
|
}
|
||||||
go plugin.ExecutePayload(data.Command, ctx, b.dbContext)
|
go plugin.ExecutePayload(data.Command, ctx, b.dbContext)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
60
plugins.go
60
plugins.go
@@ -1,6 +1,10 @@
|
|||||||
package laniakea
|
package laniakea
|
||||||
|
|
||||||
import "log"
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"git.nix13.pw/scuroneko/extypes"
|
||||||
|
)
|
||||||
|
|
||||||
type CommandExecutor func(ctx *MsgContext, dbContext *DatabaseContext)
|
type CommandExecutor func(ctx *MsgContext, dbContext *DatabaseContext)
|
||||||
|
|
||||||
@@ -9,6 +13,7 @@ type PluginBuilder struct {
|
|||||||
commands map[string]*CommandExecutor
|
commands map[string]*CommandExecutor
|
||||||
payloads map[string]*CommandExecutor
|
payloads map[string]*CommandExecutor
|
||||||
updateListener *CommandExecutor
|
updateListener *CommandExecutor
|
||||||
|
middlewares extypes.Slice[*PluginMiddleware]
|
||||||
}
|
}
|
||||||
|
|
||||||
type Plugin struct {
|
type Plugin struct {
|
||||||
@@ -16,6 +21,7 @@ type Plugin struct {
|
|||||||
Commands map[string]*CommandExecutor
|
Commands map[string]*CommandExecutor
|
||||||
Payloads map[string]*CommandExecutor
|
Payloads map[string]*CommandExecutor
|
||||||
UpdateListener *CommandExecutor
|
UpdateListener *CommandExecutor
|
||||||
|
Middlewares extypes.Slice[*PluginMiddleware]
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPlugin(name string) *PluginBuilder {
|
func NewPlugin(name string) *PluginBuilder {
|
||||||
@@ -45,6 +51,11 @@ func (p *PluginBuilder) UpdateListener(listener CommandExecutor) *PluginBuilder
|
|||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *PluginBuilder) Middleware(middleware *PluginMiddleware) *PluginBuilder {
|
||||||
|
p.middlewares = p.middlewares.Push(middleware)
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
func (p *PluginBuilder) Build() Plugin {
|
func (p *PluginBuilder) Build() Plugin {
|
||||||
if len(p.commands) == 0 && len(p.payloads) == 0 {
|
if len(p.commands) == 0 && len(p.payloads) == 0 {
|
||||||
log.Println("no command or payloads")
|
log.Println("no command or payloads")
|
||||||
@@ -54,6 +65,7 @@ func (p *PluginBuilder) Build() Plugin {
|
|||||||
Commands: p.commands,
|
Commands: p.commands,
|
||||||
Payloads: p.payloads,
|
Payloads: p.payloads,
|
||||||
UpdateListener: p.updateListener,
|
UpdateListener: p.updateListener,
|
||||||
|
Middlewares: p.middlewares,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,6 +77,15 @@ func (p *Plugin) ExecutePayload(payload string, ctx *MsgContext, dbContext *Data
|
|||||||
(*p.Payloads[payload])(ctx, dbContext)
|
(*p.Payloads[payload])(ctx, dbContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Plugin) executeMiddlewares(ctx *MsgContext, db *DatabaseContext) bool {
|
||||||
|
for _, m := range p.Middlewares {
|
||||||
|
if !m.Execute(ctx, db) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
type Middleware struct {
|
type Middleware struct {
|
||||||
Name string
|
Name string
|
||||||
Executor CommandExecutor
|
Executor CommandExecutor
|
||||||
@@ -78,8 +99,8 @@ type MiddlewareBuilder struct {
|
|||||||
async bool
|
async bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMiddleware(name string) *MiddlewareBuilder {
|
func NewMiddleware(name string, executor CommandExecutor) *MiddlewareBuilder {
|
||||||
return &MiddlewareBuilder{name: name, async: false}
|
return &MiddlewareBuilder{name: name, executor: executor, order: 0, async: false}
|
||||||
}
|
}
|
||||||
func (m *MiddlewareBuilder) SetName(name string) *MiddlewareBuilder {
|
func (m *MiddlewareBuilder) SetName(name string) *MiddlewareBuilder {
|
||||||
m.name = name
|
m.name = name
|
||||||
@@ -112,3 +133,36 @@ func (m Middleware) Execute(ctx *MsgContext, db *DatabaseContext) {
|
|||||||
m.Execute(ctx, db)
|
m.Execute(ctx, db)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PluginMiddlewareExecutor func(ctx *MsgContext, db *DatabaseContext) bool
|
||||||
|
|
||||||
|
// PluginMiddleware
|
||||||
|
// When async, returned value ignored
|
||||||
|
type PluginMiddleware struct {
|
||||||
|
executor PluginMiddlewareExecutor
|
||||||
|
order int
|
||||||
|
async bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPluginMiddleware(executor PluginMiddlewareExecutor) *PluginMiddleware {
|
||||||
|
return &PluginMiddleware{
|
||||||
|
executor: executor,
|
||||||
|
order: 0,
|
||||||
|
async: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (m *PluginMiddleware) SetOrder(order int) *PluginMiddleware {
|
||||||
|
m.order = order
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
func (m *PluginMiddleware) SetAsync(async bool) *PluginMiddleware {
|
||||||
|
m.async = async
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
func (m *PluginMiddleware) Execute(ctx *MsgContext, db *DatabaseContext) bool {
|
||||||
|
if m.async {
|
||||||
|
go m.executor(ctx, db)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return m.executor(ctx, db)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user