You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

InteractionConverter.cs 2.8 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. using System;
  4. namespace Discord.Net.Converters
  5. {
  6. internal class InteractionConverter : JsonConverter
  7. {
  8. public static InteractionConverter Instance => new InteractionConverter();
  9. public override bool CanRead => true;
  10. public override bool CanWrite => false;
  11. public override bool CanConvert(Type objectType) => true;
  12. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  13. {
  14. if (reader.TokenType == JsonToken.Null)
  15. return null;
  16. var obj = JObject.Load(reader);
  17. var interaction = new API.Interaction();
  18. // Remove the data property for manual deserialization
  19. var result = obj.GetValue("data", StringComparison.OrdinalIgnoreCase);
  20. result?.Parent.Remove();
  21. // Populate the remaining properties.
  22. using (var subReader = obj.CreateReader())
  23. {
  24. serializer.Populate(subReader, interaction);
  25. }
  26. // Process the Result property
  27. if (result != null)
  28. {
  29. switch (interaction.Type)
  30. {
  31. case InteractionType.ApplicationCommand:
  32. {
  33. var appCommandData = new API.ApplicationCommandInteractionData();
  34. serializer.Populate(result.CreateReader(), appCommandData);
  35. interaction.Data = appCommandData;
  36. }
  37. break;
  38. case InteractionType.MessageComponent:
  39. {
  40. var messageComponent = new API.MessageComponentInteractionData();
  41. serializer.Populate(result.CreateReader(), messageComponent);
  42. interaction.Data = messageComponent;
  43. }
  44. break;
  45. case InteractionType.ApplicationCommandAutocomplete:
  46. {
  47. var autocompleteData = new API.AutocompleteInteractionData();
  48. serializer.Populate(result.CreateReader(), autocompleteData);
  49. interaction.Data = autocompleteData;
  50. }
  51. break;
  52. }
  53. }
  54. else
  55. interaction.Data = Optional<IDiscordInteractionData>.Unspecified;
  56. return interaction;
  57. }
  58. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
  59. }
  60. }