]> gitweb.pimeys.fr Git - bots/basile.git/blobdiff - basile.py
Basile est le bienvenu sur #note-dev
[bots/basile.git] / basile.py
index 7c1c5f795539e00bfa7fecb5e89fd44966b4cc14..4c071ff5a5d520e2cd429566f0633b74b6a791cb 100755 (executable)
--- a/basile.py
+++ b/basile.py
@@ -23,8 +23,8 @@ if "--quiet" in sys.argv:
 
 config_irc_password="NK2015BasileB0t"
 config_irc_pseudo="Basile"
-config_chanlist=["#bot","#flood"]
-config_stay_channels=["#bot","#flood"]
+config_chanlist=["#bot","#flood","#note-dev"]
+config_stay_channels=["#bot","#flood","#note-dev"]
 config_quiet_channels=[]
 config_note_pseudo="Basile"
 config_note_password="NK2015BasileB0tr4nd0omp4assword]6_+{#]78{"
@@ -327,7 +327,6 @@ class Basile(ircbot.SingleServerIRCBot):
         self.ops=self.overops+config_ops
         self.report_bugs_to=config_report_bugs_to
         self.chanlist=config_chanlist
-        self.sockets={}
         self.identities=pickle.load(open("identities.pickle","r"))
         self.stay_channels=config_stay_channels
         self.quiet_channels=config_quiet_channels
@@ -376,6 +375,8 @@ class Basile(ircbot.SingleServerIRCBot):
         log(self.serveur,"Connected")
         if self.debug:
             self.chanlist=["#bot"]
+        else:
+            serv.privmsg("ChanServ INVITE #note-dev")
         for c in self.chanlist:
             log(self.serveur,"JOIN %s"%(c))
             serv.join(c)
@@ -415,70 +416,79 @@ class Basile(ircbot.SingleServerIRCBot):
         message=message.split()
         cmd=message[0].lower()
         notunderstood=False
-        if cmd=="connect":
-            if not len(message) in [2,3]:
-                serv.privmsg(auteur,"Syntaxe : CONNECT [<username>] <password>")
-                return
-            username=auteur
-            if len(message)>2:
-                username=(message[1])
-                password=" ".join(message[2:])
-            else:
-                password=" ".join(message[1:])
-            success,sock=self.new_connection_NK(serv,username,password)
-            if success:
-                self.sockets[username]=sock
-                serv.privmsg(auteur,"Connection successful")
-                log(self.serveur,"priv",auteur," ".join(message)+"[successful]")
-            else:
-                serv.privmsg(auteur,"Connection failed")
-                log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
-
-        elif cmd=="help":
-            helpdico={"connect": """CONNECT [<username>] <password>
- Ouvre une connexion au serveur NoteKfet.
- Si <username> n'est pas précisé, j'utiliserais l'identité sous laquelle je te connais, ou, à défaut, ton pseudo.""", 
-"identify": """IDENTIFY <username> <password>
- Vérifie le mot de passe et me permet de savoir à l'avenir quel est ton pseudo note kfet.
- Sans paramètre, je réponds sous quel pseudo je te connais.""",
-"drop":"""DROP <password>
- Vérifie le mot de passe et me fait d'oublier ton pseudo note kfet."""}
-            helpmsg_default="""Liste des commandes :
- 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é.
- SOLDE      Obtenir ton solde"""
-            helpmsg_ops="""
- JOIN       Faire rejoindre un chan
- LEAVE      Faire quitter un chan
- QUIET      Se taire sur un chan
- NOQUIET    Opposé de QUIET
- LOST       Perdre sur un chan
- SOLDE <pseudo>  Donner le solde de quelqu'un"""
-            helpmsg_overops="""
- 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"""
+        if cmd=="help":
+            helpdico={"help":["""HELP <commande>
+ Affiche de l'aide sur la commande""",None,None],
+"identify": ["""IDENTIFY <username> <password>
+ Vérifie le mot de passe et me permet de savoir à l'avenir quel est votre pseudo note kfet.
+ Sans paramètre, je vous précise sous quel pseudo je vous connais.""",None,None],
+"drop":["""DROP <password>
+ Vérifie le mot de passe et me fait d'oublier votre pseudo note kfet.""",None,None],
+"solde": ["""SOLDE
+ Affiche votre solde, si je connais votre pseudo note kfet.""",
+ """SOLDE <pseudo>
+ Affiche le solde de la personne désignée (par son pseudo note).""",None],
+ "join": [None, """JOIN <channel>
+ Me fait rejoindre le channel""",None],
+ "leave": [None,"""LEAVE <channel>
+ Me fait quitter le channel (sauf s'il est dans ma stay_list).""",None],
+ "quiet": [None,"""QUIET <channel>
+ Me rend silencieux sur le channel.""",None],
+ "noquiet": [None,"""NOQUIET <channel>
+ Me rend la parole sur le channel.""",None],
+ "lost": [None,"""LOST <channel>
+ Me fait perdre sur le channel.""",None],
+ "reconnect": [None,"""RECONNECT
+ Établit à nouveau la connexion avec le serveur NK2015""",None],
+ "say": [None,None,"""SAY <channel> <message>
+ Me fait parler sur le channel."""],
+ "do": [None,None,"""DO <channel> <action>
+ Me fait faitre une action (/me) sur le channel."""],
+ "stay": [None,None,"""STAY <channel>
+ Ajoute le channel à ma stay_list."""],
+ "nostay": [None,None,"""NOSTAY <channel>
+ Retire le channel de ma stay_list."""],
+ "ops": [None,None,"""OPS
+ Affiche la liste des ops."""],
+ "overops": [None,None,"""OVEROPS
+ Affiche la liste des overops."""],
+ "kick": [None,None,"""KICK <channel> <pseudo> [<raison>]
+ Kicke <pseudo> du channel (Il faut bien entendu que j'y sois op)."""],
+ "die": [None,None,"""DIE
+ Me déconnecte du serveur IRC."""]
+ }
+            helpmsg_default="Liste des commandes disponibles :\nHELP IDENTIFY DROP SOLDE"
+            helpmsg_ops=" JOIN LEAVE QUIET NOQUIET LOST RECONNECT"
+            helpmsg_overops=" SAY DO STAY NOSTAY OPS OVEROPS KICK DIE"
+            op,overop=auteur in self.ops, auteur in self.overops
             if len(message)==1:
                 helpmsg=helpmsg_default
