]> gitweb.pimeys.fr Git - bots/basile.git/commitdiff
On met la conf dans un fichier à part
authorVincent Le Gallic <legallic@crans.org>
Thu, 21 Jun 2012 15:50:09 +0000 (17:50 +0200)
committerVincent Le Gallic <legallic@crans.org>
Thu, 21 Jun 2012 15:50:09 +0000 (17:50 +0200)
basile.py
config_basile.py [new file with mode: 0644]

index 69a92a2f05da5b1fe53ce47e20fe9989c4b64595..91dea63ea218150fc9ff0377c181bcfcb1ce63a7 100755 (executable)
--- a/basile.py
+++ b/basile.py
@@ -16,170 +16,15 @@ import re
 import os
 from commands import getstatusoutput as ex
 
 import os
 from commands import getstatusoutput as ex
 
-import sys
-config_debug_stdout=True
-if "--quiet" in sys.argv:
-    config_debug_stdout=False
+# on récupère la config
+import config_basile as config
 
 
-config_irc_password="NK2015BasileB0t"
-config_irc_pseudo="Basile"
-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{"
-config_logfile_template="basile.%s.log"
 def get_config_logfile(serveur):
     serveurs={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
 def get_config_logfile(serveur):
     serveurs={"acoeur.crans.org":"acoeur","irc.crans.org":"crans"}
-    return config_logfile_template%(serveurs[serveur])
-config_overops=["[20-100]","[20-100]_", "PEB"]
-config_ops=["Nit"]
-config_report_bugs_to=["[20-100]"]
+    return config.logfile_template%(serveurs[serveur])
 
 
-# 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)",
-u"sal(op(|e(|rie)|ard)|aud)",u"p(e|')tite bite",u"imbécile",u"idiot",u"stupid(|e)",u"débile",u"crétin",
-u"pétasse",u"enculé",u"chagasse",u"cagole",u"abruti",u"ahuri",u"analphabète",u"andouille",
-u"atardé",u"avorton",u"bachibouzouk",u"(balais|brosse) (de|à) chiotte(|s)",
-u"batard",u"blaireau",u"bouffon",u"branque",u"bouseux",u"branleur",u"catin",u"chacal",
-u"charogne",u"chiant(|e)",u"chieur",u"cochon",u"coprophage",u"couillon",u"crapule",u"crevard",
-u"cruche",u"cuistre",u"ducon",u"décérébré",
-u"emmerdeur",u"feignasse",u"fainéant",u"fourbe",u"freluquet",u"frigide",
-u"garce",u"glandu",u"gogol",u"goujat",u"gourdasse",u"gredin",u"gringalet",u"grognasse",
-u"naze",u"truie",u"iconoclaste",
-u"peigne(-|)cul",u"ignare",u"illétré",u"lèche(|-)cul",u"malotru",u"motherfucker",u"nabot",u"nigaud",
-u"nul",u"escroc",u"pouffiasse",u"pourriture",u"raclure",u"relou",u"sagouin",u"putain",
-u"péripatéticienne"]
-config_insultes_answers=[
-u"Oh non ! Quelle insulte ! Je crois que je ne m'en relèverai jamais…\nEnfin presque.",
-u"J'entends comme un vague murmure, vous disiez ?",
-u"Je vais prendre ça pour un compliment.",
-u"Vous savez, pour vous c'est peut-être une insulte, mais pour moi ce n'est qu'une suite de 0 et de 1…",
-u"Permettez-moi de vous retourner le compliment.",
-u"Votre indélicatesse vous sied à ravir.",
-u"Parfois, je me demande pourquoi je fais encore ce métier…",
-u"Le saviez-vous : l'invective ne déshonore que son auteur.",
-u"Le saviez-vous : vous perdez plus de temps à m'insulter qu'à vous taire.",
-u"Mais je ne vous permets pas ! Enfin, pas comme ça…"]
-
-# config "à peine quelques kilos octets"
-config_gros=[u"gros",u"énorme",u"lourd"]
-config_thisfile= os.path.realpath( __file__ )
 def get_filesize():
 def get_filesize():
-    return ex("ls -s %s"%(config_thisfile))[1].split()[0]
-
-# config spéciale-iota
-config_buffer_fail_answers=[u"Pas de chance !",u"Révisez vos classiques !",
-u"Encore un effort, je sais que vous pouvez le faire. ;)",
-u"Where did you learn to type?"]
-
-# config "jeu", d'ailleurs, j'ai perdu.
-config_premier_groupe_terminaisons=u"(e|es|ons|ez|ent|er(|ai|as|a|ons|ez|ont)|(|er)(ais|ait|ions|iez|aient)|(a(i|s|)|â(mes|tes|t)|èrent)|ass(e(|s|nt)|i(ons|ez))|é(|s|e|es))"
-config_regexp_etre=u"(être|suis|e(s|t)|so(mmes|nt)|êtes|(ét|ser)(ai(s|t|ent)|i(ons|ent)|)|ser(ai|as|a|ons|ez|ont)|so(i(s|t|ent)|y(ons|ez))|f(u(s|t|rent)|û(mes|tes|t))|fuss(e(|s|nt)|i(ons|ez))|étant)"
-config_regexp_etre_avec_c=u"c'(e(s|st)|étai(t|ent))"
-config_regexp_faire=u"fais"
-config_perdu=[u"perd(|s|ons|ez|ent|r(e|ai|as|a|ons|ez|ont)|(|r)(ais|ait|ions|iez|aient))"
-u"perd(i(s|t|rent)|î(mes|tes|t))", # oui, j'ai inclus qu'il perdît
-u"perdiss(e(|s|nt)|i(ons|ez))",
-u"perdu(|s|e|es)",u"perdant(|s|e|es)",u"perte(|s)",
-
-u"(gagn|trouv)"+config_premier_groupe_terminaisons,u"gagnant(|s|e|es)",u"gain(|s)",
-
-u"trouvant",u"trouvaille(|s)",
-
-u"victoire(|s)",u"vaincu(|s|e|es)",
-u"loose",u"lost",u"looser(|s)",u"win(|ner)(|s)",
-u"jeu(|x)",u"game(|s)"]
-config_time_between_perdu_trigger=3600*3 #temps moyen pour perdre en l'absence de trigger
-config_time_between_perdu_trigger_delta = 30*60 #marge autorisée autour de ^^^
-config_time_between_perdu=30*60 #temps pendant lequel on ne peut pas perdre
-
-# config "tais-toi"
-config_tag_triggers=[u"t(|a)g",u"ta gueule",u"la ferme",u"ferme( |-)la",u"tais-toi",u"chut",u"tu fais trop de bruit",u"tu parles trop"]
-config_tag_actions=[u"se tait",u"se tient coi"]
-config_tag_answers=[
-u"Ç'aurait été avec plaisir, mais je ne crois pas que vous puissiez vous passer de mes services.",
-u"Dès que cela sera utile.",
-u"Une autre fois, peut-être.",
-u"Si je me tais, qui vous rappellera combien vous me devez ?",
-u"J'aurais aimé accéder à votre requête, mais après mûre réflexion, j'en ai perdu l'envie.",
-u"Je ne ressens pas de besoin irrésistible de me taire, navré."]
-
-# config ping
-config_tesla_triggers=[u"t('|u )es là \?",u"\?",u"plop \?",u"plouf \?"]
-config_tesla_answers=[
-u"Oui, je suis là.",
-u"J'écoute.",
-u"En quoi puis-je me rendre utile ?",
-u"On a besoin de moi ?"
-]
-config_tesla_actions=[u"est là",u"attend des instructions",u"est toujours disponible"]
-
-# config en cas de non-insulte
-config_compliment_triggers=[u"gentil",u"cool",u"sympa",u"efficace"]
-config_compliment_answers=[
-u"Merci, c'est gentil de votre part. :)",
-u"Permettez-moi de vous retourner le compliment, sans ironie cette fois.",
-u"Je vous remercie.",
-u"C'est trop d'honneur.",
-u"Vous êtes bien aimable."
-]
-
-# config merci
-config_merci_triggers=[u"merci",u"remercie",u"thx",u"thank(|s)"]
-config_merci_answers=[u"Mais de rien.",u"À votre service. ;)",u"Quand vous voulez. :)",
-u"Tout le plaisir est pour moi."]
-
-# config "ta mère" 
-config_tamere_triggers=[u"ta mère"]
-config_tamere_answers=[u"Laissez donc ma mère en dehors de ça !",
-u"Puis-je préciser que je n'ai pas de mère ? Seulement deux pères…",
-u"""Un certain Max chantait "♩ J'ai vu ta mère sur chat rouleeeeeeette ♫", vous êtes de sa famille ?""",
-u"""N'avait-on pas dit "pas les mamans" ?"""]
-
-# config pour les actions désagréables à Basile
-config_bad_action_triggers=[u"(frappe|cogne|tape)(| sur)",u"(démolit|dégomme|fouette|agresse|tabasse)",
-u"(vomit|pisse|chie|crache) sur",u"slap(|s)"]
-config_bad_action_answers=[
-u"Je ne peux pas dire que j'apprécie, mais je l'ai sans doute bien mérité.",
-u"{}: Pourquoi tant de violence en ce monde si doux ?",
-u"""Si je n'étais pas aussi prude, je dirais "Mais euh…", cependant, je me contenterai de hausser un sourcil.""",
-u"{}: J'aurais préféré que vous ne fassiez pas cela en public.",
-u"{}: Entre nous, cela vous gratifie-t-il ?",
-u"{}: Une telle relation entre nous deux n'est pas saine, revenons à quelque chose de plus conventionnel. :D",
-u"J'ai la désagréable impression que {} cherche comment tuer le temps en ce moment…"
-]
-config_bad_action_actions=[u"prend de la distance, par précaution…",u"esquive",u"est bon pour prendre une semaine de repos… virtuel !",u"n'aime pas servir de souffre douleur, mais n'a malheureusement pas le choix", u"s'en souviendra sans doute longtemps… de quoi parlait-on déjà ?"]
-
-# config pour les actions agréables à Basile
-config_good_action_triggers=[u"fait (:?des bisous|un c(?:â|a)lin|des c(?:â|a)lins) à",u"embrasse",u"c(?:â|a)line",u"caresse"]
-config_good_action_answers=[u":D",u"{}: Moi aussi je vous aime. ♡",u"Tant de délicatesse ne saurait être ignorée !",u"Pour une fois que quelqu'un me considère à ma juste valeur…"]
-config_good_action_actions=[u"ronronne",u"aimerait exprimer avec des mots simples le bonheur que {} lui procure !",u"éprouve une joie indescriptible",u"apprécie que des personnes comme {} soient sur IRC, sans quoi il n'y aurait sans doute jamais personne pour tenir compte de lui"]
-
-# config bonjour/bonsoir/que fais-tu encore debout à cette heure, gros sale !
-config_bonjour_triggers=[u"(s|)(a|'|)lu(t|)",u"hello",u"pl(o|i)p",u"pr(ou|ü)t",u"bonjour",u"bonsoir",u"coucou"]
-config_bonjour_answers=[u"Bien le bonjour, {}.",u"Bonjour {}.",u"{}: bonjour.",u"{}: Quel beau temps aujourd'hui (arrêtez-moi si je me trompe) !",u"Meteo: Cachan"]
-config_bonsoir_answers=[u"Bonsoir {} !",u"{}: bonsoir.",u"Quel beau te… euh… bonsoir !",u"{}: Je cherche désespérément une formule pour vous dire bonsoir, mais j'avoue que mon lexique est un peu… limité."]
-config_night_answers=[u"{}: vous m'avez fait peur, je m'étais assoupi !", u"Debout à une heure pareille, {} ? Que vous arrive-t-il ?",u"Vous venez prendre la relève, {} ?"]
-config_daytime = [7,18]
-config_nighttime = [3, 6]
-
-# config dodo
-config_bonne_nuit_triggers=[u"bonne nuit",u"'?nite",u"'?nuit",u"'?night",u"good night",u"'?nenuit"]
-config_bonne_nuit_answers=[u"{}: thanks, make sweet dreams tonight ! ;)",u"Bonne nuit {}.",u"À demain {}. :)",u"{}: si seulement j'avais le droit de dormir… enfin, bonne nuit !",u"{}: à vous aussi !"]
-
-# config PEB est encore en train d'abuser de ses droits.
-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/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
+    return ex("ls -s %s"%(config.thisfile))[1].split()[0]
 
 class NKError(Exception):
     def __init__(self,msg):
 
 class NKError(Exception):
     def __init__(self,msg):
@@ -207,7 +52,7 @@ def log(serveur,channel,auteur=None,message=None):
     else:
         chain="%s [%s:%s] %s"%(time.strftime("%F %T"),channel,auteur,message)
     f.write(chain+"\n")
     else:
         chain="%s [%s:%s] %s"%(time.strftime("%F %T"),channel,auteur,message)
     f.write(chain+"\n")
-    if config_debug_stdout:
+    if config.debug_stdout:
         print chain
     f.close()
 
         print chain
     f.close()
 
@@ -262,10 +107,10 @@ def is_something(chain,matches,avant=u".*(?:^| )",apres=u"(?:$|\.| |,|;).*",case
     return o
 
 def is_insult(chain,debug=True):
     return o
 
 def is_insult(chain,debug=True):
-    return is_something(chain,config_insultes,avant=".*(?:^| |')")
+    return is_something(chain,config.insultes,avant=".*(?:^| |')")
 def is_not_insult(chain):
     chain=unicode(chain,"utf8")
 def is_not_insult(chain):
     chain=unicode(chain,"utf8")
-    insult_regexp=u"("+u"|".join(config_insultes)+u")"
+    insult_regexp=u"("+u"|".join(config.insultes)+u")"
     middle_regexp=u"(une? (?:(?:putain|enfoiré) d(?:e |'))*|)(?:| super )(?: (?:gros|petit|grand|énorme) |)"
     reg=".*pas %s%s.*"%(middle_regexp,insult_regexp)
     if re.match(reg,chain):
     middle_regexp=u"(une? (?:(?:putain|enfoiré) d(?:e |'))*|)(?:| super )(?: (?:gros|petit|grand|énorme) |)"
     reg=".*pas %s%s.*"%(middle_regexp,insult_regexp)
     if re.match(reg,chain):
@@ -273,29 +118,29 @@ def is_not_insult(chain):
     else:
         return False
 def is_compliment(chain,debug=True):
     else:
         return False
 def is_compliment(chain,debug=True):
-    return is_something(chain,config_compliment_triggers,avant=".*(?:^| |')")
+    return is_something(chain,config.compliment_triggers,avant=".*(?:^| |')")
 def is_perdu(chain):
 def is_perdu(chain):
-    return is_something(chain,config_perdu)
+    return is_something(chain,config.perdu)
 def is_tag(chain):
 def is_tag(chain):
-    return is_something(chain,config_tag_triggers)
+    return is_something(chain,config.tag_triggers)
 def is_gros(chain):
 def is_gros(chain):
-    return is_something(chain,config_gros)
+    return is_something(chain,config.gros)
 def is_tesla(chain):
 def is_tesla(chain):
-    return is_something(chain,config_tesla_triggers,avant=u"^",apres=u"$",debug=True)
+    return is_something(chain,config.tesla_triggers,avant=u"^",apres=u"$",debug=True)
 def is_merci(chain):
 def is_merci(chain):
-    return is_something(chain,config_merci_triggers)
+    return is_something(chain,config.merci_triggers)
 def is_tamere(chain):
 def is_tamere(chain):
-    return is_something(chain,config_tamere_triggers)
+    return is_something(chain,config.tamere_triggers)
 def is_bad_action_trigger(chain,pseudo):
 def is_bad_action_trigger(chain,pseudo):
-    return is_something(chain,config_bad_action_triggers,avant=u"^",
+    return is_something(chain,config.bad_action_triggers,avant=u"^",
                             apres="(?: [a-z]*ment)? %s($|\.| |,|;).*"%(pseudo))
 def is_good_action_trigger(chain,pseudo):
                             apres="(?: [a-z]*ment)? %s($|\.| |,|;).*"%(pseudo))
 def is_good_action_trigger(chain,pseudo):
-    return is_something(chain,config_good_action_triggers,avant=u"^",
+    return is_something(chain,config.good_action_triggers,avant=u"^",
                             apres="(?: [a-z]*ment)? %s($|\.| |,|;).*"%(pseudo))
 def is_bonjour(chain):
                             apres="(?: [a-z]*ment)? %s($|\.| |,|;).*"%(pseudo))
 def is_bonjour(chain):
-    return is_something(chain,config_bonjour_triggers,avant=u"^")
+    return is_something(chain,config.bonjour_triggers,avant=u"^")
 def is_bonne_nuit(chain):
 def is_bonne_nuit(chain):
-    return is_something(chain,config_bonne_nuit_triggers,avant=u"^")
+    return is_something(chain,config.bonne_nuit_triggers,avant=u"^")
 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())
 
@@ -303,9 +148,9 @@ def is_time(conf):
     _,_,_,h,m,s,_,_,_=time.localtime()
     return (conf[0],0,0)<(h,m,s)<(conf[1],0,0)
 def is_day():
     _,_,_,h,m,s,_,_,_=time.localtime()
     return (conf[0],0,0)<(h,m,s)<(conf[1],0,0)
 def is_day():
-    return is_time(config_daytime)
+    return is_time(config.daytime)
 def is_night():
 def is_night():
-    return is_time(config_nighttime)
+    return is_time(config.nighttime)
 
       
 class UnicodeBotError(Exception):
 
       
 class UnicodeBotError(Exception):
@@ -318,18 +163,18 @@ def bot_unicode(chain):
 
 class Basile(ircbot.SingleServerIRCBot):
     def __init__(self,serveur,debug=False):
 
 class Basile(ircbot.SingleServerIRCBot):
     def __init__(self,serveur,debug=False):
-        temporary_pseudo=config_irc_pseudo+str(random.randrange(10000,100000))
+        temporary_pseudo=config.irc_pseudo+str(random.randrange(10000,100000))
         ircbot.SingleServerIRCBot.__init__(self, [(serveur, 6667)],
                               temporary_pseudo,"Basile, le bot irc.[Codé par 20-100, fouettez-le]", 10)
         self.debug=debug
         self.serveur=serveur
         ircbot.SingleServerIRCBot.__init__(self, [(serveur, 6667)],
                               temporary_pseudo,"Basile, le bot irc.[Codé par 20-100, fouettez-le]", 10)
         self.debug=debug
         self.serveur=serveur
-        self.overops=config_overops
-        self.ops=self.overops+config_ops
-        self.report_bugs_to=config_report_bugs_to
-        self.chanlist=config_chanlist
+        self.overops=config.overops
+        self.ops=self.overops+config.ops
+        self.report_bugs_to=config.report_bugs_to
+        self.chanlist=config.chanlist
         self.identities=pickle.load(open("identities.pickle","r"))
         self.identities=pickle.load(open("identities.pickle","r"))
-        self.stay_channels=config_stay_channels
-        self.quiet_channels=config_quiet_channels
+        self.stay_channels=config.stay_channels
+        self.quiet_channels=config.quiet_channels
         self.last_perdu=0
 
 
         self.last_perdu=0
 
 
@@ -363,15 +208,15 @@ class Basile(ircbot.SingleServerIRCBot):
             return (False,None)
 
     def give_me_my_pseudo(self,serv):
             return (False,None)
 
     def give_me_my_pseudo(self,serv):
-        serv.privmsg("NickServ","RECOVER %s %s"%(config_irc_pseudo,config_irc_password))
-        serv.privmsg("NickServ","RELEASE %s %s"%(config_irc_pseudo,config_irc_password))
+        serv.privmsg("NickServ","RECOVER %s %s"%(config.irc_pseudo,config.irc_password))
+        serv.privmsg("NickServ","RELEASE %s %s"%(config.irc_pseudo,config.irc_password))
         time.sleep(0.3)
         time.sleep(0.3)
-        serv.nick(config_irc_pseudo)
+        serv.nick(config.irc_pseudo)
     
     def on_welcome(self, serv, ev):
         self.serv=serv # ça serv ira :)
         self.give_me_my_pseudo(serv)
     
     def on_welcome(self, serv, ev):
         self.serv=serv # ça serv ira :)
         self.give_me_my_pseudo(serv)
-        serv.privmsg("NickServ","identify %s"%(config_irc_password))
+        serv.privmsg("NickServ","identify %s"%(config.irc_password))
         log(self.serveur,"Connected")
         if self.debug:
             self.chanlist=["#bot"]
         log(self.serveur,"Connected")
         if self.debug:
             self.chanlist=["#bot"]
@@ -381,18 +226,18 @@ class Basile(ircbot.SingleServerIRCBot):
             log(self.serveur,"JOIN %s"%(c))
             serv.join(c)
         # on ouvre la connexion note de Basile, special user
             log(self.serveur,"JOIN %s"%(c))
             serv.join(c)
         # on ouvre la connexion note de Basile, special user
-        self.nk=self.new_connection_NK(serv,config_note_pseudo,config_note_password,"special")[1]
+        self.nk=self.new_connection_NK(serv,config.note_pseudo,config.note_password,"special")[1]
         if self.nk==None:
             for report in self.report_bugs_to:
                 serv.privmsg(report,"Connection to NK2015 failed, invalid password ?")
 
     def lost(self,serv,channel,forced=False):
         if self.nk==None:
             for report in self.report_bugs_to:
                 serv.privmsg(report,"Connection to NK2015 failed, invalid password ?")
 
     def lost(self,serv,channel,forced=False):
-        if self.last_perdu+config_time_between_perdu<time.time() or forced:
+        if self.last_perdu+config.time_between_perdu<time.time() or forced:
             if not channel in self.quiet_channels or forced:
                 serv.privmsg(channel,"J'ai perdu !")
             self.last_perdu=time.time()
             if not channel in self.quiet_channels or forced:
                 serv.privmsg(channel,"J'ai perdu !")
             self.last_perdu=time.time()
-            delay=config_time_between_perdu_trigger
-            delta=config_time_between_perdu_trigger_delta
+            delay=config.time_between_perdu_trigger
+            delta=config.time_between_perdu_trigger_delta
             serv.execute_delayed(random.randrange(delay-delta,delay+delta),self.lost,(serv,channel))
     
     def pourmoi(self, serv, message):
             serv.execute_delayed(random.randrange(delay-delta,delay+delta),self.lost,(serv,channel))
     
     def pourmoi(self, serv, message):
@@ -410,8 +255,8 @@ class Basile(ircbot.SingleServerIRCBot):
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
-            serv.privmsg(auteur,
-              "Si je n'avais pas été créé avec la plus grande attention, votre encodage aurait eu raison de moi…")
+            if config.utf8_trigger:
+                serv.privmsg(auteur, random.choice(config.utf8_fail_answers).encode("utf8"))
             return
         message=message.split()
         cmd=message[0].lower()
             return
         message=message.split()
         cmd=message[0].lower()
@@ -583,8 +428,8 @@ class Basile(ircbot.SingleServerIRCBot):
         elif cmd=="reconnect":
             if auteur in self.ops:
                 try:
         elif cmd=="reconnect":
             if auteur in self.ops:
                 try:
-                    self.nk=self.new_connection_NK(serv,config_note_pseudo,
-                                            config_note_password,"special")[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))
@@ -706,9 +551,8 @@ class Basile(ircbot.SingleServerIRCBot):
         try:
             test=bot_unicode(message)
         except UnicodeBotError:
         try:
             test=bot_unicode(message)
         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 aurait eu raison de moi…"%(auteur))
