Exemplo n.º 1
0
 public ChatMessageEntity AddChatMessage(ChatMessageEntity message)
 {
     lock (ChatMessages)
     {
         ChatMessages.Add(message);
         return(ChatMessages.Last());
     }
 }
Exemplo n.º 2
0
        private int currentCount   = 0; //timer
        #endregion

        #region functions
        private void WriteToStream(ChatMessageEntity messageEntity)
        {
            ObjectInversion inversion = new ObjectInversion();

            byte[] byteArr = inversion.SerializeTo((object)messageEntity);
            writer.Write(byteArr);
            writer.Flush();
        }
Exemplo n.º 3
0
        public async Task AddChatMessage(ChatMessageEntity chatMessageEntity)
        {
            using (var context = _dbContextFactory.CreateDbContext())
            {
                await context.AddAsync(chatMessageEntity);

                await context.SaveChangesAsync();
            }
        }
        public async Task Handle(ChatMessageSentEvent notification, CancellationToken cancellationToken)
        {
            var message = new ChatMessageEntity()
            {
                Stock = notification.Stock, FromNickName = notification.Nickname, Message = notification.Message, SentTime = dateTime.Now
            };
            await unitOfWork.AddAndSaveAsync(message);

            await notifier.NotifyMessageSet(message);
        }
Exemplo n.º 5
0
        private void heartbeatTimer_Tick(object sender, EventArgs e)
        {
            tickCountInStep++;
            if (tickCountInStep == tickCount)
            {
                if (ChatClientCollection.Count > 0)
                {
                    //计数器自动递增
                    expiryCountInStep++;
                    foreach (ChatClient ChatClient in ChatClientLists)
                    {
                        ChatClientOnLineCounter[ChatClient]++;
                    }
                    //连续监测三次之后,开始监测集合中的掉线情况
                    if (expiryCountInStep == expiryCount)
                    {
                        //寻找集合中“掉线”的用户
                        var disconnectedChatClients = ChatClientOnLineCounter.Where(p => p.Value >= 3).ToList();
                        foreach (var disconnectedChatClient in disconnectedChatClients)
                        {
                            txtLog.Append("用户" + disconnectedChatClient.Key.name + "掉线!");

                            //删除集合中被视为掉线的用户
                            ChatClientLists.Remove(disconnectedChatClient.Key);
                            ChatClientOnLineCounter.Remove(disconnectedChatClient.Key);

                            //开始广播发送掉线用户
                            ChatMessageEntity entity = new ChatMessageEntity();
                            entity.MessageType = ChatStateEnum.OffLine;
                            EndPoint curOfflineChatClientEP = disconnectedChatClient.Key.client.Client.RemoteEndPoint;
                            string   ChatClientName         = disconnectedChatClient.Key.name;
                            entity.MessageContentEx.Add(curOfflineChatClientEP, ChatClientName);

                            ObjectInversion inversion = new ObjectInversion();
                            byte[]          byteArr   = inversion.SerializeTo((object)entity);

                            try
                            {
                                foreach (ChatClient ChatClient in ChatClientLists)
                                {
                                    ChatClient.writer.Write(byteArr);
                                    ChatClient.writer.Flush();
                                }
                            }
                            catch { }
                        }
                        expiryCountInStep = 0;
                    }
                }
                tickCountInStep = 0;
            }
        }
Exemplo n.º 6
0
        private void btnSend_Click(object sender, EventArgs e)
        {
            ChatMessageEntity messageEntity = new ChatMessageEntity();

            messageEntity.NickName       = loginName;
            messageEntity.MessageType    = ChatStateEnum.Message;
            messageEntity.MessageContent = txtSend.Text;
            messageEntity.RemoteEndPoint = client.Client.LocalEndPoint;
            messageEntity.timeStamp      = DateTime.Now;

            if (stream.CanWrite)
            {
                WriteToStream(messageEntity);
            }
        }
Exemplo n.º 7
0
        private void heartbeatTimer_Tick(object sender, EventArgs e)
        {
            currentCount++;
            if (currentCount == heartbeatCount)
            {
                txtMessage.Append("开始发送心跳包");
                ChatMessageEntity chat = new ChatMessageEntity();
                chat.MessageType = ChatStateEnum.Heartbeat;
                chat.timeStamp   = DateTime.Now;
                chat.NickName    = loginName;

                WriteToStream(chat);
                currentCount = 0;
            }
        }
