Depends on what you need.
If the bot has to do audio stuff or if it has to be visible like a client to other users, you need to run a client with a fake desktop environment (maybe inside a container) like SinusBot does.
If that is not the case, you can just run the bot as a ServerQuery bot using ssh / telnet / http(s), with which you can still do pretty much everything else. Even if it is events you need, the query provides that. And the only features I can think of right now that the client provides that the query doesn’t, are audio capabilities and that you can just see them like a regular client.
Also, if you don’t want to create your own client-like bot, just make a sinus bot plugin. No idea how that works, but the possibility is there.