]> gitweb.pimeys.fr Git - bots/basile.git/blobdiff - basile.py
Commande DO pour faire faire des actions
[bots/basile.git] / basile.py
index 6e3991421b13aca7f17392cf12612ed9f86a296f..a98396461e38c5cb422d4fb04de17e90725204bd 100755 (executable)
--- a/basile.py
+++ b/basile.py
@@ -109,12 +109,13 @@ u"Ce que fait ma mère c'est comme ce que tu fais avec ta bite, ça nous regarde
 u"♩ J'ai vu ta mère sur chat rouleeeeeeette ♫"
 u"On avait dit \"pas les mamans\""]
 
 u"♩ J'ai vu ta mère sur chat rouleeeeeeette ♫"
 u"On avait dit \"pas les mamans\""]
 
-config_action_trigger=[u"(frappe|cogne|tape)(| sur)",u"démolit",u"vomit sur",u"slap(|s)"]
+config_action_trigger=[u"(frappe|cogne|tape)(| sur)",u"(démolit|dégomme|fouette|agresse)",
+u"vomit sur",u"slap(|s)"]
 config_action_answers=[u"Hey ! Mais qu'est-ce que j'ai fait ?",
 u"Pourquoi moi ?",
 u"Mais euh…",
 u"Mais j'ai rien demandé moi !"]
 config_action_answers=[u"Hey ! Mais qu'est-ce que j'ai fait ?",
 u"Pourquoi moi ?",
 u"Mais euh…",
 u"Mais j'ai rien demandé moi !"]
-config_action_actions=[u"prend de la distance, par précaution…",u"part en courant"]
+config_action_actions=[u"prend de la distance, par précaution…",u"part en courant",u"esquive"]
 
 config_bonjour=[u"(s|)(a|'|)lu(t|)",u"hello",u"plop",u"plip",u"pr(ou|ü)t",u"bonjour",u"bonsoir"]
 config_bonjour_answers=[u"Salut {}",u"Hello {} :)",u"Bonjour {}",u"Hello {}",u"{}: hello",u"{}: bonjour"]
 
 config_bonjour=[u"(s|)(a|'|)lu(t|)",u"hello",u"plop",u"plip",u"pr(ou|ü)t",u"bonjour",u"bonsoir"]
 config_bonjour_answers=[u"Salut {}",u"Hello {} :)",u"Bonjour {}",u"Hello {}",u"{}: hello",u"{}: bonjour"]
@@ -178,9 +179,13 @@ def connect_NK():
 
 def login_NK(username,password,typ="bdd"):
     sock=connect_NK()
 
 def login_NK(username,password,typ="bdd"):
     sock=connect_NK()
+    if typ=="special": # ça c'est pour Basile lui-même
+        masque='["note"]'
+    elif typ=="bdd":
+        masque='[["all"],["all"],false]'
     try:
         # Basile a un compte special user
     try:
         # Basile a un compte special user
-        commande='login [%s,%s,"%s"]'%(json.dumps(username),json.dumps(password),typ)
+        commande='login [%s,%s,"%s",%s]'%(json.dumps(username),json.dumps(password),typ,masque)
         sock.write(commande)
         out=sock.read()
     except Exception as exc:
         sock.write(commande)
         out=sock.read()
     except Exception as exc:
@@ -225,7 +230,8 @@ def is_merci(chain):
 def is_tamere(chain):
     return is_something(chain,config_tamere)
 def is_action_trigger(chain,pseudo):
 def is_tamere(chain):
     return is_something(chain,config_tamere)
 def is_action_trigger(chain,pseudo):
-    return is_something(chain,config_action_trigger,avant=u"^",apres=" %s($|\.| |,|;).*"%(pseudo))
+    return is_something(chain,config_action_trigger,avant=u"^",
+                            apres="( [a-z]*ment)? %s($|\.| |,|;).*"%(pseudo))
 def is_pan(chain):
     return re.match(u"^(pan|bim|bang)$",unicode(chain,"utf8").lower().strip())
 
 def is_pan(chain):
     return re.match(u"^(pan|bim|bang)$",unicode(chain,"utf8").lower().strip())
 
@@ -332,9 +338,10 @@ class Basile(ircbot.SingleServerIRCBot):
                        u"ouvert(|e|s|es)":u"ouverte",
                        u"open":u"open",
                        u"plein(|s|es)":u"pleine",
                        u"ouvert(|e|s|es)":u"ouverte",
                        u"open":u"open",
                        u"plein(|s|es)":u"pleine",
-                       u"bien plein(|e|s|es)":u"bien pleine"}
+                       u"bien plein(|e|s|es)":u"bien pleine",
+                       u"innocent(|e|s|es)":u"innocente"}
             adj_reg=u"(?P<adjectif>"+u"|".join(adjectifs.keys())+u")"
             adj_reg=u"(?P<adjectif>"+u"|".join(adjectifs.keys())+u")"