+            if config.utf8_trigger and not canal in self.quiet_channels:
+                serv.privmsg(canal, (u"%s: %s"%(auteur,random.choice(config.utf8_fail_answers))).encode("utf8"))
             return
         pour_moi,message=self.pourmoi(serv,message)
         if pour_moi and message.split()!=[]:
             return
         pour_moi,message=self.pourmoi(serv,message)
         if pour_moi and message.split()!=[]:
@@ -722,7 +566,7 @@ class Basile(ircbot.SingleServerIRCBot):
                     log(self.serveur,canal,auteur,message+"[successful]")
                     self.mourir()
                 else:
                     log(self.serveur,canal,auteur,message+"[successful]")
                     self.mourir()
                 else:
-                    serv.privmsg(canal,"%s: mourrez vous-même !"%(auteur))
+                    serv.privmsg(canal,("%s: %s"%(auteur,random.choice(config.quit_fail_messages))).encode("utf8"))
                     log(self.serveur,canal,auteur,message+"[failed]")
     
             elif cmd in ["part","leave","dégage","va-t-en","tut'tiresailleurs,c'estmesgalets"]:
                     log(self.serveur,canal,auteur,message+"[failed]")
     
             elif cmd in ["part","leave","dégage","va-t-en","tut'tiresailleurs,c'estmesgalets"]:
