-
Notifications
You must be signed in to change notification settings - Fork 0
/
TODO
245 lines (245 loc) · 15.7 KB
/
TODO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
* Per-channel rate limiting instead of the current one-per-second globally
- Where the bot is a mod, the limit is three per sec. In other channels, must respect slow mode.
- Is there a way to detect channel slow mode on connection? If it changes, there's a NOTICE.
- Possibly ROOMSTATE, but I'm not receiving those.
* Variables.
- NOTE: As of 2024-02-29, all variables are stored in precached config named "$var$",
and any that aren't dollar-bracketed are buggy. This may change in the future, with
the persisted mapping NOT having the dollar signs. This may also coincide with storing
them in their own table eg stillebot.variables, with channelid, varname, userid (may
be NULL in which case it's not a per-user variable), and the value.
* Across an update of connection.pike, retain the mod list, until such time as we get an
updated list.
* Pike HTTP, SSL, and keep-alive: what's going on? Is that why Chrome gets confused?
- It's currently just disabled - we add "Connection: close" to all responses. Would
be nice to figure out what's actually wrong and then reap the performance benefits.
* Raid finder: Also show recent outgoing raids to allow notes to be added?
- Or just "pick any channel, add notes". Have it show the stream as if in the raid finder.
- The allfollows display could be this, but it's nondiscoverable and could be quite costly
for people who follow a lot of people.
- Adding ?raiders will show incoming, but not outgoing, raids.
* Importing of config export files
- Create all listed commands, but don't destroy unmentioned ones (overwrite any with
the same name, of course). Ditto specials, but whitelist the names, of course.
- Avoid recreating with identical behaviour. Reimporting an unchanged config shouldn't
cause a full UUID rotation on all commands.
- Identify triggers by their IDs, and merge accordingly.
- What happens if they're in a different order? This is currently the only plausible
way to reorder triggers, which might be significant.
- Update timezone if specified.
* Is it possible to get a "recent messages" timeout? Would allow squishing of spam if the
channel is too quiet. Might not be worth it though.
* Authentication on Firefox may now have issues with the default popup blocker. Can we
comply with normal "click for popup" expectations somehow?
* If you attempt to rename a command or add an alias that already exists (and isn't an
alias for the current command), warn on client side and block save unless confirmed.
* Goal bar templates - nice easy ones that you can use right away
- Note that Twitch now has on-platform goals that track current followers and subs,
so this can continue to focus on how many have been gained recently (eg daily
sub/resub count).
- All of them will be usable out-of-the-box, but have "Advanced" that lets you fully
customize the advancement. Also, if you REALLY need flexibility, they are backed by
the variable system, so any command or special can move them around.
- Make the advancement command a proper thing. It should be broadly possible to hack
together a bit-boss kind of thing if you want to.
- Standard goal bars:
- Daily subs/resubs
- Daily sub points (ie tiered subs count for more)
- Daily cheers
- All stream support (subs, resubs, cheers, all worth their USD equivalents)
- Any others?
* Special trigger when any goal bar tiers up?? Would be better than the weird system
where it triggers an actual command. Could deep link straight to the editor now.
* "max-width: fit-content" doesn't work in Firefox - but nor does -moz-fit-content :(
- Causes display problems on graphical editor and opening up element details
* Should ALL specials function as implicit arrays, the way triggers do?
- Alternatively: should invocations and executions be separated? Aliases would then
be just another way to have more than one invocation for a single command.
* Art Share tool
- Implement !permit command for temporary single-use access
- Mod command to nuke the last-posted file? You can already delete the message (eg
time out the user) to delete the file.
- Anyone currently under timeout or ban is to be denied upload permission.
- Need a way to grant authentication for this purpose.
* GUI editor - params need formatting options, in and out
- Builtin params need to cope with splitting strings to arrays
* Rename "gifted" flag in sub alerts to "is_gifted" to trigger boolean handling
- Migrate existing settings
* Alertbox: For any non-personal alert, have a "Revert to Stock" which deletes the
alert settings that you have, aside from the "Active" flag
- It may be worth having Active be a single-attribute update, so when you toggle
activation status, it doesn't save everything else.
- When an alert does not have any other details set, it uses a stock alert. Thus
you can easily enable and disable alerts, without having to do the work of
creating them. (I think they should start enabled?)
* Find all forms in dialogs and use tag=formdialog instead
* Somewhere in either giveaway or pointsrewards, something attempts to query the
rewards for Mustard Mine, which bombs with a 403 (b/c not affiliate). Track it
down at some point; may need to add some instrumentation.
* Other support platforms? Which ones have integrations available?
- Throne?
* Seek verification status.
- Create a way to permaban a user??? It's sadly likely to become necessary at some point.
- https://dev.twitch.tv/limit-increase
- Applied 20240621.
- Appeal to Twitch for the name StilleBot? If it can be made available, activate it as
another voice, available to all. MustardMine will remain the default though.
* Bot sharding. What would it take?
- MUST NOT disrupt external usage eg URLs
- Each channel will need to stay together, meaning that all shards will need IRC and
web connections
- User preferences must be non-sharded; if you are using multiple channels, prefs are
still synchronized across them.
- Must be dynamic. This will allow bot restarts to happen progressively by adding and
removing shards.
- Might require a single central dispatcher. This is a minor problem but not huge (at
the moment). Maybe the dispatcher can be the same code as any other shard, with some
way to know "there are other shards over there and there"?
- If possible, the central dispatcher should be able to move. Might require some
careful handling though.
- Incoming webhooks have to be dispatched to the shards
- May be of lower importance now that the IRC connection can be sharded within a single
process; this is no longer a startup performance concern, but a reduction in outages
and potential geographic sharding.
* Per-channel per-user data
- Variables - can use "$*foo$" or "$49497888*foo$" for explicit UID
- Support this notation for cooldowns too?? Including aliasing via the builtin.
- Channel currency?? Would become available as "*points" but automatically incremented
according to rules like "+1 every 5 minutes to all in chat".
- It's now possible to do this manually (have an automated command that adds to a
variable for each chatter), but would be convenient to configure it in one place.
* Block bad variable names (those with "$|{}") on the front end - on the back end, those
characters will be silently stripped out.
* Identify whispers better
- When a whisper comes in, be sure we know which voice received it
- Allow whispers to trigger commands in some per-channel way
- Channel config->whispers_as_commands - no current way to set it
- What about secondary voices? For example, whispering CandiCat could execute commands
in #devicat and then whisper the response from CandiCat.
* Make the GUI command editor more accessible
- GET A SCREENREADER and see how everything sounds. If needed, adjust.
- Orca sucks. What others are there?
* Should Favourites become a tray like any other??
* Can we get "snooze raids" information?
- Option: Snooze raids when you open the raid finder, unsnooze when you close it
- Option: Query if the channel has snoozed raids, show a big warning
- Neither is, to my knowledge, currently supported. These would need API augmentation.
* Cron job to track channels that have been inactive for a long time (maybe 2 weeks) to
dispose of their configs
* Make connection priority dynamic
- Inactive/deleted channels are excluded already
- But idle channels should have nearly as low a cost
- If a channel has been live within the past two weeks, it has "regular" priority
- If it's in my notify list, "high" priority??
- Maybe allow modules to add to an array of "reasons for priority"?
* During update of window.pike, sometimes seeing this:
(stillebot.pike:535692): GLib-GObject-WARNING **: 10:15:44.496: ../../../gobject/gsignal.c:2732: instance '0x55b0f70e9970' has no handler with id '4781'
- Probably indicates a signal connected to an object, object gets destroyed, then
signal gets removed.
* Channel error log
- Find other places that should be reporting errors and make them report.
- We need to talk to you about your TPS, error, and warning reports.
- Fully implement unread status - lift code from chan_messages as needed.
* Sometimes the connection will fall over, and the bot won't be aware of this.
Need a way to "force disconnection" which basically just overrides the irc_connect
retention rules (same as a version mismatch does). Is it worth trying to do this
automatically, or just have a menu item for it?
* MustardScript syntax highlighting enhancements
- Use the https://github.com/ajaxorg/ace/blob/master/src/ext/themelist.js extn to
allow people to pick a theme; save it to their prefs.
- Autoindent? After a brace, indent. After a builtin function call or keyword,
indent if there was nothing on the previous line. Dedent appropriately??
* Minor changes noted during massive DB migration:
- chan_giveaway.pike giveaway_tickets[] should use user IDs
- Sweeping change: Eventually mandate that chan_*
websocket groups use IDs rather than channel logins.
- Remove req->misc->session->token. Instead, have req->misc->token which is
taken from the user ID, and always store the token against that user (not the
session).
- Remove req->misc->session->scopes at the same time. This should leave sessions
JSON-compatible; then convert the database to use JSON instead of encode_value.
* Failed auth when attempting to send a voiced message should be logged to the
channel's error log.
* Can we get sd_notify support? Would be nice if, upon receipt of a "reload" signal,
the bot notifies systemd that it's reloading, then that it's ready, and can report
failure so the terminal gets an immediate response. (Failure details will of course
be in the log.)
- Requires systemd v253 for Type=notify-reload in order for this to work.
* Conduits. https://dev.twitch.tv/docs/eventsub/handling-conduit-events/
- One shard for the active bot
- If active and no websocket, establish WS and update shard
- Hook conduit.shard.disabled on all nodes, not just active, to know when the other
has gone down - maybe automatically raise self? Use webhook for this one.
* Make a shareable link feature for twitchlogin.pike
* Running into weird problems with app auth. Maybe the cached G->G->app_access_token
needs to be purged at some point?? Possibly on reauth???
* Current limitation: Changing stream tags without changing anything else won't trigger
a !!streamsetup special. No easy way to fix this without some kind of reliable poll,
and there are lots of weird corner cases. Probably should be documented in a user-facing
location though. Best fix: Have Twitch provide tags in the channel.update notif, and
have that notif also sent when tags are changed.
* Follower alerts/special trigger
- There's no way to get notified when I receive a new modsword, sadly. May need to
periodically recheck, or ping all voice accounts when one is authenticated, or when
a broadcaster does something like adding the !!follower special.
- Do I get notified if bot is in chat when it receives the sword?
- Query all of that channel's voices - most importantly, all the default voices - for
their modswords
- If any voice both has a modsword for a channel and has the moderator:read:followers
scope, it can be used for follower hooks.
* VIP Leaderboard: Have a "claim tips" button
- We already keep email addresses (I think?)
- Let people log in with Twitch. If it's the same address, they can claim the tips
and be credited for them on the board.
- Retain the original name. If someone wants to donate VIP, they can unclaim a tip
and it'll go by name not email.
- Once someone has claimed their tips, it should default to claiming future tips
(but this can be turned off per user).
- If they DON'T use the same email address, is it worth having an email verification
system (send a unique link, they can claim those tips)?
* Chrome Youtube Music integration
- Like VLC integration, it could link in with variables and whatnot
- Provide a Chrome extension.
- Extension connects to the websocket. Initially, it does not have authentication.
- A button on the Stillebot page authenticates (claims) an unrecognized connection?
Or do it magically based on IP address?
- The extension stores the magic cookie in local storage
- Watch for song changes. Also support a volume control?? Wouldn't work for VLC as the
Lua extension doesn't establish a bidirectional connection.
- Try to get both the URL and the song title (as Unicode, no mojibake thanks)
* In interactive mode, have an explore(mixed value) that will create a GTK window to
show the value, same as Internals does
* Bug note: Waydroid, command viewer, pre-opened command GUI.
- If mouse is over canvas on load, will blank canvas on first mouse move
- If mouse is not over canvas, will blank canvas if moved over, sometimes after a
delay, sometimes immediate
- No JS console output sighted
- Does not occur if command GUI closed and reopened within the page.
- Happens only in Waydroid Firefox, not in desktop Firefox. Not tested in Waydroid
Chromium-based browsers as I haven't managed to get any of them working.
* Patreon integration
- Alerts. Include a field showing the membership tier, to allow variants, eg no
alert for free members (aka followers)
- VIP status for all patreons at some minimum level (don't set to 0 or free members
will get it)
- Would require that people link their Patreon and Twitch - one-off but since it's
not supported by Patreon themselves, has to be done on Mustard Mine
- Whenever you resync, add new VIPs for anyone who is a supporter
- Track failure to add VIPs and don't unvip them later
- Remove VIP from anyone who is no longer a supporter
- React to members:create, members:delete, and possibly members:pledge:create/delete?
- Can we have a builtin that iterates over all current patrons?
- Note that members:create includes free memberships. May need a "membership upgrade"
alert too?
* Font chooser in textformatting. Open another dlg with all known Google Fonts (API call?)
and if possible, your local system fonts???
* Bug note - why is art share upload not showing thumbnail? Maybe push out a stub
url until fully uploaded?
* Possible alertbox filtering?
- Create multiple links that are able to react to alerts
- Filter which alerts will be shown on which links
* Hype Train notifications now say if it's a Golden Kappa Train. Update the set of
available emotes in this situation.
* Make {displayname} available in all commands? Currently $$ defaults to display name
if it's available, or login if it isn't. Having {displayname} would allow you to
force the use of a display name, or blank if unavailable. Worth it?