Feature/diseases (#19)

* add disease photo options

* basic disease application command, no real parsing other than map to string
This commit is contained in:
2025-12-08 16:32:16 +01:00
committed by GitHub
parent 3e6116423a
commit 9aa41d29f6
4 changed files with 82 additions and 10 deletions
+37 -1
View File
@@ -42,7 +42,43 @@ defmodule PlantIdDiscordBot.Consumer.Commands do
%{ %{
name: "diseases", name: "diseases",
description: "Identify diseases from photos", 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", name: "projects",
+26 -6
View File
@@ -3,14 +3,34 @@ defmodule PlantIdDiscordBot.Cog.Diseases do
Functions for using the /diseases application command. Functions for using the /diseases application command.
""" """
alias PlantIdDiscordBot.PlantNet.Projects alias PlantIdDiscordBot.Cog.PlantNetMessage
@api Application.compile_env(:plantid_discord_bot, :api) @api Application.compile_env(:plantid_discord_bot, :api)
@doc """
Sends an invite link for this bot.
"""
def diseases(interaction) do def diseases(interaction) do
message = "Diseases coming soon." # 1. Acknowledge immediately so the token doesn't expire
@api.create_interaction_response(interaction, %{type: 4, data: %{content: message}}) @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
end end
@@ -88,13 +88,17 @@ defmodule PlantIdDiscordBot.Cog.PlantNetMessage do
end end
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_id = message.guild_id
guild_name = Guild.get_guild_name!(guild_id) guild_name = Guild.get_guild_name!(guild_id)
case HTTPoison.get(query_uri) do case HTTPoison.get(query_uri) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} -> {: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) RateLimiter.increase_counter(guild_id)
Metrics.increase_request_count(guild_id, guild_name) Metrics.increase_request_count(guild_id, guild_name)
@@ -107,7 +111,7 @@ defmodule PlantIdDiscordBot.Cog.PlantNetMessage do
guild_name: guild_name 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}} -> {:ok, %HTTPoison.Response{status_code: 404}} ->
RateLimiter.increase_counter(guild_id) RateLimiter.increase_counter(guild_id)
+12
View File
@@ -30,6 +30,18 @@ defmodule PlantIdDiscordBot.PlantNet.Parser do
@powo_base_url "https://powo.science.kew.org/taxon" @powo_base_url "https://powo.science.kew.org/taxon"
@score_threshold Application.compile_env(:plantid_discord_bot, :score_threshold) @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 """ @doc """
Parses the response from the PlantNet API into a map. Parses the response from the PlantNet API into a map.
""" """