mirror of
https://github.com/aljazceru/signal-cli-rest-api.git
synced 2025-12-20 16:14:29 +01:00
Merge pull request #445 from kxait/jsonrpc_linkdevice
Link device in JSON-RPC mode
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -1053,7 +1054,59 @@ func (s *SignalClient) DeleteGroup(number string, groupId string) error {
|
|||||||
|
|
||||||
func (s *SignalClient) GetQrCodeLink(deviceName string, qrCodeVersion int) ([]byte, error) {
|
func (s *SignalClient) GetQrCodeLink(deviceName string, qrCodeVersion int) ([]byte, error) {
|
||||||
if s.signalCliMode == JsonRpc {
|
if s.signalCliMode == JsonRpc {
|
||||||
return []byte{}, errors.New(endpointNotSupportedInJsonRpcMode)
|
jsonRpc2Client, err := s.getJsonRpc2Client()
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type StartRequest struct{}
|
||||||
|
type Response struct {
|
||||||
|
DeviceLinkUri string `json:"deviceLinkUri"`
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := jsonRpc2Client.getRaw("startLink", nil, &StartRequest{})
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, errors.New("Couldn't create QR code: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var resp Response
|
||||||
|
err = json.Unmarshal([]byte(result), &resp)
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, errors.New("Couldn't create QR code: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
q, err := qrcode.NewWithForcedVersion(string(resp.DeviceLinkUri), qrCodeVersion, qrcode.Highest)
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, errors.New("Couldn't create QR code: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var png []byte
|
||||||
|
png, err = q.PNG(256)
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, errors.New("Couldn't create QR code: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
go (func() {
|
||||||
|
type FinishRequest struct {
|
||||||
|
DeviceLinkUri string `json:"deviceLinkUri"`
|
||||||
|
DeviceName string `json:"deviceName"`
|
||||||
|
}
|
||||||
|
|
||||||
|
req := FinishRequest{
|
||||||
|
DeviceLinkUri: resp.DeviceLinkUri,
|
||||||
|
DeviceName: deviceName,
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := jsonRpc2Client.getRaw("finishLink", nil, &req)
|
||||||
|
if err != nil {
|
||||||
|
log.Debug("Error linking device: ", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Debug("Linking device result: ", result)
|
||||||
|
s.signalCliApiConfig.Load(s.signalCliApiConfigPath)
|
||||||
|
})()
|
||||||
|
|
||||||
|
return png, nil
|
||||||
}
|
}
|
||||||
command := []string{"--config", s.signalCliConfig, "link", "-n", deviceName}
|
command := []string{"--config", s.signalCliConfig, "link", "-n", deviceName}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ type JsonRpc2ReceivedMessage struct {
|
|||||||
|
|
||||||
type JsonRpc2Client struct {
|
type JsonRpc2Client struct {
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
receivedMessageResponses chan JsonRpc2MessageResponse
|
receivedResponsesById map[string]chan JsonRpc2MessageResponse
|
||||||
receivedMessages chan JsonRpc2ReceivedMessage
|
receivedMessages chan JsonRpc2ReceivedMessage
|
||||||
lastTimeErrorMessageSent time.Time
|
lastTimeErrorMessageSent time.Time
|
||||||
signalCliApiConfig *utils.SignalCliApiConfig
|
signalCliApiConfig *utils.SignalCliApiConfig
|
||||||
@@ -43,6 +43,7 @@ func NewJsonRpc2Client(signalCliApiConfig *utils.SignalCliApiConfig, number stri
|
|||||||
return &JsonRpc2Client{
|
return &JsonRpc2Client{
|
||||||
signalCliApiConfig: signalCliApiConfig,
|
signalCliApiConfig: signalCliApiConfig,
|
||||||
number: number,
|
number: number,
|
||||||
|
receivedResponsesById: make(map[string]chan JsonRpc2MessageResponse),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +54,6 @@ func (r *JsonRpc2Client) Dial(address string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
r.receivedMessageResponses = make(chan JsonRpc2MessageResponse)
|
|
||||||
r.receivedMessages = make(chan JsonRpc2ReceivedMessage)
|
r.receivedMessages = make(chan JsonRpc2ReceivedMessage)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -113,13 +113,12 @@ func (r *JsonRpc2Client) getRaw(command string, account *string, args interface{
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
responseChan := make(chan JsonRpc2MessageResponse)
|
||||||
|
r.receivedResponsesById[u.String()] = responseChan
|
||||||
|
|
||||||
var resp JsonRpc2MessageResponse
|
var resp JsonRpc2MessageResponse
|
||||||
for {
|
resp = <-responseChan
|
||||||
resp = <-r.receivedMessageResponses
|
delete(r.receivedResponsesById, u.String())
|
||||||
if resp.Id == u.String() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if resp.Err.Code != 0 {
|
if resp.Err.Code != 0 {
|
||||||
return "", errors.New(resp.Err.Message)
|
return "", errors.New(resp.Err.Message)
|
||||||
@@ -157,7 +156,9 @@ func (r *JsonRpc2Client) ReceiveData(number string) {
|
|||||||
err = json.Unmarshal([]byte(str), &resp2)
|
err = json.Unmarshal([]byte(str), &resp2)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if resp2.Id != "" {
|
if resp2.Id != "" {
|
||||||
r.receivedMessageResponses <- resp2
|
if responseChan, ok := r.receivedResponsesById[resp2.Id]; ok {
|
||||||
|
responseChan <- resp2
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Error("Received unparsable message: ", str)
|
log.Error("Received unparsable message: ", str)
|
||||||
|
|||||||
Reference in New Issue
Block a user