u"Tu veux qu'on parle de ta soœur ?",
u"Et la tienne ?",
u"Ce que fait ma mère c'est comme ce que tu fais avec ta bite, ça nous regarde pas…",
-u"♩ J'ai vu ta mère sur chat rouleeeeeeette ♫"
+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_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=[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"Salut {}",u"Hello {} :)",u"Bonjour {}",u"Hello {}",u"{}: hello",u"{}: bonjour"]
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
- 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:
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())
+ return re.match(u"^(pan|bim|bang) .*$",unicode(chain,"utf8").lower().strip())
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")"
- 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
(auteur,fille,verbe)).encode("utf8"))
def pourmoi(self, serv, message):
"""renvoie (False,lemessage) ou (True, le message amputé de "pseudo: ")"""
- pseudo=serv.get_nickname()
- size=len(pseudo)
- if message[:size]==pseudo and message[size]==":":
+ size=len(self.nick)
+ if message[:size]==pseudo and len(message)>size and message[size]==":":
return (True,message[size+1:].lstrip(" "))
else:
return (False,message)
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="""
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"""
+ LOST Perdre sur un chan
+ SOLDE <pseudo> Donner le solde de quelqu'un"""
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"""
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=="kick":
+ if auteur in self.overops and len(message)>2:
+ 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>")
+ else:
+ notunderstood=True
elif cmd=="lost":
if auteur in self.ops and len(message)>1:
serv.privmsg(message[1],"J'ai perdu !")
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:
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()
or auteur in self.overops):
serv.part(canal,message="Éjecté par %s"%(auteur))
log(self.serveur,canal,auteur,message+"[successful]")
+ if canal in self.chanlist:
+ self.chanlist.remove(canal)
else:
serv.privmsg(canal,"%s: Non, je reste !"%(auteur))
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)[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))
serv.nick(become)
log(self.serveur,canal,auteur,message+"[successful]")
- elif cmd in ["coucou"] and not canal in self.quiet_channels:
- serv.privmsg(canal,"%s: coucou"%(auteur))
+ if cmd in ["meur", "meurt","meurre","meurres"] and not canal in self.quiet_channels:
+ serv.privmsg(canal,'%s: Mourir, impératif, 2ème personne du singulier : "meurs" (de rien)'%(auteur))
elif cmd in ["ping"] and not canal in self.quiet_channels:
serv.privmsg(canal,"%s: pong"%(auteur))
n1,n2=len(l1),len(l2)
i=random.randrange(n1+n2)
if i>=n1:
- serv.action(canal,l2[i-n1])
+ serv.action(canal,l2[i-n1].encode("utf8"))
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_merci_answers)
for ligne in answer.split("\n"):
serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
- out=re.match(u"^([A-Z[]|\\|[0-9]+|(¹|²|³|⁴|⁵|⁶|⁷|⁸|⁹|⁰)+)(?:| \?| !)$",
+ out=re.match(ur"^([A-Z[]|\\|[0-9]+|(¹|²|³|⁴|⁵|⁶|⁷|⁸|⁹|⁰)+)(?:| \?| !)$",
unicode(message.upper(),"utf8"))
if out and not canal in self.quiet_channels:
out=out.groups()[0]
serv.privmsg(canal,"%s: pfff, j'ai l'air malin maintenant… [ ?"%(auteur))
elif out in "[\\":
serv.privmsg(canal,"%s: nan mais il faut qu'on arrête, ça va finir par poser des problèmes…"%(auteur))
- elif re.match(r"(¹|²|³|⁴|⁵|⁶|⁷|⁸|⁹|⁰)+",out):
+ elif re.match(ur"(¹|²|³|⁴|⁵|⁶|⁷|⁸|⁹|⁰)+",out):
def translate(mess):
return "".join([{u"⁰¹²³⁴⁵⁶⁷⁸⁹0123456789"[i]:u"0123456789⁰¹²³⁴⁵⁶⁷⁸⁹"[i]
for i in range(20)}[j]
and re.match((u"^("+"|".join(config_bonjour)+").*").lower(),message.lower()) ):
answer=random.choice(config_bonjour_answers)
serv.privmsg(canal,answer.format(auteur).encode("utf8"))
- if is_pan(message):
+ if is_pan(message) and not canal in self.quiet_channels:
serv.privmsg(canal,"%s: c'est pas sur moi qu'il faut tirer !"%(auteur))
else:
if message in ["!pain au chocolat","!chocolatine"] and not canal in self.quiet_channels:
serv.privmsg(canal,"%s: %s"%(auteur,answer))
if not canal in self.quiet_channels:
self.try_tamere(serv,canal,auteur,message)
- mypseudo=serv.get_nickname()
+ mypseudo=self.nick
if re.match((u"^("+u"|".join(config_bonjour)
+u")( {}| all| tout le monde|(|à) tous)(\.|( |)!|)$"
).format(mypseudo).lower(), message.strip().lower()):
action = ev.arguments()[0]
auteur = irclib.nm_to_n(ev.source())
channel = ev.target()
- mypseudo=serv.get_nickname()
- if is_action_trigger(action,mypseudo):
+ 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=self.nick
+
+ 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:
- 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")))
+ def on_kick(self,serv,ev):
+ auteur = irclib.nm_to_n(ev.source())
+ canal = ev.target()
+ victime = ev.arguments()[0]
+ raison = ev.arguments()[1]
+ if victime==self.nick:
+ time.sleep(1)
+ serv.join(canal)
+ print("%s kické par %s pour %s" %(victime,auteur,raison))
+ def _getnick(self):
+ return serv.get_nickname()
+ nick=property(_getnick)
+
+
if __name__=="__main__":
import sys
if len(sys.argv)==1: