changeset 11:703c72bcc38e tip

Amellioration de la gestion des callbacks. Pour le moment, on les enregistrait globalement: si le bot était présent sur plusieurs canaux, il était tout à fait possible de lancer une commande sur un canal et d'écouter la réponse sur un autre, ce qui pouvait poser quelques problèmes. Rusard est changé pour s'adapter à cette nouvelle syntaxe, mais aussi pour pouvoir gérer un niveau passé en paramètre à la commande dd.
author defr
date Sun, 29 Jun 2008 23:26:33 +0200
parents 8d3f8e4adba3
children
files org/defr/bots/Bot.java org/defr/bots/Rusard.java
diffstat 2 files changed, 33 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/org/defr/bots/Bot.java	Sat May 19 23:35:46 2007 +0200
+++ b/org/defr/bots/Bot.java	Sun Jun 29 23:26:33 2008 +0200
@@ -16,11 +16,11 @@
  */
 public class Bot extends PircBot {
 	protected Configuration conf;
-	protected Map<String, Callback> messageListeners;
+	protected Map<String, Map<String, Callback>> messageListeners;
 	
 	public Bot() {
 		super();
-		messageListeners = new HashMap<String, Callback>();
+		messageListeners = new HashMap<String, Map<String, Callback>>();
 	}
 	
 	/**
@@ -41,14 +41,33 @@
 	}
 	
 	public void onMessage(String channel, String sender, String login, String host, String message) {
-		if(messageListeners.containsKey(message.toLowerCase())) {
-			messageListeners.get(message.toLowerCase()).go(sender, channel, message);
-			messageListeners.remove(message.toLowerCase());
+		channel = channel.toLowerCase();
+		if(messageListeners.containsKey(channel)) {
+			Map<String, Callback> channelListeners = messageListeners.get(channel);
+			if(channelListeners.containsKey(message.toLowerCase())) {
+				channelListeners.get(message.toLowerCase()).go(sender, channel, message);
+				channelListeners.remove(message.toLowerCase());
+			}
 		}
 	}
 	
-	public void addMessageListener(String message, Callback callback) {
-		messageListeners.put(message.toLowerCase(), callback);
+	public void onPrivateMessage(String send, String login, String host, String message) {
+		String channel = send.toLowerCase();
+		if(messageListeners.containsKey(channel)) {
+			Map<String, Callback> channelListeners = messageListeners.get(channel);
+			if(channelListeners.containsKey(message.toLowerCase())) {
+				channelListeners.get(message.toLowerCase()).go(send, channel, message);
+				channelListeners.remove(message.toLowerCase());
+			}
+		}
+	}
+	
+	public void addMessageListener(String where, String message, Callback callback) {
+		where = where.toLowerCase();
+		if(messageListeners.get(where) == null) {
+			messageListeners.put(where, new HashMap<String, Callback>());
+		}
+		messageListeners.get(where).put(message.toLowerCase(), callback);
 	}
 	
 	/**
--- a/org/defr/bots/Rusard.java	Sat May 19 23:35:46 2007 +0200
+++ b/org/defr/bots/Rusard.java	Sun Jun 29 23:26:33 2008 +0200
@@ -3,7 +3,6 @@
 import java.util.Random;
 import java.util.Calendar;
 import java.util.Timer;
-import java.util.TimerTask;
 import java.io.IOException;
 import java.text.DateFormat;
 import java.util.Locale;
@@ -52,6 +51,7 @@
 	}
 
 	public void onPrivateMessage(String send, String login, String host, String m) {
+		super.onPrivateMessage(send, login, host, m);
 		commandParser(m, send, send);
 	}
 
@@ -68,7 +68,7 @@
 
 				public void run() {
 					sendMessage(getTo(), "Lapin");
-					addMessageListener("Bunny", new Callback() {
+					addMessageListener(getTo(), "Bunny", new Callback() {
 						public void go(String sender, String replyTo, String message) {
 							sendMessage(replyTo, "Premier : " + sender);
 						}
@@ -85,8 +85,10 @@
 			int v = random.nextInt(t) + 1;
 			sendMessage(replyTo, "d" + t + " : " + v);
 		}
-		else if(message.matches("dd\\d")) {
-			int t = Integer.parseInt(message.substring(2));
+		else if(message.matches("dd\\d\\+\\d+")) {
+			String[] ar = message.substring(2).split("\\+");
+			int t = Integer.parseInt(ar[0]);
+			int lvl = Integer.parseInt(ar[1]);
 			int limite = 0, score = random.nextInt(100) + 1;
 			switch(t) {
 				case 0:
@@ -107,6 +109,7 @@
 				default:
 					limite = 98;
 			}
+			limite = Math.max(0, limite - 5 * lvl);
 			if(score > limite) {
 				sendMessage(replyTo, "Réussite (" + score + "/" + limite + ")");
 			}