<< 18-06-2021 >>

19:53:17*NimBot joined #nim
19:58:37*NimBot_ joined #nim
20:02:09*NimBot_ quit (Remote host closed the connection)
20:02:27*NimBot_ joined #nim
20:03:01*NimBot_ quit (Remote host closed the connection)
20:03:21*NimBot_ joined #nim
20:03:31*NimBot_ quit (Remote host closed the connection)
20:05:09*NimBot_ joined #nim
20:12:46*NimBot_ quit (Remote host closed the connection)
20:13:23*NimBot_ joined #nim
20:22:26*NimBot_ quit (Remote host closed the connection)
20:22:44*NimBot_ joined #nim
20:23:56*NimBot_ quit (Remote host closed the connection)
20:25:09*NimBot_ joined #nim
20:26:31*NimBot_ quit (Remote host closed the connection)
20:29:34*NimBot joined #nim
20:30:44*NimBot joined #nim
20:36:55*NimBot_ joined #nim
20:46:56*NimBot_ quit (Remote host closed the connection)
20:47:15*NimBot_ joined #nim
20:47:35*NimBot_ quit (Remote host closed the connection)
20:47:52*NimBot_ joined #nim
20:48:09*NimBot_ quit (Remote host closed the connection)
20:48:25*NimBot_ joined #nim
20:48:44*NimBot_ quit (Remote host closed the connection)
20:49:00*NimBot_ joined #nim
20:50:46*NimBot_ quit (Remote host closed the connection)
20:52:35*NimBot joined #nim
20:59:27*SebastianM joined #nim
20:59:34*SebastianM quit (Client Quit)
21:01:07*FromDiscord joined #nim
21:01:17dom96Hello World from IRC
21:01:31FromDiscord<treeform> Hey dom96
21:01:37dom96We're back on Libera.chat :)
21:01:45FromDiscord<treeform> cool
21:02:16dom96Our IRC logs are back now too and modernised: https://irclogs.nim-lang.org/
21:03:15FromDiscord<treeform> Cool I can see them
21:03:48dom96!eval echo("Test")
21:03:50NimBotTest
21:03:58dom96okay, all still working fine.
21:04:13FromDiscord<ElegantBeef> !eval echo "No"
21:04:15NimBotNo
21:04:29dom96Now I can hopefully make some updates to NimBot tomorrow
21:05:19FromDiscord<dom96> @ElegantBeef were you expecting that to not work? 😛
21:06:00FromDiscord<dom96> I think the biggest things we need from NimBot are: multi-channel log support and maybe nicer display of discord messages
21:06:11FromDiscord<ElegantBeef> In reply to @dom96 "<@!145405730571288577> were you expecting": Are you a cop?
21:06:17FromDiscord<dom96> I think I can probably detect FromDiscord and parse it
21:06:31*rockcavera quit (Remote host closed the connection)
21:06:31FromDiscord<ElegantBeef> While you're at it, probably should update the website to point there instead of freenode
21:06:39FromDiscord<dom96> yep
21:06:45FromDiscord<dom96> want to announce this change as well
21:06:58FromDiscord<dom96> maybe we can get some free "Nim is moving to Libera" PR 😛
21:07:59FromDiscord<leorize> that won't happen \:P
21:08:26*leorize[m] left #nim (#nim)
21:08:56FromDiscord<ElegantBeef> If you want free PR, just announce that you're staying on freenode
21:09:17FromDiscord<dom96> that would be clickbait lol
21:09:22FromDiscord<dom96> also, I got access to
21:09:23FromDiscord<ElegantBeef> Not if you actually stayed
21:09:26FromDiscord<dom96> #nim-lang:matrix.org
21:10:04FromDiscord<leorize> btw join `#nim:envs.net` for the nim spaces
21:10:14FromDiscord<leorize> did you get the old room back?
21:10:58FromDiscord<dom96> yes
21:12:34federico3dom96: "alas even Nim finally moved to Libera" PR?
21:13:00FromDiscord<leorize> @dom96\: there is a guide here for moving rooms\: https://coshacks.blogspot.com/2021/05/matrix-tips-they-dont-tell-you.html
21:13:04FromDiscord<leorize> look for "tombstone"
21:16:56FromDiscord<leorize> I find it weird that the #nim-lang room have both appservice-irc and gitter
21:17:09*leorize left #nim (WeeChat 3.1)
21:20:31*iortega quit (Remote host closed the connection)
21:25:56*neceve quit (Ping timeout: 268 seconds)
21:28:20FromDiscord<dom96> I think it would be cool to make #nim-lang:matrix.org the main channel
21:28:44FromDiscord<dom96> Since Gitter is already connected there
21:29:01FromDiscord<dom96> we can get rid of FromGitter and link it to Discord
21:31:18FromDiscord<dom96> I think I'll need to draw a bridging chart after all this is done lol
21:32:16*Epsilon quit (Remote host closed the connection)
21:32:35*Epsilon joined #nim
21:32:47FromDiscord<planetis> Thank you guys for working on this!
21:33:15FromDiscord<leorize> I think I can tombstone this one to that one, at the cost of history, ofc
21:35:37FromDiscord<leorize> so, you want the tombstone?
21:35:46FromDiscord<dom96> what to what?
21:36:12FromDiscord<leorize> here to #nim-lang\:matrix.org
21:36:40FromDiscord<dom96> #nim-main\:envs.net to #nim-lang\:matrix.org. Sure I guess. Is there really much point to doing it though?
21:36:58FromDiscord<leorize> so people are moved there automatically?
21:38:01FromDiscord<dom96> ok
21:40:54FromDiscord<leorize> let's see how well this work
21:41:28FromDiscord<dom96> Now I'm wondering about our Telegram channel
21:41:34FromDiscord<dom96> is it time to bridge it too?
21:41:45FromDiscord<dom96> I've been leaning to keeping it separate but maybe everyone disagrees
21:42:16FromDiscord<ElegantBeef> Seems like the sensible thing is to ask them 😛
21:42:27FromDiscord<leorize> dom, can you turn off the gitter bridge?
21:42:49FromDiscord<ElegantBeef> Or at the very least have a bridged telegram channel, so they speak here if they want to
21:43:02FromGitter<BracketMaster> I'm doing some posix drudgery in nim and can't figure out how to create an instance of Timeval()
21:43:03FromGitter<BracketMaster> https://nim-lang.org/docs/posix.html#Timeval
21:43:21FromGitter<BracketMaster> ``Timeval(tv_sec : castdistinct clong (0), tv_usec : castclong (0))`` nim doesn't quite like that
21:43:32FromDiscord<dom96> leorize: the IRC one?
21:43:57FromDiscord<leorize> yea
21:44:03FromGitter<dom96:matrix.org> I'm a little confused by the setup here
21:44:09FromGitter<dom96:matrix.org> shouldn't we see BracketMaster's message show up twice?
21:44:14FromDiscord<leorize> if we move the bridge there then gitter will go through matrix
21:44:42FromGitter<BracketMaster> "go through matrix" gives me 2000s vibes
21:44:43FromDiscord<leorize> and matrix go to discord which goes to irc
21:44:50FromDiscord<leorize> you can see the loop
21:44:54FromDiscord<ElegantBeef> !eval import std/posix; let a = Timeval(tvsec: 0.Time, tvUsec: 0)
21:44:56NimBot<no output>
21:45:02FromDiscord<ElegantBeef> There you go bracket 😄
21:45:16FromGitter<BracketMaster> lol, not gonna lie, that's kinda cool
21:45:28FromGitter<BracketMaster> !eval import print
21:45:30NimBotCompile failed: /usercode/in.nim(1, 8) Error: cannot open file: print
21:46:54FromGitter<BracketMaster> discard execShellCmd("whoami")
21:47:03FromGitter<BracketMaster> !discard execShellCmd("whoami")
21:47:13FromDiscord<ElegantBeef> You'll get it eventually
21:47:17FromDiscord<ElegantBeef> Plus that's an OS module
21:48:26FromGitter<dom96:matrix.org> leorize: I'm confused why we don't already have a loop
21:48:53FromGitter<dom96:matrix.org> oh because this channel isn't bridged to Discord right now
21:48:53FromDiscord<Ricky Spanish> anyone got experience with parse trees? im struggling to find a coherent way to generate back from a parse tree to source code since the parse tree contains nodes that contain tokens of all child nodes, so im not sure if the best way is to flag "parent" nodes to not output source tokens or if there are better ways to regenerate source from a parse-tree
21:49:20FromGitter<BracketMaster> I'm waiting for somebody to feed nim bot an infinite loop
21:49:22FromGitter<BracketMaster> lol
21:49:43FromDiscord<ElegantBeef> I'd wager it has a killswitch if an operation takes too long
21:49:45FromDiscord<leorize> that somebody is called Zevv and he stopped the playground for several months
21:49:59FromDiscord<ElegantBeef> Lol
21:50:13FromDiscord<dom96> kicked FromGitter
21:50:28FromDiscord<ElegantBeef> Do we still see bracket then?
21:50:34FromDiscord<dom96> Now I suppose I need to bridge #nim-lang:matrix.org to Discord
21:50:50FromDiscord<leorize> maybe the bridge will happen automatically on tombstone
21:50:57FromDiscord<dom96> okay
21:50:58FromDiscord<leorize> tombstone is kind of a "move here" event
21:50:59FromDiscord<dom96> let's try it
21:51:04FromDiscord<leorize> typically used for room upgrades
21:51:10FromDiscord<ElegantBeef> So many bridges this is worse than a river crossing
21:51:18FromDiscord<leorize> but in this case we are downgrading \:P (this room is v6 and the other is v1)
21:51:38FromDiscord<dom96> does that make any difference? 🙂
21:52:10FromDiscord<leorize> some features need the newer version
21:52:40FromDiscord<leorize> but probably not the one we would use
21:53:09FromDiscord<leorize> time to move, so pack your bags everyone
21:53:14FromDiscord<ElegantBeef> No you!
21:56:34FromDiscord<leorize> ping @dom96
21:56:40FromDiscord<leorize> !matrix help
21:56:40FromDiscord<matrix-appservice-discord-t2bot> No commands found
21:56:43FromDiscord<leorize> !matrix
21:56:43FromDiscord<matrix-appservice-discord-t2bot> No commands found
21:56:49FromDiscord<leorize> !matrix unbridge
21:56:49FromDiscord<matrix-appservice-discord-t2bot> ERROR: insufficient permissions to use this command! Try `!matrix help` to see all available commands
21:56:54FromDiscord<leorize> yea it has to be dom
22:00:07FromDiscord<dom96> !matrix unbridge
22:00:09FromDiscord<matrix-appservice-discord-t2bot> This channel has been unbridged
22:00:14FromDiscord<dom96> !matrix bridge
22:00:14FromDiscord<matrix-appservice-discord-t2bot> ERROR: unknown command. Try `!matrix help` to see all commands
22:00:18FromDiscord<dom96> (edit) "bridge" => "help"
22:00:21FromDiscord<dom96> lol
22:00:24FromDiscord<dom96> !matrix help
22:00:27FromDiscord<matrix-appservice-discord-t2bot> sent a long message, see https://paste.rs/za6
22:00:34FromDiscord<dom96> guess I need to do it on the matrix side
22:01:13FromDiscord<matrix-appservice-discord-t2bot> @dom96:matrix.org on matrix would like to bridge this channel. Someone with permission to manage webhooks please reply with `!matrix approve` or `!matrix deny` in the next 5 minutes.
22:01:19FromDiscord<dom96> !matrix approve
22:01:19FromDiscord<matrix-appservice-discord-t2bot> Thanks for your response! The matrix bridge has been approved.
22:01:23FromDiscord<leorize> you gotta fix the ACL of this room btw
22:01:36FromDiscord<dom96> yay, it's working
22:02:11FromDiscord<leorize> this one is an old version and moderator have too many power
22:02:28FromDiscord<dom96 (Dominik Picheta)> and here is a Gitter message
22:02:39FromDiscord<dom96 (Dominik Picheta)> ping
22:02:45FromDiscord<dom96> oh, this time it was faster
22:03:40FromDiscord<leorize> image.png https://media.discordapp.net/attachments/371759389889003532/855568477192323092/image.png
22:03:45FromDiscord<leorize> ^ btw use that as room avatar
22:03:49FromDiscord<dom96> changed the ACLs
22:03:52FromDiscord<leorize> it's the one I used for the rest of the rooms
22:04:22FromDiscord<dom96> done
22:05:16FromDiscord<dom96> hm, this room doesn't show up in search
22:05:21FromDiscord<dom96> any ideas why?
22:05:45FromDiscord<leorize> not published, that's why
22:05:50FromDiscord<leorize> the spaces should show up though
22:05:56FromDiscord<leorize> that's the more important one
22:06:30FromDiscord<dom96> ahh, should be published now
22:07:08*fputs quit (Quit: WeeChat 3.1)
22:07:27FromDiscord<leorize> we need to make unique icons for the other rooms
22:07:48FromDiscord<dom96> yep, who's the best artist we've got? 🙂
22:08:15FromDiscord<dom96> wow, typing status is synced Discord-\>Matrix
22:08:18FromDiscord<leorize> #gamedev folkes should be able to help
22:08:38FromDiscord<leorize> yea, only one way though
22:10:40dom96So now the longest chain is: Gitter->Matrix->Discord->IRC :D
22:13:26FromDiscord<deech> How do I convert a `string` to a `cstring`? `$` doesn't seem to work. Right now I'm allocating and naively copying character by character.
22:13:48FromDiscord<dom96> cstring is a `ptr char`
22:13:55FromDiscord<dom96> so you can either `addr str[0]`
22:14:09FromDiscord<dom96> (your `str` might be deallocated by gc)
22:14:21FromDiscord<dom96> or you `alloc` memory and copy the string there
22:14:25FromDiscord<planetis> Just use cstring(x)
22:14:26FromDiscord<leorize> what kind of conversion are you looking for?
22:15:32FromDiscord<deech> Just copy the contents of a string to a cstring.
22:15:38FromDiscord<deech> Not convert, sorry.
22:15:55FromDiscord<Varriount> Hm. What is the difference between a 'var' return type, and a 'lent' return type?
22:16:22FromDiscord<Hi02Hi> var is mutable, lent isnt
22:16:48FromDiscord<Hi02Hi> surely you know that
22:17:16FromDiscord<leorize> @deech\: like you got an external buffer and you want to copy the data over?
22:17:24FromDiscord<deech> Yep
22:17:27FromDiscord<leorize> then yea, loop and copy works, or you can use copyMem
22:17:57FromDiscord<dom96> @Hi02Hi `lent` is a pretty new addition to the language
22:18:22FromDiscord<dom96> and I think it has a deeper meaning than "immutable"
22:18:32FromDiscord<dom96> (but I also have no idea what it means)
22:19:04FromDiscord<deech> You can just copyMem a `string` into a `cstring` ? I thought they had different representations.
22:19:31FromDiscord<Varriount> @Hi02Hi Not `var x = y` vs `let x = y`, but `proc foo(): var T` vs `proc foo(): lent T`
22:22:18FromDiscord<Zachary Carter> In reply to @deech "You can just copyMem": I don't think you can
22:22:44FromDiscord<Zachary Carter> they do have different representations
22:22:57FromDiscord<Zachary Carter> but there is a zero-cost copy
22:23:07FromDiscord<Zachary Carter> if you just do string.cstring
22:23:12FromDiscord<Zachary Carter> or whatever
22:23:23FromDiscord<Zachary Carter> or zero-copy conversion I should say
22:24:22FromDiscord<dom96> pretty sure that is equivalent to `addr str[0]`
22:24:41FromDiscord<Varriount> @deech @Zachary Carter You would `moveMem(addr nimString[0], addr cstr[0], sizeof(char)len(cstr)`. But an easier way to go about that would probably be to just use a `for` loop.
22:25:04FromDiscord<dom96> string is basically: tuple[len: int, data: cstring]
22:25:08FromDiscord<Zachary Carter> copyMem / moveMem loks easier than a for loop to me
22:25:15FromDiscord<Zachary Carter> (edit) "loks" => "looks"
22:25:35FromDiscord<leorize> @deech\: `copyMem(cstring(str), addr target, length)`
22:25:37FromDiscord<leorize> copyMem is unsafe though
22:25:44FromDiscord<deech> Don't we need to also add a null byte at the end?
22:25:55FromDiscord<Zachary Carter> I think it's already done for you
22:26:00FromDiscord<Varriount> Lets check.
22:26:09FromDiscord<leorize> just `+1` to the length \:P
22:26:10FromDiscord<Zachary Carter> who needs safety really
22:27:33FromDiscord<shadow.> what's the best way to use a nim lsp on neovim? i saw the nim.nvim plugin but i'm worried that'll conflict with youcompleteme so i was wondering if there's a way to do it through youcompleteme directly
22:28:07FromDiscord<Varriount> @deech @Zachary Carter Nope. https://play.nim-lang.org/#ix=3qoa
22:28:27FromDiscord<dom96> one of these days I will write a program that analyses code for unsafe calls and gives the source code a score
22:29:49FromDiscord<leorize> there's something called lgtm
22:29:53FromDiscord<leorize> except that it doesn't support nim
22:30:47FromDiscord<Varriount> Hm, based on https://nim-lang.github.io/Nim/manual_experimental.html#view-types and https://nim-lang.org/docs/manual.html#procedures-var-return-type
22:31:16FromDiscord<Varriount> it doesn't seem like `lent` is all that different from `var`, at least from a conceptual point of view.
22:31:18FromDiscord<Zachary Carter> In reply to @dom96 "one of these days": pretty sure tools like this already exist
22:31:21FromDiscord<Zachary Carter> for C anyway
22:31:23FromDiscord<Zachary Carter> and C++
22:31:30FromDiscord<dom96> @Zachary Carter I'm sure they do
22:31:39FromDiscord<Varriount> Intel has a pretty good one.
22:31:44FromDiscord<dom96> I was inspired by the Rust tool that does the same
22:31:54FromDiscord<dom96> Rust does make this kind of analysis trivial
22:32:43FromDiscord<Zachary Carter> I think such tools are somewhat pedantic in a lot of circumstances
22:32:50FromDiscord<Zachary Carter> in others they make a lot of sense
22:33:20FromDiscord<Zachary Carter> sorry - my game is going to be full of unsafe code, because I need to do unsafe things
22:33:51FromDiscord<Zachary Carter> such a tool for me is totally useless
22:34:06FromDiscord<Zachary Carter> but if I was writing space shuttle software
22:34:09FromDiscord<Zachary Carter> I certainly would care much more
22:34:26FromDiscord<exelotl> In reply to @Varriount "it doesn't seem like": I once heard that `lent` isn't guaranteed to always use a hidden pointer in the future
22:34:46FromDiscord<dom96> It's kind of like static typing, some don't care
22:34:50FromDiscord<dom96> which is fine
22:35:00FromDiscord<Zachary Carter> oh static typing is always useful though
22:35:02FromDiscord<Zachary Carter> it's never not a good thing
22:35:04FromDiscord<dom96> you don't need to write space shuttle software to care about using libraries that minimise unsafe code
22:35:16FromDiscord<dom96> how is unsafe code different?
22:35:17FromDiscord<Zachary Carter> again it depends on the situation
22:35:26FromDiscord<dom96> it's always best to avoid it
22:35:27FromDiscord<Zachary Carter> if you're writing game code, you probably don't care if the libraries you depend on are safe or not
22:35:32FromDiscord<Zachary Carter> I disagree
22:36:00FromDiscord<Zachary Carter> you potentially sacrifice performance and time for what gain if your program is simply running a simulation?
22:36:36FromDiscord<Zachary Carter> it's not like games are critical pieces of software that will cost human lives or lots of money if they fail
22:36:42FromDiscord<Zachary Carter> they'll get a neckbeard angry
22:37:24FromDiscord<Zachary Carter> I think's Rust's focus on safety and its community's zealous pursuit of it is a bad thing
22:37:49FromDiscord<Zachary Carter> library maintainers are shamed into making sure their libraries meet some asinine safety standards
22:39:19FromDiscord<Varriount> Araq: How are `lent` and `var` types conceptually different? From what I can tell, a `lent` type is the same as a `var` type, but with additional capabilities.
22:39:40FromDiscord<Zachary Carter> I think you can ping him on discord
22:39:44FromDiscord<dom96> okay, let me soften what I said a bit: it's always best to at least think about an abstraction that is safe and performant
22:39:46FromDiscord<Zachary Carter> unless he's disabled them
22:40:10FromDiscord<Varriount> @Araq / Araq: How are lent and var types conceptually different? From what I can tell, a lent type is the same as a var type, but with additional capabilities.
22:40:46FromDiscord<dom96> If you have a hot code path that you want to optimise with unsafe code then go for it, but don't just write unsafe code because you can everywhere, most code paths aren't hot 🙂
22:41:00FromDiscord<konsumlamm> fwiw, Araq recently did some spec changes for view types: https://github.com/nim-lang/Nim/pull/18226
22:41:23FromDiscord<Zachary Carter> I think pretty much anything that doesn't rely on the stdlib / GC is going to be full of unsafe code
22:41:43FromDiscord<Varriount> And if they are different, but not too different, then I feel like it might be better to go with just `lent` (or `var`) because I can see this tripping up users multiple times.
22:42:01FromDiscord<Zachary Carter> for instance, my library has a bunch of different allocation functions that ultimately use `alloc` or `allocShared` depending on whether thread support is enabled or not
22:42:14FromDiscord<Zachary Carter> this allows me to track unsafe allocations and detect leaks and also trace memory allocations by subsystem in my project
22:42:43FromDiscord<Hi02Hi> oh sorry Varriount for assuming you knew more than me on that
22:43:03FromDiscord<Zachary Carter> since I am using threads in several of my subsystems, my allocations will almost always be on the shared heap so I need to pass pointers around everywhere internally, and pointer arithmetic is handy often
22:43:30FromDiscord<Zachary Carter> doing this safely would require channels and other abstractions that just aren't worth the performance hit at the end of the day
22:44:02FromDiscord<Zachary Carter> especially since I'm calling into assembly code for creating / switching between fibers
22:44:17FromDiscord<Zachary Carter> there's just no good safe way to do this stuff
22:44:49FromDiscord<Zachary Carter> or at least I don't know of one - if there is one, I'm sure it would take me a long time to adopt / learn / implement
22:45:52FromDiscord<Varriount> Hm. Is there any technical reason why creating a `distinct FileHandle` type and implementing `=sink`, `=destroy`, and `=copy` procedures on it, would be a bad idea?
22:46:09FromDiscord<Varriount> I could have sworn I came up with a reason last night, but can't remember what it was.
22:46:45FromDiscord<dom96> @Zachary Carteryour library provides abstractions which are hopefully safe, of course you need to do unsafe things at the "edges"
22:46:58FromDiscord<Hi02Hi> isnt a FileHandle a string? why should have a different `=destroy`?
22:47:02FromDiscord<dom96> the Nim GC does unsafe stuff too, but hopefully it's tested well enough and provides abstractions that are safe
22:47:27FromDiscord<Zachary Carter> well yeah a lot of stdlib does
22:47:33FromDiscord<Varriount> In reply to @Hi02Hi "isnt a FileHandle a": It's a cint on Linux.
22:47:49FromDiscord<Varriount> FileHandle is a file descriptor
22:48:10FromDiscord<Zachary Carter> ultimately I just expose a C API to my users so they can come up with whatever abstraction they want on top of it 🙂
22:48:59FromDiscord<Zachary Carter> and can write their code in whatever language they want
22:49:04FromDiscord<Zachary Carter> as long as it can interop with C
22:49:45FromDiscord<Zachary Carter> I'm sure my project would fail any kind of static safety analysis though
22:49:52FromDiscord<Zachary Carter> horribly
22:50:05FromDiscord<dom96> What you all think? 🙂 https://media.discordapp.net/attachments/371759389889003532/855580150002090014/nim_real_time_chat_bridging.png
22:50:30FromDiscord<Zachary Carter> can we get rid of gitter?
22:50:41FromDiscord<Zachary Carter> does anyone still use it really?
22:50:47FromDiscord<dom96> yeah, some do
22:52:51FromDiscord<rainbowasteroids> rip telegram
22:53:12FromDiscord<Rainbow Asteroids> ayy that was fast
22:53:32FromDiscord<dom96> also gonna add irclogs in there
22:55:18FromDiscord<leorize> linking #nim\:envs.net would be better, since it's a collection of all rooms
22:55:43FromDiscord<dom96> This chart is about how we bridge channels though
22:55:54FromDiscord<dom96> We bridge #main to the one I linked
22:56:09FromDiscord<dom96> don't worry we'll have a link to the space in the article and front page
23:00:00FromDiscord<InventorMatt> Why can't telegram be bridged with the others?
23:00:14FromDiscord<dom96> it can, I'm just not sure whether it should
23:01:28FromDiscord<InventorMatt> Fair enough
23:01:51FromDiscord<leorize> you can just go ask the telegram people \:p
23:01:55FromDiscord<dom96> I did
23:01:58FromDiscord<dom96> no one answered lol
23:05:54FromDiscord<rainbowasteroids> They don't need any bridges as they are real men who just jump across whenever the issue arises.