changed internal Event and Command structure
This commit is contained in:
parent
3c6c0328ce
commit
da3b3ecf63
|
@ -1,18 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/target/classes" />
|
||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.json:json:20180130" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.1" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.11.1" level="project" />
|
||||
</component>
|
||||
</module>
|
2
pom.xml
2
pom.xml
|
@ -3,7 +3,7 @@
|
|||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>TelegramAPI</groupId>
|
||||
<artifactId>TelegramAPI</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<version>0.0.2</version>
|
||||
<build>
|
||||
<sourceDirectory>src/main/java</sourceDirectory>
|
||||
<resources>
|
||||
|
|
|
@ -39,7 +39,7 @@ public class TelegramAPI implements Runnable {
|
|||
private static final String API_URL = "https://api.telegram.org/bot";
|
||||
private static final String TOKENREGEX = "^\\d{4,9}:[\\w-]{12,64}$";
|
||||
private static final int TELEGRAMFILESIZELIMIT = 20000000;//20MB filesize https://core.telegram.org/bots/api#sending-files
|
||||
public static final String APIVERSION = "3.7";//February 7, 2019
|
||||
public static final String APIVERSION = "3.8";//May 18, 2019
|
||||
|
||||
private int msg_offset = 0;
|
||||
private int updateInterval = 1500;
|
||||
|
|
|
@ -7,12 +7,14 @@ import de.mrbesen.telegram.TelegramAPI;
|
|||
import de.mrbesen.telegram.objects.TMessage;
|
||||
import de.mrbesen.telegram.objects.TUser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class CommandManager {
|
||||
|
||||
|
||||
private final static String CMDPATTERN = "^[\\w-]+$";
|
||||
private final TelegramAPI api;
|
||||
|
||||
private Multimap<String, ICommandHandler> handlerlist = ArrayListMultimap.create();//list of all registered CommandHandler
|
||||
private ArrayList<ICommandHandler> handlerlist = new ArrayList<>();//list of all registered CommandHandler
|
||||
|
||||
public CommandManager(TelegramAPI a) {
|
||||
api = a;
|
||||
|
@ -32,8 +34,7 @@ public class CommandManager {
|
|||
args = split[1].split(" ");
|
||||
}
|
||||
//call
|
||||
// System.out.println("cmd " + cmd + " args: " + args.length);
|
||||
for(ICommandHandler cmdhand : handlerlist.get(cmd)) {
|
||||
for(ICommandHandler cmdhand : handlerlist) {
|
||||
try {
|
||||
if(cmdhand instanceof JSONCommandHandler) {
|
||||
result = ((JSONCommandHandler) cmdhand).onCommand(sender, cmd, args, json);
|
||||
|
@ -53,26 +54,15 @@ public class CommandManager {
|
|||
TUser.sendMessage(api, json.getChatID(), api.getHelpMessage(), null, 0, true, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void registerCommand(ICommandHandler handler) {
|
||||
registerCommand(null, handler);
|
||||
}
|
||||
|
||||
public void registerCommand(String cmd, ICommandHandler handler) {
|
||||
if(cmd == null) {
|
||||
throw new NullPointerException("cmd is not allowed to be null");
|
||||
}
|
||||
if(handler == null) {
|
||||
throw new NullPointerException("handler is not allowed to be null");
|
||||
}
|
||||
cmd = cmd.trim();
|
||||
if(cmd.startsWith("/")) {
|
||||
cmd = cmd.substring(1);
|
||||
}
|
||||
if(cmd.isEmpty()) {
|
||||
throw new RuntimeException("cmd is not allowed to be empty");
|
||||
}
|
||||
if(cmd.matches(CMDPATTERN)) {
|
||||
handlerlist.put(cmd.toLowerCase(), handler);
|
||||
//registered successfully!
|
||||
} else {
|
||||
throw new IllegalArgumentException("cmd contains unallowed characters. Allowed: a-zA-Z0-9_-");
|
||||
}
|
||||
handlerlist.add(handler);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
package de.mrbesen.telegram.event;
|
||||
|
||||
import static java.lang.annotation.ElementType.METHOD;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface EventHandler {
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package de.mrbesen.telegram.event;
|
||||
|
||||
public interface EventListener {
|
||||
public interface EventListener<T extends Event> {
|
||||
|
||||
public void handleEvent(T event);
|
||||
}
|
||||
|
|
|
@ -1,88 +1,47 @@
|
|||
package de.mrbesen.telegram.event;
|
||||
|
||||
import de.mrbesen.telegram.TelegramAPI;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class EventManager {
|
||||
|
||||
private ArrayList<EventListener> listeners = new ArrayList<EventListener>();
|
||||
private ArrayList<EventMethod> handler = new ArrayList<EventMethod>();
|
||||
|
||||
|
||||
private HashMap<Class<? extends Event>, ArrayList<EventListener>> listeners = new HashMap<>();
|
||||
|
||||
public EventManager() {}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void registerEvent(EventListener listener) {
|
||||
if(listener == null) {
|
||||
|
||||
public void registerEvent(Class<? extends Event> eventtype, EventListener listener) {
|
||||
if (listener == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
if(listeners.contains(listener)) {
|
||||
throw new RuntimeException("Listener is allready registered.");
|
||||
}
|
||||
listeners.add(listener);
|
||||
//scanning handler
|
||||
int found = 0;
|
||||
for(Method met : listener.getClass().getMethods()) {
|
||||
EventHandler h = met.getAnnotation(EventHandler.class);
|
||||
if(h != null) {//handler annotation vorhanden
|
||||
if(met.getParameterCount() == 1) {//only one parameter required
|
||||
Class<?> parameterclass = met.getParameters()[0].getType();
|
||||
if(Event.class.isAssignableFrom(parameterclass) ) {//the needed parameter is a Event-subclass)
|
||||
|
||||
if(met.getReturnType().equals(void.class)) {
|
||||
if((met.getModifiers() & Method.PUBLIC) == Method.PUBLIC) {
|
||||
handler.add(new EventMethod((Class<? extends Event>) parameterclass, met, listener));
|
||||
found ++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//warn / error?
|
||||
}
|
||||
} else {
|
||||
//warn?
|
||||
}
|
||||
}
|
||||
}
|
||||
if(found == 0) {
|
||||
System.err.println("no @EventHandler found!");
|
||||
//get list
|
||||
ArrayList<EventListener> list = listeners.get(eventtype);
|
||||
if (list == null) {
|
||||
list = new ArrayList<EventListener>();
|
||||
listeners.put(eventtype, list);
|
||||
} else if(list.contains(listener)) {
|
||||
throw new IllegalArgumentException("listener allready registered");
|
||||
}
|
||||
|
||||
list.add(listener);
|
||||
}
|
||||
|
||||
public Event callEvent(Event e) {
|
||||
if(e == null)
|
||||
throw new NullPointerException("event is not allowed to be null!");
|
||||
for(EventMethod met : handler) {
|
||||
ArrayList<EventListener> listner = listeners.get(e.getClass());
|
||||
for(EventListener listn : listner) {
|
||||
try {
|
||||
e = met.callEvent(e);
|
||||
listn.handleEvent(e);
|
||||
} catch(Throwable t) {
|
||||
System.err.println("Error while calling Event " + e.getClass().getSimpleName() + " at " + met.listener.getClass().getSimpleName() + ":" + met.met.getName());
|
||||
System.err.println("Error occurred on Handling Event: " + e.getClass().getSimpleName());
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
return e;
|
||||
}
|
||||
|
||||
private class EventMethod {
|
||||
private EventListener listener;
|
||||
private Method met;
|
||||
private Class<? extends Event> eventtype;
|
||||
|
||||
private EventMethod(Class<? extends Event> eventtype, Method m, EventListener list) {
|
||||
this.met = m;
|
||||
this.eventtype = eventtype;
|
||||
this.listener = list;
|
||||
}
|
||||
|
||||
private Event callEvent(Event e) {
|
||||
if(eventtype.equals(e.getClass())) {
|
||||
try {
|
||||
met.invoke(listener, e);
|
||||
} catch(Throwable t) {
|
||||
System.err.println("Failed to invoke event! at " + listener.getClass().getSimpleName());
|
||||
t.printStackTrace();
|
||||
t.getCause().printStackTrace();
|
||||
}
|
||||
}
|
||||
return e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,8 +3,8 @@ package de.mrbesen.test;
|
|||
import java.util.Scanner;
|
||||
|
||||
import de.mrbesen.telegram.TelegramAPI;
|
||||
import de.mrbesen.telegram.event.EventHandler;
|
||||
import de.mrbesen.telegram.event.EventListener;
|
||||
import de.mrbesen.telegram.event.events.UserCallbackEvent;
|
||||
import de.mrbesen.telegram.event.events.UserSendMessageEvent;
|
||||
import de.mrbesen.telegram.objects.TMessage;
|
||||
import de.mrbesen.telegram.objects.TUser.Status;
|
||||
|
@ -13,7 +13,7 @@ import de.mrbesen.test.commands.ReplyKeyboardRemoveTC;
|
|||
import de.mrbesen.test.commands.ReplyKeyboardTestCase;
|
||||
import de.mrbesen.test.commands.SimpleTestCase;
|
||||
|
||||
public class Main implements Runnable, EventListener {
|
||||
public class Main implements EventListener<UserSendMessageEvent>, Runnable {
|
||||
|
||||
TelegramAPI api;
|
||||
private int action = 0;
|
||||
|
@ -24,17 +24,16 @@ public class Main implements Runnable, EventListener {
|
|||
}
|
||||
|
||||
public Main() {
|
||||
String token = "577609137:AAGrlfMHAOQPzN6w9ceNSgFZZCbaiK4gAnw";
|
||||
String token = "577609137:AAGrlfMHAOQPzN6w9ceNSgFZZCbaiK4gAnw";//test token
|
||||
api = new TelegramAPI(token);
|
||||
api.getCommandManager().registerCommand("test", new SimpleTestCase());
|
||||
api.getCommandManager().registerCommand("inlinekb", new InlineKeyboardTC());
|
||||
api.getCommandManager().registerCommand("replykb", new ReplyKeyboardTestCase());
|
||||
api.getCommandManager().registerCommand("replykbrm", new ReplyKeyboardRemoveTC());
|
||||
api.getEventManager().registerEvent(this);
|
||||
api.getCommandManager().registerCommand(new SimpleTestCase());
|
||||
api.getCommandManager().registerCommand(new InlineKeyboardTC());
|
||||
api.getCommandManager().registerCommand(new ReplyKeyboardTestCase());
|
||||
api.getCommandManager().registerCommand(new ReplyKeyboardRemoveTC());
|
||||
api.getEventManager().registerEvent(UserSendMessageEvent.class, this);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void eventbla(UserSendMessageEvent e) {
|
||||
public void handleEvent(UserSendMessageEvent e) {
|
||||
//api.sendMessage(new MessageBuilder().setText("this is a reply").setReciver(e.getUser().getID()).setSilent(true).setNoWebView(true).build());
|
||||
|
||||
if(oldmsg != null) {
|
||||
|
|
Loading…
Reference in New Issue