contact

package
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 31, 2026 License: MIT Imports: 8 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ContactGetUser = common.Shortcut{
	Service:     "contact",
	Command:     "+get-user",
	Description: "Get user info (omit user_id for self; provide user_id for specific user)",
	Risk:        "read",
	UserScopes:  []string{"contact:user.basic_profile:readonly"},
	BotScopes:   []string{"contact:user.base:readonly", "contact:contact.base:readonly"},
	AuthTypes:   []string{"user", "bot"},
	HasFormat:   true,
	Flags: []common.Flag{
		{Name: "user-id", Desc: "user ID (omit to get current user)"},
		{Name: "user-id-type", Default: "open_id", Desc: "user ID type: open_id | union_id | user_id"},
	},
	Validate: func(ctx context.Context, runtime *common.RuntimeContext) error {
		if runtime.Str("user-id") == "" && runtime.IsBot() {
			return common.FlagErrorf("bot identity cannot get current user info, specify --user-id")
		}
		return nil
	},
	DryRun: func(ctx context.Context, runtime *common.RuntimeContext) *common.DryRunAPI {
		userId := runtime.Str("user-id")
		if userId == "" {
			return common.NewDryRunAPI().
				GET("/open-apis/authen/v1/user_info").
				Desc("(when --user-id omitted) Get current authenticated user info").
				Set("mode", "current_user")
		}
		userIdType := runtime.Str("user-id-type")
		if userIdType == "" {
			userIdType = "open_id"
		}
		if runtime.IsBot() {
			return common.NewDryRunAPI().
				GET("/open-apis/contact/v3/users/:user_id").
				Desc("(bot) Get user info by user ID").
				Params(map[string]interface{}{"user_id_type": userIdType}).
				Set("user_id", userId).Set("user_id_type", userIdType)
		}
		return common.NewDryRunAPI().
			POST("/open-apis/contact/v3/users/basic_batch").
			Desc("(user) Get user basic info by user ID").
			Params(map[string]interface{}{"user_id_type": userIdType}).
			Body(map[string]interface{}{"user_ids": []string{userId}})
	},
	Execute: func(ctx context.Context, runtime *common.RuntimeContext) error {
		userId := runtime.Str("user-id")
		userIdType := runtime.Str("user-id-type")

		if userId == "" {

			data, err := runtime.CallAPI("GET", "/open-apis/authen/v1/user_info", nil, nil)
			if err != nil {
				return err
			}
			user := data
			if user == nil {
				user = make(map[string]interface{})
			}
			userData := map[string]interface{}{"user": user}
			runtime.OutFormat(userData, nil, func(w io.Writer) {
				output.PrintTable(w, []map[string]interface{}{{
					"name":             pickUserName(user),
					"open_id":          user["open_id"],
					"union_id":         user["union_id"],
					"email":            firstNonEmpty(user, "email", "mail"),
					"mobile":           firstNonEmpty(user, "mobile", "phone"),
					"enterprise_email": firstNonEmpty(user, "enterprise_email"),
				}})
			})
			return nil
		}

		if runtime.IsBot() {

			data, err := runtime.CallAPI("GET", "/open-apis/contact/v3/users/"+url.PathEscape(userId),
				map[string]interface{}{"user_id_type": userIdType}, nil)
			if err != nil {
				return err
			}
			user, _ := data["user"].(map[string]interface{})
			if user == nil {
				user = data
			}
			userData := map[string]interface{}{"user": user}
			runtime.OutFormat(userData, nil, func(w io.Writer) {
				output.PrintTable(w, []map[string]interface{}{{
					"name":       pickUserName(user),
					"open_id":    firstNonEmpty(user, "open_id", "user_id"),
					"email":      firstNonEmpty(user, "email", "enterprise_email"),
					"mobile":     firstNonEmpty(user, "mobile", "mobile_phone"),
					"department": firstNonEmpty(user, "department_name"),
				}})
			})
			return nil
		}

		data, err := runtime.CallAPI("POST", "/open-apis/contact/v3/users/basic_batch",
			map[string]interface{}{"user_id_type": userIdType},
			map[string]interface{}{"user_ids": []string{userId}})
		if err != nil {
			return err
		}
		users, _ := data["users"].([]interface{})
		var user map[string]interface{}
		if len(users) > 0 {
			user, _ = users[0].(map[string]interface{})
		}
		if user == nil {
			user = make(map[string]interface{})
		}
		userData := map[string]interface{}{"user": user}
		runtime.OutFormat(userData, nil, func(w io.Writer) {
			output.PrintTable(w, []map[string]interface{}{{
				"name":    pickUserName(user),
				"user_id": user["user_id"],
			}})
		})
		return nil
	},
}
View Source
var ContactSearchUser = common.Shortcut{
	Service:     "contact",
	Command:     "+search-user",
	Description: "Search users (results sorted by relevance)",
	Risk:        "read",
	Scopes:      []string{"contact:user:search"},
	AuthTypes:   []string{"user"},
	HasFormat:   true,
	Flags: []common.Flag{
		{Name: "query", Desc: "search keyword", Required: true},
		{Name: "page-size", Default: "20", Desc: "page size"},
		{Name: "page-token", Desc: "page token"},
	},
	Validate: func(ctx context.Context, runtime *common.RuntimeContext) error {
		if len(runtime.Str("query")) == 0 {
			return common.FlagErrorf("search keyword empty")
		}
		return nil
	},
	DryRun: func(ctx context.Context, runtime *common.RuntimeContext) *common.DryRunAPI {
		pageSizeStr := runtime.Str("page-size")
		pageToken := runtime.Str("page-token")

		pageSize := 20
		if n, err := strconv.Atoi(pageSizeStr); err == nil {
			pageSize = int(math.Min(math.Max(float64(n), 1), 200))
		}

		params := map[string]interface{}{
			"query":     runtime.Str("query"),
			"page_size": pageSize,
		}
		if pageToken != "" {
			params["page_token"] = pageToken
		}

		return common.NewDryRunAPI().
			GET("/open-apis/search/v1/user").
			Params(params)
	},
	Execute: func(ctx context.Context, runtime *common.RuntimeContext) error {
		query := runtime.Str("query")
		pageSizeStr := runtime.Str("page-size")
		pageToken := runtime.Str("page-token")

		pageSize := 20
		if n, err := strconv.Atoi(pageSizeStr); err == nil {
			pageSize = int(math.Min(math.Max(float64(n), 1), 200))
		}

		params := map[string]interface{}{
			"query":     query,
			"page_size": pageSize,
		}
		if pageToken != "" {
			params["page_token"] = pageToken
		}

		data, err := runtime.CallAPI("GET", "/open-apis/search/v1/user", params, nil)
		if err != nil {
			return err
		}
		users, _ := data["users"].([]interface{})

		for _, u := range users {
			if m, _ := u.(map[string]interface{}); m != nil {
				if av, _ := m["avatar"].(map[string]interface{}); av != nil {
					m["avatar"] = map[string]interface{}{"avatar_origin": av["avatar_origin"]}
				}
			}
		}
		searchData := map[string]interface{}{
			"users":      users,
			"has_more":   data["has_more"],
			"page_token": data["page_token"],
		}
		runtime.OutFormat(searchData, nil, func(w io.Writer) {
			if len(users) == 0 {
				fmt.Fprintln(w, "No matching users found.")
				return
			}

			var rows []map[string]interface{}
			for _, u := range users {
				m, _ := u.(map[string]interface{})
				rows = append(rows, map[string]interface{}{
					"name":             pickUserName(m),
					"open_id":          m["open_id"],
					"email":            firstNonEmpty(m, "email", "mail"),
					"mobile":           firstNonEmpty(m, "mobile", "phone"),
					"department":       firstNonEmpty(m, "department_name", "department"),
					"enterprise_email": firstNonEmpty(m, "enterprise_email"),
				})
			}
			output.PrintTable(w, rows)
			hasMore, _ := data["has_more"].(bool)
			moreHint := ""
			if hasMore {
				pt, _ := data["page_token"].(string)
				moreHint = fmt.Sprintf(" (more available, page_token: %s)", pt)
			}
			fmt.Fprintf(w, "\n%d user(s)%s\n", len(users), moreHint)
		})
		return nil
	},
}

Functions

func Shortcuts

func Shortcuts() []common.Shortcut

Shortcuts returns all contact shortcuts.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL