Implemented Entries manager.
Implemented Messages manager. Enabled caching of the currency exchange rates. Moved commands, utils, etc. to separate classes. Added more weather data.
This commit is contained in:
parent
153363a320
commit
e31a22af11
28 changed files with 3778 additions and 2198 deletions
|
@ -61,13 +61,12 @@ compileJava {
|
|||
}
|
||||
|
||||
}
|
||||
//options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
|
||||
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
|
||||
}
|
||||
|
||||
jar {
|
||||
manifest.attributes(
|
||||
'Main-Class': mainClassName,
|
||||
'Class-Path': '. ./lib/' + configurations.compile.collect { it.getName() }.join(' ./lib/'))
|
||||
manifest.attributes('Main-Class': mainClassName,
|
||||
'Class-Path': '. ./lib/' + configurations.compile.collect { it.getName() }.join(' ./lib/'))
|
||||
|
||||
version = null
|
||||
}
|
||||
|
@ -106,5 +105,4 @@ task deploy(dependsOn: ['build', 'copyToDeploy', 'copyToDeployLib']) {
|
|||
task release(dependsOn: ['deploy', 'wrapper']) {
|
||||
group = "Publishing"
|
||||
description = "Releases new version."
|
||||
isRelease = true
|
||||
}
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
#ANT Task: ch.oscg.jreleaseinfo.BuildNumberHandler
|
||||
#Sun Apr 20 23:26:28 PDT 2014
|
||||
#Fri Apr 25 18:08:16 PDT 2014
|
||||
build.num.last=0
|
||||
|
|
13
mobibot.ipr
13
mobibot.ipr
|
@ -70,7 +70,18 @@
|
|||
</profile>
|
||||
</annotationProcessing>
|
||||
</component>
|
||||
<component name="CopyrightManager" default="" />
|
||||
<component name="CopyrightManager" default="Mobibot">
|
||||
<copyright>
|
||||
<option name="notice" value="@(#)&#36;file.fileName Copyright (c) 2004-&#36;today.year, 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 the author 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 OWNER 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." />
|
||||
<option name="keyword" value="Copyright" />
|
||||
<option name="allowReplaceKeyword" value="Erik C. Thauvin" />
|
||||
<option name="myName" value="Mobibot" />
|
||||
<option name="myLocal" value="true" />
|
||||
</copyright>
|
||||
<module2copyright>
|
||||
<element module="All" copyright="Mobibot" />
|
||||
</module2copyright>
|
||||
</component>
|
||||
<component name="DependenciesAnalyzeManager">
|
||||
<option name="myForwardDirection" value="false" />
|
||||
</component>
|
||||
|
|
1001
mobibot.iws
1001
mobibot.iws
File diff suppressed because it is too large
Load diff
|
@ -15,6 +15,9 @@ weblog=http://www.mobitopia.org/
|
|||
feed=http://www.mobitopia.org/rss.xml
|
||||
backlogs=http://www.mobitopia.org/mobibot/logs
|
||||
|
||||
tell-max-days=5
|
||||
tell-max-size=50
|
||||
|
||||
#delicious-user=
|
||||
#delicious-pwd=
|
||||
|
||||
|
|
256
src/main/java/net/thauvin/erik/mobibot/Commands.java
Normal file
256
src/main/java/net/thauvin/erik/mobibot/Commands.java
Normal file
|
@ -0,0 +1,256 @@
|
|||
/*
|
||||
* @(#)Commands.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
/**
|
||||
* The <code>commands</code>, <code>keywords</code> and <code>arguments</code>.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-26
|
||||
* @since 1.0
|
||||
*/
|
||||
public class Commands
|
||||
{
|
||||
/**
|
||||
* The currency command.
|
||||
*/
|
||||
public static final String CURRENCY_CMD = "currency";
|
||||
|
||||
/**
|
||||
* The rates keyword.
|
||||
*/
|
||||
public static final String CURRENCY_RATES_KEYWORD = "rates";
|
||||
|
||||
/**
|
||||
* The weather command.
|
||||
*/
|
||||
public static final String WEATHER_CMD = "weather";
|
||||
|
||||
/**
|
||||
* Debug command line argument.
|
||||
*/
|
||||
public static final String DEBUG_ARG = "debug";
|
||||
|
||||
/**
|
||||
* Help command line argument.
|
||||
*/
|
||||
public static final String HELP_ARG = "help";
|
||||
|
||||
/**
|
||||
* Properties command line argument.
|
||||
*/
|
||||
public static final String PROPS_ARG = "properties";
|
||||
|
||||
/**
|
||||
* Properties version line argument.
|
||||
*/
|
||||
public static final String VERSION_ARG = "version";
|
||||
|
||||
/**
|
||||
* The add (back)log command.
|
||||
*/
|
||||
public static final String ADDLOG_CMD = "addlog";
|
||||
|
||||
/**
|
||||
* The debug command.
|
||||
*/
|
||||
public static final String DEBUG_CMD = "debug";
|
||||
|
||||
/**
|
||||
* The dices command.
|
||||
*/
|
||||
public static final String DICE_CMD = "dice";
|
||||
|
||||
/**
|
||||
* The say command.
|
||||
*/
|
||||
public static final String SAY_CMD = "say";
|
||||
|
||||
/**
|
||||
* The die command.
|
||||
*/
|
||||
public static final String DIE_CMD = "die";
|
||||
|
||||
/**
|
||||
* The cycle command.
|
||||
*/
|
||||
public static final String CYCLE_CMD = "cycle";
|
||||
|
||||
/**
|
||||
* The msg command.
|
||||
*/
|
||||
public static final String MSG_CMD = "msg";
|
||||
|
||||
/**
|
||||
* The ignore command.
|
||||
*/
|
||||
public static final String IGNORE_CMD = "ignore";
|
||||
|
||||
/**
|
||||
* The ignore <code>me</code> keyword.
|
||||
*/
|
||||
public static final String IGNORE_ME_KEYWORD = "me";
|
||||
|
||||
/**
|
||||
* The help command.
|
||||
*/
|
||||
public static final String HELP_CMD = "help";
|
||||
|
||||
/**
|
||||
* The help on posting keyword.
|
||||
*/
|
||||
public static final String HELP_POSTING_KEYWORD = "posting";
|
||||
|
||||
/**
|
||||
* The help on tags keyword.
|
||||
*/
|
||||
public static final String HELP_TAGS_KEYWORD = "tags";
|
||||
|
||||
/**
|
||||
* The Google command.
|
||||
*/
|
||||
public static final String GOOGLE_CMD = "google";
|
||||
|
||||
/**
|
||||
* The Twitter command.
|
||||
*/
|
||||
public static final String TWITTER_CMD = "twitter";
|
||||
|
||||
/**
|
||||
* The math command.
|
||||
*/
|
||||
public static final String CALC_CMD = "calc";
|
||||
|
||||
/**
|
||||
* The me command.
|
||||
*/
|
||||
public static final String ME_CMD = "me";
|
||||
|
||||
/**
|
||||
* The nick command.
|
||||
*/
|
||||
public static final String NICK_CMD = "nick";
|
||||
|
||||
/**
|
||||
* The link command.
|
||||
*/
|
||||
public static final String LINK_CMD = "L";
|
||||
|
||||
/**
|
||||
* The lookup command.
|
||||
*/
|
||||
public static final String LOOKUP_CMD = "lookup";
|
||||
|
||||
/**
|
||||
* The ping command.
|
||||
*/
|
||||
public static final String PING_CMD = "ping";
|
||||
|
||||
/**
|
||||
* The pong command.
|
||||
*/
|
||||
public static final String PONG_CMD = "pong";
|
||||
|
||||
/**
|
||||
* The quote command.
|
||||
*/
|
||||
public static final String QUOTE_CMD = "quote";
|
||||
|
||||
/**
|
||||
* The recap command.
|
||||
*/
|
||||
public static final String RECAP_CMD = "recap";
|
||||
|
||||
/**
|
||||
* The stock command.
|
||||
*/
|
||||
public static final String STOCK_CMD = "stock";
|
||||
|
||||
/**
|
||||
* The time command.
|
||||
*/
|
||||
public static final String TIME_CMD = "time";
|
||||
|
||||
/**
|
||||
* The tell command.
|
||||
*/
|
||||
public static final String TELL_CMD = "tell";
|
||||
|
||||
/**
|
||||
* The {@link #TELL_CMD} delete command.
|
||||
*/
|
||||
public static final String TELL_DEL_CMD = "del";
|
||||
|
||||
/**
|
||||
* The {@link #TELL_CMD} all command.
|
||||
*/
|
||||
public static final String TELL_ALL_CMD = "all";
|
||||
|
||||
/**
|
||||
* The war command.
|
||||
*/
|
||||
public static final String WAR_CMD = "war";
|
||||
|
||||
/**
|
||||
* The users command.
|
||||
*/
|
||||
public static final String USERS_CMD = "users";
|
||||
|
||||
/**
|
||||
* The info command.
|
||||
*/
|
||||
public static final String INFO_CMD = "info";
|
||||
|
||||
/**
|
||||
* The version command.
|
||||
*/
|
||||
public static final String VERSION_CMD = "version";
|
||||
|
||||
/**
|
||||
* The view command.
|
||||
*/
|
||||
public static final String VIEW_CMD = "view";
|
||||
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
*
|
||||
* @throws UnsupportedOperationException if an error occurred. if the constructor is called.
|
||||
*/
|
||||
private Commands()
|
||||
throws UnsupportedOperationException
|
||||
{
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)CurrencyConverter.java
|
||||
*
|
||||
* Copyright (c) 2004, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import org.jdom.Document;
|
||||
|
@ -51,7 +49,6 @@ import java.util.*;
|
|||
* Converts various currencies.
|
||||
*
|
||||
* @author Erik C. Thauvin
|
||||
* @version $Revision$, $Date$
|
||||
* @created Feb 11, 2004
|
||||
* @since 1.0
|
||||
*/
|
||||
|
@ -67,11 +64,6 @@ public class CurrencyConverter implements Runnable
|
|||
*/
|
||||
private static final Map<String, String> EXCHANGE_RATES = new TreeMap<String, String>();
|
||||
|
||||
/**
|
||||
* The rates keyword.
|
||||
*/
|
||||
private static final String RATES_KEYWORD = "rates";
|
||||
|
||||
/**
|
||||
* The bot.
|
||||
*/
|
||||
|
@ -80,12 +72,12 @@ public class CurrencyConverter implements Runnable
|
|||
/**
|
||||
* The actual currency query.
|
||||
*/
|
||||
private final String query;
|
||||
private String query;
|
||||
|
||||
/**
|
||||
* The nick of the person who sent the message.
|
||||
*/
|
||||
private final String sender;
|
||||
private String sender;
|
||||
|
||||
/**
|
||||
* The last exchange rates table publication date.
|
||||
|
@ -96,17 +88,24 @@ public class CurrencyConverter implements Runnable
|
|||
* Creates a new CurrencyConverter object.
|
||||
*
|
||||
* @param bot The bot.
|
||||
* @param sender The nick of the person who sent the message.
|
||||
* @param query The currency query.
|
||||
* @param date The current date.
|
||||
*/
|
||||
public CurrencyConverter(Mobibot bot, String sender, String query, String date)
|
||||
public CurrencyConverter(Mobibot bot)
|
||||
{
|
||||
this.bot = bot;
|
||||
this.sender = sender;
|
||||
this.query = query.toLowerCase();
|
||||
}
|
||||
|
||||
if (!pubDate.equals(date))
|
||||
/**
|
||||
* Sets the query.
|
||||
*
|
||||
* @param sender The nick of the person who sent the message.
|
||||
* @param query The currency query.
|
||||
*/
|
||||
public void setQuery(String sender, String query)
|
||||
{
|
||||
this.query = query;
|
||||
this.sender = sender;
|
||||
|
||||
if (!pubDate.equals(Utils.today()))
|
||||
{
|
||||
EXCHANGE_RATES.clear();
|
||||
}
|
||||
|
@ -115,110 +114,115 @@ public class CurrencyConverter implements Runnable
|
|||
// Converts specified currencies.
|
||||
public final void run()
|
||||
{
|
||||
if (EXCHANGE_RATES.isEmpty())
|
||||
if (Utils.isValidString(sender) && Utils.isValidString(query))
|
||||
{
|
||||
try
|
||||
if (EXCHANGE_RATES.isEmpty())
|
||||
{
|
||||
final SAXBuilder builder = new SAXBuilder();
|
||||
builder.setIgnoringElementContentWhitespace(true);
|
||||
|
||||
final Document doc = builder.build(new URL(EXCHANGE_TABLE_URL));
|
||||
final Element root = doc.getRootElement();
|
||||
final Namespace ns = root.getNamespace("");
|
||||
final Element cubeRoot = root.getChild("Cube", ns);
|
||||
final Element cubeTime = cubeRoot.getChild("Cube", ns);
|
||||
|
||||
pubDate = cubeTime.getAttribute("time").getValue();
|
||||
|
||||
final List cubes = cubeTime.getChildren();
|
||||
Element cube;
|
||||
|
||||
for (final Object rawCube : cubes)
|
||||
try
|
||||
{
|
||||
cube = (Element) rawCube;
|
||||
EXCHANGE_RATES.put(cube.getAttribute("currency").getValue(), cube.getAttribute("rate").getValue());
|
||||
}
|
||||
final SAXBuilder builder = new SAXBuilder();
|
||||
builder.setIgnoringElementContentWhitespace(true);
|
||||
|
||||
EXCHANGE_RATES.put("EUR", "1");
|
||||
}
|
||||
catch (JDOMException e)
|
||||
{
|
||||
bot.getLogger().debug("Unable to parse the exchange rates table.", e);
|
||||
bot.send(sender, "An error has occurred while parsing the exchange rates table.");
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
bot.getLogger().debug("Unable to fetch the exchange rates table.", e);
|
||||
bot.send(sender, "An error has occurred while fetching the exchange rates table: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
final Document doc = builder.build(new URL(EXCHANGE_TABLE_URL));
|
||||
final Element root = doc.getRootElement();
|
||||
final Namespace ns = root.getNamespace("");
|
||||
final Element cubeRoot = root.getChild("Cube", ns);
|
||||
final Element cubeTime = cubeRoot.getChild("Cube", ns);
|
||||
|
||||
if (!EXCHANGE_RATES.isEmpty())
|
||||
{
|
||||
if (query.matches("\\d+([,\\d]+)?(\\.\\d+)? [a-z]{3}+ to [a-z]{3}+"))
|
||||
{
|
||||
final String[] cmds = query.split(" ");
|
||||
pubDate = cubeTime.getAttribute("time").getValue();
|
||||
|
||||
if (cmds.length == 4)
|
||||
{
|
||||
if (cmds[3].equals(cmds[1]))
|
||||
final List cubes = cubeTime.getChildren();
|
||||
Element cube;
|
||||
|
||||
for (final Object rawCube : cubes)
|
||||
{
|
||||
bot.send(sender, "You're kidding, right?");
|
||||
cube = (Element) rawCube;
|
||||
EXCHANGE_RATES
|
||||
.put(cube.getAttribute("currency").getValue(), cube.getAttribute("rate").getValue());
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
final double amt = Double.parseDouble(cmds[0].replaceAll(",", ""));
|
||||
final double from = Double.parseDouble(EXCHANGE_RATES.get(cmds[1].toUpperCase()));
|
||||
final double to = Double.parseDouble(EXCHANGE_RATES.get(cmds[3].toUpperCase()));
|
||||
|
||||
bot.send(bot.getChannel(),
|
||||
NumberFormat.getCurrencyInstance(Locale.US).format(amt).substring(1) + ' ' +
|
||||
cmds[1].toUpperCase() + " = " +
|
||||
NumberFormat.getCurrencyInstance(Locale.US).format((amt * to) / from).substring(1)
|
||||
+ ' ' + cmds[3].toUpperCase()
|
||||
);
|
||||
}
|
||||
catch (NullPointerException ignored)
|
||||
EXCHANGE_RATES.put("EUR", "1");
|
||||
}
|
||||
catch (JDOMException e)
|
||||
{
|
||||
bot.getLogger().debug("Unable to parse the exchange rates table.", e);
|
||||
bot.send(sender, "An error has occurred while parsing the exchange rates table.");
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
bot.getLogger().debug("Unable to fetch the exchange rates table.", e);
|
||||
bot.send(sender,
|
||||
"An error has occurred while fetching the exchange rates table: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
if (!EXCHANGE_RATES.isEmpty())
|
||||
{
|
||||
if (query.matches("\\d+([,\\d]+)?(\\.\\d+)? [a-zA-Z]{3}+ to [a-zA-Z]{3}+"))
|
||||
{
|
||||
final String[] cmds = query.split(" ");
|
||||
|
||||
if (cmds.length == 4)
|
||||
{
|
||||
if (cmds[3].equals(cmds[1]) || cmds[0].equals("0"))
|
||||
{
|
||||
bot.send(sender, "The supported currencies are: " + EXCHANGE_RATES.keySet().toString());
|
||||
bot.send(sender, "You're kidding, right?");
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
final double amt = Double.parseDouble(cmds[0].replaceAll(",", ""));
|
||||
final double from = Double.parseDouble(EXCHANGE_RATES.get(cmds[1].toUpperCase()));
|
||||
final double to = Double.parseDouble(EXCHANGE_RATES.get(cmds[3].toUpperCase()));
|
||||
|
||||
bot.send(bot.getChannel(),
|
||||
NumberFormat.getCurrencyInstance(Locale.US).format(amt).substring(1) + ' ' +
|
||||
cmds[1].toUpperCase() + " = " +
|
||||
NumberFormat.getCurrencyInstance(Locale.US).format((amt * to) / from)
|
||||
.substring(1) + ' ' + cmds[3].toUpperCase()
|
||||
);
|
||||
}
|
||||
catch (NullPointerException ignored)
|
||||
{
|
||||
bot.send(sender, "The supported currencies are: " + EXCHANGE_RATES.keySet().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (query.equals(RATES_KEYWORD))
|
||||
{
|
||||
bot.send(sender, "Last Update: " + pubDate);
|
||||
|
||||
final Iterator<String> it = EXCHANGE_RATES.keySet().iterator();
|
||||
String rate;
|
||||
|
||||
final StringBuilder buff = new StringBuilder(0);
|
||||
|
||||
while (it.hasNext())
|
||||
else if (query.equals(Commands.CURRENCY_RATES_KEYWORD))
|
||||
{
|
||||
rate = it.next();
|
||||
if (buff.length() > 0)
|
||||
bot.send(sender, "Last Update: " + pubDate);
|
||||
|
||||
final Iterator<String> it = EXCHANGE_RATES.keySet().iterator();
|
||||
String rate;
|
||||
|
||||
final StringBuilder buff = new StringBuilder(0);
|
||||
|
||||
while (it.hasNext())
|
||||
{
|
||||
buff.append(", ");
|
||||
rate = it.next();
|
||||
if (buff.length() > 0)
|
||||
{
|
||||
buff.append(", ");
|
||||
}
|
||||
buff.append(rate).append(": ").append(EXCHANGE_RATES.get(rate));
|
||||
}
|
||||
buff.append(rate).append(": ").append(EXCHANGE_RATES.get(rate));
|
||||
|
||||
bot.send(sender, buff.toString());
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.helpResponse(sender, Commands.CURRENCY_CMD + ' ' + query);
|
||||
bot.send(sender, "The supported currencies are: " + EXCHANGE_RATES.keySet().toString());
|
||||
}
|
||||
|
||||
bot.send(sender, buff.toString());
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.helpResponse(sender, Mobibot.CURRENCY_CMD + ' ' + query);
|
||||
bot.send(sender, "The supported currencies are: " + EXCHANGE_RATES.keySet().toString());
|
||||
bot.getLogger().debug("The exchange rate table is empty.");
|
||||
bot.send(sender, "Sorry, but the exchange rate table is empty.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.getLogger().debug("The exchange rate table is empty.");
|
||||
bot.send(sender, "Sorry, but the exchange rate table is empty.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)DeliciousPoster.java
|
||||
*
|
||||
* Copyright (c) 2005, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import del.icio.us.Delicious;
|
||||
|
@ -42,11 +40,10 @@ import del.icio.us.Delicious;
|
|||
* The class to handle posts to del.icio.us.
|
||||
*
|
||||
* @author Erik C. Thauvin
|
||||
* @version $Revision$, $Date$
|
||||
* @created Mar 5, 2005
|
||||
* @noinspection UnnecessaryBoxing
|
||||
* @since 1.0
|
||||
*/
|
||||
@SuppressWarnings("UnnecessaryBoxing")
|
||||
public class DeliciousPoster
|
||||
{
|
||||
private final Delicious delicious;
|
||||
|
@ -78,16 +75,28 @@ public class DeliciousPoster
|
|||
public Object construct()
|
||||
{
|
||||
return Boolean.valueOf(delicious.addPost(entry.getLink(),
|
||||
entry.getTitle(),
|
||||
postedBy(entry),
|
||||
entry.getDeliciousTags(),
|
||||
entry.getDate()));
|
||||
entry.getTitle(),
|
||||
postedBy(entry),
|
||||
entry.getDeliciousTags(),
|
||||
entry.getDate()));
|
||||
}
|
||||
};
|
||||
|
||||
worker.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns he del.icio.us extended attribution line.
|
||||
*
|
||||
* @param entry The entry.
|
||||
*
|
||||
* @return The extended attribution line.
|
||||
*/
|
||||
private String postedBy(EntryLink entry)
|
||||
{
|
||||
return "Posted by " + entry.getNick() + " on " + entry.getChannel() + " (" + ircServer + ')';
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a post to del.icio.us.
|
||||
*
|
||||
|
@ -125,36 +134,24 @@ public class DeliciousPoster
|
|||
delicious.deletePost(oldUrl);
|
||||
|
||||
return Boolean.valueOf(delicious.addPost(entry.getLink(),
|
||||
entry.getTitle(),
|
||||
postedBy(entry),
|
||||
entry.getDeliciousTags(),
|
||||
entry.getDate()));
|
||||
entry.getTitle(),
|
||||
postedBy(entry),
|
||||
entry.getDeliciousTags(),
|
||||
entry.getDate()));
|
||||
}
|
||||
else
|
||||
{
|
||||
return Boolean.valueOf(delicious.addPost(entry.getLink(),
|
||||
entry.getTitle(),
|
||||
postedBy(entry),
|
||||
entry.getDeliciousTags(),
|
||||
entry.getDate(),
|
||||
true,
|
||||
true));
|
||||
entry.getTitle(),
|
||||
postedBy(entry),
|
||||
entry.getDeliciousTags(),
|
||||
entry.getDate(),
|
||||
true,
|
||||
true));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
worker.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns he del.icio.us extended attribution line.
|
||||
*
|
||||
* @param entry The entry.
|
||||
*
|
||||
* @return The extended attribution line.
|
||||
*/
|
||||
private String postedBy(EntryLink entry)
|
||||
{
|
||||
return "Posted by " + entry.getNick() + " on " + entry.getChannel() + " (" + ircServer + ')';
|
||||
}
|
||||
}
|
||||
|
|
97
src/main/java/net/thauvin/erik/mobibot/Dice.java
Normal file
97
src/main/java/net/thauvin/erik/mobibot/Dice.java
Normal file
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* @(#)Dice.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* The {@link net.thauvin.erik.mobibot.Commands#DICE_CMD} command
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-28
|
||||
* @since 1.0
|
||||
*/
|
||||
public class Dice
|
||||
{
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
*
|
||||
* @throws UnsupportedOperationException if an error occurred. if the constructor is called.
|
||||
*/
|
||||
private Dice()
|
||||
throws UnsupportedOperationException
|
||||
{
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Rolls the dice
|
||||
*
|
||||
* @param bot The bot.
|
||||
* @param sender The sender's nickname.
|
||||
*/
|
||||
public static void roll(Mobibot bot, String sender)
|
||||
{
|
||||
final Random r = new Random();
|
||||
|
||||
int i = r.nextInt(6) + 1;
|
||||
int y = r.nextInt(6) + 1;
|
||||
final int playerTotal = i + y;
|
||||
|
||||
bot.send(bot.getChannel(),
|
||||
sender + " rolled two dice: " + Utils.bold(i) + " and " + Utils.bold(y) + " for a total of " + Utils
|
||||
.bold(playerTotal)
|
||||
);
|
||||
|
||||
i = r.nextInt(6) + 1;
|
||||
y = r.nextInt(6) + 1;
|
||||
final int total = i + y;
|
||||
|
||||
bot.action(
|
||||
"rolled two dice: " + Utils.bold(i) + " and " + Utils.bold(y) + " for a total of " + Utils.bold(total));
|
||||
|
||||
if (playerTotal < total)
|
||||
{
|
||||
bot.action("wins.");
|
||||
}
|
||||
else if (playerTotal > total)
|
||||
{
|
||||
bot.action("lost.");
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.action("tied.");
|
||||
}
|
||||
}
|
||||
}
|
384
src/main/java/net/thauvin/erik/mobibot/EntriesMgr.java
Normal file
384
src/main/java/net/thauvin/erik/mobibot/EntriesMgr.java
Normal file
|
@ -0,0 +1,384 @@
|
|||
/*
|
||||
* @(#)EntriesMgr.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
import com.sun.syndication.feed.synd.*;
|
||||
import com.sun.syndication.io.FeedException;
|
||||
import com.sun.syndication.io.SyndFeedInput;
|
||||
import com.sun.syndication.io.SyndFeedOutput;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Manages the feed entries.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-28
|
||||
* @since 1.0
|
||||
*/
|
||||
public class EntriesMgr
|
||||
{
|
||||
/**
|
||||
* The name of the file containing the current entries.
|
||||
*/
|
||||
public static final String CURRENT_XML = "current.xml";
|
||||
|
||||
/**
|
||||
* The name of the file containing the backlog entries.
|
||||
*/
|
||||
public static final String NAV_XML = "nav.xml";
|
||||
|
||||
/**
|
||||
* The maximum number of backlogs to keep.
|
||||
*/
|
||||
private static final int MAX_BACKLOGS = 10;
|
||||
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
*
|
||||
* @throws UnsupportedOperationException if an error occurred. if the constructor is called.
|
||||
*/
|
||||
private EntriesMgr()
|
||||
throws UnsupportedOperationException
|
||||
{
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the current entries.
|
||||
*
|
||||
* @param file The file containing the current entries.
|
||||
* @param channel The channel
|
||||
* @param entries The entries.
|
||||
*
|
||||
* @return The feed's last published date.
|
||||
*
|
||||
* @throws java.io.FileNotFoundException If the file was not found.
|
||||
* @throws com.sun.syndication.io.FeedException If an error occurred while reading the feed.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static String loadEntries(String file, String channel, List<EntryLink> entries)
|
||||
throws FileNotFoundException, FeedException
|
||||
{
|
||||
entries.clear();
|
||||
|
||||
final SyndFeedInput input = new SyndFeedInput();
|
||||
|
||||
String today;
|
||||
InputStreamReader reader = null;
|
||||
|
||||
try
|
||||
{
|
||||
reader = new InputStreamReader(new FileInputStream(new File(file)));
|
||||
|
||||
final SyndFeed feed = input.build(reader);
|
||||
|
||||
today = Utils.ISO_SDF.format(feed.getPublishedDate());
|
||||
|
||||
final List items = feed.getEntries();
|
||||
SyndEntry item;
|
||||
SyndContent description;
|
||||
String[] comments;
|
||||
String author;
|
||||
EntryLink entry;
|
||||
|
||||
for (int i = items.size() - 1; i >= 0; i--)
|
||||
{
|
||||
item = (SyndEntryImpl) items.get(i);
|
||||
author = item.getAuthor()
|
||||
.substring(item.getAuthor().lastIndexOf('(') + 1, item.getAuthor().length() - 1);
|
||||
entry = new EntryLink(item.getLink(),
|
||||
item.getTitle(),
|
||||
author,
|
||||
channel,
|
||||
item.getPublishedDate(),
|
||||
item.getCategories());
|
||||
description = item.getDescription();
|
||||
comments = description.getValue().split("<br/>");
|
||||
|
||||
int split;
|
||||
for (final String comment : comments)
|
||||
{
|
||||
split = comment.indexOf(": ");
|
||||
|
||||
if (split != -1)
|
||||
{
|
||||
entry.addComment(comment.substring(split + 2).trim(), comment.substring(0, split).trim());
|
||||
}
|
||||
}
|
||||
|
||||
entries.add(entry);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (reader != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
reader.close();
|
||||
}
|
||||
catch (IOException ignore)
|
||||
{
|
||||
; // Do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return today;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the backlogs.
|
||||
*
|
||||
* @param file The file containing the backlogs.
|
||||
* @param history The history list.
|
||||
*
|
||||
* @throws FileNotFoundException If the file was not found.
|
||||
* @throws FeedException If an error occurred while reading the feed.
|
||||
*/
|
||||
public static void loadBacklogs(String file, List<String> history)
|
||||
throws FileNotFoundException, FeedException
|
||||
{
|
||||
history.clear();
|
||||
|
||||
final SyndFeedInput input = new SyndFeedInput();
|
||||
|
||||
InputStreamReader reader = null;
|
||||
|
||||
try
|
||||
{
|
||||
reader = new InputStreamReader(new FileInputStream(new File(file)));
|
||||
|
||||
final SyndFeed feed = input.build(reader);
|
||||
|
||||
final List items = feed.getEntries();
|
||||
SyndEntry item;
|
||||
|
||||
for (int i = items.size() - 1; i >= 0; i--)
|
||||
{
|
||||
item = (SyndEntryImpl) items.get(i);
|
||||
history.add(item.getTitle());
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (reader != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
reader.close();
|
||||
}
|
||||
catch (IOException ignore)
|
||||
{
|
||||
; // Do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the entries.
|
||||
*
|
||||
* @param isDayBackup Set the true if the daily backup file should also be created.
|
||||
*/
|
||||
public static void saveEntries(Mobibot bot, List<EntryLink> entries, List<String> history, boolean isDayBackup)
|
||||
{
|
||||
if (bot.getLogger().isDebugEnabled())
|
||||
{
|
||||
bot.getLogger().debug("Saving...");
|
||||
}
|
||||
|
||||
if (Utils.isValidString(bot.getLogsDir()) && Utils.isValidString(bot.getWeblogUrl()))
|
||||
{
|
||||
FileWriter fw = null;
|
||||
|
||||
try
|
||||
{
|
||||
fw = new FileWriter(new File(bot.getLogsDir() + CURRENT_XML));
|
||||
|
||||
SyndFeed rss = new SyndFeedImpl();
|
||||
rss.setFeedType("rss_2.0");
|
||||
rss.setTitle(bot.getChannel() + " IRC Links");
|
||||
rss.setDescription("Links from " + bot.getIrcServer() + " on " + bot.getChannel());
|
||||
rss.setLink(bot.getWeblogUrl());
|
||||
rss.setPublishedDate(Calendar.getInstance().getTime());
|
||||
rss.setLanguage("en");
|
||||
|
||||
EntryLink entry;
|
||||
StringBuffer buff;
|
||||
EntryComment comment;
|
||||
final List<SyndEntry> items = new ArrayList<SyndEntry>(0);
|
||||
SyndEntry item;
|
||||
SyndContent description;
|
||||
|
||||
for (int i = (entries.size() - 1); i >= 0; --i)
|
||||
{
|
||||
entry = entries.get(i);
|
||||
|
||||
buff = new StringBuffer(
|
||||
"Posted by <b>" + entry.getNick() + "</b> on <a href=\"irc://" + bot.getIrcServer() + '/'
|
||||
+ entry.getChannel() + "\"><b>" + entry.getChannel() + "</b></a>"
|
||||
);
|
||||
|
||||
if (entry.getCommentsCount() > 0)
|
||||
{
|
||||
buff.append(" <br/><br/>");
|
||||
|
||||
final EntryComment[] comments = entry.getComments();
|
||||
|
||||
for (int j = 0; j < comments.length; j++)
|
||||
{
|
||||
comment = comments[j];
|
||||
|
||||
if (j > 0)
|
||||
{
|
||||
buff.append(" <br/>");
|
||||
}
|
||||
|
||||
buff.append(comment.getNick()).append(": ").append(comment.getComment());
|
||||
}
|
||||
}
|
||||
|
||||
item = new SyndEntryImpl();
|
||||
item.setLink(entry.getLink());
|
||||
description = new SyndContentImpl();
|
||||
description.setValue(buff.toString());
|
||||
item.setDescription(description);
|
||||
item.setTitle(entry.getTitle());
|
||||
item.setPublishedDate(entry.getDate());
|
||||
item.setAuthor(
|
||||
bot.getChannel().substring(1) + '@' + bot.getIrcServer() + " (" + entry.getNick() + ')');
|
||||
item.setCategories(entry.getTags());
|
||||
|
||||
items.add(item);
|
||||
}
|
||||
|
||||
rss.setEntries(items);
|
||||
|
||||
if (bot.getLogger().isDebugEnabled())
|
||||
{
|
||||
bot.getLogger().debug("Writing the entries feed.");
|
||||
}
|
||||
|
||||
final SyndFeedOutput output = new SyndFeedOutput();
|
||||
output.output(rss, fw);
|
||||
fw.close();
|
||||
|
||||
fw = new FileWriter(new File(bot.getLogsDir() + bot.getToday() + ".xml"));
|
||||
output.output(rss, fw);
|
||||
|
||||
if (isDayBackup)
|
||||
{
|
||||
if (Utils.isValidString(bot.getBacklogsUrl()))
|
||||
{
|
||||
if (history.indexOf(bot.getToday()) == -1)
|
||||
{
|
||||
history.add(bot.getToday());
|
||||
|
||||
while (history.size() > MAX_BACKLOGS)
|
||||
{
|
||||
history.remove(0);
|
||||
}
|
||||
}
|
||||
|
||||
fw.close();
|
||||
fw = new FileWriter(new File(bot.getLogsDir() + NAV_XML));
|
||||
rss = new SyndFeedImpl();
|
||||
rss.setFeedType("rss_2.0");
|
||||
rss.setTitle(bot.getChannel() + " IRC Links Backlogs");
|
||||
rss.setDescription("Backlogs of Links from " + bot.getIrcServer() + " on " + bot.getChannel());
|
||||
rss.setLink(bot.getBacklogsUrl());
|
||||
rss.setPublishedDate(Calendar.getInstance().getTime());
|
||||
|
||||
String date;
|
||||
items.clear();
|
||||
|
||||
for (int i = (history.size() - 1); i >= 0; --i)
|
||||
{
|
||||
date = history.get(i);
|
||||
|
||||
item = new SyndEntryImpl();
|
||||
item.setLink(bot.getBacklogsUrl() + date + ".xml");
|
||||
item.setTitle(date);
|
||||
description = new SyndContentImpl();
|
||||
description.setValue("Links for " + date);
|
||||
item.setDescription(description);
|
||||
|
||||
items.add(item);
|
||||
}
|
||||
|
||||
rss.setEntries(items);
|
||||
|
||||
if (bot.getLogger().isDebugEnabled())
|
||||
{
|
||||
bot.getLogger().debug("Writing the backlog feed.");
|
||||
}
|
||||
|
||||
output.output(rss, fw);
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.getLogger().warn("Unable to generate the backlogs feed. No property configured.");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
bot.getLogger().warn("Unable to generate the feed.", e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
if (fw != null)
|
||||
{
|
||||
fw.close();
|
||||
}
|
||||
}
|
||||
catch (Exception ignore)
|
||||
{
|
||||
; // Do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.getLogger().warn("Unable to generate the feed. At least one of the required property is missing.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)EntryComment.java
|
||||
*
|
||||
* Copyright (c) 2004, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
@ -44,7 +42,6 @@ import java.util.Date;
|
|||
* The class used to store comments associated to a specific entry.
|
||||
*
|
||||
* @author Erik C. Thauvin
|
||||
* @version $Revision$, $Date$
|
||||
* @created Jan 31, 2004
|
||||
* @since 1.0
|
||||
*/
|
||||
|
@ -80,6 +77,7 @@ public class EntryComment implements Serializable
|
|||
|
||||
/**
|
||||
* Creates a new comment.
|
||||
*
|
||||
* @noinspection UnusedDeclaration
|
||||
*/
|
||||
protected EntryComment()
|
||||
|
@ -101,6 +99,7 @@ public class EntryComment implements Serializable
|
|||
* Sets the comment.
|
||||
*
|
||||
* @param comment The actual comment.
|
||||
*
|
||||
* @noinspection UnusedDeclaration
|
||||
*/
|
||||
public final void setComment(String comment)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)EntryLink.java
|
||||
*
|
||||
* Copyright (c) 2004, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import com.sun.syndication.feed.synd.SyndCategoryImpl;
|
||||
|
@ -48,7 +46,6 @@ import java.util.List;
|
|||
* The class used to store link entries.
|
||||
*
|
||||
* @author Erik C. Thauvin
|
||||
* @version $Revision$, $Date$
|
||||
* @created Jan 31, 2004
|
||||
* @since 1.0
|
||||
*/
|
||||
|
@ -106,6 +103,61 @@ public class EntryLink implements Serializable
|
|||
setTags(tags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the tags.
|
||||
*
|
||||
* @param tags The space-delimited tags.
|
||||
*/
|
||||
public final synchronized void setTags(String tags)
|
||||
{
|
||||
if (tags != null)
|
||||
{
|
||||
final String[] parts = tags.replaceAll(", ", " ").replaceAll(",", " ").split(" ");
|
||||
|
||||
SyndCategoryImpl tag;
|
||||
String part;
|
||||
char mod;
|
||||
|
||||
for (final String rawPart : parts)
|
||||
{
|
||||
part = rawPart.trim();
|
||||
|
||||
if (part.length() >= 2)
|
||||
{
|
||||
tag = new SyndCategoryImpl();
|
||||
tag.setName(part.substring(1).toLowerCase());
|
||||
|
||||
mod = part.charAt(0);
|
||||
|
||||
if (mod == '-')
|
||||
{
|
||||
// Don't remove the channel tag, if any.
|
||||
if (!tag.getName().equals(channel.substring(1)))
|
||||
{
|
||||
this.tags.remove(tag);
|
||||
}
|
||||
}
|
||||
else if (mod == '+')
|
||||
{
|
||||
if (!this.tags.contains(tag))
|
||||
{
|
||||
this.tags.add(tag);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tag.setName(part.trim().toLowerCase());
|
||||
|
||||
if (!this.tags.contains(tag))
|
||||
{
|
||||
this.tags.add(tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new entry.
|
||||
*
|
||||
|
@ -129,6 +181,7 @@ public class EntryLink implements Serializable
|
|||
|
||||
/**
|
||||
* Creates a new EntryLink object.
|
||||
*
|
||||
* @noinspection UnusedDeclaration
|
||||
*/
|
||||
protected EntryLink()
|
||||
|
@ -178,6 +231,7 @@ public class EntryLink implements Serializable
|
|||
* Sets the channel.
|
||||
*
|
||||
* @param channel The channel.
|
||||
*
|
||||
* @noinspection UnusedDeclaration
|
||||
*/
|
||||
public final synchronized void setChannel(String channel)
|
||||
|
@ -279,6 +333,7 @@ public class EntryLink implements Serializable
|
|||
* Set the comment's author login.
|
||||
*
|
||||
* @param login The new login.
|
||||
*
|
||||
* @noinspection UnusedDeclaration
|
||||
*/
|
||||
public final synchronized void setLogin(String login)
|
||||
|
@ -319,56 +374,11 @@ public class EntryLink implements Serializable
|
|||
/**
|
||||
* Sets the tags.
|
||||
*
|
||||
* @param tags The space-delimited tags.
|
||||
* @param tags The tags.
|
||||
*/
|
||||
public final synchronized void setTags(String tags)
|
||||
final synchronized void setTags(List<SyndCategoryImpl> tags)
|
||||
{
|
||||
if (tags != null)
|
||||
{
|
||||
final String[] parts = tags.replaceAll(", ", " ").replaceAll(",", " ").split(" ");
|
||||
|
||||
SyndCategoryImpl tag;
|
||||
String part;
|
||||
char mod;
|
||||
|
||||
for (final String rawPart : parts)
|
||||
{
|
||||
part = rawPart.trim();
|
||||
|
||||
if (part.length() >= 2)
|
||||
{
|
||||
tag = new SyndCategoryImpl();
|
||||
tag.setName(part.substring(1).toLowerCase());
|
||||
|
||||
mod = part.charAt(0);
|
||||
|
||||
if (mod == '-')
|
||||
{
|
||||
// Don't remove the channel tag, if any.
|
||||
if (!tag.getName().equals(channel.substring(1)))
|
||||
{
|
||||
this.tags.remove(tag);
|
||||
}
|
||||
}
|
||||
else if (mod == '+')
|
||||
{
|
||||
if (!this.tags.contains(tag))
|
||||
{
|
||||
this.tags.add(tag);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tag.setName(part.trim().toLowerCase());
|
||||
|
||||
if (!this.tags.contains(tag))
|
||||
{
|
||||
this.tags.add(tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.tags.addAll(tags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -426,16 +436,6 @@ public class EntryLink implements Serializable
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the tags.
|
||||
*
|
||||
* @param tags The tags.
|
||||
*/
|
||||
public final synchronized void setTags(List<SyndCategoryImpl> tags)
|
||||
{
|
||||
this.tags.addAll(tags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of the object.
|
||||
*
|
||||
|
@ -444,8 +444,8 @@ public class EntryLink implements Serializable
|
|||
public final String toString()
|
||||
{
|
||||
|
||||
return super.toString() + "[ channel -> '" + channel + '\'' + ", comments -> " + comments + ", date -> "
|
||||
+ date + ", link -> '" + link + '\'' + ", login -> '" + login + '\'' + ", nick -> '" + nick + '\''
|
||||
return super.toString() + "[ channel -> '" + channel + '\'' + ", comments -> " + comments + ", date -> " + date
|
||||
+ ", link -> '" + link + '\'' + ", login -> '" + login + '\'' + ", nick -> '" + nick + '\''
|
||||
+ ", tags -> " + tags + ", title -> '" + title + '\'' + " ]";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)FeedReader.java
|
||||
*
|
||||
* Copyright (c) 2004, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import com.sun.syndication.feed.synd.SyndEntry;
|
||||
|
@ -50,7 +48,6 @@ import java.util.List;
|
|||
* Reads a RSS feed.
|
||||
*
|
||||
* @author Erik C. Thauvin
|
||||
* @version $Revision$, $Date$
|
||||
* @created Feb 1, 2004
|
||||
* @since 1.0
|
||||
*/
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)GoogleSearch.java
|
||||
*
|
||||
* Copyright (c) 2004, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,12 +30,9 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
|
@ -50,7 +47,6 @@ import java.net.URLEncoder;
|
|||
* Performs a Google search or spell checking query.
|
||||
*
|
||||
* @author Erik C. Thauvin
|
||||
* @version $Revision$, $Date$
|
||||
* @created Feb 7, 2004
|
||||
* @since 1.0
|
||||
*/
|
||||
|
@ -95,7 +91,6 @@ public class GoogleSearch implements Runnable
|
|||
*/
|
||||
public final void run()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
final String query = URLEncoder.encode(this.query, "UTF-8");
|
||||
|
@ -119,12 +114,11 @@ public class GoogleSearch implements Runnable
|
|||
for (int i = 0; i < ja.length(); i++)
|
||||
{
|
||||
final JSONObject j = ja.getJSONObject(i);
|
||||
bot.send(sender, Mobibot.unescapeXml(j.getString("titleNoFormatting")));
|
||||
bot.send(sender, Utils.unescapeXml(j.getString("titleNoFormatting")));
|
||||
bot.send(sender, TAB_INDENT + j.getString("url"));
|
||||
}
|
||||
|
||||
reader.close();
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
162
src/main/java/net/thauvin/erik/mobibot/Lookup.java
Normal file
162
src/main/java/net/thauvin/erik/mobibot/Lookup.java
Normal file
|
@ -0,0 +1,162 @@
|
|||
/*
|
||||
* @(#)Lookup.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
import org.apache.commons.net.WhoisClient;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
/**
|
||||
* Performs a DNS lookup query.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-26
|
||||
* @since 1.0
|
||||
*/
|
||||
public class Lookup
|
||||
{
|
||||
|
||||
/**
|
||||
* The whois host.
|
||||
*/
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
public static final String WHOIS_HOST = "whois.arin.net";
|
||||
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
*
|
||||
* @throws UnsupportedOperationException if an error occurred. if the constructor is called.
|
||||
*/
|
||||
private Lookup()
|
||||
throws UnsupportedOperationException
|
||||
{
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a DNS lookup on the specified query.
|
||||
*
|
||||
* @param query The IP address or hostname.
|
||||
*
|
||||
* @return The lookup query result string.
|
||||
*
|
||||
* @throws java.net.UnknownHostException If the host is unknown.
|
||||
*/
|
||||
public static String lookup(String query)
|
||||
throws UnknownHostException
|
||||
{
|
||||
final StringBuilder buffer = new StringBuilder("");
|
||||
|
||||
final InetAddress[] results = InetAddress.getAllByName(query);
|
||||
String hostInfo;
|
||||
|
||||
for (final InetAddress result : results)
|
||||
{
|
||||
if (result.getHostAddress().equals(query))
|
||||
{
|
||||
hostInfo = result.getHostName();
|
||||
|
||||
if (hostInfo.equals(query))
|
||||
{
|
||||
throw new UnknownHostException();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hostInfo = result.getHostAddress();
|
||||
}
|
||||
|
||||
if (buffer.length() > 0)
|
||||
{
|
||||
buffer.append(", ");
|
||||
}
|
||||
|
||||
buffer.append(hostInfo);
|
||||
}
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a whois IP query.
|
||||
*
|
||||
* @param query The IP address.
|
||||
*
|
||||
* @return The IP whois data, if any.
|
||||
*
|
||||
* @throws java.io.IOException If a connection error occurs.
|
||||
*/
|
||||
public static String[] whois(String query)
|
||||
throws IOException
|
||||
{
|
||||
return whois(query, WHOIS_HOST);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a whois IP query.
|
||||
*
|
||||
* @param query The IP address.
|
||||
* @param host The whois host.
|
||||
*
|
||||
* @return The IP whois data, if any.
|
||||
*
|
||||
* @throws java.io.IOException If a connection error occurs.
|
||||
*/
|
||||
@SuppressWarnings("WeakerAccess, SameParameterValue")
|
||||
public static String[] whois(String query, String host)
|
||||
throws IOException
|
||||
{
|
||||
final WhoisClient whois = new WhoisClient();
|
||||
String[] lines;
|
||||
|
||||
try
|
||||
{
|
||||
whois.setDefaultTimeout(Mobibot.CONNECT_TIMEOUT);
|
||||
whois.connect(host);
|
||||
whois.setSoTimeout(Mobibot.CONNECT_TIMEOUT);
|
||||
whois.setSoLinger(false, 0);
|
||||
|
||||
lines = whois.query('-' + query).split("\n");
|
||||
}
|
||||
finally
|
||||
{
|
||||
whois.disconnect();
|
||||
}
|
||||
|
||||
return lines;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)Quote.java
|
||||
*
|
||||
* Copyright (c) 2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import org.jibble.pircbot.Colors;
|
||||
|
@ -53,6 +51,13 @@ import java.net.URLConnection;
|
|||
*/
|
||||
public class Quote implements Runnable
|
||||
{
|
||||
|
||||
/**
|
||||
* The I Heart Quotes URL.
|
||||
*/
|
||||
private static final String QUOTE_URL =
|
||||
"http://www.iheartquotes.com/api/v1/random?format=json&max_lines=1&source=esr+humorix_misc+humorix_stories+joel_on_software+macintosh+math+mav_flame+osp_rules+paul_graham+prog_style+subversion";
|
||||
|
||||
/**
|
||||
* The bot.
|
||||
*/
|
||||
|
@ -82,7 +87,7 @@ public class Quote implements Runnable
|
|||
{
|
||||
try
|
||||
{
|
||||
final URL url = new URL("http://www.iheartquotes.com/api/v1/random?format=json&max_lines=1");
|
||||
final URL url = new URL(QUOTE_URL);
|
||||
final URLConnection conn = url.openConnection();
|
||||
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
@ -96,7 +101,7 @@ public class Quote implements Runnable
|
|||
|
||||
final JSONObject json = new JSONObject(sb.toString());
|
||||
|
||||
bot.send(bot.getChannel(), Colors.BLUE + json.getString("quote") + Colors.BLUE);
|
||||
bot.send(bot.getChannel(), Colors.CYAN + json.getString("quote") + Colors.CYAN);
|
||||
|
||||
reader.close();
|
||||
}
|
||||
|
|
|
@ -1,59 +1,115 @@
|
|||
/*
|
||||
* @(#)ReleaseInfo.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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.
|
||||
*/
|
||||
|
||||
/* Created by JReleaseInfo AntTask from Open Source Competence Group */
|
||||
/* Creation date Sun Apr 20 23:26:28 PDT 2014 */
|
||||
/* Creation date Fri Apr 25 18:08:16 PDT 2014 */
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* This class provides information gathered from the build environment.
|
||||
*
|
||||
*
|
||||
* @author JReleaseInfo AntTask
|
||||
*/
|
||||
public class ReleaseInfo {
|
||||
public class ReleaseInfo
|
||||
{
|
||||
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
* @throws UnsupportedOperationException if the constructor is called.
|
||||
*/
|
||||
private ReleaseInfo() throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
/**
|
||||
* buildDate (set during build process to 1398474496363L).
|
||||
*/
|
||||
private static final Date buildDate = new Date(1398474496363L);
|
||||
|
||||
/**
|
||||
* project (set during build process to "mobibot").
|
||||
*/
|
||||
private static final String project = "mobibot";
|
||||
|
||||
/** buildDate (set during build process to 1398061588708L). */
|
||||
private static final Date buildDate = new Date(1398061588708L);
|
||||
/**
|
||||
* version (set during build process to "0.6").
|
||||
*/
|
||||
private static final String version = "0.6";
|
||||
|
||||
/**
|
||||
* Get buildDate (set during build process to Sun Apr 20 23:26:28 PDT 2014).
|
||||
* @return Date buildDate
|
||||
*/
|
||||
public static Date getBuildDate() { return buildDate; }
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
*
|
||||
* @throws UnsupportedOperationException if the constructor is called.
|
||||
*/
|
||||
private ReleaseInfo()
|
||||
throws UnsupportedOperationException
|
||||
{
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get buildDate (set during build process to Fri Apr 25 18:08:16 PDT 2014).
|
||||
*
|
||||
* @return Date buildDate
|
||||
*/
|
||||
public static Date getBuildDate()
|
||||
{
|
||||
return buildDate;
|
||||
}
|
||||
|
||||
/** project (set during build process to "mobibot"). */
|
||||
private static final String project = "mobibot";
|
||||
/**
|
||||
* Get project (set during build process to "mobibot").
|
||||
*
|
||||
* @return String project
|
||||
*/
|
||||
public static String getProject()
|
||||
{
|
||||
return project;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project (set during build process to "mobibot").
|
||||
* @return String project
|
||||
*/
|
||||
public static String getProject() { return project; }
|
||||
/**
|
||||
* Get version (set during build process to "0.6").
|
||||
*
|
||||
* @return String version
|
||||
*/
|
||||
public static String getVersion()
|
||||
{
|
||||
return version;
|
||||
}
|
||||
|
||||
|
||||
/** version (set during build process to "0.6"). */
|
||||
private static final String version = "0.6";
|
||||
|
||||
/**
|
||||
* Get version (set during build process to "0.6").
|
||||
* @return String version
|
||||
*/
|
||||
public static String getVersion() { return version; }
|
||||
|
||||
|
||||
/**
|
||||
* Get buildNumber (set during build process to 0).
|
||||
* @return int buildNumber
|
||||
*/
|
||||
public static int getBuildNumber() { return 0; }
|
||||
/**
|
||||
* Get buildNumber (set during build process to 0).
|
||||
*
|
||||
* @return int buildNumber
|
||||
*/
|
||||
public static int getBuildNumber()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)StockQuote.java
|
||||
*
|
||||
* Copyright (c) 2004, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import com.Ostermiller.util.CSVParser;
|
||||
|
@ -46,7 +44,6 @@ import java.io.IOException;
|
|||
* Retrieves a stock quote from Yahoo!.
|
||||
*
|
||||
* @author Erik C. Thauvin
|
||||
* @version $Revision$, $Date$
|
||||
* @created Feb 7, 2004
|
||||
* @since 1.0
|
||||
*/
|
||||
|
|
|
@ -1,133 +1,159 @@
|
|||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* This is the 3rd version of SwingWorker (also known as
|
||||
* SwingWorker 3), an abstract class that you subclass to
|
||||
* perform GUI-related work in a dedicated thread. For
|
||||
* instructions on and examples of using this class, see:
|
||||
*
|
||||
* This is the 3rd version of SwingWorker (also known as SwingWorker 3), an abstract class that you subclass to perform
|
||||
* GUI-related work in a dedicated thread. For instructions on and examples of using this class, see:
|
||||
* <p/>
|
||||
* http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
|
||||
*
|
||||
* Note that the API changed slightly in the 3rd version:
|
||||
* You must now invoke start() on the SwingWorker after
|
||||
* creating it.
|
||||
* <p/>
|
||||
* Note that the API changed slightly in the 3rd version: You must now invoke start() on the SwingWorker after creating
|
||||
* it.
|
||||
*
|
||||
* @noinspection ALL
|
||||
*/
|
||||
public abstract class SwingWorker {
|
||||
private Object value; // see getValue(), setValue()
|
||||
public abstract class SwingWorker
|
||||
{
|
||||
private Object value; // see getValue(), setValue()
|
||||
|
||||
/**
|
||||
* Class to maintain reference to current worker thread
|
||||
* under separate synchronization control.
|
||||
*/
|
||||
private static class ThreadVar {
|
||||
private Thread thread;
|
||||
ThreadVar(Thread t) { thread = t; }
|
||||
synchronized Thread get() { return thread; }
|
||||
synchronized void clear() { thread = null; }
|
||||
}
|
||||
private ThreadVar threadVar;
|
||||
|
||||
private ThreadVar threadVar;
|
||||
/**
|
||||
* Start a thread that will call the <code>construct</code> method and then exit.
|
||||
*/
|
||||
public SwingWorker()
|
||||
{
|
||||
final Runnable doFinished = new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
finished();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the value produced by the worker thread, or null if it
|
||||
* hasn't been constructed yet.
|
||||
*/
|
||||
protected synchronized Object getValue() {
|
||||
return value;
|
||||
}
|
||||
Runnable doConstruct = new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
try
|
||||
{
|
||||
setValue(construct());
|
||||
}
|
||||
finally
|
||||
{
|
||||
threadVar.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the value produced by worker thread
|
||||
*/
|
||||
private synchronized void setValue(Object x) {
|
||||
value = x;
|
||||
}
|
||||
SwingUtilities.invokeLater(doFinished);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Compute the value to be returned by the <code>get</code> method.
|
||||
*/
|
||||
public abstract Object construct();
|
||||
Thread t = new Thread(doConstruct);
|
||||
threadVar = new ThreadVar(t);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called on the event dispatching thread (not on the worker thread)
|
||||
* after the <code>construct</code> method has returned.
|
||||
*/
|
||||
public void finished() {
|
||||
}
|
||||
/**
|
||||
* Called on the event dispatching thread (not on the worker thread) after the <code>construct</code> method has
|
||||
* returned.
|
||||
*/
|
||||
public void finished()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* A new method that interrupts the worker thread. Call this method
|
||||
* to force the worker to stop what it's doing.
|
||||
*/
|
||||
public void interrupt() {
|
||||
Thread t = threadVar.get();
|
||||
if (t != null) {
|
||||
t.interrupt();
|
||||
}
|
||||
threadVar.clear();
|
||||
}
|
||||
/**
|
||||
* Compute the value to be returned by the <code>get</code> method.
|
||||
*/
|
||||
public abstract Object construct();
|
||||
|
||||
/**
|
||||
* Return the value created by the <code>construct</code> method.
|
||||
* Returns null if either the constructing thread or the current
|
||||
* thread was interrupted before a value was produced.
|
||||
*
|
||||
* @return the value created by the <code>construct</code> method
|
||||
*/
|
||||
public Object get() {
|
||||
while (true) {
|
||||
Thread t = threadVar.get();
|
||||
if (t == null) {
|
||||
return getValue();
|
||||
}
|
||||
try {
|
||||
t.join();
|
||||
}
|
||||
catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt(); // propagate
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* A new method that interrupts the worker thread. Call this method to force the worker to stop what it's doing.
|
||||
*/
|
||||
public void interrupt()
|
||||
{
|
||||
Thread t = threadVar.get();
|
||||
if (t != null)
|
||||
{
|
||||
t.interrupt();
|
||||
}
|
||||
threadVar.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the value created by the <code>construct</code> method. Returns null if either the constructing thread or
|
||||
* the current thread was interrupted before a value was produced.
|
||||
*
|
||||
* @return the value created by the <code>construct</code> method
|
||||
*/
|
||||
public Object get()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
Thread t = threadVar.get();
|
||||
if (t == null)
|
||||
{
|
||||
return getValue();
|
||||
}
|
||||
try
|
||||
{
|
||||
t.join();
|
||||
}
|
||||
catch (InterruptedException e)
|
||||
{
|
||||
Thread.currentThread().interrupt(); // propagate
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a thread that will call the <code>construct</code> method
|
||||
* and then exit.
|
||||
*/
|
||||
public SwingWorker() {
|
||||
final Runnable doFinished = new Runnable() {
|
||||
public void run() { finished(); }
|
||||
};
|
||||
/**
|
||||
* Get the value produced by the worker thread, or null if it hasn't been constructed yet.
|
||||
*/
|
||||
protected synchronized Object getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
Runnable doConstruct = new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
setValue(construct());
|
||||
}
|
||||
finally {
|
||||
threadVar.clear();
|
||||
}
|
||||
/**
|
||||
* Set the value produced by worker thread
|
||||
*/
|
||||
private synchronized void setValue(Object x)
|
||||
{
|
||||
value = x;
|
||||
}
|
||||
|
||||
SwingUtilities.invokeLater(doFinished);
|
||||
}
|
||||
};
|
||||
/**
|
||||
* Start the worker thread.
|
||||
*/
|
||||
public void start()
|
||||
{
|
||||
Thread t = threadVar.get();
|
||||
if (t != null)
|
||||
{
|
||||
t.start();
|
||||
}
|
||||
}
|
||||
|
||||
Thread t = new Thread(doConstruct);
|
||||
threadVar = new ThreadVar(t);
|
||||
}
|
||||
/**
|
||||
* Class to maintain reference to current worker thread under separate synchronization control.
|
||||
*/
|
||||
private static class ThreadVar
|
||||
{
|
||||
private Thread thread;
|
||||
|
||||
/**
|
||||
* Start the worker thread.
|
||||
*/
|
||||
public void start() {
|
||||
Thread t = threadVar.get();
|
||||
if (t != null) {
|
||||
t.start();
|
||||
}
|
||||
}
|
||||
ThreadVar(Thread t)
|
||||
{
|
||||
thread = t;
|
||||
}
|
||||
|
||||
synchronized Thread get()
|
||||
{
|
||||
return thread;
|
||||
}
|
||||
|
||||
synchronized void clear()
|
||||
{
|
||||
thread = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
146
src/main/java/net/thauvin/erik/mobibot/TellMessage.java
Normal file
146
src/main/java/net/thauvin/erik/mobibot/TellMessage.java
Normal file
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
* @(#)TellMessage.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* The <code>TellMessage</code> class.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-24
|
||||
* @since 1.0
|
||||
*/
|
||||
public class TellMessage implements Serializable
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final String sender;
|
||||
|
||||
private final String recipient;
|
||||
|
||||
private final String message;
|
||||
|
||||
private final String id;
|
||||
|
||||
final private Date queued;
|
||||
|
||||
private Date received;
|
||||
|
||||
private boolean isReceived;
|
||||
|
||||
private boolean isNotified;
|
||||
|
||||
/**
|
||||
* Create a new message.
|
||||
*
|
||||
* @param sender The sender's nick.
|
||||
* @param recipient The recipient's nick.
|
||||
* @param message The message.
|
||||
*/
|
||||
public TellMessage(String sender, String recipient, String message)
|
||||
{
|
||||
this.sender = sender;
|
||||
this.recipient = recipient;
|
||||
this.message = message;
|
||||
|
||||
this.queued = Calendar.getInstance().getTime();
|
||||
this.id = Utils.TIMESTAMP_SDF.format(this.queued);
|
||||
|
||||
}
|
||||
|
||||
public String getSender()
|
||||
{
|
||||
return sender;
|
||||
}
|
||||
|
||||
public String getRecipient()
|
||||
{
|
||||
return recipient;
|
||||
}
|
||||
|
||||
public String getMessage()
|
||||
{
|
||||
return message;
|
||||
}
|
||||
|
||||
public Date getQueued()
|
||||
{
|
||||
return queued;
|
||||
}
|
||||
|
||||
public Date getReceived()
|
||||
{
|
||||
return received;
|
||||
}
|
||||
|
||||
public void setReceived()
|
||||
{
|
||||
this.received = Calendar.getInstance().getTime();
|
||||
this.isReceived = true;
|
||||
}
|
||||
|
||||
public boolean isNotified()
|
||||
{
|
||||
return this.isNotified;
|
||||
}
|
||||
|
||||
public void setNotified()
|
||||
{
|
||||
this.isNotified = true;
|
||||
}
|
||||
|
||||
public String getId()
|
||||
{
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public boolean isReceived()
|
||||
{
|
||||
return this.isReceived;
|
||||
}
|
||||
|
||||
public boolean isMatchId(String id)
|
||||
{
|
||||
return this.id.equals(id);
|
||||
}
|
||||
|
||||
public boolean isMatch(String nick)
|
||||
{
|
||||
return (sender.equalsIgnoreCase(nick) || recipient.equalsIgnoreCase(nick));
|
||||
}
|
||||
}
|
156
src/main/java/net/thauvin/erik/mobibot/TellMessagesMgr.java
Normal file
156
src/main/java/net/thauvin/erik/mobibot/TellMessagesMgr.java
Normal file
|
@ -0,0 +1,156 @@
|
|||
/*
|
||||
* @(#)TellMessagesMgr.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
import org.apache.commons.logging.impl.Log4JLogger;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Managers the {@link Commands#TELL_CMD} messages.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-26
|
||||
* @since 1.0
|
||||
*/
|
||||
public class TellMessagesMgr
|
||||
{
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
*
|
||||
* @throws UnsupportedOperationException if an error occurred. if the constructor is called.
|
||||
*/
|
||||
private TellMessagesMgr()
|
||||
throws UnsupportedOperationException
|
||||
{
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the messages.
|
||||
*
|
||||
* @param file The serialized objects file.
|
||||
* @param logger The logger.
|
||||
*
|
||||
* @return The {@link net.thauvin.erik.mobibot.TellMessage} array.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static List<TellMessage> load(String file, Log4JLogger logger)
|
||||
{
|
||||
try
|
||||
{
|
||||
final ObjectInput input = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
return ((List<TellMessage>) input.readObject());
|
||||
}
|
||||
finally
|
||||
{
|
||||
input.close();
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException ignore)
|
||||
{
|
||||
; // Do nothing.
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
logger.error("An IO error occurred loading the messages queue.", e);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
logger.getLogger().error("An error occurred loading the messages queue.", e);
|
||||
}
|
||||
|
||||
return (List<TellMessage>) new ArrayList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the messages.
|
||||
*
|
||||
* @param file The serialized objects file.
|
||||
* @param messages The {@link net.thauvin.erik.mobibot.TellMessage} array.
|
||||
* @param logger The logger.
|
||||
*/
|
||||
public static void save(String file, List<TellMessage> messages, Log4JLogger logger)
|
||||
{
|
||||
try
|
||||
{
|
||||
final ObjectOutput output = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
|
||||
|
||||
try
|
||||
{
|
||||
output.writeObject(messages);
|
||||
}
|
||||
finally
|
||||
{
|
||||
output.close();
|
||||
}
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
logger.error("Unable to save messages queue.", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans the messages queue.
|
||||
*/
|
||||
public static void cleanTellMessages(List<TellMessage> tellMessages, int tellMaxDays)
|
||||
{
|
||||
final Calendar maxDate = Calendar.getInstance();
|
||||
final Date today = new Date();
|
||||
|
||||
synchronized (tellMessages)
|
||||
{
|
||||
for (final TellMessage message : tellMessages)
|
||||
{
|
||||
maxDate.setTime(message.getQueued());
|
||||
maxDate.add(Calendar.DATE, tellMaxDays);
|
||||
|
||||
if (maxDate.getTime().before(today))
|
||||
{
|
||||
tellMessages.remove(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)Twitter.java
|
||||
*
|
||||
* Copyright (C) 2007 Erik C. Thauvin
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import twitter4j.Status;
|
||||
|
@ -44,7 +42,6 @@ import twitter4j.conf.ConfigurationBuilder;
|
|||
* Inserts presence information into Twitter.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @version $Revision$, $Date$
|
||||
* @created Sept 10, 2008
|
||||
* @since 1.0
|
||||
*/
|
||||
|
@ -121,8 +118,8 @@ public class Twitter implements Runnable
|
|||
final Status status = twitter.updateStatus(message + " (" + sender + ')');
|
||||
|
||||
bot.send(sender,
|
||||
"You message was posted to http://twitter.com/" + twitter.getScreenName() + "/statuses/" + status
|
||||
.getId()
|
||||
"You message was posted to http://twitter.com/" + twitter.getScreenName() + "/statuses/" + status
|
||||
.getId()
|
||||
);
|
||||
}
|
||||
catch (Exception e)
|
||||
|
|
|
@ -20,7 +20,6 @@ import java.io.InputStreamReader;
|
|||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @author <a href="http://twitter4j.org/en/code-examples.html#oauth">http://twitter4j.org/en/code-examples.html#oauth</a>
|
||||
* @version $Revision$, $Date$
|
||||
* @created Sep 13, 2010
|
||||
* @since 1.0
|
||||
*/
|
||||
|
|
309
src/main/java/net/thauvin/erik/mobibot/Utils.java
Normal file
309
src/main/java/net/thauvin/erik/mobibot/Utils.java
Normal file
|
@ -0,0 +1,309 @@
|
|||
/*
|
||||
* @(#)Utils.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
import org.jibble.pircbot.Colors;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
/**
|
||||
* Miscellaneous utilities class.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-26
|
||||
* @since 1.0
|
||||
*/
|
||||
public class Utils
|
||||
{
|
||||
/**
|
||||
* The timestamp simple date format.
|
||||
*/
|
||||
public static final SimpleDateFormat TIMESTAMP_SDF = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||
|
||||
/**
|
||||
* The UTC (yyyy-MM-dd HH:mm) simple date format.
|
||||
*/
|
||||
static final SimpleDateFormat UTC_SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
||||
|
||||
/**
|
||||
* The ISO (YYYY-MM-DD) simple date format.
|
||||
*/
|
||||
static final SimpleDateFormat ISO_SDF = new SimpleDateFormat("yyyy-MM-dd");
|
||||
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
*
|
||||
* @throws UnsupportedOperationException if an error occurred. if the constructor is called.
|
||||
*/
|
||||
private Utils()
|
||||
throws UnsupportedOperationException
|
||||
{
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts XML/XHTML entities to plain text.
|
||||
*
|
||||
* @param str The string to unescape.
|
||||
*
|
||||
* @return The unescaped string.
|
||||
*/
|
||||
public static String unescapeXml(String str)
|
||||
{
|
||||
String s = str.replaceAll("&", "&");
|
||||
s = s.replaceAll("<", "<");
|
||||
s = s.replaceAll(">", ">");
|
||||
s = s.replaceAll(""", "\"");
|
||||
s = s.replaceAll("'", "'");
|
||||
s = s.replaceAll("'", "'");
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies a file.
|
||||
*
|
||||
* @param in The source file.
|
||||
* @param out The destination file.
|
||||
*
|
||||
* @throws java.io.IOException If the file could not be copied.
|
||||
* @noinspection UnusedDeclaration
|
||||
*/
|
||||
public static void copyFile(File in, File out)
|
||||
throws IOException
|
||||
{
|
||||
FileChannel inChannel = null;
|
||||
FileChannel outChannel = null;
|
||||
FileInputStream input = null;
|
||||
FileOutputStream output = null;
|
||||
|
||||
try
|
||||
{
|
||||
input = new FileInputStream(in);
|
||||
output = new FileOutputStream(out);
|
||||
|
||||
inChannel = input.getChannel();
|
||||
outChannel = output.getChannel();
|
||||
|
||||
inChannel.transferTo(0L, inChannel.size(), outChannel);
|
||||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
if (inChannel != null)
|
||||
{
|
||||
inChannel.close();
|
||||
}
|
||||
|
||||
if (input != null)
|
||||
{
|
||||
input.close();
|
||||
}
|
||||
}
|
||||
catch (Exception ignore)
|
||||
{
|
||||
; // Do nothing
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (outChannel != null)
|
||||
{
|
||||
outChannel.close();
|
||||
}
|
||||
|
||||
if (output != null)
|
||||
{
|
||||
output.close();
|
||||
}
|
||||
}
|
||||
catch (Exception ignore)
|
||||
{
|
||||
; // Do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current Internet (beat) Time.
|
||||
*
|
||||
* @return The Internet Time string.
|
||||
*/
|
||||
public static String internetTime()
|
||||
{
|
||||
final Calendar gc = Calendar.getInstance();
|
||||
|
||||
final int offset = (gc.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000));
|
||||
int hh = gc.get(Calendar.HOUR_OF_DAY);
|
||||
final int mm = gc.get(Calendar.MINUTE);
|
||||
final int ss = gc.get(Calendar.SECOND);
|
||||
|
||||
hh -= offset; // GMT
|
||||
hh += 1; // BMT
|
||||
|
||||
long beats = Math.round(Math.floor((double) ((((hh * 3600) + (mm * 60) + ss) * 1000) / 86400)));
|
||||
|
||||
if (beats >= 1000)
|
||||
{
|
||||
beats -= (long) 1000;
|
||||
}
|
||||
else if (beats < 0)
|
||||
{
|
||||
beats += (long) 1000;
|
||||
}
|
||||
|
||||
if (beats < 10)
|
||||
{
|
||||
return ("@00" + String.valueOf(beats));
|
||||
}
|
||||
else if (beats < 100)
|
||||
{
|
||||
return ("@0" + String.valueOf(beats));
|
||||
}
|
||||
|
||||
return ('@' + String.valueOf(beats));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a property as an int.
|
||||
*
|
||||
* @param property The port property value.
|
||||
* @param def The default property value.
|
||||
*
|
||||
* @return The port or default value if invalid.
|
||||
*/
|
||||
public static int getIntProperty(String property, int def)
|
||||
{
|
||||
int prop;
|
||||
|
||||
try
|
||||
{
|
||||
prop = Integer.parseInt(property);
|
||||
}
|
||||
catch (NumberFormatException ignore)
|
||||
{
|
||||
prop = def;
|
||||
}
|
||||
|
||||
return prop;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that the given location (File/URL) has a trailing slash (<code>/</code>) to indicate a directory.
|
||||
*
|
||||
* @param location The File or URL location.
|
||||
* @param isUrl Set to true if the location is a URL
|
||||
*
|
||||
* @return The location ending with a slash.
|
||||
*/
|
||||
public static String ensureDir(String location, boolean isUrl)
|
||||
{
|
||||
if (isUrl)
|
||||
{
|
||||
if (location.charAt(location.length() - 1) == '/')
|
||||
{
|
||||
return location;
|
||||
}
|
||||
else
|
||||
{
|
||||
return location + '/';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (location.charAt(location.length() - 1) == File.separatorChar)
|
||||
{
|
||||
return location;
|
||||
}
|
||||
else
|
||||
{
|
||||
return location + File.separatorChar;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the given string is valid.
|
||||
*
|
||||
* @param s The string to validate.
|
||||
*
|
||||
* @return true if the string is non-empty and not null, false otherwise.
|
||||
*/
|
||||
public static boolean isValidString(String s)
|
||||
{
|
||||
return (s != null) && (s.trim().length() > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the given int bold.
|
||||
*
|
||||
* @param i The int.
|
||||
*
|
||||
* @return The bold string.
|
||||
*/
|
||||
public static String bold(int i)
|
||||
{
|
||||
return Colors.BOLD + i + Colors.BOLD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns today's date.
|
||||
*
|
||||
* @return Today's date in {@link #ISO_SDF ISO} format.
|
||||
*/
|
||||
public static String today()
|
||||
{
|
||||
return ISO_SDF.format(Calendar.getInstance().getTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the given string bold.
|
||||
*
|
||||
* @param s The string.
|
||||
*
|
||||
* @return The bold string.
|
||||
*/
|
||||
public static String bold(String s)
|
||||
{
|
||||
return Colors.BOLD + s + Colors.BOLD;
|
||||
}
|
||||
}
|
110
src/main/java/net/thauvin/erik/mobibot/War.java
Normal file
110
src/main/java/net/thauvin/erik/mobibot/War.java
Normal file
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* @(#)War.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* The <code>War</code> class.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-28
|
||||
* @since 1.0
|
||||
*/
|
||||
public class War
|
||||
{
|
||||
/**
|
||||
* The deck of card for the {@link net.thauvin.erik.mobibot.Commands#WAR_CMD war} command.
|
||||
*/
|
||||
private static final String[] WAR_DECK =
|
||||
new String[]{"Ace", "King", "Queen", "Jack", "10", "9", "8", "7", "6", "5", "4", "3", "2"};
|
||||
|
||||
/**
|
||||
* The suits for the deck of card for the {@link Commands#WAR_CMD war} command.
|
||||
*/
|
||||
private static final String[] WAR_SUITS = new String[]{"Hearts", "Spades", "Diamonds", "Clubs"};
|
||||
|
||||
/**
|
||||
* Disables the default constructor.
|
||||
*
|
||||
* @throws UnsupportedOperationException if an error occurred. if the constructor is called.
|
||||
*/
|
||||
private War()
|
||||
throws UnsupportedOperationException
|
||||
{
|
||||
throw new UnsupportedOperationException("Illegal constructor call.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Plays war.
|
||||
*
|
||||
* @param bot The bot.
|
||||
* @param sender The sender's nickname.
|
||||
*/
|
||||
public static void play(Mobibot bot, String sender)
|
||||
{
|
||||
final Random r = new Random();
|
||||
|
||||
int i;
|
||||
int y;
|
||||
|
||||
while (true)
|
||||
{
|
||||
i = r.nextInt(WAR_DECK.length);
|
||||
y = r.nextInt(WAR_DECK.length);
|
||||
|
||||
bot.send(bot.getChannel(),
|
||||
sender + " drew the " + Utils.bold(WAR_DECK[i]) + " of " + WAR_SUITS[r.nextInt(WAR_SUITS.length)]);
|
||||
bot.action("drew the " + Utils.bold(WAR_DECK[y]) + " of " + WAR_SUITS[r.nextInt(WAR_SUITS.length)]);
|
||||
|
||||
if (i != y)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < y)
|
||||
{
|
||||
bot.action("lost.");
|
||||
}
|
||||
else if (i > y)
|
||||
{
|
||||
bot.action("wins.");
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.action("tied.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* @(#)Weather.java
|
||||
*
|
||||
* Copyright (c) 2004, Erik C. Thauvin (erik@thauvin.net)
|
||||
* Copyright (c) 2004-2014, Erik C. Thauvin (erik@thauvin.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -30,10 +30,8 @@
|
|||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
package net.thauvin.erik.mobibot;
|
||||
|
||||
import net.sf.jweather.metar.Metar;
|
||||
|
@ -48,7 +46,6 @@ import java.util.Iterator;
|
|||
* Fetches the weather data from a specific station ID.
|
||||
*
|
||||
* @author Erik C. Thauvin
|
||||
* @version $Revision$, $Date$
|
||||
* @created Feb 7, 2004
|
||||
* @since 1.0
|
||||
*/
|
||||
|
@ -116,9 +113,9 @@ public class Weather implements Runnable
|
|||
bot.send(sender, "Station ID: " + metar.getStationID(), isPrivate);
|
||||
|
||||
bot.send(sender,
|
||||
"At: " + metar.getDateString() + " UTC (" + (
|
||||
((new Date()).getTime() - metar.getDate().getTime()) / 1000L / 60L) + " minutes ago)",
|
||||
isPrivate
|
||||
"At: " + Utils.UTC_SDF.format(metar.getDate()) + " UTC (" + (
|
||||
((new Date()).getTime() - metar.getDate().getTime()) / 1000L / 60L) + " minutes ago)",
|
||||
isPrivate
|
||||
);
|
||||
|
||||
result = metar.getWindSpeedInMPH();
|
||||
|
@ -126,28 +123,30 @@ public class Weather implements Runnable
|
|||
if (result != null)
|
||||
{
|
||||
bot.send(sender,
|
||||
"Wind Speed: " + result + " mph, " + metar.getWindSpeedInKnots() + " knots", isPrivate);
|
||||
"Wind Speed: " + result + " mph, " + metar.getWindSpeedInKnots() + " knots, " + metar
|
||||
.getWindSpeedInMPS() + " m/s",
|
||||
isPrivate
|
||||
);
|
||||
}
|
||||
|
||||
result = metar.getVisibility();
|
||||
|
||||
if (result != null)
|
||||
{
|
||||
if (!metar.getVisibilityLessThan())
|
||||
{
|
||||
bot.send(sender, "Visibility: " + NUMBER_FORMAT.format(result) + " mile(s)", isPrivate);
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.send(sender, "Visibility: < " + NUMBER_FORMAT.format(result) + " mile(s)", isPrivate);
|
||||
}
|
||||
bot.send(sender,
|
||||
"Visibility: " + (metar.getVisibilityLessThan() ? "< " : "") + NUMBER_FORMAT.format(result)
|
||||
+ " mi, " + metar.getVisibilityInKilometers() + " km",
|
||||
isPrivate
|
||||
);
|
||||
}
|
||||
|
||||
result = metar.getPressure();
|
||||
|
||||
if (result != null)
|
||||
{
|
||||
bot.send(sender, "Pressure: " + result + " in Hg", isPrivate);
|
||||
bot.send(sender,
|
||||
"Pressure: " + result + " Hg, " + metar.getPressureInHectoPascals() + " hPa",
|
||||
isPrivate);
|
||||
}
|
||||
|
||||
result = metar.getTemperatureInCelsius();
|
||||
|
@ -155,7 +154,8 @@ public class Weather implements Runnable
|
|||
if (result != null)
|
||||
{
|
||||
bot.send(sender,
|
||||
"Temperature: " + result + " C, " + metar.getTemperatureInFahrenheit() + " F", isPrivate);
|
||||
"Temperature: " + result + " \u00B0C, " + metar.getTemperatureInFahrenheit() + " \u00B0F",
|
||||
isPrivate);
|
||||
}
|
||||
|
||||
if (metar.getWeatherConditions() != null)
|
||||
|
@ -192,6 +192,6 @@ public class Weather implements Runnable
|
|||
}
|
||||
}
|
||||
|
||||
bot.helpResponse(sender, Mobibot.WEATHER_CMD);
|
||||
bot.helpResponse(sender, Commands.WEATHER_CMD);
|
||||
}
|
||||
}
|
||||
|
|
190
src/main/java/net/thauvin/erik/mobibot/WorldTime.java
Normal file
190
src/main/java/net/thauvin/erik/mobibot/WorldTime.java
Normal file
|
@ -0,0 +1,190 @@
|
|||
/*
|
||||
* @(#)Time.java
|
||||
*
|
||||
* Copyright (c) 2004-2014, 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 the author 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 OWNER 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;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Map;
|
||||
import java.util.TimeZone;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* Processes the {@link net.thauvin.erik.mobibot.Commands#TIME_CMD} command.
|
||||
*
|
||||
* @author <a href="mailto:erik@thauvin.net">Erik C. Thauvin</a>
|
||||
* @created 2014-04-27
|
||||
* @since 1.0
|
||||
*/
|
||||
public class WorldTime
|
||||
{
|
||||
/**
|
||||
* The countries supported by the {@link net.thauvin.erik.mobibot.Commands#TIME_CMD time} command.
|
||||
*/
|
||||
private static final Map<String, String> COUNTRIES_MAP = new TreeMap<String, String>();
|
||||
|
||||
/**
|
||||
* The beats (Internet Time) keyword.
|
||||
*/
|
||||
private static final String BEATS_KEYWORD = ".beats";
|
||||
|
||||
/**
|
||||
* The date/time format for the {@link net.thauvin.erik.mobibot.Commands#TIME_CMD time} command.
|
||||
*/
|
||||
private static final SimpleDateFormat TIME_SDF =
|
||||
new SimpleDateFormat("'The time is 'HH:mm' on 'EEEE, d MMMM yyyy' in '");
|
||||
|
||||
/**
|
||||
* Creates a new time object.
|
||||
*/
|
||||
public WorldTime()
|
||||
{
|
||||
// Initialize the countries map
|
||||
COUNTRIES_MAP.put("AU", "Australia/Sydney");
|
||||
COUNTRIES_MAP.put("BE", "Europe/Brussels");
|
||||
COUNTRIES_MAP.put("CA", "America/Montreal");
|
||||
COUNTRIES_MAP.put("CDT", "America/Chicago");
|
||||
COUNTRIES_MAP.put("CET", "CET");
|
||||
COUNTRIES_MAP.put("CH", "Europe/Zurich");
|
||||
COUNTRIES_MAP.put("CN", "Asia/Shanghai");
|
||||
COUNTRIES_MAP.put("CST", "America/Chicago");
|
||||
COUNTRIES_MAP.put("CU", "Cuba");
|
||||
COUNTRIES_MAP.put("DE", "Europe/Berlin");
|
||||
COUNTRIES_MAP.put("DK", "Europe/Copenhagen");
|
||||
COUNTRIES_MAP.put("EDT", "America/New_York");
|
||||
COUNTRIES_MAP.put("EG", "Africa/Cairo");
|
||||
COUNTRIES_MAP.put("ER", "Africa/Asmara");
|
||||
COUNTRIES_MAP.put("ES", "Europe/Madrid");
|
||||
COUNTRIES_MAP.put("EST", "America/New_York");
|
||||
COUNTRIES_MAP.put("FI", "Europe/Helsinki");
|
||||
COUNTRIES_MAP.put("FR", "Europe/Paris");
|
||||
COUNTRIES_MAP.put("GB", "Europe/London");
|
||||
COUNTRIES_MAP.put("GMT", "GMT");
|
||||
COUNTRIES_MAP.put("HK", "Asia/Hong_Kong");
|
||||
COUNTRIES_MAP.put("HST", "HST");
|
||||
COUNTRIES_MAP.put("IE", "Europe/Dublin");
|
||||
COUNTRIES_MAP.put("IL", "Asia/Tel_Aviv");
|
||||
COUNTRIES_MAP.put("IN", "Asia/Calcutta");
|
||||
COUNTRIES_MAP.put("IR", "Asia/Tehran");
|
||||
COUNTRIES_MAP.put("IS", "Atlantic/Reykjavik");
|
||||
COUNTRIES_MAP.put("IT", "Europe/Rome");
|
||||
COUNTRIES_MAP.put("JM", "Jamaica");
|
||||
COUNTRIES_MAP.put("JP", "Asia/Tokyo");
|
||||
COUNTRIES_MAP.put("LY", "Africa/Tripoli");
|
||||
COUNTRIES_MAP.put("MDT", "America/Denver");
|
||||
COUNTRIES_MAP.put("MH", "Kwajalein");
|
||||
COUNTRIES_MAP.put("MST", "America/Denver");
|
||||
COUNTRIES_MAP.put("MX", "America/Mexico_City");
|
||||
COUNTRIES_MAP.put("NL", "Europe/Amsterdam");
|
||||
COUNTRIES_MAP.put("NO", "Europe/Oslo");
|
||||
COUNTRIES_MAP.put("NP", "Asia/Katmandu");
|
||||
COUNTRIES_MAP.put("NZ", "Pacific/Auckland");
|
||||
COUNTRIES_MAP.put("PDT", "America/Los_Angeles");
|
||||
COUNTRIES_MAP.put("PK", "Asia/Karachi");
|
||||
COUNTRIES_MAP.put("PL", "Europe/Warsaw");
|
||||
COUNTRIES_MAP.put("PST", "America/Los_Angeles");
|
||||
COUNTRIES_MAP.put("PT", "Europe/Lisbon");
|
||||
COUNTRIES_MAP.put("RU", "Europe/Moscow");
|
||||
COUNTRIES_MAP.put("SE", "Europe/Stockholm");
|
||||
COUNTRIES_MAP.put("SG", "Asia/Singapore");
|
||||
COUNTRIES_MAP.put("SU", "Europe/Moscow");
|
||||
COUNTRIES_MAP.put("TH", "Asia/Bangkok");
|
||||
COUNTRIES_MAP.put("TM", "Asia/Ashgabat");
|
||||
COUNTRIES_MAP.put("TR", "Europe/Istanbul");
|
||||
COUNTRIES_MAP.put("TW", "Asia/Taipei");
|
||||
COUNTRIES_MAP.put("UK", "Europe/London");
|
||||
COUNTRIES_MAP.put("US", "America/New_York");
|
||||
COUNTRIES_MAP.put("UTC", "UTC");
|
||||
COUNTRIES_MAP.put("VA", "Europe/Vatican");
|
||||
COUNTRIES_MAP.put("VN", "Asia/Ho_Chi_Minh");
|
||||
COUNTRIES_MAP.put("INTERNET", BEATS_KEYWORD);
|
||||
COUNTRIES_MAP.put("BEATS", BEATS_KEYWORD);
|
||||
|
||||
for (final String tz : TimeZone.getAvailableIDs())
|
||||
{
|
||||
if (!tz.contains("/") && tz.length() == 3 & !COUNTRIES_MAP.containsKey(tz))
|
||||
{
|
||||
COUNTRIES_MAP.put(tz, tz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Responds with the current time.
|
||||
*
|
||||
* @param sender The nick of the person who sent the message.
|
||||
* @param args The time command arguments.
|
||||
* @param isPrivate Set to true is the response should be send as a private message.
|
||||
*/
|
||||
public final void timeResponse(Mobibot bot, String sender, String args, boolean isPrivate)
|
||||
{
|
||||
boolean isInvalidTz = false;
|
||||
final String tz = (COUNTRIES_MAP.get((args.substring(args.indexOf(' ') + 1).trim().toUpperCase())));
|
||||
final String response;
|
||||
|
||||
if (tz != null)
|
||||
{
|
||||
if (tz.equals(BEATS_KEYWORD))
|
||||
{
|
||||
response = ("The current Internet Time is: " + Utils.internetTime() + ' ' + BEATS_KEYWORD);
|
||||
}
|
||||
else
|
||||
{
|
||||
TIME_SDF.setTimeZone(TimeZone.getTimeZone(tz));
|
||||
response = TIME_SDF.format(Calendar.getInstance().getTime()) + tz.substring(tz.indexOf('/') + 1)
|
||||
.replace('_', ' ');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
isInvalidTz = true;
|
||||
response = "The supported time zones/countries are: " + COUNTRIES_MAP.keySet().toString();
|
||||
}
|
||||
|
||||
if (isPrivate)
|
||||
{
|
||||
bot.send(sender, response, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isInvalidTz)
|
||||
{
|
||||
bot.send(sender, response);
|
||||
}
|
||||
else
|
||||
{
|
||||
bot.send(bot.getChannel(), response);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue