package org.stevewinfield.suja.idk.game.event.impl;
import org.apache.log4j.Logger;
import org.stevewinfield.suja.idk.Bootloader;
import org.stevewinfield.suja.idk.game.event.Event;
import org.stevewinfield.suja.idk.game.event.item.ItemPurchaseClubEvent;
import org.stevewinfield.suja.idk.game.event.item.ItemPurchaseEvent;
import org.stevewinfield.suja.idk.game.event.player.PlayerChatEvent;
import org.stevewinfield.suja.idk.game.event.session.SessionAuthenticatedEvent;
import org.stevewinfield.suja.idk.game.event.session.SessionMakeEvent;
import org.stevewinfield.suja.idk.game.event.session.SessionRemoveEvent;
import java.util.HashMap;
import java.util.Map;
public class EventUtils {
private final static Map<String, Class<? extends Event>> eventClasses = new HashMap<>();
private final static Logger logger = Logger.getLogger(EventUtils.class);
public static Class<? extends Event> eventStringToClass(String name) {
if (eventClasses.containsKey(name)) {
return eventClasses.get(name);
}
try {
Class<?> clazz = Class.forName(name, true, Bootloader.getCustomClassLoader());
if (Event.class.isAssignableFrom(clazz)) {
return (Class<? extends Event>) clazz;
}
throw new Error("Class " + name + " is not assignable to an event.");
} catch (ClassNotFoundException e) {
throw new Error("Unable to find event class " + name);
}
}
public static void addEventClass(Class<? extends Event> eventClass) {
if (eventClasses.containsKey(eventClass.getSimpleName())) {
logger.warn("Event " + eventClass.getSimpleName() + " already exists in EventUtils.");
}
eventClasses.put(eventClass.getSimpleName(), eventClass);
eventClasses.put(eventClass.getSimpleName().substring(0, eventClass.getSimpleName().length() - 5), eventClass);
}
static {
// Session
addEventClass(SessionAuthenticatedEvent.class);
addEventClass(SessionMakeEvent.class);
addEventClass(SessionRemoveEvent.class);
// Player
addEventClass(PlayerChatEvent.class);
// Items
addEventClass(ItemPurchaseClubEvent.class);
addEventClass(ItemPurchaseEvent.class);
}
}