From b68b74d70603dfe37362126e95c4476c344e99cb Mon Sep 17 00:00:00 2001 From: Mazawrath Date: Fri, 11 Jan 2019 15:14:23 -0500 Subject: [PATCH 1/4] Cleaned up analyze command and put image requests into their own class --- src/main/java/com/mazawrath/beanbot/Main.java | 2 +- .../commands/googlevision/AnalyzeCommand.java | 80 +------------ .../beanbot/utilities/GoogleCloudVision.java | 29 ++--- .../beanbot/utilities/ImageRequest.java | 113 ++++++++++++++++++ 4 files changed, 126 insertions(+), 98 deletions(-) create mode 100644 src/main/java/com/mazawrath/beanbot/utilities/ImageRequest.java diff --git a/src/main/java/com/mazawrath/beanbot/Main.java b/src/main/java/com/mazawrath/beanbot/Main.java index 1dc60e4..047fb8f 100644 --- a/src/main/java/com/mazawrath/beanbot/Main.java +++ b/src/main/java/com/mazawrath/beanbot/Main.java @@ -72,7 +72,7 @@ public static void main(String[] args) { // Bean Lottery Commands cmdHandler.registerCommand(new BeanLotteryCommand(points, lottery)); // Google Vision Commands - cmdHandler.registerCommand(new AnalyzeCommand(points, cloudVision)); + cmdHandler.registerCommand(new AnalyzeCommand(points)); // Admin commands cmdHandler.registerCommand(new AdminPostChangeLogCommand()); cmdHandler.registerCommand(new AdminDeleteMessageCommand()); diff --git a/src/main/java/com/mazawrath/beanbot/commands/googlevision/AnalyzeCommand.java b/src/main/java/com/mazawrath/beanbot/commands/googlevision/AnalyzeCommand.java index 04764f4..6c7435d 100644 --- a/src/main/java/com/mazawrath/beanbot/commands/googlevision/AnalyzeCommand.java +++ b/src/main/java/com/mazawrath/beanbot/commands/googlevision/AnalyzeCommand.java @@ -1,35 +1,25 @@ package com.mazawrath.beanbot.commands.googlevision; -import com.google.cloud.vision.v1.AnnotateImageResponse; -import com.google.cloud.vision.v1.EntityAnnotation; -import com.google.cloud.vision.v1.SafeSearchAnnotation; -import com.google.cloud.vision.v1.WebDetection; -import com.mazawrath.beanbot.utilities.GoogleCloudVision; +import com.mazawrath.beanbot.utilities.ImageRequest; import com.mazawrath.beanbot.utilities.Points; import de.btobastian.sdcf4j.Command; import de.btobastian.sdcf4j.CommandExecutor; -import org.apache.commons.lang3.text.WordUtils; import org.javacord.api.DiscordApi; import org.javacord.api.entity.channel.ServerTextChannel; import org.javacord.api.entity.message.Message; -import org.javacord.api.entity.message.embed.EmbedBuilder; import org.javacord.api.entity.server.Server; import org.javacord.api.entity.user.User; import javax.activation.MimetypesFileTypeMap; -import java.awt.*; import java.io.File; import java.net.MalformedURLException; import java.net.URL; -import java.util.List; public class AnalyzeCommand implements CommandExecutor { private Points points; - private GoogleCloudVision cloudVision; - public AnalyzeCommand(Points points, GoogleCloudVision cloudVision) { + public AnalyzeCommand(Points points) { this.points = points; - this.cloudVision = cloudVision; } @Command( @@ -63,17 +53,11 @@ else if (args.length > 0) { serverTextChannel.sendMessage("Analyzing image..."); - List labelAnnotation; - AnnotateImageResponse faceDetection; - SafeSearchAnnotation safeSearchAnnotation; - WebDetection webDetection; + ImageRequest imageRequest; if (urlContainsImage(url)) { try { - labelAnnotation = cloudVision.getLabelDetection(url); - faceDetection = cloudVision.getFaceDetection(url); - safeSearchAnnotation = cloudVision.detectSafeSearch(url); - webDetection = cloudVision.getWebDetection(url); + imageRequest = new ImageRequest(url); } catch (Exception e) { e.printStackTrace(); serverTextChannel.sendMessage("Something went wrong."); @@ -84,61 +68,7 @@ else if (args.length > 0) { return; } - EmbedBuilder embed = new EmbedBuilder() - .setTitle("Image Analysis") - .setColor(Color.BLUE); - - StringBuilder labels = new StringBuilder(); - for (int i = 0; i < labelAnnotation.size(); i++) { - if (i != labelAnnotation.size() - 1) { - labels.append(labelAnnotation.get(i).getDescription()).append(" (").append(Math.round(labelAnnotation.get(0).getScore() * 100)).append("%), "); - } else - labels.append(labelAnnotation.get(i).getDescription()).append(" (").append(Math.round(labelAnnotation.get(0).getScore() * 100)).append("%)"); - } - - embed.addField("Things I See", labels.toString()); - - embed.addInlineField("Faces I See", String.valueOf(faceDetection.getFaceAnnotationsCount())); - - for (int i = 0; i < faceDetection.getFaceAnnotationsCount(); i++) { - StringBuilder emotionsSeen = new StringBuilder(); - if (faceDetection.getFaceAnnotations(i).getJoyLikelihoodValue() > 1) - emotionsSeen.append("joy, "); - if (faceDetection.getFaceAnnotations(i).getSorrowLikelihoodValue() > 1) - emotionsSeen.append("sorrow, "); - if (faceDetection.getFaceAnnotations(i).getAngerLikelihoodValue() > 1) - emotionsSeen.append("anger, "); - if (faceDetection.getFaceAnnotations(i).getSurpriseLikelihoodValue() > 1) - emotionsSeen.append("surprise, "); - - if (emotionsSeen.length() != 0) - embed.addInlineField("Face " + (i + 1) + "'s Possible Emotions", WordUtils.capitalizeFully(emotionsSeen.substring(0, emotionsSeen.length() - 2))); - else - embed.addInlineField("Face " + (i + 1) + "'s Possible Emotions", "none"); - } - embed.addInlineField("Best Guess", webDetection.getBestGuessLabels(0).getLabel()); - - StringBuilder webLabels = new StringBuilder(); - for (int i = 0; i < webDetection.getWebEntitiesCount(); i++) { - if (i != webDetection.getWebEntitiesCount() - 1) - webLabels.append(webDetection.getWebEntities(i).getDescription()).append(" (").append(Math.round(webDetection.getWebEntities(i).getScore() * 100)).append("%), "); - else - webLabels.append(webDetection.getWebEntities(i).getDescription()).append(" (").append(Math.round(webDetection.getWebEntities(i).getScore() * 100)).append("%)"); - } - embed.addField("Things I Think This Is", webLabels.toString()); - - if (safeSearchAnnotation.getAdultValue() > 2) - embed.addInlineField("Adult Content", WordUtils.capitalizeFully(safeSearchAnnotation.getAdult().name().replaceAll("_", " "))); - if (safeSearchAnnotation.getSpoofValue() > 2) - embed.addInlineField("Spoof / Edited Photo", WordUtils.capitalizeFully(safeSearchAnnotation.getSpoof().name().replaceAll("_", " "))); - if (safeSearchAnnotation.getMedicalValue() > 2) - embed.addInlineField("Medical / Surgery", WordUtils.capitalizeFully(safeSearchAnnotation.getMedical().name().replaceAll("_", " "))); - if (safeSearchAnnotation.getViolenceValue() > 2) - embed.addInlineField("Violence / Blood / Gore", WordUtils.capitalizeFully(safeSearchAnnotation.getViolence().name().replaceAll("_", " "))); - if (safeSearchAnnotation.getRacyValue() > 2) - embed.addInlineField("Skimpy / Nudity", WordUtils.capitalizeFully(safeSearchAnnotation.getRacy().name().replaceAll("_", " "))); - - serverTextChannel.sendMessage(embed); + serverTextChannel.sendMessage(imageRequest.buildEmbed()); } private boolean urlContainsImage(URL url) { diff --git a/src/main/java/com/mazawrath/beanbot/utilities/GoogleCloudVision.java b/src/main/java/com/mazawrath/beanbot/utilities/GoogleCloudVision.java index cbe7ed5..5608656 100644 --- a/src/main/java/com/mazawrath/beanbot/utilities/GoogleCloudVision.java +++ b/src/main/java/com/mazawrath/beanbot/utilities/GoogleCloudVision.java @@ -19,7 +19,7 @@ public GoogleCloudVision() { System.setProperty("http.agent", "Chrome"); } - public List getLabelDetection(URL image) { + List getLabelDetection(URL image) { try (ImageAnnotatorClient vision = ImageAnnotatorClient.create()) { ByteString imgBytes = ByteString.copyFrom(Objects.requireNonNull(downloadFile(image))); @@ -38,21 +38,14 @@ public List getLabelDetection(URL image) { BatchAnnotateImagesResponse response = vision.batchAnnotateImages(requests); List responses = response.getResponsesList(); - for (AnnotateImageResponse res : responses) { - if (res.hasError()) { - System.out.printf("Error: %s\n", res.getError().getMessage()); - return null; - } - - return res.getLabelAnnotationsList(); - } + return responses.get(0).getLabelAnnotationsList(); } catch (IOException e) { e.printStackTrace(); } return null; } - public SafeSearchAnnotation detectSafeSearch(URL image) throws IOException { + SafeSearchAnnotation detectSafeSearch(URL image) throws IOException { List requests = new ArrayList<>(); ByteString imgBytes = ByteString.copyFrom(Objects.requireNonNull(downloadFile(image))); @@ -67,19 +60,11 @@ public SafeSearchAnnotation detectSafeSearch(URL image) throws IOException { BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests); List responses = response.getResponsesList(); - for (AnnotateImageResponse res : responses) { - if (res.hasError()) { - return null; - } - - // For full list of available annotations, see http://g.co/cloud/vision/docs - return res.getSafeSearchAnnotation(); - } + return responses.get(0).getSafeSearchAnnotation(); } - return null; } - public AnnotateImageResponse getFaceDetection(URL image) throws Exception, IOException { + AnnotateImageResponse getFaceDetection(URL image) throws Exception { List requests = new ArrayList<>(); ByteString imgBytes = ByteString.copyFrom(Objects.requireNonNull(downloadFile(image))); @@ -92,12 +77,12 @@ public AnnotateImageResponse getFaceDetection(URL image) throws Exception, IOExc try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) { BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests); + return response.getResponsesList().get(0); } } - public WebDetection getWebDetection(URL image) throws Exception, - IOException { + WebDetection getWebDetection(URL image) throws Exception { List requests = new ArrayList<>(); ByteString imgBytes = ByteString.copyFrom(Objects.requireNonNull(downloadFile(image))); diff --git a/src/main/java/com/mazawrath/beanbot/utilities/ImageRequest.java b/src/main/java/com/mazawrath/beanbot/utilities/ImageRequest.java new file mode 100644 index 0000000..c5077d6 --- /dev/null +++ b/src/main/java/com/mazawrath/beanbot/utilities/ImageRequest.java @@ -0,0 +1,113 @@ +package com.mazawrath.beanbot.utilities; + +import com.google.cloud.vision.v1.AnnotateImageResponse; +import com.google.cloud.vision.v1.EntityAnnotation; +import com.google.cloud.vision.v1.SafeSearchAnnotation; +import com.google.cloud.vision.v1.WebDetection; +import org.apache.commons.lang3.text.WordUtils; +import org.javacord.api.entity.message.embed.EmbedBuilder; + +import java.awt.*; +import java.net.URL; +import java.util.List; + +public class ImageRequest { + private URL image; + + private List labelAnnotation; + private AnnotateImageResponse faceDetection; + private SafeSearchAnnotation safeSearchAnnotation; + private WebDetection webDetection; + + public ImageRequest(URL image) { + this.image = image; + GoogleCloudVision cloudVision = new GoogleCloudVision(); + + try { + labelAnnotation = cloudVision.getLabelDetection(image); + faceDetection = cloudVision.getFaceDetection(image); + safeSearchAnnotation = cloudVision.detectSafeSearch(image); + webDetection = cloudVision.getWebDetection(image); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public URL getImage() { + return image; + } + + public List getLabelAnnotation() { + return labelAnnotation; + } + + public AnnotateImageResponse getFaceDetection() { + return faceDetection; + } + + public SafeSearchAnnotation getSafeSearchAnnotation() { + return safeSearchAnnotation; + } + + public WebDetection getWebDetection() { + return webDetection; + } + + public EmbedBuilder buildEmbed() { + EmbedBuilder embed = new EmbedBuilder() + .setTitle("Image Analysis") + .setColor(Color.BLUE); + + StringBuilder labels = new StringBuilder(); + for (int i = 0; i < labelAnnotation.size(); i++) { + if (i != labelAnnotation.size() - 1) { + labels.append(labelAnnotation.get(i).getDescription()).append(" (").append(Math.round(labelAnnotation.get(0).getScore() * 100)).append("%), "); + } else + labels.append(labelAnnotation.get(i).getDescription()).append(" (").append(Math.round(labelAnnotation.get(0).getScore() * 100)).append("%)"); + } + + embed.addField("Things I See", labels.toString()); + + embed.addInlineField("Faces I See", String.valueOf(faceDetection.getFaceAnnotationsCount())); + + for (int i = 0; i < faceDetection.getFaceAnnotationsCount(); i++) { + StringBuilder emotionsSeen = new StringBuilder(); + if (faceDetection.getFaceAnnotations(i).getJoyLikelihoodValue() > 1) + emotionsSeen.append("joy, "); + if (faceDetection.getFaceAnnotations(i).getSorrowLikelihoodValue() > 1) + emotionsSeen.append("sorrow, "); + if (faceDetection.getFaceAnnotations(i).getAngerLikelihoodValue() > 1) + emotionsSeen.append("anger, "); + if (faceDetection.getFaceAnnotations(i).getSurpriseLikelihoodValue() > 1) + emotionsSeen.append("surprise, "); + + if (emotionsSeen.length() != 0) + embed.addInlineField("Face " + (i + 1) + "'s Possible Emotions", WordUtils.capitalizeFully(emotionsSeen.substring(0, emotionsSeen.length() - 2))); + else + embed.addInlineField("Face " + (i + 1) + "'s Possible Emotions", "none"); + } + embed.addInlineField("Best Guess", webDetection.getBestGuessLabels(0).getLabel()); + + StringBuilder webLabels = new StringBuilder(); + for (int i = 0; i < webDetection.getWebEntitiesCount(); i++) { + if (i != webDetection.getWebEntitiesCount() - 1) + webLabels.append(webDetection.getWebEntities(i).getDescription()).append(" (").append(Math.round(webDetection.getWebEntities(i).getScore() * 100)).append("%), "); + else + webLabels.append(webDetection.getWebEntities(i).getDescription()).append(" (").append(Math.round(webDetection.getWebEntities(i).getScore() * 100)).append("%)"); + } + embed.addField("Things I Think This Is", webLabels.toString()); + + if (safeSearchAnnotation.getAdultValue() > 2) + embed.addInlineField("Adult Content", WordUtils.capitalizeFully(safeSearchAnnotation.getAdult().name().replaceAll("_", " "))); + if (safeSearchAnnotation.getSpoofValue() > 2) + embed.addInlineField("Spoof / Edited Photo", WordUtils.capitalizeFully(safeSearchAnnotation.getSpoof().name().replaceAll("_", " "))); + if (safeSearchAnnotation.getMedicalValue() > 2) + embed.addInlineField("Medical / Surgery", WordUtils.capitalizeFully(safeSearchAnnotation.getMedical().name().replaceAll("_", " "))); + if (safeSearchAnnotation.getViolenceValue() > 2) + embed.addInlineField("Violence / Blood / Gore", WordUtils.capitalizeFully(safeSearchAnnotation.getViolence().name().replaceAll("_", " "))); + if (safeSearchAnnotation.getRacyValue() > 2) + embed.addInlineField("Skimpy / Nudity", WordUtils.capitalizeFully(safeSearchAnnotation.getRacy().name().replaceAll("_", " "))); + + return embed; + } +} From d51e805777b9664fe3239e7a2611aadd28e2b25e Mon Sep 17 00:00:00 2001 From: Mazawrath Date: Sat, 12 Jan 2019 16:04:25 -0600 Subject: [PATCH 2/4] Expanded lottery numbers that could be drawn --- src/main/java/com/mazawrath/beanbot/utilities/Lottery.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/mazawrath/beanbot/utilities/Lottery.java b/src/main/java/com/mazawrath/beanbot/utilities/Lottery.java index cf87010..9b70b8a 100644 --- a/src/main/java/com/mazawrath/beanbot/utilities/Lottery.java +++ b/src/main/java/com/mazawrath/beanbot/utilities/Lottery.java @@ -19,7 +19,7 @@ public class Lottery { public static final int AMOUNT_DRAWN = 3; public static final int MIN_NUMBER = 1; - public static final int MAX_NUMBER = 20; + public static final int MAX_NUMBER = 40; public static final BigDecimal MIN_WEEKLY_VALUE = new BigDecimal(50000); private static final String DB_NAME = "beanBotLottery"; From f31f082ee031fd9d7f32fcea72504b4e25496101 Mon Sep 17 00:00:00 2001 From: Mazawrath Date: Sat, 12 Jan 2019 16:07:44 -0600 Subject: [PATCH 3/4] Changed price of bean lottery tickets --- src/main/java/com/mazawrath/beanbot/utilities/Points.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/mazawrath/beanbot/utilities/Points.java b/src/main/java/com/mazawrath/beanbot/utilities/Points.java index abffc20..90a7937 100644 --- a/src/main/java/com/mazawrath/beanbot/utilities/Points.java +++ b/src/main/java/com/mazawrath/beanbot/utilities/Points.java @@ -23,7 +23,7 @@ public class Points { public static final BigDecimal FREE_POINTS = new BigDecimal("25.69").setScale(SCALE, ROUNDING_MODE); public static final BigDecimal COMMAND_COST = new BigDecimal("2.00").setScale(SCALE, ROUNDING_MODE); public static final BigDecimal COMMAND_COST_SPECIAL = new BigDecimal("10.00").setScale(SCALE, ROUNDING_MODE); - public static final BigDecimal LOTTERY_TICKET_COST = new BigDecimal("20.00").setScale(SCALE, ROUNDING_MODE); + public static final BigDecimal LOTTERY_TICKET_COST = new BigDecimal("40.00").setScale(SCALE, ROUNDING_MODE); public static final BigDecimal LOTTERY_DRAWING_COST = new BigDecimal("20000.00").setScale(SCALE, ROUNDING_MODE); public static final BigDecimal GOOGLE_VISION_COST = new BigDecimal("50.00").setScale(SCALE, ROUNDING_MODE); private Connection conn; From fed835a93d2b3bce70425dd7604ef7ea448b8c36 Mon Sep 17 00:00:00 2001 From: Mazawrath Date: Sat, 12 Jan 2019 16:08:37 -0600 Subject: [PATCH 4/4] Updated changelog --- .../admin/AdminPostChangeLogCommand.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/mazawrath/beanbot/commands/admin/AdminPostChangeLogCommand.java b/src/main/java/com/mazawrath/beanbot/commands/admin/AdminPostChangeLogCommand.java index 9d5716d..97b2ae1 100644 --- a/src/main/java/com/mazawrath/beanbot/commands/admin/AdminPostChangeLogCommand.java +++ b/src/main/java/com/mazawrath/beanbot/commands/admin/AdminPostChangeLogCommand.java @@ -34,17 +34,19 @@ public void onCommand(String[] args, DiscordApi api, ServerTextChannel serverTex private String getRecentChangeLog() { return "**New beanBOT update released.**\n" + - "Release can be found on https://github.com/Mazawrath/beanBOT/releases/tag/v3.2.0\n" + - "Detailed changelog can be found on https://github.com/Mazawrath/beanBOT/compare/v3.1.1...v3.2.0\n" + + "Release can be found on https://github.com/Mazawrath/beanBOT/releases/tag/v3.2.1\n" + + "Detailed changelog can be found on https://github.com/Mazawrath/beanBOT/compare/v3.2.0...v3.2.1\n" + "\n" + - "**v3.2.0**\n" + - "**New**\n" + - "\t- Added `.analyze`.\n" + - "\t\t- Using Google Cloud Vision, beanBOT can now examine a photo for objects, faces, emotions, and more.\n" + + "**v3.2.1**\n" + +// "**New**\n" + +// "\t- Added `.analyze`.\n" + +// "\t\t- Using Google Cloud Vision, beanBOT can now examine a photo for objects, faces, emotions, and more.\n" + // "\t\t- Server owners can now type `.admintwitch add [twitch channel name]` to subscribe to live notifications for a twitch channel.\n" + "**Changes**\n" + - "\t- Disabled `.beanlottery draw`."; -// "**Bug Fixes**\n" + -// "\t- Fixed an issue with `.beanlottery` not giving help information.\n"; + "\t- Cleaned up analyze command.\n" + + "\t- Expanded lottery numbers that could be drawn from 20 to 40.\n" + + "\t- Raised price of beanLottery tickets from 20 beanCoin to 40 beanCoin.\n" + + "**Bug Fixes**\n" + + "\t- Fixed an issue with Discord not creating new thumbnail previews.\n"; } } \ No newline at end of file