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()); } }