/* Copyright Paul James Mutton, 2001-2009, http://www.jibble.org/ This file is part of PircBot. This software is dual-licensed, allowing you to choose between the GNU General Public License (GPL) and the www.jibble.org Commercial License. Since the GPL may be too restrictive for use in a proprietary application, a commercial license is also provided. Full license information can be found at http://www.jibble.org/licenses/ */ package lib.pircbot; import java.io.BufferedWriter; import java.util.concurrent.ArrayBlockingQueue; /** * A Thread which is responsible for sending messages to the IRC server. * Messages are obtained from the outgoing message queue and sent * immediately if possible. If there is a flood of messages, then to * avoid getting kicked from a channel, we put a small delay between * each one. * * @author Paul James Mutton, * <a href="http://www.jibble.org/">http://www.jibble.org/</a> * @version 1.5.0 (Build time: Mon Dec 14 20:07:17 2009) */ public class OutputThread extends Thread { /** * Constructs an OutputThread for the underlying PircBot. All messages * sent to the IRC server are sent by this OutputThread to avoid hammering * the server. Messages are sent immediately if possible. If there are * multiple messages queued, then there is a delay imposed. * * @param bot The underlying PircBot instance. * @param outQueue The Queue from which we will obtain our messages. */ OutputThread(PircBot bot, ArrayBlockingQueue<String> outQueue, BufferedWriter bufferedWriter) { _bot = bot; _outQueue = outQueue; bwriter = bufferedWriter; this.setName(this.getClass() + "-Thread"); } public static final int MAX_LINE_LENGTH = 512; /** * A static method to write a line to a BufferedOutputStream and then pass * the line to the log method of the supplied PircBot instance. * * @param line The line to be written. "\r\n" is appended to the end. */ public synchronized void sendRawLine(String line) { if (line.length() > MAX_LINE_LENGTH - 2) { line = line.substring(0, MAX_LINE_LENGTH - 2); } try { bwriter.write(line + "\r\n"); bwriter.flush(); _bot.log(">>>" + line); } catch (Exception e) { // Silent response - just lose the line. } } /** * This method starts the Thread consuming from the outgoing message * Queue and sending lines to the server. */ public void run() { try { boolean running = true; while (running) { // Small delay to prevent spamming of the channel sleep(_bot.getMessageDelay()); String line = _outQueue.take(); if (line != null) { sendRawLine(line); } else { running = false; } } bwriter.close(); } catch (Exception e) { // Just let the method return naturally... } } @Override protected void finalize() throws Throwable { bwriter.close(); super.finalize(); } private PircBot _bot = null; private ArrayBlockingQueue<String> _outQueue = null; private BufferedWriter bwriter = null; }