lark

package module
v1.7.6 Latest Latest
Warning

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

Go to latest
Published: May 6, 2023 License: MIT Imports: 22 Imported by: 0

README

go-lark

build codecov Go Report Card Go Module Go Reference Mentioned in Awesome Go

简体中文

go-lark is an easy-to-use SDK for Feishu and Lark Open Platform, which implements messaging APIs, with full-fledged supports on building Chat Bot and Notification Bot.

It is widely used and tested by ~650 ByteDance in-house developers with over 3k Go packages.

Features

  • Notification bot & chat bot supported
  • Send messages (Group, Private, Rich Text, and Card)
  • Quick to build message with MsgBuffer
  • Easy to create incoming message hook
  • Encryption and token verification supported
  • Middleware support for Gin web framework
  • Highly extensible
  • Documentation & tests

Installation

go get github.com/go-lark/lark

Quick Start

Prerequisite

There are two types of bot that is supported by go-lark. We need to create a bot manually.

Chat Bot:

Notification Bot:

  • Create from group chat.
  • Web Hook URL is required.
Sending Message

Chat Bot:

import "github.com/go-lark/lark"

func main() {
    bot := lark.NewChatBot("<App ID>", "<App Secret>")
    bot.StartHeartbeat()
    bot.PostText("hello, world", lark.WithEmail("someone@example.com"))
}

Notification Bot:

import "github.com/go-lark/lark"

func main() {
    bot := lark.NewNotificationBot("<WEB HOOK URL>")
    bot.PostNotificationV2(lark.NewMsgBuffer(lark.MsgText).Text("hello, wolrd").Build())
}

Feishu/Lark API offers more features, please refers to Usage for further documentation.

Limits

  • go-lark is tested on Feishu endpoints, which literally compats Lark endpoints, because Feishu and Lark basically shares the same API specification. We do not guarantee all of the APIs work well with Lark, until we have tested it on Lark.
  • go-lark only supports Custom App. Marketplace App is not supported yet.
  • go-lark implements bot and messaging API, other APIs such as Lark Doc, Calendar and so on are not supported.
  • go-lark implements API in v3/v4 version* (official documents may also mention im/v1 version) and event with Schema 1.0 and 2.0 (partially).
Switch to Lark Endpoints

The default API endpoints are for Feishu, in order to switch to Lark, we should use SetDomain:

bot := lark.NewChatBot("<App ID>", "<App Secret>")
bot.SetDomain(lark.DomainLark)

Usage

Auth

Auto-renewable authentication:

// initialize a chat bot with appID and appSecret
bot := lark.NewChatBot(appID, appSecret)
// Renew access token periodically
bot.StartHeartbeat()
// Stop renewal
bot.StopHeartbeat()

Single-pass authentication:

bot := lark.NewChatBot(appID, appSecret)
resp, err := bot.GetTenantAccessTokenInternal(true)
// and we can now access the token value with `bot.tenantAccessToken()`

Example: examples/auth

Messaging

For Chat Bot, we can send simple messages with the following method:

  • PostText
  • PostTextMention
  • PostTextMentionAll
  • PostImage
  • PostShareChatCard

Basic message examples: examples/basic-message

To build rich messages, we may use Message Buffer (or simply MsgBuffer), which builds message conveniently with chaining methods.

Examples

Apart from the general auth and messaging chapter, there are comprehensive examples for almost all APIs. Here is a collection of ready-to-run examples for each part of go-lark:

Message Buffer

We can build message body with MsgBuffer and send with PostMessage, which supports the following message types:

  • MsgText: Text
  • MsgPost: Rich Text
  • MsgInteractive: Interactive Card
  • MsgShareCard: Group Share Card
  • MsgShareUser: User Share Card
  • MsgImage: Image
  • MsgFile: File
  • MsgAudio: Audio
  • MsgMedia: Media
  • MsgSticker: Sticker

MsgBuffer provides binding functions and content functions.

Binding functions:

Function Usage Comment
BindChatID Bind a chat ID Either OpenID, UserID, Email, ChatID or UnionID should be present
BindOpenID Bind a user open ID
BindUserID Bind a user ID
BindUnionID Bind a union ID
BindEmail Bind a user email
BindReply Bind a reply ID Required when reply a message

Content functions pair with message content types. If it mismatched, it would not have sent successfully. Content functions:

Function Message Type Usage Comment
Text MsgText Append plain text May build with TextBuilder
Post MsgPost Append rich text May build with PostBuilder
Card MsgInteractive Append interactive card May build with CardBuilder
ShareChat MsgShareCard Append group share card
ShareUser MsgShareUser Append user share card
Image MsgImage Append image Required to upload to Lark server in advance
File MsgFile Append file Required to upload to Lark server in advance
Audio MsgAudio Append audio Required to upload to Lark server in advance
Media MsgMedia Append media Required to upload to Lark server in advance
Sticker MsgSticker Append sticker Required to upload to Lark server in advance
Error Handling

Each go-lark API function returns response and err. err is the error from HTTP client, when it was not nil, HTTP might have gone wrong.

While response is HTTP response from Lark API server, in which Code and OK represent whether it succeeds. The meaning of Code is defined here.

Event

Lark provides a number of events and they are in two different schema (1.0/2.0). go-lark now only implements a few of them, which are needed for interacting between bot and Lark server:

  • URL Challenge
  • Receiving Messages

We recommend Gin middleware to handle these events.

Gin Middleware

Example: examples/gin-middleware

URL Challenge
r := gin.Default()
middleware := larkgin.NewLarkMiddleware()
middleware.BindURLPrefix("/handle") // supposed URL is http://your.domain.com/handle
r.Use(middleware.LarkChallengeHandler())
Event V2

Lark has provided event v2 and it applied automatically to newly created bots.

r := gin.Default()
middleware := larkgin.NewLarkMiddleware()
r.Use(middleware.LarkEventHandler())

Get the event (e.g. Message):

r.POST("/", func(c *gin.Context) {
    if evt, ok := middleware.GetEvent(c); ok { // => GetEvent instead of GetMessage
        if evt.Header.EventType == lark.EventTypeMessageReceived {
            if msg, err := evt.GetMessageReceived(); err == nil {
                fmt.Println(msg.Message.Content)
            }
        }
    }
})
Receiving Message

For older bots, please use v1:

r := gin.Default()
middleware := larkgin.NewLarkMiddleware()
middleware.BindURLPrefix("/handle") // supposed URL is http://your.domain.com/handle
r.POST("/handle", func(c *gin.Context) {
    if msg, ok := middleware.GetMessage(c); ok && msg != nil {
        text := msg.Event.Text
        // your awesome logic
    }
})
Security & Encryption

Lark Open Platform offers AES encryption and token verification to ensure security for events.

  • AES Encryption: when switch on, all traffic will be encrypted with AES.
  • Token Verification: simple token verification for incoming messages.

We recommend you to enable token verification. If HTTPS is not available on your host, then enable AES encryption.

middleware.WithTokenVerfication("<verification-token>")
middleware.WithEncryption("<encryption-key>")
Debugging

Lark does not provide messaging API debugger officially. Thus, we have to debug with real Lark conversation. We add PostEvent to simulate message sending to make it easier. PostEvent can also be used to redirect message, which acts like a reverse proxy.

Example: examples/event-forward

Notice: PostEvent does not support AES encryption at the moment.

