Merge pull request #813 from christianblos/feature/ability-extension-list

Be able to add AbilityExtensions in Bot constructor
This commit is contained in:
Ruben Bermudez 2020-10-23 00:26:26 +01:00 committed by GitHub
commit 814955c2a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 2 deletions

View File

@ -35,6 +35,20 @@ public class MrBadGuy implements AbilityExtension {
return new MrBadGuy(); 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 // Override creatorId
} }
``` ```

View File

@ -106,6 +106,7 @@ public abstract class BaseAbilityBot extends DefaultAbsSender implements Ability
private final String botUsername; private final String botUsername;
// Ability registry // Ability registry
private final List<AbilityExtension> extensions = new ArrayList<>();
private Map<String, Ability> abilities; private Map<String, Ability> abilities;
private Map<String, Stats> stats; private Map<String, Stats> stats;
@ -295,6 +296,18 @@ public abstract class BaseAbilityBot extends DefaultAbsSender implements Ability
return false; 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<AbilityExtension> 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. * Registers the declared abilities using method reflection. Also, replies are accumulated using the built abilities and standalone methods that return a Reply.
* <p> * <p>
@ -303,10 +316,10 @@ public abstract class BaseAbilityBot extends DefaultAbsSender implements Ability
private void registerAbilities() { private void registerAbilities() {
try { try {
// Collect all classes that implement AbilityExtension declared in the bot // Collect all classes that implement AbilityExtension declared in the bot
List<AbilityExtension> extensions = stream(getClass().getMethods()) extensions.addAll(stream(getClass().getMethods())
.filter(checkReturnType(AbilityExtension.class)) .filter(checkReturnType(AbilityExtension.class))
.map(returnExtension(this)) .map(returnExtension(this))
.collect(Collectors.toList()); .collect(Collectors.toList()));
// Add the bot itself as it is an AbilityExtension // Add the bot itself as it is an AbilityExtension
extensions.add(this); extensions.add(this);

View File

@ -33,6 +33,7 @@ class ExtensionTest {
assertTrue(hasAbilityNamed("direct"), "Failed to find Ability in directly declared in root extension/bot"); 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("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("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) { private boolean hasAbilityNamed(String name) {
@ -42,6 +43,7 @@ class ExtensionTest {
public static class ExtensionUsingBot extends AbilityBot { public static class ExtensionUsingBot extends AbilityBot {
ExtensionUsingBot() { ExtensionUsingBot() {
super("", "", offlineInstance("testing")); super("", "", offlineInstance("testing"));
addExtension(new AbilityBotExtension("addedInConstructor"));
} }
@Override @Override