diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/Joke.java b/src/main/java/net/thauvin/erik/mobibot/modules/Joke.java index 53f2036..98fa80f 100644 --- a/src/main/java/net/thauvin/erik/mobibot/modules/Joke.java +++ b/src/main/java/net/thauvin/erik/mobibot/modules/Joke.java @@ -32,6 +32,8 @@ package net.thauvin.erik.mobibot.modules; import net.thauvin.erik.mobibot.Mobibot; +import net.thauvin.erik.mobibot.msg.Message; +import net.thauvin.erik.mobibot.msg.PublicMessage; import org.jibble.pircbot.Colors; import org.json.JSONObject; @@ -65,6 +67,37 @@ public final class Joke extends AbstractModule { commands.add(JOKE_CMD); } + /** + * Retrieves a random joke. + * + * @return The new joke. + */ + static Message randomJoke() throws ModuleException { + try { + final URL url = new URL(JOKE_URL); + final URLConnection conn = url.openConnection(); + + final StringBuilder sb = new StringBuilder(); + try (final BufferedReader reader = + new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + + final JSONObject json = new JSONObject(sb.toString()); + + return new PublicMessage( + Colors.CYAN + + json.getJSONObject("value").get("joke").toString().replaceAll("\\'", "'") + .replaceAll("\\\"", "\"") + + Colors.NORMAL); + } + } catch (Exception e) { + throw new ModuleException("An error has occurred retrieving a random joke.", e); + } + } + /** * {@inheritDoc} */ @@ -87,28 +120,10 @@ public final class Joke extends AbstractModule { */ private void run(final Mobibot bot, final String sender) { try { - final URL url = new URL(JOKE_URL); - final URLConnection conn = url.openConnection(); - - final StringBuilder sb = new StringBuilder(); - try (final BufferedReader reader = - new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { - String line; - while ((line = reader.readLine()) != null) { - sb.append(line); - } - - final JSONObject json = new JSONObject(sb.toString()); - - bot.send(bot.getChannel(), - Colors.CYAN - + json.getJSONObject("value").get("joke").toString().replaceAll("\\'", "'") - .replaceAll("\\\"", "\"") - + Colors.NORMAL); - } - } catch (Exception e) { - bot.getLogger().warn("Unable to retrieve random joke.", e); - bot.send(sender, "An error has occurred retrieving a random joke: " + e.getMessage()); + randomJoke(); + } catch (ModuleException e) { + bot.getLogger().warn(e.getMessage(), e); + bot.send(sender, e.getMessage()); } } } diff --git a/src/test/java/net/thauvin/erik/mobibot/modules/JokeTest.java b/src/test/java/net/thauvin/erik/mobibot/modules/JokeTest.java new file mode 100644 index 0000000..38eeabf --- /dev/null +++ b/src/test/java/net/thauvin/erik/mobibot/modules/JokeTest.java @@ -0,0 +1,55 @@ +/* + * JokeTest.java + * + * Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of this project nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.thauvin.erik.mobibot.modules; + +import org.testng.annotations.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * The JokeTest class. + * + * @author Erik C. Thauvin + * @created 2019-04-07 + * @since 1.0 + */ +public class JokeTest { + @Test + public void testLookupImpl() { + AbstractModuleTest.testAbstractModule(new Joke()); + } + + @Test + public void testRamdomJoke() throws ModuleException { + assertThat(Joke.randomJoke().getMessage().length() > 0).as("randomJoke()").isTrue(); + } +}