From 619e735fd5f95784740b2b002a0e6a47667b7b06 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Sun, 15 Sep 2024 15:09:33 +0300 Subject: [PATCH] add approving of messages --- Lab1/ChatRoom/ChatRoomLogic.cs | 70 +++++++++++++++++++++++++------- Lab1/ChatRoom/ChatRoomService.cs | 2 +- Lab1/ChatRoom/ChatRoomState.cs | 6 +-- Lab1/Moderator/Moderator.cs | 2 + 4 files changed, 62 insertions(+), 18 deletions(-) diff --git a/Lab1/ChatRoom/ChatRoomLogic.cs b/Lab1/ChatRoom/ChatRoomLogic.cs index f461c47..cb5cabc 100644 --- a/Lab1/ChatRoom/ChatRoomLogic.cs +++ b/Lab1/ChatRoom/ChatRoomLogic.cs @@ -1,4 +1,5 @@ -using NLog; +using Castle.DynamicProxy.Generators.Emitters.SimpleAST; +using NLog; namespace ChatRoom; @@ -49,6 +50,18 @@ public class ChatRoomLogic return null; } + Message? FindMessageById(int messageId) + { + foreach (var message in state.messages) + { + if (message.id == messageId) + { + return message; + } + } + return null; + } + public bool SendMessage(int clientId, string contents, bool needsToBeCensored) { lock (state.accessLock) @@ -71,15 +84,16 @@ public class ChatRoomLogic } } - state.messages.Add(new Message + var message = new Message { id = NextId(), clientId = clientId, contents = contents, needsToBeCensored = needsToBeCensored, - status = MessageStatus.WaitingApproval - }); - log.Info($"Client '{client.name}' ({client.id}) sent message '{contents}'. Needs to censored: {needsToBeCensored}"); + status = MessageStatus.WaitingForModerator + }; + state.messages.Add(message); + log.Info($"Client '{client.name}' ({client.id}) sent message '{contents}' ({message.id}). Needs to censored: {needsToBeCensored}"); } return true; @@ -87,27 +101,55 @@ public class ChatRoomLogic public ChatRoomContract.Message? GetNewMessage() { - foreach (var message in state.messages) + lock (state.accessLock) { - if (message.given) continue; - if (message.status != MessageStatus.WaitingApproval) continue; + foreach (var message in state.messages) + { + if (message.status != MessageStatus.WaitingForModerator) continue; - message.given = true; - return new ChatRoomContract.Message{ - id = message.id, - contents = message.contents, - needsToBeCensored = message.needsToBeCensored - }; + message.status = MessageStatus.GivenToModerator; + return new ChatRoomContract.Message{ + id = message.id, + contents = message.contents, + needsToBeCensored = message.needsToBeCensored + }; + } } return null; } + public void ApproveMessage(int messageId) + { + lock (state.accessLock) + { + var message = FindMessageById(messageId); + if (message == null) + { + return; + } + + if (message.status != MessageStatus.GivenToModerator) + { + return; + } + + message.status = MessageStatus.Approved; + log.Info($"Message {message.id} was approved"); + } + } + public void BackgroundTask() { while (true) { + lock (state.accessLock) + { + int count = state.messages.RemoveAll(msg => msg.status == MessageStatus.Approved || msg.status == MessageStatus.Rejected); + log.Info($"Running periodic cleanup, removed {count} messages"); + } + Thread.Sleep(10 * 1000); } } } diff --git a/Lab1/ChatRoom/ChatRoomService.cs b/Lab1/ChatRoom/ChatRoomService.cs index b6bd741..e35a7cd 100644 --- a/Lab1/ChatRoom/ChatRoomService.cs +++ b/Lab1/ChatRoom/ChatRoomService.cs @@ -12,7 +12,7 @@ public class ChatRoomService : ChatRoomContract.IChatRoomService public void ApproveMessage(int messageId) { - throw new NotImplementedException(); + logic.ApproveMessage(messageId); } public ChatRoomContract.Message? GetNewMessage() diff --git a/Lab1/ChatRoom/ChatRoomState.cs b/Lab1/ChatRoom/ChatRoomState.cs index 566ba00..fb4d6c6 100644 --- a/Lab1/ChatRoom/ChatRoomState.cs +++ b/Lab1/ChatRoom/ChatRoomState.cs @@ -11,7 +11,8 @@ public class Client public enum MessageStatus { - WaitingApproval, + WaitingForModerator, + GivenToModerator, Approved, Rejected } @@ -22,8 +23,7 @@ public class Message public int clientId; public string contents; public bool needsToBeCensored; - public bool given = false; - public MessageStatus status = MessageStatus.WaitingApproval; + public MessageStatus status = MessageStatus.WaitingForModerator; } public class ChatRoomState diff --git a/Lab1/Moderator/Moderator.cs b/Lab1/Moderator/Moderator.cs index fd02805..0951e0b 100644 --- a/Lab1/Moderator/Moderator.cs +++ b/Lab1/Moderator/Moderator.cs @@ -64,6 +64,8 @@ internal class Moderator if (message != null) { log.Info($"Checking message ({message.id}): {message.contents}"); + + chatRoom.ApproveMessage(message.id); } Thread.Sleep(1 * 1000);