Commit Graph

15 Commits

Author SHA1 Message Date
goyban e99d9adf97 Document the moderation queue in the Persian README
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 21:33:19 +00:00
goyban 0a8c81db90 Add a moderation queue for user submissions
Completes TODO #3. Submissions are gated behind ACCEPT_SUBMISSIONS,
which defaults to off: is_allowed() treats everyone as allowed when
ALLOWED_USERS is empty, so opening submissions implicitly would have
accepted media from anyone who found the bot.

- Schema v3 adds status, reviewed_by and reviewed_at. Existing rows
  default to approved, so upgrading changes nothing for a running bot.
- Search, /list and counts only return approved items; callers that
  need everything pass status=None.
- /review shows the oldest pending item with approve, reject, fix
  keywords and stop. No cursor is stored anywhere: each action just
  asks for the next pending item, which is what lets a moderator stop
  and resume later, and lets several moderators share one queue.
- set_status only updates rows still pending, so if two moderators open
  the same item the first decision wins and the second is told so.
- A failed send no longer wedges the queue; the item's details are
  shown anyway so it can still be rejected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 21:32:35 +00:00
goyban efc2be5f8a Support audio, documents, stickers and video notes
Completes TODO #6. The bot accepted photo, animation, video, voice and
sticker; music files, documents and round videos were silently dropped.

- Replace the five near-identical media handlers with one dispatch table.
  Animations are matched before documents because Telegram populates
  both fields for a GIF, so the old ordering would have filed every GIF
  as a document once document support existed.
- Store video notes as "video". Telegram has no cached inline result for
  video notes, so this is what keeps round videos searchable; it costs
  the round presentation on playback.
- Build inline results from a table keyed by media_type, and cover audio
  and document. A test asserts every storable type has a builder, so a
  new media type cannot be added without a way to return it.
- Reuse one MEDIA_FILTER for both the idle and mid-keyword handlers;
  the second list had already drifted from the first.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 21:25:11 +00:00
goyban b55cee1650 Add schema migrations and scope uniqueness to the owner
Step 0 of the roadmap: everything from the moderation queue onward adds
columns, and init_db could only ever run CREATE TABLE IF NOT EXISTS, so
it could not alter a live deployment.

- Track schema state in PRAGMA user_version and run ordered migrations.
  Fresh installs create the v1 table and migrate forward, so the upgrade
  path runs on every new deployment rather than only on old ones.
- Rebuild media with UNIQUE(owner_id, file_unique_id). The old global
  unique constraint stopped two users from each saving the same file,
  which blocks public mode.
- Replace INSERT OR REPLACE with an upsert. Replacing deleted and
  reinserted the row, giving it a new id and silently invalidating any
  id the user had noted from /list.
- Give search_media an optional owner_id scope, defaulting to the
  current shared-library behaviour.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 21:23:10 +00:00
goyban 4be90a3223 Add implementation plan for TODO #2-#6 with settled decisions
Design-only document covering the moderation queue, public mode,
save-vs-extract vault, and federation. Records the four decisions
taken on the roadmap and the API claims verified against aiogram
3.15.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 21:21:50 +00:00
goyban f5b16fab84 Bump VERSION to 1.0.2 for the list-truncation fix
VERSION had been left at 1.0.0 while the registry already carried 1.0.1, so
push.sh (which defaults to the VERSION file) would have rebuilt an existing
tag. This realigns the file with what is actually published.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 13:02:19 +00:00
goyban 5305b654c7 Merge pull request 'Fix list truncation' (#2) from codex/fix-list-truncation into main
Reviewed-on: #2
2026-09-01 14:57:45 +02:00
goyban 196edf1120 Merge branch 'main' into codex/fix-list-truncation 2026-09-01 14:57:30 +02:00
goyban faf4fee274 Merge pull request 'Add menu command' (#1) from snail/add-menu-command into main
Reviewed-on: #1
2026-07-27 12:02:19 +02:00
snail 2f694908bf Fix list truncation 2026-07-26 20:06:40 +02:00
snail f14fdc20f7 Register Telegram command menu 2026-07-26 18:14:24 +02:00
snail 53aa9cfda7 Add menu command 2026-07-26 16:56:29 +02:00
goyban 52d842d7be Add admin/user roles, /edit command, sticker support, and registry push workflow
- Split docker-compose into build (docker-compose.build.yaml) and deploy (docker-compose.yaml pulls from registry)
- Add push.sh for building and pushing versioned images to git.goyban.com/goyban/bot_meme
- Add ADMIN_USERS env var; admins can add/edit/delete, users can search
- Add /edit command with inline keyboard to update meme keywords
- Add sticker support (save and serve via inline)
- Switch /delete to use numeric row ID instead of file_unique_id
- Search is now global (shared pool) instead of per-user

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 09:17:13 +02:00
goyban de9e3b12af Add repo URL to README files 2026-04-24 23:04:37 +00:00
goyban c832350300 Initial commit — personal Telegram meme bot with inline search 2026-04-24 17:49:22 +00:00