Fratmo

Stato
Discussione chiusa ad ulteriori risposte.

!R~

Utente Silver
22 Maggio 2009
0
0
0
55
Un bel giorno non avevo un pazzo da fare e dissi "pazzo, ora scrivo un bel bot per irc".
Lo scrissi, ma faceva solo due cazzatine e già aveva 130 righe di codice.
Così nella mia malata/scema/drogata mente dissi: "Perchè non scriverlo a plugin?"
E da lì Fratmo prese vita. La comodità è che chiunque abbia nella sua merd* di testolina
qualche idea per aggiungere una funzione al bot, può farlo senza modificare il codice del
sorgente stesso, ma scrivendo un semplice plugin.

Scrivere un plugin è semplice: ogni plugin deve avere due funzioni, control() e main().
La prima consiste nel controllare se il plugin dovrà essere eseguito, la seconda
contiene il corpo del plugin.

Come fa a controllare se il plugin deve essere eseguito? Semplice, faccio un controllo
sui dati ricevuti dal server e, se trovo la stringa che ritorna la funzione control()
di un plugin, vado ad eseguire il main dello stesso.

Ultima cosa: il main prende come argomento una lista, che contiene 3 elementi: il
socket su cui operare, il channel nel quale è loggato il bot e la stringa ricevuta dal server.

Per schiarirvi le idee, quà trovate il source: http://github.com/Erre/Fratmo

P.S: si lo so, ho messo solo un plugin nel repo, a non mi va/non ho tempo di scriverne altri.
 
Carino, pero' sarebbe stato piu' bello se avessi usato una regex al posto di una stringa per fare il controllo.
 
Vedo che ce l'hai fatta ;)

bene, mi ha dato l'opportunità di leggere un po' di python. Se mi verrà in mente qualche funzionalità interessante la implementerò ^^
 
Grazie :D

@meh: molto vero, appena rimetto mano al sorgente lo farò :)
@tilde: si beh, ce l'ho fatta dopo aver creato/eliminato 700 repository e fatto andare in tilt github, ma ce l'ho fatta.
 
tilde ha detto:
Vedo che ce l'hai fatta ;)

bene, mi ha dato l'opportunità di leggere un po' di python. Se mi verrà in mente qualche funzionalità interessante la implementerò ^^

str*nzo, perché il suo sì ed il mio no? :p

@!R~: personalmente non avrei passato direttamente il socket ai plugins, ma avrei fornito loro una funzione per poter inviare. In questo modo, se in futuro dovresti voler inserire un controllo sui dati inviati, potrai farlo con molta + facilità (infatti, se dai un'occhiata al mio bot, troverai il metodo send ;) )

ora guardo + nel dettaglio

edit: consigli:
1) usa format, nn il vecchio % per le stringhe
2) dà la possibilità di caricare anche singoli plugins
3) nn overloadare la non-reserved keyword list ;)
 
Malex ha detto:
tilde ha detto:
Vedo che ce l'hai fatta ;)

bene, mi ha dato l'opportunità di leggere un po' di python. Se mi verrà in mente qualche funzionalità interessante la implementerò ^^

str*nzo, perché il suo sì ed il mio no? :p

Così, tu non me l'hai mai chiesto, e il suo è corto
 
Malex ha detto:
1) usa format, nn il vecchio % per le stringhe
2) dà la possibilità di caricare anche singoli plugins
3) nn overloadare la non-reserved keyword list ;)
1 e 3, dettagli dei quali non tengo mai conto :D sono un tipo abitudinario O:
Ti prometto che mi ricorderò di farlo la prossima volta <3

Per la 2, inizialmente volevo farlo, poi non so perchè non l'ho fatto, sarà la droga.

E comunque, chuzz mi ha fatto notare che "prima importo il mondo, poi lo butto in un ciclo". Questa si che è da correggere O:

Vabbè quando aggiornerò il codice vi accontenterò tutti :rulezmg:
 
tilde ha detto:
Malex ha detto:
tilde ha detto:
Vedo che ce l'hai fatta ;)

bene, mi ha dato l'opportunità di leggere un po' di python. Se mi verrà in mente qualche funzionalità interessante la implementerò ^^

str*nzo, perché il suo sì ed il mio no? :p

Così, tu non me l'hai mai chiesto, e il suo è corto

questo solo perché ho messo 3 thread principali + quelli dei plugins e comunico via queue, perché supporto ssl e c'è una gestione degli errori che nn crasha ;)

e cmq il mio te l'avevo pure linkato :(
 
Male.
Codice:
                self.s.send("USER %s 0 *: %s\r\n" % (user, user))
                self.s.send("NICK %s\r\n" % nick)
                self.s.send("JOIN %s\r\n" % channel)
Malissimo.
Leggi la rfc prima di fare bot irc ç_ç

Prima di inviare il JOIN o qualsiasi altro comando, devi aspettare lo 004 del server.
Quindi, prima invii l'USER e il NICK, poi inizi il loop e controlli.
Usa questa regex:
Codice:
/^:indirizzoserver 004 nickbot/i
Inoltre,
Codice:
self.s.send("USER %s 0 *: %s\r\n" % (user, user))
Hai cannato lo spazio.
La sintassi è USER x 0 * :y , non USER x 0 *: y :p
[ot]M'hai fatto venir voglia di scriverlo in Perl un bot del genere..[/ot]
 
Robertof ha detto:
Male.
Codice:
                self.s.send("USER %s 0 *: %s\r\n" % (user, user))
                self.s.send("NICK %s\r\n" % nick)
                self.s.send("JOIN %s\r\n" % channel)
Malissimo.
Leggi la rfc prima di fare bot irc ç_ç

Evidentemente avra' letto la prima RFC (in cui non c'e' ombra del numeric 004) invece dell'ultima, e comunque non userei il 004 come connected, ma 376 e 422 (end of motd e no motd).

In generale comunque inviare il JOIN subito non cambia niente visto che i server in genere usano una queue.
 
Su alcuni server m'è capitato che inviare subito il comando di join, identify ecc. non funzionasse.

Comunque, giusto. Ne terrò conto
 
Robertof ha detto:
Su alcuni server m'è capitato che inviare subito il comando di join, identify ecc. non funzionasse.

Comunque, giusto. Ne terrò conto

il server in questione era o quello di blacklight o quello di huf. Tutti gli altri il problema non lo danno ;)
 
È perché inviano il PING iniziale.
Quindi se tu non rispondi al ping iniziale prima di dare il join, non joini.
 
Aggiunta la possibilità di caricare i moduli manualmente e fixati alcuni bug.
Repo aggiornato: http://github.com/Erre/Fratmo

:rulezmg:
 
Stato
Discussione chiusa ad ulteriori risposte.