A Perl based IRC bot built on AnyEvent::IRC
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.



winobot is an Perl based IRC bot built on AnyEvent::IRC and Moose. The name "winobot" comes from Wonder Showzen a short lived TV show on MTV2. Watch the skit.


  • Likes to party
  • Built on AnyEvent
  • Configuration file driven (built on Thorium)
  • MongoDB is the backing store for Features
  • Markov Chain's via Hailo (must load feature)
  • Automatic condensing of URL's with TinyURL (must load feature)
  • Twitter feed monitoring from Stream API (must load feature and requires API keys)
  • Supports encrypted rooms via Algorithm::IRCSRP2 (must load feature)
  • Utility features such as Date, Echo, Help, LoadUnload, Uptime, etc (must load features)


  • Missing documentation for configuration and feature use
  • CPAN dependency heavy
  • Lots on the TODO list
  • No runtime configuration altering / reloading
  • No runtime admin interface
  • Logging must be turned on, see Thorium::Log (there should be a command line option for this)
  • No initial data is loaded into database (insult, praises, etc)



Perl 5.14+

Use perlbrew to make this hassle free.

CPAN Modules For core

Use cpanm to make this hassle free.

  • AnyEvent
  • AnyEvent::HTTP
  • AnyEvent::IRC
  • AnyEvent::Worker
  • Class::MOP
  • Class::Unload
  • Dir::Self
  • Find::Lib
  • Hailo
  • List::MoreUtils
  • Math::Random::Secure
  • MongoDB
  • Moose
  • Regexp::Common
  • Sub::Exporter
  • Text::ASCIITable::Wrap
  • Thorium
  • Try::Tiny
  • autovivification
  • indirect

CPAN Modules For Features

  • Algorithm::IRCSRP2
  • AnyEvent::HTTP
  • AnyEvent::Twitter
  • AnyEvent::Twitter::Stream
  • Array::Diff
  • DateTime
  • Email::Send
  • Email::Simple
  • HTML::Extract
  • Hailo
  • JSON::XS
  • Math::Random::ISAAC::XS
  • Math::Random::Secure
  • Memory::Usage
  • Net::FTP
  • Net::OAuth
  • Net::SSLeay
  • Regexp::Common
  • Roman::Unicode
  • Text::ASCIITable::Wrap
  • Time::Duration
  • Try::Tiny
  • XML::LibXML


Any reasonably recent version will do.

Checkout / Install / Run

$ cpanm <huge-list-of-dependencies>
$ git clone git://github.com/aflott/winobot.git
$ cd winobot
$ # create a preset in conf/presets
$ ./configure --load the-preset-name-you-chose-minus-the-dot-yaml-ext
$ ./winobot.pl



  1. turn $id into a proper object
  2. access control / admin interface
  3. make $state->conf a role in Winobot::State, then eliminate use of get_feature_option
  4. load <name> produces pass when module was not loaded
  5. reconnect ability
  6. add $state->db role
  7. use AnyEvent version of MongoDB
  8. add unix signals with anyevent
  9. make features reloadable per channel? futzing with namespaces might do it?
  10. restore handler functionality for channel-less events (disconnect, connect, etc)
  11. add time zone to defaults.yaml instead of winobot.pl



  1. automatic srp'ing on reconnect
  2. handle multiple channels, servers


  1. when no files are processed, dont output "No config files processed!" when local.yaml was actually generated. maybe change to "No template files processed!"?
  2. don't use Proc::ProcessTable


  1. compile fixes for OSX