public ChatMessageEntity AddChatMessage(ChatMessageEntity message) { lock (ChatMessages) { ChatMessages.Add(message); return(ChatMessages.Last()); } }
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(); }
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); }
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; } }
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); } }
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; } }
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; } }
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(); } }
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 }); }
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); } }); }
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 { } } }
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; } }
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}"); }
/// <inheritdoc /> public ChatMessageEntity AddChatMessage(ChatMessageEntity message) { return(InsertWithSelect(message)); }