csharp-sdk-upm/RTM/Source/Public/AVIMMessage.cs

163 lines
4.9 KiB
C#
Raw Normal View History

2019-07-19 15:01:34 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LeanCloud;
using System.Reflection;
using LeanCloud.Storage.Internal;
using System.Threading;
using System.Collections;
using LeanCloud.Realtime.Internal;
namespace LeanCloud.Realtime
{
/// <summary>
/// 实时消息的核心基类,它是 Json schema 消息的父类
/// </summary>
[AVIMMessageClassName("_AVIMMessage")]
public class AVIMMessage : IAVIMMessage
{
/// <summary>
/// 默认的构造函数
/// </summary>
public AVIMMessage()
{
}
internal readonly object mutex = new object();
/// <summary>
/// 对话的Id
/// </summary>
public string ConversationId { get; set; }
/// <summary>
/// 发送消息的 ClientId
/// </summary>
public string FromClientId { get; set; }
/// <summary>
/// 消息在全局的唯一标识Id
/// </summary>
public string Id { get; set; }
/// <summary>
/// 服务器端的时间戳
/// </summary>
public long ServerTimestamp { get; set; }
/// <summary>
/// Gets or sets the content.
/// </summary>
/// <value>The content.</value>
public string Content { get; set; }
/// <summary>
/// 对方收到消息的时间戳,如果是多人聊天,那以最早收到消息的人回发的 ACK 为准
/// </summary>
public long RcpTimestamp { get; set; }
public long UpdatedAt { get; set; }
internal string cmdId { get; set; }
#region
/// <summary>
/// Gets or sets a value indicating whether this <see cref="T:LeanCloud.Realtime.IAVIMMessage"/> mention all.
/// </summary>
/// <value><c>true</c> if mention all; otherwise, <c>false</c>.</value>
public bool MentionAll { get; set; }
/// <summary>
/// Gets or sets the mention list.
/// </summary>
/// <value>The mention list.</value>
public IEnumerable<string> MentionList { get; set; }
#endregion
#region register convertor for custom typed message
/// <summary>
/// Serialize this message.
/// </summary>
/// <returns>The serialize.</returns>
public virtual string Serialize()
{
return Content;
}
/// <summary>
/// Validate the specified msgStr.
/// </summary>
/// <returns>The validate.</returns>
/// <param name="msgStr">Message string.</param>
public virtual bool Validate(string msgStr)
{
return true;
}
/// <summary>
/// Deserialize the specified msgStr to message subclass instance
/// </summary>
/// <returns>The deserialize.</returns>
/// <param name="msgStr">Message string.</param>
public virtual IAVIMMessage Deserialize(string msgStr)
{
Content = msgStr;
return this;
}
internal virtual MessageCommand BeforeSend(MessageCommand cmd)
{
return cmd;
}
internal static IAVIMMessage CopyMetaData(IAVIMMessage srcMsg, IAVIMMessage desMsg) {
if (srcMsg == null)
return desMsg;
desMsg.ConversationId = srcMsg.ConversationId;
desMsg.FromClientId = srcMsg.FromClientId;
desMsg.Id = srcMsg.Id;
desMsg.ServerTimestamp = srcMsg.ServerTimestamp;
desMsg.RcpTimestamp = srcMsg.RcpTimestamp;
desMsg.UpdatedAt = srcMsg.UpdatedAt;
return desMsg;
}
#endregion
}
/// <summary>
/// 消息的发送选项
/// </summary>
public struct AVIMSendOptions
{
/// <summary>
/// 是否需要送达回执
/// </summary>
public bool Receipt;
/// <summary>
/// 是否是暂态消息,暂态消息不返回送达回执(ack),不保留离线消息,不触发离线推送
/// </summary>
public bool Transient;
/// <summary>
/// 消息的优先级默认是1可选值还有 2|3
/// </summary>
public int Priority;
/// <summary>
/// 是否为 Will 类型的消息,这条消息会被缓存在服务端,一旦当前客户端下线,这条消息会被发送到对话内的其他成员
/// </summary>
public bool Will;
/// <summary>
/// 如果消息的接收者已经下线了,这个字段的内容就会被离线推送到接收者
///<remarks>例如,一张图片消息的离线消息内容可以类似于:[您收到一条图片消息,点击查看] 这样的推送内容,参照微信的做法</remarks>
/// </summary>
public IDictionary<string, object> PushData;
}
}