using ChatRoomContract.Protocol; using Google.Protobuf.WellKnownTypes; using Grpc.Net.Client; namespace ChatRoomContract; public class ChatRoomGrpcClient : IChatRoomService { GrpcChannel channel; ChatRoom.ChatRoomClient client; public ChatRoomGrpcClient(string address) { channel = GrpcChannel.ForAddress(address); client = new ChatRoom.ChatRoomClient(channel); } /// /// Approve a message /// /// Message ID public void ApproveMessage(int messageId) { client.ApproveMessage(new MessageId { Id = messageId }); } /// /// Get timestamp until when the client is blocked /// /// Client ID /// Optional datetime object public DateTime? GetBlockedUntil(int clientId) { var result = client.GetBlockedUntil(new ClientId { Id = clientId }); if (result.HasTimestamp) { return result.Timestamp.ToDateTime(); } else { return null; } } /// /// Get the next message which hasn't been approved or rejected /// /// Message object. Returns null if there is no message public Message? GetNewMessage() { var result = client.GetNewMessage(new Empty()); if (result.HasMessage) { return new Message { id = result.Message.Id, contents = result.Message.Contents, needsToBeCensored = result.Message.NeedsToBeCensored }; } else { return null; } } /// /// Get number of strikes a participant has /// /// Client ID /// Number of strikes public int GetStrikes(int clientId) { var result = client.GetStrikes(new ClientId { Id = clientId }); return result.Strikes; } /// /// Register client with a name /// /// Name of client, can be duplicate between clients /// Client ID public int RegisterClient(string name) { var result = client.RegisterClient(new RegisterClientRequest { Name = name }); return result.Id; } /// /// Reject a message /// /// Message ID public void RejectMessage(int messageId) { client.RejectMessage(new MessageId { Id = messageId }); } /// /// Send a message, will be given to a moderator to be approved /// /// Client ID /// Message contents /// Does this message need to be censored? /// Was sending successful, can fail if user is blocked public bool SendMessage(int clientId, string contents, bool needsToBeCensored) { var result = client.SendMessage(new UserMessageRequest { ClientId = clientId, Contents = contents, NeedsToBeCensored = needsToBeCensored }); return result.Success; } }