Ejemplo n.º 1
0
        public Message(IAVIMMessage textmessage)
        {
            if (textmessage is AVIMTextMessage)
            {
                Text  = ((AVIMTextMessage)textmessage).TextContent;
                Image = null;
            }
            else
            {
                Text = ((AVIMImageMessage)textmessage).TextContent;
                //Image=new BitmapImage(((AVIMImageMessage)textmessage).File.Url, new System.Net.Cache.RequestCachePolicy());
                Image = new BitmapImage(((AVIMImageMessage)textmessage).File.Url);
            }

            if (textmessage.FromClientId != AVUser.CurrentUser.ObjectId)
            {
                Alignment  = HorizontalAlignment.Left;
                Background = new SolidColorBrush(Colors.LightGray);
            }
            else
            {
                Alignment  = HorizontalAlignment.Right;
                Background = new SolidColorBrush(Colors.LightGreen);
            }
        }
Ejemplo n.º 2
0
        public async Task <int> getHistoryMessage()
        {
            IEnumerable <IAVIMMessage> messages;

            if (oldestMessage == null)
            {
                messages = (await conversation.QueryMessageAsync(limit: MessagePerPage));
            }
            else
            {
                messages = (await conversation.QueryMessageAsync(
                                beforeMessageId: oldestMessage.Id,
                                beforeTimeStamp: oldestMessage.ServerTimestamp,
                                limit: MessagePerPage));
            }

            foreach (var message in messages.Reverse())
            {
                if (message is AVIMTextMessage)
                {
                    var         textMessage = (AVIMTextMessage)message;
                    MessageItem newItem     = fromIMTextMessage(textMessage);
                    itemList.Insert(0, newItem);
                }
            }

            List <IAVIMMessage> list = messages.ToList();

            if (list.Count > 0)
            {
                oldestMessage = list[0];
            }

            return(list.Count);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 发送消息
 /// </summary>
 /// <param name="avMessage">消息体</param>
 /// <param name="options">消息的发送选项,包含了一些特殊的标记<see cref="AVIMSendOptions"/></param>
 /// <returns></returns>
 public Task <IAVIMMessage> SendMessageAsync(IAVIMMessage avMessage, AVIMSendOptions options)
 {
     if (this.CurrentClient == null)
     {
         throw new Exception("当前对话未指定有效 AVIMClient,无法发送消息。");
     }
     return(this.CurrentClient.SendMessageAsync(this, avMessage, options));
 }
 /// <summary>
 /// 发送消息
 /// </summary>
 /// <param name="avMessage">消息体</param>
 /// <param name="options">消息的发送选项,包含了一些特殊的标记<see cref="AVIMSendOptions"/></param>
 /// <returns></returns>
 public Task <IAVIMMessage> SendMessageAsync(IAVIMMessage avMessage, AVIMSendOptions options)
 {
     if (this.CurrentClient == null)
     {
         throw new Exception("当前对话未指定有效 AVIMClient,无法发送消息。");
     }
     if (this.CurrentClient.LinkedRealtime.State != AVRealtime.Status.Online)
     {
         throw new Exception("未能连接到服务器,无法发送消息。");
     }
     return(this.CurrentClient.SendMessageAsync(this, avMessage, options));
 }
Ejemplo n.º 5
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="invoker"></param>
        /// <param name="adpater"></param>
        public void RegisterMessage <T>(Action <IAVIMMessage> invoker, IAVIMMessage adpater)
            where T : AVIMMessage
        {
            int typeEnum = AVIMMessage.GetMessageType <T>();

            if (typeEnum < 0)
            {
                return;
            }
            messageHandlers[typeEnum] = invoker;
            adpaters[typeEnum]        = adpater;
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Recalls the async.
        /// </summary>
        /// <returns>The async.</returns>
        /// <param name="message">Message.</param>
        public Task <AVIMRecalledMessage> RecallAsync(IAVIMMessage message)
        {
            var tcs      = new TaskCompletionSource <AVIMRecalledMessage>();
            var patchCmd = new PatchCommand().Recall(message);

            RunCommandAsync(patchCmd)
            .OnSuccess(t => {
                var recalledMsg = new AVIMRecalledMessage();
                AVIMMessage.CopyMetaData(message, recalledMsg);
                tcs.SetResult(recalledMsg);
            });
            return(tcs.Task);
        }
Ejemplo n.º 7
0
 /// <summary>
 /// 向目标对话发送消息
 /// </summary>
 /// <param name="conversation">目标对话</param>
 /// <param name="message">消息体</param>
 /// <returns></returns>
 public Task <IAVIMMessage> SendMessageAsync(
     AVIMConversation conversation,
     IAVIMMessage message)
 {
     return(this.SendMessageAsync(conversation, message, new AVIMSendOptions()
     {
         Receipt = true,
         Transient = false,
         Priority = 1,
         Will = false,
         PushData = null,
     }));
 }
Ejemplo n.º 8
0
        /// <summary>
        /// 向目标对话发送消息
        /// </summary>
        /// <param name="conversation">目标对话</param>
        /// <param name="message">消息体</param>
        /// <param name="options">消息的发送选项,包含了一些特殊的标记<see cref="AVIMSendOptions"/></param>
        /// <returns></returns>
        public Task <IAVIMMessage> SendMessageAsync(
            AVIMConversation conversation,
            IAVIMMessage message,
            AVIMSendOptions options)
        {
            if (this.LinkedRealtime.State != AVRealtime.Status.Online)
            {
                throw new Exception("未能连接到服务器,无法发送消息。");
            }

            var messageBody = message.Serialize();

            message.ConversationId = conversation.ConversationId;
            message.FromClientId   = this.ClientId;

            var cmd = new MessageCommand()
                      .Message(messageBody)
                      .ConvId(conversation.ConversationId)
                      .Receipt(options.Receipt)
                      .Transient(options.Transient)
                      .Priority(options.Priority)
                      .Will(options.Will)
                      .MentionAll(message.MentionAll);

            if (message is AVIMMessage)
            {
                cmd = ((AVIMMessage)message).BeforeSend(cmd);
            }

            if (options.PushData != null)
            {
                cmd = cmd.PushData(options.PushData);
            }

            if (message.MentionList != null)
            {
                cmd = cmd.Mention(message.MentionList);
            }

            var directCmd = cmd.PeerId(this.ClientId);

            return(this.RunCommandAsync(directCmd).OnSuccess(t =>
            {
                var response = t.Result.Item2;

                message.Id = response["uid"].ToString();
                message.ServerTimestamp = long.Parse(response["t"].ToString());

                return message;
            }));
        }
Ejemplo n.º 9
0
        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);
        }
        public IDictionary <string, object> EncodeProperties(IAVIMMessage subclass)
        {
            var type            = subclass.GetType();
            var result          = new Dictionary <string, object>();
            var className       = GetClassName(type);
            var propertMappings = GetPropertyMappings(className);

            foreach (var propertyPair in propertMappings)
            {
                var propertyInfo = ReflectionHelpers.GetProperty(type, propertyPair.Key);
                var operation    = propertyInfo.GetValue(subclass, null);
                result[propertyPair.Value] = PointerOrLocalIdEncoder.Instance.Encode(operation);
            }
            return(result);
        }
