IRC protokoll, no such nick/channel

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Hey JO, ich hab vor fast genau einem Jahr einen stümperhaften irc client/bot mit python programmiert, mit diesem code:

Code: Alles auswählen

import time
import socket
from contextlib import closing
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
class bot:
       
        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.schleife()
                       
        def 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] != "":
                                self.reply()
       
        def pong(self, antwort, join):
                sock.sendall("PONG " + antwort.split()[1] + "\n")
                time.sleep(2)
                sock.sendall(join)
                sock.sendall("PRIVMSG #testblablub hi \r\n")
               
        def constants(self):
                pass
 
        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 reply(self):
                sock.sendall("PRIVMSG #testblablub du hast was geschrieben \r\n")
               
                       
ausfuehren = bot()
ausfuehren.main()
Den würde ich jetzt gerne wieder aktivieren um wieder ein bisschen reinzukommen(in python). Komischerweise funktioniert der code nicht mehr so wie damals :K Ich hab schon ein bisschen dran rumgeändert, hat leider nix gebracht, bei der Version jetzt(so wie sie da steht) funktioniert ping pong and Verbinden, aber irgendwo gibt es anscheinend Probleme mit dem joinen von channeln(schönes denglisch). Also am Ende kommt immer "No such nick/channel". Vielleicht kennt sich jemand damit aus und kann mir helfen?

LG
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Ach Mist, der Thread gehört eigentlich ins Socket Forum, tut mir leid.

Gruß
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Wie lautet denn die exakte Fehlermeldung, inklusive Tracback? Damit kann man dir wesentlich besser weiterhelfen. Deine Fehlermeldung ""No such nick/channel" kommt leider im genannten Quelltext nicht vor.

Grüße,
anogayales
Benutzeravatar
Balmung
User
Beiträge: 44
Registriert: Sonntag 17. März 2013, 18:36

Der IRC spezifische Protokoll Fehler "No such nick/channel" tritt in der Regel auf, wenn man versucht einem User eine Nachricht (PRIVMSG/NOTICE) zu senden, der nicht existiert, oder wenn man versucht an einen Channel eine Nachricht (PRIVMSG/NOTICE) zu senden, der nicht existiert (in dem Fall, dass der Channel existiert, der Bot ihn aber nicht betreten hat, würde man etwas in der Form "No external channel messages" erhalten).

Erstmal solltest du dich ein bisschen mehr an den Python Style Guide halten.

Davon abgesehen erkenne ich spontan einige Protokoll Fehler (die allerdings nicht das Problem lösen):

z.B. sollten die PRIVMSG eher so ausschauen:

Code: Alles auswählen

sock.sendall("PRIVMSG #testblablub :hi\r\n")
sock.sendall("PRIVMSG #testblablub :du hast was geschrieben\r\n")
Mehr Infos hier oder dort.

Der iz-smart IRC Server braucht AFAIK gar kein Passwort (PASS)?

Momentan wird die JOIN Nachricht *jedes mal* gesendet, wenn du vom Server einen PING erhältst.
Sinnvoller wäre es nach z.B. der RPL_WELCOME (001, rfc2812) ausschau zu halten und danach die JOIN Nachrichten zu senden.

Von dem ganzen kram mal abgesehen, wäre es wohl besser sowas wie Twisted zu nutzen, was bereits eine einfache Implementation des IRC Protokolls bereitstellt.
»Honk Honk«
Antworten