# rautaruukkipalich/dummy_bot architecture

> Architecture diagram of the GitHub repository rautaruukkipalich/dummy_bot, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/rautaruukkipalich/dummy_bot
- Repository: https://github.com/rautaruukkipalich/dummy_bot

## Overview

Dummy Bot is a Telegram group bot for managing a “pokak” challenge: admins register groups and configure trigger media, members join or leave, messages can record challenge activity, and users can request period statistics and graphs. Admins can also mute members. The sampled application wiring connects Telegram routers to use cases, repositories, and PostgreSQL; README capabilities fill in some unsampled handler details, so uncertain internal calls are omitted.

Main entry points: [`dummy_bot/internal/app/app.py`](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/app/app.py) (Application), [`dummy_bot/internal/presentation/commands.py`](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/presentation/commands.py) (Command handlers), [`dummy_bot/internal/database/uow/uow.py`](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/database/uow/uow.py) (Transaction manager), [`dummy_bot/internal/usecase/statistics.py`](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/statistics.py) (Statistics queries)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Bot runtime"]
  node_app["Application<br/>[app.py]"]
  node_entry["CLI entry<br/>[main.py]"]
  node_admin_middleware["Admin checks<br/>[admins_mw.py]"]
end

subgraph group_features["Bot features"]
  node_command_router["Command handlers<br/>[commands.py]"]
  node_state_router["Media state handlers<br/>[states.py]"]
  node_text_router["Message handlers<br/>[text.py]"]
  node_commands_uc["Group and membership<br/>[commands.py]"]
  node_media_uc["Trigger media setup<br/>[media.py]"]
  node_pokak_uc["Challenge activity<br/>[pokak.py]"]
  node_mute_uc["Member muting<br/>[mute.py]"]
end

subgraph group_data["Persistence"]
  node_repos["Feature repositories"]
  node_uow["Transaction manager<br/>[uow.py]"]
  node_postgres_client["PostgreSQL client<br/>[client.py]"]
  node_postgres[("PostgreSQL")]
  node_redis_client["Redis client<br/>[client.py]"]
  node_redis[("Redis")]
end

subgraph group_reporting["Statistics"]
  node_stats_uc["Statistics queries<br/>[statistics.py]"]
  node_reporting_utils["Reports and graphs<br/>[stat_report.py]"]
  node_graph_creator["Graph creation<br/>[graph_creator.py]"]
end

node_member(("Group member"))
node_telegram(("Telegram"))

node_member -->|"sends commands"| node_telegram
node_telegram -->|"delivers updates"| node_app
node_entry -->|"starts"| node_app
node_app -->|"polls and replies"| node_telegram
node_app -->|"wires"| node_command_router
node_app -->|"wires"| node_state_router
node_app -->|"wires"| node_text_router
node_app -->|"installs"| node_admin_middleware
node_admin_middleware -->|"checks cached admins"| node_redis_client
node_redis_client -->|"reads and writes"| node_redis
node_command_router -->|"invokes"| node_commands_uc
node_command_router -->|"requests stats"| node_stats_uc
node_command_router -->|"formats reports"| node_reporting_utils
node_state_router -->|"invokes"| node_media_uc
node_text_router -->|"records activity"| node_pokak_uc
node_text_router -->|"invokes"| node_mute_uc
node_commands_uc -->|"reads and updates"| node_repos
node_media_uc -->|"reads and updates"| node_repos
node_pokak_uc -->|"reads and updates"| node_repos
node_stats_uc -->|"queries"| node_repos
node_commands_uc -->|"opens transactions"| node_uow
node_media_uc -->|"opens transactions"| node_uow
node_pokak_uc -->|"opens transactions"| node_uow
node_stats_uc -->|"opens transactions"| node_uow
node_uow -->|"creates sessions"| node_postgres_client
node_postgres_client -->|"queries"| node_postgres
node_stats_uc -.->|"creates graphs"| node_graph_creator
node_graph_creator -.->|"returns graph"| node_command_router

