3 Commits

Author SHA1 Message Date
2ff9a03a8c Updated JSON tags to omit if empty 2020-08-28 22:04:52 -04:00
f900b99dac Changed POST API content-type to application/json
Fixed AddMember response parsing
added bot post message example
2020-08-24 22:44:28 -04:00
d8cdcf4ef2 API POST Calls Update
POST calls were not getting their JSON data written
2020-08-23 21:25:02 -04:00
12 changed files with 271 additions and 221 deletions

View File

@ -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,20 +37,24 @@ 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.doWithAuthToken(httpReq, &resp) err = c.doWithAuthToken(httpReq, &resp)
if err != nil { if err != nil {
@ -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)
} }
@ -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.doWithAuthToken(httpReq, nil) return c.doWithAuthToken(httpReq, nil)
} }

View File

@ -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,19 +60,24 @@ 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 {
if req.Method == "POST" {
req.Header.Set("Content-Type", "application/json")
}
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 {

View File

@ -30,6 +30,14 @@ func (s *ClientSuite) TestClient_Close() {
s.Assert().NoError(s.client.Close()) s.Assert().NoError(s.client.Close())
} }
func (s *ClientSuite) TestClient_do_PostContentType() {
req, err := http.NewRequest("POST", "", nil)
s.Require().NoError(err)
s.Assert().Error(s.client.do(req, struct{}{}))
s.Assert().EqualValues(req.Header.Get("Content-Type"), "application/json")
}
func (s *ClientSuite) TestClient_do_DoError() { func (s *ClientSuite) TestClient_do_DoError() {
req, err := http.NewRequest("", "", nil) req, err := http.NewRequest("", "", nil)
s.Require().NoError(err) s.Require().NoError(err)

View File

@ -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"
) )
@ -121,17 +122,23 @@ 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"`

View File

@ -0,0 +1,20 @@
package main
import (
"fmt"
"github.com/densestvoid/groupme"
)
// This is not a real Bot ID. Please find yours by logging
// into the GroupMe development website: https://dev.groupme.com/bots
const botID = "0123456789ABCDEF"
// A short program that gets the gets the first 5 groups
// the user is part of, and then the first 10 messages of
// the first group in that list
func main() {
// Create a new client with your auth token
client := groupme.NewClient("")
fmt.Println(client.PostBotMessage(botID, "Your message here!", nil))
}

View File

@ -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"
) )
@ -172,27 +173,17 @@ 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.doWithAuthToken(httpReq, &resp) err = c.doWithAuthToken(httpReq, &resp)
@ -217,28 +208,15 @@ 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.doWithAuthToken(httpReq, &resp) err = c.doWithAuthToken(httpReq, &resp)
@ -311,14 +289,23 @@ 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.doWithAuthToken(httpReq, &resp) err = c.doWithAuthToken(httpReq, &resp)
@ -344,14 +331,23 @@ 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"`

View File

@ -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",

156
json.go
View File

