ChanServ changed the topic of #crystal-lang to: The Crystal programming language | http://crystal-lang.org | Crystal 0.32.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> <nsuchy> lol
<FromGitter> <nsuchy> what game
<FromGitter> <nsuchy> games are so expensive :|
DTZUZU has quit [Quit: WeeChat 2.6]
DTZUZU has joined #crystal-lang
<FromGitter> <watzon> Has anyone built something like this yet in Crystal? https://github.com/SBoudrias/Inquirer.js
<FromGitter> <watzon> Basically a simplified way of making command line menus
<FromGitter> <tenebrousedge> did you check awesome-crystal ?
<FromGitter> <watzon> Yeah haven't found what I'm looking for though
<FromGitter> <watzon> Guess I'll have to implement it myself
<FromGitter> <Blacksmoke16> πŸ˜‚
<FromGitter> <Blacksmoke16> usually how it goes
<FromGitter> <watzon> This is the way
<FromGitter> <watzon> lol
<FromGitter> <Blacksmoke16> @bcardiff maybe should mention the random order spec feature as well? https://crystal-lang.org/2019/12/11/crystal-0.32.0-released.html#spec
<FromGitter> <Blacksmoke16> i think its note worthy
<FromGitter> <Daniel-Worrall> Hm, how do you guys propose I do run "all" branches of a case statement on a flag? Would I have to `|| all` on each when branch or a clever refactor?
<FromGitter> <Daniel-Worrall> I'm thinking I instantiate a list/hash of conditionals and just set them all to true if all
<FromGitter> <Blacksmoke16> Maybe a case isn't the best option?
<FromGitter> <Daniel-Worrall> yeah, I'm changing it around now
<FromGitter> <Blacksmoke16> Wouldn't it just run the first it matches then stop?
<FromGitter> <Blacksmoke16> Can't say I ever tried that
DTZUZO has quit [Ping timeout: 240 seconds]
turbo1 has quit [Quit: WeeChat 2.6]
ur5us has quit [Ping timeout: 250 seconds]
DTZUZO has joined #crystal-lang
f1reflyylmao has joined #crystal-lang
f1refly has quit [Ping timeout: 276 seconds]
return0e_ has joined #crystal-lang
return0e has quit [Ping timeout: 276 seconds]
DTZUZO has quit [Ping timeout: 240 seconds]
DTZUZO has joined #crystal-lang
return0e_ has quit [*.net *.split]
DTZUZU has quit [*.net *.split]
teardown has quit [*.net *.split]
Raimondi has quit [*.net *.split]
chachasmooth has quit [*.net *.split]
baweaver has quit [*.net *.split]
fifr has quit [*.net *.split]
go|dfish has quit [*.net *.split]
dom96 has quit [*.net *.split]
<FromGitter> <Daniel-Worrall> Can I convert string to regex?
<FromGitter> <watzon> @Daniel-Worrall `Regex.new`
<FromGitter> <watzon> https://crystal-lang.org/api/0.31.1/Regex.html#new(source:String,options:Options=Options::None)-class-method
<FromGitter> <Daniel-Worrall> ty
return0e has joined #crystal-lang
watzon has joined #crystal-lang
watzon has quit [Client Quit]
watzon has joined #crystal-lang
teardown has joined #crystal-lang
ht_ has joined #crystal-lang
ht_ has quit [Quit: ht_]
<FromGitter> <Daniel-Worrall> Damn you crystal and your lack of descending ranges
<FromGitter> <Daniel-Worrall> Nevermind, I can use downto and upto
<FromGitter> <Daniel-Worrall> Man it's hard to define a set of a tuple
<FromGitter> <Daniel-Worrall> I ended up doing `[{0, 0}].to_set`
<FromGitter> <Daniel-Worrall> `Set({0,0})` was being weird
<FromGitter> <Daniel-Worrall> and others
ur5us has joined #crystal-lang
<FromGitter> <yxhuvud> What? `Set(Tuple(Int32, Int32)).new` is perfectly not-hard.
<FromGitter> <yxhuvud> `Set{ {0,0} }` should work too. Note the spaces.
ur5us has quit [Ping timeout: 245 seconds]
<FromGitter> <manveru> anyone here using Nix and wants to give https://github.com/NixOS/nixpkgs/pull/75719 a try?
chachasmooth has joined #crystal-lang
dom96 has joined #crystal-lang
fifr has joined #crystal-lang
go|dfish has joined #crystal-lang
HumanG33k has quit [Ping timeout: 246 seconds]
HumanG33k has joined #crystal-lang
HumanG33k has quit [Remote host closed the connection]
HumanG33k has joined #crystal-lang
teardown has quit [Quit: leaving]
f1reflyylmao has quit [Quit: bye fags]
f1refly has joined #crystal-lang
Nekka has quit [Ping timeout: 250 seconds]
Nekka has joined #crystal-lang
Human_G33k has joined #crystal-lang
HumanG33k has quit [Ping timeout: 245 seconds]
sagax has quit [Ping timeout: 252 seconds]
sagax has joined #crystal-lang
DTZUZO has quit [Ping timeout: 250 seconds]
<FromGitter> <randiaz95> dang i deleted my Nix ISO
<FromGitter> <randiaz95> I need to remake my Virtualbox instance
<FromGitter> <randiaz95> @manveru what is your experience with Netlify? I was checking out your blog off of your github repo and was interested in looking into it.
<FromGitter> <tenebrousedge> I've enjoyed using netlify for a personal blog
<FromGitter> <manveru> @randiaz95 it's pretty neat, i use it for a bunch of stuff
<FromGitter> <manveru> the closest to fire-and-forget deploys i ever got :)
ht_ has joined #crystal-lang
<FromGitter> <Blacksmoke16> hey @j8r, you around?
<FromGitter> <j8r> @Blacksmoke16 yes?
<FromGitter> <Blacksmoke16> trying to build a static binary for `oq` using your dockerfile ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5df7cc53578ecf4b1fb51dbb]
<FromGitter> <Blacksmoke16> which i see `xz-dev` installed, which should be what has zma?
DTZUZO has joined #crystal-lang
<FromGitter> <Blacksmoke16> if you have any ideas...
<FromGitter> <j8r> yes `xz-dev` has `liblzma.a`
<FromGitter> <straight-shoota> @Blacksmoke16 https://forum.crystal-lang.org/t/static-linking-with-libxml2/1421
<FromGitter> <Blacksmoke16> right, which manually passing the link flags should be the workaround to that tho?
<FromGitter> <j8r> @straight-shoota That what I initially thought, but he is already using the `link-flags`
<FromGitter> <j8r> @Blacksmoke16 `crystal build --static --link-flags "$(pkg-config libxml-2.0 --libs --static)"` works
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5df7cf49dbf24d0becfed491]
<FromGitter> <Blacksmoke16> i possible its because im running this on mac?
<FromGitter> <Blacksmoke16> is*
<FromGitter> <j8r> hum, we have to install `icu-static`... ⏎ I tell you when the image is built
<FromGitter> <j8r> Alpine is splitting static archives in `*-static` packages
<FromGitter> <Blacksmoke16> πŸ‘ ❀️
<FromGitter> <j8r> I didn't have this issue when only using `require "xml"` :/
<FromGitter> <Blacksmoke16> :shrug:
<FromGitter> <j8r> I didn't have this too when running inside the container
<FromGitter> <j8r> have you the latest image?
<FromGitter> <Blacksmoke16> i should, moment
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5df7d0ff7d382b523f8b3e99]
<FromGitter> <randiaz95> Hey guys, I had a question about the Builder pattern, I can't find a real reason why not just put those methods and variables within the original class?
<FromGitter> <Blacksmoke16> example?
<FromGitter> <j8r> @Blacksmoke16 Ho wait, there is a problem
gangstacat has quit [Quit: Ĝis!]
<FromGitter> <j8r> the `"$(pkg-config)"` command has been run inside your PC
<FromGitter> <j8r> not inside the container
<FromGitter> <randiaz95> I mean there is a computerBuilder and computer class in https://i-love-ruby.gitlab.io/#_builder_pattern
<FromGitter> <j8r> it's working inside, I've just done it with your project
<FromGitter> <Blacksmoke16> gotcha, ill just go inside it and run the command
<FromGitter> <j8r> I suggest to put the whole command inside simple quotes
<FromGitter> <j8r> `docker run ... 'crystal build ...'`
<FromGitter> <Blacksmoke16> πŸ‘
maxpowa has quit [Ping timeout: 276 seconds]
<FromGitter> <Blacksmoke16> @randiaz95 good question
<FromGitter> <Blacksmoke16> i think the main benefit is that it provides a better UX than having to do like `Computer.new(20 lines of stuff)`
<FromGitter> <Blacksmoke16> abstracts some of the logic so its like
<FromGitter> <Blacksmoke16> ```builder.add_dvd_drive```
<FromGitter> <Blacksmoke16> vs
<FromGitter> <Blacksmoke16> ```computer.drive = Drive.new :dvd, ...```
<FromGitter> <Blacksmoke16> idk, im not too familiar with that pattern so :shrug:
<FromGitter> <Blacksmoke16> and thanks btw @j8r i got it done
<FromGitter> <j8r> np :)
<FromGitter> <Blacksmoke16> in related new, `oq` version `1.0.0` is now released :) https://github.com/Blacksmoke16/oq
<FromGitter> <Blacksmoke16> comes with a bug fix for cutoff output on mac and supports XML as an input format
<FromGitter> <kinxer> The Builder pattern is also good for constructing objects that really shouldn't change after they're built. For example, if you have some `Material` class that contains physical properties of a material that you'll later use to help define properties of particular objects, that shouldn't really change after it's been created. So it would be better to do ⏎ ⏎ ```code paste, see link```
<FromGitter> <Blacksmoke16> wouldnt that be the perfect use case for a struct
<FromGitter> <kinxer> Hm... Yeah, I suppose that's true.
gangstacat has joined #crystal-lang
<FromGitter> <kinxer> I'm used to seeing builders used a lot in Java, which doesn't have structs.
<FromGitter> <Blacksmoke16> a better crystal pattern might be to use structs with custom initalizers
<FromGitter> <Blacksmoke16> like
<FromGitter> <Blacksmoke16> ```computer = Computer.new ⏎ computer.drive = Drive.dvd ⏎ ...``` [https://gitter.im/crystal-lang/crystal?at=5df7d9167ce7ea1e35968856]
<FromGitter> <Blacksmoke16> where `Drive` would be like
<FromGitter> <Blacksmoke16> ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5df7d94742784416abfb6821]
maxpowa has joined #crystal-lang
<FromGitter> <Blacksmoke16> main problem with this approach is that unless you new everything up in the initializer you would have to have these ivars be nilable
<FromGitter> <kinxer> Okay, but if `Computer` is a struct, won't you be doing a whole lot of copying?
<FromGitter> <Blacksmoke16> which might not make sense
<FromGitter> <Blacksmoke16> computer would be a class, but its components could be structs
<FromGitter> <Blacksmoke16> is like if you had some "assembly line" the computer could be "assembled" in various "workers"
<FromGitter> <Blacksmoke16> each worker adds diff components to the same instance
<FromGitter> <Blacksmoke16> really depends on the exact use case tho
<FromGitter> <kinxer> So the mutability concern is solved by using a struct, but it may still be useful from a UX and performance perspective to build that struct using a builder anyway.
baweaver has joined #crystal-lang
<FromGitter> <Blacksmoke16> i suppose yea
<FromGitter> <Blacksmoke16> wouldnt that mean the ivars of the struct would have to be nilable, or use `property!` i guess
<FromGitter> <Blacksmoke16> which seems kinda hacky to have setters on a struct in the first place
<FromGitter> <Blacksmoke16> maybe it would be better if the builder stored the state then have a final `#build` method that news up the struct with the builder context?
<FromGitter> <j8r> I will wait crystal 0.32.1 to submit a PR to Alpine
<FromGitter> <j8r> Too bad aarch64 will be dropped https://gitlab.alpinelinux.org/alpine/aports/issues/11017 :(
<FromGitter> <j8r> I really tried to help, but that's really out of my knowledge
<FromGitter> <j8r> If anyone is interested, I have setup a aarch64 CI
ur5us has joined #crystal-lang
<FromGitter> <nsuchy> is it 0.32.0 or 0.32.1?
<FromGitter> <Blacksmoke16> latest atm is `0.32.0`, but `0.32.1` should be out in next few days
<FromGitter> <nsuchy> I'm seeing 0.32.0-1 on GitHub
<FromGitter> <nsuchy> for the debian package
<FromGitter> <nsuchy> what does .1 change?
<FromGitter> <nsuchy> So a documentation change and a websockets change?
<FromGitter> <nsuchy> (and unit testing fix)
<FromGitter> <Blacksmoke16> and the string interpolation bug fix
<FromGitter> <nsuchy> What issue is occuring with string interpolation?
<FromGitter> <Blacksmoke16> not that hard to click the links :p
<FromGitter> <nsuchy> github had bugged out
<FromGitter> <nsuchy> only the top half of the file had loaded
<FromGitter> <nsuchy> nothing after the line before compiler had loaded
<FromGitter> <nsuchy> Currently we've been interpolating `"#{Time.utc}"` as Granite silently fails on String if we don't do this way
<FromGitter> <nsuchy> Will we need to adjust our code after this?
<FromGitter> <Blacksmoke16> have to do what now?
<FromGitter> <nsuchy> like will that now bug out with the new change to string interpolation or will it work as normla
<FromGitter> <nsuchy> interpolating the value into a string
<FromGitter> <Blacksmoke16> it'll prob be as it was before
<FromGitter> <Blacksmoke16> but i more so meant, whats the granite issue?
<FromGitter> <nsuchy> also this is the first time in like at least three or four crystal releases where amber hasn't broken after the update
<FromGitter> <nsuchy> im impressed
<FromGitter> <nsuchy> :)
<FromGitter> <bew> @manveru about https://github.com/NixOS/nixpkgs/pull/75719 (note: I'm quite new to the world of Nix) Why does splitting output reduces the closure size? the compiled binary would still reference the compiler (then llvm etc... no?)
<FromGitter> <manveru> basically, it referenced a path like `/nix/store/...-crystal/lib/some/path/to/some.cr` in the compiled binary, which is later used for printing backtraces and such i think
<FromGitter> <manveru> since `/nix/store/...-crystal` also contains `/nix/store/...-crystal/bin/crystal`, it'd indirectly depend on the crystal binary at runtime
<FromGitter> <manveru> which in turn needs llvm to compile stuff
<FromGitter> <manveru> by splitting the derivation output, and setting `CRYSTAL_LIBRARY_PATH` to the `lib` output, we ensure that all references only point to the subdirectory at runtime, and so it won't need the crystal binary as a runtime dependency anymore
<FromGitter> <manveru> since the subdir will be another derivation like `/nix/store/...-crystal-lib`, with no paths pointing to the other one
<FromGitter> <bew> oooh ok I see, I love the idea! That's something (the dep on the whole crystal derivation) that annoyed me, so I'm happy to see this fixed!
<FromGitter> <manveru> since nix determines dependencies by looking for store paths in all files of the output
<FromGitter> <manveru> yeah, it got my deploy sizes down to a few kilobyte instead of 300 MB or so :)
<FromGitter> <manveru> well, almost, but the remaining dependencies are really tiny anyway
<FromGitter> <manveru> i'd really appreciate if you could try to build something with it, and see if it still works when errors happen, or some more complex libraries are in play
<FromGitter> <bew> you've been using Nix for a long time? I just got into it (1-2 weeks) to have my latest packages on an old distrib I have to use at work, and I think I'll move to nixos when I have time
<FromGitter> <manveru> yeah, a couple of years now
<FromGitter> <manveru> started using nixos fulltime around 2016 or so :)
<FromGitter> <bew> so nice! still using it I guess? :D
<FromGitter> <manveru> sure :D
<FromGitter> <manveru> also finally my fulltime job since september
<FromGitter> <bew> my very first derivation was to compile this year' advent of code in crystal (yes I'm proud of it πŸ˜ƒ )
<FromGitter> <manveru> now i'm just trying to make the crystal ecosystem for nix better, it's already pretty painless to build crystal packages using crystal2nix and such, but there's still some work to do
<FromGitter> <manveru> i'd love in particular if shard lockfiles could include a hash, so we wouldn't need crystal2nix anymore
ht_ has quit [Quit: ht_]
<FromGitter> <bew> crystal2nix is a function? or a pkg?
<FromGitter> <bew> still don't understand why I would need these kind of X2nix tool
DTZUZO has quit [Read error: Connection reset by peer]
<FromGitter> <manveru> it's a pretty simple script
<FromGitter> <manveru> it just runs `nix-prefetch-git` for each dependency, so we know the expected hash of it
<FromGitter> <manveru> in nix, you cannot download anything during a build, unless you know already the hash of what you expect
<FromGitter> <manveru> that ensures that builds are reproducible, can be cached, and don't have side-effects
DTZUZO has joined #crystal-lang
<FromGitter> <manveru> so, if your language-specific package manager doesn't put hashes in the lockfile, we have to calculate them before starting a build
<FromGitter> <manveru> and that's what all those 2nix tools are doing
<FromGitter> <bew> okay, will have to test that some day with a bigger project, thanks for the explanation!
ur5us has quit [Ping timeout: 245 seconds]
<FromGitter> <straight-shoota> > i'd love in particular if shard lockfiles could include a hash, so we wouldn't need crystal2nix anymore ⏎ ⏎ => https://github.com/crystal-lang/shards/issues/242
<FromGitter> <straight-shoota> Bascially just needs someone to implement it (which shouldn't be hard, really).
ur5us has joined #crystal-lang
<FromGitter> <manveru> @straight-shoota awesome, I'll probably give it a try this week then :)
<FromGitter> <bew> @manveru I tried your new crystal building method, on compiling the compiler: Now the build binary is at a wrong location I think: /nix/store/v8mg1l99i7jvkxwlcazzj9r475ca400c-crystal-0.31.1/bin/bin/crystal (`bin`is mentionned twice..)
<FromGitter> <manveru> hmm
<FromGitter> <manveru> oh, damn
<FromGitter> <manveru> no, it has to be in $bin/bin/crystal
<FromGitter> <bew> Also the hierarchy of the crystal derivation looks weird now: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5df8096042784416abfccd3a]
<FromGitter> <manveru> but the symlink should be from `$bin/bin` to `$out/bin`
<FromGitter> <manveru> and not `$bin` to `$out/bin`
<FromGitter> <bew> in the `-crystal-0.31.1-bin` there is bin & share (with man) inside it
<FromGitter> <manveru> jup, fixing it now :)
<FromGitter> <manveru> last minute changes always go wrong...
<FromGitter> <j8r> We don't need to be root to use Nix, right?
<FromGitter> <manveru> no
<FromGitter> <j8r> @manveru no, we always need to be root?!
<FromGitter> <bew> no don't need to be root
<FromGitter> <j8r> Oh nice!
<FromGitter> <manveru> well, you need root to install nix in the first place
<FromGitter> <j8r> Something really missing generally on Linux distros
<FromGitter> <j8r> isn't just an executable, kind of?
<FromGitter> <manveru> unless you want to mess around with `proot`, or build everything from scratch
<FromGitter> <j8r> Or link it statically
<FromGitter> <bew> I presonally had to cheat with proot, to fake the existance of the /nix directory (I can't be root on my machine)
<FromGitter> <manveru> nix defaults to installing things in `/nix`
<FromGitter> <manveru> so, you either have to provide it, or you cannot use the public binary cache
<FromGitter> <manveru> anyway, we should move this stuff to a better channel :)
<FromGitter> <manveru> that's way too off-topic
<FromGitter> <bew> πŸ‘€ :D
<FromGitter> <bew> if it helps installing crystal in the end, it's not offtopic πŸ˜‚
<FromGitter> <manveru> hehe
<FromGitter> <bew> are you fixing the bin/bin now? otherwise I'll go sleep now
<FromGitter> <manveru> i am
<FromGitter> <manveru> just rebuilding to make sure
<FromGitter> <bew> ok!
<FromGitter> <bew> @manveru do you know if there is a simple way to use Nix as a toolchain to build static binaries?
<FromGitter> <manveru> yeah
<FromGitter> <manveru> you just pass `--static` to your build, and provide the static versions of your libraries in buildInputs
<FromGitter> <bew> for exemple for a crystal script, how would you go about statically build a standalone binary for it?
<FromGitter> <bew> "provide the static versions of your libraries in buildInputs" => how?
<FromGitter> <bew> need to rebuild all deps?
<FromGitter> <manveru> i did that at my previous company... but lost all code when i left :|
<FromGitter> <manveru> well, like static openssl/gmp/readline/etc...
<FromGitter> <bew> are these already in the binary cache? or do we need to enable something for all deps and rebuild them?
<FromGitter> <manveru> i can make you an example later :)
<FromGitter> <manveru> ok, updated the PR
<FromGitter> <bew> cool (may I suggest not doing force pushes, so it's easier to update local branches, or review the changes)
<FromGitter> <manveru> well, i have to squash it in the end anyway...
<FromGitter> <manveru> but yeah, sorry, old habit :|
<FromGitter> <manveru> static compiles made easy :)
<FromGitter> <manveru> ```ldd result/bin/crystal2nix ⏎ not a dynamic executable``` [https://gitter.im/crystal-lang/crystal?at=5df812892cc1b31e342f4b19]
<FromGitter> <bew> great PR! now my crystal hello world only depends on: ⏎ ⏎ ```code paste, see link``` ⏎ ⏎ Do you have any idea why I have a dep on gcc? [https://gitter.im/crystal-lang/crystal?at=5df814107ce7ea1e35984108]
<FromGitter> <manveru> `nix why-depends ./result /nix/store/c6jvs50xrcy2m1nbrmpjwad51f62fcrx-gcc-8.3.0`
<FromGitter> <bew> hmm... there a reference (in the binary's strings) to: ⏎ ⏎ ```code paste, see link``` [https://gitter.im/crystal-lang/crystal?at=5df8154655d9392300229d4a]
<FromGitter> <manveru> hmm, not sure why they're needed, maybe try compiling with `--no-debug`?
<FromGitter> <manveru> those files are used for finding beginning/end of constructors, possibly some ffi thing?
<FromGitter> <bew> just tried with --no-debug & --release, same
<FromGitter> <manveru> normally those should be in `gcc.lib`, and not `gcc`
<FromGitter> <manveru> which is way lighter, can you share how you build it atm?
<FromGitter> <bew> ```code paste, see link``` ⏎ ⏎ Simplest derivation I think, with a `puts "Hello from Nix"` in `hello.cr` [https://gitter.im/crystal-lang/crystal?at=5df816c555d939230022aad4]
<FromGitter> <manveru> yeah, please use `crystal.buildCrystalPackage` for that
<FromGitter> <manveru> `stdenv.mkDerivation` implicitly pulls in the full `gcc`, which ends up being the one being referenced
<FromGitter> <bew> Oo
<FromGitter> <manveru> it's usually used for building C/C++, so it makes sense :)
<FromGitter> <bew> but you're also using `stdenv.mkDerivation` in `crystal.buildCrystalPackage` ..?
<FromGitter> <manveru> you're right... i somehow thought i had a different result
<FromGitter> <bew> we also have a dep on glibc (~30MB) just for ld-linux... would be nice to have a separate output for this single thing that ~ every packages need, to really have a few KB worth of deps
<FromGitter> <manveru> https://i.imgur.com/uYxla1M.png
<FromGitter> <manveru> that's my dependency graph for `crystal2nix` without `nix-prefetch-git`
<FromGitter> <bew> pretty nice
<FromGitter> <manveru> so it clearly uses `gcc-lib`, not `gcc`
<FromGitter> <Blacksmoke16> without knowing anything about what you're doing, don't you also need libxml?
<FromGitter> <bew> why?
<FromGitter> <Blacksmoke16> for using the `XML` module
<FromGitter> <manveru> only if you require it
<FromGitter> <Blacksmoke16> ah so it sees you required it then includes that dep?
<FromGitter> <manveru> testing :)
<FromGitter> <manveru> jup
<FromGitter> <bew> not exactly, it sees that the final binary needs it after the build, so it includes that dep
<FromGitter> <manveru> https://i.imgur.com/r1zZDhu.png
<FromGitter> <Blacksmoke16> ah gotcha
<FromGitter> <Blacksmoke16> neat