From da3b3ecf630ad568f9243f9369c86b34f6d7ee28 Mon Sep 17 00:00:00 2001 From: MrBesen Date: Sat, 18 May 2019 18:54:31 +0200 Subject: [PATCH] changed internal Event and Command structure --- TelegramAPI.iml | 18 ---- pom.xml | 2 +- .../java/de/mrbesen/telegram/TelegramAPI.java | 2 +- .../telegram/commands/CommandManager.java | 32 +++---- .../mrbesen/telegram/event/EventHandler.java | 12 --- .../mrbesen/telegram/event/EventListener.java | 3 +- .../mrbesen/telegram/event/EventManager.java | 87 +++++-------------- src/main/java/de/mrbesen/test/Main.java | 19 ++-- 8 files changed, 47 insertions(+), 128 deletions(-) delete mode 100644 TelegramAPI.iml delete mode 100644 src/main/java/de/mrbesen/telegram/event/EventHandler.java diff --git a/TelegramAPI.iml b/TelegramAPI.iml deleted file mode 100644 index ae3aec8..0000000 --- a/TelegramAPI.iml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6e73e06..9b60b94 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 TelegramAPI TelegramAPI - 0.0.1-SNAPSHOT + 0.0.2 src/main/java diff --git a/src/main/java/de/mrbesen/telegram/TelegramAPI.java b/src/main/java/de/mrbesen/telegram/TelegramAPI.java index eecd862..c874903 100644 --- a/src/main/java/de/mrbesen/telegram/TelegramAPI.java +++ b/src/main/java/de/mrbesen/telegram/TelegramAPI.java @@ -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; diff --git a/src/main/java/de/mrbesen/telegram/commands/CommandManager.java b/src/main/java/de/mrbesen/telegram/commands/CommandManager.java index ceb35eb..586aff2 100644 --- a/src/main/java/de/mrbesen/telegram/commands/CommandManager.java +++ b/src/main/java/de/mrbesen/telegram/commands/CommandManager.java @@ -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 handlerlist = ArrayListMultimap.create();//list of all registered CommandHandler + private ArrayList 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); } } diff --git a/src/main/java/de/mrbesen/telegram/event/EventHandler.java b/src/main/java/de/mrbesen/telegram/event/EventHandler.java deleted file mode 100644 index da814b3..0000000 --- a/src/main/java/de/mrbesen/telegram/event/EventHandler.java +++ /dev/null @@ -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 { -} diff --git a/src/main/java/de/mrbesen/telegram/event/EventListener.java b/src/main/java/de/mrbesen/telegram/event/EventListener.java index 1fcc528..d0cc7d4 100644 --- a/src/main/java/de/mrbesen/telegram/event/EventListener.java +++ b/src/main/java/de/mrbesen/telegram/event/EventListener.java @@ -1,5 +1,6 @@ package de.mrbesen.telegram.event; -public interface EventListener { +public interface EventListener { + public void handleEvent(T event); } diff --git a/src/main/java/de/mrbesen/telegram/event/EventManager.java b/src/main/java/de/mrbesen/telegram/event/EventManager.java index 0f61732..f4f8f30 100644 --- a/src/main/java/de/mrbesen/telegram/event/EventManager.java +++ b/src/main/java/de/mrbesen/telegram/event/EventManager.java @@ -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 listeners = new ArrayList(); - private ArrayList handler = new ArrayList(); - + + private HashMap, ArrayList> listeners = new HashMap<>(); + public EventManager() {} - - @SuppressWarnings("unchecked") - public void registerEvent(EventListener listener) { - if(listener == null) { + + public void registerEvent(Class 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) parameterclass, met, listener)); - found ++; - } - } - } else { - //warn / error? - } - } else { - //warn? - } - } - } - if(found == 0) { - System.err.println("no @EventHandler found!"); + //get list + ArrayList list = listeners.get(eventtype); + if (list == null) { + list = new ArrayList(); + 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 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 eventtype; - - private EventMethod(Class 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; - } - } } diff --git a/src/main/java/de/mrbesen/test/Main.java b/src/main/java/de/mrbesen/test/Main.java index 5e29f34..e57abfd 100644 --- a/src/main/java/de/mrbesen/test/Main.java +++ b/src/main/java/de/mrbesen/test/Main.java @@ -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, 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) {