Implements core bot infrastructure: - modality_map: channel name to modality string mapping (personal_text, voice, fb_messenger, nd_messenger) - config: Config dataclass with env-driven configuration loading for Discord, backend, and email IMAP credentials - backend_client: async HTTP client for posting items to backend /items endpoint All modality_map tests passing (3/3)
45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
import os
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass
|
|
class Config:
|
|
discord_token: str
|
|
guild_id: int
|
|
inbox_channel_id: int
|
|
triage_role_id: int
|
|
backend_base_url: str
|
|
google_voice_imap_host: str
|
|
google_voice_imap_user: str
|
|
google_voice_imap_password: str
|
|
bh_email_imap_host: str
|
|
bh_email_imap_user: str
|
|
bh_email_imap_password: str
|
|
personal_email_imap_host: str
|
|
personal_email_imap_user: str
|
|
personal_email_imap_password: str
|
|
|
|
|
|
def load_config() -> Config:
|
|
def env(name: str) -> str:
|
|
value = os.environ.get(name)
|
|
if not value:
|
|
raise RuntimeError(f"Missing required env var: {name}")
|
|
return value
|
|
|
|
return Config(
|
|
discord_token=env("CHORUS_DISCORD_TOKEN"),
|
|
guild_id=int(env("CHORUS_GUILD_ID")),
|
|
inbox_channel_id=int(env("CHORUS_INBOX_CHANNEL_ID")),
|
|
triage_role_id=int(env("CHORUS_TRIAGE_ROLE_ID")),
|
|
backend_base_url=env("CHORUS_BACKEND_BASE_URL"),
|
|
google_voice_imap_host=env("CHORUS_GVOICE_IMAP_HOST"),
|
|
google_voice_imap_user=env("CHORUS_GVOICE_IMAP_USER"),
|
|
google_voice_imap_password=env("CHORUS_GVOICE_IMAP_PASSWORD"),
|
|
bh_email_imap_host=env("CHORUS_BH_EMAIL_IMAP_HOST"),
|
|
bh_email_imap_user=env("CHORUS_BH_EMAIL_IMAP_USER"),
|
|
bh_email_imap_password=env("CHORUS_BH_EMAIL_IMAP_PASSWORD"),
|
|
personal_email_imap_host=env("CHORUS_PERSONAL_EMAIL_IMAP_HOST"),
|
|
personal_email_imap_user=env("CHORUS_PERSONAL_EMAIL_IMAP_USER"),
|
|
personal_email_imap_password=env("CHORUS_PERSONAL_EMAIL_IMAP_PASSWORD"),
|
|
)
|