Pass loop=bot.loop to asyncio.gather - we should have been doing this
Process messages with asyncio.async, so that plugins using threaded=False can run multiple at the same time, if they use yield from.
Change formatting for main a bit
Rename bot.threads to bot.handlers to be more accurate
Little bit more documentation of variables on CloudBot. Also, do manual garbage collection after loading plugins rather than before.
Basically rewrite main.py to have almost everything be a coroutine, and use asyncio.run_in_executor() for threaded stuff
Set config indent to 4.
Start trying out new permission system
Add a has_run attribute to Plugin for use in determining test completeness
Change reply format from ({}) to {},
Change ctcp reply to return 'Eliralin'
Update minecraft_status to use unicode checks, and with a new format.
Add 'steal' command.
Replace symbol for factoids.

Changes ?fact to ^fact
Add teamcity plugin
Add more dinner phrases
Create eliralin_utility.py for extras
Add meme plugin

Created by blha303
Change regex_chans default from True to False
Add per-channel command prefixes