From 5fe43f81034ab069fc5d67e2905017011ad6ab6a Mon Sep 17 00:00:00 2001 From: Max Date: Tue, 25 Feb 2025 16:11:53 +0800 Subject: [PATCH] Enhance JavaScript bridge argument handling in assistant method calls - Add support for passing additional arguments to callback functions - Implement flexible argument parsing for JavaScript method calls - Handle both array and single argument scenarios - Update method signature to accommodate optional arguments --- neo/assistant/object.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/neo/assistant/object.go b/neo/assistant/object.go index af1eb9fc..9a0e36d9 100644 --- a/neo/assistant/object.go +++ b/neo/assistant/object.go @@ -186,6 +186,31 @@ func jsCall(info *v8go.FunctionCallbackInfo) *v8go.Value { var cb func(msg *chatMessage.Message) = nil if len(args) > 2 { + // Rest args + var jsArgs *v8go.Value + if len(args) > 3 { + jsArgs = args[3] + } + + goArgs := []interface{}{} + if jsArgs.IsArray() { + v, err := bridge.GoValue(jsArgs, info.Context()) + if err != nil { + return bridge.JsException(info.Context(), err.Error()) + } + arr, ok := v.([]interface{}) + if !ok { + return bridge.JsException(info.Context(), "Invalid arguments") + } + goArgs = arr + } else { + v, err := bridge.GoValue(jsArgs, info.Context()) + if err != nil { + return bridge.JsException(info.Context(), err.Error()) + } + goArgs = []interface{}{v} + } + // Parse the callback funcType := "method" name := "" @@ -219,6 +244,7 @@ func jsCall(info *v8go.FunctionCallbackInfo) *v8go.Value { source := args[2].String() cb = func(msg *chatMessage.Message) { cbArgs := []interface{}{msg} + cbArgs = append(cbArgs, goArgs...) ctx, err := global.Assistant.Script.NewContext(global.ChatContext.Sid, nil) if err != nil { fmt.Println("Failed to create context", err.Error()) @@ -283,8 +309,8 @@ func jsCall(info *v8go.FunctionCallbackInfo) *v8go.Value { // Parse the options options := map[string]interface{}{} - if len(args) > 3 { - optionsRaw, err := bridge.GoValue(args[3], info.Context()) + if len(args) > 4 { + optionsRaw, err := bridge.GoValue(args[4], info.Context()) if err != nil { return bridge.JsException(info.Context(), err.Error()) }