Exemplo n.º 8
0
        private void AnalysisPackage(ChatMessageEntity entity, ChatClient user)
        {
            switch (entity.MessageType)
            {
            case ChatStateEnum.OnLine:
                if (entity.MessageContentEx.Count > 0)
                {
                    lstUsers.Invoke(new Action(() => { lstUsers.Items.Clear(); }));
                    foreach (KeyValuePair <EndPoint, string> kvp in entity.MessageContentEx as Dictionary <EndPoint, string> )
                    {
                        ListViewItem lvi = new ListViewItem();
                        lvi.Text = kvp.Value;
                        lvi.Tag  = kvp.Key as object;
                        lstUsers.Invoke(new Action(() => { lstUsers.Items.Add(lvi); }));
                    }
                }
                break;

            case ChatStateEnum.Message:
                txtMessage.Append(entity.NickName + "【" + entity.RemoteEndPoint + "】 say:\n" + entity.MessageContent);
                break;

            case ChatStateEnum.File:
                break;

            case ChatStateEnum.OffLine:
                foreach (var offlineUser in entity.MessageContentEx)
                {
                    txtMessage.Append("用户已经下线:" + offlineUser.Key);

                    ListViewItem lvi = new ListViewItem();
                    lvi.Text = offlineUser.Value;
                    lvi.Tag  = offlineUser.Key as object;
                    lstUsers.Invoke(new Action(() => { lstUsers.Items.Remove(lvi); }));
                }
                break;

            case ChatStateEnum.Heartbeat:
                break;

            case ChatStateEnum.CheckOffLine:
                break;

            default:
                break;
            }
        }
Exemplo n.º 9
0
        private void BroadCastChatClients()
        {
            ChatMessageEntity entity = new ChatMessageEntity();

            entity.MessageType      = ChatStateEnum.OnLine;
            entity.MessageContentEx = ChatClientCollection;

            ObjectInversion inversion = new ObjectInversion();

            byte[] byteArr = inversion.SerializeTo((object)entity);

            foreach (ChatClient ChatClient in ChatClientLists)
            {
                ChatClient.writer.Write(byteArr);
                ChatClient.writer.Flush();
            }
        }
Exemplo n.º 10
0
        public async Task <ChatMessageModel> AddChatMessage(AddMessageModel request, Guid personUid)
        {
            var chatEntity = await _chatRepository.GetChat(request.ChatUid);

            var personEntity = await _personRepository.GetPerson(personUid);

            var chatMessageUid = Guid.NewGuid();
            var date           = DateTime.UtcNow;
            var messageEntity  = new ChatMessageEntity
            {
                ChatMessageUid = chatMessageUid,
                Content        = request.Content,
                MessageTime    = date,
                ChatId         = chatEntity.ChatId,
                AuthorId       = personEntity.PersonId
            };
            await _chatRepository.AddChatMessage(messageEntity);

            var chatImageUids = new List <Guid>();

            foreach (var image in request.Images)
            {
                var chatImageUid = await _imageLogic.SaveImage(image);

                await _chatRepository.SaveChatImage(chatMessageUid, new ChatImageContentEntity { ChatImageContentUid = chatImageUid });

                chatImageUids.Add(chatImageUid);
            }
            await _chatRepository.AddLastReadChatMessage(chatEntity, personUid, messageEntity.ChatMessageId);

            await SendPushNotificationsToChatMembers(chatEntity, personEntity, request.Content);

            return(new ChatMessageModel
            {
                Images = chatImageUids,
                MessageContent = request.Content,
                MessageUid = chatMessageUid,
                PersonUid = personEntity.PersonUid,
                PersonName = personEntity.Name,
                MessageTime = date,
                PersonImageUid = personEntity.PersonImageContentEntity?.PersonImageContentUid
            });
        }
