mirror of
https://github.com/TheRealOwenRees/plantid-discord-bot.git
synced 2026-07-23 04:26:57 +00:00
Feature/diseases (#19)
* add disease photo options * basic disease application command, no real parsing other than map to string
This commit is contained in:
+37
-1
@@ -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",
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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.
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user