That really should be a core thing.
Some example bots.