Development

Test
  1. Dotenv Setup

    go-lark uses godotenv test locally. You may have to create a .env file in repo directory, which contains environmental variables:

    LARK_APP_ID
    LARK_APP_SECRET
    LARK_USER_EMAIL
    LARK_USER_ID
    LARK_UNION_ID
    LARK_OPEN_ID
    LARK_CHAT_ID
    LARK_MESSAGE_ID
    

    LARK_APP_ID and LARK_APP_SECRET are mandatory. Others are required only by specific API tests.

  2. Run Test

    GO_LARK_TEST_MODE=local ./scripts/test.sh
    
Extensions

go-lark's dev utilities (authentication, HTTP handling, and etc.) are capable for easily implementing most of APIs provided by Lark Open Platform. And we may use that as an extension for go-lark.

Here is an example that implementing a Lark Doc API with go-lark:

package lark

import "github.com/go-lark/lark"

const copyFileAPIPattern = "/open-apis/drive/explorer/v2/file/copy/files/%s"

// CopyFileResponse .
type CopyFileResponse struct {
	lark.BaseResponse

	Data CopyFileData `json:"data"`
}

// CopyFileData .
type CopyFileData struct {
	FolderToken string `json:"folderToken"`
	Revision    int64  `json:"revision"`
	Token       string `json:"token"`
	Type        string `json:"type"`
	URL         string `json:"url"`
}

// CopyFile implementation
func CopyFile(bot *lark.Bot, fileToken, dstFolderToken, dstName string) (*CopyFileResponse, error) {
	var respData model.CopyFileResponse
	err := bot.PostAPIRequest(
		"CopyFile",
		fmt.Sprintf(copyFileAPIPattern, fileToken),
		true,
		map[string]interface{}{
			"type":             "doc",
			"dstFolderToken":   dstFolderToken,
			"dstName":          dstName,
			"permissionNeeded": true,
			"CommentNeeded":    false,
		},
		&respData,
	)
	return &respData, err
}

FAQ

  • I got 99991401 when sending messages
    • remove IP Whitelist from dashboard
  • My bot failed sending messages
    1. check authentication.
    2. not invite to the group.
    3. API permission not applied.
  • Does go-lark support interactive message card?
    • Yes, use card builder.

Contributing

  • If you think you've found a bug with go-lark, please file an issue.
  • Pull Request is welcomed.

License

Copyright (c) David Zhang, 2018-2022. Licensed under MIT License.

Documentation

Overview

Package lark is an easy-to-use SDK for Feishu and Lark Open Platform, which implements messaging APIs, with full-fledged supports on building Chat Bot and Notification Bot.

Index

Constants

View Source
const (
	EventTypeMessageReceived = "im.message.receive_v1"
	EventTypeMessageRead     = "im.message.message_read_v1"
	EventTypeChatDisbanded   = "im.chat.disbanded_v1"
	EventTypeBotAdded        = "im.chat.member.bot.added_v1"
	EventTypeBotDeleted      = "im.chat.member.bot.deleted_v1"
	EventTypeUserAdded       = "im.chat.member.user.added_v1"
	EventTypeUserDeleted     = "im.chat.member.user.deleted_v1"
	// not supported yet
	EventTypeChatUpdated   = "im.chat.updated_v1"
	EventTypeUserWithdrawn = "im.chat.member.user.withdrawn_v1"
)

EventType definitions

View Source
const (
	// ChatBot should call NewChatBot
	// Create from https://open.feishu.cn/ or https://open.larksuite.com/
	ChatBot = iota
	// NotificationBot for webhook, behave as a simpler notification bot
	// Create from Lark group
	NotificationBot
)
View Source
const (
	DomainFeishu = "https://open.feishu.cn"
	DomainLark   = "https://open.larksuite.com"
)

Domains

View Source
const (
	LocaleZhCN = "zh_cn"
	LocaleEnUS = "en_us"
	LocaleJaJP = "ja_jp"
)

Supported Lark locales

View Source
const (
	LogLevelTrace = iota + 1
	LogLevelDebug
	LogLevelInfo
	LogLevelWarn
	LogLevelError
)

LogLevels

View Source
const (
	MsgText        = "text"
	MsgPost        = "post"
	MsgInteractive = "interactive"
	MsgImage       = "image"
	MsgShareCard   = "share_chat"
	MsgShareUser   = "share_user"
	MsgAudio       = "audio"
	MsgMedia       = "media"
	MsgFile        = "file"
	MsgSticker     = "sticker"
)

Msg Types

View Source
const (
	UIDEmail   = "email"
	UIDUserID  = "user_id"
	UIDOpenID  = "open_id"
	UIDChatID  = "chat_id"
	UIDUnionID = "union_id"
)

UID types

View Source
const (
	// EventGetMessage .
	EventGetMessage = 1
)

See https://open.feishu.cn/document/uYjL24iN/uUTNz4SN1MjL1UzM

Variables

View Source
var (
	ErrBotTypeError           = errors.New("Bot type error")
	ErrParamUserID            = errors.New("Param error: UserID")
	ErrParamMessageID         = errors.New("Param error: Message ID")
	ErrMessageTypeNotSuppored = errors.New("Message type not supported")
	ErrEncryptionNotEnabled   = errors.New("Encryption is not enabled")
	ErrCustomHTTPClientNotSet = errors.New("Custom HTTP client not set")
	ErrMessageNotBuild        = errors.New("Message not build")
	ErrUnsupportedUIDType     = errors.New("Unsupported UID type")
	ErrInvalidReceiveID       = errors.New("Invalid receive ID")
	ErrEventTypeNotMatch      = errors.New("Event type not match")
	ErrMessageType            = errors.New("Message type error")
)

Errors

Functions

func BuildOutcomingMessageReq

func BuildOutcomingMessageReq(om OutcomingMessage) map[string]interface{}

BuildOutcomingMessageReq for msg builder

func Decrypt

func Decrypt(encryptedKey []byte, data string) ([]byte, error)

Decrypt with AES Cipher

func DownloadFile

func DownloadFile(path, url string) error

DownloadFile downloads from a URL to local path

func EncryptKey

func EncryptKey(key string) []byte

EncryptKey .

func GenSign

func GenSign(secret string, timestamp int64) (string, error)

GenSign generate sign for notification bot

func PostEvent

func PostEvent(client *http.Client, hookURL string, message EventMessage) (*http.Response, error)

PostEvent posts event 1. help to develop and test ServeEvent callback func much easier 2. otherwise, you may use it to forward event

Types

type AddBotToGroupResponse

type AddBotToGroupResponse = BaseResponse

AddBotToGroupResponse .

type AddChatMemberRequest

type AddChatMemberRequest struct {
	IDList []string `json:"id_list"`
}

AddChatMemberRequest .

type AddChatMemberResponse

type AddChatMemberResponse struct {
	BaseResponse

	Data struct {
		InvalidIDList    []string `json:"invalid_id_list"`
		NotExistedIDList []string `json:"not_existed_id_list"`
	} `json:"data"`
}

AddChatMemberResponse .

type AddGroupMemberResponse

type AddGroupMemberResponse struct {
	BaseResponse
	InvalidOpenID []string `json:"invalid_open_ids"`
}

AddGroupMemberResponse .

type AudioContent

type AudioContent struct {
	FileKey string `json:"file_key"`
}

AudioContent .

