added sending of messages
This commit is contained in:
parent
dee39d988d
commit
6c523af453
@ -15,12 +15,20 @@ public class ChatRoomLogic
|
||||
thread.Start();
|
||||
}
|
||||
|
||||
int NextId()
|
||||
{
|
||||
int id = state.lastUniqueId;
|
||||
state.lastUniqueId++;
|
||||
return id;
|
||||
}
|
||||
|
||||
public int RegisterClient(string name)
|
||||
{
|
||||
lock (state.accessLock)
|
||||
{
|
||||
int clientId = state.lastUniqueId;
|
||||
state.clients.Add(new Client{
|
||||
int clientId = NextId();
|
||||
state.clients.Add(new Client
|
||||
{
|
||||
id = clientId,
|
||||
name = name
|
||||
});
|
||||
@ -29,6 +37,54 @@ public class ChatRoomLogic
|
||||
}
|
||||
}
|
||||
|
||||
Client? FindClientById(int clientId)
|
||||
{
|
||||
foreach (var client in state.clients)
|
||||
{
|
||||
if (client.id == clientId)
|
||||
{
|
||||
return client;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public bool SendMessage(int clientId, string contents, bool needsToBeCensored)
|
||||
{
|
||||
lock (state.accessLock)
|
||||
{
|
||||
var client = FindClientById(clientId);
|
||||
if (client == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (client.blockedUntil != null)
|
||||
{
|
||||
if (DateTime.UtcNow < client.blockedUntil)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
client.blockedUntil = null;
|
||||
}
|
||||
}
|
||||
|
||||
state.messages.Add(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}");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void BackgroundTask()
|
||||
{
|
||||
while (true)
|
||||
|
@ -1,8 +1,6 @@
|
||||
namespace ChatRoom;
|
||||
|
||||
using ChatRoomContract;
|
||||
|
||||
public class ChatRoomService : IChatRoomService
|
||||
public class ChatRoomService : ChatRoomContract.IChatRoomService
|
||||
{
|
||||
//NOTE: instance-per-request service would need logic to be static or injected from a singleton instance
|
||||
private readonly ChatRoomLogic logic = new ChatRoomLogic();
|
||||
@ -17,7 +15,7 @@ public class ChatRoomService : IChatRoomService
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public Message? GetNewMessage()
|
||||
public ChatRoomContract.Message? GetNewMessage()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
@ -32,8 +30,8 @@ public class ChatRoomService : IChatRoomService
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool SendMessage(int clientId, string contents)
|
||||
public bool SendMessage(int clientId, string contents, bool needsToBeCensored)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
return logic.SendMessage(clientId, contents, needsToBeCensored);
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,24 @@ public class Client
|
||||
public int id;
|
||||
public string name;
|
||||
public int strikes = 0;
|
||||
|
||||
public DateTime? blockedUntil = null;
|
||||
}
|
||||
|
||||
public enum MessageStatus
|
||||
{
|
||||
WaitingApproval,
|
||||
Approved,
|
||||
Rejected
|
||||
}
|
||||
|
||||
public class Message
|
||||
{
|
||||
public int id;
|
||||
public int clientId;
|
||||
public string contents;
|
||||
public bool needsToBeCensored;
|
||||
public MessageStatus status = MessageStatus.WaitingApproval;
|
||||
}
|
||||
|
||||
public class ChatRoomState
|
||||
@ -20,4 +38,6 @@ public class ChatRoomState
|
||||
public int lastUniqueId;
|
||||
|
||||
public List<Client> clients = new List<Client>();
|
||||
|
||||
public List<Message> messages = new List<Message>();
|
||||
}
|
||||
|
@ -66,6 +66,8 @@ public class Server
|
||||
/// <param name="args">Command line arguments.</param>
|
||||
private void StartServer(string[] args)
|
||||
{
|
||||
Console.Title = "Chat Room";
|
||||
|
||||
///create web app builder
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
|
@ -13,7 +13,7 @@ public interface IChatRoomService
|
||||
|
||||
int GetStrikes(int clientId);
|
||||
|
||||
bool SendMessage(int clientId, string contents);
|
||||
bool SendMessage(int clientId, string contents, bool needsToBeCensored);
|
||||
|
||||
Message? GetNewMessage();
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Bogus" Version="35.6.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
|
||||
<PackageReference Include="NLog" Version="5.3.4" />
|
||||
<PackageReference Include="SimpleRpc" Version="1.0.0-beta1" />
|
||||
|
@ -5,25 +5,12 @@ using SimpleRpc.Transports.Http.Client;
|
||||
using SimpleRpc.Serialization.Hyperion;
|
||||
using SimpleRpc.Transports;
|
||||
using System.Diagnostics;
|
||||
using Bogus;
|
||||
|
||||
namespace Participant;
|
||||
|
||||
internal class Participant
|
||||
{
|
||||
private readonly List<string> FIRSTNAMES =
|
||||
new List<string> {
|
||||
"John", "Peter", "Jack", "Steve"
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// A set of surnames to choose from.
|
||||
/// </summary>
|
||||
private readonly List<string> LASTNAMES =
|
||||
new List<String> {
|
||||
"Johnson", "Peterson", "Jackson", "Steveson"
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Logger for this class.
|
||||
/// </summary>
|
||||
@ -49,17 +36,25 @@ internal class Participant
|
||||
|
||||
private void RunConnection(IChatRoomService chatRoom)
|
||||
{
|
||||
var faker = new Faker("en");
|
||||
var rnd = new Random();
|
||||
|
||||
var name = FIRSTNAMES[rnd.Next(FIRSTNAMES.Count)] + " " + LASTNAMES[rnd.Next(LASTNAMES.Count)];
|
||||
|
||||
var name = faker.Name.FullName();
|
||||
int clientId = chatRoom.RegisterClient(name);
|
||||
log.Info($"Registered with client id {clientId}");
|
||||
|
||||
Console.Title = $"Participant | {name} | {clientId}";
|
||||
while (true)
|
||||
{
|
||||
var message = string.Join(" ", faker.Lorem.Words(5));
|
||||
bool needsToBeCensored = rnd.Next(0, 100) > 50;
|
||||
if (chatRoom.SendMessage(clientId, message, needsToBeCensored)) {
|
||||
log.Info("Sent message");
|
||||
} else {
|
||||
log.Info("Failed to send message, blocked");
|
||||
}
|
||||
|
||||
Thread.Sleep(2 * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Bogus" Version="35.6.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
|
||||
<PackageReference Include="NLog" Version="5.3.4" />
|
||||
<PackageReference Include="SimpleRpc" Version="1.0.0-beta1" />
|
||||
|
Loading…
Reference in New Issue
Block a user