Seite 1 von 1

IRC QuizBot

Verfasst: Sonntag 20. November 2005, 16:01
von Phoenix
Hallo Zusammen :)

Ich moechte hier gerne einen QuizBot fuers IRC vorstellen bzw. erstellen.
Also ich stelle hier nach und nach Teile des Bots vor und hoffe auf rege Beteiligung durch Kritik, Lob oder Anregungen.

So einen Bot habe ich schon im MSL (MircScriptLanguage) erstellt, bin also nicht unvorbereitet. Auch habe ich schon einige Sachen mit Python gemacht. Es sollte also ohne grosse Probleme funktionieren.

Also hoffen wir mal das Beste :)

Die Basis fuer den Bot stellt die irclib, daraus nehm ich den Testbot und bau den nach und nach um.

Code: Alles auswählen

#! /usr/bin/env python
#

"""Ein Quiz-Bot fuers IRC

Fuer den Anfang das Grundgeruest.

    disconnect -- Der Bot beendet die Verbindung und verbindet nach 60 sec. neu.
    die -- Der Bot beendet sich.

"""

import string
from ircbot import SingleServerIRCBot
from irclib import irc_lower, nm_to_n

#Globale Variablen
DEBUG = 1
QUIZMASTER = "Phoenix"
VERSION = "0.001"
NICKNAME = "QuizZ"
SERVER = "irc.netz.de"

class QuizBot(SingleServerIRCBot):
    def __init__(self, channel, nickname, server, port=6667):
        SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
        self.channel = channel
    def on_nicknameinuse(self, c, e):
        c.nick(c.get_nickname() + "_")
    def on_welcome(self, c, e):
        c.join(self.channel)
    def on_privmsg(self, c, e):
        nick = nm_to_n(e.source())
        if DEBUG:
                print "privmsg: ", nick, e.arguments()[0]
        self.do_command(e, e.arguments()[0])
    def on_pubmsg(self, c, e):
        nick = nm_to_n(e.source())
        a = string.split(e.arguments()[0], ":", 1)
        if DEBUG: 
                print "pubmsg: ", nick, a
        if len(a) > 1 and irc_lower(a[0]) == irc_lower(self.connection.get_nickname()):
            self.do_command(e, string.strip(a[1]))
        return
    def do_command(self, e, cmd):
        nick = nm_to_n(e.source())
        c = self.connection
        if cmd == "disconnect":
            self.disconnect()
        elif cmd == "die":
            self.die()

def main():

    port = 6667
    channel = "#quiz"
    bot = QuizBot(channel, NICKNAME, SERVER, port)
    bot.start()

if __name__ == "__main__":
    main()
Damit haben wir schon mal einen Bot, der zu dem IRC-Netz verbindet und uns die Eingaben der User liefert.

LG
Phoenix

Verfasst: Sonntag 20. November 2005, 21:17
von Phoenix
Ich hoffe mal, das ich mit meinem Post auch im richtigen Bereich bin.

Also ich habe nun noch Funktionen hinzu gefügt, die eine Frage stellen und Tipps geben.

Code: Alles auswählen

#! /usr/bin/env python
#

import string, random
from time import *
from ircbot import SingleServerIRCBot
from irclib import irc_lower, nm_to_n

#Globale Variablen
DEBUG = 1
QUIZMASTER = "Phoenix"
VERSION = "0.002"
NICKNAME = "QuizZ"
SERVER = "irc.netz.de"

