Implemented googleSearch method for easier testing.

This commit is contained in:
Erik C. Thauvin 2019-04-09 02:29:17 -07:00
parent d85624b067
commit 3def574940

View file

@ -34,15 +34,19 @@ package net.thauvin.erik.mobibot.modules;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import net.thauvin.erik.mobibot.Mobibot; import net.thauvin.erik.mobibot.Mobibot;
import net.thauvin.erik.mobibot.Utils; import net.thauvin.erik.mobibot.Utils;
import net.thauvin.erik.mobibot.msg.Message;
import net.thauvin.erik.mobibot.msg.NoticeMessage;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
/** /**
* The GoogleSearch module. * The GoogleSearch module.
@ -53,14 +57,11 @@ import java.nio.charset.StandardCharsets;
*/ */
public final class GoogleSearch extends ThreadedModule { public final class GoogleSearch extends ThreadedModule {
// The Google API Key property. // The Google API Key property.
private static final String GOOGLE_API_KEY_PROP = "google-api-key"; static final String GOOGLE_API_KEY_PROP = "google-api-key";
// The Google Custom Search Engine ID property.
static final String GOOGLE_CSE_KEY_PROP = "google-cse-cx";
// The Google command // The Google command
private static final String GOOGLE_CMD = "google"; private static final String GOOGLE_CMD = "google";
// The Google Custom Search Engine ID property.
private static final String GOOGLE_CSE_KEY_PROP = "google-cse-cx";
// The tab indent (4 spaces). // The tab indent (4 spaces).
private static final String TAB_INDENT = " "; private static final String TAB_INDENT = " ";
@ -74,31 +75,24 @@ public final class GoogleSearch extends ThreadedModule {
} }
/** /**
* {@inheritDoc} * Performs a search on Google.
*/ *
@Override * @param query The search query.
public void helpResponse(final Mobibot bot, final String sender, final String args, final boolean isPrivate) { * @param apiKey The Google API key.
if (isEnabled()) { * The Google CSE key.
bot.send(sender, "To search Google:"); * @param cseKey The Google search results.
bot.send(sender, bot.helpIndent(bot.getNick() + ": " + GOOGLE_CMD + " <query>"));
} else {
bot.send(sender, "The Google searching facility is disabled.");
}
}
/**
* Searches Google.
*/ */
@SuppressFBWarnings(value = {"URLCONNECTION_SSRF_FD", "REC_CATCH_EXCEPTION"}) @SuppressFBWarnings(value = {"URLCONNECTION_SSRF_FD", "REC_CATCH_EXCEPTION"})
void run(final Mobibot bot, final String sender, final String query) { static ArrayList<Message> searchGoogle(String query, String apiKey, String cseKey) throws ModuleException {
final ArrayList<Message> results = new ArrayList<>();
try { try {
final String q = URLEncoder.encode(query, StandardCharsets.UTF_8.toString()); final String q = URLEncoder.encode(query, StandardCharsets.UTF_8.toString());
final URL url = final URL url =
new URL("https://www.googleapis.com/customsearch/v1?key=" new URL("https://www.googleapis.com/customsearch/v1?key="
+ properties.get(GOOGLE_API_KEY_PROP) + apiKey
+ "&cx=" + "&cx="
+ properties.get(GOOGLE_CSE_KEY_PROP) + cseKey
+ "&q=" + "&q="
+ q + q
+ "&filter=1&num=5&alt=json"); + "&filter=1&num=5&alt=json");
@ -117,13 +111,50 @@ public final class GoogleSearch extends ThreadedModule {
for (int i = 0; i < ja.length(); i++) { for (int i = 0; i < ja.length(); i++) {
final JSONObject j = ja.getJSONObject(i); final JSONObject j = ja.getJSONObject(i);
bot.send(sender, Utils.unescapeXml(j.getString("title"))); results.add(new NoticeMessage(Utils.unescapeXml(j.getString("title"))));
bot.send(sender, TAB_INDENT + Utils.green(j.getString("link"))); results.add(new NoticeMessage(j.getString("link")));
} }
} }
} catch (Exception e) { } catch (IOException e) {
bot.getLogger().warn("Unable to search in Google for: " + query, e); throw new ModuleException("searchGoogle(" + query + ')', "An error has occurred searching Google.", e);
bot.send(sender, "An error has occurred searching in Google: " + e.getMessage()); }
return results;
}
/**
* {@inheritDoc}
*/
@Override
public void helpResponse(final Mobibot bot, final String sender, final String args, final boolean isPrivate) {
if (isEnabled()) {
bot.send(sender, "To search Google:");
bot.send(sender, bot.helpIndent(bot.getNick() + ": " + GOOGLE_CMD + " <query>"));
} else {
bot.send(sender, "The Google searching facility is disabled.");
}
}
/**
* Searches Google.
*/
void run(final Mobibot bot, final String sender, final String query) {
try {
final ArrayList<Message> results = searchGoogle(query, properties.get(GOOGLE_API_KEY_PROP),
properties.get(GOOGLE_CSE_KEY_PROP));
int i = 0;
for (Message msg : results) {
if (i % 2 == 0) {
bot.send(sender, Utils.green(TAB_INDENT + msg.getMessage()));
} else {
bot.send(sender, msg.getMessage());
}
i++;
}
} catch (ModuleException e) {
bot.getLogger().warn(e.getDebugMessage(), e);
bot.send(sender, e.getMessage());
} }
} }
} }