groupme-lib/direct_messages_api.go

141 lines
3.6 KiB
Go
Raw Normal View History

// Package groupme defines a client capable of executing API commands for the GroupMe chat service
package groupme
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"github.com/google/uuid"
)
// GroupMe documentation: https://dev.groupme.com/docs/v3#direct_messages
/*//////// Endpoints ////////*/
const (
// Used to build other endpoints
directMessagesEndpointRoot = "/direct_messages"
// Actual Endpoints
indexDirectMessagesEndpoint = directMessagesEndpointRoot // GET
createDirectMessageEndpoint = directMessagesEndpointRoot // POST
)
/*//////// API Requests ////////*/
// IndexDirectMessagesQuery defines the optional URL parameters for IndexDirectMessages
type IndexDirectMessagesQuery struct {
// Returns 20 messages created before the given message ID
BeforeID ID `json:"before_id"`
// Returns 20 messages created after the given message ID
SinceID ID `json:"since_id"`
}
func (q IndexDirectMessagesQuery) String() string {
return marshal(&q)
}
// IndexDirectMessagesResponse contains the count and set of
// messages returned by the IndexDirectMessages API request
type IndexDirectMessagesResponse struct {
Count int `json:"count"`
Messages []*Message `json:"direct_messages"`
}
func (r IndexDirectMessagesResponse) String() string {
return marshal(&r)
}
/*
IndexDirectMessages -
Fetch direct messages between two users.
DMs are returned in groups of 20, ordered by created_at
descending.
If no messages are found (e.g. when filtering with since_id) we
return code 304.
Note that for historical reasons, likes are returned as an array
of user ids in the favorited_by key.
Parameters:
otherUserID - required, ID(string); the other participant in the conversation.
See IndexDirectMessagesQuery
*/
func (c *Client) IndexDirectMessages(ctx context.Context, otherUserID string, req *IndexDirectMessagesQuery, authToken string) (IndexDirectMessagesResponse, error) {
httpReq, err := http.NewRequest("GET", c.endpointBase+indexDirectMessagesEndpoint, nil)
if err != nil {
return IndexDirectMessagesResponse{}, err
}
query := httpReq.URL.Query()
query.Set("other_user_id", otherUserID)
if req != nil {
if req.BeforeID != "" {
query.Add("before_ID", req.BeforeID.String())
}
if req.SinceID != "" {
query.Add("since_id", req.SinceID.String())
}
}
2021-05-08 19:39:39 +00:00
httpReq.URL.RawQuery = query.Encode()
var resp IndexDirectMessagesResponse
err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil {
return IndexDirectMessagesResponse{}, err
}
return resp, nil
}
/*
CreateDirectMessage - Send a DM to another user
If you want to attach an image, you must first process it
through our image service.
Attachments of type emoji rely on data from emoji PowerUps.
Clients use a placeholder character in the message text and
specify a replacement charmap to substitute emoji characters
The character map is an array of arrays containing rune data
([[{pack_id,offset}],...]).
*/
func (c *Client) CreateDirectMessage(ctx context.Context, m *Message, authToken string) (*Message, error) {
URL := fmt.Sprintf(c.endpointBase + createDirectMessageEndpoint)
m.SourceGUID = uuid.New().String()
var data = struct {
DirectMessage *Message `json:"direct_message,omitempty"`
}{
m,
}
jsonBytes, err := json.Marshal(&data)
if err != nil {
return nil, err
}
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
if err != nil {
return nil, err
}
var resp struct {
2021-05-08 19:39:39 +00:00
*Message `json:"direct_message"`
}
err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil {
return nil, err
}
return resp.Message, nil
}