Seite 1 von 1

If wird nicht beachtet

Verfasst: Mittwoch 24. März 2010, 22:52
von Baconman
Hallo,

Ich befasse mich erst seid kurzem mit Python und muss mich infolge dessen noch an einiges gewöhnen... aber was ich gar nicht verstehe ist der Fehler in folgendem Programm:

Code: Alles auswählen

import socket

message = str

network = 'irc.iz-smart.net'
port = 6667
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) )
irc.recv ( 4096 )
irc.send ( 'NICK Bacy\r\n' )
irc.send ( 'USER Baconman Baconman Baconman :My IRC\r\n' )
irc.send ( 'JOIN #channel\r\n' )
irc.send ( 'PRIVMSG #channel :Halloele!\r\n' )
while True:
   data = irc.recv ( 4096 )
   if data.find ( 'PING' ) != -1:
      irc.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' )
   elif data.find ( 'PRIVMSG' ) != -1:
      nick = data.split ( '!' ) [ 0 ].replace ( ':', '' )
      message = ':'.join ( data.split ( ':' ) [ 2: ] )
      destination = ''.join ( data.split ( ':' ) [ :2 ] ).split ( ' ' ) [ -2 ]
      if destination == 'My IRC':
         destination = 'PRIVATE'
      print '(', destination, ')', nick + ':', message
   if message == 'wie geht es dir bacy?':
      irc.send( 'PRIVMSG #channel :Gut, danke! und dir?\r\n' )
   else:
      print 'else'
Es soll ein Bot für einen IRC Channel werden. Den größten Teil des Codes habe ich aus dem Internet. Möchte ihn halt jetzt selber erweitern.

Das komische ist nur das, auch wen ich "wie geht es dir bacy?" in den Channel schreibe, immer "else" raus kommt... Ich hoffe einer von euch kann mich über meinen Fehler aufklären :D


BTW: Kann mir vielleicht einer ganz ganz kurz die Zeilen 15 - 23 erklären? Nur damit ich überprüfen kann ob ich es richtig verstanden habe. :)

Grüße Baconman

Re: If wird nicht beachtet

Verfasst: Mittwoch 24. März 2010, 23:08
von Hyperion
Baconman hat geschrieben:Den größten Teil des Codes habe ich aus dem Internet. Möchte ihn halt jetzt selber erweitern.
Der Code sieht ziemlich mies aus. Ich würde ihn wegwerfen und mir erst einmal die Grundlagen von Python erarbeiten! Siehe dazu auch in der FAQ die Sektion für Einsteiger.
Das komische ist nur das, auch wen ich "wie geht es dir bacy?" in den Channel schreibe, immer "else" raus kommt... Ich hoffe einer von euch kann mich über meinen Fehler aufklären :D
Wir können es ja selber nur schwerlich starten und testen! Aber die Sache ist an sich erst mal ganz einfach: Wenn er nicht in den if-Zweig springt, dann stimmt eben die Bedingung nicht ;-) Wieso lässt Du Dir nicht mal message anzeigen? Das wäre doch schon mal das einfachste...
BTW: Kann mir vielleicht einer ganz ganz kurz die Zeilen 15 - 23 erklären? Nur damit ich überprüfen kann ob ich es richtig verstanden habe. :)
Das sind lauter Basics, die man durch das Durcharbeiten des Tutorials sich leicht selber beibringen kann.
Gegenvorschlag: Du formulierst einmal, wie DU denkst, dass das abläuft!

Das hat mehrere Vorteile:
- Du lernst etwas dabei
- Da Du etwas wissen willst, zeigst Du hier allen Engagement ;-)

Nebenbei hat zu so etwas hier wohl kaum einer Lust...

Generell würde ich dazu sagen: Die Vorgehensweise des Scriptes ist Schrott. Ich kenne zwar die Struktur von "data" nicht, aber das sieht echt krank aus und würde sich sicherlich besser lösen lassen. Das Parsing sollte man schon strukturiert aufbauen.

Zum Code an sich: Diese sinnlosen Leerzeichen stören das Gesamtbild

Code: Alles auswählen

# schlecht
foo ( bar )
# besser
foo(bar)

Verfasst: Mittwoch 24. März 2010, 23:27
von Rebecca
Schau dir mal die python-irclib an, damit hat man sowas in ein paar Zeilen bequem gemacht!

Zeile 16 wuerde ich schreiben als:

Code: Alles auswählen

if 'PING' in data:
Zeile 18 entsprechend.

Verfasst: Mittwoch 24. März 2010, 23:32
von gkuhl
Mein Vorschlag wäre, die komplette ``while``-Schleife zu löschen und durch folgenden Code zu ersetzen:

Code: Alles auswählen

import time
while True:
   data = irc.recv(4096)
   print data
   time.sleep(1)
Dann schau mal, was du bekommst und arbeite damit weiter.

Grüße
Gerrit

Verfasst: Donnerstag 25. März 2010, 15:01
von Dav1d
Rebecca hat geschrieben:Zeile 16 wuerde ich schreiben als:

Code: Alles auswählen

if 'PING' in data:
Zeile 18 entsprechend.
Würde ich nicht, was ist wenn dir jemand ne PRIVMSG. NOTICE schickt bzw. im Channel PING schreibt?

[Werbung]http://blog.dav1d.de/code/irc-nach-rfc-parsen/[/Werbung]

irclib != für Anfänger, leider
IMHO finde ich sie wirklich gelungen, allerdings muss den Quelltext durchstöbern um an Infos zu kommen, da AFAIK keine Doku vorhanden ist

Verfasst: Donnerstag 25. März 2010, 16:07
von Baconman
Danke für eure Antworten :D

Habe viel davon umgesetzt und mein Programm läuft jetzt so wie ich es will!

Code: Alles auswählen

import socket
import time


network = 'irc.iz-smart.net'
port = 6667
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) )
irc.recv ( 4096 )
irc.send ( 'NICK Rocky\r\n' )
irc.send ( 'USER Rocky Rocky Rocky :My IRC\r\n' )
irc.send ( 'JOIN #channel\r\n' )
irc.send ( 'PRIVMSG #channel :Halloele!\r\n' )
while True: 
   data = irc.recv(4096) 
   print data
   if 'PING' in data:
      irc.send ('PONG')
   elif 'fick' and 'dich' and 'Rocky' in data:
      irc.send('PRIVMSG #channel :fick dich selber!\r\n')
   time.sleep(1)
EDIT: Doch nicht, aber ich denke das kriege ich hin!

Danke Leute!

Verfasst: Donnerstag 25. März 2010, 16:35
von gkuhl
Baconman hat geschrieben:EDIT: Doch nicht, aber ich denke das kriege ich hin!
Wollt ich gerade anmerken: Jetzt wäre ein guter Zeitpunkt um sich das Tutorial anzuschauen.