@ -8,8 +8,8 @@ import (
// Meta is the error type returned in the GroupMe response. // Meta is the error type returned in the GroupMe response.
// Meant for clients that can't read HTTP status codes // Meant for clients that can't read HTTP status codes
type Meta struct { type Meta struct {
Code HTTPStatusCode `json:"code"` Code HTTPStatusCode `json:"code,omitempty"`
Errors []string `json:"errors"` Errors []string `json:"errors,omitempty"`
} }
// Error returns the code and the error list as a string. // Error returns the code and the error list as a string.
@ -20,35 +20,35 @@ func (m Meta) Error() string {
// Group is a GroupMe group, returned in JSON API responses // Group is a GroupMe group, returned in JSON API responses
type Group struct { type Group struct {
ID ID `json:"id"` ID ID `json:"id,omitempty"`
Name string `json:"name"` Name string `json:"name,omitempty"`
// Type of group (private|public) // Type of group (private|public)
Type string `json:"type"` Type string `json:"type,omitempty"`
Description string `json:"description"` Description string `json:"description,omitempty"`
ImageURL string `json:"image_url"` ImageURL string `json:"image_url,omitempty"`
CreatorUserID ID `json:"creator_user_id"` CreatorUserID ID `json:"creator_user_id,omitempty"`
CreatedAt Timestamp `json:"created_at"` CreatedAt Timestamp `json:"created_at,omitempty"`
UpdatedAt Timestamp `json:"updated_at"` UpdatedAt Timestamp `json:"updated_at,omitempty"`
Members []*Member `json:"members"` Members []*Member `json:"members,omitempty"`
ShareURL string `json:"share_url"` ShareURL string `json:"share_url,omitempty"`
Messages GroupMessages `json:"messages"` Messages GroupMessages `json:"messages,omitempty"`
} }
// GroupMessages is a Group field, only returned in Group JSON API responses // GroupMessages is a Group field, only returned in Group JSON API responses
type GroupMessages struct { type GroupMessages struct {
Count uint `json:"count"` Count uint `json:"count,omitempty"`
LastMessageID ID `json:"last_message_id"` LastMessageID ID `json:"last_message_id,omitempty"`
LastMessageCreatedAt Timestamp `json:"last_message_created_at"` LastMessageCreatedAt Timestamp `json:"last_message_created_at,omitempty"`
Preview MessagePreview `json:"preview"` Preview MessagePreview `json:"preview,omitempty"`
} }
// MessagePreview is a GroupMessages field, only returned in Group JSON API responses. // MessagePreview is a GroupMessages field, only returned in Group JSON API responses.
// Abbreviated form of Message type // Abbreviated form of Message type
type MessagePreview struct { type MessagePreview struct {
Nickname string `json:"nickname"` Nickname string `json:"nickname,omitempty"`
Text string `json:"text"` Text string `json:"text,omitempty"`
ImageURL string `json:"image_url"` ImageURL string `json:"image_url,omitempty"`
Attachments []*Attachment `json:"attachments"` Attachments []*Attachment `json:"attachments,omitempty"`
} }
// GetMemberByUserID gets the group member by their UserID, // GetMemberByUserID gets the group member by their UserID,
@ -81,14 +81,14 @@ func (g Group) String() string {
// Member is a GroupMe group member, returned in JSON API responses // Member is a GroupMe group member, returned in JSON API responses
type Member struct { type Member struct {
ID ID `json:"id"` ID ID `json:"id,omitempty"`
UserID ID `json:"user_id"` UserID ID `json:"user_id,omitempty"`
Nickname string `json:"nickname"` Nickname string `json:"nickname,omitempty"`
Muted bool `json:"muted"` Muted bool `json:"muted,omitempty"`
ImageURL string `json:"image_url"` ImageURL string `json:"image_url,omitempty"`
AutoKicked bool `json:"autokicked"` AutoKicked bool `json:"autokicked,omitempty"`
AppInstalled bool `json:"app_installed"` AppInstalled bool `json:"app_installed,omitempty"`
GUID string `json:"guid"` GUID string `json:"guid,omitempty"`
} }
func (m Member) String() string { func (m Member) String() string {
@ -97,25 +97,25 @@ func (m Member) String() string {
// Message is a GroupMe group message, returned in JSON API responses // Message is a GroupMe group message, returned in JSON API responses
type Message struct { type Message struct {
ID ID `json:"id"` ID ID `json:"id,omitempty"`
SourceGUID string `json:"source_guid"` SourceGUID string `json:"source_guid,omitempty"`
CreatedAt Timestamp `json:"created_at"` CreatedAt Timestamp `json:"created_at,omitempty"`
GroupID ID `json:"group_id"` GroupID ID `json:"group_id,omitempty"`
UserID ID `json:"user_id"` UserID ID `json:"user_id,omitempty"`
BotID ID `json:"bot_id"` BotID ID `json:"bot_id,omitempty"`
SenderID ID `json:"sender_id"` SenderID ID `json:"sender_id,omitempty"`
SenderType SenderType `json:"sender_type"` SenderType SenderType `json:"sender_type,omitempty"`
System bool `json:"system"` System bool `json:"system,omitempty"`
Name string `json:"name"` Name string `json:"name,omitempty"`
RecipientID ID `json:"recipient_id"` RecipientID ID `json:"recipient_id,omitempty"`
ConversationID ID `json:"conversation_id"` ConversationID ID `json:"conversation_id,omitempty"`
AvatarURL string `json:"avatar_url"` AvatarURL string `json:"avatar_url,omitempty"`
// Maximum length of 1000 characters // Maximum length of 1000 characters
Text string `json:"text"` Text string `json:"text,omitempty"`
// Must be an image service URL (i.groupme.com) // Must be an image service URL (i.groupme.com)
ImageURL string `json:"image_url"` ImageURL string `json:"image_url,omitempty"`
FavoritedBy []string `json:"favorited_by"` FavoritedBy []string `json:"favorited_by,omitempty"`
Attachments []*Attachment `json:"attachments"` Attachments []*Attachment `json:"attachments,omitempty"`
} }
func (m Message) String() string { func (m Message) String() string {
@ -143,15 +143,15 @@ const (
// Attachment is a GroupMe message attachment, returned in JSON API responses // Attachment is a GroupMe message attachment, returned in JSON API responses
type Attachment struct { type Attachment struct {
Type AttachmentType `json:"type"` Type AttachmentType `json:"type,omitempty"`
Loci [][]int `json:"loci"` Loci [][]int `json:"loci,omitempty"`
UserIDs []ID `json:"user_ids"` UserIDs []ID `json:"user_ids,omitempty"`
URL string `json:"url"` URL string `json:"url,omitempty"`
Name string `json:"name"` Name string `json:"name,omitempty"`
Latitude string `json:"lat"` Latitude string `json:"lat,omitempty"`
Longitude string `json:"lng"` Longitude string `json:"lng,omitempty"`
Placeholder string `json:"placeholder"` Placeholder string `json:"placeholder,omitempty"`
Charmap [][]int `json:"charmap"` Charmap [][]int `json:"charmap,omitempty"`
} }
func (a Attachment) String() string { func (a Attachment) String() string {
@ -160,15 +160,15 @@ func (a Attachment) String() string {
// User is a GroupMe user, returned in JSON API responses // User is a GroupMe user, returned in JSON API responses
type User struct { type User struct {
ID ID `json:"id"` ID ID `json:"id,omitempty"`
PhoneNumber PhoneNumber `json:"phone_number"` PhoneNumber PhoneNumber `json:"phone_number,omitempty"`
ImageURL string `json:"image_url"` ImageURL string `json:"image_url,omitempty"`
Name string `json:"name"` Name string `json:"name,omitempty"`
CreatedAt Timestamp `json:"created_at"` CreatedAt Timestamp `json:"created_at,omitempty"`
UpdatedAt Timestamp `json:"updated_at"` UpdatedAt Timestamp `json:"updated_at,omitempty"`
AvatarURL string `json:"avatar_url"` AvatarURL string `json:"avatar_url,omitempty"`
Email string `json:"email"` Email string `json:"email,omitempty"`
SMS bool `json:"sms"` SMS bool `json:"sms,omitempty"`
} }
func (u User) String() string { func (u User) String() string {
@ -178,11 +178,11 @@ func (u User) String() string {
// Chat is a GroupMe direct message conversation between two users, // Chat is a GroupMe direct message conversation between two users,
// returned in JSON API responses // returned in JSON API responses
type Chat struct { type Chat struct {
CreatedAt Timestamp `json:"created_at"` CreatedAt Timestamp `json:"created_at,omitempty"`
UpdatedAt Timestamp `json:"updated_at"` UpdatedAt Timestamp `json:"updated_at,omitempty"`
LastMessage *Message `json:"last_message"` LastMessage *Message `json:"last_message,omitempty"`
MessagesCount int `json:"messages_count"` MessagesCount int `json:"messages_count,omitempty"`
OtherUser User `json:"other_user"` OtherUser User `json:"other_user,omitempty"`
} }
func (c Chat) String() string { func (c Chat) String() string {
@ -190,12 +190,12 @@ func (c Chat) String() string {
} }
type Bot struct { type Bot struct {
BotID ID `json:"bot_id"` BotID ID `json:"bot_id,omitempty"`
GroupID ID `json:"group_id"` GroupID ID `json:"group_id,omitempty"`
Name string `json:"name"` Name string `json:"name,omitempty"`
AvatarURL string `json:"avatar_url"` AvatarURL string `json:"avatar_url,omitempty"`
CallbackURL string `json:"callback_url"` CallbackURL string `json:"callback_url,omitempty"`
DMNotification bool `json:"dm_notification"` DMNotification bool `json:"dm_notification,omitempty"`
} }
func (b Bot) String() string { func (b Bot) String() string {
@ -203,9 +203,9 @@ func (b Bot) String() string {
} }
type Block struct { type Block struct {
UserID ID `json:"user_id"` UserID ID `json:"user_id,omitempty"`
BlockedUserID ID `json:"blocked_user_id"` BlockedUserID ID `json:"blocked_user_id,omitempty"`
CreatedAT Timestamp `json:"created_at"` CreatedAT Timestamp `json:"created_at,omitempty"`
} }
func (b Block) String() string { func (b Block) String() string {

View File

@ -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,21 +49,24 @@ 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:"results_id"`
} }
err = c.doWithAuthToken(httpReq, &resp) err = c.doWithAuthToken(httpReq, &resp)
@ -147,21 +150,24 @@ 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

View File

@ -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"
@ -150,17 +151,23 @@ 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"`

View File

@ -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,20 +36,26 @@ 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.doWithAuthToken(httpReq, nil)
if err != nil { if err != nil {
return err return err

View File

@ -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
@ -70,31 +71,16 @@ 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.doWithAuthToken(httpReq, &resp) err = c.doWithAuthToken(httpReq, &resp)
if err != nil { if err != nil {