lansenger

package module
v0.9.29 Latest Latest
Warning

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

Go to latest
Published: Jul 29, 2026 License: MIT Imports: 22 Imported by: 0

README

English | 简体中文 | 繁體中文 | 繁體中文(香港) | Français

lansenger-sdk-go

Go SDK for the Lansenger (蓝信) platform — supports Lansenger apps, organization bots, and personal bots.

SDK library has zero external dependencies (stdlib only). The CLI (cmd/lansenger) uses spf13/cobra.

Supported Bot Types

Bot Type Auth WebSocket Inbound All APIs
Lansenger App appToken + userToken ✗ (uses webhook)
Organization Bot appToken + userToken ✗ (uses webhook)
Personal Bot appToken ✓ (WebSocket) ✓ (limited for non-bot APIs)

All three bot types use the same auth mechanism: appToken is required for every API call; userToken is only needed for specific user-level operations (user info, staff search, calendar, etc.).

Features

  • Single clientLansengerClient with context.Context for all API calls
  • Credential & token persistenceCredentialStore saves credentials and tokens to JSON file (survives restarts)
  • OAuth2 user authentication — authorize URL, code exchange, token refresh
  • Organization & departments — org info, department detail/children/staff
  • Staff & contacts — basic/detailed info, ID mapping, department ancestors, search
  • Messaging — 3 private chat channels (bot, official account, user impersonate) + group chat, all message types, @mention, human/bot sender identity
  • Rich cards — appCard (with dynamic status updates), oacard, linkCard, appArticles
  • Streaming messages — SSE-based real-time delivery for AI agents
  • Media upload/download — files, images, videos with auto type detection, fetch download path, app/bot media upload
  • Message management — revoke, dynamic card update, urgent reminder
  • Groups V2 — create, info, members, list, membership check, update settings & members, dissolve
  • Calendar & schedule — primary calendar, schedule CRUD, attendee management, attendee metadata update, update_schedule_attendees()
  • Unified todo — create, update, delete, query, executor management, status counts
  • Bot slash commands (4.37) — create/query/delete Command entries for bot interaction menus
  • Personal apps (4.38) — create/update/query/delete/list personal bots with user token
  • Callback events — 24 event types, structured data parsing, signature verification

Quick Install

SDK (library):

go get github.com/lansenger-pm/lansenger-sdk-go

CLI (for AI agents & debugging):

go install github.com/lansenger-pm/lansenger-sdk-go/cmd/lansenger@latest
lansenger version

The CLI shares credentials with the SDK via ~/.lansenger/sdk_state.json. After installing, configure credentials:

lansenger config set app_id YOUR_APP_ID
lansenger config set app_secret YOUR_APP_SECRET

1. Authentication

appToken — Required for all API calls

Every SDK method requires appToken. The client automatically obtains and refreshes it using your appID + appSecret. You never need to manage appToken manually — the TokenManager handles the lifecycle:

  1. First callGET /v1/apptoken/create with appID + appSecret → returns appToken (valid 2 hours)
  2. Subsequent calls → reuse cached appToken until expiry
  3. Token expired → automatically refresh via the same endpoint
// appToken is managed automatically — just configure appID + appSecret
client := lansenger.NewClient("your-appid", "your-secret")

// You can also get/invalidate token manually
token, err := client.GetToken(ctx)
client.InvalidateToken() // force refresh on next call
userToken — Only needed for specific endpoints

userToken represents a specific Lansenger user's authorization (obtained via OAuth2). It's only required for:

  • User-level information (FetchUserInfo, FetchStaffDetail, SearchStaff)
  • Calendar & schedule operations (FetchPrimaryCalendar, CreateSchedule, etc.)
  • Group operations as a human sender
Getting Credentials
Bot Type How to get appID + appSecret
Personal Bot Lansenger desktop → Contacts → Bots → Personal Bots → click ℹ️ icon (mobile client does NOT show credentials)
Lansenger App Create at Lansenger Developer Center — may require organization admin approval
Organization Bot Create at Lansenger Developer Center — may require organization admin approval
OAuth2 user-level auth
// Build authorize URL — redirect user to Lansenger passport
url := client.BuildAuthorizeURL("https://myapp.com/callback", "", "state123")

// After user authorizes, exchange code for userToken + refreshToken
tokenResult, err := client.ExchangeCode(ctx, "auth_code_from_callback", "https://myapp.com/callback")

// Refresh expired userToken
newToken, err := client.RefreshUserToken(ctx, tokenResult.RefreshToken, "")

// Fetch user profile
userInfo, err := client.FetchUserInfo(ctx, tokenResult.UserToken)

2. Organization & Departments

// Organization info
org, err := client.FetchOrgInfo(ctx, "orgId", "")

// Department hierarchy
detail, err := client.FetchDepartmentDetail(ctx, "deptId", "", "")
children, err := client.FetchDepartmentChildren(ctx, "deptId", "")
staffs, err := client.FetchDepartmentStaffs(ctx, "deptId", "", 1, 100)

3. Staff & Contacts

// Basic staff info
staff, err := client.FetchStaffBasicInfo(ctx, "staffOpenId", "")

// Detailed profile (userToken recommended)
detail, err := client.FetchStaffDetail(ctx, "staffOpenId", "ut")

// Map phone → staffId
mapping, err := client.FetchStaffIdMapping(ctx, "orgId", "mobile", "13800138000", "")

// Department ancestors for a staff member
ancestors, err := client.FetchDepartmentAncestors(ctx, "staffOpenId", "")

// Search staff (requires userToken or userID)
results, err := client.SearchStaff(ctx, "Zhang San", "ut", "", true, nil, 1, 10)

// Org extra field IDs
fields, err := client.FetchOrgExtraFieldIDs(ctx, "orgId", "", 1, 1000)

4. Messaging & Media

Bot private chat — most common
result, err := client.SendText(ctx, "staff123", "Hello!", "", 0, "", false, nil, false, "", "")
result, err := client.SendMarkdown(ctx, "staff123", "**Bold**", false, nil, false, "", "")
result, err := client.SendFile(ctx, "staff123", "/path/to/report.pdf", "", 0, "", false, "", "")
Public account channel
result, err := client.SendAccountMessage(ctx, "text",
    map[string]interface{}{"content": "System notice"},
    []string{"staff1", "staff2"}, nil, "524288-xxxx", "", "", "")
User impersonate channel (requires userToken)
result, err := client.SendUserMessage(ctx, "staff456", "text",
    map[string]interface{}{"content": "Hello"}, "ut", "")
Group chat
// Bot → group
result, err := client.SendText(ctx, "group123", "Notice", "", 0, "", false, nil, true, "", "")

// Human → group (with userToken)
result, err := client.SendGroupMessage(ctx, "group123", "text",
    map[string]interface{}{"content": "I'll handle it"}, "ut", "", false, nil, "", "", "")

// @mention in group
result, err := client.SendText(ctx, "group123", "Important!", "", 0, "", true, nil, true, "", "")
Rich cards
// appCard
params := &lansenger.AppCardParams{
    ChatID: "staff123", BodyTitle: "Approval", IsDynamic: true,
}
result, err := client.SendAppCardWithParams(ctx, params)

// linkCard
params := &lansenger.LinkCardParams{
    ChatID: "staff123", Title: "Article", Link: "https://...",
}
result, err := client.SendLinkCardWithParams(ctx, params)

// Update dynamic card status
updateParams := &lansenger.DynamicCardUpdateParams{
    MsgID: "msg123", IsLastUpdate: true,
}
result, err := client.UpdateDynamicCard(ctx, updateParams)
Streaming messages (for AI agents)
result, err := client.CreateStreamMessage(ctx, "staff1", "staff", "stream1")
result, err := client.FetchStreamMessage(ctx, "msg123")
Media
// Upload (core service — numeric type)
upload, err := client.UploadAppMedia(ctx, "/path/to/file.pdf", lansenger.AppMediaTypeFile, 0, 0, 0)

// Upload (app/bot — string type, supports width/height/duration)
upload, err := client.UploadAppMedia(ctx, "/path/to/video.mp4",
    lansenger.AppMediaTypeVideo, 680, 480, 300)

// Download
download, err := client.DownloadMedia(ctx, "media123")

// Download and save to file
path, err := client.DownloadMediaToFile(ctx, "media123", "/path/to/save.pdf")

// Fetch download path info
pathInfo, err := client.FetchMediaPath(ctx, "media123", "ut")

// Revoke messages
result, err := client.RevokeMessage(ctx, []string{"msg1", "msg2"}, "bot", "")

// Send urgent reminder
result, err := client.SendReminder(ctx, "msg123", []int{1, 2}, []string{"staff1", "staff2"})

5. Groups

// Create group
info := &lansenger.GroupCreateInfo{
    Name: "Project Chat", OrgID: 1, StaffIDList: []string{"s1", "s2", "s3"},
}
group, err := client.CreateGroup(ctx, info, "")

// Fetch info & members
info, err := client.FetchGroupInfo(ctx, "groupOpenId", "")
members, err := client.FetchGroupMembers(ctx, "groupOpenId", "", 0, 100)
groups, err := client.FetchGroupList(ctx, "", 0, 100)

// Check membership
result, err := client.CheckIsInGroup(ctx, "groupOpenId", "", "staff1")

// Update settings
result, err := client.UpdateGroupInfo(ctx, "groupId", map[string]interface{}{"name": "New Name"}, "")

// Add/remove members
result, err := client.UpdateGroupMembers(ctx, "groupId",
    []string{"staff4"}, []string{"staff3"}, nil, "")

// Dissolve group
result, err := client.DissolveGroup(ctx, "groupId", "ut")

6. Calendar & Schedule

// Get primary calendar (requires userToken or userID)
cal, err := client.FetchPrimaryCalendar(ctx, "ut", "uid1")

// Create schedule (startTime/endTime are map objects, allDay is "yes"/"no")
schedule, err := client.CreateSchedule(ctx, cal.CalendarID, "Team Meeting",
    map[string]interface{}{"time": "2024-01-15T09:00"},
    map[string]interface{}{"time": "2024-01-15T10:00"},
    nil, "", "no", "", nil, "", "", "", "ut", "")

// Fetch/delete schedule
info, err := client.FetchSchedule(ctx, "cal1", "sch1", "ut", "")
result, err := client.DeleteSchedule(ctx, "cal1", "sch1", "", "", "", "ut", "")

// Update schedule
result, err := client.UpdateSchedule(ctx, "cal1", "sch1",
    map[string]interface{}{"summary": "Updated Meeting"}, "ut", "")

// Schedule list in time range
schedules, err := client.FetchScheduleList(ctx, "cal1",
    map[string]interface{}{"time": "2024-01-15T00:00"},
    map[string]interface{}{"time": "2024-01-15T23:59"}, "ut", "")