Exemplo n.º 11
0
        private void btnConnect_Click(object sender, EventArgs e)
        {
            try
            {
                client = new TcpClient(Dns.GetHostName(), ChatUtil.Port);
                txtMessage.Append("Successfully connected to Server side.");
            }
            catch (SocketException socketEx)
            {
                txtMessage.Append("Failed to connect server:" + socketEx.Data);
                return;
            }
            stream = client.GetStream();
            writer = new BinaryWriter(stream);
            ChatMessageEntity messageEntity = new ChatMessageEntity();

            messageEntity.NickName       = loginName;
            messageEntity.MessageType    = ChatStateEnum.OnLine;
            messageEntity.MessageContent = string.Empty;
            messageEntity.RemoteEndPoint = client.Client.LocalEndPoint;
            this.Text += " 【" + client.Client.LocalEndPoint + "】";
            messageEntity.timeStamp = DateTime.Now;

            WriteToStream(messageEntity);


            heartbeatTimer.Enabled = true;
            heartbeatTimer.Start();

            Task.Run(() =>
            {
                reader = new BinaryReader(stream);
                ObjectInversion inversion = new ObjectInversion();
                int bufferLen             = client.ReceiveBufferSize;
                byte[] recvBytes          = new byte[bufferLen];
                while (true)
                {
                    reader.Read(recvBytes, 0, bufferLen);
                    ChatMessageEntity entity = inversion.DeSerializeTo(recvBytes) as ChatMessageEntity;
                    AnalysisPackage(entity, null);
                }
            });
        }
Exemplo n.º 12
0
        private void ReceiveClients(object ChatClient)
        {
            ChatClient      u         = ChatClient as ChatClient;
            ObjectInversion inversion = new ObjectInversion();

            byte[] recvBytes = new byte[u.client.ReceiveBufferSize];
            while (true)  //注意,这里需要加个循环,否则之后client发送的数据无法接收
            {
                try
                {
                    u.stream.Read(recvBytes, 0, recvBytes.Length); //sync mode, 为什么一切换到async mode,就会发生乱序
                    ChatMessageEntity entity = inversion.DeSerializeTo(recvBytes) as ChatMessageEntity;
                    AnalysisPackage(entity, u);

                    //清空数组,以免脏读
                    recvBytes = new byte[u.client.ReceiveBufferSize];
                }
                catch { }
            }
        }
Exemplo n.º 13
0
        private void AnalysisPackage(ChatMessageEntity entity, ChatClient ChatClient)
        {
            switch (entity.MessageType)
            {
            case ChatStateEnum.OnLine:
                txtLog.Append(entity.NickName + "【" + entity.RemoteEndPoint + "】 has connected.");
                ChatClient.name = entity.NickName;                           //将名字做保存
                ChatClientList(ChatClient);                                  //将用户添加到上线列表
                ChatClientJoin(entity.RemoteEndPoint, entity.NickName);      //将用户添加到UI中
                ChatClientOnLineCounter.Add(ChatClient, 0);                  //开始启动计时器,检测心跳包
                BroadCastChatClients();                                      //广播用户上线信息
                break;

            case ChatStateEnum.Message:
                txtLog.Append(entity.NickName + "【" + entity.RemoteEndPoint + "】 say:\n" + entity.MessageContent);
                break;

            case ChatStateEnum.OffLine:

                break;

            case ChatStateEnum.Heartbeat:
                //syncHeartbeatSend.Set();
                txtLog.Append("收到客户端" + entity.NickName + "的心跳回应包.");
                if (ChatClientOnLineCounter.ContainsKey(ChatClient))
                {
                    ChatClientOnLineCounter[ChatClient] = 0;
                }
                else
                {
                    ChatClientOnLineCounter.Add(ChatClient, 0);
                }
                break;

            default: break;
            }
        }
