Exploring the roots and future of Internet Relay Chat

Bots IRC: de Eggdrop a la era moderna

Mi primer bot IRC lo escribi en 1999. Era un script de Eggdrop en Tcl que saludaba a la gente cuando entraba al canal y baneaba automaticamente a cualquiera que pusiera mas de cinco lineas seguidas. Funcionaba. Mas o menos. Se caia cada tres dias porque tenia un memory leak que nunca encontre. Pero cumplia su funcion, y eso es mas de lo que puedo decir de muchos sistemas que he administrado profesionalmente.

Los primeros bots: antes de Eggdrop

El primer bot IRC del que hay registro es GM (Game Manager), escrito por Greg Lindahl en 1989. Corria en el canal #twilight_zone y ejecutaba un juego llamado Hunt the Wumpus. No hacia nada util desde el punto de vista de la administracion de canales — era puro entretenimiento. Pero demostro algo importante: un programa podia conectarse a IRC y actuar como si fuera un usuario.

Eso parece obvio ahora, pero en 1989 era una idea nueva. El protocolo IRC no distingue entre un cliente humano y un programa automatizado. Ambos envian y reciben las mismas lineas de texto. Un bot es simplemente un programa que parsea esas lineas y responde segun su logica. No necesita una API especial, no necesita permisos extra, no necesita nada que un usuario normal no tenga.

Los primeros bots utiles aparecieron entre 1990 y 1992. Bots de proteccion de canal que baneaban flooders. Bots que mantenian el topic. Bots que registraban logs. En EFnet, donde no habia servicios de registro de canales, los bots eran la unica forma de mantener control sobre un canal. Si tu bot se desconectaba durante un netsplit, podias perder tu canal. Asi de simple.

Eggdrop: el bot que definio una era

Eggdrop aparecio en 1993, escrito por Robey Pointer. Era — y sigue siendo — un bot IRC escrito en C con un sistema de scripting en Tcl. Lo que lo hizo diferente de todo lo anterior fue su arquitectura: era modular, extensible, y absurdamente estable. Un Eggdrop bien configurado podia correr durante meses sin reiniciarse.

La clave era el sistema de scripts Tcl. En vez de modificar el codigo fuente en C para cambiar el comportamiento del bot, escribias scripts en Tcl que se cargaban al iniciar. Esto significaba que un administrador de canal sin conocimientos de C podia personalizar su bot. Y la gente lo hizo. Para mediados de los 90, habia miles de scripts de Eggdrop disponibles: juegos de trivia, estadisticas de canal, sistemas de puntos, proteccion anti-flood, integracion con bases de datos.

Eggdrop tambien introdujo el concepto de botnet: multiples instancias de Eggdrop conectadas entre si, compartiendo listas de usuarios y bans. Si tenias canales en varias redes IRC, podias tener un Eggdrop en cada una y sincronizarlos. Esto era especialmente util para la proteccion de canales — si un abuser era baneado en un canal, el ban se propagaba a todos los canales de la botnet.

Consejo: Si quieres experimentar con Eggdrop en 2025, sigue siendo viable. La version 1.9.x soporta TLS, IPv6 y las extensiones modernas de IRC. La documentacion esta en docs.eggheads.org y es sorprendentemente buena para un proyecto de mas de 30 anos.

Tcl scripting: la magia detras

Tcl (Tool Command Language) es un lenguaje que casi nadie usa fuera de Eggdrop y algunos entornos de automatizacion industrial. Pero para scripting de bots IRC, funciona sorprendentemente bien. Es interpretado, tiene manejo nativo de strings, y su sintaxis — una vez que la entiendes — es concisa.

# Script basico de Eggdrop en Tcl: saludar al entrar
bind join - * saludo_entrada

proc saludo_entrada {nick uhost handle chan} {
  if {$nick != $::botnick} {
    putserv "PRIVMSG $chan :Bienvenido $nick. Lee las reglas con !reglas"
  }
}

# Anti-flood: kick despues de 5 lineas en 10 segundos
bind pubm - * check_flood
set flood_count [dict create]

