|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package extension |
|
|
|
import ( |
|
"encoding/json" |
|
"fmt" |
|
"strconv" |
|
|
|
"ten_framework/ten" |
|
) |
|
|
|
|
|
|
|
type ColllectorMessage struct { |
|
Text string `json:"text"` |
|
IsFinal bool `json:"is_final"` |
|
StreamID int32 `json:"stream_id"` |
|
Type string `json:"data_type"` |
|
Ts uint64 `json:"text_ts"` |
|
} |
|
|
|
|
|
|
|
type Message struct { |
|
Text string `json:"text"` |
|
IsFinal bool `json:"is_final"` |
|
StreamID string `json:"stream_id"` |
|
Type string `json:"type"` |
|
Ts uint64 `json:"ts"` |
|
} |
|
|
|
|
|
|
|
type RtcUserSate struct { |
|
RemoteUserID string `json:"remote_user_id"` |
|
State string `json:"state"` |
|
Reason string `json:"reason"` |
|
} |
|
|
|
type agoraRtmWrapperExtension struct { |
|
ten.DefaultExtension |
|
} |
|
|
|
func newExtension(name string) ten.Extension { |
|
return &agoraRtmWrapperExtension{} |
|
} |
|
|
|
|
|
func (p *agoraRtmWrapperExtension) OnData( |
|
tenEnv ten.TenEnv, |
|
data ten.Data, |
|
) { |
|
buf, err := data.GetPropertyBytes("data") |
|
if err != nil { |
|
tenEnv.LogError("OnData GetProperty data error: " + err.Error()) |
|
return |
|
} |
|
tenEnv.LogInfo("AGORA_RTM_WRAPPER_EXTENSION OnData: " + string(buf)) |
|
colllectorMessage := ColllectorMessage{} |
|
err = json.Unmarshal(buf, &colllectorMessage) |
|
if err != nil { |
|
tenEnv.LogError("OnData Unmarshal data error: " + err.Error()) |
|
return |
|
} |
|
|
|
message := Message{ |
|
Text: colllectorMessage.Text, |
|
IsFinal: colllectorMessage.IsFinal, |
|
StreamID: strconv.Itoa(int(colllectorMessage.StreamID)), |
|
Type: colllectorMessage.Type, |
|
Ts: colllectorMessage.Ts, |
|
} |
|
jsonBytes, err := json.Marshal(message) |
|
if err != nil { |
|
tenEnv.LogError("failed to marshal JSON: " + err.Error()) |
|
return |
|
} |
|
tenEnv.LogInfo("AGORA_RTM_WRAPPER_EXTENSION OnData: " + string(jsonBytes)) |
|
|
|
cmd, _ := ten.NewCmd("publish") |
|
|
|
err = cmd.SetPropertyBytes("message", jsonBytes) |
|
if err != nil { |
|
tenEnv.LogError("failed to set property message: " + err.Error()) |
|
return |
|
} |
|
if err := tenEnv.SendCmd(cmd, func(_ ten.TenEnv, result ten.CmdResult, _ error) { |
|
status, err := result.GetStatusCode() |
|
tenEnv.LogInfo(fmt.Sprintf("AGORA_RTM_WRAPPER_EXTENSION publish result %d", status)) |
|
if status != ten.StatusCodeOk || err != nil { |
|
tenEnv.LogError("failed to subscribe") |
|
} |
|
}); err != nil { |
|
tenEnv.LogError("failed to send command " + err.Error()) |
|
} |
|
} |
|
|
|
func (p *agoraRtmWrapperExtension) OnCmd(tenEnv ten.TenEnv, cmd ten.Cmd) { |
|
defer func() { |
|
if r := recover(); r != nil { |
|
tenEnv.LogError(fmt.Sprintf("OnCmd panic: %v", r)) |
|
} |
|
cmdResult, err := ten.NewCmdResult(ten.StatusCodeOk) |
|
if err != nil { |
|
tenEnv.LogError(fmt.Sprintf("failed to create cmd result: %v", err)) |
|
return |
|
} |
|
tenEnv.ReturnResult(cmdResult, cmd, nil) |
|
}() |
|
cmdName, err := cmd.GetName() |
|
if err != nil { |
|
tenEnv.LogError(fmt.Sprintf("failed to get cmd name: %v", err)) |
|
return |
|
} |
|
tenEnv.LogInfo(fmt.Sprintf("received command: %s", cmdName)) |
|
switch cmdName { |
|
case "on_user_audio_track_state_changed": |
|
|
|
p.handleUserStateChanged(tenEnv, cmd) |
|
default: |
|
tenEnv.LogWarn(fmt.Sprintf("unsupported cmd: %s", cmdName)) |
|
} |
|
} |
|
|
|
func (p *agoraRtmWrapperExtension) handleUserStateChanged(tenEnv ten.TenEnv, cmd ten.Cmd) { |
|
remoteUserID, err := cmd.GetPropertyString("remote_user_id") |
|
if err != nil { |
|
tenEnv.LogError(fmt.Sprintf("failed to get remote_user_id: %v", err)) |
|
return |
|
} |
|
state, err := cmd.GetPropertyInt32("state") |
|
if err != nil { |
|
tenEnv.LogError(fmt.Sprintf("failed to get state: %v", err)) |
|
return |
|
} |
|
reason, err := cmd.GetPropertyInt32("reason") |
|
if err != nil { |
|
tenEnv.LogError(fmt.Sprintf("failed to get reason: %v", err)) |
|
return |
|
} |
|
userState := RtcUserSate{ |
|
RemoteUserID: remoteUserID, |
|
State: strconv.Itoa(int(state)), |
|
Reason: strconv.Itoa(int(reason)), |
|
} |
|
jsonBytes, err := json.Marshal(userState) |
|
if err != nil { |
|
tenEnv.LogError("failed to marshal JSON: " + err.Error()) |
|
return |
|
} |
|
sendCmd, _ := ten.NewCmd("set_presence_state") |
|
sendCmd.SetPropertyString("states", string(jsonBytes)) |
|
tenEnv.LogInfo("AGORA_RTM_WRAPPER_EXTENSION SetRtmPresenceState " + string(jsonBytes)) |
|
if err := tenEnv.SendCmd(sendCmd, func(_ ten.TenEnv, result ten.CmdResult, _ error) { |
|
status, err := result.GetStatusCode() |
|
tenEnv.LogInfo(fmt.Sprintf("AGORA_RTM_WRAPPER_EXTENSION SetRtmPresenceState result %d", status)) |
|
if status != ten.StatusCodeOk || err != nil { |
|
panic("failed to SetRtmPresenceState") |
|
} |
|
}); err != nil { |
|
tenEnv.LogError("failed to send command " + err.Error()) |
|
} |
|
} |
|
|
|
func init() { |
|
|
|
ten.RegisterAddonAsExtension( |
|
"agora_rtm_wrapper", |
|
ten.NewDefaultExtensionAddon(newExtension), |
|
) |
|
} |
|
|