mirror of
https://github.com/bbernhard/signal-cli-rest-api.git
synced 2026-05-21 13:54:18 +00:00
added possibility to call a webhook when a message is received
This commit is contained in:
parent
cdf710544e
commit
94cf8100ba
@ -370,10 +370,11 @@ type SignalClient struct {
|
|||||||
signalCliApiConfigPath string
|
signalCliApiConfigPath string
|
||||||
signalCliApiConfig *utils.SignalCliApiConfig
|
signalCliApiConfig *utils.SignalCliApiConfig
|
||||||
cliClient *CliClient
|
cliClient *CliClient
|
||||||
|
receiveWebhookUrl string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSignalClient(signalCliConfig string, attachmentTmpDir string, avatarTmpDir string, signalCliMode SignalCliMode,
|
func NewSignalClient(signalCliConfig string, attachmentTmpDir string, avatarTmpDir string, signalCliMode SignalCliMode,
|
||||||
jsonRpc2ClientConfigPath string, signalCliApiConfigPath string) *SignalClient {
|
jsonRpc2ClientConfigPath string, signalCliApiConfigPath string, receiveWebhookUrl string) *SignalClient {
|
||||||
return &SignalClient{
|
return &SignalClient{
|
||||||
signalCliConfig: signalCliConfig,
|
signalCliConfig: signalCliConfig,
|
||||||
attachmentTmpDir: attachmentTmpDir,
|
attachmentTmpDir: attachmentTmpDir,
|
||||||
@ -382,6 +383,7 @@ func NewSignalClient(signalCliConfig string, attachmentTmpDir string, avatarTmpD
|
|||||||
jsonRpc2ClientConfigPath: jsonRpc2ClientConfigPath,
|
jsonRpc2ClientConfigPath: jsonRpc2ClientConfigPath,
|
||||||
jsonRpc2Clients: make(map[string]*JsonRpc2Client),
|
jsonRpc2Clients: make(map[string]*JsonRpc2Client),
|
||||||
signalCliApiConfigPath: signalCliApiConfigPath,
|
signalCliApiConfigPath: signalCliApiConfigPath,
|
||||||
|
receiveWebhookUrl: receiveWebhookUrl,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -411,7 +413,7 @@ func (s *SignalClient) Init() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
go s.jsonRpc2Clients[number].ReceiveData(number) //receive messages in goroutine
|
go s.jsonRpc2Clients[number].ReceiveData(number, s.receiveWebhookUrl) //receive messages in goroutine
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
s.cliClient = NewCliClient(s.signalCliMode, s.signalCliApiConfig)
|
s.cliClient = NewCliClient(s.signalCliMode, s.signalCliApiConfig)
|
||||||
|
|||||||
@ -7,6 +7,9 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
"net/http"
|
||||||
|
"bytes"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/bbernhard/signal-cli-rest-api/utils"
|
"github.com/bbernhard/signal-cli-rest-api/utils"
|
||||||
uuid "github.com/gofrs/uuid"
|
uuid "github.com/gofrs/uuid"
|
||||||
@ -176,7 +179,30 @@ func (r *JsonRpc2Client) getRaw(command string, account *string, args interface{
|
|||||||
return string(resp.Result), nil
|
return string(resp.Result), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *JsonRpc2Client) ReceiveData(number string) {
|
func postMessageToWebhook(webhookUrl string, data []byte) error {
|
||||||
|
r, err := http.NewRequest("POST", webhookUrl, bytes.NewBuffer(data))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Header.Add("Content-Type", "application/json")
|
||||||
|
|
||||||
|
client := &http.Client{}
|
||||||
|
res, err := client.Do(r)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer res.Body.Close()
|
||||||
|
|
||||||
|
log.Info(res.StatusCode)
|
||||||
|
if res.StatusCode != 200 && res.StatusCode != 201 {
|
||||||
|
return errors.New("Unexpected status code returned (" + strconv.Itoa(res.StatusCode) + ")")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *JsonRpc2Client) ReceiveData(number string, receiveWebhookUrl string) {
|
||||||
connbuf := bufio.NewReader(r.conn)
|
connbuf := bufio.NewReader(r.conn)
|
||||||
for {
|
for {
|
||||||
str, err := connbuf.ReadString('\n')
|
str, err := connbuf.ReadString('\n')
|
||||||
@ -190,6 +216,13 @@ func (r *JsonRpc2Client) ReceiveData(number string) {
|
|||||||
}
|
}
|
||||||
log.Debug("json-rpc received data: ", str)
|
log.Debug("json-rpc received data: ", str)
|
||||||
|
|
||||||
|
if receiveWebhookUrl != "" {
|
||||||
|
err = postMessageToWebhook(receiveWebhookUrl, []byte(str))
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Couldn't post data to webhook: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var resp1 JsonRpc2ReceivedMessage
|
var resp1 JsonRpc2ReceivedMessage
|
||||||
json.Unmarshal([]byte(str), &resp1)
|
json.Unmarshal([]byte(str), &resp1)
|
||||||
if resp1.Method == "receive" {
|
if resp1.Method == "receive" {
|
||||||
|
|||||||
@ -155,9 +155,14 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
webhookUrl := utils.GetEnv("RECEIVE_WEBHOOK_URL", "")
|
||||||
|
if webhookUrl != "" && signalCliMode != client.JsonRpc {
|
||||||
|
log.Fatal("Env variable RECEIVE_WEBHOOK_URL can't be used with mode json-rpc!")
|
||||||
|
}
|
||||||
|
|
||||||
jsonRpc2ClientConfigPathPath := *signalCliConfig + "/jsonrpc2.yml"
|
jsonRpc2ClientConfigPathPath := *signalCliConfig + "/jsonrpc2.yml"
|
||||||
signalCliApiConfigPath := *signalCliConfig + "/api-config.yml"
|
signalCliApiConfigPath := *signalCliConfig + "/api-config.yml"
|
||||||
signalClient := client.NewSignalClient(*signalCliConfig, *attachmentTmpDir, *avatarTmpDir, signalCliMode, jsonRpc2ClientConfigPathPath, signalCliApiConfigPath)
|
signalClient := client.NewSignalClient(*signalCliConfig, *attachmentTmpDir, *avatarTmpDir, signalCliMode, jsonRpc2ClientConfigPathPath, signalCliApiConfigPath, webhookUrl)
|
||||||
err = signalClient.Init()
|
err = signalClient.Init()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Couldn't init Signal Client: ", err.Error())
|
log.Fatal("Couldn't init Signal Client: ", err.Error())
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user