簡體   English   中英

Python中的IRC BOT(如果在while循環中的elif中)

[英]IRC BOT in Python, if in elif in while-loop

這是完整的代碼:

#client der mit irc-server kontakt aufnimmt
import time
import socket
from sys import argv

script, mitspieler1, mitspieler2 = argv
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

class funktion:

    def main(self):

            print "Socket(Client)"
            host = "irc.iz-smart.net"
            port = 6667 
            PASS = "7987fshd" 
            NICK = "Testikus" 
            USER = "Testikus localhost irc.iz-smart.net :Testikus" 
            self.login(PASS, NICK, USER, host, port)
            print "Verbindung aufgebaut zu {0}(IP:{1})".format(
            host, socket.gethostbyname(host)
            )
            self.haupt_schleife()

    def haupt_schleife(self):
        while True:
            antwort = sock.recv(4096)
            join = "JOIN #testblablub \r\n"
            print antwort
            if antwort[0:4] == "PING":
                self.pong(antwort, join)
            elif antwort.split()[3] == ":quiz.start":
                sock.sendall("PRIVMSG #testblablub Es spielen mit: "
                            +mitspieler1+" und "+mitspieler2+"\r\n"
                            )
                time.sleep(2)
                self.fragen(antwort)

    def pong(self, antwort, join):
        sock.sendall("PONG " + antwort.split()[1] + "\n")
        time.sleep(3)
        sock.sendall(join)
        sock.sendall("PRIVMSG #testblablub hi \r\n")

    def login(self, PASS, NICK, USER, host, port):
        sock.connect((host, port))
        sock.sendall("PASS "+PASS+"\n")
        sock.sendall("NICK "+NICK+"\n")
        sock.sendall("USER "+USER+"\n")

    def fragen(self, antwort):
            sock.sendall("PRIVMSG #testblablub Welche Farbe hat der Himmel ? \r\n")
            time.sleep(3)
            if antwort.split()[3] == ":blau":
                sock.sendall("PRIVMSG #testblablub RISCHTISCH \r\n")





ausfuehren = funktion()
ausfuehren.main()

(有些字符串是用德語編寫的,但是我認為這並不重要)

所以我的主要問題是我希望函數def fragen(self, antwort)def haupt_schleife(self)函數(或python的方法)中運行。 所有重要的東西都在這個def haupt_schleife(self) 我希望其余的測驗代碼在def haupt_schleife(self)的elif塊中運行,因此這是一件完全獨立的事情。 愚蠢的事情是,如果我輸入“ quiz.start”,則: sock.sendall("PRIVMSG #testblablub Welche Farbe hat der Himmel ? \\r\\n")可以正常運行,但是不會啟動if -聲明。 它只是在頻道中什么也沒做(僅打印“ Welche Farbe hat der Himmel?”)。

我希望最終有人能理解這一點:/(由於argv,如果您要運行代碼,則必須在命令行中鍵入兩個名稱)

IRC語法

發送消息應該做的是這樣的:

PRIVMSG #testblablub Es spielen mit:

它應該是:

PRIVMSG #testblablub :Es spielen mit ...

此外, USER應包括4個部分:

<username> <hostname> <servername> :<full name/realname>

在irc中,以\\r\\n結尾的每個字符串很重要
我注意到您有時會發送\\n ,並且結局很差,總是以\\r\\n結尾!

然后是sock.sendall(...) ,它應該用於要在所有打開的套接字上廣播消息的UDP套接字上,在這種情況下,您要與服務器之間sock.sendall(...)發送。它是通過TCP的,所以您應該使用sock.send(...) (如果我在這里錯了,請糾正我)

旁注:
PING ,它只應使用PONG <server-name (usually sent with PING)>\\r\\n答復,而不是每次都用JOIN進行垃圾郵件, JOIN應該在收到MOTD之后發送,但是請確保這不是問題。它只會惹惱系統管理員。 在您的情況下,可能是PONG irc.iz-smart.net\\r\\n ,僅此而已,沒有JOIN等。


現在,解決問題

   def haupt_schleife(self):
        while True:
            antwort = sock.recv(4096)
            join = "JOIN #testblablub \r\n"
            print antwort
            if antwort[0:4] == "PING":
                self.pong(antwort, join)
            elif antwort.split()[3] == ":quiz.start":
                sock.sendall("PRIVMSG #testblablub Es spielen mit: "
                            +mitspieler1+" und "+mitspieler2+"\r\n"
                            )
                time.sleep(2)
                self.fragen(antwort)
            elif antwort.split()[3] == ":blau":
                sock.sendall("PRIVMSG #testblablub RISCHTISH!\r\n")

由於self.fragen(...) 用戶編寫quiz.start 才會被調用,因此def fragen(...)內部的if校驗將永遠不會再運行。.(因為用戶下次編寫某些內容,可能是“ blau”,與“:quiz.start”不匹配,這是fragen(...)內部if檢查的唯一方法。

    def fragen(self, antwort):
            sock.sendall("PRIVMSG #testblablub Welche Farbe hat der Himmel ? \r\n")
            time.sleep(3)

因此,我們刪除了if塊,並將其改為haupt_schleifeelif

這是第一個運行/消息將被解析的方式: 在此處輸入圖片說明

下次運行時,該消息在fragen變為綠色,但是它永遠不會到達那里,因為到達那里的唯一方法是通過elif antwort.split()[3] == ":quiz.start": :)

當滿足以下條件時,可以調用fragen函數:

elif antwort.split()[3] == ":quiz.start":

然后,在fragen函數中,當此條件為true時,輸入if分支:

if antwort.split()[3] == ":blau":

由於函數已被調用,我們知道antwort.split()[3]將為":quiz.start" ,因此if語句將永遠不會執行。

您應該重新檢查應用程序背后的邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM