diff --git a/src/main/java/org/tbplusc/app/Main.java b/src/main/java/org/tbplusc/app/Main.java index 36bf138..de179cb 100644 --- a/src/main/java/org/tbplusc/app/Main.java +++ b/src/main/java/org/tbplusc/app/Main.java @@ -1,12 +1,12 @@ package org.tbplusc.app; import discord4j.core.DiscordClient; +import discord4j.core.event.domain.lifecycle.DisconnectEvent; import discord4j.core.event.domain.message.MessageCreateEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tbplusc.app.discordinteraction.DefaultChatState; import org.tbplusc.app.discordinteraction.MessageHandler; -import reactor.core.publisher.Mono; public class Main { private static final Logger logger = LoggerFactory.getLogger(Main.class); @@ -17,12 +17,13 @@ public static void main(String[] args) { final var client = DiscordClient.create(token); DefaultChatState.registerDefaultCommands(); final var messageHandler = new MessageHandler(); - client.login() - .flatMapMany(gateway -> gateway.on(MessageCreateEvent.class)) - .map(MessageCreateEvent::getMessage) - .map(message -> { - messageHandler.handleMessage(message); - return Mono.empty(); - }).blockLast(); + final var gateway = client.login().block(); + if (gateway == null) { + logger.error("Can't connect to discord"); + return; + } + gateway.on(MessageCreateEvent.class).map(MessageCreateEvent::getMessage) + .subscribe(messageHandler::handleMessage); + gateway.on(DisconnectEvent.class).blockLast(); } } diff --git a/src/main/java/org/tbplusc/app/discordinteraction/DefaultChatState.java b/src/main/java/org/tbplusc/app/discordinteraction/DefaultChatState.java index 7afb0f9..5e388d9 100644 --- a/src/main/java/org/tbplusc/app/discordinteraction/DefaultChatState.java +++ b/src/main/java/org/tbplusc/app/discordinteraction/DefaultChatState.java @@ -10,6 +10,7 @@ import static org.tbplusc.app.discordinteraction.DiscordUtil.getChannelForMessage; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; @@ -44,32 +45,8 @@ public static void registerDefaultCommands() { registerCommand("build", (args, message) -> { final var validator = new Validator(); logger.info("Typed hero name: {}", args); - final var heroName = IcyVeinsParser - .normalizeHeroName(validator.getClosestToInput(args)); - logger.info("Normalized hero name: {}", heroName); - try { - final var builds = IcyVeinsParser.getBuildsByHeroName(heroName); - final var channel = getChannelForMessage(message); - channel.createMessage( - String.format("Selected hero is **%s**", heroName) - ).block(); - builds.getBuilds().stream().map((build) -> { - final var talents = new StringBuilder(); - for (var i = 0; i < build.getTalents().size(); i++) { - talents.append(String.format( - "%3d. %s \n", - HeroConsts.HERO_TALENTS_LEVELS[i], - build.getTalents().get(i)) - ); - } - return String.format("**%s**: ```md\n%s```**Description:** %s", - build.getName(), talents, build.getDescription()); - }) - .forEach(build -> channel.createMessage(build).block()); - } catch (IOException e) { - logger.error("Hero was not loaded", e); - } - return new DefaultChatState(); + final var possibleHeroNames = validator.getSomeCosestToInput(args, 10); + return new HeroSelectionState(Arrays.asList(possibleHeroNames.clone()), message); }); } diff --git a/src/main/java/org/tbplusc/app/discordinteraction/HeroSelectionState.java b/src/main/java/org/tbplusc/app/discordinteraction/HeroSelectionState.java index ab15bf5..5d72109 100644 --- a/src/main/java/org/tbplusc/app/discordinteraction/HeroSelectionState.java +++ b/src/main/java/org/tbplusc/app/discordinteraction/HeroSelectionState.java @@ -1,14 +1,67 @@ package org.tbplusc.app.discordinteraction; import discord4j.core.object.entity.Message; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tbplusc.app.talenthelper.HeroConsts; +import org.tbplusc.app.talenthelper.icyveinsparser.IcyVeinsParser; + +import java.io.IOException; +import java.util.List; + +import static org.tbplusc.app.discordinteraction.DiscordUtil.getChannelForMessage; public class HeroSelectionState implements ChatState { - public HeroSelectionState() { + private static final Logger logger = LoggerFactory.getLogger(HeroSelectionState.class); + + private final List availableHeroes; + + private final Message message; + + public HeroSelectionState(List availableHeroes, Message message) { + this.availableHeroes = availableHeroes; + this.message = message; + showInitMessage(); + } + + public void showInitMessage() { + final var channel = getChannelForMessage(message); + final var heroes = new StringBuilder(); + for (var i = 0; i < availableHeroes.size(); i++) { + heroes.append(String.format("%3d. %s \n", i + 1, availableHeroes.get(i))); + } + channel.createMessage(String.format("Choice hero (type number): \n ```md\n%s```", heroes)) + .block(); + } + private static void showHeroBuildToDiscord(Message message, String heroName) { + logger.info("Normalized hero name: {}", heroName); + try { + final var builds = IcyVeinsParser.getBuildsByHeroName(heroName); + final var channel = getChannelForMessage(message); + channel.createMessage(String.format("Selected hero is **%s**", heroName)).block(); + builds.getBuilds().stream().map((build) -> { + final var talents = new StringBuilder(); + for (var i = 0; i < build.getTalents().size(); i++) { + talents.append(String.format("%3d. %s \n", HeroConsts.HERO_TALENTS_LEVELS[i], + build.getTalents().get(i))); + } + return String.format("**%s**: ```md\n%s```**Description:** %s", build.getName(), + talents, build.getDescription()); + }).forEach(build -> channel.createMessage(build).block()); + } catch (IOException e) { + logger.error("Hero was not loaded", e); + } } - @Override - public ChatState handleMessage(Message message) { - return null; + @Override public ChatState handleMessage(Message message) { + var number = Integer.parseInt(message.getContent()); + if (number <= 1 || number >= 10) { + getChannelForMessage(message).createMessage("Wrong number").block(); + return this; + } + final var heroName = IcyVeinsParser.normalizeHeroName(availableHeroes.get(number - 1)); + showHeroBuildToDiscord(message, heroName); + return new DefaultChatState(); } } diff --git a/src/main/java/org/tbplusc/app/talenthelper/icyveinsparser/IcyVeinsParser.java b/src/main/java/org/tbplusc/app/talenthelper/icyveinsparser/IcyVeinsParser.java index 7842ec4..a06a125 100644 --- a/src/main/java/org/tbplusc/app/talenthelper/icyveinsparser/IcyVeinsParser.java +++ b/src/main/java/org/tbplusc/app/talenthelper/icyveinsparser/IcyVeinsParser.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.util.List; import java.util.ArrayList; + import org.tbplusc.app.util.HttpGetter; public class IcyVeinsParser { @@ -40,10 +41,7 @@ public static List getBuildsListFromDocument(org.jsoup.nodes.Docu } public static String normalizeHeroName(String heroName) { - return heroName.replace(".", "") - .replace(" ", "-") - .replace("'", "") - .toLowerCase(); + return heroName.replace(".", "").replace(" ", "-").replace("'", "").toLowerCase(); } private static org.jsoup.nodes.Document getDocumentFromHeroName(String heroName) diff --git a/src/main/java/org/tbplusc/app/validator/Validator.java b/src/main/java/org/tbplusc/app/validator/Validator.java index fc3aa53..17fee31 100644 --- a/src/main/java/org/tbplusc/app/validator/Validator.java +++ b/src/main/java/org/tbplusc/app/validator/Validator.java @@ -28,14 +28,12 @@ public Validator(){ } public String getClosestToInput(String userInput){ - var loweredInput = userInput.toLowerCase(); return Arrays.stream(charactersNames) .min(getComporator(userInput)) .get(); } public String[] getSomeCosestToInput(String userInput, int length){ - var loweredInput = userInput.toLowerCase(); return Arrays.stream(charactersNames) .sorted(getComporator(userInput)) .limit(length)