Ejemplo n.º 11
0
        public PatchCommand Recall(IAVIMMessage message)
        {
            var patch = new Patch()
            {
                ConvId         = message.ConversationId,
                From           = message.FromClientId,
                MessageId      = message.Id,
                MetaTimestamp  = message.ServerTimestamp,
                Recall         = true,
                PatchTimestamp = DateTime.Now.UnixTimeStampSeconds()
            };

            this.Patches.Add(patch);
            this.Argument("patches", this.EncodePatches());
            return(new PatchCommand(this, this.Patches));
        }
Ejemplo n.º 12
0
 /// <summary>
 /// 向该对话发送消息。
 /// </summary>
 /// <param name="avMessage">消息体</param>
 /// <param name="receipt">是否需要送达回执</param>
 /// <param name="transient">是否是暂态消息,暂态消息不返回送达回执(ack),不保留离线消息,不触发离线推送</param>
 /// <param name="priority">消息等级,默认是1,可选值还有 2 ,3</param>
 /// <param name="will">标记该消息是否为下线通知消息</param>
 /// <param name="pushData">如果消息的接收者已经下线了,这个字段的内容就会被离线推送到接收者
 /// <remarks>例如,一张图片消息的离线消息内容可以类似于:[您收到一条图片消息,点击查看] 这样的推送内容,参照微信的做法</remarks>
 /// </param>
 /// <returns></returns>
 public Task <IAVIMMessage> SendMessageAsync(IAVIMMessage avMessage,
                                             bool receipt   = true,
                                             bool transient = false,
                                             int priority   = 1,
                                             bool will      = false,
                                             IDictionary <string, object> pushData = null)
 {
     return(this.SendMessageAsync(avMessage, new AVIMSendOptions()
     {
         Receipt = receipt,
         Transient = transient,
         Priority = priority,
         Will = will,
         PushData = pushData
     }));
 }
