Creare un bot per chat irc non è stato mai così semplice grazie a PircBot! PircBot è una libreria che permette di realizzare un bot completo, efficiente, funzionale attraverso il linguaggio di programmazione Java. Attraverso poche righe di codice si può insegnare al bot una serie di comandi in modo tale da soddisfare le richieste dell’utente che entra in chat.
Un po’ di storia
Nel mondo ci sono attualmente numerose reti IRC, che permettono di scambiare informazioni a milioni di utenti. Ma IRC (Internet Relay Chat) nasce nel 1989 in Finlandia come protocollo per conversazioni multiutente, e si afferma a partire dal 1993, quando comincia ad essere usato soprattutto nelle reti universitarie.
Tra i pionieri di IRC, però, non mancano però divergenze e diversità di vedute: nel 1994 questa rete subisce una scissione che porta alla nascita di Undernet, sostenuta dai dissidenti della rete originale IRC; la rete IRC prenderà il nome di EFnet. In EFnet viene mantenuto il principio fondamentale, espresso dal creatore originale Oikarinen, secondo il quale la riservatezza degli utenti invisibili e dei canali segreti non deve essere in alcun modo violata dagli operatori di server. Al contrario, all’interno di Undernet sono gli stessi operatori ad accrescere i loro poteri di controllo sia sui canali che sugli stessi utenti.
Le tensioni iniziano a crescere nuovamente sia in EFnet che nella stessa Undernet provocando così da un lato la scissione in altre due reti, e dall’altro la creazione di un’ulteriore rete (DALNet) da parte di coloro che volevano il massimo del controllo possibile all’interno della rete. Con il passare degli anni, delle quattro reti cosi formate, solo IRCnet continua a mantenere le idee originali espresse dai fondatori e a ottenere un grosso consenso da parte degli utenti europei [1].
Cos’è Irc?
Irc è un sistema di comunicazione basato su testo: collegandosi a uno dei server irc è possibile “parlare” scrivendo con persone di ogni parte del mondo. Ogni Server irc ha una lista di canali o stanze dai nomi più strambi e accattivanti, questo per cercare di portare più gente possibile nel proprio canale.
Non è sempre facile dialogare con la gente nella chat. Infatti molte persone faranno di tutto per farsi notare: scriveranno il testo di carattere diverso, colorato, useranno tecniche di flooding (ripetizione del testo più volte). I toni non saranno sempre pacati e sereni, ma per questo esistono i moderatori della chat, che potranno fare fuori un utente (in gergo, “bannarlo”, da “to ban”) e così allontanarlo dalla stanza. [2]
I bot
Bot è una abbreviazione di “robot”. In una rete IRC, un bot altro non è che una sorta di client automatico. Da un punto di vista tecnico, un bot è un programma che accede alla rete attraverso lo stesso tipo di canali utilizzati dagli utenti umani: in una chat, pertanto, un bot è una sorta di automa in grado di inviare messaggi.
I bot, di solito, sono sviluppati in linguaggio Java e consentono uno standard di funzionalità che spaziano dall’invio di messaggi privati alle e-mail di utenti non connessi, all’apertura di chat room private con utenti in linea, all’invio di emoticon all’interno dei messaggi oppure, all’offerta di servizi di condivisione fle ìntegrati nel sistema di chat, fino ad arrivare a svolgere il ruolo di “maggiordomi” delle stanze virtuali più sofisticate. I bot, inoltre, possono essesre anche usati per creare dei veri e propri giochi, come quiz.
Un’ulteriore evoluzione in campo di “bot” è sicuramente l’avvento di psotnic, un bot le cui velocità sono di gran lunga superiori a quelle dei pur sofisticati eggdrop. Anch’esso è dotato di partyline, invio messaggi privati ed espansioni con script in C [3] [4].
PircBot
PircBot è un Framework Java per scrivere Bot per Irc in maniera semplice e immediata. Esso consente di eseguire una serie di attività divertenti su IRC, ma viene utilizzato anche per applicazioni più serie da parte della Marina e della Aeronautica degli Stati Uniti, della CIA (ma questo, come è normale attendersi, non è confermato…), da diverse agenzie di difesa nazionale. Se tutto ciò non bastasse, PircBot è usato anche all’interno del client BitTorrent Azureus. Ma non lasciatevi scoraggiare da questi nomi altisonanti! PircBot è usato così tanto proprio perchè è facile da usare!
Prepariamo l’ambiente di lavoro
Andiamo sul sito ufficiale [5]e scarichiamo l’API PircBot 1.5.0. Dovremmo aver scaricato un file ZIP: apriamolo e all’interno di esso troveremo il nostro file JAR che useremo per creare il nostro Bot.
Figura 1 – Il sito di PircBot, da cui scaricare la libreria.
Una volta copiato il file JAR nella cartella del nostro progetto, siamo pronti per iniziare a scrivere il nostro primo Bot.
Il nostro primo Bot
Inizieremo col creare un bot semplicissimo, c he chiameremo MokaBot, e ha il solo compito di collegarsi alla stanza.
// MyBot.java import org.jibble.pircbot.*; public class MyBot extends PircBot { public MyBot() { this.setName("MokaBot"); } }
Adesso, avviamo il nostro Bot, scrivendo la classe Main. In questa classe che chiameremo MyBotMain istanzieremo un nuovo oggetto MyBot ed infine il server e il canale al quale connetterci.
// MyBotMain.java import org.jibble.pircbot.*; public class MyBotMain { public static void main(String[] args) throws Exception { // Creiamo un nuovo oggetto MyBot MyBot bot = new MyBot(); // Abilitiamo l'opzione che consente di mostrare in console // tutto quello che avviene durante la connessione al server bot.setVerbose(true); // Connessione al server IRC bot.connect("irc.freenode.net"); // Entriamo nel canale #pircbot. bot.joinChannel("#pircbot"); } }
Scarichiamo il Client Irc
Per poter verificare che il nostro Bot che abbiamo appena creato si connetta al server e al canale indicati nel codice, scarichiamo un client IRC. Possiamo scaricare uno dei client riportati sotto, a seconda del sistema operativo che usiamo.
Multipiattaforma
ChatZilla, Pidgin, jIRC, Nirc, XChat, KVIrc, irssi
Windows
IceChat, Bersirc, dIRC, HydraIRC, Klient, mIRC, pIRCh, Trillian, vIRC, XiRCON, Miranda IM, Microsoft Comic Chat, ZRC
Unix-like
BitchX, epic, IIRC, IRCLL, WeeChat, Quassel (KDE), KVIrc, XChat, TalkSoup (GNUstep), Zircon, Konversation (KDE), Empathy, Pidgin (Gnome)
MacOS
X-Chat Aqua, Fire, IRCle, Minerva, Snak, ShadowIRC, Colloquy, MacIrssi, Conversation
Una volta scaricato il nostro client irc installiamolo e una volta avviato il programma colleghiamoci al server irc.freenode.net ed entriamo nel canale #pircbot, come mostrato nelle figure.
Figura 2 – Ci colleghiamo al server irc.freenode.net.
Figura 3 – Ed ecco che, entrati nel canale #pircbot, riceviamo il messaggio di benvenuto.
Adesso possiamo mandare in esecuzione la classe MyBotMain e vediamo come l’utente bot da noi creato, ossia MokaBot, si colleghi al server ed entri nello stesso nostro canale.
Rispondiamo agli utenti
Fino ad ora, abbiamo visto come collegarsi a un server e a un canale irc tramite una classe Java. Dunque proviamo a creare un Bot un po’ più complesso attraverso il quale gli utenti della chat possano interagire.
Il modo più semplice è quello di inventare una serie di comandi che l’utente può digitare sulla chat e al quale il Bot possa rispondere. Ad esempio se qualche utente digita il comando ciao, il Bot potrebbe ripondere Ciao Utente, oppure se qualcuno chiede l’ora o la data, o fa una domanda specifica, si può fare in modo che il nostro Bot possa rispondere. Ci vuole solo un pò di inventiva! Vediamo in dettaglio come realizzare questa classe usando il metodo onMessage() che a seconda del comando che viene digitato dall’utente può fornire una risposta.
import org.jibble.pircbot.*; public class MyBot extends PircBot { public MyBot() { this.setName("MokaBot"); } public void onMessage(String channel, String sender, String login, String hostname, String message) { // Comando ciao: saluta! if (message.equalsIgnoreCase("ciao")) { sendMessage(channel,": Ciao " + sender); } // Comando data: Sono le ore... else if (message.equalsIgnoreCase("data")) { String data = new java.util.Date().toString(); sendMessage(channel, data); } // dammi il sito else if (message.equalsIgnoreCase("sito")) { sendMessage(channel, "https://www.mokabyte.it/"); } // ecc...ecc... qui si puo' continuare! } }
Figura 4 – Il nostro bot ci risponde!
Cacciamo i bimbi cattivi!
Un utente che arreca fastidio alla comunità può essere allontanato temporaneamente, forzandone l’uscita dal canale. Questa operazione, denominata kick, può essere effettuata da un operatore in un canale IRC. È una espulsione “a tempo” e non impedisce all’utente di rientrare successivamente [7] (sperando che poi cominci a comportarsi per bene).
Grazie al metodo onKick() è possibile fare ciò anche con il supporto di Pircbot.
public void onKick(String channel, String kickerNick, String login, String hostname, String recipientNick, String reason) { if (recipientNick.equalsIgnoreCase(getNick())) { joinChannel(channel); } }
Riconnessione automatica
Di solito i bot girano su macchine sempre accese, in modo che il servizio sia sempre disponibile, ma può darsi che non ci sia sempre un operatore davanti alla macchina a controllare quello che sta succedendo. Ad esempio, la connessione cade per un momento e il Bot non si ricollega al canale. Usando il metodo onDisconnect(), possiamo ovviare a questo problema
public void onDisconnect() { while (!isConnected()) { try { reconnect(); } catch (Exception e) { // eccezione } } }
Formattazione testo e colore
Come qualsiasi editor di testo è possibile cambiare il colore e lo stile del nostro carattere per diversificare i tipi di messaggio. Magari un segnale di avvertimento potremo farlo in rosso, uno di benvenuto colorato in modo più tenue e così via.
Guardiamo alcuni esempi
String chan = "#bots"; sendMessage(chan, Colors.BOLD + "Hello!"); Hello! sendMessage(chan, Colors.RED + "Red text"); Red text sendMessage(chan, Colors.BLUE + "Blue text"); Blue text sendMessage(chan, Colors.BOLD + Colors.RED +"Bold and red"); Bold and red sendMessage(chan, Colors.BLUE + "Blue " +Colors.NORMAL + "normal"); Blue normal normal
Mandare dei file agli utenti
Tecnicamente, il nostro bot può essere in grado di inviarefile di qualunque genere a uno specifico utente (ovviamente purche’ siano rispettate le norme sulla proprietà intellettuale!). Attraverso il metodo dccSendFile() possiamo fare tutto cquesto: basta specificare il file, il nick dell’utente collegato e il timeout, ovvero il tempo massimo per spedire il file.
File file = new File("c:/stuff/elvis.mp3"); String nick = "Dave"; int timeout = 120000; dccSendFile(file, nick, timeout);
Lista degli utenti
Come ultimo metodo vi mostriamo onUserList. Questo metodo consente di sapere gli utenti collegati ad un determinato canale per poi utilizzare questa informazione come si vuole: per esempio stampare a video I loro nicknames.
public void onUserList(String channel, User[] users) { for (int i = 0; i < users.length; i++) { User user = users[i]; String nick = user.getNick(); System.out.println(nick); } }
Conclusioni
PircBot è senz’altro un buon strumento per chi è alle prime armi con la chat IRC e vuole creare un robot a cui affidare determinati compiti, controlli, giochi, applicazioni varie. Va ricordato che c’è addirittura chi grazie ai robot ha inventato dei veri e propri sistemi di file-sharing alternativi! Uno dei punti di forza di PircBot è che i metodi sono tutti già definiti.
Per chi intende approfondire, il sito ufficiale [5] presenta le diverse API Java e anche una serie di progetti incentrati su PircBot [8] come Comic Bot che genera i discorsi della chat a fumetti, oppure NewsBot, che racconta le notizie delle BBC.
Quindi non mi resta che augurarvi un buon lavoro: magari ritroveremo qualche vostro bot in qualche chat IRC sperduta in Internet!
Riferimenti
[1] Portale su mirc
[2] Il portale italiano su IRC
http://www.tuttoirc.it/irc-cosae.php
[3] La voce “Bot”, su Wikipedia
http://it.wikipedia.org/wiki/Bot
[4] La voce “Irc” su Wikipedia
http://it.wikipedia.org/wiki/IRC
[5] Il sito ufficiale di PircBot
http://www.jibble.org/pircbot.php
[7] La voce “Kick (internet)” su Wikipedia
http://it.wikipedia.org/wiki/Kick_(internet)
[8] Altri progetti basati su PircBot
http://www.jibble.org/javadocs/pircbot/index.html
Yuri Cervoni si è laureato alla facoltà di Ingegneria Informatica dell’Università “La Sapienza” di Roma nel maggio 2009 con la tesi: “Implementazione e realizzazione di un metodo per l’animazione dell’algoritmo di Dijkstra”. Dall’Aprile 2009, prima come stagista e poi come sviluppatore software, lavora nella Società degli Studi di Settore. Nel tempo libero cerca di ampliare le sue conoscenze informatiche partecipando a progetti software presenti su SourceForge.net come “FlaQuizTV” e la documentazione italiana di “Argo UML”.