Updating API to re-use client for multiple users

This commit is contained in:
Brandon Watson 2023-09-19 21:08:46 -05:00
parent c0f3da8060
commit 08bfe83ba4
16 changed files with 117 additions and 114 deletions

View File

@ -23,7 +23,7 @@ const (
/*//////// API Requests ////////*/ /*//////// API Requests ////////*/
// IndexBlock - A list of contacts you have blocked. These people cannot DM you // IndexBlock - A list of contacts you have blocked. These people cannot DM you
func (c *Client) IndexBlock(ctx context.Context, userID string) ([]*Block, error) { func (c *Client) IndexBlock(ctx context.Context, userID string, authToken string) ([]*Block, error) {
httpReq, err := http.NewRequest("GET", c.endpointBase+indexBlocksEndpoint, nil) httpReq, err := http.NewRequest("GET", c.endpointBase+indexBlocksEndpoint, nil)
if err != nil { if err != nil {
return nil, err return nil, err
@ -37,7 +37,7 @@ func (c *Client) IndexBlock(ctx context.Context, userID string) ([]*Block, error
var resp struct { var resp struct {
Blocks []*Block `json:"blocks"` Blocks []*Block `json:"blocks"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -46,7 +46,7 @@ func (c *Client) IndexBlock(ctx context.Context, userID string) ([]*Block, error
} }
// BlockBetween - Asks if a block exists between you and another user id // BlockBetween - Asks if a block exists between you and another user id
func (c *Client) BlockBetween(ctx context.Context, userID, otherUserID string) (bool, error) { func (c *Client) BlockBetween(ctx context.Context, userID, otherUserID string, authToken string) (bool, error) {
httpReq, err := http.NewRequest("GET", c.endpointBase+blockBetweenEndpoint, nil) httpReq, err := http.NewRequest("GET", c.endpointBase+blockBetweenEndpoint, nil)
if err != nil { if err != nil {
return false, err return false, err
@ -61,7 +61,7 @@ func (c *Client) BlockBetween(ctx context.Context, userID, otherUserID string) (
var resp struct { var resp struct {
Between bool `json:"between"` Between bool `json:"between"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return false, err return false, err
} }
@ -70,7 +70,7 @@ func (c *Client) BlockBetween(ctx context.Context, userID, otherUserID string) (
} }
// CreateBlock - Creates a block between you and the contact // CreateBlock - Creates a block between you and the contact
func (c *Client) CreateBlock(ctx context.Context, userID, otherUserID string) (*Block, error) { func (c *Client) CreateBlock(ctx context.Context, userID, otherUserID string, authToken string) (*Block, error) {
httpReq, err := http.NewRequest("POST", c.endpointBase+createBlockEndpoint, nil) httpReq, err := http.NewRequest("POST", c.endpointBase+createBlockEndpoint, nil)
if err != nil { if err != nil {
return nil, err return nil, err
@ -85,7 +85,7 @@ func (c *Client) CreateBlock(ctx context.Context, userID, otherUserID string) (*
var resp struct { var resp struct {
Block *Block `json:"block"` Block *Block `json:"block"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -94,7 +94,7 @@ func (c *Client) CreateBlock(ctx context.Context, userID, otherUserID string) (*
} }
// Unblock - Removes block between you and other user // Unblock - Removes block between you and other user
func (c *Client) Unblock(ctx context.Context, userID, otherUserID string) error { func (c *Client) Unblock(ctx context.Context, userID, otherUserID string, authToken string) error {
httpReq, err := http.NewRequest("DELETE", c.endpointBase+unblockEndpoint, nil) httpReq, err := http.NewRequest("DELETE", c.endpointBase+unblockEndpoint, nil)
if err != nil { if err != nil {
return err return err
@ -106,7 +106,7 @@ func (c *Client) Unblock(ctx context.Context, userID, otherUserID string) error
query.Set("otherUser", otherUserID) query.Set("otherUser", otherUserID)
URL.RawQuery = query.Encode() URL.RawQuery = query.Encode()
err = c.doWithAuthToken(ctx, httpReq, nil) err = c.doWithAuthToken(ctx, httpReq, nil, authToken)
if err != nil { if err != nil {
return err return err
} }

View File

@ -27,7 +27,7 @@ const (
// CreateBot - Create a bot. See the Bots Tutorial (https://dev.groupme.com/tutorials/bots) // CreateBot - Create a bot. See the Bots Tutorial (https://dev.groupme.com/tutorials/bots)
// for a full walkthrough. // for a full walkthrough.
func (c *Client) CreateBot(ctx context.Context, bot *Bot) (*Bot, error) { func (c *Client) CreateBot(ctx context.Context, bot *Bot, authToken string) (*Bot, error) {
URL := c.endpointBase + createBotEndpoint URL := c.endpointBase + createBotEndpoint
var data = struct { var data = struct {
@ -47,7 +47,7 @@ func (c *Client) CreateBot(ctx context.Context, bot *Bot) (*Bot, error) {
} }
var resp Bot var resp Bot
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -84,14 +84,14 @@ func (c *Client) PostBotMessage(ctx context.Context, botID ID, text string, pict
} }
// IndexBots - list bots that you have created // IndexBots - list bots that you have created
func (c *Client) IndexBots(ctx context.Context) ([]*Bot, error) { func (c *Client) IndexBots(ctx context.Context, authToken string) ([]*Bot, error) {
httpReq, err := http.NewRequest("GET", c.endpointBase+indexBotsEndpoint, nil) httpReq, err := http.NewRequest("GET", c.endpointBase+indexBotsEndpoint, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var resp []*Bot var resp []*Bot
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -100,7 +100,7 @@ func (c *Client) IndexBots(ctx context.Context) ([]*Bot, error) {
} }
// DestroyBot - Remove a bot that you have created // DestroyBot - Remove a bot that you have created
func (c *Client) DestroyBot(ctx context.Context, botID ID) error { func (c *Client) DestroyBot(ctx context.Context, botID ID, authToken string) error {
URL := fmt.Sprintf(c.endpointBase + destroyBotEndpoint) URL := fmt.Sprintf(c.endpointBase + destroyBotEndpoint)
var data = struct { var data = struct {
@ -119,5 +119,5 @@ func (c *Client) DestroyBot(ctx context.Context, botID ID) error {
return err return err
} }
return c.doWithAuthToken(ctx, httpReq, nil) return c.doWithAuthToken(ctx, httpReq, nil, authToken)
} }

View File

@ -27,7 +27,7 @@ type IndexChatsQuery struct {
// IndexChats - Returns a paginated list of direct message chats, or // IndexChats - Returns a paginated list of direct message chats, or
// conversations, sorted by updated_at descending. // conversations, sorted by updated_at descending.
func (c *Client) IndexChats(ctx context.Context, req *IndexChatsQuery) ([]*Chat, error) { func (c *Client) IndexChats(ctx context.Context, req *IndexChatsQuery, authToken string) ([]*Chat, error) {
httpReq, err := http.NewRequest("GET", c.endpointBase+indexChatsEndpoint, nil) httpReq, err := http.NewRequest("GET", c.endpointBase+indexChatsEndpoint, nil)
if err != nil { if err != nil {
return nil, err return nil, err
@ -46,14 +46,14 @@ func (c *Client) IndexChats(ctx context.Context, req *IndexChatsQuery) ([]*Chat,
URL.RawQuery = query.Encode() URL.RawQuery = query.Encode()
var resp []*Chat var resp []*Chat
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return resp, nil return resp, nil
} }
func (c *Client) IndexRelations(ctx context.Context) ([]*User, error) { func (c *Client) IndexRelations(ctx context.Context, authToken string) ([]*User, error) {
httpReq, err := http.NewRequest("GET", "https://api.groupme.com/v4"+"/relationships", nil) httpReq, err := http.NewRequest("GET", "https://api.groupme.com/v4"+"/relationships", nil)
if err != nil { if err != nil {
return nil, err return nil, err
@ -66,7 +66,7 @@ func (c *Client) IndexRelations(ctx context.Context) ([]*User, error) {
URL.RawQuery = query.Encode() URL.RawQuery = query.Encode()
var resp []*User var resp []*User
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -16,18 +16,16 @@ const GroupMeAPIBase = "https://api.groupme.com/v3"
// Client communicates with the GroupMe API to perform actions // Client communicates with the GroupMe API to perform actions
// on the basic types, i.e. Listing, Creating, Destroying // on the basic types, i.e. Listing, Creating, Destroying
type Client struct { type Client struct {
httpClient *http.Client httpClient *http.Client
endpointBase string endpointBase string
authorizationToken string
} }
// NewClient creates a new GroupMe API Client // NewClient creates a new GroupMe API Client
func NewClient(authToken string) *Client { func NewClient() *Client {
return &Client{ return &Client{
// TODO: enable transport information passing in // TODO: enable transport information passing in
httpClient: &http.Client{}, httpClient: &http.Client{},
endpointBase: GroupMeAPIBase, endpointBase: GroupMeAPIBase,
authorizationToken: authToken,
} }
} }
@ -112,10 +110,10 @@ func (c Client) do(ctx context.Context, req *http.Request, i interface{}) error
return nil return nil
} }
func (c Client) doWithAuthToken(ctx context.Context, req *http.Request, i interface{}) error { func (c Client) doWithAuthToken(ctx context.Context, req *http.Request, i interface{}, authToken string) error {
URL := req.URL URL := req.URL
query := URL.Query() query := URL.Query()
query.Set("token", c.authorizationToken) query.Set("token", authToken)
URL.RawQuery = query.Encode() URL.RawQuery = query.Encode()
return c.do(ctx, req, i) return c.do(ctx, req, i)

View File

@ -63,10 +63,11 @@ Note that for historical reasons, likes are returned as an array
of user ids in the favorited_by key. of user ids in the favorited_by key.
Parameters: Parameters:
otherUserID - required, ID(string); the other participant in the conversation. otherUserID - required, ID(string); the other participant in the conversation.
See IndexDirectMessagesQuery See IndexDirectMessagesQuery
*/ */
func (c *Client) IndexDirectMessages(ctx context.Context, otherUserID string, req *IndexDirectMessagesQuery) (IndexDirectMessagesResponse, error) { func (c *Client) IndexDirectMessages(ctx context.Context, otherUserID string, req *IndexDirectMessagesQuery, authToken string) (IndexDirectMessagesResponse, error) {
httpReq, err := http.NewRequest("GET", c.endpointBase+indexDirectMessagesEndpoint, nil) httpReq, err := http.NewRequest("GET", c.endpointBase+indexDirectMessagesEndpoint, nil)
if err != nil { if err != nil {
return IndexDirectMessagesResponse{}, err return IndexDirectMessagesResponse{}, err
@ -85,7 +86,7 @@ func (c *Client) IndexDirectMessages(ctx context.Context, otherUserID string, re
httpReq.URL.RawQuery = query.Encode() httpReq.URL.RawQuery = query.Encode()
var resp IndexDirectMessagesResponse var resp IndexDirectMessagesResponse
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return IndexDirectMessagesResponse{}, err return IndexDirectMessagesResponse{}, err
} }
@ -107,7 +108,7 @@ specify a replacement charmap to substitute emoji characters
The character map is an array of arrays containing rune data The character map is an array of arrays containing rune data
([[{pack_id,offset}],...]). ([[{pack_id,offset}],...]).
*/ */
func (c *Client) CreateDirectMessage(ctx context.Context, m *Message) (*Message, error) { func (c *Client) CreateDirectMessage(ctx context.Context, m *Message, authToken string) (*Message, error) {
URL := fmt.Sprintf(c.endpointBase + createDirectMessageEndpoint) URL := fmt.Sprintf(c.endpointBase + createDirectMessageEndpoint)
m.SourceGUID = uuid.New().String() m.SourceGUID = uuid.New().String()
@ -130,7 +131,7 @@ func (c *Client) CreateDirectMessage(ctx context.Context, m *Message) (*Message,
var resp struct { var resp struct {
*Message `json:"direct_message"` *Message `json:"direct_message"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -18,20 +18,20 @@ var authorizationToken = "ABCD"
func main() { func main() {
//create push subscription and start listening //create push subscription and start listening
p := groupme.NewPushSubscription(context.Background()) p := groupme.NewPushSubscription(context.Background())
err := p.Connect(context.TODO(), authorizationToken) err := p.Connect(context.TODO())
if err != nil { if err != nil {
return return
} }
// Create a new client with your auth token // Create a new client with your auth token
client := groupme.NewClient(authorizationToken) client := groupme.NewClient()
User, _ := client.MyUser(context.Background()) User, _ := client.MyUser(context.Background(), authorizationToken)
//handles (in this case prints) all messages //handles (in this case prints) all messages
p.AddFullHandler(Handler{User: User}) p.AddFullHandler(Handler{User: User})
//Subscribe to get messages and events for the specific user //Subscribe to get messages and events for the specific user
err = p.SubscribeToUser(context.Background(), User.ID) err = p.SubscribeToUser(context.Background(), User.ID, authorizationToken)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -43,7 +43,7 @@ func main() {
Page: 0, Page: 0,
PerPage: 2, PerPage: 2,
Omit: "memberships", Omit: "memberships",
}) }, authorizationToken)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@ -51,7 +51,7 @@ func main() {
} }
//Subscribe to those groups //Subscribe to those groups
for _, j := range groups { for _, j := range groups {
err = p.SubscribeToGroup(context.TODO(), j.ID) err = p.SubscribeToGroup(context.TODO(), j.ID, authorizationToken)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -62,10 +62,10 @@ func main() {
&groupme.IndexChatsQuery{ &groupme.IndexChatsQuery{
Page: 0, Page: 0,
PerPage: 2, PerPage: 2,
}) }, authorizationToken)
//subscribe to all those chats //subscribe to all those chats
for _, j := range chats { for _, j := range chats {
err = p.SubscribeToDM(context.TODO(), j.LastMessage.ConversationID) err = p.SubscribeToDM(context.TODO(), j.LastMessage.ConversationID, authorizationToken)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

2
go.mod
View File

@ -3,7 +3,7 @@ module gitea.watsonlabs.net/watsonb8/groupme-lib
go 1.21.0 go 1.21.0
require ( require (
gitea.watsonlabs.net/watsonb8/fayec v0.0.2 gitea.watsonlabs.net/watsonb8/fayec v0.0.3
github.com/google/uuid v1.2.0 github.com/google/uuid v1.2.0
github.com/gorilla/mux v1.8.0 github.com/gorilla/mux v1.8.0
github.com/stretchr/testify v1.7.0 github.com/stretchr/testify v1.7.0

2
go.sum
View File

@ -6,6 +6,8 @@ gitea.watsonlabs.net/watsonb8/fayec v0.0.1 h1:MNFmTaTyyKKgrw04dGO9C5ojtm1jIvy8oH
gitea.watsonlabs.net/watsonb8/fayec v0.0.1/go.mod h1:gv8CWMq6dFJQhH30u8bO3u4k2irKlclZktLNYDebQ/0= gitea.watsonlabs.net/watsonb8/fayec v0.0.1/go.mod h1:gv8CWMq6dFJQhH30u8bO3u4k2irKlclZktLNYDebQ/0=
gitea.watsonlabs.net/watsonb8/fayec v0.0.2 h1:tqbgr1vRZ6Wq4W81xBg+FTOywSv3EJpK263SAVXXTco= gitea.watsonlabs.net/watsonb8/fayec v0.0.2 h1:tqbgr1vRZ6Wq4W81xBg+FTOywSv3EJpK263SAVXXTco=
gitea.watsonlabs.net/watsonb8/fayec v0.0.2/go.mod h1:gv8CWMq6dFJQhH30u8bO3u4k2irKlclZktLNYDebQ/0= gitea.watsonlabs.net/watsonb8/fayec v0.0.2/go.mod h1:gv8CWMq6dFJQhH30u8bO3u4k2irKlclZktLNYDebQ/0=
gitea.watsonlabs.net/watsonb8/fayec v0.0.3 h1:YpaZBIee8Ix6uGm1UoEtBix1dEU1TURChAsJGJ3pVRo=
gitea.watsonlabs.net/watsonb8/fayec v0.0.3/go.mod h1:gv8CWMq6dFJQhH30u8bO3u4k2irKlclZktLNYDebQ/0=
github.com/autogrowsystems/wray v0.0.0-20160519030252-f36984f6648c/go.mod h1:druJ8QMeBCUmwJ7ZSFowx77dWxEWF3SYlQlsqZaLZQg= github.com/autogrowsystems/wray v0.0.0-20160519030252-f36984f6648c/go.mod h1:druJ8QMeBCUmwJ7ZSFowx77dWxEWF3SYlQlsqZaLZQg=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

View File

@ -86,7 +86,7 @@ app for users who are participating in huge groups.
Parameters: See GroupsQuery Parameters: See GroupsQuery
*/ */
func (c *Client) IndexGroups(ctx context.Context, req *GroupsQuery) ([]*Group, error) { func (c *Client) IndexGroups(ctx context.Context, req *GroupsQuery, authToken string) ([]*Group, error) {
httpReq, err := http.NewRequest("GET", c.endpointBase+indexGroupsEndpoint, nil) httpReq, err := http.NewRequest("GET", c.endpointBase+indexGroupsEndpoint, nil)
if err != nil { if err != nil {
return nil, err return nil, err
@ -108,7 +108,7 @@ func (c *Client) IndexGroups(ctx context.Context, req *GroupsQuery) ([]*Group, e
URL.RawQuery = query.Encode() URL.RawQuery = query.Encode()
var resp []*Group var resp []*Group
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -123,14 +123,14 @@ FormerGroups -
List they groups you have left but can rejoin. List they groups you have left but can rejoin.
*/ */
func (c *Client) FormerGroups(ctx context.Context) ([]*Group, error) { func (c *Client) FormerGroups(ctx context.Context, authToken string) ([]*Group, error) {
httpReq, err := http.NewRequest("GET", c.endpointBase+formerGroupsEndpoint, nil) httpReq, err := http.NewRequest("GET", c.endpointBase+formerGroupsEndpoint, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var resp []*Group var resp []*Group
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -146,9 +146,10 @@ ShowGroup -
Loads a specific group. Loads a specific group.
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
*/ */
func (c *Client) ShowGroup(ctx context.Context, groupID ID) (*Group, error) { func (c *Client) ShowGroup(ctx context.Context, groupID ID, authToken string) (*Group, error) {
URL := fmt.Sprintf(c.endpointBase+showGroupEndpoint, groupID) URL := fmt.Sprintf(c.endpointBase+showGroupEndpoint, groupID)
httpReq, err := http.NewRequest("GET", URL, nil) httpReq, err := http.NewRequest("GET", URL, nil)
@ -157,7 +158,7 @@ func (c *Client) ShowGroup(ctx context.Context, groupID ID) (*Group, error) {
} }
var resp Group var resp Group
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -170,11 +171,11 @@ func (c *Client) ShowGroup(ctx context.Context, groupID ID) (*Group, error) {
/* /*
CreateGroup - CreateGroup -
Create a new group # Create a new group
Parameters: See GroupSettings Parameters: See GroupSettings
*/ */
func (c *Client) CreateGroup(ctx context.Context, gs GroupSettings) (*Group, error) { func (c *Client) CreateGroup(ctx context.Context, gs GroupSettings, authToken string) (*Group, error) {
URL := fmt.Sprintf(c.endpointBase + createGroupEndpoint) URL := fmt.Sprintf(c.endpointBase + createGroupEndpoint)
jsonBytes, err := json.Marshal(&gs) jsonBytes, err := json.Marshal(&gs)
@ -188,7 +189,7 @@ func (c *Client) CreateGroup(ctx context.Context, gs GroupSettings) (*Group, err
} }
var resp Group var resp Group
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -201,13 +202,14 @@ func (c *Client) CreateGroup(ctx context.Context, gs GroupSettings) (*Group, err
/* /*
UpdateGroup - UpdateGroup -
Update a group after creation # Update a group after creation
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
See GroupSettings See GroupSettings
*/ */
func (c *Client) UpdateGroup(ctx context.Context, groupID ID, gs GroupSettings) (*Group, error) { func (c *Client) UpdateGroup(ctx context.Context, groupID ID, gs GroupSettings, authToken string) (*Group, error) {
URL := fmt.Sprintf(c.endpointBase+updateGroupEndpoint, groupID) URL := fmt.Sprintf(c.endpointBase+updateGroupEndpoint, groupID)
jsonBytes, err := json.Marshal(&gs) jsonBytes, err := json.Marshal(&gs)
@ -221,7 +223,7 @@ func (c *Client) UpdateGroup(ctx context.Context, groupID ID, gs GroupSettings)
} }
var resp Group var resp Group
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -234,14 +236,15 @@ func (c *Client) UpdateGroup(ctx context.Context, groupID ID, gs GroupSettings)
/* /*
DestroyGroup - DestroyGroup -
Disband a group # Disband a group
This action is only available to the group creator # This action is only available to the group creator
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
*/ */
func (c *Client) DestroyGroup(ctx context.Context, groupID ID) error { func (c *Client) DestroyGroup(ctx context.Context, groupID ID, authToken string) error {
url := fmt.Sprintf(c.endpointBase+destroyGroupEndpoint, groupID) url := fmt.Sprintf(c.endpointBase+destroyGroupEndpoint, groupID)
httpReq, err := http.NewRequest("POST", url, nil) httpReq, err := http.NewRequest("POST", url, nil)
@ -249,7 +252,7 @@ func (c *Client) DestroyGroup(ctx context.Context, groupID ID) error {
return err return err
} }
return c.doWithAuthToken(ctx, httpReq, nil) return c.doWithAuthToken(ctx, httpReq, nil, authToken)
} }
/*/// Join ///*/ /*/// Join ///*/
@ -257,13 +260,14 @@ func (c *Client) DestroyGroup(ctx context.Context, groupID ID) error {
/* /*
JoinGroup - JoinGroup -
Join a shared group # Join a shared group
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
shareToken - required, string shareToken - required, string
*/ */
func (c *Client) JoinGroup(ctx context.Context, groupID ID, shareToken string) (*Group, error) { func (c *Client) JoinGroup(ctx context.Context, groupID ID, shareToken string, authToken string) (*Group, error) {
URL := fmt.Sprintf(c.endpointBase+joinGroupEndpoint, groupID, shareToken) URL := fmt.Sprintf(c.endpointBase+joinGroupEndpoint, groupID, shareToken)
httpReq, err := http.NewRequest("POST", URL, nil) httpReq, err := http.NewRequest("POST", URL, nil)
@ -272,7 +276,7 @@ func (c *Client) JoinGroup(ctx context.Context, groupID ID, shareToken string) (
} }
var resp Group var resp Group
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -288,9 +292,10 @@ RejoinGroup -
Rejoin a group. Only works if you previously removed yourself. Rejoin a group. Only works if you previously removed yourself.
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
*/ */
func (c *Client) RejoinGroup(ctx context.Context, groupID ID) (*Group, error) { func (c *Client) RejoinGroup(ctx context.Context, groupID ID, authToken string) (*Group, error) {
URL := fmt.Sprintf(c.endpointBase + rejoinGroupEndpoint) URL := fmt.Sprintf(c.endpointBase + rejoinGroupEndpoint)
var data = struct { var data = struct {
@ -310,7 +315,7 @@ func (c *Client) RejoinGroup(ctx context.Context, groupID ID) (*Group, error) {
} }
var resp Group var resp Group
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -330,7 +335,7 @@ the result of change owner action for the request
Parameters: See ChangeOwnerRequest Parameters: See ChangeOwnerRequest
*/ */
func (c *Client) ChangeGroupOwner(ctx context.Context, reqs ChangeOwnerRequest) (ChangeOwnerResult, error) { func (c *Client) ChangeGroupOwner(ctx context.Context, reqs ChangeOwnerRequest, authToken string) (ChangeOwnerResult, error) {
URL := fmt.Sprintf(c.endpointBase + changeGroupOwnerEndpoint) URL := fmt.Sprintf(c.endpointBase + changeGroupOwnerEndpoint)
var data = struct { var data = struct {
@ -353,7 +358,7 @@ func (c *Client) ChangeGroupOwner(ctx context.Context, reqs ChangeOwnerRequest)
Results []ChangeOwnerResult `json:"results"` Results []ChangeOwnerResult `json:"results"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return ChangeOwnerResult{}, err return ChangeOwnerResult{}, err
} }

View File

@ -35,7 +35,7 @@ const (
// IndexLeaderboard - A list of the liked messages in the group for a given period of // IndexLeaderboard - A list of the liked messages in the group for a given period of
// time. Messages are ranked in order of number of likes. // time. Messages are ranked in order of number of likes.
func (c *Client) IndexLeaderboard(ctx context.Context, groupID ID, p period) ([]*Message, error) { func (c *Client) IndexLeaderboard(ctx context.Context, groupID ID, p period, authToken string) ([]*Message, error) {
url := fmt.Sprintf(c.endpointBase+indexLeaderboardEndpoint, groupID) url := fmt.Sprintf(c.endpointBase+indexLeaderboardEndpoint, groupID)
httpReq, err := http.NewRequest("GET", url, nil) httpReq, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
@ -50,7 +50,7 @@ func (c *Client) IndexLeaderboard(ctx context.Context, groupID ID, p period) ([]
var resp struct { var resp struct {
Messages []*Message `json:"messages"` Messages []*Message `json:"messages"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -68,9 +68,10 @@ reverse chrono-order. Note that the payload includes a liked_at
timestamp in ISO-8601 format. timestamp in ISO-8601 format.
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
*/ */
func (c *Client) MyLikesLeaderboard(ctx context.Context, groupID ID) ([]*Message, error) { func (c *Client) MyLikesLeaderboard(ctx context.Context, groupID ID, authToken string) ([]*Message, error) {
url := fmt.Sprintf(c.endpointBase+myLikesLeaderboardEndpoint, groupID) url := fmt.Sprintf(c.endpointBase+myLikesLeaderboardEndpoint, groupID)
httpReq, err := http.NewRequest("GET", url, nil) httpReq, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
@ -80,7 +81,7 @@ func (c *Client) MyLikesLeaderboard(ctx context.Context, groupID ID) ([]*Message
var resp struct { var resp struct {
Messages []*Message `json:"messages"` Messages []*Message `json:"messages"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -98,9 +99,10 @@ reverse chrono-order. Note that the payload includes a liked_at
timestamp in ISO-8601 format. timestamp in ISO-8601 format.
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
*/ */
func (c *Client) MyHitsLeaderboard(ctx context.Context, groupID ID) ([]*Message, error) { func (c *Client) MyHitsLeaderboard(ctx context.Context, groupID ID, authToken string) ([]*Message, error) {
url := fmt.Sprintf(c.endpointBase+myHitsLeaderboardEndpoint, groupID) url := fmt.Sprintf(c.endpointBase+myHitsLeaderboardEndpoint, groupID)
httpReq, err := http.NewRequest("GET", url, nil) httpReq, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
@ -110,7 +112,7 @@ func (c *Client) MyHitsLeaderboard(ctx context.Context, groupID ID) ([]*Message,
var resp struct { var resp struct {
Messages []*Message `json:"messages"` Messages []*Message `json:"messages"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -23,7 +23,7 @@ const (
// Create // Create
// CreateLike - Like a message. // CreateLike - Like a message.
func (c *Client) CreateLike(ctx context.Context, conversationID, messageID ID) error { func (c *Client) CreateLike(ctx context.Context, conversationID, messageID ID, authToken string) error {
url := fmt.Sprintf(c.endpointBase+createLikeEndpoint, conversationID, messageID) url := fmt.Sprintf(c.endpointBase+createLikeEndpoint, conversationID, messageID)
httpReq, err := http.NewRequest("POST", url, nil) httpReq, err := http.NewRequest("POST", url, nil)
@ -31,11 +31,11 @@ func (c *Client) CreateLike(ctx context.Context, conversationID, messageID ID) e
return err return err
} }
return c.doWithAuthToken(ctx, httpReq, nil) return c.doWithAuthToken(ctx, httpReq, nil, authToken)
} }
// DestroyLike - Unlike a message. // DestroyLike - Unlike a message.
func (c *Client) DestroyLike(ctx context.Context, conversationID, messageID ID) error { func (c *Client) DestroyLike(ctx context.Context, conversationID, messageID ID, authToken string) error {
url := fmt.Sprintf(c.endpointBase+destroyLikeEndpoint, conversationID, messageID) url := fmt.Sprintf(c.endpointBase+destroyLikeEndpoint, conversationID, messageID)
httpReq, err := http.NewRequest("POST", url, nil) httpReq, err := http.NewRequest("POST", url, nil)
@ -43,5 +43,5 @@ func (c *Client) DestroyLike(ctx context.Context, conversationID, messageID ID)
return err return err
} }
return c.doWithAuthToken(ctx, httpReq, nil) return c.doWithAuthToken(ctx, httpReq, nil, authToken)
} }

View File

@ -40,6 +40,7 @@ GUIDs can be added to the members parameters. These GUIDs will
be reflected in the membership JSON objects. be reflected in the membership JSON objects.
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
See Member. See Member.
Nickname - required Nickname - required
@ -48,7 +49,7 @@ Parameters:
PhoneNumber - PhoneNumber(string) PhoneNumber - PhoneNumber(string)
Email - string Email - string
*/ */
func (c *Client) AddMembers(ctx context.Context, groupID ID, members ...*Member) (string, error) { func (c *Client) AddMembers(ctx context.Context, groupID ID, authToken string, members ...*Member) (string, error) {
URL := fmt.Sprintf(c.endpointBase+addMembersEndpoint, groupID) URL := fmt.Sprintf(c.endpointBase+addMembersEndpoint, groupID)
var data = struct { var data = struct {
@ -71,7 +72,7 @@ func (c *Client) AddMembers(ctx context.Context, groupID ID, members ...*Member)
ResultsID string `json:"results_id"` ResultsID string `json:"results_id"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -94,10 +95,11 @@ Keep in mind that results are temporary -- they will only be
available for 1 hour after the add request. available for 1 hour after the add request.
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
resultID - required, string resultID - required, string
*/ */
func (c *Client) AddMembersResults(ctx context.Context, groupID ID, resultID string) ([]*Member, error) { func (c *Client) AddMembersResults(ctx context.Context, groupID ID, resultID string, authToken string) ([]*Member, error) {
URL := fmt.Sprintf(c.endpointBase+addMembersResultsEndpoint, groupID, resultID) URL := fmt.Sprintf(c.endpointBase+addMembersResultsEndpoint, groupID, resultID)
httpReq, err := http.NewRequest("GET", URL, nil) httpReq, err := http.NewRequest("GET", URL, nil)
@ -109,7 +111,7 @@ func (c *Client) AddMembersResults(ctx context.Context, groupID ID, resultID str
Members []*Member `json:"members"` Members []*Member `json:"members"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -127,10 +129,11 @@ Remove a member (or yourself) from a group.
Note: The creator of the group cannot be removed or exit. Note: The creator of the group cannot be removed or exit.
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
membershipID - required, ID(string). Not the same as userID membershipID - required, ID(string). Not the same as userID
*/ */
func (c *Client) RemoveMember(ctx context.Context, groupID, membershipID ID) error { func (c *Client) RemoveMember(ctx context.Context, groupID, membershipID ID, authToken string) error {
URL := fmt.Sprintf(c.endpointBase+removeMemberEndpoint, groupID, membershipID) URL := fmt.Sprintf(c.endpointBase+removeMemberEndpoint, groupID, membershipID)
httpReq, err := http.NewRequest("POST", URL, nil) httpReq, err := http.NewRequest("POST", URL, nil)
@ -138,7 +141,7 @@ func (c *Client) RemoveMember(ctx context.Context, groupID, membershipID ID) err
return err return err
} }
return c.doWithAuthToken(ctx, httpReq, nil) return c.doWithAuthToken(ctx, httpReq, nil, authToken)
} }
/*/// Update ///*/ /*/// Update ///*/
@ -149,7 +152,7 @@ UpdateMember -
Update your nickname in a group. The nickname must be Update your nickname in a group. The nickname must be
between 1 and 50 characters. between 1 and 50 characters.
*/ */
func (c *Client) UpdateMember(ctx context.Context, groupID ID, nickname string) (*Member, error) { func (c *Client) UpdateMember(ctx context.Context, groupID ID, nickname string, authToken string) (*Member, error) {
URL := fmt.Sprintf(c.endpointBase+updateMemberEndpoint, groupID) URL := fmt.Sprintf(c.endpointBase+updateMemberEndpoint, groupID)
type Nickname struct { type Nickname struct {
@ -173,7 +176,7 @@ func (c *Client) UpdateMember(ctx context.Context, groupID ID, nickname string)
var resp Member var resp Member
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -75,7 +75,7 @@ we return code 304.
Note that for historical reasons, likes are returned as an Note that for historical reasons, likes are returned as an
array of user ids in the favorited_by key. array of user ids in the favorited_by key.
*/ */
func (c *Client) IndexMessages(ctx context.Context, groupID ID, req *IndexMessagesQuery) (IndexMessagesResponse, error) { func (c *Client) IndexMessages(ctx context.Context, groupID ID, req *IndexMessagesQuery, authToken string) (IndexMessagesResponse, error) {
url := fmt.Sprintf(c.endpointBase+indexMessagesEndpoint, groupID) url := fmt.Sprintf(c.endpointBase+indexMessagesEndpoint, groupID)
httpReq, err := http.NewRequest("GET", url, nil) httpReq, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
@ -101,7 +101,7 @@ func (c *Client) IndexMessages(ctx context.Context, groupID ID, req *IndexMessag
URL.RawQuery = query.Encode() URL.RawQuery = query.Encode()
var resp IndexMessagesResponse var resp IndexMessagesResponse
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return IndexMessagesResponse{}, err return IndexMessagesResponse{}, err
} }
@ -125,7 +125,7 @@ The character map is an array of arrays containing rune data
The placeholder should be a high-point/invisible UTF-8 character. The placeholder should be a high-point/invisible UTF-8 character.
*/ */
func (c *Client) CreateMessage(ctx context.Context, groupID ID, m *Message) (*Message, error) { func (c *Client) CreateMessage(ctx context.Context, groupID ID, m *Message, authToken string) (*Message, error) {
URL := fmt.Sprintf(c.endpointBase+createMessagesEndpoint, groupID) URL := fmt.Sprintf(c.endpointBase+createMessagesEndpoint, groupID)
m.SourceGUID = uuid.New().String() m.SourceGUID = uuid.New().String()
@ -148,7 +148,7 @@ func (c *Client) CreateMessage(ctx context.Context, groupID ID, m *Message) (*Me
var resp struct { var resp struct {
*Message `json:"message"` *Message `json:"message"`
} }
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -25,7 +25,6 @@ var (
) )
var concur = sync.Mutex{} var concur = sync.Mutex{}
var token string
type HandlerAll interface { type HandlerAll interface {
Handler Handler
@ -118,17 +117,8 @@ var RealTimeHandlers map[string]func(r *PushSubscription, channel string, data .
var RealTimeSystemHandlers map[string]func(r *PushSubscription, channel string, id ID, rawData []byte) var RealTimeSystemHandlers map[string]func(r *PushSubscription, channel string, id ID, rawData []byte)
// Listen connects to GroupMe. Runs in Goroutine. // Listen connects to GroupMe. Runs in Goroutine.
func (r *PushSubscription) Connect(context context.Context, authorizationToken string) error { func (r *PushSubscription) Connect(context context.Context) error {
token = authorizationToken c, err := fayec.NewClient(PushServer)
var authenticationExtension message.Extension = func(message *message.Message) {
if message.Channel == "/meta/subscribe" {
message.Ext = map[string]string{
"access_token": authorizationToken,
"timestamp": string(time.Now().Unix()),
}
}
}
c, err := fayec.NewClient(PushServer, fayec.WithOutExtension(authenticationExtension))
if err != nil { if err != nil {
return err return err
} }
@ -138,22 +128,22 @@ func (r *PushSubscription) Connect(context context.Context, authorizationToken s
} }
// SubscribeToUser to users // SubscribeToUser to users
func (r *PushSubscription) SubscribeToUser(context context.Context, id ID) error { func (r *PushSubscription) SubscribeToUser(context context.Context, id ID, authToken string) error {
return r.subscribeWithPrefix(userChannel, context, id) return r.subscribeWithPrefix(userChannel, context, id, authToken)
} }
// SubscribeToGroup to groups for typing notification // SubscribeToGroup to groups for typing notification
func (r *PushSubscription) SubscribeToGroup(context context.Context, id ID) error { func (r *PushSubscription) SubscribeToGroup(context context.Context, id ID, authToken string) error {
return r.subscribeWithPrefix(groupChannel, context, id) return r.subscribeWithPrefix(groupChannel, context, id, authToken)
} }
// SubscribeToDM to users // SubscribeToDM to users
func (r *PushSubscription) SubscribeToDM(context context.Context, id ID) error { func (r *PushSubscription) SubscribeToDM(context context.Context, id ID, authToken string) error {
id = ID(strings.Replace(id.String(), "+", "_", 1)) id = ID(strings.Replace(id.String(), "+", "_", 1))
return r.subscribeWithPrefix(dmChannel, context, id) return r.subscribeWithPrefix(dmChannel, context, id, authToken)
} }
func (r *PushSubscription) subscribeWithPrefix(prefix string, context context.Context, groupID ID) error { func (r *PushSubscription) subscribeWithPrefix(prefix string, context context.Context, groupID ID, authToken string) error {
concur.Lock() concur.Lock()
defer concur.Unlock() defer concur.Unlock()
if r.client == nil { if r.client == nil {
@ -161,7 +151,7 @@ func (r *PushSubscription) subscribeWithPrefix(prefix string, context context.Co
} }
var sub *subscription.Subscription var sub *subscription.Subscription
sub, err := r.client.Subscribe(prefix + groupID.String()) sub, err := r.client.Subscribe(prefix+groupID.String(), authToken)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@ -31,13 +31,14 @@ Enables SMS mode for N hours, where N is at most 48. After N
hours have elapsed, user will receive push notfications. hours have elapsed, user will receive push notfications.
Parameters: Parameters:
duration - required, integer duration - required, integer
registration_id - string; The push notification ID/token registration_id - string; The push notification ID/token
that should be suppressed during SMS mode. If this is that should be suppressed during SMS mode. If this is
omitted, both SMS and push notifications will be omitted, both SMS and push notifications will be
delivered to the device. delivered to the device.
*/ */
func (c *Client) CreateSMSMode(ctx context.Context, duration int, registrationID *ID) error { func (c *Client) CreateSMSMode(ctx context.Context, duration int, registrationID *ID, authToken string) error {
URL := fmt.Sprintf(c.endpointBase + createSMSModeEndpoint) URL := fmt.Sprintf(c.endpointBase + createSMSModeEndpoint)
var data = struct { var data = struct {
@ -58,7 +59,7 @@ func (c *Client) CreateSMSMode(ctx context.Context, duration int, registrationID
return err return err
} }
err = c.doWithAuthToken(ctx, httpReq, nil) err = c.doWithAuthToken(ctx, httpReq, nil, authToken)
if err != nil { if err != nil {
return err return err
} }
@ -73,7 +74,7 @@ DeleteSMSMode -
Disables SMS mode Disables SMS mode
*/ */
func (c *Client) DeleteSMSMode(ctx context.Context) error { func (c *Client) DeleteSMSMode(ctx context.Context, authToken string) error {
url := fmt.Sprintf(c.endpointBase + deleteSMSModeEndpoint) url := fmt.Sprintf(c.endpointBase + deleteSMSModeEndpoint)
httpReq, err := http.NewRequest("POST", url, nil) httpReq, err := http.NewRequest("POST", url, nil)
@ -81,5 +82,5 @@ func (c *Client) DeleteSMSMode(ctx context.Context) error {
return err return err
} }
return c.doWithAuthToken(ctx, httpReq, nil) return c.doWithAuthToken(ctx, httpReq, nil, authToken)
} }

View File

@ -31,9 +31,10 @@ MyUser -
Loads a specific group. Loads a specific group.
Parameters: Parameters:
groupID - required, ID(string) groupID - required, ID(string)
*/ */
func (c *Client) MyUser(ctx context.Context) (*User, error) { func (c *Client) MyUser(ctx context.Context, authToken string) (*User, error) {
URL := fmt.Sprintf(c.endpointBase + myUserEndpoint) URL := fmt.Sprintf(c.endpointBase + myUserEndpoint)
httpReq, err := http.NewRequest("GET", URL, nil) httpReq, err := http.NewRequest("GET", URL, nil)
@ -42,7 +43,7 @@ func (c *Client) MyUser(ctx context.Context) (*User, error) {
} }
var resp User var resp User
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -65,11 +66,11 @@ type UserSettings struct {
/* /*
UpdateMyUser - UpdateMyUser -
Update attributes about your own account # Update attributes about your own account
Parameters: See UserSettings Parameters: See UserSettings
*/ */
func (c *Client) UpdateMyUser(ctx context.Context, us UserSettings) (*User, error) { func (c *Client) UpdateMyUser(ctx context.Context, us UserSettings, authToken string) (*User, error) {
URL := fmt.Sprintf(c.endpointBase + updateMyUserEndpoint) URL := fmt.Sprintf(c.endpointBase + updateMyUserEndpoint)
jsonBytes, err := json.Marshal(&us) jsonBytes, err := json.Marshal(&us)
@ -83,7 +84,7 @@ func (c *Client) UpdateMyUser(ctx context.Context, us UserSettings) (*User, erro
} }
var resp User var resp User
err = c.doWithAuthToken(ctx, httpReq, &resp) err = c.doWithAuthToken(ctx, httpReq, &resp, authToken)
if err != nil { if err != nil {
return nil, err return nil, err
} }