My First Rust Crate!
3 years after my first contact with Rust, I finally published my first crate in the Rust ecosystem :D.
Without any more ceremony, here is
caith, a dice expression parser and roller.
For the record, I came into writing this because I manage to go back playing some RPG. Not
the video game kind, the proper, tabletop one ;) But as I’m a migrant, in order to play
with my friends over there in France, we have to use some kind of audio call software. And
as we all are gamers, we were already using Discord to play video games together.
But to play a tabletop RPG, you need to roll dice. We could use roll20 but as our GM
didn’t need any map, having everyone creating an account just to roll dice felt overkill.
So I manage to install a dice roller bot on our Discord server. It was using
command to trigger but as it was not "verified" by Discord, I kept looking and found
another one with the trustworthy "verified" label on it. It uses
!roll as a trigger and
one of the friend jokingly complained about the
! instead of
/. I was like "Hold my
drink" and here I was, typing
I looked around
crates.io to find a lib to parse dice roll expression and couldn’t find
any that suit my needs, especially "exploding dice":
caith was born! I basically
reimplemented everything Dice Maiden provide, from exploded dice, to
keep/drop high/low result. On top of that, I added Fudge/Fate dice support. The
implementation was a blast thanks to
pest, the parser generator crate. I discovered it
was able to walk the AST while respecting operations’ priorities. Thanks to the crate
rouler for teaching me that!
On top of
caith, I built a Discord bot using the
serenity crate and here
again, it was straightforward. The only caveats was the lack of
async support but it was
work in progress on a branch which I chose to use. Since, the branch has been merged and
an RC has been released :D
The bot’s main job is to gather the dice expression and pass it to
caith. But I added
a few functionalities to ease my gaming session:
/rrto replay the last dice expression of the user
/rdto reroll the first found dice of the last expression (handy in games like Shadows of Esteren)
After that, one could think the bot is pretty complete but I had another itch to satisfy:
aliases. I’m planning to master Feng Shui 2 and in this system, we launch
1d6 - 1d6
but if one of the dice is 6, we reroll it and add to the result (it explodes on 6) and if
it’s a 6 again, we reroll etc… giving us this expression:
1d6ie6 - 1d6ie6 (
indefinite explode) which is quite lengthy to type every time. We can copy paste it, but I
felt that an alias management system would be more efficient :D Giving it some though, the
need of a permission system to manage who is allowed to tamper the aliases should be
created to avoid "jokes" on setting the aliases.
After about twenty hours of cumulative work on it, I consider
complete :D I don’t provide a public instance as I don’t want to overwhelm my small VPS
but instructions to create your own instance is provided.
Oh, if ever you’re wondering what’s about these names, they are Gaelic for "throw" and "dice" :D
Happy dice rolling!