"""telegram_bindings — wallet ↔ Telegram chat_id mapping with per-source prefs. Revision ID: 020 Revises: 019 Create Date: 2026-05-24 """ from alembic import op import sqlalchemy as sa revision = "020" down_revision = "019" branch_labels = None depends_on = None def upgrade() -> None: op.create_table( "telegram_bindings", sa.Column("id", sa.Integer, primary_key=True), sa.Column("wallet_address", sa.String(64), nullable=False, unique=True, index=True), # Telegram chat_id is an int64 in practice; store as BigInteger to be safe. sa.Column("chat_id", sa.BigInteger, nullable=False, unique=True, index=True), sa.Column("tg_username", sa.String(64), nullable=True), # display only sa.Column("bound_at", sa.DateTime, nullable=False, server_default=sa.func.now()), # Master switch sa.Column("alerts_enabled", sa.Boolean, nullable=False, server_default=sa.true()), # Per-source toggles. KOL divergence is noisier so default-off. sa.Column("alert_trump", sa.Boolean, nullable=False, server_default=sa.true()), sa.Column("alert_btc_bottom", sa.Boolean, nullable=False, server_default=sa.true()), sa.Column("alert_funding", sa.Boolean, nullable=False, server_default=sa.true()), sa.Column("alert_kol_divergence", sa.Boolean, nullable=False, server_default=sa.false()), # Quality floor — don't ping for low-confidence Trump posts. sa.Column("min_confidence", sa.Integer, nullable=False, server_default="70"), # Quiet hours (UTC). 0..23. Both null = always on. If startend, mute window wraps midnight. sa.Column("mute_from_hour", sa.Integer, nullable=True), sa.Column("mute_until_hour", sa.Integer, nullable=True), # Audit sa.Column("last_alert_at", sa.DateTime, nullable=True), sa.Column("total_alerts_sent", sa.Integer, nullable=False, server_default="0"), sa.Column("total_alerts_failed", sa.Integer, nullable=False, server_default="0"), ) def downgrade() -> None: op.drop_table("telegram_bindings")