@@ -733,14 +577,14 @@ class Basile(ircbot.SingleServerIRCBot):
                     if canal in self.chanlist:
                         self.chanlist.remove(canal)
                 else:
                     if canal in self.chanlist:
                         self.chanlist.remove(canal)
                 else:
-                    serv.privmsg(canal,"%s: Navré, mais je me vois contraint de refuser, je ne peux pas céder aux exigences du premier venu."%(auteur))
+                    serv.privmsg(canal,("%s: %s"%(auteur,random.choice(config.leave_fail_messages))).encode("utf8"))
                     log(self.serveur,canal,auteur,message+"[failed]")
             
             elif cmd in ["reconnect"]:
                 if auteur in self.ops:
                     try:
                     log(self.serveur,canal,auteur,message+"[failed]")
             
             elif cmd in ["reconnect"]:
                 if auteur in self.ops:
                     try:
-                        self.nk=self.new_connection_NK(serv,config_note_pseudo,
-                                              config_note_password,"special")[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))
@@ -753,7 +597,7 @@ class Basile(ircbot.SingleServerIRCBot):
                         for report in self.report_bugs_to:
                             serv.privmsg(report,"Connection to NK2015 failed, invalid password ? Server dead ?")
                 else:
                         for report in self.report_bugs_to:
                             serv.privmsg(report,"Connection to NK2015 failed, invalid password ? Server dead ?")
                 else:
