X-Git-Url: http://gitweb.pimeys.fr/?p=bots%2Fbasile.git;a=blobdiff_plain;f=basile.py;h=4c071ff5a5d520e2cd429566f0633b74b6a791cb;hp=3768b0527eb9cbcc36d8c5dd41bb97ad2dde594b;hb=dd189d6075a52c3c4eafe528af6fd46cc2d3e032;hpb=0c57848a5b0fb8445588f6c44a1d351ea8646c80 diff --git a/basile.py b/basile.py index 3768b05..4c071ff 100755 --- 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{" @@ -38,6 +38,8 @@ config_report_bugs_to=["[20-100]"] # config "ce bot a été codé par 20-100, tu te rappelles ?" config_manzana = ["[20-100]", "Petite-Peste"] +# config "mais PEB aussi est passé par là" +config_manzana_bis = ["PEB"] # config "tu m'traites ?" config_insultes=[u"conna(rd|sse)",u"pute",u"con(|ne)",u"enf(oiré|lure)", @@ -175,9 +177,9 @@ config_bonne_nuit_answers=[u"{}: thanks, make sweet dreams tonight ! ;)",u"Bonne config_kick_answers=[u"Suis-je de trop ici ?",u"{}: je m'excuse pour ce bruit indu qui a stimulé votre colère",u"{} a le /kick facile, sans doute la fatigue.",u"{}: j'ai l'impression que vous n'allez pas bien aujourd'hui, vous vous en prenez à un robot !"] config_kick_actions=[u"sera désormais exemplaire",u"prépare une lettre d'excuses à {}",u"essaiera de ne plus s'attirer les foudres de {}",u"croyait avoir tout bien fait… cruelle déception."] -# config on m'a demandé de mourir +# config on m'a demandé de mourir/partir config_quit_messages=[u"Bien que cela me désole, je me vois dans l'obligation de vous abandonner."] - +config_leave_messages=config_quit_messages class NKError(Exception): def __init__(self,msg): @@ -325,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 @@ -374,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) @@ -408,75 +411,84 @@ class Basile(ircbot.SingleServerIRCBot): test=bot_unicode(message) except UnicodeBotError: serv.privmsg(auteur, - "Si je n'avais pas été créé avec la plus grande attention, votre encodage m'aurait déjà tué…") + "Si je n'avais pas été créé avec la plus grande attention, votre encodage aurait eu raison de moi…") return message=message.split() cmd=message[0].lower() notunderstood=False - if cmd=="connect": - if not len(message) in [2,3]: - serv.privmsg(auteur,"Syntaxe : CONNECT [] ") - 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 [] - Ouvre une connexion au serveur NoteKfet. - Si n'est pas précisé, j'utiliserais l'identité sous laquelle je te connais, ou, à défaut, ton pseudo.""", -"identify": """IDENTIFY - 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 - 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 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 + Affiche de l'aide sur la commande""",None,None], +"identify": ["""IDENTIFY + 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 + 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 + Affiche le solde de la personne désignée (par son pseudo note).""",None], + "join": [None, """JOIN + Me fait rejoindre le channel""",None], + "leave": [None,"""LEAVE + Me fait quitter le channel (sauf s'il est dans ma stay_list).""",None], + "quiet": [None,"""QUIET + Me rend silencieux sur le channel.""",None], + "noquiet": [None,"""NOQUIET + Me rend la parole sur le channel.""",None], + "lost": [None,"""LOST + Me fait perdre sur le channel.""",None], + "reconnect": [None,"""RECONNECT + Établit à nouveau la connexion avec le serveur NK2015""",None], + "say": [None,None,"""SAY + Me fait parler sur le channel."""], + "do": [None,None,"""DO + Me fait faitre une action (/me) sur le channel."""], + "stay": [None,None,"""STAY + Ajoute le channel à ma stay_list."""], + "nostay": [None,None,"""NOSTAY + 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 [] + Kicke 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) @@ -484,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)") @@ -525,7 +537,7 @@ class Basile(ircbot.SingleServerIRCBot): if auteur in self.ops and len(message)>1: if message[1] in self.chanlist: if not (message[1] in self.stay_channels) or auteur in self.overops: - serv.part(message[1]) + self.quitter(message[1]," ".join(message[2:])) self.chanlist.remove(message[1]) log(self.serveur,"priv",auteur," ".join(message)+"[successful]") else: @@ -565,8 +577,25 @@ class Basile(ircbot.SingleServerIRCBot): elif cmd=="die": if auteur in self.overops: log(self.serveur,"priv",auteur," ".join(message)+"[successful]") - quit_message=random.choice(config_quit_messages) - self.die(message=quit_message) + 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": @@ -616,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 ") + serv.privmsg(auteur,"Syntaxe : KICK []") else: notunderstood=True elif cmd=="lost": @@ -641,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: @@ -654,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: @@ -668,7 +708,7 @@ class Basile(ircbot.SingleServerIRCBot): except UnicodeBotError: if not canal in self.quiet_channels: serv.privmsg(canal, - "%s: Si je n'avais pas été créé avec la plus grande attention, votre encodage m'aurait déjà tué…"%(auteur)) + "%s: Si je n'avais pas été créé avec la plus grande attention, votre encodage aurait eu raison de moi…"%(auteur)) return pour_moi,message=self.pourmoi(serv,message) if pour_moi and message.split()!=[]: @@ -680,7 +720,7 @@ class Basile(ircbot.SingleServerIRCBot): if cmd in ["meurs","die","crève"]: if auteur in self.overops: log(self.serveur,canal,auteur,message+"[successful]") - self.die() + self.mourir() else: serv.privmsg(canal,"%s: mourrez vous-même !"%(auteur)) log(self.serveur,canal,auteur,message+"[failed]") @@ -688,7 +728,7 @@ class Basile(ircbot.SingleServerIRCBot): elif cmd in ["part","leave","dégage","va-t-en","tut'tiresailleurs,c'estmesgalets"]: if auteur in self.ops and (not (canal in self.stay_channels) or auteur in self.overops): - serv.part(canal,message="Éjecté par %s"%(auteur)) + self.quitter(canal) log(self.serveur,canal,auteur,message+"[successful]") if canal in self.chanlist: self.chanlist.remove(canal) @@ -711,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"]: @@ -750,6 +790,8 @@ class Basile(ircbot.SingleServerIRCBot): elif re.match("!?manzana",message.lower()) and not canal in self.quiet_channels: if auteur in config_manzana: serv.action(canal,"sert une bouteille de manzana à %s"%(auteur)) + elif auteur in config_manzana_bis: + 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 is_insult(message) and not canal in self.quiet_channels: @@ -845,9 +887,11 @@ class Basile(ircbot.SingleServerIRCBot): if message in ["!manzana"] and not canal in self.quiet_channels: if auteur in config_manzana: serv.action(canal,"sert une bouteille de manzana à %s"%(auteur)) + elif auteur in config_manzana_bis: + 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")) @@ -903,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 @@ -913,7 +957,16 @@ class Basile(ircbot.SingleServerIRCBot): serv.action(channel,l2[i-n1].format(auteur).encode("utf8")) else: serv.privmsg(channel,l1[i].format(auteur).encode("utf8")) - + + def quitter(self,chan,leave_message=None): + if leave_message==None: + leave_message=random.choice(config_leave_messages) + self.serv.part(chan,message=leave_message.encode("utf8")) + + def mourir(self): + quit_message=random.choice(config_quit_messages) + self.die(msg=quit_message.encode("utf8")) + def _getnick(self): return self.serv.get_nickname() nick=property(_getnick)