Ejemplo n.º 13
0
        public PatchCommand Modify(IAVIMMessage oldMessage, IAVIMMessage newMessage)
        {
            var patch = new Patch()
            {
                ConvId         = oldMessage.ConversationId,
                From           = oldMessage.FromClientId,
                MessageId      = oldMessage.Id,
                MetaTimestamp  = oldMessage.ServerTimestamp,
                Recall         = false,
                PatchTimestamp = DateTime.Now.UnixTimeStampSeconds(),
                PatchData      = newMessage.Serialize()
            };

            this.Patches.Add(patch);
            this.Argument("patches", this.EncodePatches());
            return(new PatchCommand(this, this.Patches));
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Modifies the aysnc.
        /// </summary>
        /// <returns>The aysnc.</returns>
        /// <param name="oldMessage">要修改的消息对象</param>
        /// <param name="newMessage">新的消息对象</param>
        public Task <IAVIMMessage> UpdateAsync(IAVIMMessage oldMessage, IAVIMMessage newMessage)
        {
            var tcs      = new TaskCompletionSource <IAVIMMessage>();
            var patchCmd = new PatchCommand().Modify(oldMessage, newMessage);

            this.RunCommandAsync(patchCmd)
            .OnSuccess(t => {
                // 从旧消息对象中拷贝数据
                AVIMMessage.CopyMetaData(oldMessage, newMessage);
                // 获取更新时间戳
                var response = t.Result.Item2;
                if (response.TryGetValue("lastPatchTime", out object updatedAtObj) &&
                    long.TryParse(updatedAtObj.ToString(), out long updatedAt))
                {
                    newMessage.UpdatedAt = updatedAt;
                }
                tcs.SetResult(newMessage);
            });
            return(tcs.Task);
        }
Ejemplo n.º 15
0
        /// <summary>
        /// 向目标对话发送消息
        /// </summary>
        /// <param name="conversation">目标对话</param>
        /// <param name="message">消息体</param>
        /// <param name="options">消息的发送选项,包含了一些特殊的标记<see cref="AVIMSendOptions"/></param>
        /// <returns></returns>
        public Task <IAVIMMessage> SendMessageAsync(
            AVIMConversation conversation,
            IAVIMMessage message,
            AVIMSendOptions options = default(AVIMSendOptions))
        {
            var messageBody = message.Serialize();

            message.ConversationId = conversation.ConversationId;
            message.FromClientId   = this.ClientId;

            var cmd = new MessageCommand()
                      .Message(messageBody)
                      .ConvId(conversation.ConversationId)
                      .Receipt(options.Receipt)
                      .Transient(options.Transient)
                      .Priority(options.Priority)
                      .Will(options.Will);

            if (options.PushData != null)
            {
                cmd.PushData(options.PushData);
            }
            var directCmd = cmd.PeerId(this.ClientId);

            return(AVRealtime.AVIMCommandRunner.RunCommandAsync(directCmd).ContinueWith <IAVIMMessage>(t =>
            {
                if (t.IsFaulted)
                {
                    throw t.Exception;
                }
                else
                {
                    var response = t.Result.Item2;
                    message.Id = response["uid"].ToString();
                    message.ServerTimestamp = long.Parse(response["t"].ToString());

                    return message;
                }
            }));
        }
Ejemplo n.º 16
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="conversation"></param>
        /// <param name="message"></param>
        /// <param name="readAt"></param>
        /// <returns></returns>
        public Task ReadAsync(AVIMConversation conversation, IAVIMMessage message = null, DateTime?readAt = null)
        {
            var convRead = new ReadCommand.ConvRead()
            {
                ConvId = conversation.ConversationId,
            };

            if (message != null)
            {
                convRead.MessageId = message.Id;
                convRead.Timestamp = message.ServerTimestamp;
            }

            if (readAt != null && readAt.Value != DateTime.MinValue)
            {
                convRead.Timestamp = readAt.Value.ToUnixTimeStamp();
            }

            var readCmd = new ReadCommand().Conv(convRead).PeerId(this.ClientId);

            this.RunCommandAsync(readCmd);

            return(Task.FromResult(true));
        }
Ejemplo n.º 17
0
        public MessageViewModel(IAVIMMessage iMessage, string text = null)
        {
            this.Text = "当前客户端不支持显示此类型消息。";
            if (iMessage != null)
            {
                if (iMessage is AVIMTextMessage)
                {
                    this.Text = ((AVIMTextMessage)iMessage).TextContent;
                }
                else if (iMessage is AVIMMessage)
                {
                }

                this.Sender = iMessage.FromClientId;
            }
            if (text != null)
            {
                this.Text = text;
            }
            if (this.Sender != null)
            {
                this.Code = this.Sender.First();
            }
        }
 internal static void UpdateNotice(IAVIMMessage message)
 {
     lock (sMutex)
     {
         var convValidators = UnreadConversations.Where(c => c.ConvId == message.ConversationId);
         if (convValidators != null)
         {
             if (convValidators.Count() > 0)
             {
                 var currentNotice = convValidators.FirstOrDefault();
                 currentNotice.AutomicIncrement();
                 currentNotice.LastUnreadMessage = message;
             }
             else
             {
                 var currentThread = new UnreadConversationNotice();
                 currentThread.ConvId            = message.ConversationId;
                 currentThread.LastUnreadMessage = message;
                 currentThread.AutomicIncrement();
                 UnreadConversations.Add(currentThread);
             }
         }
     }
 }
Ejemplo n.º 19
0
 public AVIMMessagePatchEventArgs(IAVIMMessage message)
 {
     Message = message;
 }
Ejemplo n.º 20
0
 /// <summary>
 /// Initializes a new instance of the <see cref="T:LeanCloud.Realtime.AVIMMessageEventArgs"/> class.
 /// </summary>
 /// <param name="iMessage">I message.</param>
 public AVIMMessageEventArgs(IAVIMMessage iMessage)
 {
     Message = iMessage;
 }
Ejemplo n.º 21
0
 public AckCommand Message(IAVIMMessage message)
 {
     return(new AckCommand()
            .ConversationId(message.ConversationId)
            .MessageId(message.Id));
 }
Ejemplo n.º 22
0
 public Task ModifyAysnc(IAVIMMessage message)
 {
     return(this.ReplaceAsync(message, message));
 }
Ejemplo n.º 23
0
        public Task ReplaceAsync(IAVIMMessage oldMessage, IAVIMMessage newMessage)
        {
            var patchCmd = new PatchCommand().Modify(oldMessage, newMessage);

            return(this.LinkedRealtime.RunCommandAsync(patchCmd));
        }
Ejemplo n.º 24
0
        public Task RecallAsync(IAVIMMessage message)
        {
            var patchCmd = new PatchCommand().Recall(message);

            return(this.LinkedRealtime.RunCommandAsync(patchCmd));
        }
Ejemplo n.º 25
0
        public IAVIMMessage DecodeProperties(IAVIMMessage message, IDictionary <string, object> buildInData)
        {
            long timestamp;

            if (buildInData.ContainsKey("timestamp"))
            {
                if (long.TryParse(buildInData["timestamp"].ToString(), out timestamp))
                {
                    message.ServerTimestamp = timestamp;
                }
            }
            long ackAt;

            if (buildInData.ContainsKey("ackAt"))
            {
                if (long.TryParse(buildInData["ackAt"].ToString(), out ackAt))
                {
                    message.RcpTimestamp = ackAt;
                }
            }

            if (buildInData.ContainsKey("from"))
            {
                message.FromClientId = buildInData["from"].ToString();
            }
            if (buildInData.ContainsKey("msgId"))
            {
                message.Id = buildInData["msgId"].ToString();
            }
            if (buildInData.ContainsKey("cid"))
            {
                message.ConversationId = buildInData["cid"].ToString();
            }
            if (buildInData.ContainsKey("fromPeerId"))
            {
                message.FromClientId = buildInData["fromPeerId"].ToString();
            }
            if (buildInData.ContainsKey("id"))
            {
                message.Id = buildInData["id"].ToString();
            }
            if (buildInData.ContainsKey("mid"))
            {
                message.Id = buildInData["mid"].ToString();
            }
            if (buildInData.ContainsKey("mentionPids"))
            {
                message.MentionList = AVDecoder.Instance.DecodeList <string>(buildInData["mentionPids"]);
            }
            if (buildInData.TryGetValue("patchTimestamp", out object patchTimestampObj))
            {
                if (long.TryParse(patchTimestampObj.ToString(), out long patchTimestamp))
                {
                    message.UpdatedAt = patchTimestamp;
                }
            }

            bool mentionAll;

            if (buildInData.ContainsKey("mentionAll"))
            {
                if (bool.TryParse(buildInData["mentionAll"].ToString(), out mentionAll))
                {
                    message.MentionAll = mentionAll;
                }
            }
            return(message);
        }