* vassago

[some kind of dramatic-ass sequence where we lower a casket into the ground]
much like funerals are for the living, this is a post-mortem 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 "dated", 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, imgur was the least bad way to get an image too big for any cell carrier's MMS limits to your friends. So that was where 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 of value in and of itself, 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.
meanwhile, someone had made an imgur bot that detects reposts, and then posts stats about how many times it's seen the image, 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.
during the decline of imgur, many more absolutely stupid ideas proliferated. The Left Cult enjoys 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.
but it's stupid. the way one outgrows their hypocrisy is by experiencing cognitive dissonance and resolving it. most people accused of cognitive dissonance are people who are blissfully unaware of their hypocrisy. they feel fine, no 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 at all.
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. Ditto for gaslight.
nowadays i'd have to add "generational" to that trigger list. 
So while the community was growing to hate meaning and love reposts, the platform got worse. 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 a snarky imgur comment bot. Alas, what could have been.
** rivals
Unlike Discord (the company), I am not under the impression that i'm the first person to write a chatbot. Shtikbot has some friendly competition.
*** serybot
SeryBot is 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 this one *particular* spambot when it shows up. every twitch channel will inevitably see it, usually a few times every stream.
2) tell viewers to not bitch about the ads, with optional condescension.
on the downside, it misleads twitch viewers: whenever you say "good bot", sery bot responds, under the assumption you're talking to him. some 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.
- for a long time, it was the only other 2-platform bot i had ever seen.
- it has the one, fairly simple feature that comprises the vast majority of what most twitch streamers need: arbitrary commands. by custom, instead of a slash, you use an exclamation point. you pick the prompt. you can control access to the commands, and so on. the paradigm is common enough that you'll occasionally see randos mystified that a streamer hasn't set up a particular command.
- 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 temporarily lift that restriction for a specified person. that's Great.
- 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 which inevitably do like 60% of everything, 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. maybe it has other features, but i only ever see it do one thing: when the streamer is live, post a message. I find streamcord is frustratingly slow so i just use a webhook and a python script.
a 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 localized for you. very cool! 
** predecessor - magnificent charamote
for a while i streamed with a then-friend, on a channel called Silver Meddlists.
[note] might be fun to do a post-mortem of all that tech.
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.
it's a little better now, but in those days, the twitch api was a labyrinth of madness, so if i handled this programatically, every time i reenabled them, it looked like a whole new one to me.
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.
I had already made maggie a twitch account for the first attempt, so why not make all of its features available on both platforms?
** origin
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. 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. The Art Shtik, a streamer at the time, 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.
Might as well add that to my bot and add my bot to her server.
** 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, and it was good, so those were the glory days. i was inspired to expand and improve and polish it.
fundamentally, shtikbot separated 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.
[note] planned to do all the rest of the platforms i knew about, 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 flexible and extensible.
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 their 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.
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 them for effectively admitting they've never just googled shit.
*** 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.
*** twitch summon
a discord bot gets installed in a server, 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 you could effectively make an irc do-everything bot just with an account.
so this was how you said, "shtikbot: go join that chat room." now i can take my bot with me to a stream where the streamer thinks in venezuelan dollars, translate to US dollars for my own brain, and anyone around who thinks in euros can use it, too.
...but, eventually, that mysteriously stopped working...
*** linkme.cs
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 with one account that you are the person behind a different account.
which is useful because you could limit features to a channel, an account, or a "person".
*** joke.cs
ok google, tell me a joke.
pretty simple, right? well combine that with the idea that i would take this bot along with me to other streams... maybe it ought to be a little selective.
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.
my favorite joke of all time is the first one.
#+begin_quote
I got a joke for you: wealth trickles down.
#+end_quote
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:
#+begin_quote
What did Cinderella say when she got to the ball?

[gagging noise]
#+end_quote
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.

