py-irclib dccreceive
Verfasst: Freitag 1. August 2008, 00:49
Hallo!
Ich habe jetzt probiert mit py-irclib einen kleinen IRCBot zu schreiben:
Funktioniert auch. Jetzt wollte ich probieren die xdcc Funktionalität einzubauen. Also habe ich mir im Verzeichnis von py-irclib das dccrecv script angesehen. Dort sind 3 event-handler definiert in einer Klasse:
Da ja alles event-driven ist habe ich gedacht ich kann einfach on_dccmsg und on_ctcp übernehmen und in meinen bot packen:
Das macht aber Probleme. Wenn der Bot nun probiert zu verbinden bekomme ich folgendes Traceback:
Zusätzlich verstehe ich auch das dccrecv modul nicht ganz. Man soll es laut descritpion folgendermaßen starten:
Schade das es keine vernünftige Doku gibt. Kann mir jemand helfen?
Ich habe jetzt probiert mit py-irclib einen kleinen IRCBot zu schreiben:
Code: Alles auswählen
#!/usr/bin/python
from ircbot import SingleServerIRCBot
class pyBot(SingleServerIRCBot):
def __init__(self, channel, nickname, server, port=6667):
SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
self.channel = channel
def on_welcome(self, connection, event):
connection.join(self.channel)
def on_privmsg(self, connection, event):
nick = event.source().split('!')[0]
message = event.arguments()[0]
print '%s: %s' % (nick, message)
pybot = pyBot('#pybot', 'crackbot', 'irc.irchighway.net')
pybot.start()
Code: Alles auswählen
class DCCReceive(irclib.SimpleIRCClient):
def __init__(self):
irclib.SimpleIRCClient.__init__(self)
self.received_bytes = 0
def on_ctcp(self, connection, event):
args = event.arguments()[1].split()
if args[0] != "SEND":
return
self.filename = os.path.basename(args[1])
if os.path.exists(self.filename):
print "A file named", self.filename,
print "already exists. Refusing to save it."
self.connection.quit()
self.file = open(self.filename, "w")
peeraddress = irclib.ip_numstr_to_quad(args[2])
peerport = int(args[3])
self.dcc = self.dcc_connect(peeraddress, peerport, "raw")
def on_dccmsg(self, connection, event):
data = event.arguments()[0]
self.file.write(data)
self.received_bytes = self.received_bytes + len(data)
self.dcc.privmsg(struct.pack("!I", self.received_bytes))
def on_dcc_disconnect(self, connection, event):
self.file.close()
print "Received file %s (%d bytes)." % (self.filename,
self.received_bytes)
self.connection.quit()
def on_disconnect(self, connection, event):
sys.exit(0)
Code: Alles auswählen
#!/usr/bin/python
from ircbot import SingleServerIRCBot
class pyBot(SingleServerIRCBot):
def __init__(self, channel, nickname, server, port=6667):
SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
self.channel = channel
def on_welcome(self, connection, event):
connection.join(self.channel)
def on_privmsg(self, connection, event):
nick = event.source().split('!')[0]
message = event.arguments()[0]
print '%s: %s' % (nick, message)
def on_ctcp(self, connection, event):
args = event.arguments()[1].split()
if args[0] != "SEND":
return
self.filename = os.path.basename(args[1])
if os.path.exists(self.filename):
print "A file named", self.filename,
print "already exists. Refusing to save it."
self.connection.quit()
self.file = open(self.filename, "w")
peeraddress = irclib.ip_numstr_to_quad(args[2])
peerport = int(args[3])
self.dcc = self.dcc_connect(peeraddress, peerport, "raw")
def on_dccmsg(self, connection, event):
data = event.arguments()[0]
self.file.write(data)
self.received_bytes = self.received_bytes + len(data)
self.dcc.privmsg(struct.pack("!I", self.received_bytes))
def on_dcc_disconnect(self, connection, event):
self.file.close()
print "Received file %s (%d bytes)." % (self.filename,
self.received_bytes)
pybot = pyBot('#pybot', 'crackbot', 'irc.irchighway.net')
pybot.start()
Ich weiß zwar was der Fehler bedeutet, aber nicht warum er zustande kommt.Traceback (most recent call last):
File "pyBot.py", line 44, in <module>
pybot.start()
File "/home/crackpod/Desktop/pyBot/ircbot.py", line 247, in start
SimpleIRCClient.start(self)
File "/home/crackpod/Desktop/pyBot/irclib.py", line 1104, in start
self.ircobj.process_forever()
File "/home/crackpod/Desktop/pyBot/irclib.py", line 229, in process_forever
self.process_once(timeout)
File "/home/crackpod/Desktop/pyBot/irclib.py", line 214, in process_once
self.process_data(i)
File "/home/crackpod/Desktop/pyBot/irclib.py", line 183, in process_data
c.process_data()
File "/home/crackpod/Desktop/pyBot/irclib.py", line 564, in process_data
self._handle_event(Event(command, prefix, target, m))
File "/home/crackpod/Desktop/pyBot/irclib.py", line 594, in _handle_event
self.irclibobj._handle_event(self, event)
File "/home/crackpod/Desktop/pyBot/irclib.py", line 326, in _handle_event
if handler[1](connection, event) == "NO MORE":
File "/home/crackpod/Desktop/pyBot/irclib.py", line 1043, in _dispatcher
getattr(self, m)(c, e)
File "pyBot.py", line 19, in on_ctcp
args = event.arguments()[1].split()
IndexError: list index out of range
Zusätzlich verstehe ich auch das dccrecv modul nicht ganz. Man soll es laut descritpion folgendermaßen starten:
Aber dann hat man weder Username, noch ist man im channel.Usage: dccreceive <server[:port]> <nickname>
Schade das es keine vernünftige Doku gibt. Kann mir jemand helfen?