-                    serv.privmsg(canal,"%s: Encore eût-il fallu que je sois programmé pour vous obéir !"%(auteur))
+                    serv.privmsg(canal,"%s: %s"%(auteur,random.choice(config.pas_programme_pour_tobeir).encode("utf8")))
                     log(self.serveur,canal,auteur,message+"[failed]")
 
             elif cmd in ["deviens","pseudo"]:
                     log(self.serveur,canal,auteur,message+"[failed]")
 
             elif cmd in ["deviens","pseudo"]:
@@ -788,23 +632,23 @@ class Basile(ircbot.SingleServerIRCBot):
                  and not canal in self.quiet_channels):
                 serv.action(canal,"sert un pain au chocolat à %s"%(auteur))
             elif re.match("!?manzana",message.lower()) and not canal in self.quiet_channels:
                  and not canal in self.quiet_channels):
                 serv.action(canal,"sert un pain au chocolat à %s"%(auteur))
             elif re.match("!?manzana",message.lower()) and not canal in self.quiet_channels:
-                if auteur in config_manzana:
+                if auteur in config.manzana:
                     serv.action(canal,"sert une bouteille de manzana à %s"%(auteur))
                     serv.action(canal,"sert une bouteille de manzana à %s"%(auteur))
-                elif auteur in config_manzana_bis:
+                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:
                 if is_not_insult(message):
                     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:
                 if is_not_insult(message):