-            reg=u".*(^| )"+debuts+u" "+adj_reg+u"($|,|;|\.| ).*"
+            reg=u".*(^| |')"+debuts+u" "+adj_reg+u"($|,|;|\.| ).*"
             matched=re.match(reg,message)
             if matched:
                 # il faut repasser l'adjectif au féminin singulier
             matched=re.match(reg,message)
             if matched:
                 # il faut repasser l'adjectif au féminin singulier
@@ -378,7 +385,7 @@ class Basile(ircbot.SingleServerIRCBot):
         """renvoie (False,lemessage) ou (True, le message amputé de "pseudo: ")"""
         pseudo=serv.get_nickname()
         size=len(pseudo)
         """renvoie (False,lemessage) ou (True, le message amputé de "pseudo: ")"""
         pseudo=serv.get_nickname()
         size=len(pseudo)
-        if message[:size]==pseudo and message[size]==":":
+        if message[:size]==pseudo and len(message)>size and message[size]==":":
             return (True,message[size+1:].lstrip(" "))
         else:
             return (False,message)
             return (True,message[size+1:].lstrip(" "))
         else:
             return (False,message)
@@ -427,15 +434,18 @@ class Basile(ircbot.SingleServerIRCBot):
  HELP       Affiche de l'aide sur une commande.
  CONNECT    Ouvre une connection au serveur Note Kfet.
  IDENTIFY   Me permet de savoir qui tu es sur la note kfet.
  HELP       Affiche de l'aide sur une commande.
  CONNECT    Ouvre une connection au serveur Note Kfet.
  IDENTIFY   Me permet de savoir qui tu es sur la note kfet.
- DROP       Me fait oublier ton identité."""
+ DROP       Me fait oublier ton identité.
+ SOLDE      Obtenir ton solde"""
             helpmsg_ops="""
             helpmsg_ops="""
- JOIN       Faire rejoindre un channel
- LEAVE      Faire quitter un channel
- QUIET      Se taire sur un chanel
+ JOIN       Faire rejoindre un chan
+ LEAVE      Faire quitter un chan
+ QUIET      Se taire sur un chan
  NOQUIET    Opposé de QUIET
  NOQUIET    Opposé de QUIET
- LOST       Perdre sur un chan"""
+ LOST       Perdre sur un chan
+ SOLDE <pseudo>  Donner le solde de quelqu'un"""
             helpmsg_overops="""
             helpmsg_overops="""
- SAY        Fais envoyer un message sur un chan ou à une personne
+ SAY        Fait envoyer un message sur un chan ou à une personne
+ DO         Fait faire une action sur un chan
  STAY       Ignorera les prochains LEAVE pour un chan
  NOSTAY     Opposé de STAY
  DIE        Mourir"""
  STAY       Ignorera les prochains LEAVE pour un chan
  NOSTAY     Opposé de STAY
  DIE        Mourir"""
@@ -581,6 +591,14 @@ class Basile(ircbot.SingleServerIRCBot):
                 serv.privmsg(auteur,"Syntaxe : SAY <channel> <message>")
             else:
                 notunderstood=True
                 serv.privmsg(auteur,"Syntaxe : SAY <channel> <message>")
             else:
                 notunderstood=True
+        elif cmd=="do":
+            if auteur in self.overops and len(message)>2:
+                serv.action(message[1]," ".join(message[2:]))
+                log(self.serveur,"priv",auteur," ".join(message))
+            elif len(message)<=2:
+                serv.privmsg(auteur,"Syntaxe : DO <channel> <action>")
+            else:
+                notunderstood=True
         elif cmd=="lost":
             if auteur in self.ops and len(message)>1:
                 serv.privmsg(message[1],"J'ai perdu !")
         elif cmd=="lost":
             if auteur in self.ops and len(message)>1:
                 serv.privmsg(message[1],"J'ai perdu !")
@@ -589,6 +607,33 @@ class Basile(ircbot.SingleServerIRCBot):
                 serv.privmsg(auteur,"Syntaxe : LOST <channel>")
             else:
                 notunderstood=True
                 serv.privmsg(auteur,"Syntaxe : LOST <channel>")
             else:
                 notunderstood=True
