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

163 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
}
}