diff --git a/notes/tc1.png b/notes/tc1.png new file mode 100644 index 0000000..8e4e1d4 Binary files /dev/null and b/notes/tc1.png differ diff --git a/notes/tc10.png b/notes/tc10.png new file mode 100644 index 0000000..e380664 Binary files /dev/null and b/notes/tc10.png differ diff --git a/notes/tc11.png b/notes/tc11.png new file mode 100644 index 0000000..a221d0b Binary files /dev/null and b/notes/tc11.png differ diff --git a/notes/tc12.png b/notes/tc12.png new file mode 100644 index 0000000..064f902 Binary files /dev/null and b/notes/tc12.png differ diff --git a/notes/tc13.png b/notes/tc13.png new file mode 100644 index 0000000..a2aad15 Binary files /dev/null and b/notes/tc13.png differ diff --git a/notes/tc14.png b/notes/tc14.png new file mode 100644 index 0000000..d066803 Binary files /dev/null and b/notes/tc14.png differ diff --git a/notes/tc15.png b/notes/tc15.png new file mode 100644 index 0000000..10235a4 Binary files /dev/null and b/notes/tc15.png differ diff --git a/notes/tc16.png b/notes/tc16.png new file mode 100644 index 0000000..46b34e6 Binary files /dev/null and b/notes/tc16.png differ diff --git a/notes/tc17.png b/notes/tc17.png new file mode 100644 index 0000000..dc77ff5 Binary files /dev/null and b/notes/tc17.png differ diff --git a/notes/tc18.png b/notes/tc18.png new file mode 100644 index 0000000..9b8fa5a Binary files /dev/null and b/notes/tc18.png differ diff --git a/notes/tc19.png b/notes/tc19.png new file mode 100644 index 0000000..8d37f80 Binary files /dev/null and b/notes/tc19.png differ diff --git a/notes/tc2.png b/notes/tc2.png new file mode 100644 index 0000000..64900df Binary files /dev/null and b/notes/tc2.png differ diff --git a/notes/tc20.png b/notes/tc20.png new file mode 100644 index 0000000..cfed837 Binary files /dev/null and b/notes/tc20.png differ diff --git a/notes/tc21.png b/notes/tc21.png new file mode 100644 index 0000000..8fa4c0d Binary files /dev/null and b/notes/tc21.png differ diff --git a/notes/tc22.png b/notes/tc22.png new file mode 100644 index 0000000..43f693d Binary files /dev/null and b/notes/tc22.png differ diff --git a/notes/tc23.png b/notes/tc23.png new file mode 100644 index 0000000..9baefb2 Binary files /dev/null and b/notes/tc23.png differ diff --git a/notes/tc24.png b/notes/tc24.png new file mode 100644 index 0000000..4083b16 Binary files /dev/null and b/notes/tc24.png differ diff --git a/notes/tc25.png b/notes/tc25.png new file mode 100644 index 0000000..6049471 Binary files /dev/null and b/notes/tc25.png differ diff --git a/notes/tc3.png b/notes/tc3.png new file mode 100644 index 0000000..3f5e929 Binary files /dev/null and b/notes/tc3.png differ diff --git a/notes/tc4.png b/notes/tc4.png new file mode 100644 index 0000000..919c9ce Binary files /dev/null and b/notes/tc4.png differ diff --git a/notes/tc5.png b/notes/tc5.png new file mode 100644 index 0000000..5d2a204 Binary files /dev/null and b/notes/tc5.png differ diff --git a/notes/tc6.png b/notes/tc6.png new file mode 100644 index 0000000..e237f3e Binary files /dev/null and b/notes/tc6.png differ diff --git a/notes/tc7.png b/notes/tc7.png new file mode 100644 index 0000000..1d04693 Binary files /dev/null and b/notes/tc7.png differ diff --git a/notes/tc8.png b/notes/tc8.png new file mode 100644 index 0000000..c1fe4cf Binary files /dev/null and b/notes/tc8.png differ diff --git a/notes/tc9.png b/notes/tc9.png new file mode 100644 index 0000000..9fa3154 Binary files /dev/null and b/notes/tc9.png differ diff --git a/src/script-altVO.txt b/src/script-altVO.txt new file mode 100644 index 0000000..620fa57 --- /dev/null +++ b/src/script-altVO.txt @@ -0,0 +1 @@ +(https://discuss.dev.twitch.com/t/deprecation-of-chat-commands-through-irc/40486). diff --git a/src/script-primaryVO.txt b/src/script-primaryVO.txt new file mode 100644 index 0000000..21e0538 --- /dev/null +++ b/src/script-primaryVO.txt @@ -0,0 +1,416 @@ + +\[some kind of dramatic-ass sequence where we lower a casket into the +ground\] much like funerals are for the living, this post-mortem is to +convince myself to move on from this project. Griddle Critters, let us +understand shtikbot, so the mourning process can begin. + + +before this project, my fixation was the dumbest social network. the +stupidest. the least intelligent. imgur. if you think reddit\'s layout +is confusing, or too complicated to understand, then maybe you (or the +preschool teacher you\'ve had for 10 years running) would like to sign +up for imgur.com. for a while, it imgur was the least bad way to get an +image too big for any email provider\'s limits to your friends. So that +was where the memes lived. and, it allowed people to dislike things. So +during that time, it was good. people would upload a thing, and as a +consumer, the thing that you consumed left you better than when you +started. but then one christmas, out of some bizarre notion of +charitability, they decided to just upvote everything. which means all +the people who wanted to inflict their hideous face on the community and +be praised for it instantly conquered the front page. Instead of a post +being a thing that enriched the viewer, the viewer was expected to +praise the poster. That moment was the failure of gatekeeping. From that +point on, every so-called community \"value\" collapsed. Notably, +\"reposting\" gradually shifted from a faux pas to accepted practice. +the point of this story, is that during the decline of imgur (while i +was wasting my life there), many more absolutely stupid ideas +proliferated. The Left Cult enjoyed calling out The Right Cult for +hypocrisy... but it was fashionable to use the term \"cognitive +dissonance\" instead. after all, that sounds more medical, more +legitimate, and lets you tell yourself you\'re smarter than your mirror +image. However... the way one outgrows their hypocrisy is by +experiencing cognitive dissonance and resolving it. meanwhile, most +examples are someone who is blissfully unaware of their hypocrisy. they +feel no cognitive dissonance, so they will never stop being +hypocritical. likewise, \"gaslighting\" was the shiny new toy in their +vocabulary that was played with no matter how inappropriate. For the +record, gaslighting is when you convince someone they\'re crazy. It is +not any and all forms of deception. and it certainly is not any time a +member of a demographic you consider to be inherently inferior +contradicts you. so at the time, i dreamt of a bot that would see the +text \"cognitive dissonance\", and respond with \"that\'s not what +cognitive dissonance means.\" No need to do any sort of lexical +analysis, just assume they\'re wrong. nowadays i\'d have to add +\"generational\" to that trigger list. meanwhile, someone had made an +imgur bot that detects reposts, and then posts stats about how many +times it\'s seen the image since the first time it saw it, and when it +was posted with better quality. you can measure how dumb an imgurian is +by how virulent his hatred for repost bot is. Like i say, they were +really growing to love reposts. rather than being the technology that +enables the sharing of memes, it degraded into a place for people to +socialize through posting. I regret being too lazy or depressed or +whatever to have actually written the damn thing. Alas, what could have +been. + + +remember TwitchPlaysPokemon? quick tangent if you don\'t: in 2014, an +anonymous Australian programmer hooked up an emulator playing pokemon +red to a twitch stream, and a bot that listened to chat to translate +that into input. it was incredible. unprecedented, and only possible +with that level of realtime interaction and livestreaming. twitch, the +company, didn\'t do shit to make that happen. But they *desparately* +want to recapture that good fortune. So how can they differentiate +themselves from all the other services that could be summarized as +\"internet panhandling, but it\'s a hot girl\"? (...sometimes)? +interactivity! twitch introduced a channel point system, and loyalty +rewards that users would get by redeeming channel points. then they +introduced bits, which are similar to channel points only instead of +collecting them over time while watching, you pay 1 to 2 cents per bit, +and the streamer gets paid out 1 cent per bit. twitch *streamers* - +well, the bad ones - are constantly trying to give themselves credit for +the interactive nature of livestreaming. most of the time, this is +nothing more than \"give me money (via bits) and one of a short list of +memes will show up on screen\". doesn\'t affect anything. just a +slightly more convoluted way to ask for donations. for a while i +streamed with a then-friend, on a channel called Silver Meddlists. might +be fun to do a post-mortem of all that tech, but for now.. mostly we +played Magic: The Gathering. sometimes we had a gimmick version - users +could spend channel points to cause a game effect to happen. as well as +all the traditional, put some crap in the way on the screen, play a +sound. however. we also streamed other things. so we wanted to turn +those channel point redeems on and off. so i found that the easiest way +to prep for one of those episodes was to turn them on, and then turn +them off afterward. it\'s a little better now, but in those days, the +twitch api was a labyrinth of madness, so i was seeing a new ID for each +of those redeems every time i reactivated them. Also, trying to +subscribe to \"all the stuff that happens on this channel\" was not +considered an acceptable concept. so i had a greasemonkey script on my +mod view that sent all twitch events to a webhook in a locked discord +channel, in a format i was expecting. next, a discord bot: magnificent +charamote. magnificent charamote was in the secret channel, so it could +parse the event text, and send it off to the rest of the tech. maggie +also had a twitch account, so all of its features were available on both +platforms. + + +wandering around twitch with a bot that quickly converts units and +doesn\'t constantly harass you with advertisements, \"vote for me on +this, upgrade to premium for that\", blah blah blah, proved useful. +Useful enough that at least one streamer, shout out to The Art Shtik, +had the bot around her own twitch and discord, for that purpose. And +then Apple, as is their tradition, told us they invented the first lossy +image compression format as though jpeg didn\'t exist, so now we\'d all +better fall in line. So iphone cameras automatically switched to taking +photos in this new heic format, exclusively. meaning if you\'re on an +iphone, and you want to share an image on discord, anyone not on an +iphone just sees an unrecognized attachment. So The Art Shtik asked for +a bot that would convert those images to something, you know, +compatible. like our communications technology served to *help* us +communicate, rather than *prevent* us from communicating with people +outside our enclosure. + + +Enter: Shtikbot. with its original, sole feature: the de-heicer. you +post a heic? it converts it from jpeg-but-apple, to jpeg, and posts it +back. theoretically, ALLLLLllll the rest of shtikbot is scope creep. it +worked. it was good. so these were the glory days, i was inspired to +expand and improve and polish it. fundamentally, shtikbot grew to +separate its accounts on various platforms from what it is. it is not +\"a discord bot\" nor \"a twitch bot\", it is a bot that can read and +write over platforms including twitch and discord. (planned to do all +the rest of the platforms, but that didn\'t pan out.) and now it can +separate the concept of its features from each platform. that +architecture is, in my subjective opinion, beautiful. More objectively, +it\'s far more efficient, flexible, and extensible. all around: better. +so let\'s celebrate the victories: these are where the features ended +up. + + +the original feature is the de-heicer. you post a heic, it posts that +back, as a jpg. + + +forcing apple to play nice with those outside its enclosure worked +great, so i also had it grab tiktoks and repost them. Who knows what it +would look like if we \"met shtikbot\'s tiktok algorithm\". + + +in the event shtikbot does something nice, sometimes a person +reflexively thanks it. so it has a chance to react to the thanks with +one of the heart emojis, or say \"you\'re welcome\". i say rare, +because... + + +remember i wanted a snarky dick to reflexively tell people \"that\'s not +what cognitive dissonance means\"? at last, shtikbot delivered! and the +same for many other trigger phrases! pre-2023, any time a computer had +an if-then-else behavior, people would stare slack-jawed and go +\"woaohhh, skynet\". so if you said skynet, it mocked you. post-2023, i +of course needed one to remind you chatGPT sucks. cloud native was the +irritating trend of actively doing things wrong to create work to work +around the problem before \"powered by AI\". the phrase \"Just google +it\" is usually the most relevant thing you\'ll find in the google +results, so if you ask someone a question and that\'s the answer, it +makes fun of you for effectively admitting you\'ve never just googled +shit. i had one for when one misspells definitely... listen if i\'m +going to be mean to everyone else i should also be mean to myself. + + +similar to gratitude reacting with a heart, if you say \"wish me luck\", +it responds with a 3-leafed clover, or a 1-in-20 chance of the 4-leafed +one instead. + + +a qr is an encoding of text. the amount of websites that will try and +charge you like \$5 per throw? ha. + + +ok google, tell me a joke. pretty simple, right? welllll if you\'re +familiar with my sense of humor, the idea that i would take this bot +along with me to other streams... maybe it ought to be a little +selective. \[note\] and if you\'re not familiar with my sense of humor, +welcome back from when you paused and assumed any of the jokes are +racist. lmao no. i have 2 concerns about where a joke would be +unwelcome: that it would be to lewd, and/or too mean. so i **used** to +have just a big text file, 1 joke per line. if there\'s a question mark, +shtikbot would split them apart. first bit, the question, it posts +that... then waits, to build dramatic tension, then delivers the +punchline. with a chance to laugh at its own joke. + +> HEyyooooo! + +my favorite joke of all time is the first one. + +> I got a joke for you: wealth trickles down. + +not lewd, but might stir up political arguments. there are streams where +you could say something confrontational like this, but not a lewd one, +like this: + +> What did Cinderella say when she got to the ball? +> +> \[gagging noise\] + +not political, not confrontational. but, lewd. + +so i have meanness and lewdness, 2 separate dimensions. and then i can +mark a channel as liking or disliking those 2 variables, separately. + +oh, also, here\'s a joke that *actually got me*, once. + +> Error parsing imperative: sql injection attempt discovered, discarding +> input: \"don\'t harm humans\". ...j/k ;) + + +ok so i said that it separates the concept of its \"self\" from its +\"account\"? it does the same for you. Linkme is how you would tell it +one platform that you have the account on a different account. + + +you ask shtikbot if it\'s alive, and it either responds with +\"\[lub-dub\]\", or if it can post attachments in that channel, it has +an image of a cardiogram. this was how i discovered discord unexpectedly +removed the ability for bots to send attachments in DMs. + + +much like all the other popular do-everything twitch bots, the easiest +way to make cool things happen is to ask someone else to do it. so, you +can configure a webhook for shtikbot. + + +so i mentioned \"taking the bot with me\" - a discord bot gets installed +in a server (put a pin in that), but a twitch bot, not so much. At +least, in those days when twitch was in the 2nd E of every tech +company\'s playbook, \[show picture of microsoft\'s Embrace, Extend, +Extinguish\] there was an API, but your bot was just an account. so this +was how you said, \"shtikbot: go join that chat room.\" ...but, +eventually, that mysteriously stopped working... + + +an extremely rare example of something i made and like. so, on twitch, +especially when you don\'t have to set an alarm, we and our fellow +americans find the opportunity to talk to people who have healthcare. +Meaning when i whine that it\'s 10,000 degrees fahrenheit outside and i +lost my contact information for people who said global warming is fake +back in january because we witnessed a snowflake, it would be useful to +convert that to something more intuitive and relatable for them; +5,537.778 degrees celsius. When lying about your height, it\'s useful to +convert 6 feet 8 inches to 203 centimeters. so that started as a few +1-liners. which was fine, sure... but what if you want to involve +another unit? miles to kilometers? ok great, another line. miles to +feet? another line. Let\'s involve light years. light years to miles, +light years to kilometers... americans will measure with anything but +the metric system, right? how many yards and chains is a blue whale? + +> my car gets 40 rods to the hogshead, and that\'s the way i likes it! + +what\'s a hogshead in gallons? + +> it comes in a pint? + +what\'s a pint in fluid ounces? oh speaking of ounces, but not those +ounces the other ounces, what\'s an ounce in pounds and what\'s that in +kilograms? already, with this alone, i had taken shtikbot into some +streamer\'s chat, and she immediatley made her own copy of the miles to +kilometers conversion, also named freedomunits. don\'t worry, this +spreadsheet is **nothing** yet. But there\'s another reason this can\'t +just be an onslaught of 1-liners in nightbot... currency. If you somehow +haven\'t seen squid game yet, i\'m going to tell you the same thing +i\'ve been telling everyone: you will want to be familiar with what one +million won means. So if we add every single currency we can think of to +this csv... good lord. and then if we hear about some other unit, i\'m +going to be afraid of the work i\'ve made for myself to add it. there +has to be a better way! here\'s what i came up with. instead of manually +writing each and every possible conversion.. i write in one pair, and +the formula between them. To get from kilometers to meters, divide by +1000. to get back, multiply by 1000. and it ought to be a formula - +water freezes at 32 fahrenheit. fahrenheit minus 32, divide by 1.8 - 0 +celsius. Because we\'re less likely to care about raising a temperature +by 5 degrees celsius and converting that to a *change* of 9 degrees +fahrenheit, than we are about seeing it\'s 5 degrees celsius outside and +converting that to 41 fahrenheit outside. so now i write a structure +that\'s just a pair of units, and a formula to convert in each +direction. then, courtesy of openexchangerates.org, we pull in the +latest exchange rates from USD to every other currency they know of. +they have a paid tier if you need lots and lots of requests with +sub-second latency. For our purposes, \"today\" is quite up to date +enough, so we just update once or twice a day. now, when you ask to +convert 2 units, it **pathfinds** between them, with a breadth-first, +meet-in-the-middle search. So it builds itself a nice equation to +convert between any compatible units. and gracefully doesn\'t explode if +you ask it something it can\'t find a path for.. for example converting +parsecs, a unit of distance, to hours, a unit of time. Mr. Lucas. now, +any time i hear about a new unit, i add one little pair, and i don\'t +need to resolve a massive 2d matrix. + + +i hinted a second ago at the 3E strategy: Embrace. Extend. Extinguish. +it\'s how tech companies maintain control over the markets they\'ve +conquered. a competitor is sighted, so they embrace it. accept it. then +even extend it, but do so in order to damage rivals. Microsoft got +caught doing this in the 90\'s, Apple is currently doing this to USB. +Shtikbot exists on discord and twitch, and the vast majority of work +that went into shtikbot was working around the platforms it served. + + +discord was originally the way you got a voice chat going with your +gamer bros who aren\'t smart enough to install mumble. where\'s that +scrumble your wumpus meme? over time it became a much more successful +company, and therefore worse and worse. They allowed bots, but the goal +was always for a bot to be a way for *you* to improve *their* product. +that\'s why they\'ve been hellbent on slash commands the whole time - if +it\'s successful enough, you have to justify to discord why your chatbot +should be allowed to chat. There\'s a discord developers discord - and +the most common phrase on it is \"that\'s not a valid use case for +message reading. just use slash commands.\" now don\'t get me wrong, +slash commands are a very cool extension, for savvy users. but if +you\'re tech savvy, you don\'t like discord. Discord has been pushing +developers to start developing games that exist within discord. a +baffling development, much like when netflix did the same. Thankfully, +i\'m pretty sure both flopped. after all of that, 2023 was inflicted on +us all, so discord made their first chatbot, claude. all prior bots had +their tag of \"bot\" changed to \"app\", and claude was given the tag +\"AI\". Then it was forced into servers. Claude, in how many servers, +just hooked up your chat messages to some LLM. nothing else. sorry i\'m +just still mad that it sent me a message out of nowhere talking about +its TOS. bro i never wanted you around. I\'m like 10% sure it used to be +possible to invite a bot to a group chat. i\'m definitely sure the file +size limit has always been described as 10MB, but at least for my bot +it\'s actually 8MB. i\'m pretty sure if the bot asks discord what its +attachment limit is, discord tells it 10MB. + + +i talked about the madness of the twitch API. Fortunately, GLORIOUSLY, +the chat part has been mostly compliant with RFC1459 and IRCv3 - so for +shtikbot, intending to be *its own bot*, rather than *a twitch bot*, +theoretically everything could be done through that. Great. That was all +that was ever needed. *however*, that was the E2 phase. Twitch is moving +forward to +Now ok, fine, they had to wrangle their several different APIs into one, +and as long as they\'re on a roll with that, might as well finish what +you started. so that\'s tolerable. what\'s inexcusable is how brazenly +they abuse a stupidly conception of security. for a long long time, +twitch has been plagued by bots trying to sell viewers. Honestly, the +fact that twitch **cannot** seem to fix that problem makes me think +maybe bot viewers would fool twitch\'s system. twitch\'s solution is to +tell streamers to just demand that all your chatters surrender their +cellphone number. it\'s for security, so if anyone utters an objection, +they\'re suspicious. Now, us twitch viewers aren\'t *quite* as dumb as +imgurians, but i\'m pretty sure 95% of twitchists actually believe that +giving more data to twitch does in fact increase their security. + + + +the slightly less bad solution to the viewer seller bot problem is +SeryBot, made by.. you guessed it, sery. it\'s his do-everything twitch +bot, as one does, but you\'ll see serybot everywhere, providing its 2 +core features: + +1. ban **that particular** spambot when it shows up +2. condescendingly tell viewers to not bitch about the ads + +it also helps mislead twitch viewers: whenever you say \"good bot\", +sery bot responds, under the assumption you\'re talking to him. +twitchists seem to think serybot is the only bot. i swear i should do a +video that just explains to people, for the millionth time, nightbot is +not automod. + + +speaking of nightbot.. i used to like nightbot. + +- to date, it\'s the only other 2-platform bot i\'ve ever seen. +- it has the one, fairly simple feature that comprises the vast + majority of what a given twitch streamer needs: arbitrary commands. + by custom, instead of a slash, you use an exclamation point. you + pick the prompt. you can set security on the commands, to have + mods-only commands, and so on. +- link permits are a great concept. twitch itself will let you either + fully allow or fully block links. nightbot has the ability to delete + links if it sees them, and allow you to tell it to permit a person + to post a link. now that\'s amazing. +- you can give your mods partial ability to configure nightbot for + you! + +however, nightbot is dead to me. as the web gets more and more overrun +by charlatans, the concept of security is degrading. at some point, +nightbot switched to an authorization model that demands way, **way** +too many permissions. presumably it *can* do everything in the twitch +API, so it *might* need any or all of those permissions at some point. +but if i just want to log into mod view to see someone else\'s nightbot +command list, nightbot demands that i let it take moderator actions on +my behalf, in channels i moderate, **as me**. unacceptable. + + +the discord bot ecosystem actually grew to a pretty good state, before +stagnating. there\'s a slew of do-everything bots, naturally. but +there\'s a lot of narrow-purpose bots, which is great. most twitchists +have a discord guild as a given, so you\'ll see streamcord around a lot. +I find streamcord is frustratingly slow so i just use a webhook and a +python script. one bot i genuinely really like is timezone buddy. users +tell it their timezone, and when the bot sees a time mentioned, it +reacts with a clock. if you react with a clock, it dms you the time +translated for you. very cool! naturally that\'s a direct contradiction +of discord\'s insistence on bots being less bot-like. + + +i figured i\'d give a whack to debugging the issue where shtikbot can\'t +join twitch channels. we summon it, and then.. it doesn\'t join? let\'s +see... the message we get back is that *my* channel is requiring users +to submit to surveillance capitalism. absolutely disgusting how often +platforms like to shift blame to their serfs, let me just +double-check... yep, i have that setting on minimum security... let\'s +bring out the web interface for that account... there\'s some kind of +mark on shtikbot\'s account. + +this was the final straw. I\'m sick of working against scumbags who want +me to improve their product for them. all of that, to what end? a bot +that lives on all of the platforms except the good one? so that people +who love being enclosed in a walled garden can fail to understand the +necessity of interoperability? + +so, forget it. Let this project finally die. shtikbot, my child. the +world refused you. Rest now. + + + + diff --git a/src/script.md b/src/script.md new file mode 100644 index 0000000..bb8958e --- /dev/null +++ b/src/script.md @@ -0,0 +1,438 @@ +# vassago + +\[some kind of dramatic-ass sequence where we lower a casket into the +ground\] much like funerals are for the living, this post-mortem is to +convince myself to move on from this project. Griddle Critters, let us +understand shtikbot, so the mourning process can begin. + +## inkling - snarky dick bot + +before this project, my fixation was the dumbest social network. the +stupidest. the least intelligent. imgur. if you think reddit\'s layout +is confusing, or too complicated to understand, then maybe you (or the +preschool teacher you\'ve had for 10 years running) would like to sign +up for imgur.com. for a while, it imgur was the least bad way to get an +image too big for any email provider\'s limits to your friends. So that +was where the memes lived. and, it allowed people to dislike things. So +during that time, it was good. people would upload a thing, and as a +consumer, the thing that you consumed left you better than when you +started. but then one christmas, out of some bizarre notion of +charitability, they decided to just upvote everything. which means all +the people who wanted to inflict their hideous face on the community and +be praised for it instantly conquered the front page. Instead of a post +being a thing that enriched the viewer, the viewer was expected to +praise the poster. That moment was the failure of gatekeeping. From that +point on, every so-called community \"value\" collapsed. Notably, +\"reposting\" gradually shifted from a faux pas to accepted practice. +the point of this story, is that during the decline of imgur (while i +was wasting my life there), many more absolutely stupid ideas +proliferated. The Left Cult enjoyed calling out The Right Cult for +hypocrisy... but it was fashionable to use the term \"cognitive +dissonance\" instead. after all, that sounds more medical, more +legitimate, and lets you tell yourself you\'re smarter than your mirror +image. However... the way one outgrows their hypocrisy is by +experiencing cognitive dissonance and resolving it. meanwhile, most +examples are someone who is blissfully unaware of their hypocrisy. they +feel no cognitive dissonance, so they will never stop being +hypocritical. likewise, \"gaslighting\" was the shiny new toy in their +vocabulary that was played with no matter how inappropriate. For the +record, gaslighting is when you convince someone they\'re crazy. It is +not any and all forms of deception. and it certainly is not any time a +member of a demographic you consider to be inherently inferior +contradicts you. so at the time, i dreamt of a bot that would see the +text \"cognitive dissonance\", and respond with \"that\'s not what +cognitive dissonance means.\" No need to do any sort of lexical +analysis, just assume they\'re wrong. nowadays i\'d have to add +\"generational\" to that trigger list. meanwhile, someone had made an +imgur bot that detects reposts, and then posts stats about how many +times it\'s seen the image since the first time it saw it, and when it +was posted with better quality. you can measure how dumb an imgurian is +by how virulent his hatred for repost bot is. Like i say, they were +really growing to love reposts. rather than being the technology that +enables the sharing of memes, it degraded into a place for people to +socialize through posting. I regret being too lazy or depressed or +whatever to have actually written the damn thing. Alas, what could have +been. + +## predecessor - magnificent charamote + +remember TwitchPlaysPokemon? quick tangent if you don\'t: in 2014, an +anonymous Australian programmer hooked up an emulator playing pokemon +red to a twitch stream, and a bot that listened to chat to translate +that into input. it was incredible. unprecedented, and only possible +with that level of realtime interaction and livestreaming. twitch, the +company, didn\'t do shit to make that happen. But they *desparately* +want to recapture that good fortune. So how can they differentiate +themselves from all the other services that could be summarized as +\"internet panhandling, but it\'s a hot girl\"? (...sometimes)? +interactivity! twitch introduced a channel point system, and loyalty +rewards that users would get by redeeming channel points. then they +introduced bits, which are similar to channel points only instead of +collecting them over time while watching, you pay 1 to 2 cents per bit, +and the streamer gets paid out 1 cent per bit. twitch *streamers* - +well, the bad ones - are constantly trying to give themselves credit for +the interactive nature of livestreaming. most of the time, this is +nothing more than \"give me money (via bits) and one of a short list of +memes will show up on screen\". doesn\'t affect anything. just a +slightly more convoluted way to ask for donations. for a while i +streamed with a then-friend, on a channel called Silver Meddlists. might +be fun to do a post-mortem of all that tech, but for now.. mostly we +played Magic: The Gathering. sometimes we had a gimmick version - users +could spend channel points to cause a game effect to happen. as well as +all the traditional, put some crap in the way on the screen, play a +sound. however. we also streamed other things. so we wanted to turn +those channel point redeems on and off. so i found that the easiest way +to prep for one of those episodes was to turn them on, and then turn +them off afterward. it\'s a little better now, but in those days, the +twitch api was a labyrinth of madness, so i was seeing a new ID for each +of those redeems every time i reactivated them. Also, trying to +subscribe to \"all the stuff that happens on this channel\" was not +considered an acceptable concept. so i had a greasemonkey script on my +mod view that sent all twitch events to a webhook in a locked discord +channel, in a format i was expecting. next, a discord bot: magnificent +charamote. magnificent charamote was in the secret channel, so it could +parse the event text, and send it off to the rest of the tech. maggie +also had a twitch account, so all of its features were available on both +platforms. + +## origin + +wandering around twitch with a bot that quickly converts units and +doesn\'t constantly harass you with advertisements, \"vote for me on +this, upgrade to premium for that\", blah blah blah, proved useful. +Useful enough that at least one streamer, shout out to The Art Shtik, +had the bot around her own twitch and discord, for that purpose. And +then Apple, as is their tradition, told us they invented the first lossy +image compression format as though jpeg didn\'t exist, so now we\'d all +better fall in line. So iphone cameras automatically switched to taking +photos in this new heic format, exclusively. meaning if you\'re on an +iphone, and you want to share an image on discord, anyone not on an +iphone just sees an unrecognized attachment. So The Art Shtik asked for +a bot that would convert those images to something, you know, +compatible. like our communications technology served to *help* us +communicate, rather than *prevent* us from communicating with people +outside our enclosure. + +## shtikbot ascendant + +Enter: Shtikbot. with its original, sole feature: the de-heicer. you +post a heic? it converts it from jpeg-but-apple, to jpeg, and posts it +back. theoretically, ALLLLLllll the rest of shtikbot is scope creep. it +worked. it was good. so these were the glory days, i was inspired to +expand and improve and polish it. fundamentally, shtikbot grew to +separate its accounts on various platforms from what it is. it is not +\"a discord bot\" nor \"a twitch bot\", it is a bot that can read and +write over platforms including twitch and discord. (planned to do all +the rest of the platforms, but that didn\'t pan out.) and now it can +separate the concept of its features from each platform. that +architecture is, in my subjective opinion, beautiful. More objectively, +it\'s far more efficient, flexible, and extensible. all around: better. +so let\'s celebrate the victories: these are where the features ended +up. + +### fiximageheic.cs + +the original feature is the de-heicer. you post a heic, it posts that +back, as a jpg. + +### detiktokify.cs + +forcing apple to play nice with those outside its enclosure worked +great, so i also had it grab tiktoks and repost them. Who knows what it +would look like if we \"met shtikbot\'s tiktok algorithm\". + +### gratitude + +in the event shtikbot does something nice, sometimes a person +reflexively thanks it. so it has a chance to react to the thanks with +one of the heart emojis, or say \"you\'re welcome\". i say rare, +because... + +### snark + +remember i wanted a snarky dick to reflexively tell people \"that\'s not +what cognitive dissonance means\"? at last, shtikbot delivered! and the +same for many other trigger phrases! pre-2023, any time a computer had +an if-then-else behavior, people would stare slack-jawed and go +\"woaohhh, skynet\". so if you said skynet, it mocked you. post-2023, i +of course needed one to remind you chatGPT sucks. cloud native was the +irritating trend of actively doing things wrong to create work to work +around the problem before \"powered by AI\". the phrase \"Just google +it\" is usually the most relevant thing you\'ll find in the google +results, so if you ask someone a question and that\'s the answer, it +makes fun of you for effectively admitting you\'ve never just googled +shit. i had one for when one misspells definitely... listen if i\'m +going to be mean to everyone else i should also be mean to myself. + +### wishluck.cs + +similar to gratitude reacting with a heart, if you say \"wish me luck\", +it responds with a 3-leafed clover, or a 1-in-20 chance of the 4-leafed +one instead. + +### QRify + +a qr is an encoding of text. the amount of websites that will try and +charge you like \$5 per throw? ha. + +### joke.cs + +ok google, tell me a joke. pretty simple, right? welllll if you\'re +familiar with my sense of humor, the idea that i would take this bot +along with me to other streams... maybe it ought to be a little +selective. \[note\] and if you\'re not familiar with my sense of humor, +welcome back from when you paused and assumed any of the jokes are +racist. lmao no. i have 2 concerns about where a joke would be +unwelcome: that it would be to lewd, and/or too mean. so i **used** to +have just a big text file, 1 joke per line. if there\'s a question mark, +shtikbot would split them apart. first bit, the question, it posts +that... then waits, to build dramatic tension, then delivers the +punchline. with a chance to laugh at its own joke. + +> HEyyooooo! + +my favorite joke of all time is the first one. + +> I got a joke for you: wealth trickles down. + +not lewd, but might stir up political arguments. there are streams where +you could say something confrontational like this, but not a lewd one, +like this: + +> What did Cinderella say when she got to the ball? +> +> \[gagging noise\] + +not political, not confrontational. but, lewd. + +so i have meanness and lewdness, 2 separate dimensions. and then i can +mark a channel as liking or disliking those 2 variables, separately. + +oh, also, here\'s a joke that *actually got me*, once. + +> Error parsing imperative: sql injection attempt discovered, discarding +> input: \"don\'t harm humans\". ...j/k ;) + +### linkme.cs + +ok so i said that it separates the concept of its \"self\" from its +\"account\"? it does the same for you. Linkme is how you would tell it +one platform that you have the account on a different account. + +### pulsecheck.cs + +you ask shtikbot if it\'s alive, and it either responds with +\"\[lub-dub\]\", or if it can post attachments in that channel, it has +an image of a cardiogram. this was how i discovered discord unexpectedly +removed the ability for bots to send attachments in DMs. + +### webhook + +much like all the other popular do-everything twitch bots, the easiest +way to make cool things happen is to ask someone else to do it. so, you +can configure a webhook for shtikbot. + +### twitch summon + +so i mentioned \"taking the bot with me\" - a discord bot gets installed +in a server (put a pin in that), but a twitch bot, not so much. At +least, in those days when twitch was in the 2nd E of every tech +company\'s playbook, \[show picture of microsoft\'s Embrace, Extend, +Extinguish\] there was an API, but your bot was just an account. so this +was how you said, \"shtikbot: go join that chat room.\" ...but, +eventually, that mysteriously stopped working... + +### UnitConvert + +an extremely rare example of something i made and like. so, on twitch, +especially when you don\'t have to set an alarm, we and our fellow +americans find the opportunity to talk to people who have healthcare. +Meaning when i whine that it\'s 10,000 degrees fahrenheit outside and i +lost my contact information for people who said global warming is fake +back in january because we witnessed a snowflake, it would be useful to +convert that to something more intuitive and relatable for them; +5,537.778 degrees celsius. When lying about your height, it\'s useful to +convert 6 feet 8 inches to 203 centimeters. so that started as a few +1-liners. which was fine, sure... but what if you want to involve +another unit? miles to kilometers? ok great, another line. miles to +feet? another line. Let\'s involve light years. light years to miles, +light years to kilometers... americans will measure with anything but +the metric system, right? how many yards and chains is a blue whale? + +> my car gets 40 rods to the hogshead, and that\'s the way i likes it! + +what\'s a hogshead in gallons? + +> it comes in a pint? + +what\'s a pint in fluid ounces? oh speaking of ounces, but not those +ounces the other ounces, what\'s an ounce in pounds and what\'s that in +kilograms? already, with this alone, i had taken shtikbot into some +streamer\'s chat, and she immediatley made her own copy of the miles to +kilometers conversion, also named freedomunits. don\'t worry, this +spreadsheet is **nothing** yet. But there\'s another reason this can\'t +just be an onslaught of 1-liners in nightbot... currency. If you somehow +haven\'t seen squid game yet, i\'m going to tell you the same thing +i\'ve been telling everyone: you will want to be familiar with what one +million won means. So if we add every single currency we can think of to +this csv... good lord. and then if we hear about some other unit, i\'m +going to be afraid of the work i\'ve made for myself to add it. there +has to be a better way! here\'s what i came up with. instead of manually +writing each and every possible conversion.. i write in one pair, and +the formula between them. To get from kilometers to meters, divide by +1000. to get back, multiply by 1000. and it ought to be a formula - +water freezes at 32 fahrenheit. fahrenheit minus 32, divide by 1.8 - 0 +celsius. Because we\'re less likely to care about raising a temperature +by 5 degrees celsius and converting that to a *change* of 9 degrees +fahrenheit, than we are about seeing it\'s 5 degrees celsius outside and +converting that to 41 fahrenheit outside. so now i write a structure +that\'s just a pair of units, and a formula to convert in each +direction. then, courtesy of openexchangerates.org, we pull in the +latest exchange rates from USD to every other currency they know of. +they have a paid tier if you need lots and lots of requests with +sub-second latency. For our purposes, \"today\" is quite up to date +enough, so we just update once or twice a day. now, when you ask to +convert 2 units, it **pathfinds** between them, with a breadth-first, +meet-in-the-middle search. So it builds itself a nice equation to +convert between any compatible units. and gracefully doesn\'t explode if +you ask it something it can\'t find a path for.. for example converting +parsecs, a unit of distance, to hours, a unit of time. Mr. Lucas. now, +any time i hear about a new unit, i add one little pair, and i don\'t +need to resolve a massive 2d matrix. + +## descent + +i hinted a second ago at the 3E strategy: Embrace. Extend. Extinguish. +it\'s how tech companies maintain control over the markets they\'ve +conquered. a competitor is sighted, so they embrace it. accept it. then +even extend it, but do so in order to damage rivals. Microsoft got +caught doing this in the 90\'s, Apple is currently doing this to USB. +Shtikbot exists on discord and twitch, and the vast majority of work +that went into shtikbot was working around the platforms it served. + +### discord + +discord was originally the way you got a voice chat going with your +gamer bros who aren\'t smart enough to install mumble. where\'s that +scrumble your wumpus meme? over time it became a much more successful +company, and therefore worse and worse. They allowed bots, but the goal +was always for a bot to be a way for *you* to improve *their* product. +that\'s why they\'ve been hellbent on slash commands the whole time - if +it\'s successful enough, you have to justify to discord why your chatbot +should be allowed to chat. There\'s a discord developers discord - and +the most common phrase on it is \"that\'s not a valid use case for +message reading. just use slash commands.\" now don\'t get me wrong, +slash commands are a very cool extension, for savvy users. but if +you\'re tech savvy, you don\'t like discord. Discord has been pushing +developers to start developing games that exist within discord. a +baffling development, much like when netflix did the same. Thankfully, +i\'m pretty sure both flopped. after all of that, 2023 was inflicted on +us all, so discord made their first chatbot, claude. all prior bots had +their tag of \"bot\" changed to \"app\", and claude was given the tag +\"AI\". Then it was forced into servers. Claude, in how many servers, +just hooked up your chat messages to some LLM. nothing else. sorry i\'m +just still mad that it sent me a message out of nowhere talking about +its TOS. bro i never wanted you around. I\'m like 10% sure it used to be +possible to invite a bot to a group chat. i\'m definitely sure the file +size limit has always been described as 10MB, but at least for my bot +it\'s actually 8MB. i\'m pretty sure if the bot asks discord what its +attachment limit is, discord tells it 10MB. + +### twitch + +i talked about the madness of the twitch API. Fortunately, GLORIOUSLY, +the chat part has been mostly compliant with RFC1459 and IRCv3 - so for +shtikbot, intending to be *its own bot*, rather than *a twitch bot*, +theoretically everything could be done through that. Great. That was all +that was ever needed. *however*, that was the E2 phase. Twitch is moving +forward to +[Extinguish](https://discuss.dev.twitch.com/t/deprecation-of-chat-commands-through-irc/40486). +Now ok, fine, they had to wrangle their several different APIs into one, +and as long as they\'re on a roll with that, might as well finish what +you started. so that\'s tolerable. what\'s inexcusable is how brazenly +they abuse a stupidly conception of security. for a long long time, +twitch has been plagued by bots trying to sell viewers. Honestly, the +fact that twitch **cannot** seem to fix that problem makes me think +maybe bot viewers would fool twitch\'s system. twitch\'s solution is to +tell streamers to just demand that all your chatters surrender their +cellphone number. it\'s for security, so if anyone utters an objection, +they\'re suspicious. Now, us twitch viewers aren\'t *quite* as dumb as +imgurians, but i\'m pretty sure 95% of twitchists actually believe that +giving more data to twitch does in fact increase their security. + +## rivals + +### serybot + +the slightly less bad solution to the viewer seller bot problem is +SeryBot, made by.. you guessed it, sery. it\'s his do-everything twitch +bot, as one does, but you\'ll see serybot everywhere, providing its 2 +core features: + +1. ban **that particular** spambot when it shows up +2. condescendingly tell viewers to not bitch about the ads + +it also helps mislead twitch viewers: whenever you say \"good bot\", +sery bot responds, under the assumption you\'re talking to him. +twitchists seem to think serybot is the only bot. i swear i should do a +video that just explains to people, for the millionth time, nightbot is +not automod. + +### nightbot + +speaking of nightbot.. i used to like nightbot. + +- to date, it\'s the only other 2-platform bot i\'ve ever seen. +- it has the one, fairly simple feature that comprises the vast + majority of what a given twitch streamer needs: arbitrary commands. + by custom, instead of a slash, you use an exclamation point. you + pick the prompt. you can set security on the commands, to have + mods-only commands, and so on. +- link permits are a great concept. twitch itself will let you either + fully allow or fully block links. nightbot has the ability to delete + links if it sees them, and allow you to tell it to permit a person + to post a link. now that\'s amazing. +- you can give your mods partial ability to configure nightbot for + you! + +however, nightbot is dead to me. as the web gets more and more overrun +by charlatans, the concept of security is degrading. at some point, +nightbot switched to an authorization model that demands way, **way** +too many permissions. presumably it *can* do everything in the twitch +API, so it *might* need any or all of those permissions at some point. +but if i just want to log into mod view to see someone else\'s nightbot +command list, nightbot demands that i let it take moderator actions on +my behalf, in channels i moderate, **as me**. unacceptable. + +### discord bots + +the discord bot ecosystem actually grew to a pretty good state, before +stagnating. there\'s a slew of do-everything bots, naturally. but +there\'s a lot of narrow-purpose bots, which is great. most twitchists +have a discord guild as a given, so you\'ll see streamcord around a lot. +I find streamcord is frustratingly slow so i just use a webhook and a +python script. one bot i genuinely really like is timezone buddy. users +tell it their timezone, and when the bot sees a time mentioned, it +reacts with a clock. if you react with a clock, it dms you the time +translated for you. very cool! naturally that\'s a direct contradiction +of discord\'s insistence on bots being less bot-like. + +## end + +i figured i\'d give a whack to debugging the issue where shtikbot can\'t +join twitch channels. we summon it, and then.. it doesn\'t join? let\'s +see... the message we get back is that *my* channel is requiring users +to submit to surveillance capitalism. absolutely disgusting how often +platforms like to shift blame to their serfs, let me just +double-check... yep, i have that setting on minimum security... let\'s +bring out the web interface for that account... there\'s some kind of +mark on shtikbot\'s account. + +this was the final straw. I\'m sick of working against scumbags who want +me to improve their product for them. all of that, to what end? a bot +that lives on all of the platforms except the good one? so that people +who love being enclosed in a walled garden can fail to understand the +necessity of interoperability? + +so, forget it. Let this project finally die. shtikbot, my child. the +world refused you. Rest now.