feat: add rate limiting and improve event handling
- Introduced rate limiting configuration in config.toml with options for enabling, requests per second (RPS), and burst capacity. - Enhanced event handling in the OneBot11 adapter to ignore messages sent by the bot itself. - Updated the dispatcher to register rate limit middleware based on configuration settings. - Refactored WebSocket message handling to support flexible JSON parsing and improved event type detection. - Removed deprecated echo plugin and associated tests to streamline the codebase.
This commit is contained in:
@@ -1,14 +1,15 @@
|
||||
package di
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"cellbot/internal/adapter/milky"
|
||||
"cellbot/internal/adapter/onebot11"
|
||||
"cellbot/internal/config"
|
||||
"cellbot/internal/engine"
|
||||
"cellbot/internal/plugins/echo"
|
||||
_ "cellbot/internal/plugins/echo" // 导入插件以触发 init 函数
|
||||
"cellbot/internal/protocol"
|
||||
"cellbot/pkg/net"
|
||||
"context"
|
||||
|
||||
"go.uber.org/fx"
|
||||
"go.uber.org/zap"
|
||||
@@ -41,8 +42,27 @@ func ProvideEventBus(logger *zap.Logger) *engine.EventBus {
|
||||
return engine.NewEventBus(logger, 10000)
|
||||
}
|
||||
|
||||
func ProvideDispatcher(eventBus *engine.EventBus, logger *zap.Logger) *engine.Dispatcher {
|
||||
return engine.NewDispatcher(eventBus, logger)
|
||||
func ProvideDispatcher(eventBus *engine.EventBus, logger *zap.Logger, cfg *config.Config) *engine.Dispatcher {
|
||||
dispatcher := engine.NewDispatcher(eventBus, logger)
|
||||
|
||||
// 注册限流中间件
|
||||
if cfg.Engine.RateLimit.Enabled {
|
||||
rateLimitMiddleware := engine.NewRateLimitMiddleware(
|
||||
logger,
|
||||
cfg.Engine.RateLimit.RPS,
|
||||
cfg.Engine.RateLimit.Burst,
|
||||
)
|
||||
dispatcher.RegisterMiddleware(rateLimitMiddleware)
|
||||
logger.Info("Rate limit middleware registered",
|
||||
zap.Int("rps", cfg.Engine.RateLimit.RPS),
|
||||
zap.Int("burst", cfg.Engine.RateLimit.Burst))
|
||||
}
|
||||
|
||||
return dispatcher
|
||||
}
|
||||
|
||||
func ProvidePluginRegistry(dispatcher *engine.Dispatcher, logger *zap.Logger) *engine.PluginRegistry {
|
||||
return engine.NewPluginRegistry(dispatcher, logger)
|
||||
}
|
||||
|
||||
func ProvideBotManager(logger *zap.Logger) *protocol.BotManager {
|
||||
@@ -129,10 +149,26 @@ func ProvideOneBot11Bots(cfg *config.Config, logger *zap.Logger, wsManager *net.
|
||||
return nil
|
||||
}
|
||||
|
||||
func ProvideEchoPlugin(logger *zap.Logger, botManager *protocol.BotManager, dispatcher *engine.Dispatcher) {
|
||||
echoPlugin := echo.NewEchoPlugin(logger, botManager)
|
||||
dispatcher.RegisterHandler(echoPlugin)
|
||||
logger.Info("Echo plugin registered")
|
||||
// LoadPlugins 加载所有插件
|
||||
func LoadPlugins(logger *zap.Logger, botManager *protocol.BotManager, registry *engine.PluginRegistry) {
|
||||
// 从全局注册表加载所有插件(通过 RegisterPlugin 注册的)
|
||||
plugins := engine.LoadAllPlugins(botManager, logger)
|
||||
for _, plugin := range plugins {
|
||||
registry.Register(plugin)
|
||||
}
|
||||
|
||||
// 加载所有通过 OnXXX().Handle() 注册的处理器(注入依赖)
|
||||
handlers := engine.LoadAllHandlers(botManager, logger)
|
||||
for _, handler := range handlers {
|
||||
registry.Register(handler)
|
||||
}
|
||||
|
||||
totalCount := len(plugins) + len(handlers)
|
||||
logger.Info("All plugins loaded",
|
||||
zap.Int("plugin_count", len(plugins)),
|
||||
zap.Int("handler_count", len(handlers)),
|
||||
zap.Int("total_count", totalCount),
|
||||
zap.Strings("plugins", engine.GetRegisteredPlugins()))
|
||||
}
|
||||
|
||||
var Providers = fx.Options(
|
||||
@@ -142,11 +178,12 @@ var Providers = fx.Options(
|
||||
ProvideLogger,
|
||||
ProvideEventBus,
|
||||
ProvideDispatcher,
|
||||
ProvidePluginRegistry,
|
||||
ProvideBotManager,
|
||||
ProvideWebSocketManager,
|
||||
ProvideServer,
|
||||
),
|
||||
fx.Invoke(ProvideMilkyBots),
|
||||
fx.Invoke(ProvideOneBot11Bots),
|
||||
fx.Invoke(ProvideEchoPlugin),
|
||||
fx.Invoke(LoadPlugins),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user