Lately in Raku
Raku — Published on .
I’ve been working on some Raku projects, but each of them is just too small to make an individual blog post about. So, I decided to just pack them together in a slightly larger blog post instead.
Binary Rakudo Star builds for GNU+Linux and FreeBSD
A friend on IRC asked if it was possible to get Rakudo Star precompiled for ARM, since compiling it on his machine took forever. I took a look around for potential build services, and settled for Sourcehut.
I added build instructions for amd64 FreeBSD, GNU+Linux, musl+Linux, and ARM GNU+Linux. Tarballs with precompiled binaries get build whenever I push to the Rakudo Star mirror on Sourcehut, and are uploaded to dist.tyil.nl/tmp. Currently, these are not considered to be an official part of Rakudo Star, but if interest increases and more people can test these packages, I can include them in official releases.
IRC::Client
plugins
IRC bots are great fun, and the
IRC::Client
module allows for easy extension through plugins. For my own IRC bot,
musashi, I’ve created two new
plugins, which are now available in the Raku ecosystem for anyone to use.
IRC::Client::Plugin::Dicerolls
The first plugin I’ve created can do dice rolls, D&D style. You can roll any number of dice, with any number of sides, and add (or subtract) bonusses from these.
<@tyil> .roll 1d20
<+musashi> 1d20 = 1
<@tyil> .roll 5d20
<+musashi> 5d20 = 3 + 19 + 8 + 6 + 11 = 47
<@tyil> .roll 1d8+2d6+10
<+musashi> 1d8+2d6+10 = 4 + 6 + 4 + 10 = 24
Since this is ripe for abuse, the plugin allows to set limits, and sets some defaults for the limits as well. This should help prevent your bot from getting killed for spam.
IRC::Client::Plugin::Reminders
Everyone forgets things, and there’s various tools helping people remember
things in various situations. For IRC based situations, I created a reminder
plugin for IRC::Client
.
10:19 <@tyil> musashi: remind me to write a blog post in 10 minutes
10:19 <+musashi> Reminding you to write a blog post on 2020-06-21T08:29:00Z (UTC)
10:29 <+musashi> tyil: Reminder to write a blog post
It’s not very sophisticated yet, working only with numbers and certain identifiers (minutes, hours, days, weeks), but I may add more useful identifiers later on such as “tomorrow”, or “next Sunday”. Contributions for such extended functionality are obviously also very welcome!
There’s a small
issue
with logging in a start
block. It seems the dynamic variable $*LOG
is no
longer defined within it. If anyone has an idea why, and how I could fix this,
please let me know!
Template program for D&D
Another little utility I made for D&D purposes. My DM asked me how hard it’d be
to create a program to fill out a number of templates he made, so he could use
them in the game with another party. He was able to hand me a list of variables
in the form of a CSV, so I set out to use that. With some help from Text::CSV
and Template::Mustache
, I had a working solution in a couple minutes, with
all the required things nicely fit into a single file.
I had not used $=pod
before in Raku, and I’m quite happy with how easy it is
to use, though I would like a cleaner way to refer to a Pod block by name.
#!/usr/bin/env raku
use v6.d;
use Template::Mustache;
use Text::CSV;
#| Read a CSV input file to render contracts with.
sub MAIN () {
# Set the directory to write the contracts to.
my $output-dir = $*PROGRAM.parent(2).add('out');
# Make sure the output directory exists
$output-dir.mkdir;
# Load the template
my $template = $=pod
.grep({ $_.^can('name') && $_.name eq 'template' })
.first
.contents
.map(*.contents)
.join("\n\n")
;
# Parse STDIN as CSV
my @records = Text::CSV
.new
.getline_all($*IN)
.skip
;
# Create a contract out of each record
for @records -> @record {
$output-dir.add("contract-{@record[0]}.txt").spurt(
Template::Mustache.render($template, {
contractor => @record[2],
date => @record[1],
description => @record[6],
item => @record[3],
location => @record[5],
price => @record[4]
}) ~ "\n"
);
}
}
=begin template
As per our verbal agreement this contract will detail the rewards, rights, and
obligations of both parties involved.
The contractor, to be known henceforth as {{ contractor }}.
The contractee, to be known henceforth as the Association.
{{ contractor }} requests the delivery of an object identified as the "{{ item }}"
to be delivered by the Association at the location specified for the agreed
upon compensation. The Association shall deliver the object within two weeks of
the signing of this contract and receive compensation upon delivery.
The location is to be known as "{{ location }}", described as "{{ description }}".
The compensation agreed upon is {{ price }} pieces of Hondia standard
gold-coin currency, or an equivalent in precious gemstones.
Written and signed on the {{ date }}.
For the association, Lan Torrez
For the {{ contractor }}
=end template