type AuthTokenInternalResponse

type AuthTokenInternalResponse struct {
	BaseResponse
	AppAccessToken string `json:"app_access_token"`
	Expire         int    `json:"expire"`
}

AuthTokenInternalResponse .

type BaseResponse

type BaseResponse struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

BaseResponse of an API

type Bot

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

Bot definition

func NewChatBot

func NewChatBot(appID, appSecret string) *Bot

NewChatBot with appID and appSecret

func NewNotificationBot

func NewNotificationBot(hookURL string) *Bot

NewNotificationBot with URL

func (Bot) AccessToken

func (bot Bot) AccessToken() string

AccessToken returns bot.accessToken for external use

func (*Bot) AddBotToGroup

func (bot *Bot) AddBotToGroup(openChatID string) (*AddBotToGroupResponse, error)

AddBotToGroup .

func (Bot) AddChatMember

func (bot Bot) AddChatMember(chatID string, idList []string) (*AddChatMemberResponse, error)

AddChatMember .

func (*Bot) AddGroupMember

func (bot *Bot) AddGroupMember(openChatID string, openID []string) (*AddGroupMemberResponse, error)

AddGroupMember adds a group member

func (*Bot) AddGroupMemberByUserID

func (bot *Bot) AddGroupMemberByUserID(openChatID string, userID []string) (*AddGroupMemberResponse, error)

AddGroupMemberByUserID adds a group member

func (Bot) AppID

func (bot Bot) AppID() string

AppID returns bot.appID for external use

func (Bot) BotType

func (bot Bot) BotType() int

BotType returns bot.botType for external use

func (Bot) CreateChat

func (bot Bot) CreateChat(req CreateChatRequest) (*CreateChatResponse, error)

CreateChat .

func (*Bot) CreateGroup

func (bot *Bot) CreateGroup(name, description string, openID []string) (*CreateGroupResponse, error)

CreateGroup creates a group

func (Bot) DeleteAPIRequest

func (bot Bot) DeleteAPIRequest(prefix, urlPath string, auth bool, params interface{}, output interface{}) error

DeleteAPIRequest call Lark API

func (Bot) DeleteChat

func (bot Bot) DeleteChat(chatID string) (*DeleteChatResponse, error)

DeleteChat .

func (Bot) DeleteEphemeralMessage

func (bot Bot) DeleteEphemeralMessage(messageID string) (*DeleteEphemeralMessageResponse, error)

DeleteEphemeralMessage deletes an ephemeral message

func (*Bot) DeleteGroupMember

func (bot *Bot) DeleteGroupMember(openChatID string, openID []string) (*DeleteGroupMemberResponse, error)

DeleteGroupMember deletes a group member

func (*Bot) DisbandGroup

func (bot *Bot) DisbandGroup(openChatID string) (*DisbandGroupResponse, error)

DisbandGroup .

func (Bot) DoAPIRequest

func (bot Bot) DoAPIRequest(
	method string,
	prefix, urlPath string,
	header http.Header, auth bool,
	body io.Reader,
	output interface{},
) error

DoAPIRequest builds http request

func (Bot) Domain

func (bot Bot) Domain() string

Domain returns current domain

func (Bot) ExpandURL

func (bot Bot) ExpandURL(urlPath string) string

ExpandURL expands url path to full url

func (Bot) GetAPIRequest

func (bot Bot) GetAPIRequest(prefix, urlPath string, auth bool, params interface{}, output interface{}) error

GetAPIRequest call Lark API

func (*Bot) GetAccessTokenInternal

func (bot *Bot) GetAccessTokenInternal(updateToken bool) (*AuthTokenInternalResponse, error)

GetAccessTokenInternal gets AppAccessToken for internal use

func (*Bot) GetBotInfo

func (bot *Bot) GetBotInfo() (*GetBotInfoResponse, error)

GetBotInfo returns bot info

func (Bot) GetChat

func (bot Bot) GetChat(chatID string) (*GetChatResponse, error)

GetChat .

func (Bot) GetChatMembers

func (bot Bot) GetChatMembers(chatID string, pageToken string, pageSize int) (*GetChatMembersResponse, error)

GetChatMembers . NOTICE: pageSize must be larger than 10, e.g. if you present pageSize=1, it returns the same pageToken as pageSize=10. So we recommend you just pass pageSize=10.

func (*Bot) GetGroupInfo

func (bot *Bot) GetGroupInfo(openChatID string) (*GroupInfoResponse, error)

GetGroupInfo returns group info

func (*Bot) GetGroupList

func (bot *Bot) GetGroupList(pageNum, pageSize int) (*GroupListResponse, error)

GetGroupList returns group list

func (Bot) GetMessage

func (bot Bot) GetMessage(messageID string) (*GetMessageResponse, error)

GetMessage posts message with im/v1

func (*Bot) GetTenantAccessTokenInternal

func (bot *Bot) GetTenantAccessTokenInternal(updateToken bool) (*TenantAuthTokenInternalResponse, error)

GetTenantAccessTokenInternal gets AppAccessToken for internal use

func (Bot) IsInChat

func (bot Bot) IsInChat(chatID string) (*IsInChatResponse, error)

IsInChat .

func (Bot) JoinChat

func (bot Bot) JoinChat(chatID string) (*JoinChatResponse, error)

JoinChat .

func (Bot) Logger

func (bot Bot) Logger() LogWrapper

Logger returns current logger

func (Bot) MessageReadReceipt

func (bot Bot) MessageReadReceipt(messageID string) (*MessageReceiptResponse, error)

MessageReadReceipt queries message read receipt

func (Bot) PatchAPIRequest

func (bot Bot) PatchAPIRequest(prefix, urlPath string, auth bool, params interface{}, output interface{}) error

PatchAPIRequest call Lark API

func (Bot) PostAPIRequest

func (bot Bot) PostAPIRequest(prefix, urlPath string, auth bool, params interface{}, output interface{}) error

PostAPIRequest call Lark API

func (Bot) PostEphemeralMessage

func (bot Bot) PostEphemeralMessage(om OutcomingMessage) (*PostEphemeralMessageResponse, error)

PostEphemeralMessage posts an ephemeral message

func (Bot) PostImage

func (bot Bot) PostImage(imageKey string, userID *OptionalUserID) (*PostMessageResponse, error)

PostImage is a simple way to send image

func (Bot) PostMessage

func (bot Bot) PostMessage(om OutcomingMessage) (*PostMessageResponse, error)

PostMessage posts message

func (*Bot) PostNotification

func (bot *Bot) PostNotification(title, text string) (*PostNotificationResp, error)

PostNotification send message to a webhook

func (*Bot) PostNotificationV2

func (bot *Bot) PostNotificationV2(om OutcomingMessage) (*PostNotificationV2Resp, error)

PostNotificationV2 support v2 format

func (Bot) PostRichText

func (bot Bot) PostRichText(postContent *PostContent, userID *OptionalUserID) (*PostMessageResponse, error)

PostRichText is a simple way to send rich text messages

func (Bot) PostShareChat

func (bot Bot) PostShareChat(chatID string, userID *OptionalUserID) (*PostMessageResponse, error)

PostShareChat is a simple way to share chat

func (Bot) PostShareUser

func (bot Bot) PostShareUser(openID string, userID *OptionalUserID) (*PostMessageResponse, error)

PostShareUser is a simple way to share user

