diff --git a/TelegramBots.wiki/abilities/Ability-Extensions.md b/TelegramBots.wiki/abilities/Ability-Extensions.md index 60f5a482..45481632 100644 --- a/TelegramBots.wiki/abilities/Ability-Extensions.md +++ b/TelegramBots.wiki/abilities/Ability-Extensions.md @@ -35,6 +35,20 @@ public class MrBadGuy implements AbilityExtension { return new MrBadGuy(); } + // Override creatorId + } +``` + +It's also possible to add extensions in the constructor by using the `addExtension()` or `addExtensions()` method: + +```java + public class YourAwesomeBot implements AbilityBot { + + public YourAwesomeBot() { + super(/* pass required args ... */); + addExtensions(new MrGoodGuy(), new MrBadGuy()); + } + // Override creatorId } ``` \ No newline at end of file diff --git a/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/bot/BaseAbilityBot.java b/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/bot/BaseAbilityBot.java index 18cd6a41..ce6d5cb5 100644 --- a/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/bot/BaseAbilityBot.java +++ b/telegrambots-abilities/src/main/java/org/telegram/abilitybots/api/bot/BaseAbilityBot.java @@ -106,6 +106,7 @@ public abstract class BaseAbilityBot extends DefaultAbsSender implements Ability private final String botUsername; // Ability registry + private final List extensions = new ArrayList<>(); private Map abilities; private Map stats; @@ -295,6 +296,18 @@ public abstract class BaseAbilityBot extends DefaultAbsSender implements Ability return false; } + protected void addExtension(AbilityExtension extension) { + this.extensions.add(extension); + } + + protected void addExtensions(AbilityExtension... extensions) { + this.extensions.addAll(Arrays.asList(extensions)); + } + + protected void addExtensions(Collection extensions) { + this.extensions.addAll(extensions); + } + /** * Registers the declared abilities using method reflection. Also, replies are accumulated using the built abilities and standalone methods that return a Reply. *

@@ -303,10 +316,10 @@ public abstract class BaseAbilityBot extends DefaultAbsSender implements Ability private void registerAbilities() { try { // Collect all classes that implement AbilityExtension declared in the bot - List extensions = stream(getClass().getMethods()) + extensions.addAll(stream(getClass().getMethods()) .filter(checkReturnType(AbilityExtension.class)) .map(returnExtension(this)) - .collect(Collectors.toList()); + .collect(Collectors.toList())); // Add the bot itself as it is an AbilityExtension extensions.add(this); diff --git a/telegrambots-abilities/src/test/java/org/telegram/abilitybots/api/bot/ExtensionTest.java b/telegrambots-abilities/src/test/java/org/telegram/abilitybots/api/bot/ExtensionTest.java index 06b85e6d..6f31c864 100644 --- a/telegrambots-abilities/src/test/java/org/telegram/abilitybots/api/bot/ExtensionTest.java +++ b/telegrambots-abilities/src/test/java/org/telegram/abilitybots/api/bot/ExtensionTest.java @@ -33,6 +33,7 @@ class ExtensionTest { assertTrue(hasAbilityNamed("direct"), "Failed to find Ability in directly declared in root extension/bot"); assertTrue(hasAbilityNamed("returningSuperClass0abc"), "Failed to find Ability in directly declared in extension returned by method returning the AbilityExtension class"); assertTrue(hasAbilityNamed("returningSubClass0abc"), "Failed to find Ability in directly declared in extension returned by method returning the AbilityExtension subclass"); + assertTrue(hasAbilityNamed("addedInConstructor0abc"), "Failed to find Ability in directly declared in extension added in the constructor"); } private boolean hasAbilityNamed(String name) { @@ -42,6 +43,7 @@ class ExtensionTest { public static class ExtensionUsingBot extends AbilityBot { ExtensionUsingBot() { super("", "", offlineInstance("testing")); + addExtension(new AbilityBotExtension("addedInConstructor")); } @Override