hebdobot/src/main/java/fr/imirhil/april/hebdobot/irc/Bot.java
2011-11-05 14:47:49 +01:00

177 lines
5.2 KiB
Java
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package fr.imirhil.april.hebdobot.irc;
import java.util.Collection;
import java.util.LinkedList;
import org.jibble.pircbot.PircBot;
import fr.imirhil.april.hebdobot.review.CollectiveTopic;
import fr.imirhil.april.hebdobot.review.IndividualTopic;
import fr.imirhil.april.hebdobot.review.Message;
import fr.imirhil.april.hebdobot.review.Review;
import fr.imirhil.april.hebdobot.review.Topic;
public class Bot extends PircBot {
private Review review = null;
private final String channel;
private final Collection<ReviewListener> listeners =
new LinkedList<ReviewListener>();
public Bot(final String name, final String channel) {
this.setName(name);
this.channel = channel;
}
public void add(final ReviewListener listener) {
this.listeners.add(listener);
}
@Override
protected void onMessage(final String channel, final String sender,
final String login, final String hostname, String message) {
if (!channel.equalsIgnoreCase(this.channel)) {
return;
}
message = message.trim();
this.handleDie(sender, message);
this.handleStartReview(sender, message);
this.handleStopReview(sender, message);
this.handleStartIndividualTopic(sender, message);
this.handleStartCollectiveTopic(sender, message);
this.handleComment(sender, message);
this.handleMessage(sender, message);
this.handleDisplayCurrent(sender, message);
this.handleHelp(sender, message);
}
private void handleHelp(final String sender, final String message) {
if (!"!help".equalsIgnoreCase(message)) {
return;
}
this.sendMessage(sender, "Bienvenue " + sender);
this.sendMessage(sender, "Je suis " + this.getName()
+ ", le robot de gestion des revues hebdomadaires de l'APRIL");
this.sendMessage(sender, "Voici les commandes que je comprend :");
this.sendMessage(sender, " ");
this.sendMessage(sender, "— !debut : commencer une nouvelle revue");
this.sendMessage(sender, "— !fin : terminer la revue en cours");
this.sendMessage(sender, "— # titre : démarrer un sujet individuel");
this.sendMessage(sender, "— ## titre : démarrer un sujet collectif");
this.sendMessage(sender, "— !courant : affiche le sujet en cours");
this.sendMessage(sender, "— % message : un commentaire");
}
private void handleMessage(final String sender, final String message) {
if (this.review == null || message.startsWith("%")) {
return;
}
this.review.add(new Message(sender, message));
}
private void handleComment(final String sender, final String message) {
if (this.review == null) {
return;
}
this.review.addRaw(new Message(sender, message));
}
private void handleDie(final String sender, final String message) {
if (!"!stop".equalsIgnoreCase(message)) {
return;
}
this.disconnect();
this.dispose();
}
private void handleStartReview(final String sender, final String message) {
if (!"!debut".equalsIgnoreCase(message)) {
return;
}
this.review = new Review(sender);
this.sendMessage(sender, "Vous êtes le conducteur de réunion");
this.sendMessage(sender, "Pour terminer la réunion, tapez \"!fin\"");
this.sendMessage("Début de la réunion hebdomadaire");
}
private void handleStopReview(final String sender, final String message) {
if (this.review == null || !"!fin".equalsIgnoreCase(message)) {
return;
}
if (!this.review.isOwner(sender)) {
this.sendMessage(sender
+ ", vous n'êtes pas le conducteur de la réunion");
return;
}
for (final ReviewListener listener : this.listeners) {
listener.onEnd(this.review);
}
this.review = null;
this.sendMessage("Fin de la revue hebdomadaire");
}
private void handleStartIndividualTopic(final String sender,
final String message) {
if (this.review == null || !message.matches("\\s*#[^#].*")) {
return;
}
if (!this.review.isOwner(sender)) {
this.sendMessage(sender
+ ", vous n'êtes pas le conducteur de la réunion");
return;
}
final IndividualTopic topic =
new IndividualTopic(message.replaceFirst("#", "").trim());
this.review.begin(topic);
this.sendMessage("Sujet individuel : " + topic.getTitle());
}
private void handleStartCollectiveTopic(final String sender,
final String message) {
if (this.review == null || !message.matches("\\s*##.*")) {
return;
}
if (!this.review.isOwner(sender)) {
this.sendMessage(sender
+ ", vous n'êtes pas le conducteur de la réunion");
return;
}
final CollectiveTopic topic =
new CollectiveTopic(message.replaceFirst("##", "").trim());
this.review.begin(topic);
this.sendMessage("Sujet collectif : " + topic.getTitle());
}
private void
handleDisplayCurrent(final String sender, final String message) {
if (this.review == null || !"!courant".equalsIgnoreCase(message)) {
return;
}
final Topic current = this.review.getCurrentTopic();
if (current == null) {
this.sendMessage("Pas de sujet en cours");
} else if (current instanceof IndividualTopic) {
this.sendMessage("Sujet individuel en cours : "
+ current.getTitle());
} else if (current instanceof CollectiveTopic) {
this.sendMessage("Sujet collectif en cours : " + current.getTitle());
}
}
public void sendMessage(final String message) {
this.sendMessage(this.channel, message);
}
}