diff --git a/lib/commands.ex b/lib/commands.ex index c12be98..79661f7 100644 --- a/lib/commands.ex +++ b/lib/commands.ex @@ -42,7 +42,43 @@ defmodule PlantIdDiscordBot.Consumer.Commands do %{ name: "diseases", description: "Identify diseases from photos", - options: [] + options: [ + %{ + # ATTACHMENT (Image 1 - Required) + type: 11, + name: "image1", + description: "First photo of the plant", + required: true + }, + %{ + # ATTACHMENT (Image 2 - Optional) + type: 11, + name: "image2", + description: "Second photo (optional)", + required: false + }, + %{ + # ATTACHMENT (Image 3 - Optional) + type: 11, + name: "image3", + description: "Third photo (optional)", + required: false + }, + %{ + # ATTACHMENT (Image 4 - Optional) + type: 11, + name: "image4", + description: "Fourth photo (optional)", + required: false + }, + %{ + # ATTACHMENT (Image 5 - Optional) + type: 11, + name: "image5", + description: "Fifth photo (optional)", + required: false + } + ] }, %{ name: "projects", diff --git a/lib/plantid_discord_bot/cogs/diseases.ex b/lib/plantid_discord_bot/cogs/diseases.ex index b302c6c..68247e1 100644 --- a/lib/plantid_discord_bot/cogs/diseases.ex +++ b/lib/plantid_discord_bot/cogs/diseases.ex @@ -3,14 +3,34 @@ defmodule PlantIdDiscordBot.Cog.Diseases do Functions for using the /diseases application command. """ - alias PlantIdDiscordBot.PlantNet.Projects + alias PlantIdDiscordBot.Cog.PlantNetMessage + @api Application.compile_env(:plantid_discord_bot, :api) - @doc """ - Sends an invite link for this bot. - """ def diseases(interaction) do - message = "Diseases coming soon." - @api.create_interaction_response(interaction, %{type: 4, data: %{content: message}}) + # 1. Acknowledge immediately so the token doesn't expire + @api.create_interaction_response(interaction, %{ + type: 4, + data: %{content: "Analyzing plant health from photos..."} + }) + + resolved = Map.get(interaction.data, :resolved) + attachments_map = (resolved && Map.get(resolved, :attachments)) || %{} + options = interaction.data.options || [] + + images = + options + |> Enum.filter(fn opt -> String.starts_with?(opt.name, "image") end) + |> Enum.map(fn opt -> Map.get(attachments_map, opt.value) end) + |> Enum.reject(&is_nil/1) + + message = %{ + guild_id: interaction.guild_id, + channel_id: interaction.channel_id, + id: nil, + attachments: images + } + + PlantNetMessage.id(message, "diseases") end end diff --git a/lib/plantid_discord_bot/cogs/plantnet_message.ex b/lib/plantid_discord_bot/cogs/plantnet_message.ex index c84dd98..3724d4e 100644 --- a/lib/plantid_discord_bot/cogs/plantnet_message.ex +++ b/lib/plantid_discord_bot/cogs/plantnet_message.ex @@ -88,13 +88,17 @@ defmodule PlantIdDiscordBot.Cog.PlantNetMessage do end end - defp get_response(query_uri, message) do + defp get_response(query_uri, message, interaction_type \\ nil) do guild_id = message.guild_id guild_name = Guild.get_guild_name!(guild_id) case HTTPoison.get(query_uri) do {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> - response_message = Parser.parse(body) + response_message = + case interaction_type do + "diseases" -> Parser.parse_disease_response(body) + _ -> Parser.parse(body) + end RateLimiter.increase_counter(guild_id) Metrics.increase_request_count(guild_id, guild_name) @@ -107,7 +111,7 @@ defmodule PlantIdDiscordBot.Cog.PlantNetMessage do guild_name: guild_name ) - send_message("Unauthorizes requesnt to PlantNet API", message.channel_id, message.id) + send_message("Unauthorized requesnt to PlantNet API", message.channel_id, message.id) {:ok, %HTTPoison.Response{status_code: 404}} -> RateLimiter.increase_counter(guild_id) diff --git a/lib/plantnet/parser.ex b/lib/plantnet/parser.ex index cf9472d..4f55f8e 100644 --- a/lib/plantnet/parser.ex +++ b/lib/plantnet/parser.ex @@ -30,6 +30,18 @@ defmodule PlantIdDiscordBot.PlantNet.Parser do @powo_base_url "https://powo.science.kew.org/taxon" @score_threshold Application.compile_env(:plantid_discord_bot, :score_threshold) + def parse_disease_response(response) do + response + |> to_map!() + |> filter_by_score() + |> generate_disease_response_message() + end + + def generate_disease_response_message(data) do + data + |> to_string() + end + @doc """ Parses the response from the PlantNet API into a map. """