71 lines
2.4 KiB
Go
71 lines
2.4 KiB
Go
package libgm
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
|
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
|
)
|
|
|
|
func (r *RPC) HandleRPCMsg(msgArr []interface{}) {
|
|
/*
|
|
if data[0] == 44 { // ','
|
|
data = data[1:]
|
|
}
|
|
|
|
var msgArr []interface{}
|
|
err := r.tryUnmarshalJSON(data, &msgArr)
|
|
if err != nil {
|
|
r.client.Logger.Error().Err(fmt.Errorf("got invalid json string %s", string(data))).Msg("rpc msg err")
|
|
r.HandleByLength(data)
|
|
return
|
|
}
|
|
*/
|
|
response := &binary.RPCResponse{}
|
|
deserializeErr := pblite.Deserialize(msgArr, response.ProtoReflect())
|
|
if deserializeErr != nil {
|
|
r.client.Logger.Error().Err(deserializeErr).Msg("meow")
|
|
r.client.Logger.Error().Err(fmt.Errorf("failed to deserialize response %s", msgArr)).Msg("rpc deserialize msg err")
|
|
return
|
|
}
|
|
//r.client.Logger.Debug().Any("byteLength", len(data)).Any("unmarshaled", response).Any("raw", string(data)).Msg("RPC Msg")
|
|
if response.Data == nil {
|
|
r.client.Logger.Error().Err(fmt.Errorf("Response data was nil %s", msgArr)).Msg("rpc msg data err")
|
|
return
|
|
}
|
|
if response.Data.RoutingOpCode == 19 {
|
|
parsedResponse, failedParse := r.client.sessionHandler.NewResponse(response)
|
|
if failedParse != nil {
|
|
panic(failedParse)
|
|
}
|
|
//hasBody := parsedResponse.Data.EncryptedData == nil
|
|
//r.client.Logger.Info().Any("msgData", parsedResponse).Msg("Got event!")
|
|
r.client.sessionHandler.addResponseAck(parsedResponse.ResponseID)
|
|
_, waitingForResponse := r.client.sessionHandler.requests[parsedResponse.Data.RequestID]
|
|
//log.Println(fmt.Sprintf("%v %v %v %v %v %v %v", parsedResponse.RoutingOpCode, parsedResponse.Data.Opcode, parsedResponse.Data.Sub, parsedResponse.Data.Third, parsedResponse.Data.Field9, hasBody, waitingForResponse))
|
|
//r.client.Logger.Debug().Any("waitingForResponse?", waitingForResponse).Msg("Got rpc response from server")
|
|
if parsedResponse.Data.Opcode == 16 || waitingForResponse {
|
|
if waitingForResponse {
|
|
r.client.sessionHandler.respondToRequestChannel(parsedResponse)
|
|
return
|
|
}
|
|
if parsedResponse.Data.Opcode == 16 {
|
|
r.client.handleEventOpCode(parsedResponse)
|
|
}
|
|
} else {
|
|
|
|
}
|
|
} else {
|
|
r.client.handleSeperateOpCode(response.Data)
|
|
}
|
|
}
|
|
|
|
func (r *RPC) tryUnmarshalJSON(jsonData []byte, msgArr *[]interface{}) error {
|
|
err := json.Unmarshal(jsonData, &msgArr)
|
|
return err
|
|
}
|
|
|
|
func (r *RPC) HandleByLength(data []byte) {
|
|
r.client.Logger.Debug().Any("byteLength", len(data)).Any("corrupt raw", string(data)).Msg("RPC Corrupt json")
|
|
}
|