-                if auteur in self.ops:
+                if op:
                     helpmsg+=helpmsg_ops
-                if auteur in self.overops:
+                if overop:
                     helpmsg+=helpmsg_overops
             else:
-                helpmsg=helpdico.get(message[1].lower(),"Commande inconnue.")
+                helpmsgs=helpdico.get(message[1].lower(),["Commande inconnue.",None,None])
+                helpmsg=helpmsgs[0]
+                if op and helpmsgs[1]:
+                    if helpmsg:
+                        helpmsg+="\n"+helpmsgs[1]
+                    else:
+                        helpmsg=helpmsgs[1]
+                if overop and helpmsgs[2]:
+                    if helpmsg:
+                        helpmsg+="\n"+helpmsgs[2]
+                    else:
+                        helpmsg=helpmsgs[2]
             for ligne in helpmsg.split("\n"):
                 serv.privmsg(auteur,ligne)
         elif cmd=="identify":
             if len(message)==1:
                 if self.identities.has_key(auteur):
-                    serv.privmsg(auteur,"Je te connais sous le pseudo note %s."%(
+                    serv.privmsg(auteur,"Je vous connais sous le pseudo note %s."%(
                                      self.identities[auteur].encode("utf8")))
                 else:
-                    serv.privmsg(auteur,"Je ne connais pas ton pseudo note.")
+                    serv.privmsg(auteur,"Je ne connais pas votre pseudo note.")
             elif len(message)>=3:
                 username,password=message[1],unicode(" ".join(message[2:]),"utf8")
                 success,_=self.new_connection_NK(serv,username,password)
@@ -486,7 +496,7 @@ class Basile(ircbot.SingleServerIRCBot):
                     log(self.serveur,"priv",auteur," ".join(message)+"[successful]")
                     serv.privmsg(auteur,"Identité enregistrée.")
                     self.identities[auteur]=username
-                    pickle.dump(self.identities,open("identities.pickle","w"))
+                    pickle.dump(Xself.identities,open("identities.pickle","w"))
                 else:
                     log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
                     serv.privmsg(auteur,"Mot de passe invalide. (ou serveur down)")
@@ -570,6 +580,24 @@ class Basile(ircbot.SingleServerIRCBot):
                 self.mourir()
             else:
                 notunderstood=True
+        elif cmd=="reconnect":
+            if auteur in self.ops:
+                try:
+                    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))
+                if self.nk!=None:
+                    serv.privmsg(auteur,"%s: done"%(auteur))
+                    log(self.serveur,"priv",auteur," ".join(message)+"[successful]")
+                else:
+                    serv.privmsg(auteur,"%s: failed"%(auteur))
+                    log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
+                    for report in self.report_bugs_to:
+                        serv.privmsg(report,"Connection to NK2015 failed, invalid password ? Server dead ?")
+            else:
+                notunderstood=True
         elif cmd=="quiet":
             if auteur in self.ops:
                 if len(message)>1:
