XMPP chat bot, with plugin architecture for implementing commands.
Minions runs as a bot in XMPP MUC chat rooms, and responds to commands. Commands are implemented as plugins, and may be loaded at runtime by copying the JAR file in the plugins directory.
Folder | Contents |
---|---|
minions-api |
The interface to be implemented by Minion plugins. |
minions-core |
The Minions chat bot. |
minions-contrib |
Example Minion plugins. |
First build Minions, from the project root run:
mvn clean install
Then create a YAML file with your configuration:
user:
name:
The user name for the account Minions should log in as.
resource:
The resource for login, minions-core
by default.
password:
The password for the account.
service:
server:
Optional server if not the same as domain part of the username.
port:
Optional port if not the default 5222
.
rooms:
- jid:
The JID of the room to join.
nick:
Nickname to use in the room, minions
by default.
password:
Password for the room if required.
- ...
admins:
- barejid
Bare JID of an admin user.
- ...
plugins:
refreshSeconds:
Polling interval to check for new plugins, defaults to 10
seconds.
prefix:
The command prefix, defaults to !
dir:
The directory in which plugins are located, defaults to ~/.local/share/minions/plugins
An example can be found here
Run the Jar file passing your configuration file as an argument:
java -jar minions-core/target/minions-core-1.0-SNAPSHOT.jar minions.yml
Declare the Minions API as a dependency:
<dependency>
<groupId>com.boothj5.minions</groupId>
<artifactId>minions-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
Using the echo-minion
as an example, extend the Minion
class:
package com.boothj5.minions.echo;
import com.boothj5.minions.Minion;
import com.boothj5.minions.MinionsException;
import com.boothj5.minions.MinionsRoom;
public class EchoMinion extends Minion {
@Override
public String getHelp() {
return "[message] - Echo something.";
}
@Override
public void onMessage(MinionsRoom muc, String from, String message) throws MinionsException {
String trimmed = message.trim();
if ("".equals(trimmed)) {
muc.sendMessage(from + " didn't say anything for me to echo");
} else {
muc.sendMessage(from + " said: " + trimmed);
}
}
}
The plugin needs to be packaged as a fat jar (with dependencies) and must include two Manifest attributes:
MinionClass
- Implementation of the Minion
interface.
MinionCommand
- The command name.
Example from echo-minion
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<MinionClass>com.boothj5.minions.echo.EchoMinion</MinionClass>
<MinionCommand>echo</MinionCommand>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Build the plugin:
mvn clean package
Copy the fat jar to the plugins directory, e.g. for the echo-minion
:
cp target/echo-minion-1.0-SNAPSHOT-jar-with-dependencies.jar ~/.local/share/minions/plugins/.
The plugin will be available on the next refresh.
#Using Minions When the Minions bot is present in the chat room, use the following to list available commands, (assuming the default prefix '!'):
!help
Example output:
22:17 - boothj5: !help
22:17 - minions:
!help - Show this help.
!status [url] - Get the http status code for a URL.
!digest - Calculate various digests of a given value. Send 'help' for more information.
!calc [expression] - Calculate result of evaluating expression.
!apples give|take - Give or take an apple from the minion.
!bin to|from [value] - Convert integer to binary, or binary to integer.
!chatter [message] - Send a message to chatterbot.
!echo [message] - Echo something.
!props - Show OS system properties.
To list Jars that are currently loaded:
!jars
To execute a command, enter the command with the prefix, and any args required e.g.:
18:49 - boothj5: !status http://www.profanity.im
18:49 - minions: Status http://www.profanity.im: 200 - OK