package addon.bash;
import bashoid.Addon;
import bashoid.Message;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import utils.*;
public class Bash extends Addon {
private ArrayList<Quote> quotes;
private Cooldown cooldown = new Cooldown(120);
private boolean isOnCooldown() {
return cooldown.isActive();
}
private void downloadParseOutput() {
try {
WebPage page = loadWebPage();
quotes = Parser.getQuotes(page);
sortQuotesByScore();
takeOnlyTopTenQuotes();
shuffleQuotes();
takeOneQuoteAndSetOutput();
cooldown.start();
} catch (IOException ioe) {
setError("Bash.org is unreachable.", ioe);
}
}
private WebPage loadWebPage() throws IOException {
return WebPage.loadWebPage("http://bash.org/?random1", "ISO-8859-1");
}
private void sortQuotesByScore() {
Collections.sort(quotes);
}
private void takeOnlyTopTenQuotes() {
quotes.subList(10, quotes.size() ).clear();
}
private void shuffleQuotes() {
Collections.shuffle(quotes);
}
private void takeOneQuoteAndSetOutput() {
Quote quote = takeQuote(6);
setOutput(quote);
}
private Quote takeQuote(int maxLinesLimit) {
for ( Quote q : quotes ) {
if ( q.lines() <= maxLinesLimit )
return q;
}
return quotes.get(0);
}
private void setOutput(Quote quote) {
String[] lines = quote.getContent();
for ( String line : lines )
reaction.add( Formatter.removeHTML(line) );
String url = "-- http://bash.org/?" + quote.getTextId() + " -- Next bash in " + getNextBashTime();
reaction.add(url);
}
private void setErrorOutputBecauseOfCooldown() {
String error = "I'm currently relaxing. I'll be back in "
+ timeToString( cooldown.remainingSeconds() ) + ".";
setError(error);
}
@Override
protected void setReaction(Message message) {
if ( isOnCooldown() )
setErrorOutputBecauseOfCooldown();
else
downloadParseOutput();
}
@Override
public boolean shouldReact(Message message) {
return message.text.equals("bash");
}
private String getNextBashTime() {
return timeToString( cooldown.length() );
}
private String timeToString(long seconds) {
long minutes = seconds / 60;
seconds = seconds - minutes*60;
if (minutes == 0 && seconds == 0)
return "zero seconds";
else if (minutes == 0)
return secondsToString(seconds);
else if (seconds == 0)
return minutesToString(minutes);
else
return minutesToString(minutes) + " and " + secondsToString(seconds);
}
private String minutesToString(long minutes) {
return minutes + " " + getWordInSingularOrPluralForm("minute", minutes);
}
private String secondsToString(long seconds) {
return seconds + " " + getWordInSingularOrPluralForm("second", seconds);
}
private String getWordInSingularOrPluralForm(String word, long count) {
return (count > 1) ? word + "s" : word;
}
}