#!/usr/bin/env python #-*- encoding: utf-8 -*- # # bot.py # Un bot gérant les interviews des membres de la team du SdZ. # # Copyright (c) 2008 Pierre "delroth" Bourdon # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import IRCLib, time CONFIG = { 'nick': 'SdZinterview', 'password': '', 'server': 'irc.epiknet.org', 'port': 6667, 'channel': '#sdz-interview', 'master': 'EpiK-7A2D6FA8.dsl.club-internet.fr', 'nques': 3, } class Question(object): def __init__(self, message, author): self.message = message self.author = author class Author(object): def __init__(self, mask): if isinstance(mask, IRCLib.UserMask): self.mask = mask else: self.mask = IRCLib.UserMask(mask) def __eq__(self, other): if not isinstance(other, Author): return False if not isinstance(other.mask, IRCLib.UserMask): return False return self.mask.host == other.mask.host class InterviewBot(IRCLib.IRC): def __init__(self, **kwargs): super(InterviewBot, self).__init__(**kwargs) self.interviewed = None self.started = False self.take_questions = True self.wait_question = False self.questions_queue = [] self.already_asked = {} self.qbuffer = '' self.recording = False def get_next_question(self): if len(self.questions_queue) == 0: self.wait_question = True return None q, self.questions_queue = self.questions_queue[0], self.questions_queue[1:] return q def send_next_question(self): self.recording = False if self.qbuffer != '': self.save_buffer() self.qbuffer = '' msg = lambda t: self.Message(CONFIG['channel'], t) q = self.get_next_question() if not q: msg("Il n'y a pas/plus de questions en file d'attente, attendons une question des membres...") return else: self.recording = True format = "Question de %s : %s" % (q.author.mask.nick, q.message) msg(format) self.qbuffer += '%s\n' % format.replace('', '') def save_buffer(self): nick = self.interviewed.mask.nick qbuffer = self.qbuffer open('%s_interview'%nick.replace('/', ''), 'a').write(qbuffer + '\n') def add_new_question(self, q): if q.author in self.already_asked and self.already_asked[q.author] >= CONFIG['nques']: raise Exception("Vous avez posé trop de questions !") elif not self.take_questions: raise Exception("Désolé, pour des contraintes de temps de la personne interviewée, vous ne pouvez pas ajouter de questions supplémentaires.") self.questions_queue.append(q) if q.author in self.already_asked: self.already_asked[q.author] += 1 else: self.already_asked[q.author] = 1 l = len(self.questions_queue) if self.wait_question: self.wait_question = False self.send_next_question() return l def Mode(self, *args): self.Send('MODE', *args) def OnReady(self): self.Send('MODE', self.myNick, '+B') self.Message('NickServ', 'IDENTIFY %s' % CONFIG['password']) self.Join(CONFIG['channel']) return def OnServerJoin(self, umask, channel): if channel != CONFIG['channel']: return if self.IsMe(umask): self.Message(CONFIG['channel'], 'InterviewBot au rapport :)') self.Message(CONFIG['channel'], '!interview pour spécifier la personne à interroger.') elif Author(umask) == self.interviewed: self.Message(CONFIG['channel'], 'Bonjour %s ! Prêt pour votre interview ?' % self.interviewed.mask.nick) self.Mode(CONFIG['channel'], '+v', self.interviewed.mask.nick) self.Message(CONFIG['channel'], 'Une fois que vous êtes prêt à démarrer, dites !debuter') else: if self.started: self.Message(umask.nick, "Bonjour ! L'interview a déja débutée. Vous pouvez mettre vos questions en file d'attente en m'envoyant en message privé la commande suivante :") else: self.Message(umask.nick, "Bonjour ! L'interview n'a pas encore commencé. Pour mettre une question en file d'attente, envoyez moi en message privé la commande suivante :") self.Message(umask.nick, "!question ") self.Message(umask.nick, "Elle sera ensuite mise en file d'attente, et le membre interviewé y répondra en temps voulu.") self.Message(umask.nick, "Attention : vous n'avez le droit qu'à quelques questions, choisissez-les bien ;) .") def OnChannelMessage(self, umask, target, txt): if target.lower() == CONFIG['channel'].lower(): self.OnPublicMessage(umask, txt) def OnPrivateMessage(self, umask, txt): author = Author(umask) == self.interviewed msg = lambda txt: self.Message(umask.nick, txt) if txt.lower().startswith('!nombre') and author: msg("Il y a %d questions en file d'attente." % len(self.questions_queue)) elif txt.lower().startswith('!question'): qtext = ' '.join(txt.split(' ')[1:]) q = Question(qtext, Author(umask)) try: l = self.add_new_question(q) msg("La question a bien été enregistrée. Elle est la numéro %d dans la file ;) ." % l) except Exception, ex: msg(ex.message) def OnPublicMessage(self, umask, txt): author = Author(umask) == self.interviewed msg = lambda txt: self.Message(CONFIG['channel'], txt) if umask.nick.lower() == 'irc': return if txt.lower().startswith('!debuter') and author: self.started = True msg("L'interview commence :) . Pour passer à la question suivante, tapez !question.") msg("Pour obtenir le nombre de questions en file d'attente, envoyez moi en message privé !nombre.") msg("Si vous considérez que le nombre de questions est suffisant, envoyez !stop pour arrêter la prise de questions.") time.sleep(3) msg("Commençons :)") self.send_next_question() elif txt.lower().startswith('!question') and author: self.send_next_question() elif txt.lower().startswith('!stop') and author: msg("Il est inutile de m'envoyer des questions : elles ne seront maintenant plus enregistrées ;) .") self.take_questions = False elif txt.lower().startswith('!interview'): try: umask = IRCLib.UserMask(txt.split()[1]) self.interviewed = Author(umask) msg("Bonjour ! Envoyez !debuter pour commencer l'interview") self.Mode(CONFIG['channel'], '+v', umask.nick) except: msg("Donnez un masque correct pour que je puisse reconnaître qui interviewer.") elif self.recording: self.qbuffer += '%s\n' % txt.replace("", "") if __name__ == "__main__": bot = InterviewBot(loggingEnabled=True) bot.Connect(CONFIG['server'], CONFIG['port']) bot.Ident(CONFIG['nick'], CONFIG['nick'], realname='InterviewBot, by delroth', password=CONFIG['password']) while bot.enabled: time.sleep(0.01)