func (Bot) PostText

func (bot Bot) PostText(text string, userID *OptionalUserID) (*PostMessageResponse, error)

PostText is a simple way to send text messages

func (Bot) PostTextMention

func (bot Bot) PostTextMention(text string, atUserID string, userID *OptionalUserID) (*PostMessageResponse, error)

PostTextMention is a simple way to send text messages with @user

func (Bot) PostTextMentionAll

func (bot Bot) PostTextMentionAll(text string, userID *OptionalUserID) (*PostMessageResponse, error)

PostTextMentionAll is a simple way to send text messages with @all

func (Bot) PostTextMentionAndReply

func (bot Bot) PostTextMentionAndReply(text string, atUserID string, userID *OptionalUserID, replyID string) (*PostMessageResponse, error)

PostTextMentionAndReply is a simple way to send text messages with @user and reply a message

func (Bot) PutAPIRequest

func (bot Bot) PutAPIRequest(prefix, urlPath string, auth bool, params interface{}, output interface{}) error

PutAPIRequest call Lark API

func (Bot) RecallMessage

func (bot Bot) RecallMessage(messageID string) (*RecallMessageResponse, error)

RecallMessage recalls a message with ID

func (*Bot) RemoveBotFromGroup

func (bot *Bot) RemoveBotFromGroup(openChatID string) (*RemoveBotFromGroupResponse, error)

RemoveBotFromGroup .

func (Bot) RemoveChatMember

func (bot Bot) RemoveChatMember(chatID string, idList []string) (*RemoveChatMemberResponse, error)

RemoveChatMember .

func (Bot) ReplyMessage

func (bot Bot) ReplyMessage(om OutcomingMessage) (*PostMessageResponse, error)

ReplyMessage replies messages

func (*Bot) SetClient

func (bot *Bot) SetClient(c *http.Client)

SetClient assigns a new client to bot.client

func (*Bot) SetCustomClient

func (bot *Bot) SetCustomClient(c HTTPWrapper)

SetCustomClient .

func (*Bot) SetDomain

func (bot *Bot) SetDomain(domain string)

SetDomain set domain of endpoint, so we could call Feishu/Lark go-lark does not check your host, just use the right one or fail.

func (*Bot) SetLogger

func (bot *Bot) SetLogger(logger LogWrapper)

SetLogger set a new logger

func (*Bot) SetWebhook

func (bot *Bot) SetWebhook(url string)

SetWebhook updates webhook URL

func (*Bot) StartHeartbeat

func (bot *Bot) StartHeartbeat() error

StartHeartbeat renew auth token periodically

func (*Bot) StopHeartbeat

func (bot *Bot) StopHeartbeat()

StopHeartbeat stop auto-renew

func (Bot) TenantAccessToken

func (bot Bot) TenantAccessToken() string

TenantAccessToken returns bot.tenantAccessToken for external use

func (*Bot) UnsetCustomClient

func (bot *Bot) UnsetCustomClient()

UnsetCustomClient .

func (Bot) UpdateChat

func (bot Bot) UpdateChat(chatID string, req UpdateChatRequest) (*UpdateChatResponse, error)

UpdateChat .

func (*Bot) UpdateGroupInfo

func (bot *Bot) UpdateGroupInfo(params *UpdateGroupInfoReq) (*UpdateGroupInfoResponse, error)

UpdateGroupInfo update lark group info

func (Bot) UpdateMessage

func (bot Bot) UpdateMessage(messageID string, om OutcomingMessage) (*UpdateMessageResponse, error)

UpdateMessage update message card

func (Bot) UploadFile

func (bot Bot) UploadFile(req UploadFileRequest) (*UploadFileResponse, error)

UploadFile uploads file to Lark server

func (Bot) UploadImage

func (bot Bot) UploadImage(path string) (*UploadImageResponse, error)

UploadImage uploads image to Lark server

func (Bot) UploadImageObject

func (bot Bot) UploadImageObject(img image.Image) (*UploadImageResponse, error)

UploadImageObject uploads image to Lark server

func (*Bot) WithContext

func (bot *Bot) WithContext(ctx context.Context) *Bot

WithContext .

func (*Bot) WithUserIDType

func (bot *Bot) WithUserIDType(userIDType string) *Bot

WithUserIDType .

type CardBlock

type CardBlock = card.Block

CardBlock 卡片元素

type CardBuilder

type CardBuilder interface {
	Card(elements ...card.Element) *CardBlock
	Action(actions ...card.Element) *card.ActionBlock
	Button(text *card.TextBlock) *card.ButtonBlock
	Confirm(title, text string) *card.ConfirmBlock
	DatePicker() *card.DatePickerBlock
	TimePicker() *card.TimePickerBlock
	DatetimePicker() *card.DatetimePickerBlock
	Div(fields ...*card.FieldBlock) *card.DivBlock
	Field(text *card.TextBlock) *card.FieldBlock
	Hr() *card.HrBlock
	Img(key string) *card.ImgBlock
	Note() *card.NoteBlock
	Option(value string) *card.OptionBlock
	Overflow(options ...*card.OptionBlock) *card.OverflowBlock
	SelectMenu(options ...*card.OptionBlock) *card.SelectMenuBlock
	Text(s string) *card.TextBlock
	Markdown(s string) *card.MarkdownBlock
	URL() *card.URLBlock
}

CardBuilder 卡片构造方法

func NewCardBuilder

func NewCardBuilder() CardBuilder

NewCardBuilder 新建卡片构造器

type CardContent

type CardContent map[string]interface{}

CardContent struct of card content

type ChatInfo

type ChatInfo struct {
	ChatID                 string    `json:"chat_id,omitempty"`
	Name                   string    `json:"name,omitempty"`
	Avatar                 string    `json:"avatar,omitempty"`
	Description            string    `json:"description,omitempty"`
	I18NNames              I18NNames `json:"i18n_names,omitempty"`
	AddMemberPermission    string    `json:"add_member_permission,omitempty"`
	ShareCardPermission    string    `json:"share_card_permission,omitempty"`
	AtAllPermission        string    `json:"at_all_permission,omitempty"`
	EditPermission         string    `json:"edit_permission,omitempty"`
	OwnerIDType            string    `json:"owner_id_type,omitempty"`
	OwnerID                string    `json:"owner_id,omitempty"`
	ChatMode               string    `json:"chat_mode,omitempty"`
	ChatType               string    `json:"chat_type,omitempty"`
	ChatTag                string    `json:"chat_tag,omitempty"`
	JoinMessageVisibility  string    `json:"join_message_visibility,omitempty"`
	LeaveMessageVisibility string    `json:"leave_message_visibility,omitempty"`
	MembershipApproval     string    `json:"membership_approval,omitempty"`
	ModerationPermission   string    `json:"moderation_permission,omitempty"`
	External               bool      `json:"external,omitempty"`
}

ChatInfo entity of a chat, not every field is available for every API.

type ChatMember

type ChatMember struct {
	MemberIDType string `json:"member_id_type"`
	MemberID     string `json:"member_id"`
	Name         string `json:"name"`
	TenantKey    string `json:"tenant_key"`
}

ChatMember .

type CreateChatRequest

