def log(serveur,channel,auteur=None,message=None):
f=open(get_config_logfile(serveur),"a")
- if auteur==message==None:
+ if auteur == message == None:
# alors c'est que c'est pas un channel mais juste une ligne de log
chain="%s %s"%(time.strftime("%F %T"),channel)
else:
print chain
f.close()
+def ignore_event(serv, ev):
+ """Retourne ``True`` si il faut ignorer cet évènement."""
+ for (blackmask, exceptmask) in config.blacklisted_masks:
+ usermask = ev.source()
+ if exceptmask is None:
+ exceptit = False
+ else:
+ exceptit = bool(irclib.mask_matches(usermask, exceptmask))
+ blackit = bool(irclib.mask_matches(usermask, blackmask))
+ if blackit and not exceptit:
+ return True
class UnicodeBotError(Exception):
pass
real_word = "".join([lettre[0] for lettre in liste])
real_word = real_word.decode("utf8").lower()
mot=remplace_accents(mot.decode("utf8"))
- return mot==real_word
+ return mot.startswith(real_word)
class Hung(ircbot.SingleServerIRCBot):
def __init__(self,serveur,debug=False):
return (False,message)
def on_privmsg(self, serv, ev):
+ if ignore_event(serv, ev):
+ return
message=ev.arguments()[0]
auteur = irclib.nm_to_n(ev.source())
try:
if auteur in self.ops:
if len(message)>1:
if message[1] in self.play_channels:
- serv.privmsg(auteur,"Je play déjà sur %s."%(message[1]))
- log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
+ if len(message) > 2:
+ self.start_partie(serv, message[1], " ".join(message[2:]))
+ else:
+ serv.privmsg(auteur,"Je play déjà sur %s."%(message[1]))
+ log(self.serveur,"priv",auteur," ".join(message)+"[failed]")
else:
self.play_channels.append(message[1])
self.play_status[message[1]]=[None,None,None]
obfuskated=" ".join([lettre[0] if lettre[1] else "_" for lettre in mot])
serv.privmsg(canal,"%s : %s"%(begin,obfuskated))
- def start_partie(self, serv, canal):
- mots=[mot.strip() for mot in open(config.dico_mots).readlines()]
- defs=[defi.strip() for defi in open(config.dico_defs).readlines()]
- indice = random.randrange(0,len(mots))
- mot,definition=mots[indice],defs[indice]
+ def start_partie(self, serv, canal, mot=None):
+ if mot is None:
+ mots=[mot.strip() for mot in open(config.dico_mots).readlines()]
+ defs=[defi.strip() for defi in open(config.dico_defs).readlines()]
+ indice = random.randrange(0,len(mots))
+ mot,definition=mots[indice],defs[indice]
+ else:
+ definition = "(custom word)"
# ' et - sont considérés comme déjà devinés
- mot = [(lettre,lettre in "'-()") for lettre in list(mot)]
+ mot = mot.upper()
+ mot = [(lettre,lettre in config.non_guess_chars) for lettre in list(mot)]
self.play_status[canal]=[mot,definition,{}]
self.tried_letters[canal] = set ()
self.lives[canal] = config.lives
self.affiche_mot(serv, canal, begin="Devinez")
def on_pubmsg(self, serv, ev):
+ if ignore_event(serv, ev):
+ return
auteur = irclib.nm_to_n(ev.source())
canal = ev.target()
message = ev.arguments()[0]
self.start_partie(serv, canal)
elif not canal in self.play_channels:
serv.privmsg(canal,"%s: pas ici…"%(auteur))
+ elif cmd in ["score","scores","!score","!scores"]:
+ self.send_scores(serv,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))
+ if is_tag(message) and not canal in self.quiet_channels:
+ if auteur in self.ops:
+ action=random.choice(config.tag_actions)
+ serv.action(canal,action.encode("utf8"))
+ self.quiet_channels.append(canal)
+ else:
+ answer=random.choice(config.tag_answers)
+ for ligne in answer.split("\n"):
+ serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
+ # on essaye de voir si le mot fourni matche la partie en cours
+ mot = message
+ if canal in self.play_channels and self.play_status[canal][0]!=None and is_mot(mot, self.play_status[canal][0]):
+ # on a trouvé le mot
+ # on regarde combien de lettre il manquait
+ manquait = sum([not lettre[1] for lettre in self.play_status[canal][0]])
+ self.add_score({auteur: manquait})
+ if self.play_status[canal][2].has_key(auteur):
+ self.play_status[canal][2][auteur]+=manquait
+ else:
+ self.play_status[canal][2][auteur]=manquait
+ self.gagne(serv, canal, bonus=auteur, bonusvalue=manquait)
+ return
elif (cmd in list("azertyuiopqsdfghjklmwxcvbn") and canal in self.play_channels
and self.play_status.has_key(canal) and self.play_status[canal]!=[None,None,None]):
giv_let=cmd.upper()
# On perd une chance
self.lives[canal] -= 1
if self.lives[canal] > 0:
- serv.privmsg(canal, "Pas de %s. Plus que %s chances…" % (giv_let, self.lives[canal]))
+ serv.privmsg(canal, "Pas de %s. Plus que %s chance%s…" % (giv_let, self.lives[canal], "s" * (self.lives[canal] > 1)))
if self.lives[canal] == 0:
serv.privmsg(canal, "Pas de %s." % (giv_let))
self.perd(serv, canal)
if all([lettre[1] for lettre in listeapres]):
self.gagne(serv, canal)
- elif cmd in ["score","scores","!score","!scores"]:
- self.send_scores(serv,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))
- if is_tag(message) and not canal in self.quiet_channels:
- if auteur in self.ops:
- action=random.choice(config.tag_actions)
- serv.action(canal,action.encode("utf8"))
- self.quiet_channels.append(canal)
- else:
- answer=random.choice(config.tag_answers)
- for ligne in answer.split("\n"):
- serv.privmsg(canal,"%s: %s"%(auteur,ligne.encode("utf8")))
- # on essaye de voir si le mot fourni matche la partie en cours
- mot = cmd
- if self.play_status[canal][0]!=None and is_mot(mot, self.play_status[canal][0]):
- # on a trouvé le mot
- # on regarde combien de lettre il manquait
- manquait = sum([not lettre[1] for lettre in self.play_status[canal][0]])
- self.add_score({auteur: manquait})
- if self.play_status[canal][2].has_key(auteur):
- self.play_status[canal][2][auteur]+=manquait
- else:
- self.play_status[canal][2][auteur]=manquait
- self.gagne(serv, canal, bonus=auteur, bonusvalue=manquait)
else:
pass
def on_action(self, serv, ev):
+ if ignore_event(serv, ev):
+ return
action = ev.arguments()[0]
auteur = irclib.nm_to_n(ev.source())
channel = ev.target()
def gagne(self, serv, canal, bonus=None, bonusvalue=2):
serv.privmsg(canal,"Bravo !")
realword = self.reveal_word(serv, canal)
- nlettre=float(len(realword.replace("'","").replace("-","")))
+ nlettre=float(len([l for l in realword if not l in config.non_guess_chars]))
contribs=["%s:%s%%%s"%(pseudo,str(int(100*contrib/nlettre)),("+bonus(%s)"%(bonusvalue))*(bonus==pseudo)) for pseudo,contrib in self.play_status[canal][2].items()]
- contribs_score={pseudo:int(10*contrib/nlettre) for pseudo,contrib in self.play_status[canal][2].items()}
+ contribs_score={pseudo:int(10.0*contrib/nlettre)+(bonusvalue*(bonus==pseudo)) for pseudo,contrib in self.play_status[canal][2].items()}
self.add_score(contribs_score)
serv.privmsg(canal,"Contributions : %s"%(" ".join(contribs)) )
self.play_status[canal]=[None,None,None]