diff --git a/src/main/java/com/comandante/creeper/bot/BotCommandFactory.java b/src/main/java/com/comandante/creeper/bot/BotCommandFactory.java index 7de9366a7e9d5c734f7a32cf6babcfbe526365ce..4d7cc209527ab14eb78dcf545015d693acccdb3e 100644 --- a/src/main/java/com/comandante/creeper/bot/BotCommandFactory.java +++ b/src/main/java/com/comandante/creeper/bot/BotCommandFactory.java @@ -15,6 +15,7 @@ public class BotCommandFactory { addCommand(new CheckNorrisBotCommand(botCommandManager)); addCommand(new DictionaryBotCommand(botCommandManager)); addCommand(new ImdbBotCommand(botCommandManager)); + addCommand(new ForecastCommand(botCommandManager)); } public BotCommand getCommand(String originalFullCmd) { diff --git a/src/main/java/com/comandante/creeper/bot/WeatherManager.java b/src/main/java/com/comandante/creeper/bot/WeatherManager.java index eddaf3bedb96f374d21f2c4f524f0e75988f3854..9b9b796412365fa771a014a6ff82355d147f011e 100644 --- a/src/main/java/com/comandante/creeper/bot/WeatherManager.java +++ b/src/main/java/com/comandante/creeper/bot/WeatherManager.java @@ -13,6 +13,8 @@ import org.apache.commons.lang.WordUtils; import org.apache.log4j.Logger; import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class WeatherManager { @@ -36,12 +38,24 @@ public class WeatherManager { }); } + public List<String> getWeatherForecast(String zipCode) throws IOException { + List<String> resp = Lists.newArrayList(); + GenericUrl url = new GenericUrl("http://api.wunderground.com/api/" + creeperConfiguration.weatherUndergroundApiKey + "/forecast/q/" + zipCode + ".json"); + HttpRequest httpRequest = requestFactory.buildGetRequest(url); + GenericJson content = httpRequest.execute().parseAs(GenericJson.class); + List<String> forecastString = getForecastString(content); + String s = forecastString.get(0); + forecastString.set(0, zipCode + ": " + s); + resp.addAll(forecastString); + return resp; + } + public List<String> getWeather(String zipCode) throws IOException { List<String> resp = Lists.newArrayList(); GenericUrl url = new GenericUrl("http://api.wunderground.com/api/" + creeperConfiguration.weatherUndergroundApiKey + "/conditions/q/" + zipCode + ".json"); HttpRequest httpRequest = requestFactory.buildGetRequest(url); GenericJson content = httpRequest.execute().parseAs(GenericJson.class); - resp.addAll(getForecastString(content)); + resp.addAll(getCurrentConditionsString(content)); return resp; } @@ -54,7 +68,44 @@ public class WeatherManager { return resp; } + public List<String> getWeatherForecast(String cityName, String state) throws IOException { + List<String> resp = Lists.newArrayList(); + GenericUrl url = new GenericUrl("http://api.wunderground.com/api/" + creeperConfiguration.weatherUndergroundApiKey + "/forecast/q/" + state.toUpperCase() + "/" + convertToUrlFriendly(cityName) + ".json"); + HttpRequest httpRequest = requestFactory.buildGetRequest(url); + GenericJson content = httpRequest.execute().parseAs(GenericJson.class); + List<String> forecastString = getForecastString(content); + String s = forecastString.get(0); + forecastString.set(0, convertToUrlFriendly(cityName) + "," + state.toUpperCase() + ": " + s); + resp.addAll(forecastString); + return resp; + } + private List<String> getForecastString(GenericJson content) { + List<String> response = Lists.newArrayList(); + StringBuilder respLin = new StringBuilder(); + try { + ArrayMap forecast = (ArrayMap) content.get("forecast"); + ArrayMap simpleforecast = (ArrayMap) forecast.get("simpleforecast"); + ArrayList forecastday = (ArrayList) simpleforecast.get("forecastday"); + Iterator iterator = forecastday.iterator(); + while (iterator.hasNext()) { + ArrayMap day = (ArrayMap) iterator.next(); + ArrayMap date = (ArrayMap) day.get("date"); + ArrayMap high = (ArrayMap) day.get("high"); + ArrayMap low = (ArrayMap) day.get("low"); + String conditions = (String) day.get("conditions"); + respLin.append(date.get("weekday_short")).append(" ").append((String)high.get("fahrenheit")).append("F/").append((String)low.get("fahrenheit")).append("F ").append("(").append(conditions).append(")").append(" | "); + + } + } catch (Exception e) { + log.error("Error obtaining weather!", e); + } + String finalstring = respLin.toString().substring(0, respLin.toString().length() - 2); + response.add(finalstring); + return response; + } + + private List<String> getCurrentConditionsString(GenericJson content) { List<String> response = Lists.newArrayList(); try { ArrayMap current_observation = (ArrayMap) content.get("current_observation"); diff --git a/src/main/java/com/comandante/creeper/bot/commands/ForecastCommand.java b/src/main/java/com/comandante/creeper/bot/commands/ForecastCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..936864effb8308023a2f4e01e1f1316f56d60434 --- /dev/null +++ b/src/main/java/com/comandante/creeper/bot/commands/ForecastCommand.java @@ -0,0 +1,42 @@ +package com.comandante.creeper.bot.commands; + +import com.comandante.creeper.bot.BotCommandManager; +import com.google.api.client.util.Lists; +import com.google.common.collect.Sets; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class ForecastCommand extends BotCommand { + + static Set<String> triggers = Sets.newHashSet("forecast"); + static String helpUsage = "forecast 97034"; + static String helpDescription = "Obtain weather forecast using a zip code or city name."; + + public ForecastCommand(BotCommandManager botCommandManager) { + super(botCommandManager, triggers, helpUsage, helpDescription); + } + + @Override + public List<String> process() { + ArrayList<String> resp = Lists.newArrayList(); + String argumentString = joinArgs(args); + if (isNumeric(argumentString)) { + try { + resp.addAll(botCommandManager.getWeatherManager().getWeatherForecast(argumentString)); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + String[] split = argumentString.split(","); + try { + resp.addAll(botCommandManager.getWeatherManager().getWeatherForecast(split[0], split[1])); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resp; + } +} diff --git a/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java b/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java index 507f60458e249b154ce251cdc1f740b84b62c57f..1a994c726e57d7d15e1c8ccacd70b0c852bb51d6 100644 --- a/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java +++ b/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java @@ -14,27 +14,28 @@ public class CreeperAuthenticationHandler extends SimpleChannelUpstreamHandler { private final GameManager gameManager; private final CreeperAuthenticator creeperAuthenticator; private static final Logger log = Logger.getLogger(CreeperAuthenticationHandler.class); - - - - - private static final String LOGO = " / \\\n\r" + - " |\\_/|\n\r" + - " |---|\n\r" + - " | |\n\r" + - " | |\n\r" + - " _ |=-=| _\n\r" + - " _ / \\| |/ \\\n\r" + - " / \\| | | ||\\\n\r" + - "| | | | | \\>\n\r" + - "| | | | | \\\n\r" + - "| - - - - |) )\n\r" + - "| /\n\r" + - " \\ /\n\r" + - " \\ /\n\r" + - " \\ /\n\r" + - " \\ /\n\r" + - " | |\n\r"; + private static final String LOGO = " /[-])// ___\n\r" + + " __ --\\ `_/~--| / \\\n\r" + + " /_-/~~--~~ /~~~\\\\_\\ /\\\n\r" + + " | |___|===|_-- | \\ \\ \\\n\r" + + " _/~~~~~~~~|~~\\, ---|---\\___/----| \\/\\-\\\n\r" + + " ~\\________|__/ / // \\__ | || / | | | |\n\r" + + " ,~-|~~~~~\\--, | \\|--|/~||| | | |\n\r" + + " [3-|____---~~ _--'==;/ _, | |_|\n\r" + + " / /\\__|_/ \\ \\__/--/\n\r" + + " /---/_\\ -___/ | /,--|\n\r" + + " / /\\/~--| | | \\///\n\r" + + " / / |-__ \\ |/\n\r" + + " |--/ / |-- | \\\n\r" + + " \\^~~\\\\/\\ \\ \\/- _\n\r" + + " \\ | \\ |~~\\~~| \\\n\r" + + " \\ \\ \\ \\ \\ | \\\n\r" + + " \\ \\ | \\ \\ \\\n\r" + + " |~~|\\/\\| \\ \\ |\n\r" + + " | |/ \\_--_- |\\\n\r" + + " | / / |/\\/\n\r" + + " ~~ / /\n\r" + + " |__/\n\r"; public CreeperAuthenticationHandler(GameManager gameManager) { this.gameManager = gameManager;