@@ -617,7 +645,7 @@ class Basile(ircbot.SingleServerIRCBot):
                 serv.kick(message[1],message[2]," ".join(message[3:]))
                 log(self.serveur,"priv",auteur," ".join(message))
             elif len(message)<=2:
-                serv.privmsg(auteur,"Syntaxe : KICK <channel> <pseudo>")
+                serv.privmsg(auteur,"Syntaxe : KICK <channel> <pseudo> [<raison>]")
             else:
                 notunderstood=True
         elif cmd=="lost":
@@ -642,6 +670,7 @@ class Basile(ircbot.SingleServerIRCBot):
                         log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
                         return
                     serv.privmsg(auteur,"%s (%s)"%(float(solde)/100,pseudo.encode("utf8")))
+                    log(self.serveur,"priv",auteur," ".join(message)+"[successful]")
                 else:
                     serv.privmsg(canal,"Je ne connais pas ton pseudo note.")
             elif auteur in self.ops:
@@ -655,6 +684,16 @@ class Basile(ircbot.SingleServerIRCBot):
                     log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
                     return
                 serv.privmsg(auteur,"%s (%s)"%(float(solde)/100,pseudo.encode("utf8")))
+        elif cmd=="ops":
+            if auteur in self.overops:
+                serv.privmsg(auteur," ".join(self.ops))
+            else:
+                notunderstood=True
+        elif cmd=="overops":
+            if auteur in self.overops:
+                serv.privmsg(auteur," ".join(self.overops))
+            else:
+                notunderstood=True
         else:
             notunderstood=True
         if notunderstood:
@@ -712,9 +751,9 @@ class Basile(ircbot.SingleServerIRCBot):
                         serv.privmsg(canal,"%s: failed"%(auteur))
                         log(self.serveur,canal,auteur,message+"[failed]")
                         for report in self.report_bugs_to:
-                            serv.privmsg(report,"Connection to NK2015 failed, invalid password ?")
+                            serv.privmsg(report,"Connection to NK2015 failed, invalid password ? Server dead ?")
                 else:
-                    serv.privmsg(canal,"%s: crève !"%(auteur))
+                    serv.privmsg(canal,"%s: Encore eût-il fallu que je sois programmé pour vous obéir !"%(auteur))
                     log(self.serveur,canal,auteur,message+"[failed]")
 
             elif cmd in ["deviens","pseudo"]:
@@ -852,7 +891,7 @@ class Basile(ircbot.SingleServerIRCBot):
                     serv.action(canal,"sert un grand verre de jus de pomme à %s : tout le monde sait qu'il ne boit pas."%(auteur))
                 else:
                     serv.action(canal,"sert un verre de manzana à %s"%(auteur))
-            if re.match('^(.|§|:|)(w|b) [0-9]+$',message) and not canal in self.quiet_channels:
+            if re.match(u'^ *(.|§|!|/|/|:|)(w|b) [0-9]+$',message.decode("utf8")) and not canal in self.quiet_channels:
                 failanswers=config_buffer_fail_answers
                 answer=random.choice(failanswers)
                 serv.privmsg(canal,("%s: %s"%(auteur,answer)).encode("utf8"))
@@ -908,7 +947,7 @@ class Basile(ircbot.SingleServerIRCBot):
         victime = ev.arguments()[0]
         raison = ev.arguments()[1]
         if victime==self.nick:
-            log(self.serveur,"%s kické par %s (raison : %s)" %(victime,auteur,raison))
+            log(self.serveur,"%s kické de %s par %s (raison : %s)" %(victime,channel,auteur,raison))
             time.sleep(2)
             serv.join(channel)
             l1,l2=config_kick_answers,config_kick_actions