-                    answer=random.choice(config_compliment_answers)
+                    answer=random.choice(config.compliment_answers)
                     for ligne in answer.split("\n"):
                         serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
                 else:
                     for ligne in answer.split("\n"):
                         serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
                 else:
-                    answer=random.choice(config_insultes_answers)
+                    answer=random.choice(config.insultes_answers)
                     for ligne in answer.split("\n"):
                         serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             elif is_compliment(message) and not canal in self.quiet_channels:
                     for ligne in answer.split("\n"):
                         serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             elif is_compliment(message) and not canal in self.quiet_channels:
-                answer=random.choice(config_compliment_answers)
+                answer=random.choice(config.compliment_answers)
                 for ligne in answer.split("\n"):
                     serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             gros_match=is_gros(message)
                 for ligne in answer.split("\n"):
                     serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             gros_match=is_gros(message)
@@ -813,7 +657,7 @@ class Basile(ircbot.SingleServerIRCBot):
                 answer=u"Mais non, je ne suis pas %s, %sKo tout au plus…"%(gros_match.groups()[0],taille)
                 serv.privmsg(canal,"%s: %s"%(auteur,answer.encode("utf8")))
             if is_tesla(message) and not canal in self.quiet_channels:
                 answer=u"Mais non, je ne suis pas %s, %sKo tout au plus…"%(gros_match.groups()[0],taille)
                 serv.privmsg(canal,"%s: %s"%(auteur,answer.encode("utf8")))
             if is_tesla(message) and not canal in self.quiet_channels:
-                l1,l2=config_tesla_answers,config_tesla_actions
+                l1,l2=config.tesla_answers,config.tesla_actions
                 n1,n2=len(l1),len(l2)
                 i=random.randrange(n1+n2)
                 if i>=n1:
                 n1,n2=len(l1),len(l2)
                 i=random.randrange(n1+n2)
                 if i>=n1:
@@ -821,20 +665,20 @@ class Basile(ircbot.SingleServerIRCBot):
                 else:
                     serv.privmsg(canal,"%s: %s"%(auteur,l1[i].encode("utf8")))
             if is_tamere(message) and not canal in self.quiet_channels:
                 else:
                     serv.privmsg(canal,"%s: %s"%(auteur,l1[i].encode("utf8")))
             if is_tamere(message) and not canal in self.quiet_channels:
-                answer=random.choice(config_tamere_answers)
+                answer=random.choice(config.tamere_answers)
                 for ligne in answer.split("\n"):
                     serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             if is_tag(message) and not canal in self.quiet_channels:
                 if auteur in self.ops:
                 for ligne in answer.split("\n"):
                     serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             if is_tag(message) and not canal in self.quiet_channels:
                 if auteur in self.ops:
-                    action=random.choice(config_tag_actions)
+                    action=random.choice(config.tag_actions)
                     serv.action(canal,action.encode("utf8"))
                     self.quiet_channels.append(canal)
                 else:
                     serv.action(canal,action.encode("utf8"))
                     self.quiet_channels.append(canal)
                 else:
-                    answer=random.choice(config_tag_answers)
+                    answer=random.choice(config.tag_answers)
                     for ligne in answer.split("\n"):
                         serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             if is_merci(message):
                     for ligne in answer.split("\n"):
                         serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             if is_merci(message):