type CreateChatRequest struct {
	Name                   string    `json:"name,omitempty"`
	Avatar                 string    `json:"avatar,omitempty"`
	Description            string    `json:"description,omitempty"`
	I18NNames              I18NNames `json:"i18n_names,omitempty"`
	OwnerID                string    `json:"owner_id,omitempty"`
	ChatMode               string    `json:"chat_mode,omitempty"`
	ChatType               string    `json:"chat_type,omitempty"`
	JoinMessageVisibility  string    `json:"join_message_visibility,omitempty"`
	LeaveMessageVisibility string    `json:"leave_message_visibility,omitempty"`
	MembershipApproval     string    `json:"membership_approval,omitempty"`
	External               bool      `json:"external,omitempty"`
}

CreateChatRequest .

type CreateChatResponse

type CreateChatResponse struct {
	BaseResponse

	Data ChatInfo `json:"data"`
}

CreateChatResponse .

type CreateGroupResponse

type CreateGroupResponse struct {
	BaseResponse
	OpenChatID    string   `json:"open_chat_id"`
	InvalidOpenID []string `json:"invalid_open_ids"`
}

CreateGroupResponse .

type DeleteChatResponse

type DeleteChatResponse struct {
	BaseResponse
}

DeleteChatResponse .

type DeleteEphemeralMessageResponse

type DeleteEphemeralMessageResponse = BaseResponse

DeleteEphemeralMessageResponse .

type DeleteGroupMemberResponse

type DeleteGroupMemberResponse AddGroupMemberResponse

DeleteGroupMemberResponse .

type DisbandGroupResponse

type DisbandGroupResponse = BaseResponse

DisbandGroupResponse .

type EncryptedReq

type EncryptedReq struct {
	Encrypt string `json:"encrypt,omitempty"`
}

EncryptedReq request of encrypted challagen

type EventBody

type EventBody struct {
	Type          string `json:"type"`
	AppID         string `json:"app_id"`
	TenantKey     string `json:"tenant_key"`
	ChatType      string `json:"chat_type"`
	MsgType       string `json:"msg_type"`
	RootID        string `json:"root_id,omitempty"`
	ParentID      string `json:"parent_id,omitempty"`
	OpenID        string `json:"open_id,omitempty"`
	OpenChatID    string `json:"open_chat_id,omitempty"`
	OpenMessageID string `json:"open_message_id,omitempty"`
	IsMention     bool   `json:"is_mention,omitempty"`
	Title         string `json:"title,omitempty"`
	Text          string `json:"text,omitempty"`
	RealText      string `json:"text_without_at_bot,omitempty"`
	ImageKey      string `json:"image_key,omitempty"`
	ImageURL      string `json:"image_url,omitempty"`
	FileKey       string `json:"file_key,omitempty"`
}

EventBody .

type EventChallengeReq

type EventChallengeReq struct {
	Token     string `json:"token,omitempty"`
	Challenge string `json:"challenge,omitempty"`
	Type      string `json:"type,omitempty"`
}

EventChallengeReq request of add event hook

type EventMessage

type EventMessage struct {
	UUID      string `json:"uuid"`
	Timestamp string `json:"ts"`
	// Token is shown by Lark to indicate it is not a fake message, check at your own need
	Token     string    `json:"token"`
	EventType string    `json:"type"`
	Event     EventBody `json:"event"`
}

EventMessage .

type EventV2

type EventV2 struct {
	Schema string        `json:"schema,omitempty"`
	Header EventV2Header `json:"header,omitempty"`

	EventRaw json.RawMessage `json:"event,omitempty"`
	Event    interface{}     `json:"-"`
}

EventV2 handles events with v2 schema

func (EventV2) GetBotAdded

func (e EventV2) GetBotAdded() (*EventV2BotAdded, error)

GetBotAdded .

func (EventV2) GetBotDeleted

func (e EventV2) GetBotDeleted() (*EventV2BotDeleted, error)

GetBotDeleted .

func (EventV2) GetChatDisbanded

func (e EventV2) GetChatDisbanded() (*EventV2ChatDisbanded, error)

GetChatDisbanded .

func (EventV2) GetEvent

func (e EventV2) GetEvent(eventType string, body interface{}) error

GetEvent .

func (EventV2) GetMessageRead

func (e EventV2) GetMessageRead() (*EventV2MessageRead, error)

GetMessageRead .

func (EventV2) GetMessageReceived

func (e EventV2) GetMessageReceived() (*EventV2MessageReceived, error)

GetMessageReceived .

func (EventV2) GetUserAdded

func (e EventV2) GetUserAdded() (*EventV2UserAdded, error)

GetUserAdded .

func (EventV2) GetUserDeleted

func (e EventV2) GetUserDeleted() (*EventV2UserDeleted, error)

GetUserDeleted .

func (EventV2) PostEvent

func (e EventV2) PostEvent(client *http.Client, hookURL string, event EventV2) (*http.Response, error)

PostEvent with event v2 format and it's part of EventV2 instead of package method

type EventV2BotAdded

type EventV2BotAdded struct {
	ChatID            string        `json:"chat_id,omitempty"`
	OperatorID        EventV2UserID `json:"operator_id,omitempty"`
	External          bool          `json:"external,omitempty"`
	OperatorTenantKey string        `json:"operator_tenant_key,omitempty"`
}

EventV2BotAdded .

type EventV2BotDeleted

type EventV2BotDeleted = EventV2BotAdded

EventV2BotDeleted .

type EventV2ChatDisbanded

type EventV2ChatDisbanded struct {
	ChatID            string        `json:"chat_id,omitempty"`
	OperatorID        EventV2UserID `json:"operator_id,omitempty"`
	External          bool          `json:"external,omitempty"`
	OperatorTenantKey string        `json:"operator_tenant_key,omitempty"`
}

EventV2ChatDisbanded .

type EventV2Header

type EventV2Header struct {
	EventID    string `json:"event_id,omitempty"`
	EventType  string `json:"event_type,omitempty"`
	CreateTime string `json:"create_time,omitempty"`
	Token      string `json:"token,omitempty"`
	AppID      string `json:"app_id,omitempty"`
	TenantKey  string `json:"tenant_key,omitempty"`
}

EventV2Header .

type EventV2MessageRead

type EventV2MessageRead struct {
	Reader struct {
		ReaderID  EventV2UserID `json:"reader_id,omitempty"`
		ReadTime  string        `json:"read_time,omitempty"`
		TenantKey string        `json:"tenant_key,omitempty"`
	} `json:"reader,omitempty"`
	MessageIDList []string `json:"message_id_list,omitempty"`
}

EventV2MessageRead .

type EventV2MessageReceived

type EventV2MessageReceived struct {
	Sender struct {
		SenderID   EventV2UserID `json:"sender_id,omitempty"`
		SenderType string        `json:"sender_type,omitempty"`
		TenantKey  string        `json:"tenant_key,omitempty"`
	} `json:"sender,omitempty"`
	Message struct {
		MessageID   string `json:"message_id,omitempty"`
		RootID      string `json:"root_id,omitempty"`
		ParentID    string `json:"parent_id,omitempty"`
		CreateTime  string `json:"create_time,omitempty"`
		ChatID      string `json:"chat_id,omitempty"`
		ChatType    string `json:"chat_type,omitempty"`
		MessageType string `json:"message_type,omitempty"`
		Content     string `json:"content,omitempty"`
		Mentions    []struct {
			Key       string        `json:"key,omitempty"`
			ID        EventV2UserID `json:"id,omitempty"`
			Name      string        `json:"name,omitempty"`
			TenantKey string        `json:"tenant_key,omitempty"`
		} `json:"mentions,omitempty"`
	} `json:"message,omitempty"`
}

