package info.persistent.pushbot; import com.google.appengine.api.xmpp.JID; import com.google.appengine.api.xmpp.Message; import com.google.appengine.api.xmpp.XMPPService; import com.google.appengine.api.xmpp.XMPPServiceFactory; import info.persistent.pushbot.commands.Command; import info.persistent.pushbot.util.Xmpp; import java.io.IOException; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class XmppReceiverServlet extends HttpServlet { private static Pattern PARTYCHAT_SENDER_RE = Pattern.compile("^\\s*\\[[^\\]]+]\\s*"); private static Pattern PARTYCHAT_PREFIX_RE = Pattern.compile("^\\s*push-?bot:\\s*"); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { XMPPService xmpp = XMPPServiceFactory.getXMPPService(); Message message; try { message = xmpp.parseMessage(req); } catch (IllegalArgumentException err) { // These exceptions are apparently caused by a bug in the Google Talk // Flash gadget, so let's just ignore them. // http://code.google.com/p/googleappengine/issues/detail?id=2082 resp.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } JID fromJid = message.getFromJid(); String body = message.getBody().trim(); // If we're getting messages from Partychat, require them to be addressed // specifically to us Matcher partychatMatcher = PARTYCHAT_SENDER_RE.matcher(body); if (partychatMatcher.find()) { body = partychatMatcher.replaceFirst(""); partychatMatcher = PARTYCHAT_PREFIX_RE.matcher(body); if (!partychatMatcher.find()) { return; } body = partychatMatcher.replaceFirst(""); } String[] bodyPieces = body.split("\\s+"); String commandName = bodyPieces[0]; String[] args = Arrays.copyOfRange(bodyPieces, 1, bodyPieces.length); // Ignore non-commands if (commandName.charAt(0) != '/') { return; } commandName = commandName.substring(1); for (Command command : Command.values()) { if (command.getName().equals(commandName)) { command.getHandler().handle(fromJid, args); return; } } Xmpp.sendMessage( fromJid, "Unknown command, see /help for more information."); } }