Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
d8cdcf4ef2 | |||
010fd832ac | |||
bd76de2ffe | |||
537a97ebe7 | |||
9ee368f10d | |||
d9dec16e27 | |||
755d681f86 | |||
f0aa4a6d73 |
29
.github/workflows/go-test.yml
vendored
Normal file
29
.github/workflows/go-test.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
name: test
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- v*
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v1
|
||||||
|
with:
|
||||||
|
go-version: 1.14
|
||||||
|
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Run Unit tests.
|
||||||
|
run: go test -coverprofile cover.out -covermode=atomic ${PKG_LIST} && cat cover.out >> coverage.txt
|
||||||
|
|
||||||
|
- name: Upload Coverage report to CodeCov
|
||||||
|
uses: codecov/codecov-action@v1.0.0
|
||||||
|
with:
|
||||||
|
token: ${{secrets.CODECOV_TOKEN}}
|
||||||
|
file: ./coverage.txt
|
28
.github/workflows/golangci-lint.yml
vendored
Normal file
28
.github/workflows/golangci-lint.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
name: golangci-lint
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- v*
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
jobs:
|
||||||
|
golangci:
|
||||||
|
name: lint
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: golangci-lint
|
||||||
|
uses: golangci/golangci-lint-action@v1
|
||||||
|
with:
|
||||||
|
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
|
||||||
|
version: v1.29
|
||||||
|
|
||||||
|
# Optional: working directory, useful for monorepos
|
||||||
|
# working-directory: somedir
|
||||||
|
|
||||||
|
# Optional: golangci-lint command line arguments.
|
||||||
|
# args: --issues-exit-code=0
|
||||||
|
|
||||||
|
# Optional: show only new issues if it's a pull request. The default value is `false`.
|
||||||
|
# only-new-issues: true
|
@ -6,6 +6,7 @@ I would like to add common helper functions/features inspired by the package use
|
|||||||
# GroupMe API Wrapper
|
# GroupMe API Wrapper
|
||||||

|

|
||||||
[](https://pkg.go.dev/github.com/densestvoid/groupme)
|
[](https://pkg.go.dev/github.com/densestvoid/groupme)
|
||||||
|
[](https://codecov.io/gh/densestvoid/groupme)
|
||||||
## Description
|
## Description
|
||||||
The design of this package is meant to be super simple. Wrap the exposed API endpoints [documented](https://dev.groupme.com/docs/v3#v3) by the GroupMe team. While you can achieve the core of this package with cURL, there are some small added features, coupled along with a modern language, that should simplify writing GroupMe [bots](https://dev.groupme.com/bots) and [applications](https://dev.groupme.com/applications).
|
The design of this package is meant to be super simple. Wrap the exposed API endpoints [documented](https://dev.groupme.com/docs/v3#v3) by the GroupMe team. While you can achieve the core of this package with cURL, there are some small added features, coupled along with a modern language, that should simplify writing GroupMe [bots](https://dev.groupme.com/bots) and [applications](https://dev.groupme.com/applications).
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ func (c *Client) IndexBlock(userID ID) ([]*Block, error) {
|
|||||||
var resp struct {
|
var resp struct {
|
||||||
Blocks []*Block `json:"blocks"`
|
Blocks []*Block `json:"blocks"`
|
||||||
}
|
}
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ func (c *Client) BlockBetween(userID, otherUserID ID) (bool, error) {
|
|||||||
var resp struct {
|
var resp struct {
|
||||||
Between bool `json:"between"`
|
Between bool `json:"between"`
|
||||||
}
|
}
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
@ -111,7 +111,7 @@ func (c *Client) CreateBlock(userID, otherUserID ID) (*Block, error) {
|
|||||||
var resp struct {
|
var resp struct {
|
||||||
Block *Block `json:"block"`
|
Block *Block `json:"block"`
|
||||||
}
|
}
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -142,7 +142,7 @@ func (c *Client) Unblock(userID, otherUserID ID) error {
|
|||||||
query.Set("otherUser", otherUserID.String())
|
query.Set("otherUser", otherUserID.String())
|
||||||
URL.RawQuery = query.Encode()
|
URL.RawQuery = query.Encode()
|
||||||
|
|
||||||
err = c.do(httpReq, nil)
|
err = c.doWithAuthToken(httpReq, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
70
bots_api.go
70
bots_api.go
@ -1,10 +1,10 @@
|
|||||||
package groupme
|
package groupme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupMe documentation: https://dev.groupme.com/docs/v3#bots
|
// GroupMe documentation: https://dev.groupme.com/docs/v3#bots
|
||||||
@ -37,22 +37,26 @@ Parameters:
|
|||||||
GroupID - required
|
GroupID - required
|
||||||
*/
|
*/
|
||||||
func (c *Client) CreateBot(bot *Bot) (*Bot, error) {
|
func (c *Client) CreateBot(bot *Bot) (*Bot, error) {
|
||||||
httpReq, err := http.NewRequest("POST", c.endpointBase+createBotEndpoint, nil)
|
URL := c.endpointBase + createBotEndpoint
|
||||||
|
|
||||||
|
var data = struct {
|
||||||
|
Bot *Bot `json:"bot,omitempty"`
|
||||||
|
}{
|
||||||
|
bot,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if bot == nil {
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
return nil, errors.New("bot cannot be nil")
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
|
||||||
data.Add("bot", bot.String())
|
|
||||||
|
|
||||||
httpReq.PostForm = data
|
|
||||||
|
|
||||||
var resp Bot
|
var resp Bot
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -77,20 +81,26 @@ Parameters:
|
|||||||
func (c *Client) PostBotMessage(botID ID, text string, pictureURL *string) error {
|
func (c *Client) PostBotMessage(botID ID, text string, pictureURL *string) error {
|
||||||
URL := fmt.Sprintf(c.endpointBase + postBotMessageEndpoint)
|
URL := fmt.Sprintf(c.endpointBase + postBotMessageEndpoint)
|
||||||
|
|
||||||
httpReq, err := http.NewRequest("POST", URL, nil)
|
var data = struct {
|
||||||
|
BotID ID `json:"bot_id"`
|
||||||
|
Text string `json:"text"`
|
||||||
|
PictureURL *string `json:",omitempty"`
|
||||||
|
}{
|
||||||
|
botID,
|
||||||
|
text,
|
||||||
|
pictureURL,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
data.Add("bot_id", string(botID))
|
if err != nil {
|
||||||
data.Add("text", text)
|
return err
|
||||||
if pictureURL != nil {
|
|
||||||
data.Add("picture_url", *pictureURL)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
httpReq.PostForm = data
|
|
||||||
|
|
||||||
return c.do(httpReq, nil)
|
return c.do(httpReq, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,7 +118,7 @@ func (c *Client) IndexBots() ([]*Bot, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var resp []*Bot
|
var resp []*Bot
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -129,15 +139,21 @@ Parameters:
|
|||||||
func (c *Client) DestroyBot(botID ID) error {
|
func (c *Client) DestroyBot(botID ID) error {
|
||||||
URL := fmt.Sprintf(c.endpointBase + destroyBotEndpoint)
|
URL := fmt.Sprintf(c.endpointBase + destroyBotEndpoint)
|
||||||
|
|
||||||
httpReq, err := http.NewRequest("POST", URL, nil)
|
var data = struct {
|
||||||
|
BotID ID `json:"bot_id"`
|
||||||
|
}{
|
||||||
|
botID,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
data.Add("bot_id", string(botID))
|
if err != nil {
|
||||||
|
return err
|
||||||
httpReq.PostForm = data
|
}
|
||||||
|
|
||||||
return c.do(httpReq, nil)
|
return c.doWithAuthToken(httpReq, nil)
|
||||||
}
|
}
|
||||||
|
@ -51,10 +51,11 @@ func TestBotsAPISuite(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func botsTestRouter() *mux.Router {
|
func botsTestRouter() *mux.Router {
|
||||||
router := mux.NewRouter().Queries("token", "").Subrouter()
|
router := mux.NewRouter()
|
||||||
|
authRouter := router.Queries("token", "").Subrouter()
|
||||||
|
|
||||||
// Create
|
// Create
|
||||||
router.Path("/bots").
|
authRouter.Path("/bots").
|
||||||
Methods("POST").
|
Methods("POST").
|
||||||
Name("CreateBot").
|
Name("CreateBot").
|
||||||
HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||||
@ -84,7 +85,7 @@ func botsTestRouter() *mux.Router {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Index
|
// Index
|
||||||
router.Path("/bots").
|
authRouter.Path("/bots").
|
||||||
Methods("GET").
|
Methods("GET").
|
||||||
Name("IndexBots").
|
Name("IndexBots").
|
||||||
HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||||
@ -108,7 +109,7 @@ func botsTestRouter() *mux.Router {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Destroy
|
// Destroy
|
||||||
router.Path("/bots/destroy").
|
authRouter.Path("/bots/destroy").
|
||||||
Methods("POST").
|
Methods("POST").
|
||||||
Name("DestroyBot").
|
Name("DestroyBot").
|
||||||
HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||||
|
@ -52,7 +52,7 @@ func (c *Client) IndexChats(req *IndexChatsQuery) ([]*Chat, error) {
|
|||||||
URL.RawQuery = query.Encode()
|
URL.RawQuery = query.Encode()
|
||||||
|
|
||||||
var resp []*Chat
|
var resp []*Chat
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
32
client.go
32
client.go
@ -3,7 +3,7 @@ package groupme
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
@ -23,7 +23,8 @@ type Client struct {
|
|||||||
// NewClient creates a new GroupMe API Client
|
// NewClient creates a new GroupMe API Client
|
||||||
func NewClient(authToken string) *Client {
|
func NewClient(authToken string) *Client {
|
||||||
return &Client{
|
return &Client{
|
||||||
httpClient: new(http.Client),
|
// TODO: enable transport information passing in
|
||||||
|
httpClient: &http.Client{},
|
||||||
endpointBase: GroupMeAPIBase,
|
endpointBase: GroupMeAPIBase,
|
||||||
authorizationToken: authToken,
|
authorizationToken: authToken,
|
||||||
}
|
}
|
||||||
@ -59,24 +60,20 @@ func (r response) UnmarshalJSON(bs []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c Client) do(req *http.Request, i interface{}) error {
|
func (c Client) do(req *http.Request, i interface{}) error {
|
||||||
URL := req.URL
|
|
||||||
query := URL.Query()
|
|
||||||
query.Set("token", c.authorizationToken)
|
|
||||||
URL.RawQuery = query.Encode()
|
|
||||||
|
|
||||||
getResp, err := c.httpClient.Do(req)
|
getResp, err := c.httpClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
defer getResp.Body.Close()
|
||||||
|
|
||||||
|
bytes, err := ioutil.ReadAll(getResp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Check Status Code is 1XX or 2XX
|
// Check Status Code is 1XX or 2XX
|
||||||
if getResp.StatusCode/100 > 2 {
|
if getResp.StatusCode/100 > 2 {
|
||||||
return errors.New(getResp.Status)
|
return fmt.Errorf("%s: %s", getResp.Status, string(bytes))
|
||||||
}
|
|
||||||
|
|
||||||
bytes, err := ioutil.ReadAll(getResp.Body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if i == nil {
|
if i == nil {
|
||||||
@ -95,3 +92,12 @@ func (c Client) do(req *http.Request, i interface{}) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c Client) doWithAuthToken(req *http.Request, i interface{}) error {
|
||||||
|
URL := req.URL
|
||||||
|
query := URL.Query()
|
||||||
|
query.Set("token", c.authorizationToken)
|
||||||
|
URL.RawQuery = query.Encode()
|
||||||
|
|
||||||
|
return c.do(req, i)
|
||||||
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package groupme
|
package groupme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
@ -83,7 +84,7 @@ func (c *Client) IndexDirectMessages(otherUserID ID, req *IndexDirectMessagesQue
|
|||||||
}
|
}
|
||||||
|
|
||||||
var resp IndexDirectMessagesResponse
|
var resp IndexDirectMessagesResponse
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return IndexDirectMessagesResponse{}, err
|
return IndexDirectMessagesResponse{}, err
|
||||||
}
|
}
|
||||||
@ -121,22 +122,28 @@ Parameters:
|
|||||||
*/
|
*/
|
||||||
func (c *Client) CreateDirectMessage(m *Message) (*Message, error) {
|
func (c *Client) CreateDirectMessage(m *Message) (*Message, error) {
|
||||||
URL := fmt.Sprintf(c.endpointBase + createDirectMessageEndpoint)
|
URL := fmt.Sprintf(c.endpointBase + createDirectMessageEndpoint)
|
||||||
httpReq, err := http.NewRequest("POST", URL, nil)
|
|
||||||
|
m.SourceGUID = uuid.New().String()
|
||||||
|
var data = struct {
|
||||||
|
DirectMessage *Message `json:"direct_message,omitempty"`
|
||||||
|
}{
|
||||||
|
m,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
m.SourceGUID = uuid.New().String()
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
|
if err != nil {
|
||||||
data := url.Values{}
|
return nil, err
|
||||||
data.Set("direct_message", m.String())
|
}
|
||||||
|
|
||||||
httpReq.PostForm = data
|
|
||||||
|
|
||||||
var resp struct {
|
var resp struct {
|
||||||
*Message `json:"message"`
|
*Message `json:"message"`
|
||||||
}
|
}
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
package groupme
|
package groupme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -105,7 +106,7 @@ func (c *Client) IndexGroups(req *GroupsQuery) ([]*Group, error) {
|
|||||||
URL.RawQuery = query.Encode()
|
URL.RawQuery = query.Encode()
|
||||||
|
|
||||||
var resp []*Group
|
var resp []*Group
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -127,7 +128,7 @@ func (c *Client) FormerGroups() ([]*Group, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var resp []*Group
|
var resp []*Group
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -154,7 +155,7 @@ func (c *Client) ShowGroup(groupID ID) (*Group, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var resp Group
|
var resp Group
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -172,30 +173,20 @@ Create a new group
|
|||||||
Parameters: See GroupSettings
|
Parameters: See GroupSettings
|
||||||
*/
|
*/
|
||||||
func (c *Client) CreateGroup(gs GroupSettings) (*Group, error) {
|
func (c *Client) CreateGroup(gs GroupSettings) (*Group, error) {
|
||||||
httpReq, err := http.NewRequest("POST", c.endpointBase+createGroupEndpoint, nil)
|
URL := fmt.Sprintf(c.endpointBase + createGroupEndpoint)
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&gs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
if gs.Name == "" {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("GroupsCreateRequest Name field is required")
|
return nil, err
|
||||||
}
|
}
|
||||||
data.Set("name", gs.Name)
|
|
||||||
|
|
||||||
if gs.Description != "" {
|
|
||||||
data.Set("description", gs.Description)
|
|
||||||
}
|
|
||||||
if gs.ImageURL != "" {
|
|
||||||
data.Set("image_url", gs.ImageURL)
|
|
||||||
}
|
|
||||||
if gs.Share {
|
|
||||||
data.Set("share", "true")
|
|
||||||
}
|
|
||||||
httpReq.PostForm = data
|
|
||||||
|
|
||||||
var resp Group
|
var resp Group
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -217,31 +208,18 @@ Parameters:
|
|||||||
func (c *Client) UpdateGroup(groupID ID, gs GroupSettings) (*Group, error) {
|
func (c *Client) UpdateGroup(groupID ID, gs GroupSettings) (*Group, error) {
|
||||||
URL := fmt.Sprintf(c.endpointBase+updateGroupEndpoint, groupID)
|
URL := fmt.Sprintf(c.endpointBase+updateGroupEndpoint, groupID)
|
||||||
|
|
||||||
httpReq, err := http.NewRequest("POST", URL, nil)
|
jsonBytes, err := json.Marshal(&gs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
if gs.Name != "" {
|
if err != nil {
|
||||||
data.Set("name", gs.Name)
|
return nil, err
|
||||||
}
|
}
|
||||||
if gs.Description != "" {
|
|
||||||
data.Set("description", gs.Description)
|
|
||||||
}
|
|
||||||
if gs.ImageURL != "" {
|
|
||||||
data.Set("image_url", gs.ImageURL)
|
|
||||||
}
|
|
||||||
if gs.OfficeMode {
|
|
||||||
data.Set("office_mode", "true")
|
|
||||||
}
|
|
||||||
if gs.Share {
|
|
||||||
data.Set("share", "true")
|
|
||||||
}
|
|
||||||
httpReq.PostForm = data
|
|
||||||
|
|
||||||
var resp Group
|
var resp Group
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -269,7 +247,7 @@ func (c *Client) DestroyGroup(groupID ID) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.do(httpReq, nil)
|
return c.doWithAuthToken(httpReq, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
///// Join /////
|
///// Join /////
|
||||||
@ -292,7 +270,7 @@ func (c *Client) JoinGroup(groupID ID, shareToken string) (*Group, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var resp Group
|
var resp Group
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -311,17 +289,26 @@ Parameters:
|
|||||||
groupID - required, ID(string)
|
groupID - required, ID(string)
|
||||||
*/
|
*/
|
||||||
func (c *Client) RejoinGroup(groupID ID) (*Group, error) {
|
func (c *Client) RejoinGroup(groupID ID) (*Group, error) {
|
||||||
httpReq, err := http.NewRequest("POST", c.endpointBase+rejoinGroupEndpoint, nil)
|
URL := fmt.Sprintf(c.endpointBase + rejoinGroupEndpoint)
|
||||||
|
|
||||||
|
var data = struct {
|
||||||
|
GroupID ID `json:"group_id"`
|
||||||
|
}{
|
||||||
|
groupID,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
data.Set("group_id", string(groupID))
|
if err != nil {
|
||||||
httpReq.PostForm = data
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var resp Group
|
var resp Group
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -344,20 +331,29 @@ the result of change owner action for the request
|
|||||||
Parameters: See ChangeOwnerRequest
|
Parameters: See ChangeOwnerRequest
|
||||||
*/
|
*/
|
||||||
func (c *Client) ChangeGroupOwner(reqs ChangeOwnerRequest) (ChangeOwnerResult, error) {
|
func (c *Client) ChangeGroupOwner(reqs ChangeOwnerRequest) (ChangeOwnerResult, error) {
|
||||||
httpReq, err := http.NewRequest("POST", c.endpointBase+changeGroupOwnerEndpoint, nil)
|
URL := fmt.Sprintf(c.endpointBase + changeGroupOwnerEndpoint)
|
||||||
|
|
||||||
|
var data = struct {
|
||||||
|
Requests []ChangeOwnerRequest `json:"requests"`
|
||||||
|
}{
|
||||||
|
[]ChangeOwnerRequest{reqs},
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ChangeOwnerResult{}, err
|
return ChangeOwnerResult{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
data.Set("requests", marshal([]ChangeOwnerRequest{reqs}))
|
if err != nil {
|
||||||
httpReq.PostForm = data
|
return ChangeOwnerResult{}, err
|
||||||
|
}
|
||||||
|
|
||||||
var resp struct {
|
var resp struct {
|
||||||
Results []ChangeOwnerResult `json:"results"`
|
Results []ChangeOwnerResult `json:"results"`
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ChangeOwnerResult{}, err
|
return ChangeOwnerResult{}, err
|
||||||
}
|
}
|
||||||
|
@ -56,14 +56,6 @@ func (s *GroupsAPISuite) TestGroupsCreate() {
|
|||||||
s.Assert().NotZero(group)
|
s.Assert().NotZero(group)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *GroupsAPISuite) TestGroupsCreate_EmptyName() {
|
|
||||||
group, err := s.client.CreateGroup(GroupSettings{
|
|
||||||
Name: "",
|
|
||||||
})
|
|
||||||
s.Require().Error(err)
|
|
||||||
s.Assert().Zero(group)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *GroupsAPISuite) TestGroupsUpdate() {
|
func (s *GroupsAPISuite) TestGroupsUpdate() {
|
||||||
group, err := s.client.UpdateGroup("1", GroupSettings{
|
group, err := s.client.UpdateGroup("1", GroupSettings{
|
||||||
"Test",
|
"Test",
|
||||||
|
@ -60,7 +60,7 @@ func (c *Client) IndexLeaderboard(groupID ID, p period) ([]*Message, error) {
|
|||||||
var resp struct {
|
var resp struct {
|
||||||
Messages []*Message `json:"messages"`
|
Messages []*Message `json:"messages"`
|
||||||
}
|
}
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -90,7 +90,7 @@ func (c *Client) MyLikesLeaderboard(groupID ID) ([]*Message, error) {
|
|||||||
var resp struct {
|
var resp struct {
|
||||||
Messages []*Message `json:"messages"`
|
Messages []*Message `json:"messages"`
|
||||||
}
|
}
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -120,7 +120,7 @@ func (c *Client) MyHitsLeaderboard(groupID ID) ([]*Message, error) {
|
|||||||
var resp struct {
|
var resp struct {
|
||||||
Messages []*Message `json:"messages"`
|
Messages []*Message `json:"messages"`
|
||||||
}
|
}
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ func (c *Client) CreateLike(conversationID, messageID ID) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.do(httpReq, nil)
|
return c.doWithAuthToken(httpReq, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destroy
|
// Destroy
|
||||||
@ -59,5 +59,5 @@ func (c *Client) DestroyLike(conversationID, messageID ID) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.do(httpReq, nil)
|
return c.doWithAuthToken(httpReq, nil)
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package groupme
|
package groupme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupMe documentation: https://dev.groupme.com/docs/v3#members
|
// GroupMe documentation: https://dev.groupme.com/docs/v3#members
|
||||||
@ -49,24 +49,27 @@ Parameters:
|
|||||||
func (c *Client) AddMembers(groupID ID, members ...*Member) (string, error) {
|
func (c *Client) AddMembers(groupID ID, members ...*Member) (string, error) {
|
||||||
URL := fmt.Sprintf(c.endpointBase+addMembersEndpoint, groupID)
|
URL := fmt.Sprintf(c.endpointBase+addMembersEndpoint, groupID)
|
||||||
|
|
||||||
httpReq, err := http.NewRequest("POST", URL, nil)
|
var data = struct {
|
||||||
|
Members []*Member `json:"members"`
|
||||||
|
}{
|
||||||
|
members,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
bytes, err := json.Marshal(members)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
data.Set("members", string(bytes))
|
|
||||||
httpReq.PostForm = data
|
|
||||||
|
|
||||||
var resp struct {
|
var resp struct {
|
||||||
ResultsID string `json:"result_id"`
|
ResultsID string `json:"result_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@ -104,7 +107,7 @@ func (c *Client) AddMembersResults(groupID ID, resultID string) ([]*Member, erro
|
|||||||
Members []*Member `json:"members"`
|
Members []*Member `json:"members"`
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -133,7 +136,7 @@ func (c *Client) RemoveMember(groupID, membershipID ID) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.do(httpReq, nil)
|
return c.doWithAuthToken(httpReq, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
///// Update /////
|
///// Update /////
|
||||||
@ -147,25 +150,28 @@ between 1 and 50 characters.
|
|||||||
func (c *Client) UpdateMember(groupID ID, nickname string) (*Member, error) {
|
func (c *Client) UpdateMember(groupID ID, nickname string) (*Member, error) {
|
||||||
URL := fmt.Sprintf(c.endpointBase+updateMemberEndpoint, groupID)
|
URL := fmt.Sprintf(c.endpointBase+updateMemberEndpoint, groupID)
|
||||||
|
|
||||||
httpReq, err := http.NewRequest("POST", URL, nil)
|
type Nickname struct {
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
type membership struct {
|
|
||||||
Nickname string `json:"nickname"`
|
Nickname string `json:"nickname"`
|
||||||
}
|
}
|
||||||
|
var data = struct {
|
||||||
|
Membership Nickname `json:"membership"`
|
||||||
|
}{
|
||||||
|
Nickname{nickname},
|
||||||
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
jsonBytes, err := json.Marshal(&data)
|
||||||
bytes, err := json.Marshal(membership{nickname})
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
data.Add("membership", string(bytes))
|
|
||||||
|
|
||||||
var resp Member
|
var resp Member
|
||||||
|
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package groupme
|
package groupme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
@ -110,7 +111,7 @@ func (c *Client) IndexMessages(groupID ID, req *IndexMessagesQuery) (IndexMessag
|
|||||||
URL.RawQuery = query.Encode()
|
URL.RawQuery = query.Encode()
|
||||||
|
|
||||||
var resp IndexMessagesResponse
|
var resp IndexMessagesResponse
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return IndexMessagesResponse{}, err
|
return IndexMessagesResponse{}, err
|
||||||
}
|
}
|
||||||
@ -150,22 +151,28 @@ Parameters:
|
|||||||
*/
|
*/
|
||||||
func (c *Client) CreateMessage(groupID ID, m *Message) (*Message, error) {
|
func (c *Client) CreateMessage(groupID ID, m *Message) (*Message, error) {
|
||||||
URL := fmt.Sprintf(c.endpointBase+createMessagesEndpoint, groupID)
|
URL := fmt.Sprintf(c.endpointBase+createMessagesEndpoint, groupID)
|
||||||
httpReq, err := http.NewRequest("POST", URL, nil)
|
|
||||||
|
m.SourceGUID = uuid.New().String()
|
||||||
|
var data = struct {
|
||||||
|
Message *Message `json:"message"`
|
||||||
|
}{
|
||||||
|
m,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
m.SourceGUID = uuid.New().String()
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
|
if err != nil {
|
||||||
data := url.Values{}
|
return nil, err
|
||||||
data.Set("message", m.String())
|
}
|
||||||
|
|
||||||
httpReq.PostForm = data
|
|
||||||
|
|
||||||
var resp struct {
|
var resp struct {
|
||||||
*Message `json:"message"`
|
*Message `json:"message"`
|
||||||
}
|
}
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package groupme
|
package groupme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupMe documentation: https://dev.groupme.com/docs/v3#sms_mode
|
// GroupMe documentation: https://dev.groupme.com/docs/v3#sms_mode
|
||||||
@ -36,21 +36,27 @@ Parameters:
|
|||||||
delivered to the device.
|
delivered to the device.
|
||||||
*/
|
*/
|
||||||
func (c *Client) CreateSMSMode(duration int, registrationID *ID) error {
|
func (c *Client) CreateSMSMode(duration int, registrationID *ID) error {
|
||||||
httpReq, err := http.NewRequest("POST", c.endpointBase+createSMSModeEndpoint, nil)
|
URL := fmt.Sprintf(c.endpointBase + createSMSModeEndpoint)
|
||||||
|
|
||||||
|
var data = struct {
|
||||||
|
Duration int `json:"duration"`
|
||||||
|
RegistrationID *ID `json:"registration_id,omitempty"`
|
||||||
|
}{
|
||||||
|
duration,
|
||||||
|
registrationID,
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonBytes, err := json.Marshal(&data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
data.Add("duration", strconv.Itoa(duration))
|
if err != nil {
|
||||||
|
return err
|
||||||
if registrationID != nil {
|
|
||||||
data.Add("registration_id", registrationID.String())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
httpReq.PostForm = data
|
err = c.doWithAuthToken(httpReq, nil)
|
||||||
|
|
||||||
err = c.do(httpReq, nil)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -73,5 +79,5 @@ func (c *Client) DeleteSMSMode() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.do(httpReq, nil)
|
return c.doWithAuthToken(httpReq, nil)
|
||||||
}
|
}
|
||||||
|
30
users_api.go
30
users_api.go
@ -1,9 +1,10 @@
|
|||||||
package groupme
|
package groupme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// GroupMe documentation: https://dev.groupme.com/docs/v3#users
|
// GroupMe documentation: https://dev.groupme.com/docs/v3#users
|
||||||
@ -39,7 +40,7 @@ func (c *Client) MyUser() (*User, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var resp User
|
var resp User
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -70,33 +71,18 @@ Parameters: See UserSettings
|
|||||||
func (c *Client) UpdateMyUser(us UserSettings) (*User, error) {
|
func (c *Client) UpdateMyUser(us UserSettings) (*User, error) {
|
||||||
URL := fmt.Sprintf(c.endpointBase + updateMyUserEndpoint)
|
URL := fmt.Sprintf(c.endpointBase + updateMyUserEndpoint)
|
||||||
|
|
||||||
httpReq, err := http.NewRequest("POST", URL, nil)
|
jsonBytes, err := json.Marshal(&us)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := url.Values{}
|
httpReq, err := http.NewRequest("POST", URL, bytes.NewBuffer(jsonBytes))
|
||||||
|
if err != nil {
|
||||||
if us.AvatarURL != "" {
|
return nil, err
|
||||||
data.Add("avatar_url", us.AvatarURL)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if us.Name != "" {
|
|
||||||
data.Add("name", us.Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
if us.Email != "" {
|
|
||||||
data.Add("email", us.Email)
|
|
||||||
}
|
|
||||||
|
|
||||||
if us.ZipCode != "" {
|
|
||||||
data.Add("zip_code", us.ZipCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
httpReq.PostForm = data
|
|
||||||
|
|
||||||
var resp User
|
var resp User
|
||||||
err = c.do(httpReq, &resp)
|
err = c.doWithAuthToken(httpReq, &resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user