A simple IRC bot
Common Lisp
Switch branches/tags
Nothing to show
Pull request Compare This branch is 581 commits ahead, 514 commits behind zkat:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.




Sykobot is a next-gen AI, programmed in a next-gen language. It's aimed at being very easily extensible.

Supported Platforms

Sykobot is developed on GNU/Linux. It should, however, work on any Unix-like system with a Common Lisp compiler. It has been tested and confirmed to work on SBCL, Clozure CL, and Allegro CL Express. If you run sykobot on another platform, please let us know.


  • Sheeple
  • html-entities
  • cl-irc
  • cl-pprce
  • bordeaux-threads
  • drakma
  • cl-store
  • cl-json

Installing Dependencies

You need a Common Lisp compiler to run sykobot, along with several dependencies.

Most of the dependencies can be installed with clbuild, available via darcs: darcs get http://common-lisp.net/project/clbuild/clbuild cd clbuild chmod +x clbuild ./clbuild check (this checks for various programs that help clbuild; they are: cvs, svn, wget, and darcs)

You should let clbuild install all dependencies of each system.

./clbuild install html-entities
./clbuild install cl-irc
./clbuild install cl-pprce
./clbuild install bodeaux-threads
./clbuild install cl-store
./clbuild install cl-json

Now we need to download sheeple and sykobot itself -- through git. git clone git://github.com/sykopomp/sykobot.git git clone git://github.com/sykopomp/sheeple.git cd /path/to/clbuild/systems ln -s /path/to/sheeple.asd ln -s /path/to/sykbot.asd


Sykobot is still in development, although it already has quite a few features. Sykopomp's master branch on github has the latest tagged release ( 0.1 Hello Kitty, although you can pull from the devel branch for the Bleeding Edge Experience. We promise, it'll make more than just your edge bleed.


Sykobot has quite a few modules already, including:

  • Search -- A simple google search
  • Facts -- A simple parser extracts "facts" from the flow of chatter.
  • Quotes -- A facility for grabbing quotes that people in the channel say.
  • Kiloseconds -- The current time, in kiloseconds.
  • Memos -- Leave a message for somebody else, to be delivered when they next speak.
  • ELIZA -- a full-fledged simple ELIZA implementation, so you can chat away with your new friend.
  • Karma -- Who's been naughty? Who's been nice? The karma system is weighted.
  • Seen -- That command that's been on minion's TODO list since the dawn of time.
  • Now Playing -- a simple listener that reacts to a "np: " in a funny way.
  • And more...

Using Sykobot

Currently, the best way to get setup using and hacking sykobot is to ask for help at #sykosomatic on freenode. The developers are distributed across timezones and are always glad to help.

Bug Reporting

  • If you think something is a bug, first try to replicate it and get backtraces.
  • Report the bug at irc or at the issue tracker.

Common Lisp's "trace" can also be helpful for catching bugs. If you're not worried about massive amounts of REPL output, evaluate the following immediately after loading the sykobot system:


(trace "SYKOBOT")

On Clozure CL:

(trace (:package sykobot))

Code Example

For coders here is an simple example of an bot command and a listener.

so here is an echo example, the echo command simply returns what the user typed after 'echo'.

First we define the command with "defcommand" , then we specify if the command takes an argument with regex. The text after echo ( or the command ) is stored in the var 'string'. On the second line is the error handling specified when the user doesnt call echo with arguments it will show the syntax message.The last line is the return wich must be a string. (defcommand echo ("(.*)" string) "Syntax: 'echo ' - Echoes back STRING." string)

Now we are going to make an easy listener that reacts on 'np: Metallica - Nothing Else Matters'. First specify that the .lisp file is part of the sykobot package ( first line ). On the second line we specify the listener with 'deflistener' , then with when we check for an certain event, when that event occurs we reply the sender with an message that is randomly taken from the list.

(in-package :sykobot)
(deflistener scan-for-now-playing
	(when (and (> (length *message*) 3)
         		(STRING-equal (subseq *message* 0 3) "np:"))
		(send-reply *bot* *channel* *sender*
            	(random-elt '("Nice song, man!"
                          "You know your classics!")))))