git clone 'https://github.com/devth/yetibot.git'
A chat bot written in Clojure, at your service.
You can think of Yetibot as a communal command line. It excels at:
Features that make Yetibot powerful and great, which is to say fun:
Take a look at the usage examples to see some ~~fun~~ useful things it can do.
Welcome new contributors!
good first issueare good for first time Yetibot contributors
@devthfor help on Slack, GitHub or anywhere else you can find him
Get an invite to the official Yetibot slack at slack.yetibot.com. There's Yetibot running on a Droplet generously provided by DigitalOcean that you can play with in Slack.
To quickly try out Yetibot with minimal config:
Already using Yetibot? Please add yourself to the list of Yetibot users!
Yetibot has been undergoing continuous improvement since its inception. These are the immediate priorities, in addition to any bug fixes. Feedback and contributions are very welcome!
#yetibotchannel or join Yetibot Slack!
There are a few ways to run Yetibot:
See Configuration docs.
For more docs see the User Guide.
All commands are prefixed by
Output from one command can be piped to another, like Unix pipes.
!complete does IE support | xargs echo %s? No, it is sucky. does ie support html5? No, it is sucky. does ie support css3? No, it is sucky. does ie support svg? No, it is sucky. does ie support media queries? No, it is sucky. does ie support ftps? No, it is sucky. does ie support png? No, it is sucky. does ie support canvas? No, it is sucky. does ie support @font-face? No, it is sucky. does ie support webgl? No, it is sucky. does ie support ttf? No, it is sucky.
Backticks provide a lightweight syntax for sub-expressions, but they can't be nested.
!meme grumpy cat: `catfact` / False
For arbitrarily-nested sub-expressions, use
$(expr) syntax, which
disambiguates the open and closing of an expressions.
!meme philos: $(complete how does one $(users | random | letters | random) | random)
!echo `repeat 4 echo i don't always repeat myself but | unwords`…StackOverflowError | meme interesting:
You can build your own aliases at runtime. These are stored in the configured database, so upon restart they are restored.
!alias nogrid = repeat 3 echo `repeat 3 meme grumpy: no | join`
Pipes can be used, but the right-hand side must be quoted in order to treat it as a literal instead of being evaluated according to normal pipe behavior.
!alias i5 = "random | echo http://icons.wunderground.com/webcamramdisk/w/a/wadot/324/current.jpg?t=%s&.jpg"
You can specify placeholder arguments on the right-hand side using
indicate all arguments, or
$n (where n is a 1-based index of which arg).
!alias temp = "weather $s | head 2 | tail" !temp 98104 => 33.6 F (0.9 C), Overcast
IRC: Yetibot can listen on any number of channels. You configure
You can also invite Yetibot to a channel at runtime using the IRC
/invite yetibot #whoa
When you invite Yetibot to a new channel,
config.edn is overwritten, so next
time you restart Yetibot, it will re-join the same channels.
You can also use the
!room command to tell yetibot to join or leave a channel.
!help room room join <room> # join <room> room leave <room> # leave <room> room list # list rooms that yetibot is in room set <key> <value> # configure a setting for the current room room settings # show all chat settings for this room room settings <key> # show the value for a single setting
Slack: bots can't join a channel on their own, they must be invited, so
room configuration doesn't apply. Instead,
/invite @yetibot to any channel
that you're in, and
/kick @yetibot if you want it to leave. NB: you might need
special privileges in order to kick.
Campfire is no longer supported. If you use Campfire, open an issue and we can add it back in!
Other chat platforms: If your chat platform of choice is not supported, open an issue. Adding adapters is quite easy.
If a room has
broadcast set to
true, Tweets will be posted to that room.
By default all rooms have it set to false. To enable:
!room set broadcast true
Yetibot self-documents itself using the docstrings of its various commands. Ask it
!help to get a list of help topics.
!help all shows fully expanded command
list for each topic.
!help | join ,
Use help <topic> for more details, !, <gen>that, alias, ascii, asciichart, attack, buffer, catfact, chat, chuck, classnamer, clj, cls, complete, config, count, curl, ebay, echo, eval, features, gh, giftv, grep, haiku, head, help, history, horse, hs, http, image, info, jargon, jen, join, js, keys, list, log, mail, meme, memethat, mustachefact, number, order, poke, poms, random, raw, react, reload, repeat, rest, reverse, rhyme, scala, scalex, sed, set, sort, source, split, ssh, status, tail, take, tee, twitter, update, uptime, urban, users, vals, weather, wiki, wolfram, wordnik, words, xargs, xkcd, zen
Yetibot has a plugin-based architecture. Its core which all plugins depend on is yetibot.core.
Yetibot will load all commands and observers with namespaces on the classpath matching these regexes.
This lets you build any number of independent plugin projects and combine them via standard Leiningen dependencies.
Curious how the internals of Yetibot works? At a high level:
hooked into the interpreter's
handle-cmdfunction using a
cmd-hookmacro and triggered via regex prefix matching
If the docs or implementation code don't serve you well, please open a pull request and explain why so we can improve the docs. Also feel free to open an issue for feature requests!
Copyright © 2012-2019 Trevor Hartman. Distributed under the Eclipse Public License 1.0, the same as Clojure.
Logo designed by Freeform Design Co.