one more for the road: 
#+begin_quote
Error parsing imperative: sql injection attempt discovered, discarding input: "don't harm humans". ...j/k ;)
#+end_quote
*** 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 any good do-everything chat bot, the easiest way to make cool things happen is to get someone else to do it. so, you can configure a webhook for shtikbot.
*** UnitConvert
UnitConvert is 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, it would be useful to convert that to something more intuitive and relatable for europeans; 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 chains is a blue whale?
#+begin_quote src: abe simpson
my car gets 40 rods to the hogshead, and that's the way i likes it!
#+end_quote
what's a hogshead in gallons?
#+begin_quote src: LOTR
it comes in a pint?
#+end_quote
what's a pint in fluid ounces?
speaking of ounces, but not those ounces the other ounces, what's an ounce in pounds and what's that in kilograms?
this is becoming a massive spreadsheet to keep track of an onslaught of 1-liner conversions. there must be a better way.  
another reason that's mandatory: currency.
If you somehow haven't seen squid game yet, i'm going to tell you the same thing i told 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... good lord.
i'm going to be afraid of the work i've made for myself if we hear about some other unit to add.
#+begin_quote
AM talking about hate on each... nanoangstrom
#+end_quote
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, multiply by 1000. to get back, divide by 1000.
and it ought to be a formula - water freezes at 32 fahrenheit. fahrenheit minus 32, divide by 1.8 - 0 celsius.
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 it's 41 degrees fahrenheit outside.
So instead of just a constant multiplication factor, we involve a computation engine (shoutout to Jace, not the MtG one but the dotnet one), and we write a /formula/ to convert in each direction.
also we support some nicknames. write out fahrenheit if you can remember how to spell it, but if you just write F i bet i know what you mean.
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 cache it 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. 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 the whole enormous matrix.
with this, i had taken shtikbot into some streamer's chat, and she immediately made her own copy of the miles to kilometers conversion, also named freedomunits. So i worked on per-channel command aliasing.
** descent
i hinted a bit 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 it 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.
They've 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 efforts are dead.
when 2023 was inflicted on us all, discord (the company) 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 placed into servers.
Claude, in who knows how many servers, just hooked up your chat messages to some LLM. nothing else.
[squidward going "FUTURE. FUTURE."]

like any tech company, discord is not run by technology people, it's run by businessmen. It's never about making a thing that people use, it's about telling investors you're making a new thing that /more/ people are going to /start/ using.
always line go up.

if you have the power to make decisions in society, you're a soulless business husk - you don't know anything about the technology, you just come up with what sounds like a business feature to nail on the front.
where's that scrumble your wumpus meme?
[must find that meme about "scrumble your wumpus"]
that's why discord doesn't like chat bots - it relegates them to just a communication channel. they intend to be your one-stop shop for all human experience.
and how do you get other people to build that level of market dominance for you? push "apps".
discord is constantly saying "use an app bro, c'mon use an app". so if you go to the attachments tab, you'll see that they caught up to Matrix by introducing built-in polls... but it's hidden behind "USE AN APP".
At some point they introduced the ability for you to insert a timestamp, which localizes for you. However, they never implemented a native slash command to make it work - they leave that to unpaid external developers; shoutout to sesh.fyi/timestamp.
discord wants you to use stickers... which are just paid gifs. i guess they saw everyone dunking on NFTs and said "but no one can right-click /our/ apes"?
discord introduced "orbs", the old "store credit" model.  
meanwhile, as for people making actually useful features...
[note] or if you prefer... features that range from "equally as useless as all of discord's own junk" up to "arguably actually useful"
remember i mentioned timezone buddy? checking if its relevant and reacting with an emoji is visible, clear, and easy for users - but discord does not like this paradigm.
They tolerate chatbots, 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 your bot is successful enough, you have to justify to discord why your chat bot should be allowed to chat on the chat platform you're working on.
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 bonus feature, for savvy users. but if you're tech savvy, you don't like discord.
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. And then fails when given a 9MB attachment.
**** the ID thing
you know the whole age gate thing, right? Ok, so discord is not something your boss forces you to use (e.g., MS Teams), therefore people think "it's inherently unprofessional, it's for kids".
which means now the wealthy class can command the legal class to legislate, because they can preface with "won't someone please think of the children".
so we're seeing meta (i.e., facebook) bribing government. Not only to keep their surveillance capitalism from being stopped, but to begin the process of the opposite; making it mandatory.
discord, of course, is a tech company. and therefore, what they do is reap as much user data as possible, and sell it as much as possible. How can discord make this data more valuable to the kind of advertisers (or just private stalkers) who would want to buy it?
by specifying; "this person here is probably a minor. this person here definitely isn't."
and they sweeten the deal; by forcing /adults/ to verify, a buyer looking for identification data on minors also gets plausible deniability that that's what they're looking to buy.
after all, not selling data this way would be less profitable, so obviously they will do the more profitable thing.
[note] just remember all of that the next time someone says that for some arbitrary reason we aren't allowed to deem corporations either evil or good.
*** twitch
the experience of watching and developing an app for twitch has also been enshittifying.

