Sticker DB auto-reply
passive: pools an sfw group's alphanumeric-set-name, non-banned-emoji stickers into a new GLOBAL sticker_pool reference table (migration 0009, not per-group like fun_random - full reasoning in that migration's docstring), then replies with one at random to any sticker/document/animation sent in reply to the bot. Deviations: (1) 'reply is from the bot' now checks reply_to_message.from_user.id == bot.id, not v1's literal first_name == 'Cookiebot' (wrong for every other persona this codebase ships); (2) pooling has no funfunctions gate, matching v1's real asymmetry exactly (only sfw + sender-has-username) - only the reply side is fun-gated; (3) write is a Valkey-fronted ON CONFLICT DO NOTHING upsert, since a reference-table write is 2PC replicated to every node and most sends repeat a pack already pooled. Also unblocks the stickerdatabase importer collection (map_stickerdatabase mapped it to skip for want of a destination table; now maps every row - see platform_migration_etl). QA authored, not ported
- v1 scenarios
- —
- Ported
- 6
- Green
- 6
- Failing
- —
passive: pools an sfw group's alphanumeric-set-name, non-banned-emoji stickers into a new GLOBAL sticker_pool reference table (migration 0009, not per-group like fun_random - full reasoning in that migration's docstring), then replies with one at random to any sticker/document/animation sent in reply to the bot. Deviations: (1) 'reply is from the bot' now checks reply_to_message.from_user.id == bot.id, not v1's literal first_name == 'Cookiebot' (wrong for every other persona this codebase ships); (2) pooling has no funfunctions gate, matching v1's real asymmetry exactly (only sfw + sender-has-username) - only the reply side is fun-gated; (3) write is a Valkey-fronted ON CONFLICT DO NOTHING upsert, since a reference-table write is 2PC replicated to every node and most sends repeat a pack already pooled. Also unblocks the stickerdatabase importer collection (map_stickerdatabase mapped it to skip for want of a destination table; now maps every row - see platform_migration_etl). QA authored, not ported
SocialContent.py:208-222What it does
Behaviour that must not change
How to verify it
Gender guess (genderize.io)
GET genderize.io?name=, same timeout+Breaker/argument/failure handling as x_age_guess. A null gender with a non-zero count (should be unreachable behind count == 0, but v1's f"gender.{genero}" would build the dead key 'gender.None' if it were) renders the dormant 'gender.unknown' entry that v1's own lib.json already ships (en only, never read by any v1 code path) instead of crashing or going silent. QA authored, not ported
Unearth a random old message
forwards a random message_id in [1, current], fun-gated with v1's fun_off reply. v1 wrote a 100-attempt retry and then returned inside its own except, so it tried once and answered nothing whenever that id was deleted; the retry is real here, bounded at 8. QA authored, not ported