Beispiel #1
0
        public void RequestReadMsgs()
        {
            bool bIsSuccess = this.m_ReadMsgService.ReadMessages(this.m_UnReadMessages);

            if (true == bIsSuccess)
            {
                var MessageCollection = ConnectionHelper.DB.GetCollection <MessageEntity>("MessageEntity");
                var ChatMsgs          = this.Messages.OfType <ChatMsg>();

                foreach (UnReadMsg msg in this.m_UnReadMessages)
                {
                    IList <string> ReadMembers = msg.ReadMembers;
                    if (null == ReadMembers)
                    {
                        ReadMembers = new List <String>();
                    }
                    if (false == ReadMembers.Contains(AuthRepository.MQKeyInfo.UserSid))
                    {
                        ReadMembers.Add(AuthRepository.MQKeyInfo.UserSid);
                    }
                    var UpdateMessageQuery = Update <MessageEntity>
                                             .Set(m => m.State, (int)MsgStatus.Read)
                                             .Set(m => m.ReadMembers, ReadMembers);

                    var FindMessageQuery = Query <MessageEntity> .EQ(m => m.Id, msg.Id);

                    MessageCollection.Update(FindMessageQuery, UpdateMessageQuery);

                    try
                    {
                        var TargetMessage = ChatMsgs.Single(m => m.Sid == msg.Sid);
                        TargetMessage.ReadMembersCount += 1;
                    }
                    catch (InvalidOperationException invalidOperException)
                    {
                        GlobalLogger.Log(invalidOperException.Message);
                    }
                }

                this.m_UnReadMessages.Clear();
            }
        }
        public void StartListen()
        {
            try
            {
                if (null != AuthRepository.MQKeyInfo)
                {
                    string strExchange = "beautifulexchange";
                    var    factory     = new ConnectionFactory()
                    {
                        HostName = BeautifulTalkProtocolSet.MQServerIP
                    };
                    factory.UserName                   = "******";
                    factory.Password                   = "******";
                    factory.VirtualHost                = "obkhost";
                    factory.Port                       = 5672;
                    factory.RequestedHeartbeat         = 600;
                    factory.RequestedConnectionTimeout = 10000;

                    using (var connection = factory.CreateConnection())
                    {
                        connection.ConnectionShutdown += connection_ConnectionShutdown;

                        using (var channel = connection.CreateModel())
                        {
                            channel.ModelShutdown += channel_ModelShutdown;
                            var queueName = channel.QueueDeclare(AuthRepository.MQKeyInfo.UserSid, true, false, false, null);
                            channel.QueueBind(queueName, strExchange, AuthRepository.MQKeyInfo.UserSid + ".win.#");
                            var consumer = new QueueingBasicConsumer(channel);
                            channel.BasicConsume(queueName, false, consumer);

                            while (true)
                            {
                                BasicDeliverEventArgs ArrivedMessage = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                                if (null != ArrivedMessage)
                                {
                                    IDictionary <string, object> MQHeaders = ArrivedMessage.BasicProperties.Headers;
                                    string strContent = null;
                                    byte[] arBodyData = ArrivedMessage.Body;
                                    if (null != arBodyData)
                                    {
                                        strContent = Encoding.UTF8.GetString(arBodyData);
                                    }

                                    MsgType msgType      = (MsgType)(MQHeaders[MSG_TYPE]);
                                    string  strSenderSid = Encoding.UTF8.GetString((byte[])MQHeaders[SENDER_SID]);
                                    string  strRoomSid   = Encoding.UTF8.GetString((byte[])MQHeaders[ROOM_SID]);

                                    switch (msgType)
                                    {
                                    case MsgType.ChatData:
                                    {
                                        ContentType    contentType  = (ContentType)MQHeaders[CONTENT_TYPE];
                                        string         strMsgSid    = Encoding.UTF8.GetString((byte[])MQHeaders[MSG_SID]);
                                        string         strSenderId  = Encoding.UTF8.GetString((byte[])MQHeaders[SENDER_ID]);
                                        string         strNickName  = Encoding.UTF8.GetString((byte[])MQHeaders[NICKNAME]);
                                        string         strPhotoPath = Encoding.UTF8.GetString((byte[])MQHeaders[PHOTO_PATH]);
                                        long           lSendTime    = (long)MQHeaders[SEND_TIME];
                                        var            bInterests   = MQHeaders[INTERESTS] as List <object>;
                                        IList <string> arInterests  = new List <string>(bInterests.Count);
                                        foreach (byte[] bInterest in bInterests)
                                        {
                                            arInterests.Add(Encoding.UTF8.GetString(bInterest));
                                        }
                                        this.Analyzer.SaveUserIfNotExist(strSenderId, strSenderSid, strNickName, arInterests);

                                        string strMsgId = this.Analyzer.CreateRecordForChatData(strMsgSid, strSenderSid, strRoomSid, contentType, strContent, lSendTime);

                                        Task.Run(() =>
                                            {
                                                var bMemberSids       = MQHeaders[MEMBER_SIDS] as List <object>;
                                                var bActiveMemberSids = MQHeaders[ACTIVE_MEMBER_SIDS] as List <object>;

                                                IList <string> arMemberSids       = new List <string>(bMemberSids.Count);
                                                IList <string> arActiveMemberSids = new List <string>(bActiveMemberSids.Count);

                                                foreach (byte[] bMemberSid in bMemberSids)
                                                {
                                                    arMemberSids.Add(Encoding.UTF8.GetString(bMemberSid));
                                                }
                                                foreach (byte[] bMemberSid in bActiveMemberSids)
                                                {
                                                    arActiveMemberSids.Add(Encoding.UTF8.GetString(bMemberSid));
                                                }

                                                this.Analyzer.AnalyzeChatData(strMsgId, strMsgSid, strSenderSid, strRoomSid, strContent,
                                                                              lSendTime, arMemberSids, arActiveMemberSids, contentType);
                                            });

                                        break;
                                    }

                                    case MsgType.Read:
                                    {
                                        var      MessageCollection = ConnectionHelper.DB.GetCollection <MessageEntity>("MessageEntity");
                                        string   strMsgSids        = Encoding.UTF8.GetString((byte[])MQHeaders[MSG_SIDS]);
                                        string[] arMsgSids         = strMsgSids.Split(',');

                                        foreach (string msgSid in arMsgSids)
                                        {
                                            var FindMessageQuery = Query <MessageEntity> .EQ(m => m.Sid, msgSid);

                                            var FindedMessage = MessageCollection.FindOne(FindMessageQuery);

                                            if (null != FindedMessage)
                                            {
                                                IList <string> ReadMembers = FindedMessage.ReadMembers;
                                                if (null == ReadMembers)
                                                {
                                                    ReadMembers = new List <string>();
                                                }
                                                if (false == ReadMembers.Contains(strSenderSid))
                                                {
                                                    ReadMembers.Add(strSenderSid);
                                                }
                                                var UpdateMessageQuery = Update <MessageEntity>
                                                                         .Set(m => m.State, (int)MsgStatus.Read)
                                                                         .Set(m => m.ReadMembers, ReadMembers);

                                                MessageCollection.Update(FindMessageQuery, UpdateMessageQuery);
                                            }
                                        }

                                        var RcvdReadMsg = new ReceivedReadMsg(strRoomSid, strMsgSids, strSenderSid);
                                        Task.Run(() => { this.Analyzer.AnalyzeRead(RcvdReadMsg); });
                                        break;
                                    }

                                    default: break;
                                    }

                                    channel.BasicAck(ArrivedMessage.DeliveryTag, false);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception AbstractException)
            {
                throw AbstractException;
            }
        }