-1

这是完整的代码:

#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)。我希望其余的测验代码在 elif 块中运行def haupt_schleife(self),这样它就完全独立了。愚蠢的是,如果我输入“quiz.start” :sock.sendall("PRIVMSG #testblablub Welche Farbe hat der Himmel ? \r\n")运行没有问题,但它不会启动 if 语句。它只是在频道中不做任何其他事情(只是打印“Welche Farbe hat der Himmel ? out)。

我希望最后有人明白这一点:/(如果你想运行代码,你必须在命令行中输入两个名称,因为 argv)

4

2 回答 2

3

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 套接字,你想在所有打开的套接字上广播消息,在你的情况下,你正在向服务器发送和从服务器发送消息,没有别的......它是通过 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,所以里面的if检查def fragen(...)永远不会再次运行..(因为下次用户写东西时,它可能是 "blau" 并且不匹配 ":quiz.start" 这是唯一的进去if检查里面的方式fragen(...)

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

所以我们移除了这个if块并把它变成了elif一个haupt_schleife

这就是FIRST运行/消息的解析方式: 在此处输入图像描述

下一次运行,消息将是绿色的,fragen但它永远不会到达那里,因为到达那里的唯一方法是通过elif antwort.split()[3] == ":quiz.start"::)

于 2013-04-10T20:55:51.583 回答
0

fragen当此条件为真时,您调用该函数:

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

然后,在函数中,当此条件为真时fragen进入分支:if

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

由于函数被调用,我们知道antwort.split()[3]它将是":quiz.start",因此该if语句将永远不会被执行。

您应该重新检查应用程序背后的逻辑。

于 2013-04-10T20:59:43.273 回答