EventV2MessageReceived .

type EventV2UserAdded

type EventV2UserAdded struct {
	ChatID            string        `json:"chat_id,omitempty"`
	OperatorID        EventV2UserID `json:"operator_id,omitempty"`
	External          bool          `json:"external,omitempty"`
	OperatorTenantKey string        `json:"operator_tenant_key,omitempty"`
	Users             []struct {
		Name      string        `json:"name,omitempty"`
		TenantKey string        `json:"tenant_key,omitempty"`
		UserID    EventV2UserID `json:"user_id,omitempty"`
	} `json:"users,omitempty"`
}

EventV2UserAdded .

type EventV2UserDeleted

type EventV2UserDeleted = EventV2UserAdded

EventV2UserDeleted .

type EventV2UserID

type EventV2UserID struct {
	UnionID string `json:"union_id,omitempty"`
	UserID  string `json:"user_id,omitempty"`
	OpenID  string `json:"open_id,omitempty"`
}

EventV2UserID .

type FileContent

type FileContent struct {
	FileName string `json:"file_name,omitempty"`
	FileKey  string `json:"file_key"`
}

FileContent .

type GetBotInfoResponse

type GetBotInfoResponse struct {
	BaseResponse
	Bot struct {
		ActivateStatus int      `json:"activate_status"`
		AppName        string   `json:"app_name"`
		AvatarURL      string   `json:"avatar_url"`
		IPWhiteList    []string `json:"ip_white_list"`
		OpenID         string   `json:"open_id"`
	} `json:"bot"`
}

GetBotInfoResponse .

type GetChatMembersResponse

type GetChatMembersResponse struct {
	BaseResponse

	Data struct {
		Items       []ChatMember `json:"items"`
		PageToken   string       `json:"page_token"`
		HasMore     bool         `json:"has_more"`
		MemberTotal int          `json:"member_total"`
	} `json:"data"`
}

GetChatMembersResponse .

type GetChatResponse

type GetChatResponse struct {
	BaseResponse

	Data ChatInfo `json:"data"`
}

GetChatResponse .

type GetMessageResponse

type GetMessageResponse struct {
	BaseResponse

	Data struct {
		Items []IMMessage `json:"items"`
	} `json:"data"`
}

GetMessageResponse .

type GroupInfoResponse

type GroupInfoResponse struct {
	BaseResponse
	Data struct {
		AddMemberVerify        bool   `json:"add_member_verify"`
		Avatar                 string `json:"avatar"`
		ChatID                 string `json:"chat_id"`
		Description            string `json:"description"`
		GroupEmailEnabled      bool   `json:"group_email_enabled"`
		JoinMessageVisibility  string `json:"join_message_visibility"`
		LeaveMessageVisibility string `json:"leave_message_visibility"`
		Members                []struct {
			OpenID string `json:"open_id"`
		} `json:"members"`
		Name                     string `json:"name"`
		OnlyOwnerAdd             bool   `json:"only_owner_add"`
		OnlyOwnerAtAll           bool   `json:"only_owner_at_all"`
		OnlyOwnerEdit            bool   `json:"only_owner_edit"`
		OwnerOpenID              string `json:"owner_open_id"`
		SendGroupEmailPermission string `json:"send_group_email_permission"`
		SendMessagePermission    string `json:"send_message_permission"`
		ShareAllowed             bool   `json:"share_allowed"`
		Type                     string `json:"type"`
	} `json:"data"`
}

GroupInfoResponse .

type GroupListResponse

type GroupListResponse struct {
	BaseResponse
	HasMore bool `json:"has_more"`
	Chats   []struct {
		ID      string `json:"id"`
		Name    string `json:"name"`
		OwnerID string `json:"owner_id"`
	} `json:"chats"`
}

GroupListResponse .

type HTTPWrapper

type HTTPWrapper interface {
	Do(
		ctx context.Context,
		method, url string,
		header http.Header,
		body io.Reader) (io.ReadCloser, error)
}

HTTPWrapper is a wrapper interface, which enables extension on HTTP part. Typicall, we do not need this because default client is sufficient.

type I18NNames

type I18NNames struct {
	ZhCN string `json:"zh_cn,omitempty"`
	EnUS string `json:"en_us,omitempty"`
	JaJP string `json:"ja_jp,omitempty"`
}

I18NNames .

type IMBody

type IMBody struct {
	Content string `json:"content"`
}

IMBody .

type IMMention

type IMMention struct {
	ID     string `json:"id"`
	IDType string `json:"id_type"`
	Key    string `json:"key"`
	Name   string `json:"name"`
}

IMMention .

type IMMessage

type IMMessage struct {
	MessageID      string `json:"message_id"`
	UpperMessageID string `json:"upper_message_id"`
	RootID         string `json:"root_id"`
	ParentID       string `json:"parent_id"`
	ChatID         string `json:"chat_id"`
	MsgType        string `json:"msg_type"`
	CreateTime     string `json:"create_time"`
	UpdateTime     string `json:"update_time"`
	Deleted        bool   `json:"deleted"`
	Updated        bool   `json:"updated"`
	Sendor         IMSendor
	Mentions       []IMMention
	Body           IMBody
}

IMMessage .

type IMMessageRequest

type IMMessageRequest struct {
	ReceiveID string `json:"receive_id"`
	Content   string `json:"content"`
	MsgType   string `json:"msg_type"`
	UUID      string `json:"uuid,omitempty"`
}

IMMessageRequest .

func BuildMessage

func BuildMessage(om OutcomingMessage) (*IMMessageRequest, error)

BuildMessage .

type IMSendor

type IMSendor struct {
	ID         string `json:"id"`
	IDType     string `json:"id_type"`
	SendorType string `json:"sendor_type"`
	TenantKey  string `json:"tenant_key"`
}

IMSendor .

type ImageContent

type ImageContent struct {
	ImageKey string `json:"image_key"`
}

ImageContent .

type IsInChatResponse

type IsInChatResponse struct {
	BaseResponse

	Data struct {
		IsInChat bool `json:"is_in_chat"`
	} `json:"data"`
}

IsInChatResponse .

type JoinChatResponse

type JoinChatResponse struct {
	BaseResponse
}

JoinChatResponse .

type LogLevel

type LogLevel int

LogLevel defs

func (LogLevel) String

func (ll LogLevel) String() string

String .

type LogWrapper

type LogWrapper interface {
	// for log print
	Log(context.Context, LogLevel, string)
	// for test redirection
	SetOutput(io.Writer)
}

LogWrapper interface

type MediaContent

type MediaContent struct {
	FileName string `json:"file_name,omitempty"`
	FileKey  string `json:"file_key"`
	ImageKey string `json:"image_key"`
	Duration int    `json:"duration,omitempty"`
}

MediaContent .

type MessageContent

type MessageContent struct {
	Text      *TextContent      `json:"text,omitempty"`
	Image     *ImageContent     `json:"image,omitempty"`
	Post      *PostContent      `json:"post,omitempty"`
	Card      *CardContent      `json:"card,omitempty"`
	ShareChat *ShareChatContent `json:"share_chat,omitempty"`
	ShareUser *ShareUserContent `json:"share_user,omitempty"`
	Audio     *AudioContent     `json:"audio,omitempty"`
	Media     *MediaContent     `json:"media,omitempty"`
	File      *FileContent      `json:"file,omitempty"`
	Sticker   *StickerContent   `json:"sticker,omitempty"`
}