click node_app "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/app/app.py"
click node_entry "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/cmd/main.py"
click node_command_router "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/presentation/commands.py"
click node_state_router "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/presentation/states.py"
click node_text_router "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/presentation/text.py"
click node_admin_middleware "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/middleware/admins_mw.py"
click node_commands_uc "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/commands.py"
click node_media_uc "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/media.py"
click node_pokak_uc "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/pokak.py"
click node_mute_uc "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/mute.py"
click node_stats_uc "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/statistics.py"
click node_reporting_utils "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/utils/stat_report.py"
click node_graph_creator "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/utils/graph_creator.py"
click node_repos "https://github.com/rautaruukkipalich/dummy_bot/tree/master/dummy_bot/internal/repository"
click node_uow "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/database/uow/uow.py"
click node_postgres_client "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/database/postgres/client.py"
click node_redis_client "https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/database/redis/client.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_entry,node_admin_middleware toneBlue
class node_command_router,node_state_router,node_text_router,node_commands_uc,node_media_uc,node_pokak_uc,node_mute_uc toneAmber
class node_repos,node_uow,node_postgres_client,node_postgres,node_redis_client,node_redis toneMint
class node_stats_uc,node_reporting_utils,node_graph_creator toneRose
class node_member,node_telegram toneIndigo
```

## Components

### Bot runtime

- [Application](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/app/app.py): `dummy_bot/internal/app/app.py`
- [CLI entry](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/cmd/main.py): `dummy_bot/cmd/main.py`
- [Admin checks](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/middleware/admins_mw.py): `dummy_bot/internal/middleware/admins_mw.py`

### Bot features

- [Command handlers](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/presentation/commands.py): `dummy_bot/internal/presentation/commands.py`
- [Media state handlers](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/presentation/states.py): `dummy_bot/internal/presentation/states.py`
- [Message handlers](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/presentation/text.py): `dummy_bot/internal/presentation/text.py`
- [Group and membership](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/commands.py): `dummy_bot/internal/usecase/commands.py`
- [Trigger media setup](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/media.py): `dummy_bot/internal/usecase/media.py`
- [Challenge activity](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/pokak.py): `dummy_bot/internal/usecase/pokak.py`
- [Member muting](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/mute.py): `dummy_bot/internal/usecase/mute.py`

### Persistence

- [Feature repositories](https://github.com/rautaruukkipalich/dummy_bot/tree/master/dummy_bot/internal/repository): `dummy_bot/internal/repository`
- [Transaction manager](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/database/uow/uow.py): `dummy_bot/internal/database/uow/uow.py`
- [PostgreSQL client](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/database/postgres/client.py): `dummy_bot/internal/database/postgres/client.py`
- **PostgreSQL**
- [Redis client](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/database/redis/client.py): `dummy_bot/internal/database/redis/client.py`
- **Redis**

### Statistics

- [Statistics queries](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/usecase/statistics.py): `dummy_bot/internal/usecase/statistics.py`
- [Reports and graphs](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/utils/stat_report.py): `dummy_bot/internal/utils/stat_report.py`
- [Graph creation](https://github.com/rautaruukkipalich/dummy_bot/blob/master/dummy_bot/internal/utils/graph_creator.py): `dummy_bot/internal/utils/graph_creator.py`

### Other components

- **Group member**
- **Telegram**

## Connections

- Group member → Telegram: sends commands
- Telegram → Application: delivers updates
- CLI entry → Application: starts
- Application → Telegram: polls and replies
- Application → Command handlers: wires
- Application → Media state handlers: wires
- Application → Message handlers: wires
- Application → Admin checks: installs
- Admin checks → Redis client: checks cached admins
- Redis client → Redis: reads and writes
- Command handlers → Group and membership: invokes
- Command handlers → Statistics queries: requests stats
- Command handlers → Reports and graphs: formats reports
- Media state handlers → Trigger media setup: invokes
- Message handlers → Challenge activity: records activity
- Message handlers → Member muting: invokes
- Group and membership → Feature repositories: reads and updates
- Trigger media setup → Feature repositories: reads and updates
- Challenge activity → Feature repositories: reads and updates
- Statistics queries → Feature repositories: queries
- Group and membership → Transaction manager: opens transactions
- Trigger media setup → Transaction manager: opens transactions
- Challenge activity → Transaction manager: opens transactions
- Statistics queries → Transaction manager: opens transactions
- Transaction manager → PostgreSQL client: creates sessions
- PostgreSQL client → PostgreSQL: queries
- Statistics queries → Graph creation: creates graphs
- Graph creation → Command handlers: returns graph