+        elif cmd=="solde":
+            if len(message)==1:
+                if self.identities.has_key(auteur):
+                    try:
+                        self.nk.write('search ["x",["pseudo"],%s]'%(json.dumps(self.identities[auteur])))
+                        ret=json.loads(self.nk.read())
+                        solde=ret["msg"][0]["solde"]
+                        pseudo=ret["msg"][0]["pseudo"]
+                    except Exception as exc:
+                        print exc
+                        serv.privmsg(auteur,"failed")
+                        log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
+                        return
+                    serv.privmsg(auteur,"%s (%s)"%(float(solde)/100,pseudo.encode("utf8")))
+                else:
+                    serv.privmsg(canal,"Je ne connais pas ton pseudo note.")
+            elif auteur in self.ops:
+                try:
+                    self.nk.write('search ["x",["pseudo"],%s]'%(json.dumps(message[1])))
+                    ret=json.loads(self.nk.read())
+                    solde=ret["msg"][0]["solde"]
+                    pseudo=ret["msg"][0]["pseudo"]
+                except Exception as exc:
+                    serv.privmsg(auteur,"failed")
+                    log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
+                    return
+                serv.privmsg(auteur,"%s (%s)"%(float(solde)/100,pseudo.encode("utf8")))
         else:
             notunderstood=True
         if notunderstood:
         else:
             notunderstood=True
         if notunderstood:
@@ -601,9 +646,10 @@ class Basile(ircbot.SingleServerIRCBot):
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
-            serv.privmsg(canal,
-              "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
-            return
+            if not canal in self.quiet_channels:
+                serv.privmsg(canal,
+                  "%s: Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
+                return
         pour_moi,message=self.pourmoi(serv,message)
         if pour_moi and message.split()!=[]:
             cmd=message.split()[0].lower()
         pour_moi,message=self.pourmoi(serv,message)
         if pour_moi and message.split()!=[]:
             cmd=message.split()[0].lower()
@@ -631,7 +677,8 @@ class Basile(ircbot.SingleServerIRCBot):
             elif cmd in ["reconnect"]:
                 if auteur in self.ops:
                     try:
             elif cmd in ["reconnect"]:
                 if auteur in self.ops:
                     try:
-                        self.nk=self.new_connection_NK(serv,config_note_pseudo,config_note_password)[1]
+                        self.nk=self.new_connection_NK(serv,config_note_pseudo,
+                                              config_note_password,"special")[1]
                     except Exception as exc:
                         self.nk=None
                         log(self.serveur,"""Erreur dans on_pubmsg/"cmd in ["reconnect"]\n"""+str(exc))
                     except Exception as exc:
                         self.nk=None
                         log(self.serveur,"""Erreur dans on_pubmsg/"cmd in ["reconnect"]\n"""+str(exc))
@@ -675,9 +722,10 @@ class Basile(ircbot.SingleServerIRCBot):
                 else:
                     serv.privmsg(canal,"%s: Je ne connais pas ton pseudo note."%(auteur))
                     log(self.serveur,canal,auteur,message+"[unknown]")
                 else:
                     serv.privmsg(canal,"%s: Je ne connais pas ton pseudo note."%(auteur))
                     log(self.serveur,canal,auteur,message+"[unknown]")
-            elif message in ["pain au chocolat","chocolatine"] and not canal in self.quiet_channels:
+            elif (re.match("!?(pain au chocolat|chocolatine)",message.lower())
+                 and not canal in self.quiet_channels):
                 serv.action(canal,"sert un pain au chocolat à %s"%(auteur))
                 serv.action(canal,"sert un pain au chocolat à %s"%(auteur))
-            elif re.match("manzana",message.lower()) and not canal in self.quiet_channels:
+            elif re.match("!?manzana",message.lower()) and not canal in self.quiet_channels:
                 if auteur=="[20-100]":
                     serv.action(canal,"sert une bouteille de manzana à %s"%(auteur))
                 else:
                 if auteur=="[20-100]":
                     serv.action(canal,"sert une bouteille de manzana à %s"%(auteur))
                 else:
@@ -788,13 +836,20 @@ class Basile(ircbot.SingleServerIRCBot):
         action = ev.arguments()[0]
         auteur = irclib.nm_to_n(ev.source())
         channel = ev.target()
         action = ev.arguments()[0]
         auteur = irclib.nm_to_n(ev.source())
         channel = ev.target()
+        try:
+            test=bot_unicode(action)
+        except UnicodeBotError:
+            serv.privmsg(channel,
+              "%s : Euh, tu fais de la merde avec ton encodage là, j'ai failli crasher…"%(auteur))
+            return
         mypseudo=serv.get_nickname()
         mypseudo=serv.get_nickname()
-        if is_action_trigger(action,mypseudo):
+        
+        if is_action_trigger(action,mypseudo) and not channel in self.quiet_channels:
             l1,l2=config_action_answers,config_action_actions
             n1,n2=len(l1),len(l2)
             i=random.randrange(n1+n2)
             if i>=n1:
             l1,l2=config_action_answers,config_action_actions
             n1,n2=len(l1),len(l2)
             i=random.randrange(n1+n2)
             if i>=n1:
-                serv.action(channel,l2[i-n1])
+                serv.action(channel,l2[i-n1].encode("utf8"))
             else:
                 serv.privmsg(channel,"%s: %s"%(auteur,l1[i].encode("utf8")))
 
             else:
                 serv.privmsg(channel,"%s: %s"%(auteur,l1[i].encode("utf8")))