IRC QuizBot

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Phoenix
User
Beiträge: 6
Registriert: Mittwoch 28. September 2005, 09:37

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
Phoenix
User
Beiträge: 6
Registriert: Mittwoch 28. September 2005, 09:37

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Phoenix
User
Beiträge: 6
Registriert: Mittwoch 28. September 2005, 09:37

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
Antworten