Exemplo n.º 14
0
        public static async Task Run([QueueTrigger("messagesqueue", Connection = "AzureWebJobsStorage")] string myQueueItem, TraceWriter log)
        {
            log.Info($"Processing: {myQueueItem}");

            //variables
            var azureWebJobsStorage        = CloudConfigurationManager.GetSetting("AzureWebJobsStorage");
            var messagesTableContainerName = CloudConfigurationManager.GetSetting("MessagesTableContainerName");
            var messagesTablePartitionKey  = CloudConfigurationManager.GetSetting("MessagesTablePartitionKey");
            var alertsTableContainerName   = CloudConfigurationManager.GetSetting("AlertsTableContainerName");
            var alertsTablePartitionKey    = CloudConfigurationManager.GetSetting("AlertsTablePartitionKey");
            var textAnalyticsApiKey        = CloudConfigurationManager.GetSetting("TextAnalyticsApiKey");
            var textAnalyticsApiUrl        = CloudConfigurationManager.GetSetting("TextAnalyticsApiUrl");
            var luisApiKey     = CloudConfigurationManager.GetSetting("LuisApiKey");
            var luisApiUrl     = CloudConfigurationManager.GetSetting("LuisApiUrl");
            var bullyingApiKey = CloudConfigurationManager.GetSetting("BullyingApiKey");
            var bullyingApiUrl = CloudConfigurationManager.GetSetting("BullyingApiUrl");
            var storageAccount = CloudStorageAccount.Parse(azureWebJobsStorage);
            var tableClient    = storageAccount.CreateCloudTableClient();

            //parse the message JSON to a dynamic object, then entity
            dynamic queueItem         = JObject.Parse(myQueueItem);
            var     chatMessageEntity = new ChatMessageEntity(messagesTablePartitionKey, Guid.NewGuid().ToString());

            chatMessageEntity.Message = queueItem.Message;
            chatMessageEntity.Time    = queueItem.Time;
            chatMessageEntity.UserId  = queueItem.UserId;
            chatMessageEntity.ChatId  = queueItem.ChatId;

            //Get Text Analytics Sentiment data and add to entity
            var sentimentData = await GetTextAnalyticsData(textAnalyticsApiUrl, textAnalyticsApiKey, queueItem.Message.ToString(), "sentiment");

            SentimentResponse sentiment = JsonConvert.DeserializeObject <SentimentResponse>(sentimentData);

            chatMessageEntity.Sentiment = sentiment.documents[0].score;
            log.Info($"Sentiment: {chatMessageEntity.Sentiment}");

            //Get Text Analytics key phrase data and add to entity
            var keyPhrasesData = await GetTextAnalyticsData(textAnalyticsApiUrl, textAnalyticsApiKey, queueItem.Message.ToString(), "keyPhrases");

            KeyPhrasesResponse keyPhrases = JsonConvert.DeserializeObject <KeyPhrasesResponse>(keyPhrasesData);

            chatMessageEntity.KeyPhrases = string.Join(",", keyPhrases.documents[0].keyPhrases);
            log.Info($"Key Phrases: {chatMessageEntity.KeyPhrases }");

            //Do LUIS entity and intent extraction here
            var luisData = await GetLUISData(luisApiUrl, luisApiKey, queueItem.Message.ToString());

            LuisResponse luis = JsonConvert.DeserializeObject <LuisResponse>(luisData);

            if (luis.topScoringIntent.intent != "None")
            {
                //create an alert
                var alertEntity = new AlertEntity(alertsTablePartitionKey, Guid.NewGuid().ToString());
                alertEntity.AlertCategory = ResolveCategory(luis.topScoringIntent.intent);
                alertEntity.AlertText     = queueItem.Message.ToString();
                alertEntity.ChatMessageId = chatMessageEntity.RowKey.ToString();
                alertEntity.StartIndex    = -1;
                alertEntity.EndIndex      = -1;
                alertEntity.ChatId        = chatMessageEntity.ChatId;

                await LogAlert(tableClient, alertsTableContainerName, alertEntity);
            }
            if (luis.entities.Count > 0)
            {
                //create an alert for each entity
                foreach (var entity in luis.entities)
                {
                    //create an alert
                    var alertEntity = new AlertEntity(alertsTablePartitionKey, Guid.NewGuid().ToString());
                    alertEntity.AlertCategory = ResolveCategory(entity.type);
                    alertEntity.AlertText     = entity.entity;
                    alertEntity.ChatMessageId = chatMessageEntity.RowKey.ToString();
                    alertEntity.StartIndex    = entity.startIndex;
                    alertEntity.EndIndex      = entity.endIndex;
                    alertEntity.ChatId        = chatMessageEntity.ChatId;

                    await LogAlert(tableClient, alertsTableContainerName, alertEntity);
                }
            }

            //bullying detection
            var bullyingData = await GetBullyingData(bullyingApiUrl, bullyingApiKey, queueItem.Message.ToString());

            // Create the TableOperation object that inserts the entity
            var messagesTable          = tableClient.GetTableReference(messagesTableContainerName);
            var messageInsertOperation = TableOperation.Insert(chatMessageEntity);

            messagesTable.Execute(messageInsertOperation);

            log.Info($"Processed: {myQueueItem}");
        }
Exemplo n.º 15
0
 /// <inheritdoc />
 public ChatMessageEntity AddChatMessage(ChatMessageEntity message)
 {
     return(InsertWithSelect(message));
 }