ICommand增加配置方法,支持覆盖全局配置

This commit is contained in:
白茶清欢 2021-04-17 15:04:43 +08:00
parent 18e1719e86
commit c26624befb
5 changed files with 97 additions and 3 deletions

View File

@ -7,7 +7,10 @@
// Date : 2021-03-27 6:34 下午
package abstract
import "github.com/go-developer/websocket/context"
import (
"github.com/go-developer/websocket/config"
"github.com/go-developer/websocket/context"
)
// ICommand 指令
//
@ -21,6 +24,12 @@ type ICommand interface {
//
// Date : 7:21 下午 2021/3/27
GetCommand() string
// GetConfigOption 获取指令的配置
//
// Author : go_developer@163.com<张德满>
//
// Date : 2:49 下午 2021/4/17
GetConfigOption() []config.SetCommandConfig
// Execute 执行指令的逻辑
//
// Author : go_developer@163.com<张德满>

46
config/command.go Normal file
View File

@ -0,0 +1,46 @@
// Package config ...
//
// Description : WS-Command 相关配置
//
// Author : go_developer@163.com<张德满>
//
// Date : 2021-04-17 2:34 下午
package config
// commandConfig 指令相关配置
//
// Author : go_developer@163.com<张德满>
//
// Date : 2:36 下午 2021/4/17
type CommandConfig struct {
PushMessageWithError bool // 当调度指令时,指令执行错误,是否想客户端推送错误消息
}
// SetCommandConfig 设置command配置
type SetCommandConfig func(cc *CommandConfig)
// ClosePushCommandErrorMessage 关闭指令执行异常时的消息推送
//
// Author : go_developer@163.com<张德满>
//
// Date : 2:51 下午 2021/4/17
func ClosePushCommandErrorMessage() SetCommandConfig {
return func(cc *CommandConfig) {
cc.PushMessageWithError = false
}
}
// NewCommandConfig 指令的配置
//
// Author : go_developer@163.com<张德满>
//
// Date : 2:39 下午 2021/4/17
func NewCommandConfig(optionFunc ...SetCommandConfig) *CommandConfig {
cc := &CommandConfig{
PushMessageWithError: true, // 默认推送异常消息
}
for _, o := range optionFunc {
o(cc)
}
return cc
}

8
config/server.go Normal file
View File

@ -0,0 +1,8 @@
// Package config ...
//
// Description : WS-Server 相关配置
//
// Author : go_developer@163.com<张德满>
//
// Date : 2021-04-17 2:32 下午
package config

View File

@ -11,6 +11,10 @@ import (
"fmt"
"sync"
"github.com/go-developer/websocket/message"
"github.com/go-developer/websocket/config"
"github.com/tidwall/gjson"
"github.com/go-developer/websocket/storage"
@ -154,10 +158,31 @@ func dispatchCommand(ctx *context.WSContext, data []byte) error {
}
cmd := gjson.Get(string(data), "command").String()
if _, exist := commandTable[ctx.Flag][cmd]; !exist {
var (
exist bool
cmdInstance abstract.ICommand
cmdConfig *config.CommandConfig
err error
)
if cmdInstance, exist = commandTable[ctx.Flag][cmd]; !exist {
return errors.WithStack(errors.New("【" + ctx.Flag + "】长连接模块未注册【" + cmd + "】指令"))
}
return commandTable[ctx.Flag][cmd].Execute(ctx, data)
optionList := cmdInstance.GetConfigOption()
if nil == optionList {
optionList = make([]config.SetCommandConfig, 0)
}
cmdConfig = config.NewCommandConfig(optionList...)
if err = cmdInstance.Execute(ctx, data); nil != err {
if cmdConfig.PushMessageWithError {
_ = message.Response(ctx, map[string]interface{}{
"command": cmd,
"message": err.Error(),
"success": false,
})
}
return err
}
return nil
}
func run() {

View File

@ -10,6 +10,8 @@ package main
import (
"fmt"
"github.com/go-developer/websocket/config"
"github.com/go-developer/websocket/message"
"github.com/go-developer/websocket"
@ -64,6 +66,10 @@ func (e exampleCommand) GetCommand() string {
return "ping"
}
func (e exampleCommand) GetConfigOption() []config.SetCommandConfig {
return []config.SetCommandConfig{config.ClosePushCommandErrorMessage()}
}
func (e exampleCommand) Execute(ctx *context.WSContext, data []byte) error {
message.Response(ctx, map[string]interface{}{"ping": "pong"})
return nil