RX14 changed the topic of #crystal-lang to: The Crystal programming language | http://crystal-lang.org | Crystal 0.27.0 | Fund Crystal's development: http://is.gd/X7PRtI | GH: https://github.com/crystal-lang/crystal | Docs: http://crystal-lang.org/docs/ | API: http://crystal-lang.org/api/ | Gitter: https://gitter.im/crystal-lang/crystal
<FromGitter> <Nbotz> No need, using CSV files was perfect. thanks for your help @j8r
<FromGitter> <Nbotz> lol ok, one more question. how would i use form data from html in crystal?
<FromGitter> <theretromaniac> I this depending on the framework you use.
<FromGitter> <Nbotz> I'm using kemal.
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3be44e1cb70a372ad46123]
<FromGitter> <Blacksmoke16> athena supports it by doing like
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3be4bb95e17b45254917df]
<FromGitter> <Nbotz> so it would have to pass through the url?
<FromGitter> <Blacksmoke16> well no, kemal example it getting it from the body as the comments say
<FromGitter> <Nbotz> OH wait, i think i get it. so the params are html tags?
<FromGitter> <Blacksmoke16> assuming you want `application/x-www-form-urlencoded` then yes, thats how they are sent
<FromGitter> <Blacksmoke16> in the body encoded like that
<FromGitter> <Nbotz> what about for multipart/form-data
<FromGitter> <Blacksmoke16> i dont know how to do that in kemal specially. i dont see anything in their docs :/
<FromGitter> <theretromaniac> this is for uploading
<FromGitter> <Nbotz> yes
<FromGitter> <Blacksmoke16> ah yea
<FromGitter> <Blacksmoke16> http://kemalcr.com/guide/#file-upload
<FromGitter> <Blacksmoke16> try that
spacemanspam has quit [Read error: Connection reset by peer]
<FromGitter> <theretromaniac> they have an example in the cookbook
<FromGitter> <Blacksmoke16> http://kemalcr.com/cookbook/file_upload/
<FromGitter> <Nbotz> yeah, i've seen both, but i dont understand the env.request, ahd how it relates to the http form-data
<woodruffw> if you're looking for an example of using kemal to handle file uploads, i have one here: https://github.com/woodruffw/rsus
<FromGitter> <Blacksmoke16> env maps to https://crystal-lang.org/api/0.27.0/HTTP/Server/Context.html for the most part
<FromGitter> <Blacksmoke16> is just the var name he chose
<FromGitter> <Blacksmoke16> which is basic just accessing the request
<FromGitter> <theretromaniac> if you mean how they connect the form in html with kemal route ⏎ you pass the action in the form and the method
<FromGitter> <Nbotz> sorry, just to be clear, passing the action in the form would be similar to passing the url in a link?
<FromGitter> <theretromaniac> the action would be something like this ⏎ ⏎ ```post ‘/user’ do ⏎ ``` [https://gitter.im/crystal-lang/crystal?at=5c3be9eaba355012a434ec08]
<FromGitter> <theretromaniac> and then for every param you need to have the same name in the form
Raimondi has quit [Ping timeout: 240 seconds]
<FromGitter> <theretromaniac> for this for example ⏎ ⏎ ```<input type="text" name=“name”> ⏎ ` ⏎ ````` [https://gitter.im/crystal-lang/crystal?at=5c3beaf89fa58135b55fd9eb]
<FromGitter> <Nbotz> oh i see, thank you so much i get it now
<FromGitter> <theretromaniac> 👍 ⏎ ⏎ you can search in github there are lot of examples for kemal but i suggest you to use Amber for beginning.
<FromGitter> <Blacksmoke16> coughtryaathenacough
<FromGitter> <Blacksmoke16> :spy:
<FromGitter> <theretromaniac> ahhahahh
<FromGitter> <theretromaniac> After see how some basic things work change Amber to Athena
<FromGitter> <Blacksmoke16> ayy ;)
<FromGitter> <spTorin> @theretromaniac I thought that Kemal is more simple then Amber, and I starting with Kemal. Amber coming with DB and many shards included. With amber we can build full web app. With kemal we can fast build simple web services. This true? Can you briefly explain the difference between them?
<FromGitter> <Blacksmoke16> Kemal ist more based on senatria or however you spell it. Amber is based more on rails @spTorin
<FromGitter> <Blacksmoke16> Where I'd say Amber is more full featured, while kemal just focused on the routing routing aspects
<FromGitter> <Blacksmoke16> I'm bad at typing on my phone
<FromGitter> <spTorin> @Blacksmoke16 Ok, I see.
<FromGitter> <Blacksmoke16> https://github.com/Blacksmoke16/athena/tree/cli is also an open if you're up for something new ;)
<FromGitter> <Nbotz> sorry again, but I honestly am at a complete loss as what im doing wrong. i got an error
<FromGitter> <Nbotz> sorry again, but I honestly am at a complete loss as what im doing wrong. i got an error `in /usr/lib/crystal/io.cr:1133: undefined method 'read' for String ⏎ ⏎ ```while (len = src.read(buffer.to_slice).to_i32) > 0 ⏎ ^~~~``` ⏎ ⏎ ` [https://gitter.im/crystal-lang/crystal?at=5c3bfdf80721b912a577560f]
<FromGitter> <Blacksmoke16> whats the error?
<FromGitter> <Blacksmoke16> `String` class doesnt have a `read` method
<FromGitter> <Blacksmoke16> got a playground link of what you're trying to do?
<FromGitter> <Nbotz> its the kemal example, with a change to accomidate the name in the html
<FromGitter> <Blacksmoke16> ah, hmm
<FromGitter> <Nbotz> i cant change frameworks because the site is already done in kemal
<FromGitter> <Nbotz> im not the smartest (if you've noticed) and i dont wanna break anything :P
<FromGitter> <Blacksmoke16> yea sorry, im not too familiar with file uploads with kemal
<FromGitter> <Blacksmoke16> but if you got the example off the kemal site its prob a kemal issue
<FromGitter> <Blacksmoke16> either outdated docs or a bug
<FromGitter> <nagash> @Nbotz http://kemalcr.com/cookbook/file_upload/ This one has `env.params.files["image1"].tempfile`
<FromGitter> <Nbotz> yep, thats the example i used. i dont quite understand the `"files["image1"].tempfile` part of it, but i assumed it was tags, so i changed it to fit where the information would be
<FromGitter> <Sija> @bcardiff that seems big! why wasn’t it posted on crystal-lang.org/blog?
<FromGitter> <Nbotz> LOL I DID IT
<FromGitter> <Blacksmoke16> Ayy, nice one
<FromGitter> <Nbotz> ok, you guys are gonna kill me for this, but it was because i didnt have it wrapped in a <form>
<FromGitter> <Nbotz> on the html end
<FromGitter> <spTorin> @Sija remove `!` from link
<FromGitter> <Sija> @spTorin thx! the correct link is: https://medium.com/manas-tech/bringing-back-to-life-5-000-year-old-30a27c442b65
<FromGitter> <Blacksmoke16> Rip, that would do it
<FromGitter> <Sija> couldn’t edit previous message anymoar
<FromGitter> <Nbotz> is there a way to write to an end of a file?
<FromGitter> <Nbotz> the API doesnt mention it
_whitelogger has joined #crystal-lang
<FromGitter> <girng> @Nbotz :D
<FromGitter> <girng> you know.. the crystal playground is actually really beneficial
<FromGitter> <girng> i love going to it to fiddle around with code instead of having to re-compile, upload to server, etc. helps a lot!
<FromGitter> <rishavs> @Nbotz Isn't that what the append mode does?
<FromGitter> <rishavs> `def self.open(filename, mode = "a", perm = DEFAULT_CREATE_MODE, encoding = nil, invalid = nil, &block)` ⏎ I am just guessing, so I might be wrong. Haven't really used files a lot in Crystal
<FromGitter> <girng> is it possible to sort a hash??
<FromGitter> <girng> https://play.crystal-lang.org/#/r/5zsd for example, how can i get the rest of the elements in my hash that are not 2? then, how can i sort them by `game_started`
<FromGitter> <girng> i'm looking here https://crystal-lang.org/api/master/Enumerable.html#select%28pattern%29-instance-method but don't seee any sort methods?
<FromGitter> <girng> maybe `map`?
<FromGitter> <spTorin> @girng I'm do this with convert hash to array and sort `arr = hash_t.to_a.sort { |y, x| (x[1] - y[1]).to_i }`
<FromGitter> <girng> O_o interesting
<FromGitter> <spTorin> and arr to hash again :) ⏎ don't know how do this right way
<FromGitter> <girng> wait why does the sort have to return a int32?
<FromGitter> <girng> how does that work when it's comparing between 2x Int64's LOL
<FromGitter> <girng> @spTorin btw, that works, thanks!
<FromGitter> <spTorin> ```code paste, see link``` ⏎ ⏎ If output Int64 - error [https://gitter.im/crystal-lang/crystal?at=5c3c5148ba355012a4374e77]
<FromGitter> <spTorin> But delta of my values not bigger then Int32
<FromGitter> <spTorin> @girng I think exist other way to sort hash. And may be someone show us right code.
<FromGitter> <bew> @spTorin the int32 is a comparator, like 1, 0 or -1 for greater than, equal or lower than (or the other order, dont remember)
<FromGitter> <bew> Why are you even trying to sort a hash?
<FromGitter> <spTorin> @bew simple parse access logs with hash {ip => bytes}, and need sort by bytes
ashirase has quit [Ping timeout: 245 seconds]
ashirase has joined #crystal-lang
<FromGitter> <yxhuvud> @spTorin Can you use `sort_by` instead?
<FromGitter> <yxhuvud> ie `.sort_by &.[1]`
<FromGitter> <girng> https://play.crystal-lang.org/#/r/5ztn how can i get it to be sorted by the `player_realm`?
<FromGitter> <girng> which is `2`
<FromGitter> <girng> i can do select, but it will only return the realms that are `2`. i'm trying to return all of the games in the new sort, but just the ones that much the `player_realm` first
<FromGitter> <girng> damn sorting is so confusing to me >_<
<FromGitter> <bararchy> @girng players.max_by {|player| player.chances_to_die}
<FromGitter> <bararchy> fixed ;)
<FromGitter> <vivus-ignis> hi! i'm having trouble trying to make reason of the compiler message. ⏎ i have a class `Distro`. ⏎ `Distro` has a class method that returns an object of a subclass of `Distro` (e.g. `Centos`, `Ubuntu`). for `Distro` class and for its subclasses i have separate files. `distro.cr` refers to subclasses with a `require "./distro/*"`. ⏎ ⏎ when i try to compile i have this output: ...
<FromGitter> <spTorin> @yxhuvud Works good! Tnx! ⏎ ⏎ ```h = {"qwe" => 3, "asd" => 5, "zxc" => 1} ⏎ p h.to_a.sort_by(&.[1])``` [https://gitter.im/crystal-lang/crystal?at=5c3c88d235350772cf2cd28c]
<FromGitter> <theretromaniac> @vivus-ignis is the class Distro an abstract class?
Dreamer3_ has quit [Quit: Leaving...]
rohitpaulk has joined #crystal-lang
<FromGitter> <Blacksmoke16> @vivus-ignis requiring them using the `*` requires them in abc order, so `Distro` isn't defined at the time `Alpine` is read
<FromGitter> <Blacksmoke16> hrm, but it looks like you're doing that, assuming `../distro` is that main file, i would also try to require distro before requring `./distro/*`
rohitpaulk has quit [Remote host closed the connection]
_whitelogger has joined #crystal-lang
laaron has quit [Quit: ZNC 1.7.1 - https://znc.in]
laaron has joined #crystal-lang
<FromGitter> <vivus-ignis> @theretromaniac no not abstract
<FromGitter> <vivus-ignis> @Blacksmoke16 here is a snippet from distro, maybe it will make it a bit clearer: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3ca2c10999400604ed155a]
laaron has quit [Quit: ZNC 1.7.1 - https://znc.in]
<FromGitter> <vivus-ignis> so Distro refers to Apline in a class method, and Alpine is a subclass of Distro. maybe there's some chicken-and-egg problem which compiler doesn't like
<FromGitter> <j8r> @vivus-ignis maybe you require in the wrong order
laaron has joined #crystal-lang
<FromGitter> <j8r> and then the Class isn't known yet by the compiler when you use it
<FromGitter> <j8r> @vivus-ignis sounds interesting - what are you doing?
<FromGitter> <vivus-ignis> this is a wrapper for a bunch of security scanners to be used for scanning docker images in a typical CI pipeline
Raimondi has joined #crystal-lang
<FromGitter> <j8r> It would be great tot make the distro detection an external shard :)
<FromGitter> <j8r> I would be interested to use it
<FromGitter> <j8r> you read `/etc/issue`, or `/etc/lsb-release` for detection?
<FromGitter> <vivus-ignis> yes, or run lsb-release
Raimondi has quit [Ping timeout: 240 seconds]
<FromGitter> <vivus-ignis> ok let me try to reorg those classes... i think this must be some chicken-and-egg issue
<FromGitter> <Blacksmoke16> id bet it is
<mps> vivus-ignis: /etc/os-release
<FromGitter> <j8r> ooh yes good mps, os-release is perfect
<FromGitter> <j8r> but to just know the dist, checking if the `/etc/debian_version` exists or `/etc/redhat-release`
<FromGitter> <vivus-ignis> thanks, mps
<mps> j8r: iirc, debian also have /etc/os-release
<FromGitter> <vivus-ignis> @j8r yeah the code is very simple. e.g.: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3ca97339596c372bde133b]
<FromGitter> <j8r> yeah, centos too - that's why you can't differentiate
<FromGitter> <j8r> 👍 @vivus-ignis
<FromGitter> <vivus-ignis> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3ca9bfdab15872ce929fd9]
<FromGitter> <vivus-ignis> things like that
<mps> is there text mode client for gitter
<FromGitter> <j8r> @vivus-ignis or `starts_with? "CentOS"`
<FromGitter> <vivus-ignis> good one! @j8r
<FromGitter> <vivus-ignis> thanks
<FromGitter> <yxhuvud> perhaps someone should port ohai to crystal :P
spacemanspam has joined #crystal-lang
<FromGitter> <vivus-ignis> ohai is cool for sure, @yxhuvud ⏎ for my little project i just needed some quick way to detect a distro
<FromGitter> <j8r> mps apk isn't supported in PackageKit https://github.com/hughsie/PackageKit/tree/master/backends :(
<FromGitter> <j8r> Hpefully I don't use it
<mps> j8r: apk is in the redefine and rewrite phase, when that finishes maybe then. but yes, it is not supported in PackageKit :(
<FromGitter> <j8r> that's the first rewrite, from Shell to C, or a second rewrite phase?
<FromGitter> <j8r> Anyway, I've really nice experience with the package manager - simple and fast, despite being a bit too basic
<mps> apk is written in C
<FromGitter> <j8r> yes, but it was written in Shell at the beginning?
<mps> could be, didn't looked back. using it about two/three years
<mps> archive format have to be redesigned for better safety and security
<mps> but it have to stay simple, it should be fast as it is
spacemanspam has quit [Read error: Connection reset by peer]
<FromGitter> <bew> @vivus-ignis for your require issue, you can put `require "./distro/*"` at the end of `distro.cr` file :)
<FromGitter> <vivus-ignis> interesting. thanks, @bew
simerax has joined #crystal-lang
<simerax> Hello together. Im currently trying to implement a simple binary tree in Crystal. I dont seem to understand how to handle Union Types. As you know in a Binary Tree every Node has 2 child nodes, each of them can either be another value or non existent (null / nil).
<simerax> In my insert method which is used to insert a new child-node into a node I have following code:
<simerax>
<simerax> if @left == nil
<simerax> @left = Node.new(value)
<simerax> else
<simerax> @left.insert(value)
<simerax> end
<simerax> This does not compile due to "undefined method 'insert' for Nil (compile-time type is (BinaryTree::Node | Nil)) (did you mean 'inspect'?)"
<simerax> How do I correctly check for Nil?
<simerax> ups
<simerax> i thought this would nicely format into one message
<FromGitter> <Blacksmoke16> ```if left = @left ⏎ # left is not nil ⏎ else ⏎ # left is nil ⏎ end``` [https://gitter.im/crystal-lang/crystal?at=5c3cbc1e32a8370605ce7431]
<FromGitter> <Blacksmoke16> assign it to local variable first
<simerax> that did it thank you! Is this because you cannot assign nil to another variable? basically left = @left only assigns non nil values?
<FromGitter> <bew> No, but the if will make sure that the types are correct
<FromGitter> <bew> The thing with instance variables is that they could change between
<FromGitter> <bew> Uos
<FromGitter> <bew> Between the check and the use
<FromGitter> <bew> So you assign the ivar to a local variable, and use it
<FromGitter> <vladfaust> Is it possible to interrupt (i.e. fail) a spawned fiber?
<FromGitter> <bew> Currently no
<FromGitter> <bew> Checkout the issue (or pr? Don't remember) about fiber#cancel
<simerax> @bew ah yeah basically not the assign fails but the "if" fails since nil is considered false?
<FromGitter> <bew> Yep!
<FromGitter> <vladfaust> Thanks, @bew
jemc has joined #crystal-lang
<FromGitter> <girng> @bararchy oh really how did i miss that lol
<FromGitter> <girng> @bararchy yeah that returns just 1 value, i just want to re-order the array with `player_realm` being first
vikaton has joined #crystal-lang
<FromGitter> <drujensen> Anybody know of or hosting a Raspbian APT repo for Crystal yet? I found one by @ysbaddaden but it hasn’t been updated in a while.
spacemanspam has joined #crystal-lang
<robacarp> oooo
spacemanspam has quit [Read error: Connection reset by peer]
<FromGitter> <silmanduin66> hello
<FromGitter> <Blacksmoke16> o/
<FromGitter> <silmanduin66> can someone help me with docker and dockerfile ?
<FromGitter> <silmanduin66> i just want to build and run a helloworld
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3cee85f780a1521f0defd1]
<FromGitter> <Blacksmoke16> something like that should work
<FromGitter> <silmanduin66> i tried with ADD but it seems docker can't see my file
<FromGitter> <Blacksmoke16> is your dockerfile in your app directory?
<FromGitter> <Blacksmoke16> like with your shard.yml and stuff
<FromGitter> <silmanduin66> yes
<FromGitter> <silmanduin66> eh no i m not using docker-compose
<FromGitter> <Blacksmoke16> paste what your dockerfile looks like atm
<FromGitter> <silmanduin66> just a simple Dockerfile and trying to build + run
<FromGitter> <silmanduin66> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3cefc7c45b986d115ea1c1]
<FromGitter> <Blacksmoke16> shouldnt that be like `src/hello.cr`? or is everything in one big folder?
<FromGitter> <silmanduin66> eh for the moment i have no idea
<FromGitter> <silmanduin66> i just learned some docker commands and made this dockerfile
<FromGitter> <Blacksmoke16> yes but is your app directory structure like
<FromGitter> <Blacksmoke16> ```- myApp/ ⏎ - Dockerfile ⏎ - hello.cr``` [https://gitter.im/crystal-lang/crystal?at=5c3cf059cb47ec3000431e1c]
<FromGitter> <Blacksmoke16> or like
<FromGitter> <Blacksmoke16> ```- myApp/ ⏎ - Dockerfile ⏎ - hello.cr``` [https://gitter.im/crystal-lang/crystal?at=5c3cf05f0999400604ef3c06]
<FromGitter> <Blacksmoke16> ```- myApp/ ⏎ - Dockerfile ⏎ - src/ ⏎ - hello.cr``` [https://gitter.im/crystal-lang/crystal?at=5c3cf06c1cb70a372adb51f1]
<FromGitter> <silmanduin66> 1st one
<FromGitter> <Blacksmoke16> try making it `ADD ./hello.cr /bin/hello.cr`
<FromGitter> <Blacksmoke16> sec
<FromGitter> <silmanduin66> i found the error
<FromGitter> <Blacksmoke16> what was it?
<FromGitter> <silmanduin66> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3cf19f32a8370605cfec7a]
<FromGitter> <silmanduin66> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3cf21aba5936605bbd4866]
<FromGitter> <silmanduin66> musl -dev
<FromGitter> <silmanduin66> was missing
<FromGitter> <silmanduin66> and modify to ADD
<FromGitter> <Blacksmoke16> nice
<FromGitter> <silmanduin66> but now crystal is building and running during the "docker build " part
<FromGitter> <Blacksmoke16> change your last `RUN` to `CMD`
<FromGitter> <silmanduin66> how can i make crystal build and run my hello.cr at the "docker run" part
<FromGitter> <silmanduin66> ok
<FromGitter> <Blacksmoke16> `CMD ["crystal","/bin/hello.cr"]`
<FromGitter> <silmanduin66> it's working perfectly
<FromGitter> <silmanduin66> thanks
<FromGitter> <Blacksmoke16> np
<FromGitter> <silmanduin66> oh i just did ```CMD crystal run src/hello.cr ⏎ ⏎ `````` [https://gitter.im/crystal-lang/crystal?at=5c3cf45f8318994524ecdcb3]
<FromGitter> <silmanduin66> what s the difference with what you wrote ?
<FromGitter> <silmanduin66> ( now i put in src folder )
<FromGitter> <Blacksmoke16> mine is exec format which is the preferred way to do CM
<FromGitter> <silmanduin66> oh i see
<FromGitter> <silmanduin66> ty
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5c3cf5490721b912a57daf14]
<FromGitter> <Blacksmoke16> could be a production setup, where you build the binary in release mode and statically. then just add the binary to an empty image and run the binary
<FromGitter> <silmanduin66> what is this ```COPY --from=0``` ?
<FromGitter> <Blacksmoke16> basic it is saying copy the binary from the first build stage, i.e. the alpline imagine, to this new image
<FromGitter> <Blacksmoke16> like since in your example the binary is being ran from an alpine image, with all the deps and packages that alpine needs
<FromGitter> <Blacksmoke16> i.e. plus crystal and shards, so the image is 222mb
<FromGitter> <Blacksmoke16> vs if you just copy and run the built binary the image is only 1.5
<FromGitter> <silmanduin66> i'm still not sure if i'll use the static
<FromGitter> <Blacksmoke16> i wouldnt use it for development stuff, but it can be handy to know when you want to deploy the final application to a server or something
<FromGitter> <Blacksmoke16> as since its statically compiled it can run on anything pretty much (afaik) since all of its dependencies are included with it
<FromGitter> <silmanduin66> now i'm just learning how to use it :-P
<FromGitter> <Blacksmoke16> ;)
<FromGitter> <girng> How many bytes does a Boolean value use?
Harzilein has quit [Ping timeout: 268 seconds]
spacemanspam has joined #crystal-lang
spacemanspam has quit [Read error: Connection reset by peer]
<FromGitter> <Blacksmoke16> according to google, prob 1
<FromGitter> <girng> ty
<FromGitter> <Blacksmoke16> but no promises :p
<FromGitter> <silmanduin66> @Blacksmoke16 i generated a``` ./server``` file with docker and alpine , but how can i find this file on my computer now ?
<FromGitter> <Blacksmoke16> did you build it in the image?
<FromGitter> <Blacksmoke16> er create the file locally or within the docker image?
<FromGitter> <silmanduin66> within the docker image
<FromGitter> <Blacksmoke16> then its not *on* your computer technically atm
<FromGitter> <Blacksmoke16> its within the image
<FromGitter> <silmanduin66> then how can i solve that :-P
<FromGitter> <Blacksmoke16> https://docs.docker.com/storage/volumes/
<FromGitter> <Blacksmoke16> maybe check out that
<FromGitter> <Blacksmoke16> can define a volume to mount a directory on your local machine into the image
<FromGitter> <Blacksmoke16> that would be shared between both
<FromGitter> <Blacksmoke16> i.e. if you create a file in one it shows in the other
<FromGitter> <silmanduin66> oh that's what i was looking for :-)
<FromGitter> <Blacksmoke16> 👍
jemc has quit [Ping timeout: 258 seconds]
jemc has joined #crystal-lang
Raimondi has joined #crystal-lang
simerax has quit [Remote host closed the connection]
jokke has quit [Ping timeout: 268 seconds]
jokke has joined #crystal-lang