5 Commits
v0.3.9 ... main

Author SHA1 Message Date
5f17b88787 Merge pull request 'v0.3.10' (#7) from dev into main
Reviewed-on: #7
2026-02-04 17:33:51 +03:00
7a6f135487 plugin middlewares; v0.3.10 2026-02-04 17:27:36 +03:00
6d6f5738cd Merge pull request 'v0.3.2' (#3) from dev into main
Reviewed-on: #3
2026-01-29 11:47:29 +03:00
fef718438a v0.3.0 2026-01-29 09:51:50 +03:00
7f248fff62 fix 2025-11-05 11:38:09 +03:00
3 changed files with 65 additions and 6 deletions

4
bot.go
View File

@@ -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)
} }

View File

@@ -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
} }

View File

@@ -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)
}