From 08bfe83ba457ac9c74d465768346e5dc735d8f19 Mon Sep 17 00:00:00 2001 From: watsonb8 Date: Tue, 19 Sep 2023 21:08:46 -0500 Subject: [PATCH] Updating API to re-use client for multiple users --- blocks_api.go | 16 +++++----- bots_api.go | 12 +++---- chats_api.go | 8 ++--- client.go | 16 ++++------ direct_messages_api.go | 9 +++--- examples/real_time_updates/main.go | 16 +++++----- go.mod | 2 +- go.sum | 2 ++ groups_api.go | 51 ++++++++++++++++-------------- leaderboard_api.go | 14 ++++---- likes_api.go | 8 ++--- members_api.go | 19 ++++++----- messages_api.go | 8 ++--- real_time.go | 30 ++++++------------ sms_mode_api.go | 9 +++--- users_api.go | 11 ++++--- 16 files changed, 117 insertions(+), 114 deletions(-) diff --git a/blocks_api.go b/blocks_api.go index 363f38b..1ab9aa2 100644 --- a/blocks_api.go +++ b/blocks_api.go @@ -23,7 +23,7 @@ const ( /*//////// API Requests ////////*/ // 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) if err != nil { return nil, err @@ -37,7 +37,7 @@ func (c *Client) IndexBlock(ctx context.Context, userID string) ([]*Block, error var resp struct { Blocks []*Block `json:"blocks"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { 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 -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) if err != nil { return false, err @@ -61,7 +61,7 @@ func (c *Client) BlockBetween(ctx context.Context, userID, otherUserID string) ( var resp struct { Between bool `json:"between"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { 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 -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) if err != nil { return nil, err @@ -85,7 +85,7 @@ func (c *Client) CreateBlock(ctx context.Context, userID, otherUserID string) (* var resp struct { Block *Block `json:"block"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { 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 -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) if err != nil { return err @@ -106,7 +106,7 @@ func (c *Client) Unblock(ctx context.Context, userID, otherUserID string) error query.Set("otherUser", otherUserID) URL.RawQuery = query.Encode() - err = c.doWithAuthToken(ctx, httpReq, nil) + err = c.doWithAuthToken(ctx, httpReq, nil, authToken) if err != nil { return err } diff --git a/bots_api.go b/bots_api.go index 7b58eff..95c459a 100644 --- a/bots_api.go +++ b/bots_api.go @@ -27,7 +27,7 @@ const ( // CreateBot - Create a bot. See the Bots Tutorial (https://dev.groupme.com/tutorials/bots) // 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 var data = struct { @@ -47,7 +47,7 @@ func (c *Client) CreateBot(ctx context.Context, bot *Bot) (*Bot, error) { } var resp Bot - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { 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 -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) if err != nil { return nil, err } var resp []*Bot - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -100,7 +100,7 @@ func (c *Client) IndexBots(ctx context.Context) ([]*Bot, error) { } // 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) var data = struct { @@ -119,5 +119,5 @@ func (c *Client) DestroyBot(ctx context.Context, botID ID) error { return err } - return c.doWithAuthToken(ctx, httpReq, nil) + return c.doWithAuthToken(ctx, httpReq, nil, authToken) } diff --git a/chats_api.go b/chats_api.go index 97f454a..9acfa46 100644 --- a/chats_api.go +++ b/chats_api.go @@ -27,7 +27,7 @@ type IndexChatsQuery struct { // IndexChats - Returns a paginated list of direct message chats, or // 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) if err != nil { return nil, err @@ -46,14 +46,14 @@ func (c *Client) IndexChats(ctx context.Context, req *IndexChatsQuery) ([]*Chat, URL.RawQuery = query.Encode() var resp []*Chat - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } 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) if err != nil { return nil, err @@ -66,7 +66,7 @@ func (c *Client) IndexRelations(ctx context.Context) ([]*User, error) { URL.RawQuery = query.Encode() var resp []*User - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } diff --git a/client.go b/client.go index 1c7723d..aca7144 100644 --- a/client.go +++ b/client.go @@ -16,18 +16,16 @@ const GroupMeAPIBase = "https://api.groupme.com/v3" // Client communicates with the GroupMe API to perform actions // on the basic types, i.e. Listing, Creating, Destroying type Client struct { - httpClient *http.Client - endpointBase string - authorizationToken string + httpClient *http.Client + endpointBase string } // NewClient creates a new GroupMe API Client -func NewClient(authToken string) *Client { +func NewClient() *Client { return &Client{ // TODO: enable transport information passing in - httpClient: &http.Client{}, - endpointBase: GroupMeAPIBase, - authorizationToken: authToken, + httpClient: &http.Client{}, + endpointBase: GroupMeAPIBase, } } @@ -112,10 +110,10 @@ func (c Client) do(ctx context.Context, req *http.Request, i interface{}) error 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 query := URL.Query() - query.Set("token", c.authorizationToken) + query.Set("token", authToken) URL.RawQuery = query.Encode() return c.do(ctx, req, i) diff --git a/direct_messages_api.go b/direct_messages_api.go index e7e640d..c51116e 100644 --- a/direct_messages_api.go +++ b/direct_messages_api.go @@ -63,10 +63,11 @@ 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) (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) if err != nil { return IndexDirectMessagesResponse{}, err @@ -85,7 +86,7 @@ func (c *Client) IndexDirectMessages(ctx context.Context, otherUserID string, re httpReq.URL.RawQuery = query.Encode() var resp IndexDirectMessagesResponse - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { 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 ([[{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) m.SourceGUID = uuid.New().String() @@ -130,7 +131,7 @@ func (c *Client) CreateDirectMessage(ctx context.Context, m *Message) (*Message, var resp struct { *Message `json:"direct_message"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } diff --git a/examples/real_time_updates/main.go b/examples/real_time_updates/main.go index f9ad5b1..b3be668 100644 --- a/examples/real_time_updates/main.go +++ b/examples/real_time_updates/main.go @@ -18,20 +18,20 @@ var authorizationToken = "ABCD" func main() { //create push subscription and start listening p := groupme.NewPushSubscription(context.Background()) - err := p.Connect(context.TODO(), authorizationToken) + err := p.Connect(context.TODO()) if err != nil { return } // Create a new client with your auth token - client := groupme.NewClient(authorizationToken) - User, _ := client.MyUser(context.Background()) + client := groupme.NewClient() + User, _ := client.MyUser(context.Background(), authorizationToken) //handles (in this case prints) all messages p.AddFullHandler(Handler{User: 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 { log.Fatal(err) } @@ -43,7 +43,7 @@ func main() { Page: 0, PerPage: 2, Omit: "memberships", - }) + }, authorizationToken) if err != nil { fmt.Println(err) @@ -51,7 +51,7 @@ func main() { } //Subscribe to those groups for _, j := range groups { - err = p.SubscribeToGroup(context.TODO(), j.ID) + err = p.SubscribeToGroup(context.TODO(), j.ID, authorizationToken) if err != nil { log.Fatal(err) } @@ -62,10 +62,10 @@ func main() { &groupme.IndexChatsQuery{ Page: 0, PerPage: 2, - }) + }, authorizationToken) //subscribe to all those 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 { log.Fatal(err) } diff --git a/go.mod b/go.mod index 2c9d024..5635e0b 100755 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module gitea.watsonlabs.net/watsonb8/groupme-lib go 1.21.0 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/gorilla/mux v1.8.0 github.com/stretchr/testify v1.7.0 diff --git a/go.sum b/go.sum index 4a5f90b..cb0f622 100755 --- a/go.sum +++ b/go.sum @@ -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.2 h1:tqbgr1vRZ6Wq4W81xBg+FTOywSv3EJpK263SAVXXTco= 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/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/groups_api.go b/groups_api.go index 0a8b8f7..eb96c65 100755 --- a/groups_api.go +++ b/groups_api.go @@ -86,7 +86,7 @@ app for users who are participating in huge groups. 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) if err != nil { return nil, err @@ -108,7 +108,7 @@ func (c *Client) IndexGroups(ctx context.Context, req *GroupsQuery) ([]*Group, e URL.RawQuery = query.Encode() var resp []*Group - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -123,14 +123,14 @@ FormerGroups - 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) if err != nil { return nil, err } var resp []*Group - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -146,9 +146,10 @@ ShowGroup - Loads a specific group. Parameters: + 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) 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 - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -170,11 +171,11 @@ func (c *Client) ShowGroup(ctx context.Context, groupID ID) (*Group, error) { /* CreateGroup - -Create a new group +# Create a new group 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) jsonBytes, err := json.Marshal(&gs) @@ -188,7 +189,7 @@ func (c *Client) CreateGroup(ctx context.Context, gs GroupSettings) (*Group, err } var resp Group - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -201,13 +202,14 @@ func (c *Client) CreateGroup(ctx context.Context, gs GroupSettings) (*Group, err /* UpdateGroup - -Update a group after creation +# Update a group after creation Parameters: + groupID - required, ID(string) 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) jsonBytes, err := json.Marshal(&gs) @@ -221,7 +223,7 @@ func (c *Client) UpdateGroup(ctx context.Context, groupID ID, gs GroupSettings) } var resp Group - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -234,14 +236,15 @@ func (c *Client) UpdateGroup(ctx context.Context, groupID ID, gs GroupSettings) /* 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: + 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) httpReq, err := http.NewRequest("POST", url, nil) @@ -249,7 +252,7 @@ func (c *Client) DestroyGroup(ctx context.Context, groupID ID) error { return err } - return c.doWithAuthToken(ctx, httpReq, nil) + return c.doWithAuthToken(ctx, httpReq, nil, authToken) } /*/// Join ///*/ @@ -257,13 +260,14 @@ func (c *Client) DestroyGroup(ctx context.Context, groupID ID) error { /* JoinGroup - -Join a shared group +# Join a shared group Parameters: + groupID - required, ID(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) 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 - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -288,9 +292,10 @@ RejoinGroup - Rejoin a group. Only works if you previously removed yourself. Parameters: + 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) var data = struct { @@ -310,7 +315,7 @@ func (c *Client) RejoinGroup(ctx context.Context, groupID ID) (*Group, error) { } var resp Group - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -330,7 +335,7 @@ the result of change owner action for the request 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) var data = struct { @@ -353,7 +358,7 @@ func (c *Client) ChangeGroupOwner(ctx context.Context, reqs ChangeOwnerRequest) Results []ChangeOwnerResult `json:"results"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return ChangeOwnerResult{}, err } diff --git a/leaderboard_api.go b/leaderboard_api.go index ab46031..46b0a4b 100644 --- a/leaderboard_api.go +++ b/leaderboard_api.go @@ -35,7 +35,7 @@ const ( // 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. -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) httpReq, err := http.NewRequest("GET", url, nil) if err != nil { @@ -50,7 +50,7 @@ func (c *Client) IndexLeaderboard(ctx context.Context, groupID ID, p period) ([] var resp struct { Messages []*Message `json:"messages"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -68,9 +68,10 @@ reverse chrono-order. Note that the payload includes a liked_at timestamp in ISO-8601 format. Parameters: + 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) httpReq, err := http.NewRequest("GET", url, nil) if err != nil { @@ -80,7 +81,7 @@ func (c *Client) MyLikesLeaderboard(ctx context.Context, groupID ID) ([]*Message var resp struct { Messages []*Message `json:"messages"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -98,9 +99,10 @@ reverse chrono-order. Note that the payload includes a liked_at timestamp in ISO-8601 format. Parameters: + 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) httpReq, err := http.NewRequest("GET", url, nil) if err != nil { @@ -110,7 +112,7 @@ func (c *Client) MyHitsLeaderboard(ctx context.Context, groupID ID) ([]*Message, var resp struct { Messages []*Message `json:"messages"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } diff --git a/likes_api.go b/likes_api.go index 107396c..5e73005 100644 --- a/likes_api.go +++ b/likes_api.go @@ -23,7 +23,7 @@ const ( // Create // 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) 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 c.doWithAuthToken(ctx, httpReq, nil) + return c.doWithAuthToken(ctx, httpReq, nil, authToken) } // 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) httpReq, err := http.NewRequest("POST", url, nil) @@ -43,5 +43,5 @@ func (c *Client) DestroyLike(ctx context.Context, conversationID, messageID ID) return err } - return c.doWithAuthToken(ctx, httpReq, nil) + return c.doWithAuthToken(ctx, httpReq, nil, authToken) } diff --git a/members_api.go b/members_api.go index 6a11eb0..0f8f357 100644 --- a/members_api.go +++ b/members_api.go @@ -40,6 +40,7 @@ GUIDs can be added to the members parameters. These GUIDs will be reflected in the membership JSON objects. Parameters: + groupID - required, ID(string) See Member. Nickname - required @@ -48,7 +49,7 @@ Parameters: PhoneNumber - PhoneNumber(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) var data = struct { @@ -71,7 +72,7 @@ func (c *Client) AddMembers(ctx context.Context, groupID ID, members ...*Member) ResultsID string `json:"results_id"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { 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. Parameters: + groupID - required, ID(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) 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"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { 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. Parameters: + groupID - required, ID(string) 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) 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 c.doWithAuthToken(ctx, httpReq, nil) + return c.doWithAuthToken(ctx, httpReq, nil, authToken) } /*/// Update ///*/ @@ -149,7 +152,7 @@ UpdateMember - Update your nickname in a group. The nickname must be 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) type Nickname struct { @@ -173,7 +176,7 @@ func (c *Client) UpdateMember(ctx context.Context, groupID ID, nickname string) var resp Member - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } diff --git a/messages_api.go b/messages_api.go index 93223b2..9b7a908 100644 --- a/messages_api.go +++ b/messages_api.go @@ -75,7 +75,7 @@ we return code 304. Note that for historical reasons, likes are returned as an 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) httpReq, err := http.NewRequest("GET", url, nil) if err != nil { @@ -101,7 +101,7 @@ func (c *Client) IndexMessages(ctx context.Context, groupID ID, req *IndexMessag URL.RawQuery = query.Encode() var resp IndexMessagesResponse - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { 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. */ -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) m.SourceGUID = uuid.New().String() @@ -148,7 +148,7 @@ func (c *Client) CreateMessage(ctx context.Context, groupID ID, m *Message) (*Me var resp struct { *Message `json:"message"` } - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } diff --git a/real_time.go b/real_time.go index 7e7b8fc..0332a5e 100644 --- a/real_time.go +++ b/real_time.go @@ -25,7 +25,6 @@ var ( ) var concur = sync.Mutex{} -var token string type HandlerAll interface { 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) // Listen connects to GroupMe. Runs in Goroutine. -func (r *PushSubscription) Connect(context context.Context, authorizationToken string) error { - token = authorizationToken - 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)) +func (r *PushSubscription) Connect(context context.Context) error { + c, err := fayec.NewClient(PushServer) if err != nil { return err } @@ -138,22 +128,22 @@ func (r *PushSubscription) Connect(context context.Context, authorizationToken s } // SubscribeToUser to users -func (r *PushSubscription) SubscribeToUser(context context.Context, id ID) error { - return r.subscribeWithPrefix(userChannel, context, id) +func (r *PushSubscription) SubscribeToUser(context context.Context, id ID, authToken string) error { + return r.subscribeWithPrefix(userChannel, context, id, authToken) } // SubscribeToGroup to groups for typing notification -func (r *PushSubscription) SubscribeToGroup(context context.Context, id ID) error { - return r.subscribeWithPrefix(groupChannel, context, id) +func (r *PushSubscription) SubscribeToGroup(context context.Context, id ID, authToken string) error { + return r.subscribeWithPrefix(groupChannel, context, id, authToken) } // 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)) - 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() defer concur.Unlock() if r.client == nil { @@ -161,7 +151,7 @@ func (r *PushSubscription) subscribeWithPrefix(prefix string, context context.Co } var sub *subscription.Subscription - sub, err := r.client.Subscribe(prefix + groupID.String()) + sub, err := r.client.Subscribe(prefix+groupID.String(), authToken) if err != nil { panic(err) } diff --git a/sms_mode_api.go b/sms_mode_api.go index 5d1ccb5..1fe802f 100644 --- a/sms_mode_api.go +++ b/sms_mode_api.go @@ -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. Parameters: + duration - required, integer registration_id - string; The push notification ID/token that should be suppressed during SMS mode. If this is omitted, both SMS and push notifications will be 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) var data = struct { @@ -58,7 +59,7 @@ func (c *Client) CreateSMSMode(ctx context.Context, duration int, registrationID return err } - err = c.doWithAuthToken(ctx, httpReq, nil) + err = c.doWithAuthToken(ctx, httpReq, nil, authToken) if err != nil { return err } @@ -73,7 +74,7 @@ DeleteSMSMode - 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) httpReq, err := http.NewRequest("POST", url, nil) @@ -81,5 +82,5 @@ func (c *Client) DeleteSMSMode(ctx context.Context) error { return err } - return c.doWithAuthToken(ctx, httpReq, nil) + return c.doWithAuthToken(ctx, httpReq, nil, authToken) } diff --git a/users_api.go b/users_api.go index 3e05f93..e805370 100644 --- a/users_api.go +++ b/users_api.go @@ -31,9 +31,10 @@ MyUser - Loads a specific group. Parameters: + 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) httpReq, err := http.NewRequest("GET", URL, nil) @@ -42,7 +43,7 @@ func (c *Client) MyUser(ctx context.Context) (*User, error) { } var resp User - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err } @@ -65,11 +66,11 @@ type UserSettings struct { /* UpdateMyUser - -Update attributes about your own account +# Update attributes about your own account 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) jsonBytes, err := json.Marshal(&us) @@ -83,7 +84,7 @@ func (c *Client) UpdateMyUser(ctx context.Context, us UserSettings) (*User, erro } var resp User - err = c.doWithAuthToken(ctx, httpReq, &resp) + err = c.doWithAuthToken(ctx, httpReq, &resp, authToken) if err != nil { return nil, err }