changed internal Event and Command structure

This commit is contained in:
MrBesen 2019-05-18 18:54:31 +02:00
parent 3c6c0328ce
commit da3b3ecf63
Signed by: MrBesen
GPG Key ID: 596B2350DCD67504
8 changed files with 47 additions and 128 deletions

View File

@ -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>

View File

@ -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>

View File

@ -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;

View File

@ -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);
@ -54,25 +55,14 @@ public class CommandManager {
}
}
public void registerCommand(String cmd, ICommandHandler handler) {
if(cmd == null) {
throw new NullPointerException("cmd is not allowed to be null");
public void registerCommand(ICommandHandler handler) {
registerCommand(null, handler);
}
public void registerCommand(String cmd, ICommandHandler handler) {
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);
}
}

View File

@ -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 {
}

View File

@ -1,5 +1,6 @@
package de.mrbesen.telegram.event;
public interface EventListener {
public interface EventListener<T extends Event> {
public void handleEvent(T event);
}

View File

@ -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) {
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;
}
}
}

View File

@ -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) {