-                answer=random.choice(config_merci_answers)
+                answer=random.choice(config.merci_answers)
                 for ligne in answer.split("\n"):
                     serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             out=re.match(ur"^([A-Z[]|\\|[0-9]+|(¹|²|³|⁴|⁵|⁶|⁷|⁸|⁹|⁰)+)(?:| \?| !)$",
                 for ligne in answer.split("\n"):
                     serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
             out=re.match(ur"^([A-Z[]|\\|[0-9]+|(¹|²|³|⁴|⁵|⁶|⁷|⁸|⁹|⁰)+)(?:| \?| !)$",
@@ -870,14 +714,14 @@ class Basile(ircbot.SingleServerIRCBot):
                     serv.privmsg(canal,"%s: %s !"%(auteur,translate(str(out+1)).encode("utf8")))
             if is_bonjour(message) and not canal in self.quiet_channels:
                 if is_night():
                     serv.privmsg(canal,"%s: %s !"%(auteur,translate(str(out+1)).encode("utf8")))
             if is_bonjour(message) and not canal in self.quiet_channels:
                 if is_night():
-                    answer=random.choice(config_night_answers)
+                    answer=random.choice(config.night_answers)
                 elif is_day():
                 elif is_day():
-                    answer=random.choice(config_bonjour_answers)
+                    answer=random.choice(config.bonjour_answers)
                 else:
                 else:
-                    answer=random.choice(config_bonsoir_answers)
+                    answer=random.choice(config.bonsoir_answers)
                 serv.privmsg(canal,answer.format(auteur).encode("utf8"))
             if is_bonne_nuit(message) and not canal in self.quiet_channels:
                 serv.privmsg(canal,answer.format(auteur).encode("utf8"))
             if is_bonne_nuit(message) and not canal in self.quiet_channels:
-                answer=random.choice(config_bonne_nuit_answers)
+                answer=random.choice(config.bonne_nuit_answers)
                 serv.privmsg(canal,answer.format(auteur).encode("utf8"))
             if is_pan(message) and not canal in self.quiet_channels:
                 serv.privmsg(canal,"%s: ce n'est pas sur moi qu'il faut tirer, même si je sais que j'attire l'œil !"%(auteur))
                 serv.privmsg(canal,answer.format(auteur).encode("utf8"))
             if is_pan(message) and not canal in self.quiet_channels:
                 serv.privmsg(canal,"%s: ce n'est pas sur moi qu'il faut tirer, même si je sais que j'attire l'œil !"%(auteur))
@@ -885,29 +729,29 @@ class Basile(ircbot.SingleServerIRCBot):
             if message in ["!pain au chocolat","!chocolatine"] and not canal in self.quiet_channels:
                 serv.action(canal,"sert un pain au chocolat à %s"%(auteur))
             if message in ["!manzana"] and not canal in self.quiet_channels:
             if message in ["!pain au chocolat","!chocolatine"] and not canal in self.quiet_channels:
                 serv.action(canal,"sert un pain au chocolat à %s"%(auteur))
             if message in ["!manzana"] and not canal in self.quiet_channels:
-                if auteur in config_manzana:
+                if auteur in config.manzana:
                     serv.action(canal,"sert une bouteille de manzana à %s"%(auteur))
                     serv.action(canal,"sert une bouteille de manzana à %s"%(auteur))
-                elif auteur in config_manzana_bis:
+                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(u'^ *(.|§|!|/|/|:|)(w|b) [0-9]+$',message.decode("utf8")) and not canal in self.quiet_channels:
                     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(u'^ *(.|§|!|/|/|:|)(w|b) [0-9]+$',message.decode("utf8")) and not canal in self.quiet_channels:
-                failanswers=config_buffer_fail_answers
+                failanswers=config.buffer_fail_answers
                 answer=random.choice(failanswers)
                 serv.privmsg(canal,("%s: %s"%(auteur,answer)).encode("utf8"))
             if not canal in self.quiet_channels:
                 mypseudo=self.nick
                 answer=random.choice(failanswers)
                 serv.privmsg(canal,("%s: %s"%(auteur,answer)).encode("utf8"))
             if not canal in self.quiet_channels:
                 mypseudo=self.nick
-                if re.match((u"^("+u"|".join(config_bonjour_triggers)
+                if re.match((u"^("+u"|".join(config.bonjour_triggers)
                                   +u")( {}| all| tout le monde|(|à) tous)(\.|( |)!|)$"
                              ).format(mypseudo).lower(), message.strip().lower()):
                                   +u")( {}| all| tout le monde|(|à) tous)(\.|( |)!|)$"
                              ).format(mypseudo).lower(), message.strip().lower()):
-                    answer=random.choice(config_bonjour_answers)
+                    answer=random.choice(config.bonjour_answers)
                     serv.privmsg(canal,answer.format(auteur).encode("utf8"))
         if (is_perdu(message) and not canal in self.quiet_channels):
             # proba de perdre sur trigger :
             #  avant 30min (enfin, config) : 0
             #  ensuite, +25%/30min, linéairement
             deltat=time.time()-self.last_perdu
                     serv.privmsg(canal,answer.format(auteur).encode("utf8"))
         if (is_perdu(message) and not canal in self.quiet_channels):
             # proba de perdre sur trigger :
             #  avant 30min (enfin, config) : 0
             #  ensuite, +25%/30min, linéairement
             deltat=time.time()-self.last_perdu
-            barre=(deltat-config_time_between_perdu)/(2*3600.0)
+            barre=(deltat-config.time_between_perdu)/(2*3600.0)
             if random.uniform(0,1)<barre:
                 serv.privmsg(canal,"%s: J'ai perdu !"%(auteur))
                 self.last_perdu=time.time()
             if random.uniform(0,1)<barre:
                 serv.privmsg(canal,"%s: J'ai perdu !"%(auteur))
                 self.last_perdu=time.time()
@@ -919,13 +763,13 @@ class Basile(ircbot.SingleServerIRCBot):
         try:
             test=bot_unicode(action)
         except UnicodeBotError:
         try:
             test=bot_unicode(action)
         except UnicodeBotError:
-            serv.privmsg(channel, 
-                  "%s: Si je n'avais pas été créé avec la plus grande attention, votre encodage m'aurait déjà tué…"%(auteur))
+            if config.utf8_trigger and not channel in self.quiet_channels:
+                serv.privmsg(channel, (u"%s: %s"%(auteur,random.choice(config.utf8_fail_answers))).encode("utf8"))
             return
         mypseudo=self.nick
         
         if is_bad_action_trigger(action,mypseudo) and not channel in self.quiet_channels:
             return
         mypseudo=self.nick
         
         if is_bad_action_trigger(action,mypseudo) and not channel in self.quiet_channels:
-            l1,l2=config_bad_action_answers,config_bad_action_actions
+            l1,l2=config.bad_action_answers,config.bad_action_actions
             n1,n2=len(l1),len(l2)
             i=random.randrange(n1+n2)
             if i>=n1:
             n1,n2=len(l1),len(l2)
             i=random.randrange(n1+n2)
             if i>=n1:
@@ -933,7 +777,7 @@ class Basile(ircbot.SingleServerIRCBot):
             else:
                 serv.privmsg(channel,l1[i].format(auteur).format(auteur).encode("utf8"))
         if is_good_action_trigger(action,mypseudo) and not channel in self.quiet_channels:
             else:
                 serv.privmsg(channel,l1[i].format(auteur).format(auteur).encode("utf8"))
         if is_good_action_trigger(action,mypseudo) and not channel in self.quiet_channels:
-            l1,l2=config_good_action_answers,config_good_action_actions
+            l1,l2=config.good_action_answers,config.good_action_actions
             n1,n2=len(l1),len(l2)
             i=random.randrange(n1+n2)
             if i>=n1:
             n1,n2=len(l1),len(l2)
             i=random.randrange(n1+n2)
             if i>=n1:
@@ -950,7 +794,7 @@ class Basile(ircbot.SingleServerIRCBot):
             log(self.serveur,"%s kické de %s par %s (raison : %s)" %(victime,channel,auteur,raison))
             time.sleep(2)
             serv.join(channel)
             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
+            l1,l2=config.kick_answers,config.kick_actions
             n1,n2=len(l1),len(l2)
             i=random.randrange(n1+n2)
             if i>=n1:
             n1,n2=len(l1),len(l2)
             i=random.randrange(n1+n2)
             if i>=n1:
@@ -960,11 +804,11 @@ class Basile(ircbot.SingleServerIRCBot):
     
     def quitter(self,chan,leave_message=None):
         if leave_message==None:
     
     def quitter(self,chan,leave_message=None):
         if leave_message==None:
-            leave_message=random.choice(config_leave_messages)
+            leave_message=random.choice(config.leave_messages)
         self.serv.part(chan,message=leave_message.encode("utf8"))
     
     def mourir(self):
         self.serv.part(chan,message=leave_message.encode("utf8"))
     
     def mourir(self):
-        quit_message=random.choice(config_quit_messages)
+        quit_message=random.choice(config.quit_messages)
         self.die(msg=quit_message.encode("utf8"))
     
     def _getnick(self):
         self.die(msg=quit_message.encode("utf8"))
     
     def _getnick(self):
@@ -982,6 +826,8 @@ if __name__=="__main__":
         debug=True
     else:
         debug=False
         debug=True
     else:
         debug=False
+    if "--quiet" in sys.argv:
+        config.debug_stdout=False
     serveurs={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
               "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
     try:
     serveurs={"a♡":"acoeur.crans.org","acoeur":"acoeur.crans.org","acoeur.crans.org":"acoeur.crans.org",
               "irc":"irc.crans.org","crans":"irc.crans.org","irc.crans.org":"irc.crans.org"}
     try:
diff --git a/config_basile.py b/config_basile.py
new file mode 100644 (file)
index 0000000..0944f38
--- /dev/null
@@ -0,0 +1,176 @@
+#!/usr/bin/python
+# -*- coding:utf8 -*-
+
+# Configuration de Basile
+
+debug_stdout=True
+
+# la config irc-related
+irc_password="NK2015BasileB0t"
+irc_pseudo="Basile"
+chanlist=["#bot","#flood","#note-dev"]
+stay_channels=["#bot","#flood","#note-dev"]
+quiet_channels=[]
+
+# la config note-related
+note_pseudo="Basile"
+note_password="NK2015BasileB0tr4nd0omp4assword]6_+{#]78{"
+
+# les logs
+logfile_template="basile.%s.log"
+
+# les ops
+overops=["[20-100]","[20-100]_", "PEB"]
+ops=["Nit"]
+report_bugs_to=["[20-100]"]
+
+# config "ce bot a été codé par 20-100, tu te rappelles ?"
+manzana = ["[20-100]", "Petite-Peste"] 
+# config "mais PEB aussi est passé par là"
+manzana_bis = ["PEB"]
+
+# config UTF8-fail
+utf8_fail_answers = [u"Si je n'avais pas été créé avec la plus grande attention, votre encodage aurait eu raison de moi…"]
+utf8_trigger = True
+# config "tu m'traites ?"
+insultes=[u"conna(rd|sse)",u"pute",u"con(|ne)",u"enf(oiré|lure)",
+u"sal(op(|e(|rie)|ard)|aud)",u"p(e|')tite bite",u"imbécile",u"idiot",u"stupid(|e)",u"débile",u"crétin",
+u"pétasse",u"enculé",u"chagasse",u"cagole",u"abruti",u"ahuri",u"analphabète",u"andouille",
+u"atardé",u"avorton",u"bachibouzouk",u"(balais|brosse) (de|à) chiotte(|s)",
+u"batard",u"blaireau",u"bouffon",u"branque",u"bouseux",u"branleur",u"catin",u"chacal",
+u"charogne",u"chiant(|e)",u"chieur",u"cochon",u"coprophage",u"couillon",u"crapule",u"crevard",
+u"cruche",u"cuistre",u"ducon",u"décérébré",
+u"emmerdeur",u"feignasse",u"fainéant",u"fourbe",u"freluquet",u"frigide",
+u"garce",u"glandu",u"gogol",u"goujat",u"gourdasse",u"gredin",u"gringalet",u"grognasse",
+u"naze",u"truie",u"iconoclaste",
+u"peigne(-|)cul",u"ignare",u"illétré",u"lèche(|-)cul",u"malotru",u"motherfucker",u"nabot",u"nigaud",
+u"nul",u"escroc",u"pouffiasse",u"pourriture",u"raclure",u"relou",u"sagouin",u"putain",
+u"péripatéticienne"]
+insultes_answers=[
+u"Oh non ! Quelle insulte ! Je crois que je ne m'en relèverai jamais…\nEnfin presque.",
+u"J'entends comme un vague murmure, vous disiez ?",
+u"Je vais prendre ça pour un compliment.",
+u"Vous savez, pour vous c'est peut-être une insulte, mais pour moi ce n'est qu'une suite de 0 et de 1…",
+u"Permettez-moi de vous retourner le compliment.",
+u"Votre indélicatesse vous sied à ravir.",
+u"Parfois, je me demande pourquoi je fais encore ce métier…",
+u"Le saviez-vous : l'invective ne déshonore que son auteur.",
+u"Le saviez-vous : vous perdez plus de temps à m'insulter qu'à vous taire.",
+u"Mais je ne vous permets pas ! Enfin, pas comme ça…"]
+
+import os
+# config "à peine quelques kilos octets"
+gros=[u"gros",u"énorme",u"lourd"]
+thisfile= os.path.realpath( __file__ )
+
+# config spéciale-iota
+buffer_fail_answers=[u"Pas de chance !",u"Révisez vos classiques !",
+u"Encore un effort, je sais que vous pouvez le faire. ;)",
+u"Where did you learn to type?"]
+
+# config "jeu", d'ailleurs, j'ai perdu.
+premier_groupe_terminaisons=u"(e|es|ons|ez|ent|er(|ai|as|a|ons|ez|ont)|(|er)(ais|ait|ions|iez|aient)|(a(i|s|)|â(mes|tes|t)|èrent)|ass(e(|s|nt)|i(ons|ez))|é(|s|e|es))"
+regexp_etre=u"(être|suis|e(s|t)|so(mmes|nt)|êtes|(ét|ser)(ai(s|t|ent)|i(ons|ent)|)|ser(ai|as|a|ons|ez|ont)|so(i(s|t|ent)|y(ons|ez))|f(u(s|t|rent)|û(mes|tes|t))|fuss(e(|s|nt)|i(ons|ez))|étant)"
+regexp_etre_avec_c=u"c'(e(s|st)|étai(t|ent))"
+regexp_faire=u"fais"
+perdu=[u"perd(|s|ons|ez|ent|r(e|ai|as|a|ons|ez|ont)|(|r)(ais|ait|ions|iez|aient))"
+u"perd(i(s|t|rent)|î(mes|tes|t))", # oui, j'ai inclus qu'il perdît
+u"perdiss(e(|s|nt)|i(ons|ez))",
+u"perdu(|s|e|es)",u"perdant(|s|e|es)",u"perte(|s)",
+
+u"(gagn|trouv)"+premier_groupe_terminaisons,u"gagnant(|s|e|es)",u"gain(|s)",
+
+u"trouvant",u"trouvaille(|s)",
+
+u"victoire(|s)",u"vaincu(|s|e|es)",
+u"loose",u"lost",u"looser(|s)",u"win(|ner)(|s)",
+u"jeu(|x)",u"game(|s)"]
+time_between_perdu_trigger=3600*3 #temps moyen pour perdre en l'absence de trigger
+time_between_perdu_trigger_delta = 30*60 #marge autorisée autour de ^^^
+time_between_perdu=30*60 #temps pendant lequel on ne peut pas perdre
+
+# config "tais-toi"
+tag_triggers=[u"t(|a)g",u"ta gueule",u"la ferme",u"ferme( |-)la",u"tais-toi",u"chut",u"tu fais trop de bruit",u"tu parles trop"]
+tag_actions=[u"se tait",u"se tient coi"]
+tag_answers=[
+u"Ç'aurait été avec plaisir, mais je ne crois pas que vous puissiez vous passer de mes services.",
+u"Dès que cela sera utile.",
+u"Une autre fois, peut-être.",
+u"Si je me tais, qui vous rappellera combien vous me devez ?",
+u"J'aurais aimé accéder à votre requête, mais après mûre réflexion, j'en ai perdu l'envie.",
+u"Je ne ressens pas de besoin irrésistible de me taire, navré."]
+
+# config ping
+tesla_triggers=[u"t('|u )es là \?",u"\?",u"plop \?",u"plouf \?"]
+tesla_answers=[
+u"Oui, je suis là.",
+u"J'écoute.",
+u"En quoi puis-je me rendre utile ?",
+u"On a besoin de moi ?"
+]
+tesla_actions=[u"est là",u"attend des instructions",u"est toujours disponible"]
+
+# config en cas de non-insulte
+compliment_triggers=[u"gentil",u"cool",u"sympa",u"efficace"]
+compliment_answers=[
+u"Merci, c'est gentil de votre part. :)",
+u"Permettez-moi de vous retourner le compliment, sans ironie cette fois.",
+u"Je vous remercie.",
+u"C'est trop d'honneur.",
+u"Vous êtes bien aimable."
+]
+
+# config merci
+merci_triggers=[u"merci",u"remercie",u"thx",u"thank(|s)"]
+merci_answers=[u"Mais de rien.",u"À votre service. ;)",u"Quand vous voulez. :)",
+u"Tout le plaisir est pour moi."]
+
+# config "ta mère" 
+tamere_triggers=[u"ta mère"]
+tamere_answers=[u"Laissez donc ma mère en dehors de ça !",
+u"Puis-je préciser que je n'ai pas de mère ? Seulement deux pères…",
+u"""Un certain Max chantait "♩ J'ai vu ta mère sur chat rouleeeeeeette ♫", vous êtes de sa famille ?""",
+u"""N'avait-on pas dit "pas les mamans" ?"""]
+
+# config pour les actions désagréables à Basile
+bad_action_triggers=[u"(frappe|cogne|tape)(| sur)",u"(démolit|dégomme|fouette|agresse|tabasse)",
+u"(vomit|pisse|chie|crache) sur",u"slap(|s)"]
+bad_action_answers=[
+u"Je ne peux pas dire que j'apprécie, mais je l'ai sans doute bien mérité.",
+u"{}: Pourquoi tant de violence en ce monde si doux ?",
+u"""Si je n'étais pas aussi prude, je dirais "Mais euh…", cependant, je me contenterai de hausser un sourcil.""",
+u"{}: J'aurais préféré que vous ne fassiez pas cela en public.",
+u"{}: Entre nous, cela vous gratifie-t-il ?",
+u"{}: Une telle relation entre nous deux n'est pas saine, revenons à quelque chose de plus conventionnel. :D",
+u"J'ai la désagréable impression que {} cherche comment tuer le temps en ce moment…"
+]
+bad_action_actions=[u"prend de la distance, par précaution…",u"esquive",u"est bon pour prendre une semaine de repos… virtuel !",u"n'aime pas servir de souffre douleur, mais n'a malheureusement pas le choix", u"s'en souviendra sans doute longtemps… de quoi parlait-on déjà ?"]
+
+# config pour les actions agréables à Basile
+good_action_triggers=[u"fait (:?des bisous|un c(?:â|a)lin|des c(?:â|a)lins) à",u"embrasse",u"c(?:â|a)line",u"caresse"]
+good_action_answers=[u":D",u"{}: Moi aussi je vous aime. ♡",u"Tant de délicatesse ne saurait être ignorée !",u"Pour une fois que quelqu'un me considère à ma juste valeur…"]
+good_action_actions=[u"ronronne",u"aimerait exprimer avec des mots simples le bonheur que {} lui procure !",u"éprouve une joie indescriptible",u"apprécie que des personnes comme {} soient sur IRC, sans quoi il n'y aurait sans doute jamais personne pour tenir compte de lui"]
+
+# config bonjour/bonsoir/que fais-tu encore debout à cette heure, gros sale !
+bonjour_triggers=[u"(s|)(a|'|)lu(t|)",u"hello",u"pl(o|i)p",u"pr(ou|ü)t",u"bonjour",u"bonsoir",u"coucou"]
+bonjour_answers=[u"Bien le bonjour, {}.",u"Bonjour {}.",u"{}: bonjour.",u"{}: Quel beau temps aujourd'hui (arrêtez-moi si je me trompe) !",u"Meteo: Cachan"]
+bonsoir_answers=[u"Bonsoir {} !",u"{}: bonsoir.",u"Quel beau te… euh… bonsoir !",u"{}: Je cherche désespérément une formule pour vous dire bonsoir, mais j'avoue que mon lexique est un peu… limité."]
+night_answers=[u"{}: vous m'avez fait peur, je m'étais assoupi !", u"Debout à une heure pareille, {} ? Que vous arrive-t-il ?",u"Vous venez prendre la relève, {} ?"]
+daytime = [7,18]
+nighttime = [3, 6]
+
+# config dodo
+bonne_nuit_triggers=[u"bonne nuit",u"'?nite",u"'?nuit",u"'?night",u"good night",u"'?nenuit"]
+bonne_nuit_answers=[u"{}: thanks, make sweet dreams tonight ! ;)",u"Bonne nuit {}.",u"À demain {}. :)",u"{}: si seulement j'avais le droit de dormir… enfin, bonne nuit !",u"{}: à vous aussi !"]
+
+# config PEB est encore en train d'abuser de ses droits.
+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 !"]
+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/partir
+quit_messages=[u"Bien que cela me désole, je me vois dans l'obligation de vous abandonner."]
+leave_messages=quit_messages
+
+quit_fail_messages = [u"Navré, mais je me vois contraint de refuser, je ne peux pas céder aux exigences du premier venu."]
+leave_fail_messages = quit_fail_messages
+pas_programme_pour_tobeir = [u"Encore eût-il fallu que je fusse programmé pour vous obéir !"]