# manasbir/open-class-discord architecture

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

- Interactive diagram: https://gitdiagram.com/manasbir/open-class-discord
- Repository: https://github.com/manasbir/open-class-discord

## Overview

Open Class Discord is a Waterloo classroom-availability bot. Students invoke Discord slash commands; the worker verifies and dispatches interactions, and the find-class command queries D1 for rooms available at the requested time and formats an embed response. Separately, scheduled worker events refresh classroom data from the Waterloo Open Data API into D1. The sampled code establishes the lookup and initialization paths; the refresh implementation and init command handler were not sampled, so their internal wiring is not expanded.

Main entry points: [`crates/d1/src/init.rs`](https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/init.rs) (Class Data Initializer), [`crates/discord/src/lib.rs`](https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/lib.rs) (Command Router), [`crates/discord/src/commands/find_class.rs`](https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/commands/find_class.rs) (Find Class), [`workers/src/lib.rs`](https://github.com/manasbir/open-class-discord/blob/master/workers/src/lib.rs) (Scheduled Refresh)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Worker Runtime"]
  node_worker_fetch["HTTP Handler<br/>[lib.rs]"]
  node_scheduled["Scheduled Refresh<br/>[lib.rs]"]
end

subgraph group_discord["Discord Commands"]
  node_interaction_parser["Interaction Parser<br/>[lib.rs]"]
  node_command_router["Command Router<br/>[lib.rs]"]
  node_find_command["Find Class<br/>[find_class.rs]"]
  node_init_command["Init Command<br/>[init.rs]"]
  node_embed_builder["Embed Builder<br/>[builder.rs]"]
  node_command_specs["Command Definitions<br/>[mod.rs]"]
end

subgraph group_data["Classroom Data"]
  node_class_initializer["Class Data Initializer<br/>[init.rs]"]
  node_data_inserters["Data Inserters<br/>[insert.rs]"]
  node_refresh_logic["Refresh Logic<br/>[refresh.rs]"]
  node_availability_query["Availability Query<br/>[lib.rs]"]
  node_uw_portal["Portal Client<br/>[lib.rs]"]
end

subgraph group_integrations["External Services"]
  node_d1_database[("D1 Database")]
  node_discord_service(("Discord API"))
  node_uw_api(("UW Open Data"))
end

node_student(("Student"))

node_student -->|"invokes commands"| node_discord_service
node_discord_service -->|"posts interactions"| node_worker_fetch
node_worker_fetch -->|"dispatches request"| node_interaction_parser
node_interaction_parser -->|"routes commands"| node_command_router
node_command_router -->|"dispatches find"| node_find_command
node_command_router -->|"dispatches init"| node_init_command
node_find_command -->|"queries availability"| node_availability_query
node_availability_query -->|"reads rooms"| node_d1_database
node_find_command -->|"builds response"| node_embed_builder
node_embed_builder -->|"returns embed"| node_discord_service
node_scheduled -->|"runs refresh"| node_refresh_logic
node_scheduled -->|"provides database"| node_d1_database
node_class_initializer -->|"fetches classes"| node_uw_portal
node_uw_portal -->|"requests data"| node_uw_api
node_class_initializer -->|"prepares records"| node_data_inserters
node_class_initializer -->|"batches writes"| node_d1_database
node_data_inserters -->|"prepares statements"| node_d1_database
node_command_specs -->|"defines commands"| node_discord_service

click node_worker_fetch "https://github.com/manasbir/open-class-discord/blob/master/workers/src/lib.rs"
click node_scheduled "https://github.com/manasbir/open-class-discord/blob/master/workers/src/lib.rs"
click node_interaction_parser "https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/lib.rs"
click node_command_router "https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/lib.rs"
click node_find_command "https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/commands/find_class.rs"
click node_init_command "https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/commands/init.rs"
click node_embed_builder "https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/embed/builder.rs"
click node_command_specs "https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/commands/mod.rs"
click node_class_initializer "https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/init.rs"
click node_data_inserters "https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/insert.rs"
click node_refresh_logic "https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/refresh.rs"
click node_availability_query "https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/lib.rs"
click node_uw_portal "https://github.com/manasbir/open-class-discord/blob/master/crates/portal/src/lib.rs"

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_worker_fetch,node_scheduled toneBlue
class node_interaction_parser,node_command_router,node_find_command,node_init_command,node_embed_builder,node_command_specs toneAmber
class node_class_initializer,node_data_inserters,node_refresh_logic,node_availability_query,node_uw_portal toneMint
class node_d1_database,node_discord_service,node_uw_api toneRose
class node_student toneIndigo
```

## Components

### Worker Runtime

- [HTTP Handler](https://github.com/manasbir/open-class-discord/blob/master/workers/src/lib.rs): `workers/src/lib.rs`
- [Scheduled Refresh](https://github.com/manasbir/open-class-discord/blob/master/workers/src/lib.rs): `workers/src/lib.rs`

### Discord Commands

- [Interaction Parser](https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/lib.rs): `crates/discord/src/lib.rs`
- [Command Router](https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/lib.rs): `crates/discord/src/lib.rs`
- [Find Class](https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/commands/find_class.rs): `crates/discord/src/commands/find_class.rs`
- [Init Command](https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/commands/init.rs): `crates/discord/src/commands/init.rs`
- [Embed Builder](https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/embed/builder.rs): `crates/discord/src/embed/builder.rs`
- [Command Definitions](https://github.com/manasbir/open-class-discord/blob/master/crates/discord/src/commands/mod.rs): `crates/discord/src/commands/mod.rs`

### Classroom Data

- [Class Data Initializer](https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/init.rs): `crates/d1/src/init.rs`
- [Data Inserters](https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/insert.rs): `crates/d1/src/insert.rs`
- [Refresh Logic](https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/refresh.rs): `crates/d1/src/refresh.rs`
- [Availability Query](https://github.com/manasbir/open-class-discord/blob/master/crates/d1/src/lib.rs): `crates/d1/src/lib.rs`
- [Portal Client](https://github.com/manasbir/open-class-discord/blob/master/crates/portal/src/lib.rs): `crates/portal/src/lib.rs`

### External Services

- **D1 Database**
- **Discord API**
- **UW Open Data**

### Other components

- **Student**

## Connections

- Student → Discord API: invokes commands
- Discord API → HTTP Handler: posts interactions
- HTTP Handler → Interaction Parser: dispatches request
- Interaction Parser → Command Router: routes commands
- Command Router → Find Class: dispatches find
- Command Router → Init Command: dispatches init
- Find Class → Availability Query: queries availability
- Availability Query → D1 Database: reads rooms
- Find Class → Embed Builder: builds response
- Embed Builder → Discord API: returns embed
- Scheduled Refresh → Refresh Logic: runs refresh
- Scheduled Refresh → D1 Database: provides database
- Class Data Initializer → Portal Client: fetches classes
- Portal Client → UW Open Data: requests data
- Class Data Initializer → Data Inserters: prepares records
- Class Data Initializer → D1 Database: batches writes
- Data Inserters → D1 Database: prepares statements
- Command Definitions → Discord API: defines commands
