ClientMessageHandler.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using GodotTools.IdeMessaging.Requests;
  4. using Newtonsoft.Json;
  5. namespace GodotTools.IdeMessaging
  6. {
  7. // ReSharper disable once UnusedType.Global
  8. public abstract class ClientMessageHandler : IMessageHandler
  9. {
  10. private readonly Dictionary<string, Peer.RequestHandler> requestHandlers;
  11. protected ClientMessageHandler()
  12. {
  13. requestHandlers = InitializeRequestHandlers();
  14. }
  15. public async Task<MessageContent> HandleRequest(Peer peer, string id, MessageContent content, ILogger logger)
  16. {
  17. if (!requestHandlers.TryGetValue(id, out var handler))
  18. {
  19. logger.LogError($"Received unknown request: {id}");
  20. return new MessageContent(MessageStatus.RequestNotSupported, "null");
  21. }
  22. try
  23. {
  24. var response = await handler(peer, content);
  25. return new MessageContent(response.Status, JsonConvert.SerializeObject(response));
  26. }
  27. catch (JsonException)
  28. {
  29. logger.LogError($"Received request with invalid body: {id}");
  30. return new MessageContent(MessageStatus.InvalidRequestBody, "null");
  31. }
  32. }
  33. private Dictionary<string, Peer.RequestHandler> InitializeRequestHandlers()
  34. {
  35. return new Dictionary<string, Peer.RequestHandler>
  36. {
  37. [OpenFileRequest.Id] = async (peer, content) =>
  38. {
  39. var request = JsonConvert.DeserializeObject<OpenFileRequest>(content.Body);
  40. return await HandleOpenFile(request);
  41. }
  42. };
  43. }
  44. protected abstract Task<Response> HandleOpenFile(OpenFileRequest request);
  45. }
  46. }