43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
"""
|
|
Per-user conversation state machine.
|
|
"""
|
|
|
|
from dataclasses import dataclass, field
|
|
from enum import Enum, auto
|
|
from typing import Optional
|
|
|
|
from qobuz_client import AlbumItem, SearchItem
|
|
|
|
|
|
class State(Enum):
|
|
IDLE = auto() # waiting for a search query
|
|
RESULTS = auto() # results shown, waiting for a numbered choice
|
|
ARTIST_OPTIONS = auto() # artist chosen, waiting for "1" or "2"
|
|
DOWNLOADING = auto() # download in progress
|
|
|
|
|
|
@dataclass
|
|
class ResultEntry:
|
|
"""One numbered line shown to the user."""
|
|
display: str # text shown in the list
|
|
kind: str # "artist" or "album"
|
|
item: SearchItem # original search item (has .url)
|
|
|
|
|
|
@dataclass
|
|
class PendingArtist:
|
|
name: str
|
|
albums: list[AlbumItem] # full album list, sorted newest-first
|
|
|
|
|
|
@dataclass
|
|
class UserSession:
|
|
state: State = State.IDLE
|
|
entries: list[ResultEntry] = field(default_factory=list)
|
|
pending_artist: Optional[PendingArtist] = None
|
|
|
|
def reset(self) -> None:
|
|
self.state = State.IDLE
|
|
self.entries = []
|
|
self.pending_artist = None
|