Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions account.go
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,19 @@ func cmdOrg(args []string) error {
for _, game := range org.Games {
fmt.Printf(" %s\n", game)
}
// Only members see addresses, so this is attempted and quietly
// skipped: a studio page you can read without belonging to it should
// not fail because you do not.
if members, err := client.Members(args[1]); err == nil && len(members) > 0 {
fmt.Println()
for _, m := range members {
role := "member"
if m.Admin {
role = "admin"
}
fmt.Printf(" %-32s %s\n", m.Email, role)
}
}
return nil

case args[0] == "add":
Expand Down
14 changes: 14 additions & 0 deletions internal/registry/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,20 @@ func (c *Client) Org(name string) (Org, error) {
return out, c.do(http.MethodGet, "/v1/orgs/"+url.PathEscape(name), nil, &out)
}

// Member is one person in a studio. Email is present only to members: the
// public org page reports roles without addresses.
type Member struct {
Email string `json:"email,omitempty"`
Admin bool `json:"admin"`
}

// Members lists who is in a studio. Membership is enough to read it —
// administering is what changing it needs.
func (c *Client) Members(org string) ([]Member, error) {
var out []Member
return out, c.do(http.MethodGet, "/v1/orgs/"+url.PathEscape(org)+"/members", nil, &out)
}

// AddMember adds somebody to a studio, or changes whether they administer it.
func (c *Client) AddMember(org, email string, admin bool) error {
body := map[string]any{"email": email, "admin": admin}
Expand Down