f.write((chain + u"\n").encode("utf-8"))
f.close()
if config.debug_stdout:
- print chain
+ print chain.encode("utf-8")
+
+def ignore_event(serv, ev):
+ """Retourne ``True`` si il faut ignorer cet évènement."""
+ for (blackmask, exceptlist) in config.blacklisted_masks:
+ usermask = ev.source()
+ blackit = bool(irclib.mask_matches(usermask, blackmask))
+ exceptit = any([bool(irclib.mask_matches(usermask, exceptmask)) for exceptmask in exceptlist])
+ if exceptit: # Il est exempté
+ return False
+ else:
+ if blackit: # Il n'est pas exempté et matche la blacklist
+ return True
def regex_join(liste, avant=u".*(?:^| )", apres=u"(?:$|\.| |,|;).*"):
"""Fabrique une regexp à partir d'une liste d'éléments à matcher."""
case_sensitive=False):
"""Vérifie si chain contient un des éléments de ``matches``.
Si ``regexp`` est fournie, c'est simplement elle qui est testée"""
- if case_sensitive:
+ if not case_sensitive:
chain = chain.lower()
if regexp == None:
regexp = regex_join(matches, avant, apres)
def crash(self, chan="nowhere", who="nobody"):
"""Fait crasher le bot."""
where = "en privé" if chan == "priv" else "sur le chan %s" % chan
- raise CrashError("Crash demandé par %s %s" % (who, where))
+ raise CrashError((u"Crash demandé par %s %s" % (who, where)).encode("utf-8"))
ACTIONS = {
"reload" : execute_reload,
def on_privmsg(self, serv, ev):
"""À la réception d'un message en privé."""
+ if ignore_event(serv, ev):
+ return
message = ev.arguments()[0]
auteur = irclib.nm_to_n(ev.source())
try:
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:
- self.quitter(message[1], " ".join(message[2:]))
+ self.quitter(message[1].encode("utf-8"), " ".join(message[2:]))
self.chanlist.remove(message[1])
log(self.serveur, "priv", auteur, " ".join(message) + "[successful]")
else:
notunderstood = True
elif cmd == u"say":
if auteur in self.overops and len(message) > 2:
- serv.privmsg(message[1], " ".join(message[2:]))
+ serv.privmsg(message[1].encode("utf-8"), (u" ".join(message[2:])).encode("utf-8"))
log(self.serveur, "priv", auteur, " ".join(message))
elif len(message) <= 2:
serv.privmsg(auteur, "Syntaxe : SAY <channel> <message>")
notunderstood = True
elif cmd == u"kick":
if auteur in self.overops and len(message) > 2:
- serv.kick(message[1], message[2], " ".join(message[3:]))
+ serv.kick(message[1].encode("utf-8"), message[2].encode("utf-8"), " ".join(message[3:]).encode("utf-8"))
log(self.serveur, "priv", auteur, " ".join(message))
elif len(message) <= 2:
serv.privmsg(auteur, "Syntaxe : KICK <channel> <pseudo> [<raison>]")
if self.identities.has_key(auteur):
success, solde, pseudo = nk.get_solde(self.nk, self.identities[auteur]["idbde"], serv, auteur)
if success:
- serv.privmsg(auteur, "%s (%s)" % (float(solde)/100, pseudo.encode("utf8")))
+ serv.privmsg(auteur, "%.2f (%s)" % (solde/100.0, pseudo.encode("utf8")))
log(self.serveur, "priv", auteur, " ".join(message) + ("[successful]" if success else "[failed]"))
else:
serv.privmsg(canal, "Je ne connais pas ton pseudo note.")
def on_pubmsg(self, serv, ev):
"""À la réception d'un message sur un channel."""
+ if ignore_event(serv, ev):
+ return
auteur = irclib.nm_to_n(ev.source())
canal = ev.target()
message = ev.arguments()[0]
elif cmd in [u"ping"] and not canal in self.quiet_channels:
serv.privmsg(canal, "%s: pong" % (auteur))
- elif cmd in [u"solde", u"!solde"]:
+ elif cmd in [u"solde", u"!solde", u"!coca"] or cmd.startswith("!"):
if self.identities.has_key(auteur):
idbde = self.identities[auteur]["idbde"]
- success, solde, pseudo = nk.get_solde(self.nk, self.identities[auteur]["idbde"], serv, canal)
- if success:
- serv.privmsg(canal, "%s: %s (%s)" % (auteur, float(solde)/100, pseudo.encode("utf8")))
- log(self.serveur, canal, auteur, message + "[successful]" if success else "[failed]")
+ if cmd in [u"solde", u"!solde"]:
+ success, solde, pseudo = nk.get_solde(self.nk, self.identities[auteur]["idbde"], serv, canal)
+ if success:
+ serv.privmsg(canal, "%s: %s (%s)" % (auteur, float(solde)/100, pseudo.encode("utf8")))
+ elif cmd in [u"!coca"] or cmd.startswith("!"):
+ success = nk.consomme(self.nk, self.identities[auteur]["idbde"], message[1:], serv, canal)
+ log(self.serveur, canal, auteur, message + ("[successful]" if success else "[failed]"))
else:
serv.privmsg(canal, "%s: Je ne connais pas votre pseudo note." % (auteur))
log(self.serveur, canal, auteur, message + "[unknown]")
- elif (re.match("!?(pain au chocolat|chocolatine)", message.lower())
+ 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))
- 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 in config.manzana:
serv.action(canal, "sert une bouteille de manzana à %s" % (auteur))
elif auteur in config.manzana_bis:
def on_action(self, serv, ev):
"""À la réception d'une action."""
+ if ignore_event(serv, ev):
+ return
action = ev.arguments()[0]
auteur = irclib.nm_to_n(ev.source())
channel = ev.target()
victime = ev.arguments()[0]
raison = ev.arguments()[1]
if victime == self.nick:
- log(self.serveur, "%s kické de %s par %s (raison : %s)" % (victime, channel, auteur, raison))
+ log(self.serveur, u"%s kické de %s par %s (raison : %s)" % (victime, channel.decode("utf-8"), auteur, raison))
time.sleep(2)
serv.join(channel)
l1, l2 = config.kick_answers, config.kick_actions