#jsmess 2016-12-07,Wed

↑back Search

Time Nickname Message
00:01 🔗 db48x has joined #jsmess
00:12 🔗 db48x has quit IRC (hub.se ny.us.hub)
00:12 🔗 devesine has quit IRC (hub.se ny.us.hub)
00:12 🔗 mta has quit IRC (hub.se ny.us.hub)
00:12 🔗 bai has quit IRC (hub.se ny.us.hub)
00:12 🔗 Lord_Nigh has quit IRC (hub.se ny.us.hub)
00:12 🔗 bwn has quit IRC (hub.se ny.us.hub)
00:12 🔗 jvilk_ has quit IRC (hub.se ny.us.hub)
00:12 🔗 arkiver has quit IRC (hub.se ny.us.hub)
00:18 🔗 db48x has joined #jsmess
00:18 🔗 Lord_Nigh has joined #jsmess
00:18 🔗 mta has joined #jsmess
00:18 🔗 devesine has joined #jsmess
00:18 🔗 bwn has joined #jsmess
00:18 🔗 bai has joined #jsmess
00:18 🔗 jvilk_ has joined #jsmess
00:18 🔗 arkiver has joined #jsmess
00:18 🔗 hub.efnet.us sets mode: +oooo devesine bai jvilk_ arkiver
00:22 🔗 SketchCow DFJustin: So, 0.180 from 0.177?
00:22 🔗 SketchCow Also, we're so likely missing arcade games.
00:26 🔗 DFJustin only issue I can think of offhand is the game boy sound has gotten worse
00:46 🔗 bai SketchCow: haha is that tweet in reply to the fb comment?
00:46 🔗 bai or intended for someone else :D
00:47 🔗 bai it was definitely intended as a backhanded compliment. "this other garbage is beneath us. do with it what you will."
01:28 🔗 SketchCow bai: Which tweet
01:28 🔗 SketchCow I got a lot of tweets in the air right now, pal
01:28 🔗 SketchCow Also, wanna compile a mac emulator with me
01:29 🔗 bai about parking in a handicapped spot and leaving your wife
01:29 🔗 SketchCow Oh no
01:29 🔗 SketchCow That actually happened
01:29 🔗 bai it didn't show as a reply to anything but the only tweet I made in the past day was "praising" facebook for letting us open source the parts of the company they weren't hoarding for themselves
01:30 🔗 bai oh haha ok
01:30 🔗 SketchCow At the 24 hour deli down the road
01:30 🔗 SketchCow it's raining and the handicapped spots are nearer to the door
01:30 🔗 SketchCow So of course trickery
01:31 🔗 bai hey, rain is like a handicap for all of us, right?
01:32 🔗 SketchCow Yeah
01:32 🔗 SketchCow https://github.com/marciot/retroweb-pcejs-jsdf
01:32 🔗 SketchCow haaeeeelp
01:32 🔗 SketchCow His instructions don't work
01:32 🔗 SketchCow Which seems just because his definition of emscripten is different than ours
01:33 🔗 bai in what way don't they work? compiler barfs?
01:34 🔗 SketchCow ./emsdk update
01:34 🔗 SketchCow ./emsdk install latest
01:34 🔗 SketchCow ./emsdk activate latest
01:34 🔗 SketchCow source ./emsdk_env.sh
01:34 🔗 SketchCow OK, so we don't do that, and I don't think anyone does.
01:34 🔗 bai oh, I started using that method recently
01:35 🔗 SketchCow So this works? I could call it, I guess
01:35 🔗 bai basically it just downloads and compiles the specified version and then sets upt he environment variables for you
01:35 🔗 bai you can tell it to install "latest", "incoming", or a specific version
01:35 🔗 SketchCow Will this blow up jsmame?
01:35 🔗 SketchCow Or it shouldn't
01:35 🔗 SketchCow It shouldn't, I would thinkl
01:35 🔗 bai no I used that process last time I built jsmame
01:35 🔗 bai it all just works
01:36 🔗 SketchCow OK, Where do I get emdsk
01:36 🔗 bai https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html
01:36 🔗 bai jesus, there's even an installer for this stuff now?
01:36 🔗 bai a web installer, no less
01:37 🔗 bai anyway, you want this one https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz
01:37 🔗 Vito` does it install it into a web page and then you have to reinstall it if you close the tab
01:37 🔗 bai haha
01:37 🔗 SketchCow ^
01:39 🔗 SketchCow Installing
01:39 🔗 SketchCow I'll do the build
01:39 🔗 SketchCow Then we'll see what explodes
01:39 🔗 SketchCow (Goal is to make it work in emularity)
01:39 🔗 SketchCow Of course
01:40 🔗 SketchCow "Exposed to JavaScript the ability to send messages to the emulator via *_set_msg to allow for on-the-fly disk insertion."
01:40 🔗 SketchCow Is interesting
01:40 🔗 bai nice
01:41 🔗 SketchCow Mostly, I want to see what happens as we go into this, because frankly, if we make it that hypercard stacks work, it blows up the world
01:42 🔗 SketchCow By the way, I'm in SF from the 11th to the 20th
01:46 🔗 bai hypercard on the web....billion dollar idea!
01:47 🔗 bai we've come full circle :D
01:50 🔗 bai but yeah, cool re: sf, we'll grab some food or what have you
01:58 🔗 SketchCow Yeah, and we have nothing local to drag you into
01:58 🔗 SketchCow I love this fucking graffitti VR thing, by the way
01:58 🔗 SketchCow I know it's not released but I love they got a top notch guy to do demos
01:58 🔗 SketchCow And it's a killer VR example app
02:00 🔗 SketchCow Also, the emscripten build time is .... notably large
02:00 🔗 SketchCow But that said, the fact it's doing ALL the work for me works out nicely.
02:01 🔗 DFJustin magic takes time
02:16 🔗 bai yeah, the graffiti and other artistic stuff is one of the more compelling uses for VR, people can just jump in and start spraying and they get it
02:16 🔗 bai even just watching other people is interesting, and it makes an art form that's always been sort of clandestine and temporary into something that can be shared with anyone in the world
02:16 🔗 SketchCow It also shows techniques
02:19 🔗 bai yeah, that's definitely one I'm buying once they release it
03:32 🔗 SketchCow Emscripten built! pce.js compiled!
03:32 🔗 SketchCow Now, let's blow that shit up
03:33 🔗 SketchCow ack, it built a .mem
03:36 🔗 bai does their working version use one?
03:37 🔗 SketchCow No, it's a default in Emscripten now
03:37 🔗 SketchCow I have to turn it off
03:37 🔗 SketchCow I did an O3 build and here we are
03:39 🔗 SketchCow Ok, better.
03:39 🔗 SketchCow Now, let's add the emulator
03:40 🔗 SketchCow 264K pce-macplus.js.gz
03:40 🔗 * SketchCow puts on glasses
03:40 🔗 bai :D
03:41 🔗 SketchCow Now, let's play .JSON hell
03:42 🔗 SketchCow { "name": "PCE Macplus Emulator", "js_filename": "pce-macplus.js.gz", "bios_filenames": [""], "peripherals": [""], "native_resolution": [560,384], "extra_args": [""], "driver": ""
03:42 🔗 SketchCow }
03:47 🔗 SketchCow Going to do a Mac 512k first
03:50 🔗 SketchCow emularity_bios_v1:
03:50 🔗 SketchCow uploading pce-mac-128k.zip: [################################] 1/1 - 00:00:00
03:50 🔗 SketchCow uploading pce-mac-512k.zip: [################################] 1/1 - 00:00:00
03:50 🔗 SketchCow uploading pce-mac-classic.zip: [################################] 1/1 - 00:00:00
03:50 🔗 SketchCow uploading pce-mac-plus-3.zip: [################################] 1/1 - 00:00:00
03:50 🔗 SketchCow uploading pce-mac-se.zip: [################################] 1/1 - 00:00:00
03:50 🔗 SketchCow 48K pce-mac-128k.zip
03:50 🔗 SketchCow 48K pce-mac-512k.zip
03:50 🔗 SketchCow 428K pce-mac-classic.zip
03:50 🔗 SketchCow 92K pce-mac-plus-3.zip
03:50 🔗 SketchCow 176K pce-mac-se.zip
03:51 🔗 SketchCow Also tiny
03:52 🔗 SketchCow next, let's ruin lives
03:57 🔗 SketchCow https://archive.org/details/macexploderonimpact
03:57 🔗 SketchCow The fact it loaded ANYTHING
03:58 🔗 SketchCow (Forgot to do a sed, fixing.)
04:04 🔗 SketchCow ahhh, annoying
04:04 🔗 SketchCow I have to wait for a derive
04:07 🔗 SketchCow Well, as predicted, https://archive.org/details/macexploderonimpact explodes
04:15 🔗 bai oh ho https://jamesfriend.com.au/working-implementation-sdlcreatergbsurfacefrom-emscripten
04:15 🔗 bai does your version of library_sdl.js's SDL_CreateRGBSurfaceFrom function look like that?
04:16 🔗 bai that would be in...let's see...
04:16 🔗 bai em-sdk/emscripten/uhh....I guess I'll have to spin up a vm for this
04:16 🔗 SketchCow So, one moment.
04:16 🔗 SketchCow In the build instructions, he has:
04:17 🔗 SketchCow sed pce-macplus.js -i -e 's/function _SDL_CreateRGBSurfaceFrom/function _SDL_CreateRGBSurfaceFrom_disabled/'
04:17 🔗 bai ah interesting
04:17 🔗 SketchCow Why is SDL_CreateRGBSurfaceFrom being disabled?
04:17 🔗 SketchCow The SDL_CreateRGBSurfaceFrom that ships with Emscripten only supports a depth of 32. James Friend patched this routine to support a depth of 8 bits, required by PCE, but his repository did so through a modified version of the Emscripten toolchain which wasn't kept up to date.
04:17 🔗 SketchCow Instead of doing that, I rename the function after compiling the JavaScript files (you could also manually delete the entire function to save space) and then provide the patch elsewhere (namely, in "emulators/emscripten-interface.js" from retroweb-vintage-computer-museum).
04:17 🔗 SketchCow Oh I see
04:17 🔗 SketchCow MOTHERFFFF
04:17 🔗 bai I wonder if there's any specific reason he never contributed it back
04:18 🔗 SketchCow James quit
04:18 🔗 bai the project?
04:18 🔗 SketchCow One moment, I'm on a hunt for SDL_CreateRGBSurfaceFrom
04:18 🔗 SketchCow found it.
04:18 🔗 SketchCow So....
04:19 🔗 SketchCow Can I cat this onto the back-ass of the .js and have it just work
04:19 🔗 SketchCow https://github.com/marciot/retroweb-vintage-computer-museum/blob/3818c45e63e1c13a7c6e396a6f9471fac385323d/webfiles/emulators/emscripten-interface.js
04:19 🔗 SketchCow (It's at the end there
04:19 🔗 bai hmmm no
04:19 🔗 bai you'll have to modify your emscripten build
04:19 🔗 bai and re-link
04:21 🔗 SketchCow I need help with that. One moment.
04:21 🔗 bai yeah, I just fired up the vm and am looking for the path to that file you need to modify
04:22 🔗 bai emsdk_portable/emscripten/current/src/library_sdl.js
04:24 🔗 SketchCow root@teamarchive0:/0/RETROMAC# cd emsdk_portable/emscripten/current/src/
04:24 🔗 SketchCow bash: cd: emsdk_portable/emscripten/current/src/: No such file or directory
04:25 🔗 SketchCow root@teamarchive0:/0/RETROMAC# find . -name library_sdl.js
04:25 🔗 SketchCow ./emsdk_portable/emscripten/master/src/library_sdl.js
04:25 🔗 bai oh, master, duh
04:25 🔗 bai I built with incoming so I guessed
04:25 🔗 SketchCow So, I don't see it in there
04:26 🔗 SketchCow (Found it)
04:26 🔗 bai it seems to be implemented in incoming, at least....
04:27 🔗 SketchCow So wait
04:27 🔗 bai oh, it's the depth !== 32 part, right
04:27 🔗 SketchCow cp ./emsdk_portable/emscripten/master/src/library_sdl.js ./emsdk_portable/emscripten/master/src/library_sdl.js.bak
04:27 🔗 SketchCow Now, nobody will die
04:28 🔗 bai it's hard to say what this will do because this article about what to replace was written in 2013, and the current instructions say "just disable it"
04:28 🔗 bai but in theory you swap out that entire function with the function in the blog
04:29 🔗 bai but I would say we may be barking up the wrong tree if the instructions saying to disable it are newer than the instructions saying to yolocode the fuck out of emscripten
04:29 🔗 SketchCow Well, nothing's dead yet
04:29 🔗 SketchCow Let me go look at emscripten
04:31 🔗 SketchCow OK
04:31 🔗 SketchCow I think for this purpose, modify library_sdj.js
04:31 🔗 SketchCow It helps to know who's involved.
04:31 🔗 SketchCow Hampa Hug makes PCE emulator, fun
04:31 🔗 SketchCow James Friend took PCE Emulator and made PCE.js
04:32 🔗 SketchCow James gets bored, wanders off
04:32 🔗 SketchCow Has a life, the turd
04:32 🔗 SketchCow Marcio takes PCE.js and makes Retroweb-pcejs-jsdf
04:32 🔗 bai sounds like he got a job at facebook. poor guy
04:32 🔗 SketchCow Over time, things are needed
04:32 🔗 SketchCow Because Hampa keeps making the Mac better
04:32 🔗 SketchCow And the emulator better
04:33 🔗 SketchCow So, along the way, Marcio has been basically yanking in Hampa's updates, cutting Friend out entirely
04:33 🔗 SketchCow Now, for the purposes of US
04:33 🔗 SketchCow - Hampa, no idea if he knows who the fuck we are
04:33 🔗 SketchCow - James knows who we are, but is still doing that "yayyyyyy" from the ground while we all fight the red baron
04:33 🔗 SketchCow - Marcio is up for this but he has visions too and so on
04:34 🔗 SketchCow not dissimilar to you, where this is all ancillary to a dream of a emulation presentation system
04:34 🔗 SketchCow Does this all make sense
04:34 🔗 bai yup
04:34 🔗 bai mario is the retro web arcade thing right?
04:34 🔗 bai marcio*
04:34 🔗 SketchCow Yes
04:36 🔗 SketchCow So here's MY question to you
04:36 🔗 SketchCow I found SDL_CreateRGBSurfaceFrom in that .js file
04:37 🔗 SketchCow In that one, it does:
04:37 🔗 SketchCow return surf;
04:37 🔗 SketchCow },
04:38 🔗 SketchCow In the modified one, it does
04:38 🔗 SketchCow return surface;
04:38 🔗 SketchCow }
04:38 🔗 SketchCow Does that MATTER?
04:38 🔗 SketchCow I just don't know how javascript functions work enough to know if it set a variable or if it just went "5!"
04:39 🔗 SketchCow I can actually cargo cult this enough to make the old function do what the change does
04:41 🔗 SketchCow ha HA this makes it even more fun
04:44 🔗 bai well, it only matters what he calls it when he creates it
04:45 🔗 bai in james' code it says "var surface = ..."
04:45 🔗 bai but in the official one they say "var surf = ..."
04:48 🔗 SketchCow So maybe I'm doing this wrong
04:48 🔗 SketchCow I just modified the original
04:48 🔗 SketchCow Like anyone, I don't like doing 5 little along-the-way changes that are hard to remember
04:49 🔗 bai yeah. whether we do marcio's version or james' version either way is an extra step
04:50 🔗 bai it seems like they need to contribute their work back to either PCE or emscripten, or we need to do it on their behalf
04:50 🔗 SketchCow OK, great, it explodes
04:50 🔗 SketchCow But properly.
04:50 🔗 bai if SDL_CreateRGBSurfaceFrom is unnecessary and can be disabled, why is it called in PCE at all?
04:50 🔗 SketchCow cors_get.php?path=%2F17%2Fitems%2Femularity_engine_v1%2Fpce-macplus.js.gz:1 ./this.program: unknown option ()
04:51 🔗 bai and if it is necessary then how does disabling it make PCE.js work?
04:51 🔗 bai and what breaks?
04:51 🔗 bai oh, that sounds good yeah
04:51 🔗 bai now it's just an fs setup thing maybe
04:51 🔗 SketchCow Yeah, now we look at what the loader thinks it provides.
04:51 🔗 SketchCow It makes the canvas, motherfuck
04:51 🔗 SketchCow So that's good
04:52 🔗 SketchCow (Emularity, not the emulator)
04:52 🔗 bai I forget how it works with emularity, we normally create the canvas and then pass it in to the emulator?
04:53 🔗 SketchCow https://github.com/marciot/retroweb-vintage-computer-museum/blob/master/webfiles/emulators/pce-macplus/bootstrap.html
04:54 🔗 SketchCow More than I think I can mentally handle, unless you want to take a shot
05:13 🔗 bai hmm, yeah it does look pretty involved
05:18 🔗 bai the top two functions seem to be most important as far as getting the argument and the files necessary to start the program, but it appears there's a lot more this bootstrap file does
05:19 🔗 bai like fixing up headers in specific types of files so PCE recognizes them
06:00 🔗 bai welp. someone one-upped us - https://www.youtube.com/watch?v=5nViIUfDMJg
06:00 🔗 bai atari 2600 running in minecraft
06:07 🔗 SketchCow Whew
06:08 🔗 bai I say "running" but it took him 18 hours to render about 10 seconds of donkey kong
07:42 🔗 SketchCow I'll give the expected post-mortem shortly.
09:33 🔗 X-Scale has quit IRC (Quit: HydraIRC -> http://www.hydrairc.com <- Like it? Visit #hydrairc on EFNet)
14:32 🔗 db48x has quit IRC (Quit: kernel update)
14:36 🔗 db48x has joined #jsmess
14:36 🔗 db48x sounds like progress
15:33 🔗 X-Scale has joined #jsmess
17:44 🔗 SketchCow So, let's review.
17:45 🔗 SketchCow - Hampa Hug makes the PCE emulator, a multi-emulator for a couple platforms (ibmpc, Atari ST, macplus)
17:45 🔗 SketchCow - At some point, James Friend did our not-patented Emscripten Magic to create PCE.js.
17:47 🔗 SketchCow - Then comes Marcio T. Marcio has an even greater vision. Let's go to that
17:48 🔗 SketchCow -- Marcio wants to make an entire multi-layered, multi-emulator retro experience to exist on the web, with equal parts context, replayability, and historical accuracy.
17:48 🔗 SketchCow -- Many of the emulators out there (Salto, SAE) just kind of work. All Marcio has to do is yank them into his framework a tad
17:49 🔗 SketchCow -- The exception include PCE.js, which he has to do "stuff" to to make work in his system.
17:49 🔗 SketchCow Fast forward a while.
17:49 🔗 SketchCow - James Friend stops mantaining PCE.js. He's onto other things.
17:49 🔗 SketchCow - Hampa keeps developing PCE! Mactinosh gets sound, more accuracy. (We only care about the Mac here)
17:50 🔗 SketchCow - Marcio decides to basically fork his PCE.js into implementing the changes Hampa made.
17:50 🔗 SketchCow - Marcio also fixes some things James didn't deal with, that make it a tad weird with emscripten.
17:50 🔗 SketchCow Now comes us.
17:50 🔗 SketchCow - Marcio says he's willing to help, but is busy until January at the earliest.
17:51 🔗 SketchCow - His instructions for compilation are very good, so I did that. And then the stuff we often do to work in Emularity.
17:51 🔗 SketchCow - One Emscripten function call had to be changed, to force 8bit instead of 32bit this or that
17:52 🔗 SketchCow - Emscripten now compiles with the .mem thing default at -O3, so that has to be unset.
17:52 🔗 SketchCow I shoved it into the Emularity.
17:53 🔗 SketchCow - After the usual compilation hoodoo, I make a pce-macplus.js, which is 4-5 different Mac systems baked in (SE, Plus, Classic, etc.)
17:54 🔗 SketchCow - All the "stuff" is set in the pce-macplus-se, pce-macplus-classic, etc. settings, so they're all there.
17:54 🔗 SketchCow - It goes to black screen, and then dies with "invalid arguments"
17:54 🔗 SketchCow Now, what next.
17:54 🔗 SketchCow - We could wait to Marcio, but if people want to work with me to make it do stuff now, I'm for it.
17:55 🔗 SketchCow - In summary, Marcio offloads a lot of emularity-like trickery for the pce-* emulator into the loader.
17:55 🔗 SketchCow - All his code is in github, all his loaders are too.
17:55 🔗 SketchCow ------
17:55 🔗 SketchCow That's all.
18:00 🔗 SketchCow Now, there's two fronts to this. First is the code thing itself, the second is prepping a library for Macintosh goodness, for the Emularity to use.
18:00 🔗 SketchCow In the software front, there's the stuff already on the Archive, and there's one fellow (Steve Cole) who's been riding me hard with his many-gigabytes collection of Macintosh material he's been curating and which he desperately wants to see live again.
18:02 🔗 SketchCow Looks like out in Macworld are "DiskCopy 4.2" files, and "raw .dsk" files.
18:03 🔗 SketchCow https://en.wikipedia.org/wiki/Disk_Copy
18:19 🔗 SketchCow sets mode: +ooo db48x DFJustin Lord_Nigh
18:29 🔗 db48x has quit IRC (hub.dk hub.efnet.us)
18:29 🔗 devesine has quit IRC (hub.dk hub.efnet.us)
18:29 🔗 mta has quit IRC (hub.dk hub.efnet.us)
18:29 🔗 bai has quit IRC (hub.dk hub.efnet.us)
18:29 🔗 Lord_Nigh has quit IRC (hub.dk hub.efnet.us)
18:29 🔗 bwn has quit IRC (hub.dk hub.efnet.us)
18:29 🔗 jvilk_ has quit IRC (hub.dk hub.efnet.us)
18:29 🔗 arkiver has quit IRC (hub.dk hub.efnet.us)
18:38 🔗 SketchCow PCE Config file: https://github.com/marciot/retroweb-vintage-computer-museum/blob/master/webfiles/emulators/pce-macplus/pce-config.cfg
18:58 🔗 db48x has joined #jsmess
18:58 🔗 Lord_Nigh has joined #jsmess
18:58 🔗 mta has joined #jsmess
18:58 🔗 devesine has joined #jsmess
18:58 🔗 bwn has joined #jsmess
18:58 🔗 bai has joined #jsmess
18:58 🔗 hub.efnet.us sets mode: +oooo db48x Lord_Nigh devesine bai
18:58 🔗 jvilk_ has joined #jsmess
18:58 🔗 arkiver has joined #jsmess
18:58 🔗 hub.efnet.us sets mode: +oo jvilk_ arkiver
19:10 🔗 decay has quit IRC (hub.se irc.efnet.fr)
19:12 🔗 SketchCow So, asking db48x - how much crazy did you do to make sae work in the emularity
19:14 🔗 Swizzle has joined #jsmess
19:17 🔗 decay has joined #jsmess
19:39 🔗 decay has quit IRC (hub.efnet.us ny.us.hub)
19:40 🔗 decay has joined #jsmess
19:56 🔗 Swizzle has quit IRC (Read error: Operation timed out)
20:20 🔗 db48x has quit IRC (Read error: Operation timed out)
21:37 🔗 db48x has joined #jsmess
21:45 🔗 Swizzle has joined #jsmess
21:52 🔗 Lord_Nigh has quit IRC (Read error: Operation timed out)
21:54 🔗 Lord_Nigh has joined #jsmess
22:28 🔗 Swizzle has quit IRC (Read error: Operation timed out)
23:04 🔗 [X-Scale] has joined #jsmess
23:07 🔗 X-Scale has quit IRC (Ping timeout: 244 seconds)
23:07 🔗 [X-Scale] is now known as X-Scale
23:26 🔗 db48x SketchCow: for SAE I did only some fairly basic things
23:27 🔗 bai yeah I think that was mostly just a matter of "make a couple files available ont he filesystem, and pass a few arguments"
23:27 🔗 db48x there was some other stuff as well
23:27 🔗 bai which is basically the gist of what the PCE.js stuff does too, but it has some data transformation for DiskCopy 4.2 files
23:28 🔗 bai there's always a little bit of other stuff yeah :D
23:28 🔗 db48x :)
23:28 🔗 db48x https://github.com/db48x/emularity/blob/master/loader.js#L603
23:30 🔗 bai oh yeah, we had to bridge their config and our config
23:30 🔗 bai and map some functions
23:30 🔗 db48x yep
23:30 🔗 db48x but nothing crazy
23:31 🔗 bai yeah. I think the pce.js case will be almost exactly like the SAE one
23:31 🔗 db48x should be trivial then
23:31 🔗 bai rather than envoking the emscripten stuff ourselves we just treat it like a different system and call their functions and let them do the magic
23:32 🔗 db48x exactly

irclogger-viewer