proc check_flood {nick uhost handle chan text} {
  global flood_count
  set key "$nick,$chan"
  set now [clock seconds]
  if {![dict exists $flood_count $key]} {
    dict set flood_count $key [list 1 $now]
  } else {
    lassign [dict get $flood_count $key] count first
    if {$now - $first < 10} {
      incr count
      if {$count >= 5} {
        putserv "KICK $chan $nick :Flood detectado"
        dict unset flood_count $key
        return
      }
      dict set flood_count $key [list $count $first]
    } else {
      dict set flood_count $key [list 1 $now]
    }
  }
}

El binding system de Eggdrop es lo que lo hace tan flexible. Con bind asocias un evento IRC (join, part, pubm para mensajes publicos, msg para privados, ctcp, etc.) a un procedimiento Tcl. Puedes tener decenas de bindings activos simultaneamente sin conflictos. Cada uno escucha su evento y ejecuta su logica.

Lo que no es tan bueno: Tcl no tiene un ecosistema moderno de paquetes. No hay equivalente a pip o npm. Si necesitas hacer una peticion HTTP desde un script de Eggdrop, tienes que usar el paquete http de Tcl o escribir tu propio wrapper. Para tareas simples esto funciona. Para integraciones complejas (APIs REST, webhooks, bases de datos), empiezas a pelear contra las limitaciones del lenguaje.

Bots de guerra: proteccion y ataque

Hay un capitulo de la historia de los bots IRC que a nadie le gusta contar pero que definio la cultura de las redes en los 90 y 2000: los bots de guerra. En redes sin servicios como EFnet, el control de un canal dependia enteramente de quien tenia bots con op. Si podias desconectar los bots del oponente — via DDoS, exploit del IRCd, o simplemente aprovechando un netsplit — podias tomar el canal.

Surgieron botnets enteras dedicadas a la guerra de canales. No hablo de botnets de malware (aunque hubo superposicion). Hablo de redes de Eggdrops coordinados, a veces docenas de instancias corriendo en shells comprometidos o en cuentas de hosting baratas, todos programados para entrar a un canal simultaneamente, pedir op a los bots aliados, y flood-kickear a los rivales.

Las tacticas eran ingeniosas y deprimentes a partes iguales. Collide bots que explotaban colisiones de nick durante netsplits. Clone bots que inundaban canales con cientos de conexiones fantasma. Takeover bots que esperaban pacientemente a que un canal quedara sin ops para tomar el control. Todo esto por el control de canales como #warez o #mp3 donde se compartian archivos.

Esta historia es relevante porque explico por que redes como Undernet y DALnet crearon servicios de registro. No fue por filosofia — fue por necesidad practica. Sin ChanServ, la unica forma de proteger un canal era tener bots mas resistentes que tus atacantes. Y esa carrera armamentista no la ganaba nadie.

Atencion: Los bots de guerra y las botnets de canal son historia. Usarlos hoy te conseguira un k-line permanente en cualquier red seria. Si necesitas proteger un canal, usa los servicios de la red (ChanServ) y configura bien los modos.

De bots a servicios: NickServ, ChanServ

Los servicios IRC (NickServ, ChanServ, MemoServ, OperServ) son, tecnicamente, bots. Son programas que se conectan a la red IRC y responden a comandos de los usuarios. La diferencia es que se conectan como pseudo-servidores, no como clientes normales, lo que les da privilegios especiales: pueden cambiar modos sin restricciones, no estan sujetos a limites de flood, y persisten entre reinicios del IRCd.

Anope es el paquete de servicios mas popular hoy. Soporta UnrealIRCd, InspIRCd, y otros IRCds. Proporciona NickServ (registro de nicks), ChanServ (registro y proteccion de canales), MemoServ (mensajes offline), BotServ (bots de canal gestionados), y HostServ (vhosts personalizados).

La evolucion de "bots de proteccion" a "servicios de red" fue gradual. DALnet fue pionero en los 90. Undernet desarrollo CService como una aplicacion web donde los usuarios podian registrar canales y gestionar accesos. Para los 2000, no tener servicios era considerado inaceptable para cualquier red seria. Solo EFnet siguio resistiendose, y pago el precio en forma de guerras de canales interminables.

Bots modernos: Python, Go, Node

