floo::BMXMessage#
消息
#include <bmx_message.h>
Inherits from BMXBaseObject
Public Types#
| Name | |
|---|---|
| enum class | DeliveryStatus { New, Delivering, Deliveried, Failed, Recalled} 消息投递状态 |
| enum class | MessageType { Single, Group, System} 消息类型 |
| enum class | ContentType { Text, Image, Voice, Video, File, Location, Command, Forward} 消息内容类型 |
| enum class | DeliveryQos { AtLastOnce, AtMostOnce, ExactlyOnce} 消息投递质量 |
Public Functions#
| Name | |
|---|---|
| virtual | ~BMXMessage() 析构函数 |
| int64_t | msgId() 消息唯一ID |
| int64_t | clientMsgId() 消息客户端ID,仅在消息发送端存在 |
| int64_t | fromId() 消息发送方ID |
| int64_t | toId() 消息接收方ID |
| MessageType | type() 消息类型 |
| int64_t | conversationId() 消息所属会话ID |
| DeliveryStatus | deliveryStatus() 消息投递状态 |
| void | setDeliveryStatus(DeliveryStatus ) 设置消息投递状态 |
| int64_t | serverTimestamp() 消息时间戳(服务端收到时的时间) |
| void | setServerTimestamp(int64_t ) 设置时间戳(服务端收到时的时间) |
| int64_t | clientTimestamp() 本地时间戳(消息创建或者收到时的本地时间) |
| void | setClientTimestamp(int64_t ) 设置消息本地时间戳 |
| bool | isPlayed() 语音或者视频消息是否播放过,仅对收到的音视频消息有效 |
| void | setIsPlayed(bool ) 设置语音或者视频消息是否播放过,仅对收到的音视频消息有效 |
| bool | isPlayAcked() 对于发送方表示是否收到了已播放回执,对于接收方表示是否发送了已播放回执 |
| void | setIsPlayAcked(bool ) 设置已播放回执 |
| bool | isReceiveMsg() 是否接收的消息 |
| void | setIsReceiveMsg(bool ) 设置是否接收的消息 |
| bool | isRead() 消息是否已读标志 |
| void | setIsRead(bool ) 消息是否已读标志 |
| bool | isReadAcked() 对于发送方表示是否收到了已读回执,对于接收方表示是否发送了已读回执 |
| void | setIsReadAcked(bool ) 设置已读回执 |
| bool | isDeliveryAcked() 对于发送方表示消息是否已投递到对方,对于接收方表示是否发送了消息已到达回执 |
| void | setIsDeliveryAcked(bool ) 设置投递回执 |
| const std::string & | content() 消息文本内容 |
| void | setContent(const std::string & content) 消息文本内容 |
| ContentType | contentType() 消息内容类型,如果带附件就表示附件类型,不带附件就是文本类型 |
| BMXMessageAttachmentPtr | attachment() 消息附件,BMXMessage拥有附件的所有权,负责释放 |
| BMXMessageConfigPtr | config() 消息的配置信息 |
| void | setConfig(BMXMessageConfigPtr ) 设置消息配置信息 |
| const JSON & | extension() 消息扩展信息 |
| void | setExtension(const JSON & ) 设置消息扩展信息 |
| DeliveryQos | deliveryQos() 消息投递QOS |
| void | setDeliveryQos(DeliveryQos qos) 设置消息投递QOS |
| const std::string & | senderName() 消息发送者的显示名称 |
| void | setSenderName(const std::string & senderName) 设置消息的发送者显示名称 |
| int | groupAckCount() 群消息已读AckCount数目 |
| void | setGroupAckCount(int count) 设置消息已读groupAckCount数目(SDK 内部调用接口,上层不应该调用) |
| int | groupAckUnreadCount() 群消息未读AckCount数目 |
| void | setGroupAckUnreadCount(int count) 设置消息未读groupAckCount数目(SDK 内部调用接口,上层不应该调用) |
| bool | groupAckReadAll() 群消息是否全部已读 |
| int | groupPlayAckCount() 群消息已播放AckCount数目(仅用于音频/视频附件消息) |
| void | setGroupPlayAckCount(int count) 设置消息已播放groupAckCount数目(SDK 内部调用接口,上层不应该调用)(仅用于音频/视频附件消息) |
| int | groupPlayAckUnreadCount() 群消息未播放AckCount数目(仅用于音频/视频附件消息) |
| void | setGroupPlayAckUnreadCount(int count) 设置消息未播放groupAckCount数目(SDK 内部调用接口,上层不应该调用)(仅用于音频/视频附件消息) |
| bool | groupPlayAckReadAll() 群消息是否全部已播放 |
| void | setPriority(int priority) 设置消息的扩散优先级,默认为0。0表示扩散,数字越小扩散的越多。 |
| int | priority() 消息的扩散优先级 |
| void | setPushMessageMode(bool ) 设置消息是否为推送消息。 |
| bool | isPushMessage() 消息是否是推送消息 |
| BMXMessagePtr | createMessage(int64_t from, int64_t to, MessageType type, int64_t conversationId, const std::string & content) 创建发送文本消息 |
| BMXMessagePtr | createMessage(int64_t from, int64_t to, MessageType type, int64_t conversationId, BMXMessageAttachmentPtr attachment) 创建发送附件消息 |
| BMXMessagePtr | createCommandMessage(int64_t from, int64_t to, MessageType type, int64_t conversationId, const std::string & content) 创建发送命令消息(命令消息通过content字段或者extension字段存放命令信息) |
| BMXMessagePtr | createMessage(int64_t msgId, int64_t from, int64_t to, MessageType type, int64_t conversationId, const std::string & content, int64_t serverTimestamp) 创建收到的消息 |
| BMXMessagePtr | createMessage(int64_t msgId, int64_t from, int64_t to, MessageType type, int64_t conversationId, BMXMessageAttachmentPtr attachment, int64_t serverTimestamp) 创建收到的消息 |
| BMXMessagePtr | createCommandMessage(int64_t msgId, int64_t from, int64_t to, MessageType type, int64_t conversationId, const std::string & content, int64_t serverTimestamp) 创建收到的命令消息(命令消息通过content字段或者extension字段存放命令信息) |
| BMXMessagePtr | createForwardMessage(BMXMessagePtr msg, int64_t from, int64_t to, MessageType type, int64_t conversationId) 创建转发消息 |
Public Types Documentation#
enum DeliveryStatus#
| Enumerator | Value | Description |
|---|---|---|
| New | 新创建消息 | |
| Delivering | 消息投递中 | |
| Deliveried | 消息已投递 | |
| Failed | 消息投递失败 | |
| Recalled | 消息已撤回 |
消息投递状态
enum MessageType#
| Enumerator | Value | Description |
|---|---|---|
| Single | 单聊消息 | |
| Group | 群聊消息 | |
| System | 系统消息 |
消息类型
enum ContentType#
| Enumerator | Value | Description |
|---|---|---|
| Text | 文本消息 | |
| Image | 图片消息 | |
| Voice | 语音消息 | |
| Video | 视频片段消息 | |
| File | 文件消息 | |
| Location | 位置消息 | |
| Command | 命令消息 | |
| Forward | 转发消息 |
消息内容类型
enum DeliveryQos#
| Enumerator | Value | Description |
|---|---|---|
| AtLastOnce | 最少投递一次 | |
| AtMostOnce | 最多投递一次 | |
| ExactlyOnce | 仅投递一次 |
消息投递质量
Public Functions Documentation#
function ~BMXMessage#
virtual ~BMXMessage()
析构函数
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="~BMXMessage" %}{% endlanying_code_snippet %}
function msgId#
int64_t msgId()
消息唯一ID
Return: int64_t
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="msgId" %}{% endlanying_code_snippet %}
function clientMsgId#
int64_t clientMsgId()
消息客户端ID,仅在消息发送端存在
Return: int64_t
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="clientMsgId" %}{% endlanying_code_snippet %}
function fromId#
int64_t fromId()
消息发送方ID
Return: int64_t
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="fromId" %}{% endlanying_code_snippet %}
function toId#
int64_t toId()
消息接收方ID
Return: int64_t
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="toId" %}{% endlanying_code_snippet %}
function type#
MessageType type()
消息类型
Return: MessageType
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="type" %}{% endlanying_code_snippet %}
function conversationId#
int64_t conversationId()
消息所属会话ID
Return: int64_t
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="conversationId" %}{% endlanying_code_snippet %}
function deliveryStatus#
DeliveryStatus deliveryStatus()
消息投递状态
Return: DeliveryStatus
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="deliveryStatus" %}{% endlanying_code_snippet %}
function setDeliveryStatus#
void setDeliveryStatus(
DeliveryStatus
)
设置消息投递状态
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setDeliveryStatus" %}{% endlanying_code_snippet %}
function serverTimestamp#
int64_t serverTimestamp()
消息时间戳(服务端收到时的时间)
Return: int64_t
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="serverTimestamp" %}{% endlanying_code_snippet %}
function setServerTimestamp#
void setServerTimestamp(
int64_t
)
设置时间戳(服务端收到时的时间)
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setServerTimestamp" %}{% endlanying_code_snippet %}
function clientTimestamp#
int64_t clientTimestamp()
本地时间戳(消息创建或者收到时的本地时间)
Return: int64_t
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="clientTimestamp" %}{% endlanying_code_snippet %}
function setClientTimestamp#
void setClientTimestamp(
int64_t
)
设置消息本地时间戳
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setClientTimestamp" %}{% endlanying_code_snippet %}
function isPlayed#
bool isPlayed()
语音或者视频消息是否播放过,仅对收到的音视频消息有效
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="isPlayed" %}{% endlanying_code_snippet %}
function setIsPlayed#
void setIsPlayed(
bool
)
设置语音或者视频消息是否播放过,仅对收到的音视频消息有效
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setIsPlayed" %}{% endlanying_code_snippet %}
function isPlayAcked#
bool isPlayAcked()
对于发送方表示是否收到了已播放回执,对于接收方表示是否发送了已播放回执
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="isPlayAcked" %}{% endlanying_code_snippet %}
function setIsPlayAcked#
void setIsPlayAcked(
bool
)
设置已播放回执
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setIsPlayAcked" %}{% endlanying_code_snippet %}
function isReceiveMsg#
bool isReceiveMsg()
是否接收的消息
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="isReceiveMsg" %}{% endlanying_code_snippet %}
function setIsReceiveMsg#
void setIsReceiveMsg(
bool
)
设置是否接收的消息
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setIsReceiveMsg" %}{% endlanying_code_snippet %}
function isRead#
bool isRead()
消息是否已读标志
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="isRead" %}{% endlanying_code_snippet %}
function setIsRead#
void setIsRead(
bool
)
消息是否已读标志
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setIsRead" %}{% endlanying_code_snippet %}
function isReadAcked#
bool isReadAcked()
对于发送方表示是否收到了已读回执,对于接收方表示是否发送了已读回执
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="isReadAcked" %}{% endlanying_code_snippet %}
function setIsReadAcked#
void setIsReadAcked(
bool
)
设置已读回执
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setIsReadAcked" %}{% endlanying_code_snippet %}
function isDeliveryAcked#
bool isDeliveryAcked()
对于发送方表示消息是否已投递到对方,对于接收方表示是否发送了消息已到达回执
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="isDeliveryAcked" %}{% endlanying_code_snippet %}
function setIsDeliveryAcked#
void setIsDeliveryAcked(
bool
)
设置投递回执
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setIsDeliveryAcked" %}{% endlanying_code_snippet %}
function content#
const std::string & content()
消息文本内容
Return: std::string
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="content" %}{% endlanying_code_snippet %}
function setContent#
void setContent(
const std::string & content
)
消息文本内容
Parameters:
- content 消息文本内容
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setContent" %}{% endlanying_code_snippet %}
function contentType#
ContentType contentType()
消息内容类型,如果带附件就表示附件类型,不带附件就是文本类型
Return: ContentType
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="contentType" %}{% endlanying_code_snippet %}
function attachment#
BMXMessageAttachmentPtr attachment()
消息附件,BMXMessage拥有附件的所有权,负责释放
Return: BMXMessageAttachmentPtr
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="attachment" %}{% endlanying_code_snippet %}
function config#
BMXMessageConfigPtr config()
消息的配置信息
Return: JSON(std::string)
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="config" %}{% endlanying_code_snippet %}
function setConfig#
void setConfig(
BMXMessageConfigPtr
)
设置消息配置信息
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setConfig" %}{% endlanying_code_snippet %}
function extension#
const JSON & extension()
消息扩展信息
Return: JSON(std::string)
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="extension" %}{% endlanying_code_snippet %}
function setExtension#
void setExtension(
const JSON &
)
设置消息扩展信息
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setExtension" %}{% endlanying_code_snippet %}
function deliveryQos#
DeliveryQos deliveryQos()
消息投递QOS
Return: DeliveryQos
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="deliveryQos" %}{% endlanying_code_snippet %}
function setDeliveryQos#
void setDeliveryQos(
DeliveryQos qos
)
设置消息投递QOS
Parameters:
- qos 消息投递QOS
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setDeliveryQos" %}{% endlanying_code_snippet %}
function senderName#
const std::string & senderName()
消息发送者的显示名称
Return: std::string
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="senderName" %}{% endlanying_code_snippet %}
function setSenderName#
void setSenderName(
const std::string & senderName
)
设置消息的发送者显示名称
Parameters:
- senderName 消息文本内容
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setSenderName" %}{% endlanying_code_snippet %}
function groupAckCount#
int groupAckCount()
群消息已读AckCount数目
Return: int
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="groupAckCount" %}{% endlanying_code_snippet %}
function setGroupAckCount#
void setGroupAckCount(
int count
)
设置消息已读groupAckCount数目(SDK 内部调用接口,上层不应该调用)
Parameters:
- count 设置群消息已读数目
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setGroupAckCount" %}{% endlanying_code_snippet %}
function groupAckUnreadCount#
int groupAckUnreadCount()
群消息未读AckCount数目
Return: int
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="groupAckUnreadCount" %}{% endlanying_code_snippet %}
function setGroupAckUnreadCount#
void setGroupAckUnreadCount(
int count
)
设置消息未读groupAckCount数目(SDK 内部调用接口,上层不应该调用)
Parameters:
- count 设置群消息未读数目
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setGroupAckUnreadCount" %}{% endlanying_code_snippet %}
function groupAckReadAll#
bool groupAckReadAll()
群消息是否全部已读
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="groupAckReadAll" %}{% endlanying_code_snippet %}
function groupPlayAckCount#
int groupPlayAckCount()
群消息已播放AckCount数目(仅用于音频/视频附件消息)
Return: int
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="groupPlayAckCount" %}{% endlanying_code_snippet %}
function setGroupPlayAckCount#
void setGroupPlayAckCount(
int count
)
设置消息已播放groupAckCount数目(SDK 内部调用接口,上层不应该调用)(仅用于音频/视频附件消息)
Parameters:
- count 设置群消息已读数目
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setGroupPlayAckCount" %}{% endlanying_code_snippet %}
function groupPlayAckUnreadCount#
int groupPlayAckUnreadCount()
群消息未播放AckCount数目(仅用于音频/视频附件消息)
Return: int
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="groupPlayAckUnreadCount" %}{% endlanying_code_snippet %}
function setGroupPlayAckUnreadCount#
void setGroupPlayAckUnreadCount(
int count
)
设置消息未播放groupAckCount数目(SDK 内部调用接口,上层不应该调用)(仅用于音频/视频附件消息)
Parameters:
- count 设置群消息未播放数目
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setGroupPlayAckUnreadCount" %}{% endlanying_code_snippet %}
function groupPlayAckReadAll#
bool groupPlayAckReadAll()
群消息是否全部已播放
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="groupPlayAckReadAll" %}{% endlanying_code_snippet %}
function setPriority#
void setPriority(
int priority
)
设置消息的扩散优先级,默认为0。0表示扩散,数字越小扩散的越多。
Parameters:
- priority 设置群消息未读数目
取值范围0-10。普通人在聊天室发送的消息级别默认为5,可以丢弃。管理员默认为0不会丢弃。其它值可以根据业务自行设置。
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setPriority" %}{% endlanying_code_snippet %}
function priority#
int priority()
消息的扩散优先级
Return: int
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="priority" %}{% endlanying_code_snippet %}
function setPushMessageMode#
void setPushMessageMode(
bool
)
设置消息是否为推送消息。
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="setPushMessageMode" %}{% endlanying_code_snippet %}
function isPushMessage#
bool isPushMessage()
消息是否是推送消息
Return: bool
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="isPushMessage" %}{% endlanying_code_snippet %}
function createMessage#
static BMXMessagePtr createMessage(
int64_t from,
int64_t to,
MessageType type,
int64_t conversationId,
const std::string & content
)
创建发送文本消息
Parameters:
- from 消息发送者
- to 消息接收者
- type 消息类型
- conversationId 会话id
- content 消息内容
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="createMessage" %}{% endlanying_code_snippet %}
function createMessage#
static BMXMessagePtr createMessage(
int64_t from,
int64_t to,
MessageType type,
int64_t conversationId,
BMXMessageAttachmentPtr attachment
)
创建发送附件消息
Parameters:
- from 消息发送者
- to 消息接收者
- type 消息类型
- conversationId 会话id
- attachment 附件
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="createMessage" %}{% endlanying_code_snippet %}
function createCommandMessage#
static BMXMessagePtr createCommandMessage(
int64_t from,
int64_t to,
MessageType type,
int64_t conversationId,
const std::string & content
)
创建发送命令消息(命令消息通过content字段或者extension字段存放命令信息)
Parameters:
- from 消息发送者
- to 消息接收者
- type 消息类型
- conversationId 会话id
- content 消息内容
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="createCommandMessage" %}{% endlanying_code_snippet %}
function createMessage#
static BMXMessagePtr createMessage(
int64_t msgId,
int64_t from,
int64_t to,
MessageType type,
int64_t conversationId,
const std::string & content,
int64_t serverTimestamp
)
创建收到的消息
Parameters:
- msgId 消息id
- from 消息发送者
- to 消息接收者
- type 消息类型
- conversationId 会话id
- content 消息内容
- serverTimestamp 服务器时间戳
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="createMessage" %}{% endlanying_code_snippet %}
function createMessage#
static BMXMessagePtr createMessage(
int64_t msgId,
int64_t from,
int64_t to,
MessageType type,
int64_t conversationId,
BMXMessageAttachmentPtr attachment,
int64_t serverTimestamp
)
创建收到的消息
Parameters:
- msgId 消息id
- from 消息发送者
- to 消息接收者
- type 消息类型
- conversationId 会话id
- attachment 附件
- serverTimestamp 服务器时间戳
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="createMessage" %}{% endlanying_code_snippet %}
function createCommandMessage#
static BMXMessagePtr createCommandMessage(
int64_t msgId,
int64_t from,
int64_t to,
MessageType type,
int64_t conversationId,
const std::string & content,
int64_t serverTimestamp
)
创建收到的命令消息(命令消息通过content字段或者extension字段存放命令信息)
Parameters:
- msgId 消息id
- from 消息发送者
- to 消息接收者
- type 消息类型
- conversationId 会话id
- content 消息内容
- serverTimestamp 服务器时间戳
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="createCommandMessage" %}{% endlanying_code_snippet %}
function createForwardMessage#
static BMXMessagePtr createForwardMessage(
BMXMessagePtr msg,
int64_t from,
int64_t to,
MessageType type,
int64_t conversationId
)
创建转发消息
Parameters:
- msg 要转发的消息
- from 消息发送者
- to 消息接收者
- type 消息类型
- conversationId 会话id
Example:
{% lanying_code_snippet repo="lanying-im-embedded",class="BMXMessage",function="createForwardMessage" %}{% endlanying_code_snippet %}
Updated on 2022-01-26 at 17:20:40 +0800