MessageContent struct of message content

type MessageReceiptResponse

type MessageReceiptResponse struct {
	BaseResponse
	Data struct {
		ReadUsers []struct {
			OpenID    string `json:"open_id"`
			UserID    string `json:"user_id"`
			Timestamp string `json:"timestamp"`
		} `json:"read_users"`
	} `json:"data"`
}

MessageReceiptResponse .

type MsgBuffer

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

MsgBuffer stores all the messages attached You can call every function, but some of which is only available for specific condition

func NewMsgBuffer

func NewMsgBuffer(newMsgType string) *MsgBuffer

NewMsgBuffer create a message buffer

func (*MsgBuffer) Audio

func (m *MsgBuffer) Audio(fileKey string) *MsgBuffer

Audio attaches audio for MsgAudio only

func (*MsgBuffer) BindChatID

func (m *MsgBuffer) BindChatID(chatID string) *MsgBuffer

BindChatID binds chat_id

func (*MsgBuffer) BindEmail

func (m *MsgBuffer) BindEmail(email string) *MsgBuffer

BindEmail binds email

func (*MsgBuffer) BindOpenChatID

func (m *MsgBuffer) BindOpenChatID(openChatID string) *MsgBuffer

BindOpenChatID binds open_chat_id

func (*MsgBuffer) BindOpenID

func (m *MsgBuffer) BindOpenID(openID string) *MsgBuffer

BindOpenID binds open_id

func (*MsgBuffer) BindReply

func (m *MsgBuffer) BindReply(rootID string) *MsgBuffer

BindReply binds root id for reply rootID is OpenMessageID of the message you reply

func (*MsgBuffer) BindUnionID

func (m *MsgBuffer) BindUnionID(unionID string) *MsgBuffer

BindUnionID binds union_id

func (*MsgBuffer) BindUserID

func (m *MsgBuffer) BindUserID(userID string) *MsgBuffer

BindUserID binds open_id

func (*MsgBuffer) Build

func (m *MsgBuffer) Build() OutcomingMessage

Build message and return message body

func (*MsgBuffer) Card

func (m *MsgBuffer) Card(cardContent string) *MsgBuffer

Card binds card content with V4 format

func (*MsgBuffer) Clear

func (m *MsgBuffer) Clear() *MsgBuffer

Clear message in buffer

func (*MsgBuffer) Error

func (m *MsgBuffer) Error() error

Error returns last error

func (*MsgBuffer) File

func (m *MsgBuffer) File(fileKey string) *MsgBuffer

File attaches file for MsgFile only

func (*MsgBuffer) Image

func (m *MsgBuffer) Image(imageKey string) *MsgBuffer

Image attaches image key for MsgImage only

func (*MsgBuffer) Media

func (m *MsgBuffer) Media(fileKey, imageKey string) *MsgBuffer

Media attaches media for MsgMedia only

func (*MsgBuffer) Post

func (m *MsgBuffer) Post(postContent *PostContent) *MsgBuffer

Post sets raw post content

func (*MsgBuffer) ShareChat

func (m *MsgBuffer) ShareChat(chatID string) *MsgBuffer

ShareChat attaches chat id for MsgShareChat only

func (*MsgBuffer) ShareUser

func (m *MsgBuffer) ShareUser(userID string) *MsgBuffer

ShareUser attaches user id for MsgShareUser only

func (*MsgBuffer) Sticker

func (m *MsgBuffer) Sticker(fileKey string) *MsgBuffer

Sticker attaches sticker for MsgSticker only

func (*MsgBuffer) Text

func (m *MsgBuffer) Text(text string) *MsgBuffer

Text attaches text

func (*MsgBuffer) UpdateMulti

func (m *MsgBuffer) UpdateMulti(flag bool) *MsgBuffer

UpdateMulti deprecated in the latest version, please use card.UpdateMulti instead set multi for shared card. Default false, not share

func (*MsgBuffer) WithSign

func (m *MsgBuffer) WithSign(secret string, ts int64) *MsgBuffer

WithSign generates sign for notification bot check

func (*MsgBuffer) WithUUID

func (m *MsgBuffer) WithUUID(uuid string) *MsgBuffer

WithUUID add UUID to message for idempotency

type MsgPostBuilder

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

MsgPostBuilder for build text buf

func NewPostBuilder

func NewPostBuilder() *MsgPostBuilder

NewPostBuilder creates a text builder

func (*MsgPostBuilder) AtTag

func (pb *MsgPostBuilder) AtTag(text, userID string) *MsgPostBuilder

AtTag creates an at tag

func (*MsgPostBuilder) Clear

func (pb *MsgPostBuilder) Clear()

Clear all message

func (*MsgPostBuilder) CurLocale

func (pb *MsgPostBuilder) CurLocale() *PostBuf

CurLocale switches to locale and returns the buffer of that locale

func (*MsgPostBuilder) ImageTag

func (pb *MsgPostBuilder) ImageTag(imageKey string, imageWidth, imageHeight int) *MsgPostBuilder

ImageTag creates an image tag

func (MsgPostBuilder) Len

func (pb MsgPostBuilder) Len() int

Len returns buf len

func (*MsgPostBuilder) LinkTag

func (pb *MsgPostBuilder) LinkTag(text, href string) *MsgPostBuilder

LinkTag creates a link tag

func (*MsgPostBuilder) Locale

func (pb *MsgPostBuilder) Locale(locale string) *MsgPostBuilder

Locale renamed to WithLocale but still available

func (*MsgPostBuilder) Render

func (pb *MsgPostBuilder) Render() *PostContent

Render message

func (*MsgPostBuilder) TextTag

func (pb *MsgPostBuilder) TextTag(text string, lines int, unescape bool) *MsgPostBuilder

TextTag creates a text tag

func (*MsgPostBuilder) Title

func (pb *MsgPostBuilder) Title(title string) *MsgPostBuilder

Title sets title

func (*MsgPostBuilder) WithLocale

func (pb *MsgPostBuilder) WithLocale(locale string) *MsgPostBuilder

WithLocale switches to locale and returns self

type MsgTextBuilder

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

MsgTextBuilder for build text buf

func NewTextBuilder

func NewTextBuilder() *MsgTextBuilder

NewTextBuilder creates a text builder

func (*MsgTextBuilder) Clear

func (tb *MsgTextBuilder) Clear()

Clear all message

func (MsgTextBuilder) Len

func (tb MsgTextBuilder) Len() int

Len returns buf len

func (*MsgTextBuilder) Mention

func (tb *MsgTextBuilder) Mention(userID string) *MsgTextBuilder

Mention @somebody

func (*MsgTextBuilder) MentionAll

func (tb *MsgTextBuilder) MentionAll() *MsgTextBuilder

MentionAll @all

func (*MsgTextBuilder) Render

func (tb *MsgTextBuilder) Render() string

Render message

func (*MsgTextBuilder) Text

func (tb *MsgTextBuilder) Text(text ...interface{}) *MsgTextBuilder

Text add simple texts

func (*MsgTextBuilder) Textf

