IrcServlet.java 5.65 KB
/*
 * Copyright Codecrew Ry
 * 
 * All rights reserved.
 * 
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software. 
 * 
 * Any distribution and use in source and binary forms, with or without 
 * modification is not permitted without explicit written permission from the 
 * copyright owner. 
 * 
 * A non-exclusive royalty-free right is granted to the copyright owner of the 
 * Software to use, modify and distribute all modifications to the Software in 
 * future versions of the Software. 
 * 
 */
/*
 * Copyright Codecrew Ry
 *
 * All rights reserved. 	
 *
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such * software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software.
 *
 * Any distribution and use in source and binary forms, with or without
 * modification is not permitted without explicit written permission from the
 * copyright owner.
 *
 * A non-exclusive royalty-free right is granted to the copyright owner of the
 * Software to use, modify and distribute all modifications to the Software in
 * future versions of the Software.
 * 
 */
package fi.codecrew.moya.servlet;

import java.io.IOException;
import java.util.ArrayList;

import javax.ejb.EJB;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.codecrew.moya.beans.BotBeanLocal;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.utilities.SystemProperty;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;
import fi.iudex.utils.irc.IrcBot;
import fi.iudex.utils.irc.IrcBotListener;
import net.sf.jerklib.Profile;

/**
 * Servlet implementation class SshServlet
 */
@WebServlet(urlPatterns = "/irc", loadOnStartup = 10)
public class IrcServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final Logger logger = LoggerFactory.getLogger(IrcServlet.class);

	@EJB
	private EventBeanLocal eventbean;

	@EJB
	private PermissionBeanLocal permBean;
	private final ArrayList<IrcBot> bots = new ArrayList<>();

	@EJB
	private BotBeanLocal botbean;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public IrcServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	@EJB
	private PlaceBeanLocal placebean;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {

		startBot();
	}

	private void startBot() {

		String ircserver = SystemProperty.MOYA_IRC_SERVER.getValueOrDefault();
		logger.info("Got irc server system property {}", ircserver);
		if (ircserver != null) {
			logger.info("Starting IRC client with server {}", ircserver);
			IrcBot bot = new IrcBot(ircserver, 6667, SystemProperty.MOYA_IRC_SERVERPASS.getValueOrNull(),
					SystemProperty.MOYA_IRC_CHANNEL.getValueOrDefault(),
					new Profile("moyabot", "Moya bot", "moya-bot"));

			botbean.addBot(bot);
			bot.addCmdListener("addignore", new MessgaeIgnoreListener());
			bot.addCmdListener("rmignore", new RemoveMessgaeIgnoreListener());
			bot.addCmdListener("lsignores", new ListMessgaeIgnoreListener());

			bots.add(bot);
			bot.start();
		}
	}

	private class MessgaeIgnoreListener implements IrcBotListener {

		@Override
		public String getUsageMessage() {
			return "Add value as message to be ignored";
		}

		@Override
		public void executeIrc(IrcBot bot, String data) {
			try {
				MoyaEventType d = MoyaEventType.valueOf(data);
				botbean.getIgnoreTypes().add(d);
				bot.say("Added " + data + " as ignored message type");
			} catch (Exception e) {
				bot.say("Unknown message type " + data);
			}
		}
	}

	private class RemoveMessgaeIgnoreListener implements IrcBotListener {

		@Override
		public String getUsageMessage() {
			return "remove value from message ignore list";
		}

		@Override
		public void executeIrc(IrcBot bot, String data) {
			botbean.getIgnoreTypes().remove(data);
			bot.say("Removed " + data + " from ignored message types");
		}
	}

	private class ListMessgaeIgnoreListener implements IrcBotListener {

		@Override
		public String getUsageMessage() {
			return "List message ignore list entries";
		}

		@Override
		public void executeIrc(IrcBot bot, String data) {
			StringBuilder sb = new StringBuilder();
			sb.append("Ignored messagetypes: ");
			for (MoyaEventType d : botbean.getIgnoreTypes()) {
				sb.append(d.name()).append(", ");
			}
			bot.say(sb.toString());
		}
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		logger.info("Destroying irc servlet");
		for (IrcBot b : bots) {
			b.stop();
		}
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		for (IrcBot b : bots) {
			try {
				b.stop();

			} catch (Exception t) {
				logger.info("Error stopping bot", t);
			}
		}
		bots.clear();

		startBot();

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}