package net.blay09.mods.eirairc.irc; import com.google.common.collect.Lists; import net.blay09.mods.eirairc.EiraIRC; import net.blay09.mods.eirairc.config.SharedGlobalConfig; import java.io.BufferedWriter; import java.io.IOException; import java.util.LinkedList; public class IRCSender implements Runnable { private static final String LINE_FEED = "\r\n"; private final IRCConnectionImpl connection; private Thread thread; private final LinkedList<String> queue = Lists.newLinkedList(); private boolean running; private BufferedWriter writer; public IRCSender(IRCConnectionImpl connection) { this.connection = connection; } public void setWriter(BufferedWriter writer) { this.writer = writer; } public void start() { if(running) { stop(); } running = true; thread = new Thread(this, "IRCSender"); thread.start(); } public boolean addToSendQueue(String message) { synchronized (queue) { queue.addLast(message); } return true; } @Override public void run() { try { while (running) { boolean antiFlood = false; synchronized (queue) { int queueSize = queue.size(); if (queueSize > 0) { int messagesSent = 0; while (messagesSent < queueSize && messagesSent < 3) { String entry = queue.removeFirst(); writer.write(entry); writer.write(LINE_FEED); messagesSent++; } writer.flush(); if(messagesSent < queueSize) { antiFlood = true; } } } try { Thread.sleep(antiFlood ? SharedGlobalConfig.antiFloodTime.get() : 100); } catch (InterruptedException ignored) {} } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { EiraIRC.proxy.handleException(connection, e); } running = false; } public boolean isRunning() { return running; } public void stop() { running = false; try { thread.join(); } catch (InterruptedException ignored) { } } }