class QuizBot(SingleServerIRCBot):
    def anz_fragen(self):
        #die funktion ist zwar noch nicht in benutzung, aber wird evtl. noch gebraucht
        try:
           f = open('fragen.txt', 'r')
        except IOError:
           return 0
        else:
           f_in = f.readlines()
           f.close()
           return len(f_in)/3-1
	
    def frage_einlesen(self, nr=0):
        #nr ist die nr der frage, 0 = zufaellig
        #rueckgabewert ist die frage als liste
        #frage = [frage, antwort, tip]
        frage = []
        try:
           f = open('fragen.txt', 'r')
        except IOError:
           #datei ist nicht vorhanden
           frage = []
        else:
           f_in = f.readlines()
           f.close()
           if nr == 0:
              nr = random.randint(1, len(f_in)/3-1)
           i = 1
           for line in f_in: 
              if i == nr*3+1:
                  frage.append(string.replace(line, "\r\n", ""))
              if i == nr*3+2:
                  frage.append(string.replace(line, "\r\n", ""))
              if i == nr*3+3:
                  frage.append(string.replace(line, "\r\n", ""))
              i += 1
        return frage
        # gibt es eine einfachere und schnellere moeglichkeit an die x. zeile in der textdatei zu kommen?
	
    def einz_frage(self):
        frage_l = self.frage_einlesen()
        if len(frage_l)>2:
          self.frage = frage_l[0]
          self.antwort = frage_l[1]
          self.tip = frage_l[2]
          if DEBUG:
                  print self.frage, self.antwort, self.tip
          c = self.connection
        
          txt = "Frage : " + self.frage
          # hier muss noch eine FragenNr. rein, aber nicht alles auf einmal machen ;)
          self.msg(c, self.channel, txt)
          self.frage_zeit = time()
        
          # alle 10 sekunden einen tip
          # self.timer_sek = 10 
          # vlt. sollte man spaeter eine optionsdatei machen
          # aber erstmal ist das so ok, denke ich
          self.tippnr = 0
          c.execute_delayed(self.timer_sek, self.tipps)

    def msg(self, c, chan, text):
        #fuer die ausgaben des bots, da muessen wir aber noch mehr verschiedene farben einbauen
        #vlt. eine fuer die fragen msg_frage, eine fuer die antworten msg_antwort, usw. mal sehen
        #2 = Fettschrift, 3 = Farbe 31=underlined
        txt = chr(3) + "12*->" + text + " <-*"
        c.privmsg(chan, txt)
    
    def tipps(self):
        c = self.connection
        # wir fuellen die antwort mit . aus, spaeter kommt noch eine andere
        # tipp-methode 
        self.tippnr += 1
        if self.tippnr < len(self.antwort):
                txt = "Tip : " + string.ljust(self.antwort[:self.tippnr], len(self.antwort), ".")
                c.execute_delayed(self.timer_sek, self.tipps)
        else:
                txt = "Antwort : " + self.antwort
        self.msg(c, self.channel, txt)

    def __init__(self, channel, nickname, server, port=6667):
        SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
        self.channel = channel
        self.timer_sek = 10.0
        self.frage_zeit = 0
        self.frage = ""
        self.antwort = ""
        self.tip = ""
        self.tippnr = 0
	
    def on_pubmsg(self, c, e):
        nick = nm_to_n(e.source())
        a = string.split(e.arguments()[0], ":", 1)
        if DEBUG: 
                print "pubmsg: ", nick, a
        if len(a) > 1 and irc_lower(a[0]) == irc_lower(self.connection.get_nickname()):
            self.do_command(e, string.strip(a[1]))
        else:
            self.do_chan_command(e, string.strip(e.arguments()[0]))
   
    def do_chan_command(self, e, cmd):
        nick = nm_to_n(e.source())
        c = self.connection
        if cmd == "!frage":
            self.einz_frage()
Das sind nur die neuen bzw. geänderten Funktionen und die Imports. Es lohnt sich ja nicht immer alles zu posten.

LG
Phoenix

Verfasst: Montag 21. November 2005, 15:28
von Leonidas
Phoenix hat geschrieben:Das sind nur die neuen bzw. geänderten Funktionen und die Imports. Es lohnt sich ja nicht immer alles zu posten.
Nur mal so: Du kannst auch deine Beiträge editieren.

Verfasst: Montag 21. November 2005, 16:03
von Phoenix
das weiss ich wohl, aber ich denke, es ist etwas unuebersichtlich hier den ganzen bot zu posten.

besser ist es doch immer nur die teile, um die es gerade geht zu nehmen.

LG
Phoenix