// Attendee management (attendees are []string)
attendees, err := client.FetchScheduleAttendees(ctx, "cal1", "sch1", 1, 10, "ut", "")
result, err := client.AddScheduleAttendees(ctx, "cal1", "sch1",
    []string{"staff2"}, "", "", "", "ut", "")
result, err := client.DeleteScheduleAttendees(ctx, "cal1", "sch1",
    []string{"staff2"}, "", "", "", "ut", "")

// Update attendee metadata
result, err := client.UpdateScheduleAttendeeMeta(ctx, "cal1", "sch1",
    map[string]interface{}{"rsvpStatus": "accepted"}, "ut", "")

7. Unified Todo

// Create todo task
todo, err := client.CreateTodoTask(ctx, "Approval Request", lansenger.TodoTypeApproval,
    "https://app.com/a/1", "https://pc.app.com/a/1", []string{"staff1"}, "org1", "", "", "", "")

// Update status (11=pending-read, 12=read, 21=pending-do, 22=done)
result, err := client.UpdateTodoTaskStatus(ctx, "taskId", lansenger.TodoStatusDone, "org1", "", "")

// Update content
result, err := client.UpdateTodoTask(ctx, "taskId", "Updated", "l", "p", "org1", "", "")

// Delete (sender only)
result, err := client.DeleteTodoTask(ctx, "taskId", "org1", "", "")

// Query
list, err := client.FetchTodoTaskList(ctx, "org1", nil, "", nil, "")
task, err := client.FetchTodoTaskByID(ctx, "taskId", "org1", "", "")
task, err := client.FetchTodoTaskBySourceID(ctx, "src1", "org1", "", "")
counts, err := client.FetchTodoTaskStatusCounts(ctx, "staff1", "org1", "", "", "")

// Executor management
result, err := client.AddExecutors(ctx, []string{"staff2"}, "org1", "taskId", "")
result, err := client.DeleteExecutors(ctx, []string{"staff2"}, "org1", "taskId", "")
executors, err := client.FetchExecutorList(ctx, "taskId", "org1", "", nil, "")

8. Callback Events

// Parse plain (unencrypted) webhook payload — query string or JSON
events, err := lansenger.ParseCallbackPayload("eventType=staff_modify&staffId=s001&orgId=org1")

// Parse plain JSON callback
events, err = lansenger.ParseCallbackPayload(`{"events":[{"eventType":"staff_modify","data":{"staffId":"s001"}}],"orgId":"org1","appId":"app1"}`)

// Decrypt encrypted callback payload (AES-256-CBC)
result, err := lansenger.DecryptCallbackPayload(encryptedData, encodingKey, knownAppID)
fmt.Println(result.OrgID, result.AppID, result.Events)

// Verify signature (SHA1-based, matching Lansenger protocol)
valid := lansenger.VerifyCallbackSignature(timestamp, nonce, signature, encodingKey, dataEncrypt, callbackToken)

// Available event types (24 types, structured field mapping)
types := lansenger.GetCallbackEventTypes()

9. Chat Reading

// Fetch user's chat list (private + group)
chats, err := client.FetchChatList(ctx, "ut", "private", "", "", "")

// Fetch private chat messages with a specific person
msgs, err := client.FetchChatMessages(ctx, "ut", 10, "", "s001", "", "", "", "")

// Fetch group chat messages
msgs, err := client.FetchChatMessages(ctx, "ut", 10, "", "", "g001", "", "", "")

Message Type Capability Matrix

msgType Markdown @mention Attachments Private Channels Group Chat Notes
text ✓ (group) Bot, Official Account, User Impersonate Up to 6000 bytes
formatText User Impersonate only Markdown via formatType=1
oacard Bot, Official Account, User Impersonate Simple card with fields
appCard ✓ (div tags) Bot, Official Account, User Impersonate Rich card, dynamic updates
linkCard Bot, Official Account Link preview card
appArticles Bot private only Article list (1+ articles)

Group chat supports all message types. Only group chat supports @mention.

Configuration

Credential Overview

All credentials are persisted per profile in ~/.lansenger/sdk_state.json (0600 permissions):

