diff --git a/src/api/api.go b/src/api/api.go index 7648522..832886b 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -6,6 +6,7 @@ import ( "errors" "net/http" "strconv" + "strings" "time" "github.com/gabriel-vasile/mimetype" @@ -93,15 +94,16 @@ type SendMessageV1 struct { } type SendMessageV2 struct { - Number string `json:"number"` - Recipients []string `json:"recipients"` - Message string `json:"message"` - Base64Attachments []string `json:"base64_attachments" example:",data:;base64,data:;filename=;base64"` - Mentions []client.MessageMention `json:"mentions"` - QuoteTimestamp *int64 `json:"quote_timestamp"` - QuoteAuthor *string `json:"quote_author"` - QuoteMessage *string `json:"quote_message"` - QuoteMentions []client.MessageMention `json:"quote_mentions"` + Number string `json:"number"` + Recipients []string `json:"recipients"` + Message string `json:"message"` + Base64Attachments []string `json:"base64_attachments" example:",data:;base64,data:;filename=;base64"` + Sticker string `json:"sticker"` + Mentions []client.MessageMention `json:"mentions"` + QuoteTimestamp *int64 `json:"quote_timestamp"` + QuoteAuthor *string `json:"quote_author"` + QuoteMessage *string `json:"quote_message"` + QuoteMentions []client.MessageMention `json:"quote_mentions"` } type TypingIndicatorRequest struct { @@ -359,7 +361,13 @@ func (a *Api) SendV2(c *gin.Context) { return } - timestamps, err := a.signalClient.SendV2(req.Number, req.Message, req.Recipients, req.Base64Attachments, + if req.Sticker != "" && !strings.Contains(req.Sticker, ":") { + c.JSON(400, gin.H{"error": "Couldn't process request - please provide valid sticker delimiter"}) + return + } + + timestamps, err := a.signalClient.SendV2( + req.Number, req.Message, req.Recipients, req.Base64Attachments, req.Sticker, req.Mentions, req.QuoteTimestamp, req.QuoteAuthor, req.QuoteMessage, req.QuoteMentions) if err != nil { c.JSON(400, Error{Msg: err.Error()}) diff --git a/src/client/client.go b/src/client/client.go index ecc682c..8f13a4c 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -60,9 +60,9 @@ func (g GroupLinkState) String() string { } type MessageMention struct { - Start int64 `json:"start"` - Length int64 `json:"length"` - Author string `json:"author"` + Start int64 `json:"start"` + Length int64 `json:"length"` + Author string `json:"author"` } type GroupEntry struct { @@ -122,11 +122,11 @@ type SendResponse struct { } type About struct { - SupportedApiVersions []string `json:"versions"` - BuildNr int `json:"build"` - Mode string `json:"mode"` - Version string `json:"version"` - Capabilities map[string][]string `json:"capabilities"` + SupportedApiVersions []string `json:"versions"` + BuildNr int `json:"build"` + Mode string `json:"mode"` + Version string `json:"version"` + Capabilities map[string][]string `json:"capabilities"` } type SearchResultEntry struct { @@ -290,11 +290,11 @@ func (s *SignalClient) Init() error { } func (s *MessageMention) toString() string { - return fmt.Sprintf("%d:%d:%s", s.Start, s.Length, s.Author) + return fmt.Sprintf("%d:%d:%s", s.Start, s.Length, s.Author) } func (s *SignalClient) send(number string, message string, - recipients []string, base64Attachments []string, isGroup bool, mentions []MessageMention, + recipients []string, base64Attachments []string, isGroup bool, sticker string, mentions []MessageMention, quoteTimestamp *int64, quoteAuthor *string, quoteMessage *string, quoteMentions []MessageMention) (*SendResponse, error) { var resp SendResponse @@ -336,15 +336,16 @@ func (s *SignalClient) send(number string, message string, } type Request struct { - Recipients []string `json:"recipient,omitempty"` - Message string `json:"message"` - GroupId string `json:"group-id,omitempty"` - Attachments []string `json:"attachment,omitempty"` - Mentions []string `json:"mentions,omitempty"` - QuoteTimestamp *int64 `json:"quote-timestamp,omitempty"` - QuoteAuthor *string `json:"quote-author,omitempty"` - QuoteMessage *string `json:"quote-message,omitempty"` - QuoteMentions []string `json:"quote-mentions,omitempty"` + Recipients []string `json:"recipient,omitempty"` + Message string `json:"message"` + GroupId string `json:"group-id,omitempty"` + Attachments []string `json:"attachment,omitempty"` + Sticker string `json:"sticker,omitempty"` + Mentions []string `json:"mentions,omitempty"` + QuoteTimestamp *int64 `json:"quote-timestamp,omitempty"` + QuoteAuthor *string `json:"quote-author,omitempty"` + QuoteMessage *string `json:"quote-message,omitempty"` + QuoteMentions []string `json:"quote-mentions,omitempty"` } request := Request{Message: message} @@ -356,24 +357,26 @@ func (s *SignalClient) send(number string, message string, for _, attachmentEntry := range attachmentEntries { request.Attachments = append(request.Attachments, attachmentEntry.toDataForSignal()) } + + request.Sticker = sticker if mentions != nil { - request.Mentions = make([]string, len(mentions)) - for i, mention := range mentions { - request.Mentions[i] = mention.toString() - } + request.Mentions = make([]string, len(mentions)) + for i, mention := range mentions { + request.Mentions[i] = mention.toString() + } } else { - request.Mentions = nil + request.Mentions = nil } request.QuoteTimestamp = quoteTimestamp request.QuoteAuthor = quoteAuthor request.QuoteMessage = quoteMessage if quoteMentions != nil { - request.QuoteMentions = make([]string, len(quoteMentions)) - for i, mention := range quoteMentions { - request.QuoteMentions[i] = mention.toString() - } + request.QuoteMentions = make([]string, len(quoteMentions)) + for i, mention := range quoteMentions { + request.QuoteMentions[i] = mention.toString() + } } else { - request.QuoteMentions = nil + request.QuoteMentions = nil } rawData, err := jsonRpc2Client.getRaw("send", request) @@ -409,6 +412,11 @@ func (s *SignalClient) send(number string, message string, cmd = append(cmd, mention.toString()) } + if sticker != "" { + cmd = append(cmd, "--sticker") + cmd = append(cmd, sticker) + } + if quoteTimestamp != nil { cmd = append(cmd, "--quote-timestamp") cmd = append(cmd, strconv.FormatInt(*quoteTimestamp, 10)) @@ -519,7 +527,7 @@ func (s *SignalClient) VerifyRegisteredNumber(number string, token string, pin s } func (s *SignalClient) SendV1(number string, message string, recipients []string, base64Attachments []string, isGroup bool) (*SendResponse, error) { - timestamp, err := s.send(number, message, recipients, base64Attachments, isGroup, nil, nil, nil, nil, nil) + timestamp, err := s.send(number, message, recipients, base64Attachments, isGroup, "", nil, nil, nil, nil, nil) return timestamp, err } @@ -538,7 +546,7 @@ func (s *SignalClient) getJsonRpc2Clients() []*JsonRpc2Client { return jsonRpc2Clients } -func (s *SignalClient) SendV2(number string, message string, recps []string, base64Attachments []string, mentions []MessageMention, +func (s *SignalClient) SendV2(number string, message string, recps []string, base64Attachments []string, sticker string, mentions []MessageMention, quoteTimestamp *int64, quoteAuthor *string, quoteMessage *string, quoteMentions []MessageMention) (*[]SendResponse, error) { if len(recps) == 0 { return nil, errors.New("Please provide at least one recipient") @@ -569,7 +577,7 @@ func (s *SignalClient) SendV2(number string, message string, recps []string, bas timestamps := []SendResponse{} for _, group := range groups { - timestamp, err := s.send(number, message, []string{group}, base64Attachments, true, mentions, quoteTimestamp, quoteAuthor, quoteMessage, quoteMentions) + timestamp, err := s.send(number, message, []string{group}, base64Attachments, true, sticker, mentions, quoteTimestamp, quoteAuthor, quoteMessage, quoteMentions) if err != nil { return nil, err } @@ -577,7 +585,7 @@ func (s *SignalClient) SendV2(number string, message string, recps []string, bas } if len(recipients) > 0 { - timestamp, err := s.send(number, message, recipients, base64Attachments, false, mentions, quoteTimestamp, quoteAuthor, quoteMessage, quoteMentions) + timestamp, err := s.send(number, message, recipients, base64Attachments, false, sticker, mentions, quoteTimestamp, quoteAuthor, quoteMessage, quoteMentions) if err != nil { return nil, err }