Eggdrop sigue activo, pero los bots nuevos se escriben en lenguajes modernos. Los frameworks mas usados en 2025:

  • Sopel (Python): Sucesor de Willie y Jenni. Modular, facil de extender, buena documentacion. Ideal para bots de utilidad y automatizacion. Soporta IRCv3.
  • Limnoria (Python): Fork de Supybot. Mas orientado a plugins. Tiene un ecosistema enorme de plugins disponibles. Estable pero el codigo es viejo.
  • Ergo (Go): No es un bot sino un IRCd, pero su arquitectura de plugins permite funcionalidades tipo bot integradas en el servidor.
  • irc (Node.js): Libreria basica para Node. No es un framework de bot completo, pero permite escribir bots rapidos si ya conoces JavaScript.

La ventaja de Python sobre Tcl para bots modernos es obvia: acceso a todo el ecosistema de paquetes. Necesitas consultar una API? requests. Parsear JSON? json (incluido en stdlib). Base de datos? sqlite3. Machine learning? Bueno, no creo que tu bot de IRC necesite machine learning, pero podria.

# Bot IRC minimo en Python (sin framework)
import socket

def irc_bot():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('irc.libera.chat', 6667))
    sock.send(b'NICK mibot\r\n')
    sock.send(b'USER mibot 0 * :Mi Bot IRC\r\n')
    
    while True:
        data = sock.recv(4096).decode('utf-8', errors='replace')
        for line in data.split('\r\n'):
            if line.startswith('PING'):
                sock.send(f'PONG {line.split()[1]}\r\n'.encode())
            if '001' in line:  # Welcome message
                sock.send(b'JOIN #test\r\n')
            if 'PRIVMSG' in line and '!hola' in line:
                chan = line.split('PRIVMSG ')[1].split(' :')[0]
                sock.send(f'PRIVMSG {chan} :Hola!\r\n'.encode())

irc_bot()

Crear tu propio bot en 2025

Si quieres crear un bot IRC hoy, mis recomendaciones son:

Para algo rapido y funcional: usa Sopel. Lo instalas con pip install sopel, lo configuras con sopel --wizard, y en cinco minutos tienes un bot conectado con docenas de modulos disponibles. Si necesitas funcionalidad personalizada, escribes un plugin en Python.

Para aprender como funciona el protocolo: escribe tu bot desde cero con sockets. No uses frameworks. Conecta a un servidor de prueba, parsea las lineas IRC manualmente, implementa PING/PONG, JOIN, PRIVMSG. Vas a aprender mas sobre IRC en una tarde haciendo esto que leyendo documentacion durante una semana.

Para produccion seria: considera Limnoria si necesitas muchos plugins, o escribe tu propia solucion en Python/Go si las necesidades son especificas. Asegurate de implementar reconnect automatico, rate limiting (no envies mas de un mensaje por segundo o el servidor te desconecta por flood), y logging robusto.

Y una cosa mas: registra el nick de tu bot con NickServ y configuralo para autenticarse automaticamente via SASL. Un bot sin nick registrado en una red moderna es un bot que va a tener problemas.

Preguntas frecuentes

Eggdrop sigue funcionando en 2025?

Si. La version 1.9.x esta activamente mantenida, soporta TLS, IPv6, y funcionalidades modernas. Es mas viejo que muchos de sus usuarios, pero sigue siendo solido para proteccion de canales y tareas de administracion.

Que lenguaje es mejor para un bot IRC?

Python, por su ecosistema de paquetes y facilidad de desarrollo. Si necesitas rendimiento extremo (cosa rara para un bot IRC), Go es buena opcion. Tcl solo si ya tienes experiencia con Eggdrop. Node.js funciona pero no tiene frameworks de bot IRC maduros comparados con Python.

Los bots necesitan permisos especiales?

No. Un bot se conecta como cualquier usuario normal. Si necesita op en un canal, otro operador o ChanServ se lo da. La unica diferencia es que los bots suelen autenticarse automaticamente con NickServ via SASL al conectar.

Puedo usar un bot IRC para integrar con GitHub?

Si. Hay webhooks de GitHub que envian notificaciones HTTP. Tu bot puede escuchar esas notificaciones y publicar los eventos en un canal IRC. Sopel tiene un plugin de GitHub listo para usar. Si prefieres hacerlo manual, es un servidor HTTP basico que traduce JSON de GitHub a mensajes PRIVMSG.