diff --git a/type_message_post.go b/type_message_post.go index 0121e203..32ec8a99 100644 --- a/type_message_post.go +++ b/type_message_post.go @@ -73,6 +73,12 @@ func (r *MessageContentPost) UnmarshalJSON(bytes []byte) error { r.Content[vvIdx][vIdx] = MessageContentPostMedia{FileKey: item.FileKey, ImageKey: item.ImageKey} case messageContentPostItemTypeEmotion: r.Content[vvIdx][vIdx] = MessageContentPostEmotion{EmojiType: item.EmojiType} + case messageContentPostItemTypeCodeBlock: + r.Content[vvIdx][vIdx] = MessageContentPostCodeBlock{Language: item.Language, Text: item.Text} + case messageContentPostItemTypeHR: + r.Content[vvIdx][vIdx] = MessageContentPostHR{} + case messageContentPostItemTypeMD: + r.Content[vvIdx][vIdx] = MessageContentPostMD{Text: item.Text} } } } @@ -85,20 +91,24 @@ type MessageContentPostItem interface { } const ( - messageContentPostItemTypeText = "text" - messageContentPostItemTypeLink = "a" - messageContentPostItemTypeAt = "at" - messageContentPostItemTypeImage = "img" - messageContentPostItemTypeMedia = "media" - messageContentPostItemTypeEmotion = "emotion" + messageContentPostItemTypeText = "text" // 文本 + messageContentPostItemTypeLink = "a" // 链接 + messageContentPostItemTypeAt = "at" // 艾特 + messageContentPostItemTypeImage = "img" // 图片 + messageContentPostItemTypeMedia = "media" // 视频 + messageContentPostItemTypeEmotion = "emotion" // 表情 + messageContentPostItemTypeCodeBlock = "code_block" // 代码块 + messageContentPostItemTypeHR = "hr" // 分割线 + messageContentPostItemTypeMD = "md" // 分割线 ) type messageContentPostAll struct { Tag string `json:"tag"` - Text string `json:"text"` // 文本内容 - UnEscape bool `json:"un_escape"` // - Href string `json:"href"` // 默认的链接地址 + Text string `json:"text"` // 文本内容, 代码块的代码 + UnEscape bool `json:"un_escape"` // 表示是不是 unescape 解码 + + Href string `json:"href"` // 默认的链接地址 UserID string `json:"user_id"` // open_id UserName string `json:"user_name"` // 用户姓名 @@ -107,62 +117,80 @@ type messageContentPostAll struct { Height int `json:"height"` // 图片的高 Width int `json:"width"` // 图片的宽 - FileKey string `json:"file_key"` // 适配文件的唯一标识 + FileKey string `json:"file_key"` // 视频文件 key + + EmojiType string `json:"emoji_type"` // 表情类型, 部分可选值请参见表情文案 + + Style []string `json:"style"` // 文本内容的加粗、下划线、删除线和斜体样式,可选值分别为bold、underline、lineThrough与italic,没有样式则为空列表 - EmojiType string `json:"emoji_type"` // 表情类型, 部分可选值请参见表情文案 + Language string `json:"language"` // 代码块语言 } // MessageContentPostText 文本内容 type MessageContentPostText struct { messageContentPostInterfaceDefaultImpl - Text string `json:"text"` // 文本内容 - UnEscape bool `json:"un_escape"` // 表示是不是 unescape 解码,默认为 false ,不用可以不填 + Text string `json:"text"` // 文本内容 + UnEscape bool `json:"un_escape"` // 表示是不是 unescape 解码,默认为 false ,不用可以不填 + Style []string `json:"style"` // 文本内容的加粗、下划线、删除线和斜体样式,可选值分别为bold、underline、lineThrough与italic,没有样式则为空列表 } // MarshalJSON ... func (r MessageContentPostText) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + m := map[string]interface{}{ "text": r.Text, "un_escape": r.UnEscape, "tag": messageContentPostItemTypeText, - }) + } + if len(r.Style) > 0 { + m["style"] = r.Style + } + return json.Marshal(m) } // MessageContentPostLink 链接 type MessageContentPostLink struct { messageContentPostInterfaceDefaultImpl - Text string `json:"text"` // 文本内容 - UnEscape bool `json:"un_escape"` // - Href string `json:"href"` // 默认的链接地址 + Text string `json:"text"` // 文本内容 + UnEscape bool `json:"un_escape"` // + Href string `json:"href"` // 默认的链接地址 + Style []string `json:"style"` // 文本内容的加粗、下划线、删除线和斜体样式,可选值分别为bold、underline、lineThrough与italic,没有样式则为空列表 } // MarshalJSON ... func (r MessageContentPostLink) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + m := map[string]interface{}{ "text": r.Text, "un_escape": r.UnEscape, "href": r.Href, "tag": messageContentPostItemTypeLink, - }) + } + if len(r.Style) > 0 { + m["style"] = r.Style + } + return json.Marshal(m) } // MessageContentPostAt At用户 type MessageContentPostAt struct { messageContentPostInterfaceDefaultImpl - UserID string `json:"user_id"` // open_id - UserName string `json:"user_name"` // 用户姓名 + UserID string `json:"user_id"` // open_id + UserName string `json:"user_name"` // 用户姓名 + Style []string `json:"style"` // 文本内容的加粗、下划线、删除线和斜体样式,可选值分别为bold、underline、lineThrough与italic,没有样式则为空列表 } // MarshalJSON ... func (r MessageContentPostAt) MarshalJSON() ([]byte, error) { - v := map[string]interface{}{ + m := map[string]interface{}{ "user_id": r.UserID, "tag": messageContentPostItemTypeAt, } if r.UserName != "" { - v["user_name"] = r.UserName + m["user_name"] = r.UserName + } + if len(r.Style) > 0 { + m["style"] = r.Style } - return json.Marshal(v) + return json.Marshal(m) } // MessageContentPostImage 图片 @@ -213,6 +241,52 @@ func (r MessageContentPostEmotion) MarshalJSON() ([]byte, error) { }) } +// MessageContentPostCodeBlock 代码块 +type MessageContentPostCodeBlock struct { + messageContentPostInterfaceDefaultImpl + Language string `json:"language"` // 代码块语言,支持 PYTHON、C、CPP、GO、JAVA、KOTLIN、SWIFT、PHP、RUBY、RUST、JAVASCRIPT、TYPESCRIPT、BASH、SHELL、SQL、JSON、XML、YAML、HTML、THRIFT等 + Text string `json:"text"` // 代码块内容 +} + +// MarshalJSON ... +func (r MessageContentPostCodeBlock) MarshalJSON() ([]byte, error) { + return json.Marshal(map[string]interface{}{ + "language": r.Language, + "text": r.Text, + "tag": messageContentPostItemTypeCodeBlock, + }) +} + +// MessageContentPostHR 分割线 +type MessageContentPostHR struct { + messageContentPostInterfaceDefaultImpl +} + +// MarshalJSON ... +func (r MessageContentPostHR) MarshalJSON() ([]byte, error) { + return json.Marshal(map[string]interface{}{ + "tag": messageContentPostItemTypeHR, + }) +} + +// MessageContentPostMD markdown +// +// md 标签会独占一个或多个段落,不能与其他标签在一行中。 +// md 标签仅支持发送,获取消息内容时将不包含此标签,会根据 md 中的内容转换为其他标签。 +// 引用、有序、无序列表在获取消息时会退化成文本标签(text tag)进行输出。 +type MessageContentPostMD struct { + messageContentPostInterfaceDefaultImpl + Text string `json:"text"` +} + +// MarshalJSON ... +func (r MessageContentPostMD) MarshalJSON() ([]byte, error) { + return json.Marshal(map[string]interface{}{ + "text": r.Text, + "tag": messageContentPostItemTypeMD, + }) +} + type messageContentPostInterfaceDefaultImpl struct{} // IsMessageContentPostItem ...