diff --git a/bot.go b/bot.go index f17db42..930c61c 100644 --- a/bot.go +++ b/bot.go @@ -233,7 +233,6 @@ func (b *Bot) Run() { return } - b.logger.Infoln("Executing runners...") b.ExecRunners() b.logger.Infoln("Bot running. Press CTRL+C to exit.") @@ -247,33 +246,17 @@ func (b *Bot) Run() { }() for { - queue := b.updateQueue - if queue.IsEmpty() { + if b.updateQueue.IsEmpty() { time.Sleep(time.Millisecond * 25) continue } - u := queue.Dequeue() + u := b.updateQueue.Dequeue() if u == nil { b.logger.Errorln("update is nil") continue } - ctx := &MsgContext{Bot: b, Update: u, Api: b.api} - for _, middleware := range b.middlewares { - middleware.Execute(ctx, b.dbContext) - } - - for _, plugin := range b.plugins { - if plugin.UpdateListener != nil { - (*plugin.UpdateListener)(ctx, b.dbContext) - } - } - - if u.CallbackQuery != nil { - b.handleCallback(u, ctx) - } else { - b.handleMessage(u, ctx) - } + b.handle(u) } } diff --git a/handler.go b/handler.go index 487843d..030fe3c 100644 --- a/handler.go +++ b/handler.go @@ -5,6 +5,19 @@ import ( "strings" ) +func (b *Bot) handle(u *Update) { + ctx := &MsgContext{Bot: b, Update: u, Api: b.api} + for _, middleware := range b.middlewares { + middleware.Execute(ctx, b.dbContext) + } + + if u.CallbackQuery != nil { + b.handleCallback(u, ctx) + } else { + b.handleMessage(u, ctx) + } +} + func (b *Bot) handleMessage(update *Update, ctx *MsgContext) { if update.Message == nil { return @@ -30,7 +43,6 @@ func (b *Bot) handleMessage(update *Update, ctx *MsgContext) { text = strings.TrimSpace(text[len(prefix):]) for _, plugin := range b.plugins { - // Check every command for cmd := range plugin.Commands { if !strings.HasPrefix(text, cmd) { continue diff --git a/plugins.go b/plugins.go index 945bbc3..d6768f9 100644 --- a/plugins.go +++ b/plugins.go @@ -9,49 +9,42 @@ import ( type CommandExecutor func(ctx *MsgContext, dbContext *DatabaseContext) type PluginBuilder struct { - name string - commands map[string]*CommandExecutor - payloads map[string]*CommandExecutor - updateListener *CommandExecutor - middlewares extypes.Slice[*PluginMiddleware] + name string + commands map[string]CommandExecutor + payloads map[string]CommandExecutor + middlewares extypes.Slice[*PluginMiddleware] } type Plugin struct { - Name string - Commands map[string]*CommandExecutor - Payloads map[string]*CommandExecutor - UpdateListener *CommandExecutor - Middlewares extypes.Slice[*PluginMiddleware] + Name string + Commands map[string]CommandExecutor + Payloads map[string]CommandExecutor + Middlewares extypes.Slice[*PluginMiddleware] } func NewPlugin(name string) *PluginBuilder { return &PluginBuilder{ name: name, - commands: make(map[string]*CommandExecutor), - payloads: make(map[string]*CommandExecutor), + commands: make(map[string]CommandExecutor), + payloads: make(map[string]CommandExecutor), } } func (p *PluginBuilder) Command(f CommandExecutor, cmd ...string) *PluginBuilder { for _, c := range cmd { - p.commands[c] = &f + p.commands[c] = f } return p } func (p *PluginBuilder) Payload(f CommandExecutor, payloads ...string) *PluginBuilder { for _, payload := range payloads { - p.payloads[payload] = &f + p.payloads[payload] = f } return p } -func (p *PluginBuilder) UpdateListener(listener CommandExecutor) *PluginBuilder { - p.updateListener = &listener - return p -} - -func (p *PluginBuilder) Middleware(middleware *PluginMiddleware) *PluginBuilder { +func (p *PluginBuilder) AddMiddleware(middleware *PluginMiddleware) *PluginBuilder { p.middlewares = p.middlewares.Push(middleware) return p } @@ -61,20 +54,17 @@ func (p *PluginBuilder) Build() Plugin { log.Printf("no command or payloads for %s", p.name) } return Plugin{ - Name: p.name, - Commands: p.commands, - Payloads: p.payloads, - UpdateListener: p.updateListener, - Middlewares: p.middlewares, + p.name, p.commands, + p.payloads, p.middlewares, } } func (p *Plugin) Execute(cmd string, ctx *MsgContext, dbContext *DatabaseContext) { - (*p.Commands[cmd])(ctx, dbContext) + (p.Commands[cmd])(ctx, dbContext) } func (p *Plugin) ExecutePayload(payload string, ctx *MsgContext, dbContext *DatabaseContext) { - (*p.Payloads[payload])(ctx, dbContext) + (p.Payloads[payload])(ctx, dbContext) } func (p *Plugin) executeMiddlewares(ctx *MsgContext, db *DatabaseContext) bool { @@ -102,14 +92,6 @@ type MiddlewareBuilder struct { func NewMiddleware(name string, executor CommandExecutor) *MiddlewareBuilder { return &MiddlewareBuilder{name: name, executor: executor, order: 0, async: false} } -func (m *MiddlewareBuilder) SetName(name string) *MiddlewareBuilder { - m.name = name - return m -} -func (m *MiddlewareBuilder) SetExecutor(executor CommandExecutor) *MiddlewareBuilder { - m.executor = executor - return m -} func (m *MiddlewareBuilder) SetOrder(order int) *MiddlewareBuilder { m.order = order return m diff --git a/runners.go b/runners.go index 64988ec..488a008 100644 --- a/runners.go +++ b/runners.go @@ -44,6 +44,7 @@ func (b *RunnerBuilder) Build() Runner { } func (b *Bot) ExecRunners() { + b.logger.Infoln("Executing runners...") for _, runner := range b.runners { if !runner.Onetime && !runner.Async { b.logger.Warnf("Runner %s not onetime, but sync\n", runner.Name)