/*
* BotEventDispatchThread.java
*
* Copyright (C) 2008 AppleGrew
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.elite.jdcbot.framework;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.elite.jdcbot.shareframework.SearchResultSet;
import org.elite.jdcbot.shareframework.SearchSet;
import org.slf4j.Logger;
/**
* Created on 31-May-08
* @since 0.7.1
* @version 0.3
* @author AppleGrew
*
*/
public class BotEventDispatchThread extends Thread {
private static final Logger logger = GlobalObjects.getLogger(BotEventDispatchThread.class);
private static enum Method {
onDownloadComplete,
onUploadComplete,
onUploadStart,
onUpdateMyInfo,
onDownloadStart,
onActiveSearch,
onPassiveSearch,
onChannelMessage,
onPrivateMessage,
onQuit,
onJoin,
onPublicMessage,
onDisconnect,
onBotQuit,
onConnect2Client,
onConnect,
onSearchResult,
onSendCommandFailed,
onHubName
}
private List<DispatchEntity> dispatch;
private volatile boolean running;
private jDCBot _bot;
public BotEventDispatchThread(jDCBot bot) {
super("jDCBot-EventDispatchThread");
dispatch = Collections.synchronizedList(new ArrayList<DispatchEntity>());
_bot = bot;
running = true;
start();
}
public void run() {
while (running) {
while (!dispatch.isEmpty()) {
DispatchEntity de = null;
de = dispatch.get(0);
dispatch.remove(0);
Method method = de.method;
Object args[] = de.params;
switch (method) {
case onDownloadComplete:
BotException e = (BotException) getArg(args, 3);
boolean success = (Boolean) getArg(args, 2);
if (_bot.getDownloadCentral() != null) {
e =
_bot.getDownloadCentral().onDownloadFinished((User) getArg(args, 0), (DUEntity) getArg(args, 1),
success, e);
if (success) {
if (e != null)
success = false;
} else if (e == null)
continue;
}
_bot.onDownloadComplete((User) getArg(args, 0), (DUEntity) getArg(args, 1), success, e);
break;
case onUploadComplete:
_bot.onUploadComplete((User) getArg(args, 0), (DUEntity) getArg(args, 1), (Boolean) getArg(args, 2),
(BotException) getArg(args, 3));
break;
case onUploadStart:
_bot.onUploadStart((User) getArg(args, 0), (DUEntity) getArg(args, 1));
break;
case onUpdateMyInfo:
_bot.onUpdateMyInfo((String) getArg(args, 0));
break;
case onDownloadStart:
if (_bot.getDownloadCentral() != null)
_bot.getDownloadCentral().onDownloadStart((DUEntity) getArg(args, 1), (User) getArg(args, 0));
_bot.onDownloadStart((User) getArg(args, 0), (DUEntity) getArg(args, 1));
break;
case onPassiveSearch:
_bot.onPassiveSearch((String) getArg(args, 0), (SearchSet) getArg(args, 1));
break;
case onActiveSearch:
_bot.onActiveSearch((String) getArg(args, 0), (Integer) getArg(args, 1), (SearchSet) getArg(args, 2));
break;
case onChannelMessage:
_bot.onChannelMessage((String) getArg(args, 0), (String) getArg(args, 1), (String) getArg(args, 2));
break;
case onPrivateMessage:
_bot.onPrivateMessage((String) getArg(args, 0), (String) getArg(args, 1));
break;
case onQuit:
_bot.onQuit((String) getArg(args, 0));
break;
case onJoin:
_bot.onJoin((String) getArg(args, 0));
break;
case onPublicMessage:
_bot.onPublicMessage((String) getArg(args, 0), (String) getArg(args, 1));
break;
case onDisconnect:
_bot.onDisconnect();
break;
case onBotQuit:
_bot.onBotQuit();
break;
case onConnect2Client:
_bot.onConnect2Client();
break;
case onConnect:
_bot.onConnect();
break;
case onSearchResult:
_bot.onSearchResult((String) getArg(args, 0), (String) getArg(args, 1), (Integer) getArg(args, 2),
(SearchResultSet) getArg(args, 3), (Integer) getArg(args, 4), (Integer) getArg(args, 5), (String) getArg(
args, 6));
break;
case onSendCommandFailed:
_bot.onSendCommandFailed((String) getArg(args, 0), (Throwable) getArg(args, 1), (JMethod) getArg(args, 1));
break;
case onHubName:
_bot.onHubName((String) getArg(args, 0));
break;
default:
try {
throw new NoSuchMethodException("Method :" + method);
} catch (NoSuchMethodException nsme) {
logger.error("No method " + method + " found.", nsme);
}
}
}
try {
if (dispatch.isEmpty()) {
sleep(100L);
}
} catch (InterruptedException e) {}
}
}
private Object getArg(Object args[], int i) {
return (args == null ? null : args[i]);
}
public void stopIt() {
running = false;
this.interrupt();
}
private class DispatchEntity {
public Method method;
public Object params[];
}
private void addToDispath(DispatchEntity de) {
dispatch.add(de);
this.interrupt();
}
//*********Proxy functions*********/
void callOnDownloadComplete(User user, DUEntity due, boolean success, BotException e) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onDownloadComplete;
de.params = new Object[] { user, due, success, e };
addToDispath(de);
}
void callOnUploadComplete(User user, DUEntity due, boolean success, BotException e) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onUploadComplete;
de.params = new Object[] { user, due, success, e };
addToDispath(de);
}
void callOnUploadStart(User user, DUEntity due) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onUploadStart;
de.params = new Object[] { user, due };
addToDispath(de);
}
void callOnUpdateMyInfo(String user) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onUpdateMyInfo;
de.params = new Object[] { user };
addToDispath(de);
}
void callOnDownloadStart(User user, DUEntity due) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onDownloadStart;
de.params = new Object[] { user, due };
addToDispath(de);
}
void callOnPassiveSearch(String user, SearchSet search) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onPassiveSearch;
de.params = new Object[] { user, search };
addToDispath(de);
}
void callOnActiveSearch(String ip, int port, SearchSet search) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onActiveSearch;
de.params = new Object[] { ip, port, search };
addToDispath(de);
}
void callOnChannelMessage(String user, String channel, String message) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onChannelMessage;
de.params = new Object[] { user, channel, message };
addToDispath(de);
}
void callOnPrivateMessage(String user, String message) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onPrivateMessage;
de.params = new Object[] { user, message };
addToDispath(de);
}
void callOnQuit(String user) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onQuit;
de.params = new Object[] { user };
addToDispath(de);
}
void callOnJoin(String user) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onJoin;
de.params = new Object[] { user };
addToDispath(de);
}
void callOnPublicMessage(String user, String message) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onPublicMessage;
de.params = new Object[] { user, message };
addToDispath(de);
}
void callOnDisconnect() {
DispatchEntity de = new DispatchEntity();
de.method = Method.onDisconnect;
de.params = null;
addToDispath(de);
}
void callOnBotQuit() {
DispatchEntity de = new DispatchEntity();
de.method = Method.onBotQuit;
de.params = null;
addToDispath(de);
}
void callOnConnect2Client() {
DispatchEntity de = new DispatchEntity();
de.method = Method.onConnect2Client;
de.params = null;
addToDispath(de);
}
void callOnConnect() {
DispatchEntity de = new DispatchEntity();
de.method = Method.onConnect;
de.params = null;
addToDispath(de);
}
void callOnSearchResult(String senderNick, String senderIP, int senderPort, SearchResultSet result, int free_slots, int total_slots,
String hubName) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onSearchResult;
de.params = new Object[] { senderNick, senderIP, senderPort, result, free_slots, total_slots, hubName };
addToDispath(de);
}
public void callOnSendCommandFailed(String msg, Throwable e, JMethod src) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onSendCommandFailed;
de.params = new Object[] { msg, e, src };
addToDispath(de);
}
public void callOnHubName(String hubName) {
DispatchEntity de = new DispatchEntity();
de.method = Method.onHubName;
de.params = new Object[] { hubName };
addToDispath(de);
}
}