/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package gcb.bot; import gcb.GCBConfig; import gcb.GarenaInterface; import gcb.Main; import java.util.LinkedList; import java.util.Map; /** * * @author wizardus */ public class ChatThread extends Thread { LinkedList<ChatMessage> chat_queue; Map<Integer, GarenaInterface> garenaConnections; public static final int MAIN_CHAT = -1; public static final int ANNOUNCEMENT = -2; public static final int SLEEP = -3; int delay; public ChatThread(Map<Integer, GarenaInterface> garenaConnections) { this.garenaConnections = garenaConnections; chat_queue = new LinkedList<ChatMessage>(); //configuration delay = GCBConfig.configuration.getInt("gcb_bot_delay", 2000); } public void queueChat(int garenaId, String message, int target_user) { GarenaInterface garena; synchronized(garenaConnections) { if(garenaConnections.containsKey(garenaId)) { garena = garenaConnections.get(garenaId); } else { Main.println(1, "[ChatThread] Warning: unable to find Garena interface for id=" + garenaId); return; } } synchronized(chat_queue) { //LinkedList is not thread safe if(target_user == ANNOUNCEMENT) { if(message.length() < 499) { ChatMessage add = new ChatMessage(garena, message, target_user); chat_queue.add(add); } else { for(int i = 0; i < message.length(); i+=499) { String split = message.substring(i, Math.min(i + 499, message.length() - 1)); ChatMessage add = new ChatMessage(garena, split, target_user); chat_queue.add(add); } } } else { if(message.length() < 150) { ChatMessage add = new ChatMessage(garena, message, target_user); chat_queue.add(add); } else { while(message.length() > 150) { String split = message.substring(0, 150); int indexOfLastSpace = split.lastIndexOf(' '); split = split.substring(0, indexOfLastSpace); message = message.substring(split.length()+1); ChatMessage add = new ChatMessage(garena, split, target_user); chat_queue.add(add); } ChatMessage lastPart = new ChatMessage(garena, message, target_user); chat_queue.add(lastPart); } } chat_queue.notifyAll(); //in case run() is waiting for us Main.println(0, "[QUEUED: " + target_user + "] " + message); } } //in case we're flooding or something public void clearQueue() { synchronized(chat_queue) { chat_queue.clear(); chat_queue.notifyAll(); } } public void run() { while(true) { //wait until we get a message synchronized(chat_queue) { while(chat_queue.isEmpty()) { try { chat_queue.wait(); //wait until queueChat is called } catch(InterruptedException e) {} } } ChatMessage message = chat_queue.poll(); if(message == null) { continue; } if(message.target_user == MAIN_CHAT) { message.garena.sendGCRPChat(message.str); } else if(message.target_user == ANNOUNCEMENT) { message.garena.sendGCRPAnnounce(message.str); try { Thread.sleep(1500); } catch(InterruptedException e) { Main.println(11, "[ChatThread] Sleep was interrupted!" + e.getLocalizedMessage()); } } else if(message.target_user == SLEEP) { //stops the bot sending messages too quickly try { Thread.sleep(1500); //prevent flooding } catch(InterruptedException e) { Main.println(11, "[ChatThread] Sleep was interrupted!" + e.getLocalizedMessage()); } } else { message.garena.sendGCRPWhisper(message.target_user, message.str); } try { Thread.sleep(delay); //prevent flooding } catch(InterruptedException e) {} } } public void sleep(int time) { try { Thread.sleep(time); } catch(InterruptedException e) {} } } class ChatMessage { GarenaInterface garena; String str; int target_user; //-1 for not whisper public ChatMessage(GarenaInterface garena, String str, int target) { this.garena = garena; this.str = str; target_user = target; } }