func (tb *MsgTextBuilder) Textf(textFmt string, text ...interface{}) *MsgTextBuilder

Textf add texts with format

func (*MsgTextBuilder) Textln

func (tb *MsgTextBuilder) Textln(text ...interface{}) *MsgTextBuilder

Textln add simple texts with a newline

type OptionalUserID

type OptionalUserID struct {
	UIDType string
	RealID  string
}

OptionalUserID to contain openID, chatID, userID, email

func WithChatID

func WithChatID(chatID string) *OptionalUserID

WithChatID uses chatID as userID

func WithEmail

func WithEmail(email string) *OptionalUserID

WithEmail uses email as userID

func WithOpenID

func WithOpenID(openID string) *OptionalUserID

WithOpenID uses openID as userID

func WithUnionID

func WithUnionID(unionID string) *OptionalUserID

WithUnionID uses chatID as userID

func WithUserID

func WithUserID(userID string) *OptionalUserID

WithUserID uses userID as userID

type OutcomingMessage

type OutcomingMessage struct {
	MsgType string         `json:"msg_type"`
	Content MessageContent `json:"content"`
	Card    CardContent    `json:"card"`
	// ID for user
	UIDType string `json:"-"`
	OpenID  string `json:"open_id,omitempty"`
	Email   string `json:"email,omitempty"`
	UserID  string `json:"user_id,omitempty"`
	ChatID  string `json:"chat_id,omitempty"`
	UnionID string `json:"-"`
	// For reply
	RootID string `json:"root_id,omitempty"`
	// UpdateMulti card
	UpdateMulti bool `json:"update_multi"`
	// Sign for notification bot
	Sign string `json:"sign"`
	// Timestamp for sign
	Timestamp int64 `json:"timestamp"`
	// UUID for idempotency
	UUID string `json:"uuid"`
}

OutcomingMessage struct of an outcoming message

type PostBody

type PostBody struct {
	Title   string       `json:"title"`
	Content [][]PostElem `json:"content"`
}

PostBody .

type PostBuf

type PostBuf struct {
	Title   string     `json:"title"`
	Content []PostElem `json:"content"`
}

PostBuf .

type PostContent

type PostContent map[string]PostBody

PostContent .

type PostElem

type PostElem struct {
	Tag string `json:"tag"`
	// For Text
	UnEscape *bool   `json:"un_escape,omitempty"`
	Text     *string `json:"text,omitempty"`
	Lines    *int    `json:"lines,omitempty"`
	// For Link
	Href *string `json:"href,omitempty"`
	// For At
	UserID *string `json:"user_id,omitempty"`
	// For Image
	ImageKey    *string `json:"image_key,omitempty"`
	ImageWidth  *int    `json:"width,omitempty"`
	ImageHeight *int    `json:"height,omitempty"`
}

PostElem .

type PostEphemeralMessageResponse

type PostEphemeralMessageResponse struct {
	BaseResponse
	Data struct {
		MessageID string `json:"message_id"`
	} `json:"data"`
}

PostEphemeralMessageResponse .

type PostMessageResponse

type PostMessageResponse struct {
	BaseResponse

	Data IMMessage `json:"data"`
}

PostMessageResponse .

type PostNotificationResp

type PostNotificationResp struct {
	Ok bool `json:"ok,omitempty"`
}

PostNotificationResp response of PostNotification

type PostNotificationV2Resp

type PostNotificationV2Resp struct {
	BaseResponse
	StatusCode    int    `json:"StatusCode"`
	StatusMessage string `json:"StatusMessage"`
}

PostNotificationV2Resp response of PostNotificationV2

type RecallMessageResponse

type RecallMessageResponse = BaseResponse

RecallMessageResponse .

type RemoveBotFromGroupResponse

type RemoveBotFromGroupResponse = BaseResponse

RemoveBotFromGroupResponse .

type RemoveChatMemberRequest

type RemoveChatMemberRequest struct {
	IDList []string `json:"id_list"`
}

RemoveChatMemberRequest .

type RemoveChatMemberResponse

type RemoveChatMemberResponse struct {
	BaseResponse

	Data struct {
		InvalidIDList []string `json:"invalid_id_list"`
	} `json:"data"`
}

RemoveChatMemberResponse .

type ShareChatContent

type ShareChatContent struct {
	ChatID string `json:"chat_id"`
}

ShareChatContent .

type ShareUserContent

type ShareUserContent struct {
	UserID string `json:"user_id"`
}

ShareUserContent .

type StickerContent

type StickerContent struct {
	FileKey string `json:"file_key"`
}

StickerContent .

type TenantAuthTokenInternalResponse

type TenantAuthTokenInternalResponse struct {
	BaseResponse
	TenantAppAccessToken string `json:"tenant_access_token"`
	Expire               int    `json:"expire"`
}

TenantAuthTokenInternalResponse .

type TextContent

type TextContent struct {
	Text string `json:"text"`
}

TextContent .

type UpdateChatRequest

type UpdateChatRequest struct {
	Name                   string    `json:"name,omitempty"`
	Avatar                 string    `json:"avatar,omitempty"`
	Description            string    `json:"description,omitempty"`
	I18NNames              I18NNames `json:"i18n_names,omitempty"`
	AddMemberPermission    string    `json:"add_member_permission,omitempty"`
	ShareCardPermission    string    `json:"share_card_permission,omitempty"`
	AtAllPermission        string    `json:"at_all_permission,omitempty"`
	EditPermission         string    `json:"edit_permission,omitempty"`
	OwnerID                string    `json:"owner_id,omitempty"`
	JoinMessageVisibility  string    `json:"join_message_visibility,omitempty"`
	LeaveMessageVisibility string    `json:"leave_message_visibility,omitempty"`
	MembershipApproval     string    `json:"membership_approval,omitempty"`
}

UpdateChatRequest .

type UpdateChatResponse

type UpdateChatResponse struct {
	BaseResponse
}

UpdateChatResponse .

type UpdateGroupInfoReq

type UpdateGroupInfoReq struct {
	OpenChatID      string            `json:"open_chat_id"`
	OwnerID         string            `json:"owner_id,omitempty"`
	OwnerEmployeeID string            `json:"owner_employee_id,omitempty"`
	Name            string            `json:"name,omitempty"`
	I18nNames       map[string]string `json:"i18n_names,omitempty"`
}

UpdateGroupInfoReq .

type UpdateGroupInfoResponse

type UpdateGroupInfoResponse struct {
	BaseResponse
	OpenChatID string `json:"open_chat_id"`
}

UpdateGroupInfoResponse .

type UpdateMessageResponse

type UpdateMessageResponse = BaseResponse

UpdateMessageResponse .

type UploadFileRequest

type UploadFileRequest struct {
	FileType string `json:"-"`
	FileName string `json:"-"`
	Duration int    `json:"-"`
	Path     string `json:"-"`
}

UploadFileRequest .

type UploadFileResponse

type UploadFileResponse struct {
	BaseResponse
	Data struct {
		FileKey string `json:"file_key"`
	} `json:"data"`
}

UploadFileResponse .

type UploadImageResponse

type UploadImageResponse struct {
	BaseResponse
	Data struct {
		ImageKey string `json:"image_key"`
	} `json:"data"`
}

UploadImageResponse .

Directories

Path Synopsis
Package card provides declarative card builder
Package card provides declarative card builder

Jump to

Keyboard shortcuts

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