示例#1
0
        /// <summary>
        /// 获取MessageContext,如果不存在,返回null
        /// 这个方法的更重要意义在于操作TM队列,及时移除过期信息,并将最新活动的对象移到尾部
        /// </summary>
        /// <param name="userName">用户名(OpenId)</param>
        /// <returns></returns>
        private TM GetMessageContext(string userName)
        {
            //检查并移除过期记录,为了尽量节约资源,这里暂不使用独立线程轮询
            while (MessageQueue.Count > 0)
            {
                var firstMessageContext = MessageQueue[0];
                var timeSpan            = DateTime.Now - firstMessageContext.LastActiveTime;
                if (timeSpan.TotalMinutes >= ExpireMinutes)
                {
                    MessageQueue.RemoveAt(0);                               //从队列中移除过期对象
                    MessageCollection.Remove(firstMessageContext.UserName); //从集合中删除过期对象

                    //添加事件回调
                    firstMessageContext.OnRemoved();//TODO:此处异步处理,或用户在自己操作的时候异步处理需要耗费时间比较长的操作。
                }
                else
                {
                    break;
                }
            }

            /*
             * 全局只有在这里用到MessageCollection.ContainsKey
             * 充分分离MessageCollection内部操作,
             * 为以后变化或扩展MessageCollection留余地
             */
            if (!MessageCollection.ContainsKey(userName))
            {
                return(null);
            }

            return(MessageCollection[userName]);
        }
示例#2
0
        private static void SendMessage(SenderObjectRelation senderObjectRelation)
        {
            Application.Current.Dispatcher.Invoke(delegate
            {
                if (senderObjectRelation.Group == null)
                {
                    if (!MessageCollection.ContainsKey(senderObjectRelation.SenderId))
                    {
                        MessageCollection.Add(senderObjectRelation.SenderId, new ObservableCollection <Message>());
                    }

                    User friend = Friends.SingleOrDefault(f => f.Id == senderObjectRelation.SenderId);

                    MessageCollection[senderObjectRelation.SenderId].Add((Message)senderObjectRelation.Data);
                    IncomingText?.Invoke(senderObjectRelation);
                }
                else
                {
                    Group group = Group.groups.SingleOrDefault(g => g.Id == senderObjectRelation.DestinationId);
                    User friend = Friends.SingleOrDefault(f => f.Id == senderObjectRelation.SenderId);
                    if (friend == null)
                    {
                        friend = new User(senderObjectRelation.SenderId);
                    }

                    group.Messages.Add(new Message(friend, senderObjectRelation.Data.ToString(), DateTime.Now));
                    IncomingText?.Invoke(senderObjectRelation, group);
                }
            });
        }
        public void Message()
        {
            Service service = Connect();

            MessageCollection messageCollection = service.GetMessages();

            if (messageCollection.ContainsKey("sdk-test-message1"))
            {
                messageCollection.Remove("sdk-test-message1");
            }

            Assert.IsFalse(messageCollection.ContainsKey("sdk-test-message1"), this.assertRoot + "#1");

            if (messageCollection.ContainsKey("sdk-test-message2"))
            {
                messageCollection.Remove("sdk-test-message2");
            }

            Assert.IsFalse(messageCollection.ContainsKey("sdk-test-message2"), this.assertRoot + "#2");

            messageCollection.Create("sdk-test-message1", "hello.");
            Assert.IsTrue(messageCollection.ContainsKey("sdk-test-message1"), this.assertRoot + "#3");

            Message message = messageCollection.Get("sdk-test-message1");

            Assert.AreEqual("sdk-test-message1", message.Key, this.assertRoot + "#4");
            Assert.AreEqual("hello.", message.Value, this.assertRoot + "#5");

            Args args2 = new Args();

            args2.Add("value", "world.");
            messageCollection.Create("sdk-test-message2", args2);
            Assert.IsTrue(messageCollection.ContainsKey("sdk-test-message2"), this.assertRoot + "#6");

            message = messageCollection.Get("sdk-test-message2");
            Assert.AreEqual("sdk-test-message2", message.Key, this.assertRoot + "#7");
            Assert.AreEqual("world.", message.Value, this.assertRoot + "#8");

            messageCollection.Remove("sdk-test-message1");
            Assert.IsFalse(messageCollection.ContainsKey("sdk-test-message1"), this.assertRoot + "#9");

            messageCollection.Remove("sdk-test-message2");
            Assert.IsFalse(messageCollection.ContainsKey("sdk-test-message2"), this.assertRoot + "#10");
        }
示例#4
0
 /// <summary>
 /// 获取MessageContext,如果不存在,返回null
 /// 这个方法的更重要意义在于操作TM队列,及时移除过期信息,并将最新活动的对象移到尾部
 /// </summary>
 /// <param name="userName">用户名(OpenId)</param>
 /// <returns></returns>
 private TM GetMessageContext(string userName)
 {
     while (MessageQueue.Count > 0)
     {
         TM       val      = MessageQueue[0];
         TimeSpan timeSpan = DateTime.Now - (val.LastActiveTime.HasValue ? val.LastActiveTime.Value : DateTime.Now);
         double   num      = val.ExpireMinutes.HasValue ? val.ExpireMinutes.Value : ExpireMinutes;
         if (!(timeSpan.TotalMinutes >= num))
         {
             break;
         }
         MessageQueue.RemoveAt(0);
         MessageCollection.Remove(val.UserName);
         val.OnRemoved();
     }
     if (!MessageCollection.ContainsKey(userName))
     {
         return(null);
     }
     return(MessageCollection[userName]);
 }
示例#5
0
        /// <summary>
        /// 获取MessageContext,如果不存在,返回null
        /// 这个方法的更重要意义在于操作TM队列,及时移除过期信息,并将最新活动的对象移到尾部
        /// </summary>
        /// <param name="userName">用户名(OpenId)</param>
        /// <returns></returns>
        private TM GetMessageContext(string userName)
        {
            //检查并移除过期记录,为了尽量节约资源,这里暂不使用独立线程轮询
            while (MessageQueue.Count > 0)
            {
                var firstMessageContext = MessageQueue[0];
                var timeSpan            = DateTime.Now - firstMessageContext.LastActiveTime;
                //确定对话过期时间
                var expireMinutes = firstMessageContext.ExpireMinutes.HasValue
                    ? firstMessageContext.ExpireMinutes.Value //队列自定义事件
                    : this.ExpireMinutes;                     //全局统一默认时间

                //TODO:这里假设按照队列顺序过期,实际再加入了自定义过期时间之后,可能不遵循这个规律   —— Jeffrey Su 2018.1.23
                if (timeSpan.TotalMinutes >= expireMinutes)
                {
                    MessageQueue.RemoveAt(0);                               //从队列中移除过期对象
                    MessageCollection.Remove(firstMessageContext.UserName); //从集合中删除过期对象

                    //添加事件回调
                    firstMessageContext.OnRemoved();//TODO:此处异步处理,或用户在自己操作的时候异步处理需要耗费时间比较长的操作。
                }
                else
                {
                    break;
                }
            }

            /*
             * 全局只有在这里用到MessageCollection.ContainsKey
             * 充分分离MessageCollection内部操作,
             * 为以后变化或扩展MessageCollection留余地
             */
            if (!MessageCollection.ContainsKey(userName))
            {
                return(null);
            }

            return(MessageCollection[userName]);
        }