Credential Required CLI key Description
App ID app_id Lansenger app/bot ID
App Secret app_secret Lansenger app/bot secret
API Gateway URL api_gateway_url API gateway endpoint
Passport URL OAuth2 only passport_url OAuth2 authorize page URL
Redirect URI OAuth2 only redirect_uri OAuth2 callback redirect URI (default: http://localhost:8765)
Encoding Key Callbacks only encoding_key AES-256-CBC key for callback decryption
Callback Token Callbacks only callback_token Token for callback signature verification
CLI Configuration
# Step 1: Set required credentials
lansenger config set app_id YOUR_APP_ID
lansenger config set app_secret YOUR_APP_SECRET
lansenger config set api_gateway_url https://your-gateway.example.com

# Step 2 (optional): Set OAuth2 passport URL (needed for userToken)
lansenger config set passport_url https://your-passport.example.com
lansenger config set redirect_uri http://localhost:8765   # OAuth2 redirect URI (default)

# Step 3 (optional): Set callback credentials (needed for webhook decryption)
lansenger config set encoding_key YOUR_ENCODING_KEY
lansenger config set callback_token YOUR_CALLBACK_TOKEN

# Verify configuration
lansenger config show

# Multi-profile support (e.g. separate orgs/apps)
lansenger config set app_id APP2_ID --profile org2
lansenger config set app_secret APP2_SECRET --profile org2
lansenger --profile org2 staff basic-info STAFF_ID
SDK Configuration

From code (direct):

client := lansenger.NewClient("app_id", "app_secret")
// Override gateway URL if needed
cfg := lansenger.NewConfig("app_id", "app_secret")
cfg.APIGatewayURL = "https://custom-gateway.example.com"
cfg.PassportURL = "https://passport.example.com"
cfg.RedirectURI = "https://myapp.com/callback"
cfg.EncodingKey = "your_encoding_key"
cfg.CallbackToken = "your_callback_token"
client := lansenger.NewClientWithConfig(cfg)

From environment (auto-detect):

Variable Required Description Default
LANSENGER_APP_ID App/Bot ID
LANSENGER_APP_SECRET App/Bot Secret
LANSENGER_API_GATEWAY_URL API Gateway URL
LANSENGER_PASSPORT_URL Passport URL (for OAuth2)
LANSENGER_REDIRECT_URI OAuth2 redirect URI http://localhost:8765
LANSENGER_ENCODING_KEY Encoding key for callback decryption
LANSENGER_CALLBACK_TOKEN Callback token (defaults to encoding_key)
LANSENGER_HTTP_TIMEOUT HTTP timeout (seconds) 30
client, err := lansenger.NewClientFromEnv()
Credential & Token Persistence

By default, credentials and tokens stay in memory only (lost on process exit). Enable file persistence with CredentialStore:

// Auto-persist to ~/.lansenger/sdk_state.json (0600 permissions)
store := lansenger.NewCredentialStore("", "default")
store.SaveCredentials("app_id", "app_secret", "https://your-gateway.example.com", "https://your-passport.example.com")
store.SaveCallbackConfig("encoding_key", "callback_token")

// Save tokens
store.SaveAppToken("token123", 7200)
store.SaveUserToken("ut123", "rt123", 7200)

// Load tokens (returns empty string if expired)
token, err := store.LoadAppToken()

// Credentials are shared with Python SDK (same ~/.lansenger/sdk_state.json format)

When persistence is enabled:

  • appToken can be saved and restored on restart (skips redundant API calls)
  • userToken + refreshToken can be saved after OAuth2 exchange
  • Credentials + URLs are saved together for full config recovery

Identity & Permissions

Identity Capability Matrix

The Lansenger platform has three identity types with different API access:

Command Domain Personal Bot Org App (Self-built) Org App + Bot Notes
message send-text/markdown/file/... (bot DM) Y N Y Only bots can send bot DMs
message send-text --group (group chat) Y N Y Personal bot now supports group messaging
message send-group-message Y N Y Same as above
message send-account-message (public account) N Y Y Requires public account capability
message send-user-message (user-to-user) N Y Y Requires userToken + OAuth2
message revoke Y Y Y Revoke own messages
staff * (contacts read-only) N Y Y search additionally requires userToken
department * N Y Y Org-level apps only
calendar * N Y Y With userToken = user identity; without = bot identity
todo * N Y Y Org-level apps only
chat list/messages N Y Y Org-level apps only
group * (group management V2) N N Y Requires bot to be in group
media upload Y Y Y General upload
media upload-app Y Y Y Self-built apps only (not ISV)
media download/path Y Y Y General download
oauth * N Y Y Org-level apps only
streaming * N Y Y Org-level apps only
callback * (event parsing) N/A N/A N/A Pure data operation, no identity required

Personal Bot can only send/receive messages and upload/download files. Cannot access contacts, groups, calendars, or OAuth2.

Org App vs Org App + Bot: Same appID/appSecret. The only difference is messaging channels — only bots can send bot DMs and group messages (because only bots can join groups). All other APIs (contacts, calendar, todo, chat, OAuth2, streaming) work identically for both. Currently only self-built apps support bot capability.

Developer Center Permissions

Beyond identity type, specific API calls also depend on permission toggles in the Lansenger Developer Center. The organization may restrict developer access, requiring admin assistance.

Basic Permissions (enabled by default):

Permission Description
Get basic user info Get personnel basic info for system/app login
Send notification messages Get org message channels to send messages to people/groups

Advanced Permissions (disabled by default, must be manually enabled):

Permission Description
Contacts read-only Read access to contacts
Contacts edit Edit access to contacts (create/update/delete staff)
Sensitive info - Phone Access user phone numbers
Sensitive info - Email Access user emails
Sensitive info - ID number Access user ID numbers
Sensitive info - Employee ID Access user employee IDs
Map unique attribute to staff ID Map phone/email/employee ID to staff ID
App edit Create and update apps
Groups read-only Read access to groups
Groups edit Edit access to groups
Calendar read-only Read access to calendar & schedules
Calendar edit Edit access to calendar & schedules
Upload media Upload media file permission
Workbench template read Read access to workbench templates
Workbench template write Write access to workbench templates

When encountering permission errors, first verify the identity type supports the operation, then prompt the user to enable the corresponding advanced permission in the Developer Center (contact org admin if unable to access).

Project Structure

lansenger-sdk-go/
├── client.go            # LansengerClient — core client with HTTP helpers
├── config.go            # Config — configuration + env vars
├── constants.go         # API endpoints, media types, callback event types
├── errors.go            # LansengerError hierarchy (Auth/Config/API/Network/File)
├── models.go            # 50+ result/params struct types
├── auth.go              # TokenManager — appToken lifecycle with auto-refresh
├── user_token_manager.go # UserTokenManager — userToken lifecycle with auto-refresh
├── url_helpers.go       # BuildAPIURL — Options pattern for URL construction
├── oauth.go             # OAuth2 authorize URL, code exchange, token refresh
├── contacts.go          # Staff & org info APIs
├── users.go             # User profile APIs
├── departments.go       # Department APIs
├── groups.go            # Groups V2 APIs
├── chats.go             # Chat list & messages APIs
├── account_messages.go  # Public account channel (4.6.1)
├── user_messages.go     # User impersonate channel (4.6.3)
├── group_messages.go    # Group chat channel (4.6.2)
├── bot_messages.go      # Bot channel (4.6.12)
├── messaging.go         # Convenience methods + revoke + dynamic update
├── streaming.go         # SSE streaming messages
├── media.go             # Upload/download files & images
├── todos.go             # Unified todo (4.33) — 12 endpoints
├── calendars.go         # Calendar & schedule (4.23) — 10 endpoints
├── callbacks.go         # Callback event parsing + AES-256-CBC decryption + SHA1 signature verification
├── persistence.go       # CredentialStore — JSON file persistence
├── version.go           # SDK version constant
├── *_test.go            # 136 unit tests + 10 integration tests
├── cmd/lansenger/       # CLI tool (config, oauth, messaging, staff, etc.)
├── go.mod
└── README.md

Development

go test . -v                        # all tests (136 unit + 10 integration)
go test . -run TestIntegration      # integration tests only (requires ~/.lansenger/sdk_state.json + network)

License

MIT — see LICENSE.

Documentation

Index

Constants

View Source
const (
	DefaultAPIGatewayURL = ""
	DefaultPassportURL   = ""
	DefaultStateDir      = "~/.lansenger"
	DefaultStateFile     = "sdk_state.json"
	DefaultProfile       = "default"
	TokenRefreshMargin   = 300

	MediaTypeVideo = 1
	MediaTypeImage = 2
	MediaTypeAudio = 3

	AppMediaTypeFile  = "file"
	AppMediaTypeVideo = "video"
	AppMediaTypeImage = "image"
	AppMediaTypeAudio = "audio"

	MaxMessageLength = 4000

	OAuth2ScopeBasicUserInfo = "basic_userinfor"

	TodoStatusPendingRead = "11"
	TodoStatusRead        = "12"
	TodoStatusPendingDo   = "21"
	TodoStatusDone        = "22"

	TodoTypeNotification = 1
	TodoTypeApproval     = 2
)
View Source
const UserTokenRefreshMargin = 300
View Source
const Version = "0.9.29"

Variables

View Source
var APIEndpoints = map[string]map[string]string{
	"auth": {
		"app_token_create":    "/v1/apptoken/create",
		"tenant_access_token": "/auth/v3/tenant_access_token/internal",
	},
	"oauth": {
		"user_token_create":    "/v2/user_token/create",
		"refresh_token_create": "/v1/refresh_token/create",
	},
	"users": {
		"fetch": "/v1/users/fetch",
	},
	"staffs": {
		"basic_info_fetch":           "/v1/staffs/{staff_id}/fetch",
		"detail_fetch":               "/v1/staffs/{staff_id}/infor/fetch",
		"department_ancestors_fetch": "/v1/staffs/{staff_id}/departmentancestors/fetch",
		"id_mapping_fetch":           "/v2/staffs/id_mapping/fetch",
		"search":                     "/v2/staffs/search",
	},
	"org": {
		"extra_field_ids_fetch": "/v1/org/{org_id}/extrafieldids/fetch",
		"info_fetch":            "/v1/org/{org_id}/fetch",
	},
	"departments": {
		"detail_fetch":   "/v1/departments/{department_id}/fetch",
		"children_fetch": "/v1/departments/{department_id}/children/fetch",
		"staffs_fetch":   "/v1/departments/{department_id}/staffs/fetch",
	},
	"groups": {
		"create":         "/v2/groups/create",
		"info_fetch":     "/v2/groups/{group_id}/info/fetch",
		"members_fetch":  "/v2/groups/{group_id}/members/fetch",
		"list_fetch":     "/v2/groups/fetch",
		"is_in_group":    "/v2/groups/{group_id}/members/is_in_group",
		"info_update":    "/v2/groups/{group_id}/info/update",
		"members_update": "/v2/groups/{group_id}/members/update",
		"delete":         "/v2/groups/{group_id}/delete",
		"share_create":   "/v2/groups/{group_id}/share/create",
	},
	"messages": {
		"create":          "/v1/messages/create",
		"chat_create":     "/v1/messages/chat/create",
		"group_create":    "/v1/messages/group/create",
		"revoke":          "/v1/messages/revoke",
		"dynamic_update":  "/v1/messages/dynamic/update",
		"reminder_create": "/v1/messages/reminder/create",
		"fetch":           "/v1/messages/fetch",
	},
	"bot": {
		"messages_create": "/v1/bot/messages/create",
	},
	"sse": {
		"msg_create": "/v1/sse/msg/create",
		"msg_fetch":  "/v1/sse/msg/fetch",
	},
	"medias": {
		"create":     "/v1/medias/create",
		"fetch":      "/v1/medias/{media_id}/fetch",
		"path_fetch": "/v1/medias/{media_id}/path/fetch",
	},
	"app_medias": {
		"create": "/v1/app/medias/create",
	},
	"chats": {
		"fetch":          "/v1/chats/fetch",
		"messages_fetch": "/v1/messages/fetch",
	},
	"calendars": {
		"primary_fetch":                 "/v1/calendars/primary",
		"schedules_create":              "/v1/calendars/{calendar_id}/schedules/create",
		"schedules_fetch":               "/v1/calendars/{calendar_id}/schedules/{schedule_id}/fetch",
		"schedules_update":              "/v1/calendars/{calendar_id}/schedules/{schedule_id}/update",
		"schedules_delete":              "/v1/calendars/{calendar_id}/schedules/{schedule_id}/delete",
		"schedules_list_fetch":          "/v1/calendars/{calendar_id}/schedules/fetch",
		"schedules_members_fetch":       "/v1/calendars/{calendar_id}/schedules/{schedule_id}/members/fetch",
		"schedules_members_create":      "/v1/calendars/{calendar_id}/schedules/{schedule_id}/members/create",
		"schedules_members_delete":      "/v1/calendars/{calendar_id}/schedules/{schedule_id}/members/delete",
		"schedules_members_update":      "/v1/calendars/{calendar_id}/schedules/{schedule_id}/members/update",
		"schedules_members_meta_update": "/v1/calendars/{calendar_id}/schedules/{schedule_id}/members/meta/update",
	},
	"bot_commands": {
		"create": "/v1/bot/commands/create",
		"fetch":  "/v1/bot/commands/fetch",
		"delete": "/v1/bot/commands/delete",
	},
	"personal_apps": {
		"create":     "/v1/personal/apps/create",
		"update":     "/v1/personal/apps/{app_id}/update",
		"fetch":      "/v1/personal/apps/{app_id}/fetch",
		"delete":     "/v1/personal/apps/{app_id}/delete",
		"list_fetch": "/v1/personal/apps/list/fetch",
	},
	"todo": {
		"create":                  "/xtra/task/unified/v1/todotask/create",
		"info_update":             "/xtra/task/unified/v1/todotask/info/update",
		"status_update":           "/xtra/task/unified/v1/todotask/status/update",
		"sender_delete":           "/xtra/task/unified/v1/sender/todotask/delete",
		"list_fetch":              "/xtra/task/unified/v1/todotask/list/fetch",
		"info_fetch_by_source_id": "/xtra/task/unified/v1/todotask/info/fetchbysourceid",
		"info_fetch":              "/xtra/task/unified/v1/todotask/info/fetch",
		"status_count_list_fetch": "/xtra/task/unified/v1/todotask/status/countList/fetch",
		"executor_status_update":  "/xtra/task/unified/v1/todotask/executor/status/update",
		"executor_create":         "/xtra/task/unified/v1/todotask/executor/create",
		"executor_delete":         "/xtra/task/unified/v1/todotask/executor/delete",
		"executor_list_fetch":     "/xtra/task/unified/v1/todotask/executor/list/fetch",
	},
	"websocket": {
		"endpoint": "/v1/ws/endpoint/create",
	},
}
View Source
var AudioExtensions = map[string]bool{
	".mp3":  true,
	".wav":  true,
	".amr":  true,
	".m4a":  true,
	".ogg":  true,
	".flac": true,
	".aac":  true,
}
View Source
var CallbackEventTypes = map[string]string{
	"account_subscribe":    "public_account",
	"account_unsubscribe":  "public_account",
	"account_message":      "public_account",
	"staff_info":           "staff",
	"staff_modify":         "staff",
	"staff_create":         "staff",
	"staff_delete":         "staff",
	"dept_modify":          "department",
	"dept_create":          "department",
	"dept_delete":          "department",
	"tag_member":           "tag",
	"app_install_org":      "app",
	"app_uninstall_org":    "app",
	"bot_private_message":  "bot",
	"bot_group_message":    "bot",
	"group_create_approve": "group",
	"telephone_track":      "notification",
	"ua_cert_create":       "certificate",
	"ua_cert_delete":       "certificate",
	"report_location":      "location",
	"user_logout":          "auth",
	"data_scope":           "data_scope",
	"wb_visible_config":    "workbench",
	"schedule_modify":      "calendar",
	"schedule_delete":      "calendar",
}
View Source
var DebugLogger func(format string, args ...interface{})
View Source
var ImageExtensions = map[string]bool{
	".jpg":  true,
	".jpeg": true,
	".png":  true,
	".webp": true,
	".gif":  true,
}
View Source
var VideoExtensions = map[string]bool{
	".mp4":  true,
	".mov":  true,
	".avi":  true,
	".mkv":  true,
	".webm": true,
	".3gp":  true,
}

Functions

func BuildAPIURL

func BuildAPIURL(cfg *Config, category, endpoint, appToken string, opts ...URLOption) string

func GetCallbackEventTypes

func GetCallbackEventTypes() map[string]string

func GuessAppMediaType added in v0.9.8

func GuessAppMediaType(filePath string) string

func GuessMediaType

func GuessMediaType(filePath string) int

func ParseAuthorizeCallback

func ParseAuthorizeCallback(queryString string) (map[string]string, error)

func SetDefaultUserID added in v0.9.27

func SetDefaultUserID(id string)

SetDefaultUserID sets the fallback user ID for API requests where no explicit userID is provided. Thread-safe.

func SetDefaultUserToken added in v0.9.18

func SetDefaultUserToken(token string)

SetDefaultUserToken sets the fallback user token for API requests where no explicit userToken is provided. Thread-safe.

func ValidateCallbackState

func ValidateCallbackState(callbackState, expectedState string) bool

func VerifyCallbackSignature

func VerifyCallbackSignature(timestamp, nonce, signature, encodingKey string, dataEncrypt string, callbackToken string) bool

Types

type APIError

type APIError struct {
	LansengerError
}

func NewAPIError

func NewAPIError(message string, errCode int) *APIError

type AccountMessageResult

type AccountMessageResult struct {
	Success           bool                   `json:"success"`
	MessageID         string                 `json:"message_id"`
	InvalidStaff      []string               `json:"invalid_staff"`
	InvalidDepartment []string               `json:"invalid_department"`
	Error             string                 `json:"error"`
	RawResponse       map[string]interface{} `json:"raw_response"`
}

type AppCardParams

type AppCardParams struct {
	BodyTitle      string                   `json:"body_title"`
	ChatID         string                   `json:"chat_id"`
	HeadTitle      string                   `json:"head_title"`
	BodySubTitle   string                   `json:"body_sub_title"`
	BodyContent    string                   `json:"body_content"`
	Signature      string                   `json:"signature"`
	Fields         []map[string]interface{} `json:"fields"`
	Links          []map[string]interface{} `json:"links"`
	CardLink       string                   `json:"card_link"`
	PcCardLink     string                   `json:"pc_card_link"`
	PadCardLink    string                   `json:"pad_card_link"`
	IsDynamic      bool                     `json:"is_dynamic"`
	HeadStatusInfo map[string]interface{}   `json:"head_status_info"`
	StaffID        string                   `json:"staff_id"`
	HeadIconURL    string                   `json:"head_icon_url"`
	IsGroup        bool                     `json:"is_group"`
	UserToken      string                   `json:"user_token"`
	SenderID       string                   `json:"sender_id"`
}

type ApproveCardParams added in v0.9.21

type ApproveCardParams struct {
	ChatID      string `json:"chat_id"`
	BodyTitle   string `json:"body_title"`
	BodyContent string `json:"body_content"`

	HeadTitle          string `json:"head_title"`
	HeadIconLink       string `json:"head_icon_link"`
	HeadIconID         string `json:"head_icon_id"`
	HeadStatusDescribe string `json:"head_status_describe"`
	HeadStatusIcon     int    `json:"head_status_icon"`
	HeadStatusIconLink string `json:"head_status_icon_link"`
	HeadStatusColour   string `json:"head_status_colour"`

	BodyFormatType int                 `json:"body_format_type"`
	Fields         []map[string]string `json:"fields"`

	ReminderAll     bool     `json:"reminder_all"`
	ReminderUserIDs []string `json:"reminder_user_ids"`
	ReminderBotIDs  []string `json:"reminder_bot_ids"`

	CardLink       string `json:"card_link"`
	CardLinkForPC  string `json:"card_link_for_pc"`
	CardLinkForPad string `json:"card_link_for_pad"`

	Buttons []map[string]interface{} `json:"buttons"`

	ExpireTime int `json:"expire_time"`

	IsGroup   bool   `json:"is_group"`
	UserToken string `json:"user_token"`
	SenderID  string `json:"sender_id"`
}

type ApproveCardUpdateParams added in v0.9.21

type ApproveCardUpdateParams struct {
	MsgID string `json:"msg_id"`

	HeadStatusDescribe string `json:"head_status_describe"`
	HeadStatusIcon     int    `json:"head_status_icon"`
	HeadStatusIconLink string `json:"head_status_icon_link"`
	HeadStatusColour   string `json:"head_status_colour"`

	Buttons []map[string]interface{} `json:"buttons"`
}

type AuthError

type AuthError struct {
	LansengerError
}

func NewAuthError

func NewAuthError(message string) *AuthError

type BotCommandQueryResult added in v0.9.21

type BotCommandQueryResult struct {
	Success     bool                     `json:"success"`
	ScopeType   int                      `json:"scope_type"`
	ChatID      string                   `json:"chat_id"`
	ChatType    string                   `json:"chat_type"`
	StaffID     string                   `json:"staff_id"`
	Commands    []map[string]interface{} `json:"commands"`
	Error       string                   `json:"error"`
	RawResponse map[string]interface{}   `json:"raw_response"`
}

type BotCommandResult added in v0.9.21

type BotCommandResult struct {
	Success     bool                   `json:"success"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type BotMessageResult

type BotMessageResult struct {
	Success           bool                   `json:"success"`
	MessageID         string                 `json:"message_id"`
	InvalidStaff      []string               `json:"invalid_staff"`
	InvalidDepartment []string               `json:"invalid_department"`
	Error             string                 `json:"error"`
	RawResponse       map[string]interface{} `json:"raw_response"`
}

type CalendarPrimaryResult

type CalendarPrimaryResult struct {
	Success     bool                   `json:"success"`
	CalendarID  string                 `json:"calendar_id"`
	Summary     string                 `json:"summary"`
	Description string                 `json:"description"`
	Permissions string                 `json:"permissions"`
	Color       string                 `json:"color"`
	Type        string                 `json:"type"`
	Role        string                 `json:"role"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type CallbackEvent

type CallbackEvent struct {
	EventID   string
	EventType string
	Category  string
	Data      map[string]interface{}
	RawData   map[string]interface{}
	AppID     string
	OrgID     string
}

func ParseCallbackPayload

func ParseCallbackPayload(input string) ([]CallbackEvent, error)

type ChatGroupInfo

type ChatGroupInfo struct {
	GroupID   string `json:"group_id"`
	GroupName string `json:"group_name"`
}

type ChatListResult

type ChatListResult struct {
	Success     bool                   `json:"success"`
	StaffInfos  []ChatStaffInfo        `json:"staff_infos"`
	GroupInfos  []ChatGroupInfo        `json:"group_infos"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type ChatMessageInfo

type ChatMessageInfo struct {
	SendTime    string                 `json:"send_time"`
	Sender      string                 `json:"sender"`
	MessageType string                 `json:"message_type"`
	Content     map[string]interface{} `json:"content"`
}

func (*ChatMessageInfo) PlainText

func (m *ChatMessageInfo) PlainText() string

type ChatMessagesResult

type ChatMessagesResult struct {
	Success     bool                   `json:"success"`
	HasMore     bool                   `json:"has_more"`
	Total       int                    `json:"total"`
	LastVersion string                 `json:"last_version"`
	Name        string                 `json:"name"`
	ChatType    string                 `json:"chat_type"`
	Messages    []ChatMessageInfo      `json:"messages"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type ChatStaffInfo

type ChatStaffInfo struct {
	StaffID     string   `json:"staff_id"`
	StaffName   string   `json:"staff_name"`
	SectorNames []string `json:"sector_names"`
}

type Config

type Config struct {
	AppID         string
	AppSecret     string
	APIGatewayURL string
	PassportURL   string
	RedirectURI   string
	HTTPTimeout   float64
	EncodingKey   string
	CallbackToken string
	AppToken      string
	UserToken     string
}

func ConfigFromEnv

func ConfigFromEnv() (*Config, error)

func NewConfig

func NewConfig(appID, appSecret string) *Config

func (*Config) HasPassportURL

func (c *Config) HasPassportURL() bool

func (*Config) IsConfigured

func (c *Config) IsConfigured() bool

func (*Config) IsExternalMode added in v0.9.21

func (c *Config) IsExternalMode() bool

type ConfigError

type ConfigError struct {
	LansengerError
}

func NewConfigError

func NewConfigError(message string) *ConfigError

type CreateGroupResult

type CreateGroupResult struct {
	Success           bool                   `json:"success"`
	GroupID           string                 `json:"group_id"`
	TotalMembers      int                    `json:"total_members"`
	InvalidStaff      []string               `json:"invalid_staff"`
	InvalidDepartment []string               `json:"invalid_department"`
	Error             string                 `json:"error"`
	RawResponse       map[string]interface{} `json:"raw_response"`
}

type CredentialStore

type CredentialStore struct {
	// contains filtered or unexported fields
}

func NewCredentialStore

func NewCredentialStore(path string, profile string) (*CredentialStore, error)

func (*CredentialStore) Clear

func (cs *CredentialStore) Clear() error

func (*CredentialStore) ClearProfile

func (cs *CredentialStore) ClearProfile() error

func (*CredentialStore) DeleteProfileByName added in v0.9.18

func (cs *CredentialStore) DeleteProfileByName(name string) bool

DeleteProfileByName deletes a profile by name. If the deleted profile is the active profile, it falls back to "default". Returns true if the profile was found and deleted, false if it did not exist.

func (*CredentialStore) GetActiveProfile

func (cs *CredentialStore) GetActiveProfile() string

func (*CredentialStore) HasCredentials

func (cs *CredentialStore) HasCredentials() bool

func (*CredentialStore) HasFullConfig added in v0.9.18

func (cs *CredentialStore) HasFullConfig() bool

HasFullConfig returns true if app_id, app_secret, and api_gateway_url are all non-empty for the current profile.

func (*CredentialStore) ListProfiles

func (cs *CredentialStore) ListProfiles() ([]string, error)

func (*CredentialStore) ListUserTokens added in v0.9.18

func (cs *CredentialStore) ListUserTokens() ([]string, error)

func (*CredentialStore) LoadAppToken

func (cs *CredentialStore) LoadAppToken() (string, error)

func (*CredentialStore) LoadCredentials

func (cs *CredentialStore) LoadCredentials() (map[string]string, error)

func (*CredentialStore) LoadState

func (cs *CredentialStore) LoadState() (*storeData, error)

func (*CredentialStore) LoadUserToken

func (cs *CredentialStore) LoadUserToken(staffID string) (map[string]string, error)

func (*CredentialStore) Path

func (cs *CredentialStore) Path() string

func (*CredentialStore) SaveAppToken

func (cs *CredentialStore) SaveAppToken(token string, expiresIn int) error

func (*CredentialStore) SaveCallbackConfig

func (cs *CredentialStore) SaveCallbackConfig(encodingKey, callbackToken string) error

func (*CredentialStore) SaveCredentials

func (cs *CredentialStore) SaveCredentials(appID, appSecret, apiGatewayURL, passportURL, redirectURI string) error

func (*CredentialStore) SaveUserToken

func (cs *CredentialStore) SaveUserToken(userToken, refreshToken string, expiresIn int, refreshExpiresIn int, staffID string) error

func (*CredentialStore) SetActiveProfile

func (cs *CredentialStore) SetActiveProfile(profile string) error

type DecryptedCallbackPayload

type DecryptedCallbackPayload struct {
	Random string
	OrgID  string
	AppID  string
	Events []CallbackEvent
	Length uint32
}

func DecryptCallbackPayload

func DecryptCallbackPayload(encryptedData, encodingKey string, knownAppID string) (*DecryptedCallbackPayload, error)

type DepartmentAncestorsResult

type DepartmentAncestorsResult struct {
	Success        bool                   `json:"success"`
	AncestorGroups [][]map[string]string  `json:"ancestor_groups"`
	Error          string                 `json:"error"`
	RawResponse    map[string]interface{} `json:"raw_response"`
}

type DepartmentChildrenResult

type DepartmentChildrenResult struct {
	Success     bool                     `json:"success"`
	Departments []map[string]interface{} `json:"departments"`
	Error       string                   `json:"error"`
	RawResponse map[string]interface{}   `json:"raw_response"`
}

type DepartmentDetailResult

type DepartmentDetailResult struct {
	Success               bool                     `json:"success"`
	ID                    string                   `json:"id"`
	Name                  string                   `json:"name"`
	ExternalID            string                   `json:"external_id"`
	ParentID              string                   `json:"parent_id"`
	Order                 float64                  `json:"order"`
	HasChildren           bool                     `json:"has_children"`
	NormalMembers         int                      `json:"normal_members"`
	InactiveMembers       int                      `json:"inactive_members"`
	FrozenMembers         int                      `json:"frozen_members"`
	DeletedMembers        int                      `json:"deleted_members"`
	NormalMembersUnique   int                      `json:"normal_members_unique"`
	InactiveMembersUnique int                      `json:"inactive_members_unique"`
	FrozenMembersUnique   int                      `json:"frozen_members_unique"`
	DeletedMembersUnique  int                      `json:"deleted_members_unique"`
	Tags                  []map[string]interface{} `json:"tags"`
	AncestorDepartments   []map[string]interface{} `json:"ancestor_departments"`
	Leaders               []map[string]interface{} `json:"leaders"`
	Emails                []string                 `json:"emails"`
	Phones                []string                 `json:"phones"`
	Addresses             []string                 `json:"addresses"`
	Introductions         []string                 `json:"introductions"`
	DeptType              int                      `json:"dept_type"`
	Error                 string                   `json:"error"`
	RawResponse           map[string]interface{}   `json:"raw_response"`
}

type DepartmentStaffsResult

type DepartmentStaffsResult struct {
	Success     bool                     `json:"success"`
	HasMore     bool                     `json:"has_more"`
	Total       int                      `json:"total"`
	Staffs      []map[string]interface{} `json:"staffs"`
	Error       string                   `json:"error"`
	RawResponse map[string]interface{}   `json:"raw_response"`
}

type DownloadMediaResult

type DownloadMediaResult struct {
	Success bool   `json:"success"`
	Data    []byte `json:"data"`
	Error   string `json:"error"`
}

type DynamicCardUpdateParams

type DynamicCardUpdateParams struct {
	MsgID          string                   `json:"msg_id"`
	UserId         string                   `json:"user_id"`
	HeadStatusInfo map[string]interface{}   `json:"head_status_info"`
	Links          []map[string]interface{} `json:"links"`
	IsLastUpdate   bool                     `json:"is_last_update"`
}

type ExtraFieldIdsResult

type ExtraFieldIdsResult struct {
	Success       bool                   `json:"success"`
	HasMore       bool                   `json:"has_more"`
	Total         int                    `json:"total"`
	ExtraFieldIDs []string               `json:"extra_field_ids"`
	Error         string                 `json:"error"`
	RawResponse   map[string]interface{} `json:"raw_response"`
}

type FileError

type FileError struct {
	LansengerError
}

func NewFileError

func NewFileError(message string) *FileError

type GroupCreateInfo

type GroupCreateInfo struct {
	Name                 string                 `json:"name"`
	OrgID                int                    `json:"org_id"`
	OwnerID              string                 `json:"owner_id"`
	Description          string                 `json:"description"`
	AvatarID             string                 `json:"avatar_id"`
	StaffIDList          []string               `json:"staff_id_list"`
	DepartmentIDList     []string               `json:"department_id_list"`
	ApplyRequestID       string                 `json:"apply_request_id"`
	ApplyNotes           string                 `json:"apply_notes"`
	ApplyGlobalUniqueID  string                 `json:"apply_global_unique_id"`
	ApplySessionUniqueID string                 `json:"apply_session_unique_id"`
	I18nApplyNotes       map[string]interface{} `json:"i18n_apply_notes"`
}

type GroupInfoResult

type GroupInfoResult struct {
	Success            bool                   `json:"success"`
	Name               string                 `json:"name"`
	Description        string                 `json:"description"`
	AvatarID           string                 `json:"avatar_id"`
	AvatarURL          string                 `json:"avatar_url"`
	OwnerStaffID       string                 `json:"owner_staff_id"`
	OwnerName          string                 `json:"owner_name"`
	CreatorStaffID     string                 `json:"creator_staff_id"`
	CreatorName        string                 `json:"creator_name"`
	State              string                 `json:"state"`
	ManageMode         string                 `json:"manage_mode"`
	LocationShare      bool                   `json:"location_share"`
	NeedsConfirm       bool                   `json:"needs_confirm"`
	IsPublic           bool                   `json:"is_public"`
	MaxMembers         int                    `json:"max_members"`
	MaxHistoryMsgCount int                    `json:"max_history_msg_count"`
	TotalMembers       int                    `json:"total_members"`
	RemindAll          bool                   `json:"remind_all"`
	SendMsgStatus      bool                   `json:"send_msg_status"`
	Error              string                 `json:"error"`
	RawResponse        map[string]interface{} `json:"raw_response"`
}

type GroupListResult

type GroupListResult struct {
	Success       bool                   `json:"success"`
	TotalGroupIDs int                    `json:"total_group_ids"`
	GroupIDs      []string               `json:"group_ids"`
	Error         string                 `json:"error"`
	RawResponse   map[string]interface{} `json:"raw_response"`
}

type GroupMemberResult

type GroupMemberResult struct {
	Success      bool                     `json:"success"`
	TotalMembers int                      `json:"total_members"`
	Members      []map[string]interface{} `json:"members"`
	Error        string                   `json:"error"`
	RawResponse  map[string]interface{}   `json:"raw_response"`
}

type IsInGroupResult

type IsInGroupResult struct {
	Success     bool                   `json:"success"`
	IsInGroup   bool                   `json:"is_in_group"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type LansengerClient

type LansengerClient struct {
	// contains filtered or unexported fields
}

func NewClient

func NewClient(appID, appSecret string) *LansengerClient

func NewClientFromEnv

func NewClientFromEnv() (*LansengerClient, error)

func NewClientFromStore

func NewClientFromStore(store *CredentialStore) (*LansengerClient, error)

func NewClientWithConfig

func NewClientWithConfig(cfg *Config) *LansengerClient

func (*LansengerClient) AddExecutors

func (c *LansengerClient) AddExecutors(ctx context.Context, executorIDs []string, orgID, todotaskID, userToken string) (*TodoTaskCreateResult, error)

func (*LansengerClient) AddScheduleAttendees

func (c *LansengerClient) AddScheduleAttendees(ctx context.Context, calendarID, scheduleID string, attendees []string, reminderType string, operationType, currentTime string, userToken, userID string) (*ScheduleCreateResult, error)

func (*LansengerClient) BuildAuthorizeURL

func (c *LansengerClient) BuildAuthorizeURL(redirectURI string, scope string, state string) string

func (*LansengerClient) CheckIsInGroup

func (c *LansengerClient) CheckIsInGroup(ctx context.Context, groupID, userToken, staffID string) (*IsInGroupResult, error)

func (*LansengerClient) CreateBotCommands added in v0.9.21

func (c *LansengerClient) CreateBotCommands(ctx context.Context, scopeType int, commands []map[string]interface{}, chatID, chatType, staffID string) (*BotCommandResult, error)

func (*LansengerClient) CreateGroup

func (c *LansengerClient) CreateGroup(ctx context.Context, info *GroupCreateInfo, userToken string) (*CreateGroupResult, error)

func (*LansengerClient) CreateGroupShareID

func (c *LansengerClient) CreateGroupShareID(ctx context.Context, groupID, creator string, expiresIn int64, userToken string) (*SendMessageResult, error)

func (*LansengerClient) CreatePersonalApp added in v0.9.21

func (c *LansengerClient) CreatePersonalApp(ctx context.Context, userToken, name, avatarID, description string) (*PersonalAppCreateResult, error)

func (*LansengerClient) CreateSchedule

func (c *LansengerClient) CreateSchedule(ctx context.Context, calendarID, summary string, startTime, endTime map[string]interface{}, attendees []map[string]interface{}, description string, allDay string, repeatType string, rule map[string]interface{}, expireDateType, reminderType, attendeePermissions string, userToken, userID string) (*ScheduleCreateResult, error)

func (*LansengerClient) CreateStreamMessage

func (c *LansengerClient) CreateStreamMessage(ctx context.Context, receiverID, receiverType, streamID string) (*StreamMessageResult, error)

func (*LansengerClient) CreateTodoTask

func (c *LansengerClient) CreateTodoTask(ctx context.Context, title string, todoType int, link, pcLink string, executorIDs []string, orgID, sourceID, desc, senderID, userToken string) (*TodoTaskCreateResult, error)

func (*LansengerClient) DeleteBotCommands added in v0.9.21

func (c *LansengerClient) DeleteBotCommands(ctx context.Context, scopeType int, chatID, chatType, staffID string) (*BotCommandResult, error)

func (*LansengerClient) DeleteExecutors

func (c *LansengerClient) DeleteExecutors(ctx context.Context, executorIDs []string, orgID, todotaskID, userToken string) (*TodoTaskCreateResult, error)

func (*LansengerClient) DeletePersonalApp added in v0.9.21

func (c *LansengerClient) DeletePersonalApp(ctx context.Context, appID, userToken string) (*PersonalAppInfoResult, error)

func (*LansengerClient) DeleteSchedule

func (c *LansengerClient) DeleteSchedule(ctx context.Context, calendarID, scheduleID string, reminderType string, operationType string, currentTime string, userToken, userID string) (*ScheduleDeleteResult, error)

func (*LansengerClient) DeleteScheduleAttendees

func (c *LansengerClient) DeleteScheduleAttendees(ctx context.Context, calendarID, scheduleID string, attendees []string, reminderType string, operationType, currentTime string, userToken, userID string) (*ScheduleAttendeesDeleteResult, error)

func (*LansengerClient) DeleteTodoTask

func (c *LansengerClient) DeleteTodoTask(ctx context.Context, todotaskID, orgID, staffID, userToken string) (*TodoTaskCreateResult, error)

func (*LansengerClient) DissolveGroup

func (c *LansengerClient) DissolveGroup(ctx context.Context, groupID, userToken string) (*UpdateGroupResult, error)

func (*LansengerClient) DownloadMedia

func (c *LansengerClient) DownloadMedia(ctx context.Context, mediaID string) (*DownloadMediaResult, error)

func (*LansengerClient) DownloadMediaToFile

func (c *LansengerClient) DownloadMediaToFile(ctx context.Context, mediaID string, targetPath string) (string, error)

func (*LansengerClient) ExchangeCode

func (c *LansengerClient) ExchangeCode(ctx context.Context, code string, redirectURI string) (*UserTokenResult, error)

func (*LansengerClient) FetchBotCommands added in v0.9.21

func (c *LansengerClient) FetchBotCommands(ctx context.Context, scopeType int, chatID, chatType, staffID string) (*BotCommandQueryResult, error)

func (*LansengerClient) FetchChatList

func (c *LansengerClient) FetchChatList(ctx context.Context, userToken string, chatType int, keyword string, startTime, endTime int64) (*ChatListResult, error)

func (*LansengerClient) FetchChatMessages

func (c *LansengerClient) FetchChatMessages(ctx context.Context, userToken string, pageSize int, baseVersion string, staffID, groupID string, startTime, endTime int64, senderID string) (*ChatMessagesResult, error)

func (*LansengerClient) FetchDepartmentAncestors

func (c *LansengerClient) FetchDepartmentAncestors(ctx context.Context, staffID string, userToken string) (*DepartmentAncestorsResult, error)

func (*LansengerClient) FetchDepartmentChildren

func (c *LansengerClient) FetchDepartmentChildren(ctx context.Context, departmentID, userToken string) (*DepartmentChildrenResult, error)

func (*LansengerClient) FetchDepartmentDetail

func (c *LansengerClient) FetchDepartmentDetail(ctx context.Context, departmentID, userToken, tagID string) (*DepartmentDetailResult, error)

func (*LansengerClient) FetchDepartmentStaffs

func (c *LansengerClient) FetchDepartmentStaffs(ctx context.Context, departmentID, userToken string, page, pageSize int) (*DepartmentStaffsResult, error)

func (*LansengerClient) FetchExecutorList

func (c *LansengerClient) FetchExecutorList(ctx context.Context, todotaskID, orgID, staffID string, statusList []string, userToken string) (*TodoTaskExecutorListResult, error)

func (*LansengerClient) FetchGroupInfo

func (c *LansengerClient) FetchGroupInfo(ctx context.Context, groupID, userToken string) (*GroupInfoResult, error)

func (*LansengerClient) FetchGroupList

func (c *LansengerClient) FetchGroupList(ctx context.Context, userToken string, pageOffset, pageSize int) (*GroupListResult, error)

func (*LansengerClient) FetchGroupMembers

func (c *LansengerClient) FetchGroupMembers(ctx context.Context, groupID, userToken string, pageOffset, pageSize int) (*GroupMemberResult, error)

func (*LansengerClient) FetchMediaPath

func (c *LansengerClient) FetchMediaPath(ctx context.Context, mediaID string, userToken string) (*MediaPathResult, error)

func (*LansengerClient) FetchOrgExtraFieldIDs

func (c *LansengerClient) FetchOrgExtraFieldIDs(ctx context.Context, orgID, userToken string, page, pageSize int) (*ExtraFieldIdsResult, error)

func (*LansengerClient) FetchOrgInfo

func (c *LansengerClient) FetchOrgInfo(ctx context.Context, orgID, userToken string) (*OrgInfoResult, error)

func (*LansengerClient) FetchPersonalApp added in v0.9.21

func (c *LansengerClient) FetchPersonalApp(ctx context.Context, appID, userToken string) (*PersonalAppInfoResult, error)

func (*LansengerClient) FetchPersonalAppList added in v0.9.21

func (c *LansengerClient) FetchPersonalAppList(ctx context.Context, userToken string) (*PersonalAppListResult, error)

func (*LansengerClient) FetchPrimaryCalendar

func (c *LansengerClient) FetchPrimaryCalendar(ctx context.Context, userToken, userID string) (*CalendarPrimaryResult, error)

func (*LansengerClient) FetchSchedule

func (c *LansengerClient) FetchSchedule(ctx context.Context, calendarID, scheduleID, userToken, userID string) (*ScheduleInfoResult, error)

func (*LansengerClient) FetchScheduleAttendees

func (c *LansengerClient) FetchScheduleAttendees(ctx context.Context, calendarID, scheduleID string, page, pageSize int, userToken, userID string) (*ScheduleAttendeesResult, error)

func (*LansengerClient) FetchScheduleList

func (c *LansengerClient) FetchScheduleList(ctx context.Context, calendarID string, startTime, endTime int64, userToken, userID string) (*ScheduleListResult, error)

func (*LansengerClient) FetchStaffBasicInfo

func (c *LansengerClient) FetchStaffBasicInfo(ctx context.Context, staffID string, userToken string) (*StaffBasicInfoResult, error)

func (*LansengerClient) FetchStaffDetail

func (c *LansengerClient) FetchStaffDetail(ctx context.Context, staffID string, userToken string) (*StaffDetailResult, error)

func (*LansengerClient) FetchStaffIdMapping

func (c *LansengerClient) FetchStaffIdMapping(ctx context.Context, orgID, idType, idValue, userToken string) (*StaffIdMappingResult, error)

func (*LansengerClient) FetchStreamMessage

func (c *LansengerClient) FetchStreamMessage(ctx context.Context, msgID string) (*StreamMessageResult, error)

func (*LansengerClient) FetchTodoTaskByID

func (c *LansengerClient) FetchTodoTaskByID(ctx context.Context, todotaskID, orgID, staffID, userToken string) (*TodoTaskInfoResult, error)

func (*LansengerClient) FetchTodoTaskBySourceID

func (c *LansengerClient) FetchTodoTaskBySourceID(ctx context.Context, sourceID, orgID, staffID, userToken string) (*TodoTaskInfoResult, error)

func (*LansengerClient) FetchTodoTaskList

func (c *LansengerClient) FetchTodoTaskList(ctx context.Context, orgID string, appIDs []string, staffID string, statusList []string, userToken string) (*TodoTaskListResult, error)

func (*LansengerClient) FetchTodoTaskStatusCounts

func (c *LansengerClient) FetchTodoTaskStatusCounts(ctx context.Context, staffID, orgID, appID string, statusList []string, userToken string) (*TodoTaskStatusCountResult, error)

func (*LansengerClient) FetchUserInfo

func (c *LansengerClient) FetchUserInfo(ctx context.Context, userToken string) (*UserInfoResult, error)

func (*LansengerClient) GetToken

func (c *LansengerClient) GetToken(ctx context.Context) (string, error)

func (*LansengerClient) GetUserToken

func (c *LansengerClient) GetUserToken(ctx context.Context) (string, error)

func (*LansengerClient) GetUserTokenWithStaffID added in v0.9.18

func (c *LansengerClient) GetUserTokenWithStaffID(ctx context.Context, staffID string) (string, error)

func (*LansengerClient) HealthCheck

func (c *LansengerClient) HealthCheck(ctx context.Context) bool

func (*LansengerClient) InvalidateToken

func (c *LansengerClient) InvalidateToken()

func (*LansengerClient) QueryGroups deprecated

func (c *LansengerClient) QueryGroups(ctx context.Context, pageOffset, pageSize int) (*QueryGroupsResult, error)

Deprecated: Use FetchGroupList from groups.go instead.

func (*LansengerClient) RefreshUserToken

func (c *LansengerClient) RefreshUserToken(ctx context.Context, refreshToken string, scope string) (*UserTokenResult, error)

func (*LansengerClient) RevokeMessage

func (c *LansengerClient) RevokeMessage(ctx context.Context, messageIDs []string, chatType string, senderID string, sysMsg *SysMsgParams) (*SendMessageResult, error)

func (*LansengerClient) SearchStaff

func (c *LansengerClient) SearchStaff(ctx context.Context, keyword, userToken, userID string, recursive bool, sectorIDs []string, page, pageSize int) (*StaffSearchResult, error)

func (*LansengerClient) SendAccountMessage

func (c *LansengerClient) SendAccountMessage(ctx context.Context, msgType string, msgData map[string]interface{}, chatIDs, departmentIDs []string, accountID, entryID, attach, userToken string) (*AccountMessageResult, error)

func (*LansengerClient) SendAppArticles

func (c *LansengerClient) SendAppArticles(ctx context.Context, chatID string, articles []map[string]string, isGroup bool, userToken, senderID string) (*SendMessageResult, error)

func (*LansengerClient) SendAppCardWithParams

func (c *LansengerClient) SendAppCardWithParams(ctx context.Context, params *AppCardParams) (*SendMessageResult, error)

func (*LansengerClient) SendApproveCard added in v0.9.21

func (c *LansengerClient) SendApproveCard(ctx context.Context, chatID, bodyTitle, bodyContent, headTitle, headIconLink, headIconID, headStatusDescribe string, headStatusIcon int, headStatusIconLink, headStatusColour string, bodyFormatType int, fields []map[string]string, reminderAll bool, reminderUserIDs, reminderBotIDs []string, cardLink, cardLinkForPC, cardLinkForPad string, buttons []map[string]interface{}, expireTime int, isGroup bool, userToken, senderID string) (*SendMessageResult, error)

func (*LansengerClient) SendApproveCardWithParams added in v0.9.21

func (c *LansengerClient) SendApproveCardWithParams(ctx context.Context, params *ApproveCardParams) (*SendMessageResult, error)

func (*LansengerClient) SendBotMessage

func (c *LansengerClient) SendBotMessage(ctx context.Context, msgType string, msgData map[string]interface{}, chatIDs, departmentIDs []string, userToken, entryID, refMsgID string) (*BotMessageResult, error)

func (*LansengerClient) SendFile

func (c *LansengerClient) SendFile(ctx context.Context, chatID, filePath string, content string, mediaType string, coverImagePath string, isGroup bool, userToken, senderID string) (*SendMessageResult, error)

func (*LansengerClient) SendGroupMessage

func (c *LansengerClient) SendGroupMessage(ctx context.Context, groupID, msgType string, msgData map[string]interface{}, userToken, senderID string, outlines, uuid, entryID, refMsgID string) (*SendMessageResult, error)

func (*LansengerClient) SendImageURL

func (c *LansengerClient) SendImageURL(ctx context.Context, chatID, imageURL, content string, isGroup bool, userToken, senderID string) (*SendMessageResult, error)

func (*LansengerClient) SendLinkCardWithParams

func (c *LansengerClient) SendLinkCardWithParams(ctx context.Context, params *LinkCardParams) (*SendMessageResult, error)

func (*LansengerClient) SendMarkdown

func (c *LansengerClient) SendMarkdown(ctx context.Context, chatID, content string, reminderAll bool, reminderUserIDs, reminderBotIDs []string, isGroup bool, userToken, senderID, refMsgID string) (*SendMessageResult, error)

func (*LansengerClient) SendOaCardWithParams

func (c *LansengerClient) SendOaCardWithParams(ctx context.Context, params *OaCardParams) (*SendMessageResult, error)

func (*LansengerClient) SendReminder

func (c *LansengerClient) SendReminder(ctx context.Context, msgID string, reminderTypes []int, userIDList []string) (*SendMessageResult, error)

func (*LansengerClient) SendText

func (c *LansengerClient) SendText(ctx context.Context, chatID, content string, filePath string, mediaType string, coverImagePath string, reminderAll bool, reminderUserIDs, reminderBotIDs []string, isGroup bool, userToken, senderID, refMsgID string) (*SendMessageResult, error)

func (*LansengerClient) SendUserMessage

func (c *LansengerClient) SendUserMessage(ctx context.Context, receiverID, msgType string, msgData map[string]interface{}, common map[string]interface{}, userToken, uuid string) (*UserMessageResult, error)

func (*LansengerClient) SetUserTokens

func (c *LansengerClient) SetUserTokens(userToken, refreshToken string, expiresIn int, staffID string, refreshExpiresIn int)

func (*LansengerClient) UpdateApproveCard added in v0.9.21

func (c *LansengerClient) UpdateApproveCard(ctx context.Context, params *ApproveCardUpdateParams) (*SendMessageResult, error)

func (*LansengerClient) UpdateDynamicCard

func (c *LansengerClient) UpdateDynamicCard(ctx context.Context, params *DynamicCardUpdateParams) (*SendMessageResult, error)

func (*LansengerClient) UpdateExecutorStatus

func (c *LansengerClient) UpdateExecutorStatus(ctx context.Context, executorStatusList []map[string]interface{}, orgID, todotaskID, userToken string) (*TodoTaskCreateResult, error)

func (*LansengerClient) UpdateGroupInfo

func (c *LansengerClient) UpdateGroupInfo(ctx context.Context, groupID string, params map[string]interface{}, userToken string) (*UpdateGroupResult, error)

func (*LansengerClient) UpdateGroupMembers

func (c *LansengerClient) UpdateGroupMembers(ctx context.Context, groupID string, addUserList, delUserList, addDepartmentIDList []string, userToken string) (*UpdateGroupMembersResult, error)

func (*LansengerClient) UpdatePersonalApp added in v0.9.21

func (c *LansengerClient) UpdatePersonalApp(ctx context.Context, appID, userToken, name, avatarID, description string) (*PersonalAppInfoResult, error)

func (*LansengerClient) UpdateSchedule

func (c *LansengerClient) UpdateSchedule(ctx context.Context, calendarID, scheduleID string, params map[string]interface{}, userToken, userID string) (*ScheduleDeleteResult, error)

func (*LansengerClient) UpdateScheduleAttendeeMeta

func (c *LansengerClient) UpdateScheduleAttendeeMeta(ctx context.Context, calendarID, scheduleID string, params map[string]interface{}, userToken, userID string) (*SendMessageResult, error)

func (*LansengerClient) UpdateScheduleAttendees added in v0.9.21

func (c *LansengerClient) UpdateScheduleAttendees(ctx context.Context, calendarID, scheduleID string, addAttendees, deleteAttendees []string, reminderType, operationType string, currentTime int, userToken, userID string) (*ScheduleAttendeesUpdateResult, error)

func (*LansengerClient) UpdateTodoTask

func (c *LansengerClient) UpdateTodoTask(ctx context.Context, todotaskID, title, link, pcLink, orgID, desc, userToken string) (*TodoTaskCreateResult, error)

func (*LansengerClient) UpdateTodoTaskStatus

func (c *LansengerClient) UpdateTodoTaskStatus(ctx context.Context, todotaskID, status, orgID, staffID, userToken string) (*TodoTaskCreateResult, error)

func (*LansengerClient) UploadAppMedia

func (c *LansengerClient) UploadAppMedia(ctx context.Context, filePath string, mediaType string, width, height, duration int) (*UploadAppMediaResult, error)

func (*LansengerClient) UploadMedia

func (c *LansengerClient) UploadMedia(ctx context.Context, filePath string, mediaType int, userToken string) (*UploadMediaResult, error)

type LansengerError

type LansengerError struct {
	Message   string
	ErrCode   int
	Retryable bool
}

func (*LansengerError) Error

func (e *LansengerError) Error() string

type LinkCardParams

type LinkCardParams struct {
	ChatID       string `json:"chat_id"`
	Title        string `json:"title"`
	Link         string `json:"link"`
	Description  string `json:"description"`
	IconLink     string `json:"icon_link"`
	PcLink       string `json:"pc_link"`
	PadLink      string `json:"pad_link"`
	FromName     string `json:"from_name"`
	FromIconLink string `json:"from_icon_link"`
	IsGroup      bool   `json:"is_group"`
	UserToken    string `json:"user_token"`
	SenderID     string `json:"sender_id"`
}

type MediaPathResult

type MediaPathResult struct {
	Success     bool                   `json:"success"`
	MediaPath   string                 `json:"media_path"`
	Name        string                 `json:"name"`
	Type        string                 `json:"type"`
	Size        string                 `json:"size"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type NetworkError

type NetworkError struct {
	LansengerError
}

func NewNetworkError

func NewNetworkError(message string) *NetworkError

type OaCardParams

type OaCardParams struct {
	ChatID     string                   `json:"chat_id"`
	Head       string                   `json:"head"`
	Title      string                   `json:"title"`
	SubTitle   string                   `json:"sub_title"`
	StaffID    string                   `json:"staff_id"`
	Fields     []map[string]interface{} `json:"fields"`
	Link       string                   `json:"link"`
	PcLink     string                   `json:"pc_link"`
	PadLink    string                   `json:"pad_link"`
	CardAction map[string]interface{}   `json:"card_action"`
	IsGroup    bool                     `json:"is_group"`
	UserToken  string                   `json:"user_token"`
	SenderID   string                   `json:"sender_id"`
}

type OrgInfoResult

type OrgInfoResult struct {
	Success           bool                   `json:"success"`
	OrgID             string                 `json:"org_id"`
	OrgName           string                 `json:"org_name"`
	IconURL           string                 `json:"icon_url"`
	OrgMaxMemberLimit int                    `json:"org_max_member_limit"`
	OrgOrderType      string                 `json:"org_order_type"`
	OrgDaysLimit      int                    `json:"org_days_limit"`
	OrgBillingDate    string                 `json:"org_billing_date"`
	Error             string                 `json:"error"`
	RawResponse       map[string]interface{} `json:"raw_response"`
}

type PersonalAppCreateResult added in v0.9.21

type PersonalAppCreateResult struct {
	Success      bool                   `json:"success"`
	AppID        string                 `json:"app_id"`
	Secret       string                 `json:"secret"`
	APIGWAddr    string                 `json:"apigw_addr"`
	PassportAddr string                 `json:"passport_addr"`
	Error        string                 `json:"error"`
	RawResponse  map[string]interface{} `json:"raw_response"`
}

type PersonalAppInfoResult added in v0.9.21

type PersonalAppInfoResult struct {
	Success      bool                   `json:"success"`
	AppID        string                 `json:"app_id"`
	Name         string                 `json:"name"`
	AvatarID     string                 `json:"avatar_id"`
	Description  string                 `json:"description"`
	APIGWAddr    string                 `json:"apigw_addr"`
	PassportAddr string                 `json:"passport_addr"`
	Error        string                 `json:"error"`
	RawResponse  map[string]interface{} `json:"raw_response"`
}

type PersonalAppListResult added in v0.9.21

type PersonalAppListResult struct {
	Success     bool                     `json:"success"`
	AppList     []map[string]interface{} `json:"app_list"`
	Error       string                   `json:"error"`
	RawResponse map[string]interface{}   `json:"raw_response"`
}

type QueryGroupsResult

type QueryGroupsResult struct {
	Success       bool                   `json:"success"`
	TotalGroupIDs int                    `json:"total_group_ids"`
	GroupIDs      []string               `json:"group_ids"`
	Error         string                 `json:"error"`
	Platform      string                 `json:"platform"`
	Operation     string                 `json:"operation"`
	RawResponse   map[string]interface{} `json:"raw_response"`
}

type ScheduleAttendeesDeleteResult

type ScheduleAttendeesDeleteResult struct {
	Success     bool                   `json:"success"`
	ScheduleIDs []string               `json:"schedule_ids"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type ScheduleAttendeesResult

type ScheduleAttendeesResult struct {
	Success     bool                     `json:"success"`
	Total       int                      `json:"total"`
	Attendees   []map[string]interface{} `json:"attendees"`
	Error       string                   `json:"error"`
	RawResponse map[string]interface{}   `json:"raw_response"`
}

type ScheduleAttendeesUpdateResult added in v0.9.21

type ScheduleAttendeesUpdateResult struct {
	Success         bool                   `json:"success"`
	ScheduleIDs     []string               `json:"schedule_ids"`
	FailedAttendees []string               `json:"failed_attendees"`
	Error           string                 `json:"error"`
	RawResponse     map[string]interface{} `json:"raw_response"`
}

type ScheduleCreateResult

type ScheduleCreateResult struct {
	Success     bool                   `json:"success"`
	ScheduleID  string                 `json:"schedule_id"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type ScheduleDeleteResult

type ScheduleDeleteResult struct {
	Success     bool                   `json:"success"`
	ScheduleIDs []string               `json:"schedule_ids"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type ScheduleInfoResult

type ScheduleInfoResult struct {
	Success             bool                   `json:"success"`
	ScheduleID          string                 `json:"schedule_id"`
	Summary             string                 `json:"summary"`
	Description         string                 `json:"description"`
	RepeatType          string                 `json:"repeat_type"`
	AllDay              string                 `json:"all_day"`
	StartTime           map[string]interface{} `json:"start_time"`
	EndTime             map[string]interface{} `json:"end_time"`
	Creator             map[string]interface{} `json:"creator"`
	RsvpStatus          string                 `json:"rsvp_status"`
	PrimaryScheduleID   string                 `json:"primary_schedule_id"`
	ExpireDateType      string                 `json:"expire_date_type"`
	AttendeePermissions string                 `json:"attendee_permissions"`
	Color               string                 `json:"color"`
	Error               string                 `json:"error"`
	RawResponse         map[string]interface{} `json:"raw_response"`
}

type ScheduleListResult

type ScheduleListResult struct {
	Success      bool                     `json:"success"`
	ScheduleList []map[string]interface{} `json:"schedule_list"`
	Error        string                   `json:"error"`
	RawResponse  map[string]interface{}   `json:"raw_response"`
}

type SendMessageResult

type SendMessageResult struct {
	Success     bool                   `json:"success"`
	MessageID   string                 `json:"message_id"`
	Error       string                 `json:"error"`
	Platform    string                 `json:"platform"`
	MsgType     string                 `json:"msg_type"`
	Operation   string                 `json:"operation"`
	RawResponse map[string]interface{} `json:"raw_response"`
	Retryable   bool                   `json:"retryable"`
}

type StaffBasicInfoResult

type StaffBasicInfoResult struct {
	Success     bool                     `json:"success"`
	OrgID       string                   `json:"org_id"`
	OrgName     string                   `json:"org_name"`
	Name        string                   `json:"name"`
	Gender      string                   `json:"gender"`
	Signature   string                   `json:"signature"`
	AvatarURL   string                   `json:"avatar_url"`
	AvatarID    string                   `json:"avatar_id"`
	Status      string                   `json:"status"`
	Departments []map[string]interface{} `json:"departments"`
	Error       string                   `json:"error"`
	RawResponse map[string]interface{}   `json:"raw_response"`
}

type StaffDetailResult

type StaffDetailResult struct {
	Success                bool                     `json:"success"`
	Name                   string                   `json:"name"`
	Signature              string                   `json:"signature"`
	AvatarID               string                   `json:"avatar_id"`
	AvatarURL              string                   `json:"avatar_url"`
	Status                 string                   `json:"status"`
	Departments            []map[string]interface{} `json:"departments"`
	Gender                 string                   `json:"gender"`
	OrgID                  string                   `json:"org_id"`
	OrgName                string                   `json:"org_name"`
	LoginName              string                   `json:"login_name"`
	EmployeeNumber         string                   `json:"employee_number"`
	Email                  string                   `json:"email"`
	ExternalID             string                   `json:"external_id"`
	Nationality            string                   `json:"nationality"`
	Birthdate              string                   `json:"birthdate"`
	IDNumber               string                   `json:"id_number"`
	NativePlace            string                   `json:"native_place"`
	Duties                 []map[string]interface{} `json:"duties"`
	Parties                []map[string]interface{} `json:"parties"`
	Address                string                   `json:"address"`
	MobilePhone            string                   `json:"mobile_phone"`
	MobilePhoneCountryCode string                   `json:"mobile_phone_country_code"`
	ExtraPhones            []string                 `json:"extra_phones"`
	Introduction           string                   `json:"introduction"`
	Education              []map[string]interface{} `json:"education"`
	Career                 []map[string]interface{} `json:"career"`
	LoginWays              []map[string]interface{} `json:"login_ways"`
	Tags                   []map[string]interface{} `json:"tags"`
	ExtraFieldSet          []map[string]interface{} `json:"extra_field_set"`
	Leaders                []map[string]interface{} `json:"leaders"`
	JoinDate               string                   `json:"join_date"`
	Error                  string                   `json:"error"`
	RawResponse            map[string]interface{}   `json:"raw_response"`
}

type StaffIdMappingResult

type StaffIdMappingResult struct {
	Success     bool                   `json:"success"`
	StaffID     string                 `json:"staff_id"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type StaffSearchResult

type StaffSearchResult struct {
	Success     bool                     `json:"success"`
	HasMore     bool                     `json:"has_more"`
	Total       int                      `json:"total"`
	StaffInfo   []map[string]interface{} `json:"staff_info"`
	Error       string                   `json:"error"`
	RawResponse map[string]interface{}   `json:"raw_response"`
}

type StreamMessageResult

type StreamMessageResult struct {
	Success     bool                   `json:"success"`
	MessageID   string                 `json:"message_id"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type SysMsgParams

type SysMsgParams struct {
	Content string `json:"content"`
	MediaID string `json:"media_id"`
}

type TodoTaskCreateResult

type TodoTaskCreateResult struct {
	Success     bool                   `json:"success"`
	TodotaskID  string                 `json:"todotask_id"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type TodoTaskExecutorListResult

type TodoTaskExecutorListResult struct {
	Success      bool                     `json:"success"`
	Total        int                      `json:"total"`
	ExecutorList []map[string]interface{} `json:"executor_list"`
	Error        string                   `json:"error"`
	RawResponse  map[string]interface{}   `json:"raw_response"`
}

type TodoTaskInfoResult

type TodoTaskInfoResult struct {
	Success     bool                   `json:"success"`
	TodotaskID  string                 `json:"todotask_id"`
	SourceID    string                 `json:"source_id"`
	Title       string                 `json:"title"`
	Desc        string                 `json:"desc"`
	Status      string                 `json:"status"`
	Type        int                    `json:"type"`
	Link        string                 `json:"link"`
	PcLink      string                 `json:"pc_link"`
	SenderID    string                 `json:"sender_id"`
	ExecutorIDs []string               `json:"executor_ids"`
	CreateTime  string                 `json:"create_time"`
	AppID       string                 `json:"app_id"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type TodoTaskListResult

type TodoTaskListResult struct {
	Success      bool                     `json:"success"`
	Total        int                      `json:"total"`
	TodotaskList []map[string]interface{} `json:"todotask_list"`
	Error        string                   `json:"error"`
	RawResponse  map[string]interface{}   `json:"raw_response"`
}

type TodoTaskStatusCountResult

type TodoTaskStatusCountResult struct {
	Success      bool                     `json:"success"`
	StatusCounts []map[string]interface{} `json:"status_counts"`
	Error        string                   `json:"error"`
	RawResponse  map[string]interface{}   `json:"raw_response"`
}

type TokenManager

type TokenManager struct {
	// contains filtered or unexported fields
}

func NewTokenManager

func NewTokenManager(cfg *Config, httpClient *http.Client) *TokenManager

func (*TokenManager) GetToken

func (tm *TokenManager) GetToken(ctx context.Context) (string, error)

func (*TokenManager) Invalidate

func (tm *TokenManager) Invalidate()

type URLOption

type URLOption struct {
	Key   string
	Value string
	Apply func(v url.Values)
}

func WithAppID

func WithAppID(appID string) URLOption

func WithCode

func WithCode(code string) URLOption

func WithGrantType

func WithGrantType(grantType string) URLOption

func WithIDType

func WithIDType(idType string) URLOption

func WithIDValue

func WithIDValue(idValue string) URLOption

func WithIntParam

func WithIntParam(key string, value int) URLOption

func WithMediaType

func WithMediaType(mediaType int) URLOption

func WithMediaTypeString

func WithMediaTypeString(mediaType string) URLOption

func WithOrgID

func WithOrgID(orgID string) URLOption

func WithPage

func WithPage(page int) URLOption

func WithPageOffset

func WithPageOffset(offset int) URLOption

func WithPageSize

func WithPageSize(pageSize int) URLOption

func WithPathVar

func WithPathVar(key, value string) URLOption

func WithQueryParam

func WithQueryParam(key, value string) URLOption

func WithRedirectURI

func WithRedirectURI(uri string) URLOption

func WithRefreshToken

func WithRefreshToken(token string) URLOption

func WithScope

func WithScope(scope string) URLOption

func WithSecret

func WithSecret(secret string) URLOption

func WithStaffID

func WithStaffID(staffID string) URLOption

func WithTagID

func WithTagID(tagID string) URLOption

func WithUserID

func WithUserID(id string) URLOption

func WithUserToken

func WithUserToken(token string) URLOption

type UpdateGroupMembersResult

type UpdateGroupMembersResult struct {
	Success           bool                   `json:"success"`
	TotalMembers      int                    `json:"total_members"`
	AddedStaffCount   int                    `json:"added_staff_count"`
	DeletedStaffCount int                    `json:"deleted_staff_count"`
	InvalidStaff      []string               `json:"invalid_staff"`
	InvalidDepartment []string               `json:"invalid_department"`
	Error             string                 `json:"error"`
	RawResponse       map[string]interface{} `json:"raw_response"`
}

type UpdateGroupResult

type UpdateGroupResult struct {
	Success     bool                   `json:"success"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type UploadAppMediaResult

type UploadAppMediaResult struct {
	Success bool   `json:"success"`
	MediaID string `json:"media_id"`
	Error   string `json:"error"`
}

type UploadMediaResult

type UploadMediaResult struct {
	Success     bool   `json:"success"`
	MediaID     string `json:"media_id"`
	CreatedTime string `json:"created_time"`
	Error       string `json:"error"`
}

type UserInfoResult

type UserInfoResult struct {
	Success        bool                     `json:"success"`
	StaffID        string                   `json:"staff_id"`
	Name           string                   `json:"name"`
	OrgID          string                   `json:"org_id"`
	OrgName        string                   `json:"org_name"`
	AvatarID       string                   `json:"avatar_id"`
	AvatarURL      string                   `json:"avatar_url"`
	Email          string                   `json:"email"`
	EmployeeNumber string                   `json:"employee_number"`
	LoginName      string                   `json:"login_name"`
	ExternalID     string                   `json:"external_id"`
	Departments    []map[string]interface{} `json:"department"`
	Error          string                   `json:"error"`
	RawResponse    map[string]interface{}   `json:"raw_response"`
}

type UserMessageResult

type UserMessageResult struct {
	Success     bool                   `json:"success"`
	MessageID   string                 `json:"message_id"`
	Error       string                 `json:"error"`
	RawResponse map[string]interface{} `json:"raw_response"`
}

type UserTokenManager

type UserTokenManager struct {
	// contains filtered or unexported fields
}

func NewUserTokenManager

func NewUserTokenManager(client *LansengerClient, store *CredentialStore) *UserTokenManager

func (*UserTokenManager) GetToken

func (utm *UserTokenManager) GetToken(ctx context.Context) (string, error)

func (*UserTokenManager) Invalidate

func (utm *UserTokenManager) Invalidate()

func (*UserTokenManager) RefreshToken

func (utm *UserTokenManager) RefreshToken() string

func (*UserTokenManager) RefreshTokenExpiry

func (utm *UserTokenManager) RefreshTokenExpiry() time.Time

func (*UserTokenManager) SetTokens

func (utm *UserTokenManager) SetTokens(userToken, refreshToken string, expiresIn int, staffID string, refreshExpiresIn int)

func (*UserTokenManager) StaffID

func (utm *UserTokenManager) StaffID() string

type UserTokenResult

type UserTokenResult struct {
	Success          bool                   `json:"success"`
	UserToken        string                 `json:"user_token"`
	ExpiresIn        int                    `json:"expires_in"`
	RefreshToken     string                 `json:"refresh_token"`
	RefreshExpiresIn int                    `json:"refresh_expires_in"`
	StaffID          string                 `json:"staff_id"`
	Scope            string                 `json:"scope"`
	State            string                 `json:"state"`
	Error            string                 `json:"error"`
	RawResponse      map[string]interface{} `json:"raw_response"`
}

Directories

Path Synopsis
cmd
lansenger command

Jump to

Keyboard shortcuts

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