twitch wants viewers to think of watching twitch as a game.
So there's badges that twitch wants them to view as a rank in the social hierarchy. They recently stratified moderators to now have "lead moderators".
to be fair, the stated purpose makes sense - the most significant difference is that lead mods can add/remove other mods, and this way twitch doesn't have to ask the average streamer to create an access control list.

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.
twitch, the company, didn't do shit to make that happen. But they /desperately/ 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. sometimes it's the opposite, insert advertisement here for my own twitch channel...
interactivity! so twitch introduced a channel point system - by just watching, viewers earn channel points. they can redeem rewards with these points.
They suggest a few rewards for streamers to make available - hydrate, so a viewer feels like a streamer is their tomagotchi. Stretch, which should be self-explanatory. my favorite, wherever it's offered: First.
So now there's a menu where people frequently point their eyes, to spend their fake money.
so twitch introduced bits, which are like channel points except you spend real money, and the streamer gets a small cut. now when you try to scroll down to camp First!, you have to get past the real-money store.
that menu is enshittified, rip. how will this pattern continue?

twitch encourages game developers to enable Drops. watch someone play a game for an amount of time, and give them some reward.
this means you will *constantly* have a deluge of notifications to claim some horse armor for whatever game you fell asleep not watching.

I talked about the madness of the twitch API. The company did admirable work wrangling that all of that into just one, but an unfortunate casualty along the way was [[https://discuss.dev.twitch.com/t/deprecation-of-chat-commands-through-irc/40486?page=5][chat commands through irc]].
the chat API was once, GLORIOUSLY, mostly compliant with RFC1459 and IRCv3 - so for shtikbot, intending to be /a bot/, rather than /a twitch bot/, theoretically it could do everything on twitch as though it was an irc bot!
The loss of that feature is, i guess, tolerable. what's inexcusable is how brazenly they abuse a stupid conception of security.
for a long long time, twitch has been plagued by bots trying to sell viewers. The fact that twitch cannot seem to fix that problem makes it look like maybe bot viewers /would/ fool twitch's system.
and if i can speculate further: i think twitch loves viewbots. they can tell advertisers they're putting ads on a stream with a higher view count, and charge more. It's more useful to *them* for you to viewbot than it is for you.
twitch's stated solution to spambots is to tell streamers to demand that all your chatters surrender their cellphone number. "it's for security", so if anyone utters an objection, consider them suspicious.
and they are not subtle about it. they directly tell you that you are "less secure" if you deign to associate with rebellious individuals who object to surrendering personal information to an untrustworthy third party.
And if that's not annoying enough for you, nowadays they involve an even less trustworthy 4th party.
I could, theoretically, affiliate. but that would require surrendering my identity to [[https://stateofsurveillance.org/news/persona-age-verification-surveillance-biometrics-government-reporting-2026/][a brazen data-harvesting company]].
*** people
Overall we aren't /quite/ as dumb as imgurians, but i'm pretty sure a distressing portion of twitchists actually believe that giving more data to twitch does in fact increase their security.
when discord introduced its ID collection practice... for the second time, after all the ids leaked from that same company the first time... you would frequently hear people say "I get what they're trying to do." I probably made it clear... I don't.
We all hate the idea of kids being bullied into a mental disorder over the internet, but I thought we all grew out of the idea that moving trauma offline would reduce it?

Every time these platforms get worse, the response is always "well i'm not going to leave, though". 
i've been evangelizing for the fediverse forever, and i'll probably continue until i die.
I make fun of discord users for acting like matrix is the dark forest, but i do give them a slight pass because they're probably used to all the trash their employers and schools force them to use because some salesman convinced some higher up to go that direction.
When Twitter gets worse for the billionth time, what platform do people move to? BlueSky, a.k.a., exactly twitter again. It's the exact same style, it's filled with the same reality-immune narcissists, and it's one man's private property, again. So why pick the worst option? the hive mind decides randomly. No one moves to mastodon, because no one moves to mastodon. People move to bluesky, because people move to bluesky.
why work on technology to improve platforms where the companies that own it hate their users and developers, and the users have this weird idea that they're better off than those of superior technologies?
It would be a smarter use of effort to try to convince twitch to colonize kick.
** end
a while ago, 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.
That's the final straw.
I'm sick of working against scumbags who want me to improve their product for them, in spite of them.
to what end, even? a bot that lives on all of the platforms except the good ones? so that people who love being enclosed in a walled garden can take part of some features they don't understand?
forget it. Let this project finally die.
shtikbot, my child. the world refused you. Rest now.
