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>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>TelegramAPI</groupId>
|
<groupId>TelegramAPI</groupId>
|
||||||
<artifactId>TelegramAPI</artifactId>
|
<artifactId>TelegramAPI</artifactId>
|
||||||
<version>0.0.1-SNAPSHOT</version>
|
<version>0.0.2</version>
|
||||||
<build>
|
<build>
|
||||||
<sourceDirectory>src/main/java</sourceDirectory>
|
<sourceDirectory>src/main/java</sourceDirectory>
|
||||||
<resources>
|
<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 API_URL = "https://api.telegram.org/bot";
|
||||||
private static final String TOKENREGEX = "^\\d{4,9}:[\\w-]{12,64}$";
|
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
|
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 msg_offset = 0;
|
||||||
private int updateInterval = 1500;
|
private int updateInterval = 1500;
|
||||||
|
|
|
@ -7,12 +7,14 @@ import de.mrbesen.telegram.TelegramAPI;
|
||||||
import de.mrbesen.telegram.objects.TMessage;
|
import de.mrbesen.telegram.objects.TMessage;
|
||||||
import de.mrbesen.telegram.objects.TUser;
|
import de.mrbesen.telegram.objects.TUser;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class CommandManager {
|
public class CommandManager {
|
||||||
|
|
||||||
private final static String CMDPATTERN = "^[\\w-]+$";
|
private final static String CMDPATTERN = "^[\\w-]+$";
|
||||||
private final TelegramAPI api;
|
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) {
|
public CommandManager(TelegramAPI a) {
|
||||||
api = a;
|
api = a;
|
||||||
|
@ -32,8 +34,7 @@ public class CommandManager {
|
||||||
args = split[1].split(" ");
|
args = split[1].split(" ");
|
||||||
}
|
}
|
||||||
//call
|
//call
|
||||||
// System.out.println("cmd " + cmd + " args: " + args.length);
|
for(ICommandHandler cmdhand : handlerlist) {
|
||||||
for(ICommandHandler cmdhand : handlerlist.get(cmd)) {
|
|
||||||
try {
|
try {
|
||||||
if(cmdhand instanceof JSONCommandHandler) {
|
if(cmdhand instanceof JSONCommandHandler) {
|
||||||
result = ((JSONCommandHandler) cmdhand).onCommand(sender, cmd, args, json);
|
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);
|
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) {
|
public void registerCommand(String cmd, ICommandHandler handler) {
|
||||||
if(cmd == null) {
|
|
||||||
throw new NullPointerException("cmd is not allowed to be null");
|
|
||||||
}
|
|
||||||
if(handler == null) {
|
if(handler == null) {
|
||||||
throw new NullPointerException("handler is not allowed to be null");
|
throw new NullPointerException("handler is not allowed to be null");
|
||||||
}
|
}
|
||||||
cmd = cmd.trim();
|
handlerlist.add(handler);
|
||||||
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_-");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
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;
|
package de.mrbesen.telegram.event;
|
||||||
|
|
||||||
|
import de.mrbesen.telegram.TelegramAPI;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class EventManager {
|
public class EventManager {
|
||||||
|
|
||||||
private ArrayList<EventListener> listeners = new ArrayList<EventListener>();
|
private HashMap<Class<? extends Event>, ArrayList<EventListener>> listeners = new HashMap<>();
|
||||||
private ArrayList<EventMethod> handler = new ArrayList<EventMethod>();
|
|
||||||
|
|
||||||
public EventManager() {}
|
public EventManager() {}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
public void registerEvent(Class<? extends Event> eventtype, EventListener listener) {
|
||||||
public void registerEvent(EventListener listener) {
|
if (listener == null) {
|
||||||
if(listener == null) {
|
|
||||||
throw new NullPointerException();
|
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)) {
|
//get list
|
||||||
if((met.getModifiers() & Method.PUBLIC) == Method.PUBLIC) {
|
ArrayList<EventListener> list = listeners.get(eventtype);
|
||||||
handler.add(new EventMethod((Class<? extends Event>) parameterclass, met, listener));
|
if (list == null) {
|
||||||
found ++;
|
list = new ArrayList<EventListener>();
|
||||||
}
|
listeners.put(eventtype, list);
|
||||||
}
|
} else if(list.contains(listener)) {
|
||||||
} else {
|
throw new IllegalArgumentException("listener allready registered");
|
||||||
//warn / error?
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//warn?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(found == 0) {
|
|
||||||
System.err.println("no @EventHandler found!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Event callEvent(Event e) {
|
public Event callEvent(Event e) {
|
||||||
if(e == null)
|
if(e == null)
|
||||||
throw new NullPointerException("event is not allowed to be 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 {
|
try {
|
||||||
e = met.callEvent(e);
|
listn.handleEvent(e);
|
||||||
} catch(Throwable t) {
|
} 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();
|
t.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return e;
|
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 java.util.Scanner;
|
||||||
|
|
||||||
import de.mrbesen.telegram.TelegramAPI;
|
import de.mrbesen.telegram.TelegramAPI;
|
||||||
import de.mrbesen.telegram.event.EventHandler;
|
|
||||||
import de.mrbesen.telegram.event.EventListener;
|
import de.mrbesen.telegram.event.EventListener;
|
||||||
|
import de.mrbesen.telegram.event.events.UserCallbackEvent;
|
||||||
import de.mrbesen.telegram.event.events.UserSendMessageEvent;
|
import de.mrbesen.telegram.event.events.UserSendMessageEvent;
|
||||||
import de.mrbesen.telegram.objects.TMessage;
|
import de.mrbesen.telegram.objects.TMessage;
|
||||||
import de.mrbesen.telegram.objects.TUser.Status;
|
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.ReplyKeyboardTestCase;
|
||||||
import de.mrbesen.test.commands.SimpleTestCase;
|
import de.mrbesen.test.commands.SimpleTestCase;
|
||||||
|
|
||||||
public class Main implements Runnable, EventListener {
|
public class Main implements EventListener<UserSendMessageEvent>, Runnable {
|
||||||
|
|
||||||
TelegramAPI api;
|
TelegramAPI api;
|
||||||
private int action = 0;
|
private int action = 0;
|
||||||
|
@ -24,17 +24,16 @@ public class Main implements Runnable, EventListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Main() {
|
public Main() {
|
||||||
String token = "577609137:AAGrlfMHAOQPzN6w9ceNSgFZZCbaiK4gAnw";
|
String token = "577609137:AAGrlfMHAOQPzN6w9ceNSgFZZCbaiK4gAnw";//test token
|
||||||
api = new TelegramAPI(token);
|
api = new TelegramAPI(token);
|
||||||
api.getCommandManager().registerCommand("test", new SimpleTestCase());
|
api.getCommandManager().registerCommand(new SimpleTestCase());
|
||||||
api.getCommandManager().registerCommand("inlinekb", new InlineKeyboardTC());
|
api.getCommandManager().registerCommand(new InlineKeyboardTC());
|
||||||
api.getCommandManager().registerCommand("replykb", new ReplyKeyboardTestCase());
|
api.getCommandManager().registerCommand(new ReplyKeyboardTestCase());
|
||||||
api.getCommandManager().registerCommand("replykbrm", new ReplyKeyboardRemoveTC());
|
api.getCommandManager().registerCommand(new ReplyKeyboardRemoveTC());
|
||||||
api.getEventManager().registerEvent(this);
|
api.getEventManager().registerEvent(UserSendMessageEvent.class, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
public void handleEvent(UserSendMessageEvent e) {
|
||||||
public void eventbla(UserSendMessageEvent e) {
|
|
||||||
//api.sendMessage(new MessageBuilder().setText("this is a reply").setReciver(e.getUser().getID()).setSilent(true).setNoWebView(true).build());
|
//api.sendMessage(new MessageBuilder().setText("this is a reply").setReciver(e.getUser().getID()).setSilent(true).setNoWebView(true).build());
|
||||||
|
|
||||||
if(oldmsg != null) {
|
if(oldmsg != null) {
|
||||||
|
|
Loading…
Reference in New Issue