diff --git a/kbchat/chat.go b/kbchat/chat.go index 234dee4..6d07324 100644 --- a/kbchat/chat.go +++ b/kbchat/chat.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/keybase/go-keybase-chat-bot/kbchat/types/chat1" + "github.com/keybase/go-keybase-chat-bot/kbchat/types/keybase1" ) type Thread struct { @@ -488,3 +489,60 @@ func (a *API) listCommands(arg listCmdsArg) ([]chat1.UserBotCommandOutput, error } return res.Result.Commands, nil } + +type listMembersOptions struct { + Channel chat1.ChatChannel `json:"channel,omitempty"` + ConversationID string `json:"conversation_id,omitempty"` +} + +type listMembersParams struct { + Options listMembersOptions +} + +type listMembersArg struct { + Method string + Params listMembersParams +} + +func newListMembersArg(options listMembersOptions) listMembersArg { + return listMembersArg{ + Method: "listmembers", + Params: listMembersParams{ + Options: options, + }, + } +} + +func (a *API) ListMembers(channel chat1.ChatChannel) (keybase1.TeamMembersDetails, error) { + arg := newListMembersArg(listMembersOptions{ + Channel: channel, + }) + return a.listMembers(arg) +} + +func (a *API) ListMembersByConvID(conversationID string) (keybase1.TeamMembersDetails, error) { + arg := newListMembersArg(listMembersOptions{ + ConversationID: conversationID, + }) + return a.listMembers(arg) +} + +func (a *API) listMembers(arg listMembersArg) (res keybase1.TeamMembersDetails, err error) { + bArg, err := json.Marshal(arg) + if err != nil { + return res, err + } + output, err := a.doFetch(string(bArg)) + if err != nil { + return res, err + } + members := ListTeamMembers{} + err = json.Unmarshal(output, &members) + if err != nil { + return res, UnmarshalError{err} + } + if members.Error.Message != "" { + return res, members.Error + } + return members.Result.Members, nil +} diff --git a/kbchat/team.go b/kbchat/team.go index e6dd38f..0f9d952 100644 --- a/kbchat/team.go +++ b/kbchat/team.go @@ -23,46 +23,42 @@ type ListUserMemberships struct { Error Error `json:"error"` } -func (a *API) ListMembersOfTeam(teamName string) (keybase1.TeamMembersDetails, error) { - empty := keybase1.TeamMembersDetails{} - +func (a *API) ListMembersOfTeam(teamName string) (res keybase1.TeamMembersDetails, err error) { apiInput := fmt.Sprintf(`{"method": "list-team-memberships", "params": {"options": {"team": "%s"}}}`, teamName) cmd := a.runOpts.Command("team", "api") cmd.Stdin = strings.NewReader(apiInput) bytes, err := cmd.CombinedOutput() if err != nil { - return empty, APIError{err} + return res, APIError{err} } members := ListTeamMembers{} err = json.Unmarshal(bytes, &members) if err != nil { - return empty, UnmarshalError{err} + return res, UnmarshalError{err} } if members.Error.Message != "" { - return empty, members.Error + return res, members.Error } return members.Result.Members, nil } func (a *API) ListUserMemberships(username string) ([]keybase1.AnnotatedMemberInfo, error) { - empty := []keybase1.AnnotatedMemberInfo{} - apiInput := fmt.Sprintf(`{"method": "list-user-memberships", "params": {"options": {"username": "%s"}}}`, username) cmd := a.runOpts.Command("team", "api") cmd.Stdin = strings.NewReader(apiInput) bytes, err := cmd.CombinedOutput() if err != nil { - return empty, APIError{err} + return nil, APIError{err} } members := ListUserMemberships{} err = json.Unmarshal(bytes, &members) if err != nil { - return empty, UnmarshalError{err} + return nil, UnmarshalError{err} } if members.Error.Message != "" { - return empty, members.Error + return nil, members.Error } return members.Result.Teams, nil }