#dev 2020-04-26

2020-04-26 UTC
#
GWG
I've decided to amend my projects to fail testing if I don't document the code.
#
[tantek]
I don't support u-watch-of so I'm going to start with u-in-reply-to
#
GWG
[tantek]: There were some good examples of u-listen-of displaying on the Indieweb podcast chrisaldrich and I used to do, but nothing on video yet
#
[tantek]
GWG, there is no documentation on /watch about maybe a /watch post being a reply or response
#
[tantek]
presumably no examples of that either
#
GWG
[tantek]: It also doesn't mention some people using the experimental property either.
#
[tantek]
is that documented anywhere?
geoffo joined the channel
#
Loqi
[dshanske] #17 Designate u-watch-of as a proposed property
#
[tantek]
hmm, I think it should at least be linked from /watch#Brainstorming with a brief description of the motivating use-case
#
[tantek]
GWG, does anyone note the length of what they watched in their posts?
#
[tantek]
(like h:mm:ss or # of minutes etc.)
#
GWG
[tantek]:I set it up as an option in Post Kinds. But it never quite worked perfectly.
#
[tantek]
experiments are good! impefect is fine, that's how we learn
#
[tantek]
ok here's my example
[chrisaldrich] joined the channel
#
[chrisaldrich]
I would like to note the length of the watch, but haven't got examples of it yet.
#
[chrisaldrich]
Generally I post watches as I'm finishing watching them. I'll note if I didn't watch the entirety of the thing, so otherwise I presume the start time was the running time of the thing, which I could calculate or find.
#
[chrisaldrich]
Often when binge watching, I can guess the running times as the length of time between watches...
#
GWG
[chrisaldrich]: I tried to auto-import them from the URL.
#
[chrisaldrich]
This isn't always the case with listens because I'm usually listening to most podcasts at 1.25-1.5x speed.
#
[tantek]
I'm more looking for examples of presentation of video length
#
[chrisaldrich]
Tantek, I've saved some data in my database for it on some older posts, but haven't kept up with it since it's not something I'm displaying.
#
GWG
My presentation was Watch Title [by optional authorship](Duration HH:MM:SS)
#
Loqi
[Tantek Çelik] ▶️ watched Arundhati Roy: “The Pandemic is a Portal” (95min) https://www.haymarketbooks.org/blogs/130-arundhati-roy-the-pandemic-is-a-portal published by @haymarketbooks hosted by @imaniperry. Timely, highly recommended. #NoGoingBack #Pandemi...
#
[tantek]
oh I found ▶ also
#
[tantek]
whoa that was weird
geoffo joined the channel
#
[tantek]
alright GWG, there you go, there's my real world example of watch post of a YouTube video though it was just hosted there, and I did actually watch it from the permalink of a video post, and showing duration as well as adding hashtags
#
[tantek]
add a bunch of brainstorming to the /watch page accordingly as well
geoffo, gRegorLove, [chrisaldrich], nickodd and [jeremycherfas] joined the channel
#
[jeremycherfas]
[LewisCowles] It took me a moment to realise what you intended by “chimping”. Digital photographers use the word differently.
[LewisCowles] joined the channel
#
[LewisCowles]
hmm... only online parser that seems to work with me is https://kartikprabhu.com/connection/mfparser
#
[LewisCowles]
xray really doesn't love a h-feed with h-entries with h-cards
#
KartikPrabhu
[LewisCowles]: mine is mostly mf2py the python one
#
[LewisCowles]
it's wonderful. I was beginning to doubt that I'd even marked things up in the right way
#
[LewisCowles]
I do have some p-x-{} in there and it even picked them out
#
[LewisCowles]
KartikPrabhu++
#
Loqi
KartikPrabhu has 4 karma in this channel over the last year (9 in all channels)
#
Loqi
mf2py has 1 karma over the last year
#
KartikPrabhu
I'm not really keeping up to speed on mf2 land anymore so you might want to try https://microformats.io/
[KevinMarks] and [chrisaldrich] joined the channel
#
KartikPrabhu
[LewisCowles]: the *-x-* properties are valid mf2 so parsers should get them, but consumers might not use them at all
#
[LewisCowles]
oh thats more that the spec didn't have (or I didn't find) properties I wanted to have machine readable
#
KartikPrabhu
so you should not use my site as an indication of what feed consuming applications will parse
#
[LewisCowles]
good practice even if useless
oodani joined the channel
#
[LewisCowles]
TBH anyone parsing what I'm testing is probably going to use something I'll have to write.
#
[LewisCowles]
with the aim being "please don't call, email or contact"
[tantek] and [jgmac1106] joined the channel
#
[jgmac1106]
[cleverdevil] has the best watch posts, they are tied directly into his plex and automatically post
leg and jeremych_ joined the channel
#
[LewisCowles]
either a bug in browser, or bug in me
#
[LewisCowles]
``` const changeTagName = (element, newTagName) => {
#
[LewisCowles]
// Create a replacement tag of the desired type
#
[LewisCowles]
var replacement = document.createElement(newTagName);
#
[LewisCowles]
Array.from(element.attributes).forEach(attribute => {
#
[LewisCowles]
replacement.setAttribute(attribute.nodeName, attribute.nodeValue);
#
[LewisCowles]
replacement.innerHTML = element.innerHTML;
#
[LewisCowles]
element.parentNode.replaceChild(replacement, element);
#
[LewisCowles]
the innerHTML I could change to addChild which is a fragment of the innerHTML text.
#
[LewisCowles]
this is resulting what was an anchor with many children; having the children added alongside a <span>
#
[LewisCowles]
when I try to re-create in browser using the function... Nothing
jeremych_ joined the channel
#
Zegnat
First glance code looks good, give me a second to actually copy out from IRC into something usable
#
[LewisCowles]
I think the transposing of innerHTML might not be helping me a great deal
#
[LewisCowles]
but I need the elements children (try's not to sound evil)
#
Zegnat
It works for me in the browser
#
Zegnat
The <a> becomes a <span>, class attribute survives, so does the child <strong>
#
[LewisCowles]
yeah, I have a codepen with the same. I Guess I just have to step through a debugger to see what part of it's interactions mess things up
#
Zegnat
has been so happy ever since embracing in-browser debugger
#
[LewisCowles]
its resulting in something akin to `<span class="I was a parent of should be child"></span><div class="should be child"><!-- blah blah blah --></div>`
#
[LewisCowles]
I thought it might be the browser engine at first
#
sknebel
div can't be inside span, can it? does it adjust the DOM to fit that rule, like it would during html parsing?
#
Zegnat
Yes, the browser would adjust that
#
Zegnat
Not sure what it would do if you weren’t using innerHTML though. It might lead to even weirder results then. But innerHTML turns it into a text string that needs to be parsed a-new, and the standard HTML parser would not allow a div within a span
#
[LewisCowles]
I think it's block elements within inlines too, but I'm merely changing the inline tag from HTML someone else is producing
#
sknebel
oh right, inner html
#
[LewisCowles]
TBH I don't think there will be a pay-off from this adding microformats to kanban exports
#
Zegnat
There is only a payoff if you are planning to use microformats to turn HTML into JSON (or otherwise try to get around having to parse HTML yourself)
[mapkyca] and omz13 joined the channel
#
[LewisCowles]
the software already exports JSON
#
[LewisCowles]
useless JSON for consumers who are not me
jamietanna joined the channel
#
[LewisCowles]
the bug is mine / how `document.createRange().createContextualFragment` works
#
[LewisCowles]
I can't give it a whole HTML document
#
[LewisCowles]
`let fragment = document.createRange().createContextualFragment(
#
[LewisCowles]
document.querySelector('html').outerHTML
#
[LewisCowles]
works just like a C integer overflow in that there is no error at all, but it does surprising things
#
[LewisCowles]
I was experimenting with fragments as a way to not mutate visible DOM and need to reload
#
Zegnat
I haven’t done enough with Ranges to comment. I find them surprisingly tricky. I prefer to just walk DOM and clone nodes into a DocumentFragment when needed.
#
Zegnat
Sure it is memory overhead to have those clones, but at least in browsers you’ll be able to manipulate them without triggering renders. And then when done you can put the entire DocumentFragment in place to trigger only a single reflow
#
[LewisCowles]
> The HTML fragment parsing algorithm is used if the range belongs to a `Document` whose HTMLness bit is set. In the HTML case, if the context node would be `html`, for historical reasons the fragment parsing algorithm is invoked with `body` as the context instead.
#
[LewisCowles]
This probably meant something to the author, although I at least see it's removing invalid DOM when parsing with body context
#
Zegnat
This is also where you have to start being careful of what methods are DOM methods versus HTML methods. Methods defined by the HTML spec, especially when talking about taking String rather than DOM inputs, may depend on other things.
#
Zegnat
In this case it may very well mean that the HTML parsing algorithm is applied, which does lots of error checking to support legacy and faulty HTML in the same way as browsers have been doing
#
Zegnat
HTML5 parsing was in a big part written to match the kind of error handling that browsers were already doing, so there is a lot of automatically closing nodes, duplicating nodes, etc.
#
Zegnat
This is incidentally why some people prefer to use things like a prepackaged microdata or microformats parser ;) Nobody wants to actually handle HTML parsing.
#
Zegnat
(Sadly also why there is a distinct lack of good HTML parsers … PHP has been without one for years.)
#
[LewisCowles]
This is quite brutal, but I'll pivot back to modifying the DOM inline and refreshing after initiating download
#
[LewisCowles]
all of the quirks should be serialized and exposed somewhere. It would help overcome oddities like this
#
[LewisCowles]
CPU's have CPUFlags, which you can get at via inline ASM in C. Ultimately checking things seems to slow down the break-neck speed, but really charging around like a bull in a china shop is as limiting due to all the need to step through these monsters we've made
#
Zegnat
You can do the checks inside the HTML5 parsing algorithm, it issues events.
#
[LewisCowles]
DOM Mutation events?
#
Zegnat
No, HTML errors
#
Zegnat
But that is not exposed by browsers, because that is no longer the job of the JavaScript VM in a browser
#
Zegnat
There are very few non-speced oddities left on the HTML parsing end of the web. And the WHATWG is usually really good at keeping the spec updated.
#
Zegnat
But if you find yourself in a place where you care about how that algorithm is running inside the browser, you have gotten yourself in a place where you no longer can work inside the browser’s JavaScript VM. As far as I know, it does not expose HTML parsing (as HTML parsing it not part of ECMAScript)
#
[LewisCowles]
yeah it'll be some extension API possibly not fully exposed to JS VM
#
[LewisCowles]
In this case I may just serve text
#
Zegnat
spec, so the input->output is consistently the same even if not what you expected.
#
Zegnat
The parse errors I linked there almost all have specced way to silently recover build into the spec. Because browsers never hard exit on HTML parsing these days. (Unlike how they used to stop parsing XHTML previously on the slightest syntax error). So whenever you are seeing inconsistencies between input string and output DOM it is almost always because some error got handled. And these will be consistently handled, they are part of
#
Zegnat
HTML is interesting this way, hehe
#
[LewisCowles]
the string is coming from DOM
#
[LewisCowles]
that is the most frustrating part. I'm feeding the serpent it's own tail
#
Loqi
Zegnat has 22 karma in this channel over the last year (67 in all channels)
#
[LewisCowles]
you are a lot more patient, forgiving and understanding than I feel right now
#
Zegnat
I have already been where you are several times ;) Sometimes it meant hopping over to #whatwg to figure out what the spec meant, and sometimes it just meant pushing on
#
Zegnat
I am not sure why output from DOM into the parser again would lead to a different tree, but I haven’t studied that part too much lately and do not honestly feel for digging into that one right now, haha
#
sknebel
in the same place in the tree?
#
sknebel
context can play a role there too
#
[LewisCowles]
sknebel I'm literally taking the whole document and trying to dump it into something I can use the same API's on without visual effects so html node outerHTML, into a new parser
#
[LewisCowles]
it fails to re-construct itself silently
#
[LewisCowles]
but I'm setting fire to that work now. I'll just mutate the DOM and refresh
#
[LewisCowles]
it at least is simple and easy to reason about
#
[LewisCowles]
the artifact of that has less moving parts so may be more forgiving
#
[LewisCowles]
really a frontend hack is all this has been that I've spent way too long hacking / exploring
#
[LewisCowles]
I know I could I frame and postMessage
#
sknebel
ah, given the snippet above it would parse the document as if placed into the HTML body? that sounds like it'd break in some way, yes
#
sknebel
but I'm pretty out of my depth when it comes to DOM/JS stuff
#
Zegnat
If you want a copy of HTML to work on, why not just go with: const newHTML = document.documentElement.cloneNode(true)
#
Zegnat
newHTML will not be rendered in the browser, but gives you a full clone of the current DOM tree
#
Zegnat
Any modifications you make to that cloned tree will not show up on the live render until you chose to swap it (or part of it) in
#
Zegnat
I guess I do not understand why you are going DOM => String => DOM
#
aaronpk
Oh now I remember what I was trying to do on my website yesterday... somehow Sign In with Apple broke so I can't log in right now
#
[LewisCowles]
Zegant the answer to that was not locating `document.documentElement.cloneNode(true)`
#
[LewisCowles]
ha TBF I've never come across document.documentElement before either
#
Zegnat
Just testing from console, this works for me:
#
Zegnat
[...newHTML.getElementsByTagName('a')].forEach(a => a.parentNode.removeChild(a))
#
Zegnat
document.replaceChild(newHTML, document.documentElement)
#
Zegnat
const newHTML = document.documentElement.cloneNode(true)
#
Zegnat
Hope this can help you out then, [LewisCowles] :D
#
[LewisCowles]
Oh I'm never updating the document itself btw
#
[LewisCowles]
the point of cloning is to only need the outerHTML when writing into a zip file
#
Zegnat
Hmm, you may also want to look at https://github.com/WebMemex/freeze-dry as that does a lot of live-website-to-static-string work
#
Loqi
[WebMemex] freeze-dry: Snapshots a web page to get it as a static, self-contained HTML document.
#
Zegnat
I use that when I archive content from the web
#
Zegnat
It solves a lot of nasty other problems, like how you will not get the DOCTYPE string when you grab the outerHTML of the documentElement (the <html> element)
#
[LewisCowles]
I solved the doctype in an evil way
#
[LewisCowles]
I concatenate a const
#
[LewisCowles]
allocation hell
#
[LewisCowles]
but so is the way I'm cleaning filenames
#
[LewisCowles]
I'll look to iterate using freeze-dry next
#
Zegnat
I run it inside a headless Chromium instance for any URL I throw at it, thus being able to run my own web archiver of links. Code here, though I offer no support running it https://github.com/Zegnat/node-beanstalkd-web-archiver
#
Loqi
[Zegnat] node-beanstalkd-web-archiver: Worker that creates static DOM dumps of web pages for archival purposes.
#
[LewisCowles]
this isn't a straight "archiving" task though
#
[LewisCowles]
I won't accept data URI's either
#
[LewisCowles]
it's why I went the zip route
#
[LewisCowles]
I can build a whole filesystem
#
[LewisCowles]
I may use it to see about a whole site export. That is a pain point although I doubt I'll ever use it
#
Zegnat
Yep, zip is definitely viable too. I like this way because I just end up with a single HTML file that I can open on any machine in any browser. Or simply rehost immediately. Worth the extra data-uris to me
#
[LewisCowles]
some of the push-back on data URI's is that there are size limits. Is it still 64kb?
#
[LewisCowles]
My page weight is circa 1MB
#
[LewisCowles]
as I iterate, I hope to chop more off of that as it's frankly a little disturbing
#
[LewisCowles]
if it works for you it's very cool in any case
#
[LewisCowles]
that 1MB is for a single card kanban with a cover
#
[LewisCowles]
a png cover
#
[LewisCowles]
I think if I use cover images, I'd like to use gif's
#
[LewisCowles]
or some on-hover gif play thing
swentel and nickodd joined the channel
#
aaronpk
:sigh: time to disable my payment page until i can figure out some way to prevent people from testing stolen credit cards
#
[LewisCowles]
scammers--
#
Loqi
scammers has -1 karma over the last year
#
aaronpk
new plan
#
aaronpk
i'm going to make a new "payment request" post type :D
#
aaronpk
aka invoice
#
aaronpk
so if I do need someone to pay me, I can make that post, send them the link, then the post can disable the payment form after it's paid
#
Zegnat
Did you ever get any pointers back from Stripe, aaronpk? Or is this just how it is
#
aaronpk
they were...not super helpful
#
aaronpk
well, they were helpful in that they very quickly refunded all the fees
#
aaronpk
they suggested enabling the rate limiting feature in Stripe Radar
#
aaronpk
but Radar is an additional product that costs money
#
aaronpk
they also said that adding a captcha usually deters people from this kind of card testing
#
aaronpk
they also said i should enable the zip code verification rule, but again that's only available with Stripe Radar
#
aaronpk
ah I misunderstood the pricing of Radar when I looked last, it looks like it's only an additional 2¢ per transaction, so maybe i should do that
indier joined the channel
#
aaronpk
but, here's a reason i think neither of these solutions will actually fix it...
#
[LewisCowles]
I think they may be able to waive the cost
#
[LewisCowles]
> per transaction In addition to payment processing fees.
#
[LewisCowles]
> *Waived* for accounts with standard 1.4% + 20p pricing
#
aaronpk
looks like that's different in the US
#
aaronpk
oh it's barely different pricing
#
aaronpk
i need the "Radar for Fraud Teams" one
#
aaronpk
my account already has "Radar’s machine learning" enabled, which is blocking some of the charges already, but that one doesn't give you the customizable settings like rate limiting
[jgmac1106] joined the channel
#
aaronpk
so i just got a text message from someone whose card was charged last night, asking what the charge was for. I explained the situation, and they said that this is an apple card that they barely use, except that yesterday they signed up for an auction website
#
aaronpk
i've never heard of it before, but it's called AuctionZip. i can't quite tell, but it looks like it's a marketplace of auctions rather than hosting auctions themselves
[tantek] joined the channel
#
[tantek]
Aaronpk, I’m curious if this means better to use “only” the W3C payments API rather than Stripe’s larger “library”
#
aaronpk
the two aren't mutually exclusive
#
aaronpk
the W3C payments API is really just a fancy way to collect a credit card number, which actually isn't something most people should be doing at all
#
[tantek]
aha that’s why I was asking
#
[tantek]
It makes me wonder if that’s a fundamental flaw in the W3C api that should be reported
#
aaronpk
well it's useful for payment processors like stripe to implement
#
aaronpk
basically think of it as a better HTML form created specially for credit card and billing info that's implemented at the browser level instead of inside your page, but the result is the data is shared with the page using the API
#
aaronpk
so just like you need to be PCI compliant to collect credit card numbers in an HTML form, that doesn't change with the payments API
#
[tantek]
Well if it’s bad for webdevs (ie a footgun) that’s worth calling out
#
jacky
everytime I open the instagram app, I go straight to the photo editor
#
jacky
agh, not really #-dev
#
Zegnat
I guess it is great for webdevelopers who want to be collecting payment information? Just that most webdevelopers do not want that at all, because they want their payment processor to handle all that (and that way they do not need to have compliance with PCI etc)
GWG joined the channel
#
aaronpk
yes that's a good way to say it
#
aaronpk
i guess the one concern I would have about it is that it may make people think that suddenly collecting payment info is safe
#
[LewisCowles]
RE: Instagram from chat. The filters were maybe innovative when they came out, but I'm not sure that is true any more
[KevinMarks] joined the channel
#
[KevinMarks]
[LewisCowles] have you looked at web bundles? https://web.dev/web-bundles/
#
[LewisCowles]
[KevinMarks] I've not, but I want to upload mine over FTP
#
[LewisCowles]
well by filesystem. I should stop saying FTP
#
[LewisCowles]
RE: Instagram again, I think Snapchat filters are way more cutting edge
#
[KevinMarks]
I think web bundles work by filesystem too, Bluetooth is just an example
#
aaronpk
oh dear, now to decide what a payment request or invoice looks like in microformats so i can make a post type for it
#
[LewisCowles]
okay I just tried it [KevinMarks] it's not the same thing either
#
[LewisCowles]
learning about CBOR was a whole thing
#
[LewisCowles]
it is still faster than having meteorjs rebuild every single time I want to test changes
#
Zegnat
I like CBOR, wish more stuff went CBOR instead of JSON for data that is clearly meant to be machine-to-machine
#
aaronpk
wonders if he could model an mf2 payment request after the W3C Payment Request API
#
aaronpk
the spec is impossible to read
#
[LewisCowles]
this is going to be like webassembly, xml and javascript. It's going to grow in popularity and I'm going to hate it
#
aaronpk
hm this is a deeply nested JSON structure, that's not very friendly to microformats
#
[LewisCowles]
victory is mine. One teensy edit to do less and I have what I want / need
#
[LewisCowles]
• removed useless app-chrome & page elements
#
[LewisCowles]
• insert non-CSS dependent content instead of relying on title="" attributes
#
[LewisCowles]
• bundle to zip
#
[LewisCowles]
• be able to read in css disabled / text-mode browser
#
[LewisCowles]
I did have to use relative URL's and write weird DOM hacking scripts to patch HTML & CSS files to get CSS background's to become HTML entities
#
[LewisCowles]
• upload zip file
#
[LewisCowles]
I still have to fix some CSS so I'm not using `display: none;`
#
[LewisCowles]
I have no way to mark up all the h-cards I'm embedding in h-entry
#
[LewisCowles]
h-cards are not for authors, but assignees on tasks
#
[LewisCowles]
for now I just mark them up as h-card
#
aaronpk
payment request api is too much for this
#
aaronpk
looking at apps that let you send payment requests now
#
Zegnat
Oh, that is a great little gist, [LewisCowles]! Especially as it includes a focusable class that also seems tested!
#
[LewisCowles]
I need to check it'll work for what I'm doing, but in any case it'll hide text in a less sucky way
#
Zegnat
accessibility < [https://gist.github.com/ffoodd/000b59f431e3e64e4ce1a24d5bb36034 CSS for marking something screen reader only] including optional code for making it hidden but focusable
#
Zegnat
accessibility << [https://gist.github.com/ffoodd/000b59f431e3e64e4ce1a24d5bb36034 CSS for marking something screen reader only] including optional code for making it hidden but focusable
#
Loqi
ok, I added "[https://gist.github.com/ffoodd/000b59f431e3e64e4ce1a24d5bb36034 CSS for marking something screen reader only] including optional code for making it hidden but focusable" to the "See Also" section of /accessibility https://indieweb.org/wiki/index.php?diff=69687&oldid=68968
#
[LewisCowles]
hopefully upstream wants some of these changes
[mapkyca] and [grantcodes] joined the channel
#
[grantcodes]
I have 2 bank accounts that accept payments via specials urls. One generates random looking urls and another uses my username + value in the url so it's easy to generate
#
aaronpk
that's like the cash.me and paypal.me links right? they are not a specific request, just a generally available payment link?
#
aaronpk
i'm going to test this new payment request post type by sending [kevinmarks] a request since he still owes me from september :)
#
[grantcodes]
One generates a random link that is specific. But the other (that I use on my site) is generic.
#
aaronpk
specific random link for a single request?
#
[grantcodes]
But because it's directly to the bank, they handle card transactions and there are no fees
gRegorLove joined the channel; nickodd left the channel
#
[KevinMarks]
Uh oh, I do?
#
aaronpk
from xoxo i guess? i found the imessage i sent
#
[KevinMarks]
Ah, I don't tend to receive imessages. Technically they're on my mac, but I just ignore the OS notifications there
#
[KevinMarks]
So, yes, let's do a test case.
#
aaronpk
this is quickly turning into a design problem
#
[KevinMarks]
Also I was using a throwaway sim at xoxo, so if it did map to that phone # it may not have worked either
#
aaronpk
first draft of what these posts are going to look like in a list https://media.aaronpk.com/2020/04/file-20200426111239-2746.png
#
aaronpk
then when you click it, it'll show the different payment options
GWG joined the channel
#
[KevinMarks]
No https for me
#
aaronpk
oh right
#
aaronpk
kinda want to make emoji large if that's the only text in the post, like slack and imessage
OlyaAbram joined the channel
#
aaronpk
when stripe redirects back to my site, i can mark the post as paid
#
aaronpk
i'm sending out this post to all my activitypub followers
#
aaronpk
what happens if i delete a post mid-blast
#
aaronpk
cool, webmention sent!
#
Loqi
[Aaron Parecki] 🍺🥬🐟
KartikPrabhu, geoffo and [mapkyca] joined the channel
#
Zegnat
Re accidantally sending to too many people: what is the worst that could happen, someone picking up [KevinMarks]’ tab? ;)
#
aaronpk
Yeah haha
leg and [KevinMarks] joined the channel
#
[KevinMarks]
I like how you have a beer in your photo, as opposed to a was of money
leg joined the channel
#
[KevinMarks]
So what post type do I make to say I sent it?
manificattion10, mitchell, geoffo, [jgmac1106], gRegorLove_ and tomasparks joined the channel