self.quiet_channels = config.quiet_channels
self.last_perdu = 0
+ ### Communication NK
def new_connection_NK(self, serv, username, password, typ="bdd"):
"""Renvoie (``True``, <une socket ouverte et authentifiée sur la NoteKfet2015>)
ou bien (``False``, None)"""
return (True, info, sock)
else:
return (False, None, None)
-
+
+ ### Utilitaires
+ def _getnick(self):
+ """Récuère le nick effectif du bot sur le serveur."""
+ return self.serv.get_nickname()
+ nick = property(_getnick)
+
def give_me_my_pseudo(self, serv):
"""Récupère le pseudo auprès de NickServ."""
serv.privmsg("NickServ", "RECOVER %s %s" % (config.irc_pseudo, config.irc_password))
time.sleep(0.3)
serv.nick(config.irc_pseudo)
+ def pourmoi(self, serv, message):
+ """Renvoie (False, lemessage) ou (True, le message amputé de "pseudo: ")"""
+ pseudo = self.nick
+ pseudo = pseudo.decode("utf-8")
+ size = len(pseudo)
+ if message[:size] == pseudo and len(message) > size and message[size] == ":":
+ return (True, message[size+1:].lstrip(" "))
+ else:
+ return (False, message)
+
+ ### Exécution d'actions
+ def lost(self, serv, channel, forced=False):
+ """Réaction à un trigger de perdu.
+ Annonce "J'ai perdu" sur le channel si on n'a pas perdu depuis un certain temps."""
+ 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()
+ 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 quitter(self, chan, leave_message=None):
+ """Quitter un channel avec un message customisable."""
+ if leave_message == None:
+ leave_message = random.choice(config.leave_messages)
+ self.serv.part(chan, message=leave_message.encode("utf8"))
+
+ def mourir(self):
+ """Se déconnecter du serveur IRC avec un message customisable."""
+ quit_message = random.choice(config.quit_messages)
+ self.die(msg=quit_message.encode("utf8"))
+
+ def execute_reload(self, auteur=None):
+ """Recharge la config."""
+ reload(config)
+ regexp_compile()
+ if auteur in [None, "SIGHUP"]:
+ towrite = "Config reloaded" + " (SIGHUP received)" * (auteur == "SIGHUP")
+ for to in config.report_bugs_to:
+ self.serv.privmsg(to, towrite)
+ log(self.serveur, towrite)
+ return True, None
+ else:
+ return True, u"Config reloaded"
+
+ 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))
+
+ ACTIONS = {
+ "reload" : execute_reload,
+ }
+
+ def execute_something(self, something, params, place=None, auteur=None):
+ """Exécute une action et répond son résultat à ``auteur``
+ sur un chan ou en privé en fonction de ``place``"""
+ action = self.ACTIONS[something]
+ success, message = action(self, **params)
+ if message:
+ if irclib.is_channel(place):
+ message = "%s: %s" % (auteur, message.encode("utf-8"))
+ self.serv.privmsg(place, message)
+ log(self.serveur, place, auteur, something + "%r" % params + "[successful]" if success else "[failed]")
+
+ ### Surcharge des events du Bot
def on_welcome(self, serv, ev):
"""À l'arrivée sur le serveur."""
self.serv = serv # ça serv ira :)
for report in self.report_bugs_to:
serv.privmsg(report, "Connection to NK2015 failed, invalid password ?")
- def lost(self, serv, channel, forced=False):
- """Réaction à un trigger de perdu.
- Annonce "J'ai perdu" sur le channel si on n'a pas perdu depuis un certain temps."""
- 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()
- 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):
- """Renvoie (False, lemessage) ou (True, le message amputé de "pseudo: ")"""
- pseudo = self.nick
- pseudo = pseudo.decode("utf-8")
- size = len(pseudo)
- if message[:size] == pseudo and len(message) > size and message[size] == ":":
- return (True, message[size+1:].lstrip(" "))
- else:
- return (False, message)
-
def on_privmsg(self, serv, ev):
"""À la réception d'un message en privé."""
message = ev.arguments()[0]
notunderstood = True
elif cmd == u"reload":
if auteur in self.ops:
- self.reload(auteur)
- log(self.serveur, "priv", auteur, " ".join(message) + "[successful]")
+ self.execute_something("reload", {"auteur" : auteur}, place=auteur, auteur=auteur)
else:
notunderstood = True
elif cmd == u"reconnect":
log(self.serveur, canal, auteur, message + "[failed]")
elif cmd == u"reload":
if auteur in self.ops:
- log(self.serveur, canal, auteur, message + "[successful]")
- self.reload(canal)
+ self.execute_something("reload", {"auteur" : auteur}, place=canal, auteur=auteur)
elif cmd == u"crash":
if auteur in self.overops:
self.crash(auteur, message)
else:
serv.privmsg(channel, l1[i].format(auteur).encode("utf8"))
- def quitter(self, chan, leave_message=None):
- """Quitter un channel avec un message customisable."""
- if leave_message == None:
- leave_message = random.choice(config.leave_messages)
- self.serv.part(chan, message=leave_message.encode("utf8"))
-
- def mourir(self):
- """Se déconnecter du serveur IRC avec un message customisable."""
- quit_message = random.choice(config.quit_messages)
- self.die(msg=quit_message.encode("utf8"))
-
- def _getnick(self):
- """Récuère le nick effectif du bot sur le serveur."""
- return self.serv.get_nickname()
- nick = property(_getnick)
-
- def reload(self, auteur=None):
- """Recharge la config."""
- reload(config)
- regexp_compile()
- if auteur in [None, "SIGHUP"]:
- towrite = "Config reloaded" + " (SIGHUP received)" * (auteur == "SIGHUP")
- for to in config.report_bugs_to:
- self.serv.privmsg(to, towrite)
- log(self.serveur, towrite)
- else:
- self.serv.privmsg(auteur, "Config reloaded")
-
- 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))
-
+ ### .fork trick
def start_as_daemon(self, outfile):
sys.stderr = Logger(outfile)
self.start()
basile = Basile(serveur,debug)
# Si on reçoit un SIGHUP, on reload la config
def sighup_handler(signum, frame):
- basile.reload("SIGHUP")
+ basile.execute_reload(auteur="SIGHUP")
signal.signal(signal.SIGHUP, sighup_handler)
# Daemonization
if daemon: