guard non-send message actions by channel capability

This commit is contained in:
DBT
2026-02-24 09:14:43 +00:00
parent da862896e8
commit 3dd918d429
3 changed files with 29 additions and 0 deletions

View File

@@ -20,6 +20,11 @@ type Channel interface {
HealthCheck(ctx context.Context) error
}
// ActionCapable is an optional capability interface for channels that support non-send message actions.
type ActionCapable interface {
SupportsAction(action string) bool
}
type BaseChannel struct {
config interface{}
bus *bus.MessageBus

View File

@@ -9,6 +9,7 @@ package channels
import (
"context"
"fmt"
"strings"
"sync"
"clawgo/pkg/bus"
@@ -268,6 +269,20 @@ func (m *Manager) dispatchOutbound(ctx context.Context) {
continue
}
action := strings.ToLower(strings.TrimSpace(msg.Action))
if action == "" {
action = "send"
}
if action != "send" {
if ac, ok := channel.(ActionCapable); !ok || !ac.SupportsAction(action) {
logger.WarnCF("channels", "Channel does not support outbound action", map[string]interface{}{
logger.FieldChannel: msg.Channel,
"action": action,
})
continue
}
}
// Bound fan-out concurrency to prevent goroutine explosion under burst traffic.
m.dispatchSem <- struct{}{}
go func(c Channel, outbound bus.OutboundMessage) {

View File

@@ -41,6 +41,15 @@ type TelegramChannel struct {
handleWG sync.WaitGroup
}
func (c *TelegramChannel) SupportsAction(action string) bool {
switch strings.ToLower(strings.TrimSpace(action)) {
case "", "send", "edit", "delete", "react":
return true
default:
return false
}
}
func NewTelegramChannel(cfg config.TelegramConfig, bus *bus.MessageBus) (*TelegramChannel, error) {
bot, err := telego.NewBot(cfg.Token, telego.WithDefaultLogger(false, false))
if err != nil {