Releases: Kile/Killua
v1.4.2
Main changes
Top.gg better integration
Changes from v0 to v1 of the top.gg API and implemented announcements being posted on their new endpoint when an announcement is posted on the website.
Auto defer every slash command
All slash commands (except for those that send modals) are now deferring the request by default, since many would not manage to respond within 3 seconds after the bot was running for a bit.
Upgrade from Python 3.9 -> Python 3.13
Python 3.9 is starting to be unsupported by some libraries and is generally quite outdated now. Changed everything to work with Python 3.13 and changed all type hints to use inbuilt classes/symbols instead of ones imported from typing (List[] -> list[], Union[str, int] -> str | int)
Testing finally complete
This release includes a pretty much fully built testing system which has been on the roadmap for many years now. AI helped write this and it ended up with 10k+ lines of tests so I couldn't have done it myself for many more years.
These tests found the following bugs which are now fixed in the release:
Bugs fixed with automated tests
generate_users wrong member count: Usedlen(user)(loop variable) instead oflen(users)when truncating long embed titles. The “and X more” suffix was wrong whenever many users with long names were targeted. Found via flakymultiple_members_correctly_suppliedtests._permission_checktypo:self.Member.display_name→member.display_name. Would raise AttributeError on channel-permission failures during spell attacks._use_convertermissing Member branch: Slash/hybrid invocations passing an already-resolved discord.Member were mishandled.
add_args=0 rejected, if add_args and add_args < 1 treated 0 as “not provided”. Fixed to if add_args is not None and int(add_args) < 1.- Card1036 await precedence:
await bot.command_prefix(...)[2]parsed incorrectly in an f-string; fixed to(await ...)[2]. - Missing
awaitonset_property: Four call sites (remove, assign add/remove, reorder) never persisted todo changes; only emitted RuntimeWarning: coroutine was never awaited. - Missing await on
kick_editor/kick_viewer: Permission revokes in remove and assign did not actually run. Member.newwrong guild tag shape: Assumed Guild.tags was {"tags": [...]}; it is a plain list. Broketags userentirely.Member.newno owner filter: Returned every guild tag instead of tags owned by the user.- tags edit broken update call:
await tag.update(content)→await tag.update("content", content)(missing key argument). - Call to non-existent method: Unknown group fallback called
_handle_command_help(does not exist) instead of_help_command_argument. Would NameError at runtime. asyncio.waiton bare coroutines: [v.wait() for _, v in data] passed coroutines instead of tasks. Fixed with asyncio.create_task(v.wait()). Broke DM multiplayer wait logic for RPS/trivia. (Python 3.13 quirk)- Wrong insufficient-funds message for todo spots: Error text used
todo_list['spots'] * 100(invalid accessor + double the real price). Actual cost istodo_list.spots * 100 * 0.5.
API cog (killua/cogs/api.py) - NewsMessage.from_id missing return: Called
cls.from_data(...)without return, so callers always gotNone. - ZMQ listener started too early:
create_task(self.start())in__init__before the bot loop was ready; moved tocog_load. - Prometheus metric KeyError: guild_command_usage assumed "group" always exists; now uses .get("group", ""). (This broke statistics when the help command was used since it does not have a parent)
- News URL: beta.killua.dev → killua.dev (stale domain).
- Top.gg stats posted before ready: Guild count was posted in cog_load; moved to first on_ready with _initial_stats_posted guard.
- Top.gg API v1 migration: Replaced raw v0 Bearer calls with killua/utils/topgg.py helpers (v1 token format, shard count, announcements on news publish).
- Broken duplicate cog loading: Old code reset all_cogs = [] inside a loop and double-loaded modules via deprecated load_module / find_module. Simplified to a single
mportlib.import_modulepass. (Python 3.13 quirk)
Full Changelog: v1.4.1...v1.4.2
v.1.4.1
Backend to support big website update
Implement endpoints specifically for new website features including the new "servers" page. See more in the website release.
Important changes specific to the API are:
- Auth tokens from Discord are now cached so Discord does need to be requested for auth several times per request. With this comes a new logout endpoint to invalidate that cache
- Fixed a major issue with the proxy service where timed out responses would clog up the service and lead to tons of failed API requests from the website
Attempted yet again to prevent Loki from leading to a full storage by limiting the services logs are saved from.
(This was initially meant as a 1.5.0 release but due to basically no changes for the actual bot itself and already one major release dedicated to the website, it ended up as 1.4.1 instead)
Full Changelog: v1.4.0...v1.4.1
v1.4.0
v1.4.0 - The Website Update
This is the stable release of supporting the backend for the website rewrite. These release notes only cover changes since the beta, releases notes for which can be found here
Bot side
- Removed
publish_updatecommand as this is now handled by the website - Rework of the design of embeds retrieved by
k!update - Hug images are now uploaded as an attachment when used with user installed commands instead of the link being used. This is a workaround to a Discord issue that randomly does not display them in dms.
- User gets a dm and 1000 Jenny if they log into the website
API/website side
- Add endpoints to retrieve user stats with a valid Discord OAuth token
- Add endpoints to edit user data with valid Discord OAuth token
- Add endpoints to manage updates as well as adding two new types, posts and news
- Attempt to support Discord's integration web hooks but failed
- Implement a cdn network to upload, edit, download and list images.
- Allow certain can paths to be accessed without token
- lay groundwork for email notifications
- Add tests for all these new endpoints
- The update button has been moved from Grafana where it did not work due to CORS issues to the admin panel where it does work (hurray)
Full Changelog: v1.3.0...v1.4.0
v1.4.0beta
Start implementing more functionality for the website
v1.4.0 Beta
This release includes mainly additions to the API and the corresponding zmq backend for Killua.
🛠️ Changes
API
- Stopped returning a ton of data: The
/diagnosticsendpoint now returns request counts by default instead of full datetime lists for better performance - New query parameter support: Added
?full=trueparameter to/diagnosticsto optionally return the complete datetime list when needed - Backward compatibility: Full datetime format is preserved when
?full=trueis used, maintaining compatibility with existing integrations
Bot
- First-time user rewards: New users now receive a free golden lootbox and 1000 Jenny when they first access the website
📦 Additions
API
- Added new endpoint /userinfo which gets info about a user including db data and data from the Discord object fetched by the bot for the website
- Added Discord Oauth verification validation for this endpoint
- Added tests for this endpoint
- Added comprehensive test coverage for the new diagnostics endpoint functionality
- Added tests for both default and full parameter modes
- Added validation tests to ensure request counts match array lengths
- Added error handling tests for invalid parameters
Bot
- Added automatic reward distribution system for new website users
Full Changelog: v1.3.0...v1.4.0beta
v1.3.0
This release includes quality of life improvements with action commands along with a "<action> back" button on all actions which allows users targeted by an action to return it to the author. This button respects disabled actions, that users send messages permissions and Discord limitations (it won't work in dms :c).
It also introduces large updates to the infrastructure where logs are now collected to be displayed in the admin dashboard to avoid having to log into the server and to be able to check out errors on the go.
🐛 Bug fixes
Features
- Fixed a bug that would make
boxinfoandboosterinfoerror due to harder rather than dynamic value when determining the image url
Code
- Fixed spelling mistake in db key and added migration script to fix it retroactively
- Got the db migration up to date
- Corrected numerous spelling mistakes in comments and docstrings
🛠️ Changes
Features
- Added "<action> back" button on action embeds which allows to do the action back at the person who used it on you. It uses the compression algorithm to make sure only users targeted can use this button
Code
- The way zmq proxy was changed to now use the first bit as a direction indicator of which port to forward a message to. It also no longer forwards messages blindly but waits on the response of one forwarded message before looking at the next one.
- Switched from Motor to async pymongo as recommended by MongoDB
- Some internal cleanups
- Changed the diagram in the README to reflect the new architecture
- Versions were bumped in the api dependencies and migrations were made for breaking changes arising from it
📦 Additions
Features
- Added more hug images
Code
- Added Alloy and Loki to monitor logs from all containers and added views to see them in the dashboard
- Added endpoint in API + new zmq connection + Rust script to allow pulling and restarting from the Grafana dashboard
- Added appropriate documentation about this script in the README
- Added metrics for total collected cards and most cards collected to display in dashboard
- Now displaying user installed and approximate total users in dashboard
- Killua now saves when a user uses a command that was user installed to register that they installed this bot as this data is not provided by Discord
- Killua now saves when the bot was added to a server to the db. This will be retroactively applied with a migration script.
Full Changelog: v1.2.2...v1.3.0
v1.2.2
🐛 Bug fixes
- The "this artwork has been specifically created for this bot" info would not show up when it should
- An attempt has been made to get the top.gg guild count up to date again
Voting reminders also broke at a certain point as they tend to do when the bot runs for a long time without interruption. This new release and corresponding restart fixed this for now.
🛠️ Changes
The API Killua for action images like pat, smile, slap etc has been changed to nekos.best. This has been done mainly in a continued effort to use credit to any resources and art that Killua uses and this API provides credit with all their images and GIFs. The API did not have the same endpoints 1:1 so the following changes were made for action commands:
Endpoints/commands removed
- tail
(there was no equivalent endpoint)
- neko
(this command felt misaligned with the goals of Killua and has been removed)Endpoints/commands added
+ nope
+ yawn
+ smug
+ cryFull Changelog: v1.2.1...v1.2.2
v1.2.1
I realised I should make smaller releases when I change some small things rather than only doing major version bumps
🐛 Bug Fixes
- Fixed a bug where it would not cache the guild data
- Fixed a bug that would lead to
boosterinfoerroring if it was used before - Fixed a bug that allowed long user input to break 8ball's output
- A previously uncaught error is now caught
🛠️ Changes
- Reworded the
READMEto clarify some things
📦 Additions:
- Exclusive specifically commissioned for Killua hug image!
- Added a note on all hug art created specifically for Killua stating this
- Added a few more hug images and found credit for one uncredited one
Full Changelog: v.1.2.0...v1.2.1
v1.2.0
This was meant to be a commit to main adding a few hug images 😭. Instead this served as great procrastination to my coursework and I was able to fix a bunch of bugs, made a ton of quality of life improvements and made running the bot for contributors much easier!
🛠️ Changes
- All images Killua sends now come with a token. When that token expires, the image will not be displayed anymore (Similarly to a system Discord implemented somewhat recently). Without such a token, no image will be shown you access. This has been done to prevent someone using the Killua hugs API for their own bot without credit to me or the artists as well as to hide some game features. If you would like to read more about it, check out
algorithms/image-cdn.mdwhere I go more in depth. This should change very little on the user side. - The resolution of
k!bookhas been DOUBLED. This should have been done much sooner and now makes it much easier to read card numbers. unbangot a much needed update since it still relied on old usernames with discriminators to unban someone who were not on the server. Now a normal username will work.- In a good amount of places where
usernameswere shown, instead display names are now shown. - Card data is now stored differently. This makes it easier for other contributors to not have to come up with it themselves and should make anything card related much faster!
- A lot of versions have been bumped in libraries Killua uses, so generally performance should be better
- Cards and hugs images are not public in the source code anymore
- Killua's presence is only updated every Xth time he is removed or added from a server to prevent rate limits
🐛 Bug fixes
swill now work as an alias tospinwhere it did not before cause I misspelledalias😭- Deleting a todo list would not work (oops)
- Toggling vote reminders would work but then wrongly assume you had it the other way
- Command responses being blocked by auto mod is now handled
- Some spelling mistakes in cards and around the bot have been fixed
Other bugfixes since the last release: - Actions would just not work for a while (oops)
- Being unable to create a todo list was fixed
- Being unable to
giveloot boxes was fixed
📦 New features::
- Added 46 new hug images while reducing the number of uncredited artwork from 12 to 10 (which included the new images) thanks to https://saucenao.com/index.php
- Increased the resolution of a lot of exiting hug images
- Added new topics, hug, slap, cuddle and poke texts
User InstallsandApproximate Usersare now part ofstats growth. Approximate users is an approximate number of the number of people in all servers Killua is in, user installs is number of people installing Killua to their profile.
As always, internals have been improved significantly since the last release.
New Contributors
- @daniithethomp made their first contribution in #629
Full Changelog: v1.1.0...v.1.2.0
v1.1.0
Killua 1.1.0 (API rewrite to rust, sync -> async, dockerising)
Besides this being super cool, it also fixes a long, LONG issue with the API which would cause vote rewards to not function and the website to not display server count or commands. You can read the details about it in the associated issue #607
This PR, does a bunch of things. It fixes three long standing issues:
- The shop would stop updating after a while for seemingly no reason at random
- The API would stop responding after a day or two of being live without errors
- Sometimes the database times out. This caused the entire bot to be blocked for a bit before.
Here is a graphic to illustrate this:
🛠️ Beyond this, it improves internals a lot. Mainly:
- The API is now written in Rust. This allows it to be insanely type safe for requests needing to match expected format and type. It is also of course much faster (It's rust after all).
- The bot and all associated processes are now Dockerised. This means they are now insanely easy to deploy and migrate.
- A lot of statics are now saved to prometheus. This then allows them to be displayed very nicely on a Grafana dashboard.
- Most of the assets Killua uses (hugs, cards, loot boxes etc) are now served through the API instead of the Discord cdn
- A proxy for zmq is now implemented between the bot and API. This allows A many to many communication between n bot processes and n API processes. This is not needed currently but already future proofs the code should the bot need multithreading.
- A GitHub workflow has been set up to automatically run cargo test, clippy and fmt on pull requests that change API code.
- A bunch of code has been cleaned up to be more readable including the
on_interactionpart of wyr and polls as well as classes. - All database actions now occur asynchronously instead of synchronously. So when one of them fails/times out the entire bot is not blocked. I should have used this from the start, it was painful to rewrite now. This looks something like this:
- user = User(user.id)
+ user = await User.new(user.id)
- user.add_jenny(10)
+ await user.add_jenny(10)🐛 Bug fixes
- Voting will now always give you a reward
- Some slash command autocomplete would not work
- The shop sometimes failed to update
- Owning card 99 would not be displayed in your book in the restricted slots
- todo create did not work if no custom ID was provided
📦 The following features have been added:
- All image commands can now be applied to an image by replying to the message with the image with the command
- The shop now says when it will update the next time
- Image commands now also accept replied to messages as an argument. If you want to use a command on a specific image that is not the latest in chat, reply to it with the command.
- If there is a tie playing trivia (both players get the right answer) the fastest answer is now the tiebreaker.
User installed commands
User installed commands got a big upgrade this version! The following are now available as user installed commands:
- wyr
- topic
- calc
- 8ball
- img
- All games commands
- All action commands
Unlike last time where I just enabled them to be user installable, a lot of thought has now been put into them to make sure they work as expected ANYWHERE on Discord. You can now hug or play rps with a friend in dms! A fight breaks out in a group chat about a question? Just use 8ball to answer it!
Full Changelog: v0.12.2...v1.1.0
v1.0.6 alpha
📦 Additions
- Two new hugs :)
- A bunch of new topics!
- Trivia now offers a "Play Again" option solo and against other people. This makes it much easier to keep competing with your friends instead of having to retype all options again
- Added a proper shop inside Discord! You can buy loot boxes or a sub there. This is kinda untested but better than not implemented at all.
- Added a shell script to clean the environment up between bot restarts
- The cooldown response now gives you a discord timestamp for the cooldown and not just an integer
And a big one...
KILLUA NOW SUPPORTS USER INSTALLATION
This means you can decide to "install" Killua to your account. After doing this you will be able to use some of his command ANYWHERE (dms, servers he is not on, group chats). This includes context menus! Don't understand a word? Right click a message > Apps > "Google"! A language you don't understand? Right click > Apps > "translate"! Game and todo slash commands now also work anywhere. This is a super exciting feature and I am looking forward to people using it!!!
🔧 Changes
- The shop changes are no longer logged
- Made
k!helpmuch smarter. Doingk!help command/groupnow works much better where it did not at all before. - Internally some things have been cleaned up
🐛 Bug fixes
- The hug badge had an issue of not being added
- DuckDuckGo blocked us from image search... so I had to switch to Bing image searching
- Over the past 6-8 months I have had issues with Killua API going down after just a day. This led the website and vote rewards to not work. I tried a lot of things to fix this. I have finally implemented what I believe to be a fix for this.
- A number of bugs all around
- Switched most images to imgur because permanent Discord cdns became unsupported.
- The games leaderboard were only half sorted. This is fixed now.
- The cooldown command failed to load the image because somehow the IP is banned from imgur (why are we banned from everything) so it is now set as an embed picture so Discord is the server requesting imgur.
These changes have been implemented over the past 6 months but since user installation support was added I felt like it warranted a release
Full Changelog: v1.0.5alpha...v1.0.6alpha

