[英]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,如果您要運行代碼,則必須在命令行中鍵入兩個名稱)
發送消息不應該做的是這樣的:
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_schleife
的elif
。
這是第一個運行/消息將被解析的方式:
下次運行時,該消息在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.