using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using ChatRoomContract.Protocol;
namespace ChatRoom;
public class ChatRoomService : ChatRoomContract.Protocol.ChatRoom.ChatRoomBase
{
//NOTE: instance-per-request service would need logic to be static or injected from a singleton instance
private readonly ChatRoomLogic logic = new ChatRoomLogic();
///
/// Register client with a name
///
/// Name of client.
/// Call context.
/// Client ID
public override Task RegisterClient(RegisterClientRequest request, ServerCallContext context)
{
var result = new ClientId { Id = logic.RegisterClient(request.Name) };
return Task.FromResult(result);
}
///
/// Get number of strikes a participant has
///
/// Client ID
/// Call context.
/// Number of strikes
public override Task GetStrikes(ClientId request, ServerCallContext context)
{
var result = new Srikes { Strikes = logic.GetStrikes(request.Id) };
return Task.FromResult(result);
}
///
/// Get timestamp until when the client is blocked
///
/// Client ID
/// Call context.
/// Optional datetime object
public override Task GetBlockedUntil(ClientId request, ServerCallContext context)
{
var timestamp = logic.GetBlockedUntil(request.Id);
var result = new BlockedUntil { HasTimestamp = false };
if (timestamp != null)
{
result.HasTimestamp = true;
result.Timestamp = Timestamp.FromDateTime(timestamp.Value);
}
return Task.FromResult(result);
}
///
/// Send a message, will be given to a moderator to be approved
///
/// Message details
/// Call context.
/// Was sending successful, can fail if user is blocked
public override Task SendMessage(UserMessageRequest request, ServerCallContext context)
{
var success = logic.SendMessage(request.ClientId, request.Contents, request.NeedsToBeCensored);
var result = new BoolResponse { Success = success };
return Task.FromResult(result);
}
///
/// Get the next message which hasn't been approved or rejected
///
/// Empty
/// Call context.
/// Message object. Returns null if there is no message
public override Task GetNewMessage(Empty request, ServerCallContext context)
{
var message = logic.GetNewMessage();
var result = new NewUserMessage { HasMessage = false, Message = new UserMessage() };
if (message != null)
{
result.HasMessage = true;
result.Message.Id = message.id;
result.Message.Contents = message.contents;
result.Message.NeedsToBeCensored = message.needsToBeCensored;
}
return Task.FromResult(result);
}
///
/// Reject a message
///
/// Message ID
/// Call context.
/// Empty
public override Task ApproveMessage(MessageId request, ServerCallContext context)
{
logic.ApproveMessage(request.Id);
return Task.FromResult(new Empty());
}
///
/// Approve a message
///
/// Message ID
/// Call context.
/// Empty
public override Task RejectMessage(MessageId request, ServerCallContext context)
{
logic.RejectMessage(request.Id);
return Task.FromResult(new Empty());
}
}