|
| 1 | +from dataclasses import dataclass, field |
1 | 2 | from functools import partial |
2 | 3 | from json import dumps, loads |
3 | 4 | from queue import Queue |
4 | | -from typing import Optional |
| 5 | +from typing import Optional, Any, List |
5 | 6 |
|
6 | 7 | from keyring import get_password |
7 | 8 | from obsws_python import ReqClient |
|
10 | 11 |
|
11 | 12 | import constant |
12 | 13 | from constant import * |
13 | | -from models.classes import ThreadSafeDict |
| 14 | +from .app_state_base import StateBase |
14 | 15 |
|
15 | 16 | dumps = partial(dumps, ensure_ascii=False, |
16 | 17 | separators=(",", ":")) |
17 | | -_APP_CONFIG_INITIALIZATION = { |
18 | | - "proxy_mode": ProxyMode.NONE, |
19 | | - "custom_proxy_url": "", |
20 | | - "custom_tray_icon": "", |
21 | | - "custom_tray_hint": "", |
22 | | - "custom_font": "", |
23 | | - "prefer_proto": PreferProto.RTMP, |
24 | | -} |
25 | | -_OBS_SETTINGS_INITIALIZATION = { |
26 | | - "ip_addr": "localhost", |
27 | | - "port": "4455", |
28 | | - "password": "", |
29 | | - "auto_live": False, |
30 | | - "auto_connect": False |
31 | | -} |
32 | | -_SCAN_STATUS_INITIALIZATION = { |
33 | | - "scanned": False, "qr_key": None, "qr_url": None, |
34 | | - "expired": False, "is_new": False, |
35 | | - "cred_loaded": False, |
36 | | - "timeout": False, "wait_for_confirm": False, |
37 | | - "area_updated": False, "room_updated": False, |
38 | | - "const_updated": False, "announce_updated": False |
39 | | -} |
40 | | -_STREAM_STATUS_INITIALIZATION = { |
41 | | - "live_status": False, |
42 | | - "required_face": False, |
43 | | - "identified_face": False, |
44 | | - "face_url": None, |
45 | | - "stream_addr": None, |
46 | | - "stream_key": None |
47 | | -} |
48 | | -_ROOM_INFO_INITIALIZATION = { |
49 | | - "cover_audit_reason": "", |
50 | | - "cover_url": "", |
51 | | - "cover_status": CoverStatus.AUDIT_IN_PROGRESS, |
52 | | - "cover_data": None, |
53 | | - "room_id": "", |
54 | | - "title": "", |
55 | | - "parent_area": "", |
56 | | - "area": "", |
57 | | - "announcement": "", |
58 | | - "recent_areas": [], |
59 | | - "recent_title": [], |
60 | | -} |
| 18 | + |
| 19 | + |
| 20 | +@dataclass |
| 21 | +class AppSettings(StateBase): |
| 22 | + proxy_mode: ProxyMode = ProxyMode.NONE |
| 23 | + custom_proxy_url: str = "" |
| 24 | + custom_tray_icon: str = "" |
| 25 | + custom_tray_hint: str = "" |
| 26 | + custom_font: str = "" |
| 27 | + prefer_proto: PreferProto = PreferProto.RTMP |
| 28 | + |
| 29 | + |
| 30 | +@dataclass |
| 31 | +class ObsSettings(StateBase): |
| 32 | + ip_addr: str = "localhost" |
| 33 | + port: str = "4455" |
| 34 | + password: str = "" |
| 35 | + auto_live: bool = False |
| 36 | + auto_connect: bool = False |
| 37 | + |
| 38 | + |
| 39 | +@dataclass |
| 40 | +class ScanStatus(StateBase): |
| 41 | + scanned: bool = False |
| 42 | + qr_key: Optional[str] = None |
| 43 | + qr_url: Optional[str] = None |
| 44 | + expired: bool = False |
| 45 | + is_new: bool = False |
| 46 | + cred_loaded: bool = False |
| 47 | + timeout: bool = False |
| 48 | + wait_for_confirm: bool = False |
| 49 | + area_updated: bool = False |
| 50 | + room_updated: bool = False |
| 51 | + const_updated: bool = False |
| 52 | + announce_updated: bool = False |
| 53 | + |
| 54 | + |
| 55 | +@dataclass |
| 56 | +class StreamStatus(StateBase): |
| 57 | + live_status: bool = False |
| 58 | + required_face: bool = False |
| 59 | + identified_face: bool = False |
| 60 | + face_url: Optional[str] = None |
| 61 | + stream_addr: Optional[str] = None |
| 62 | + stream_key: Optional[str] = None |
| 63 | + |
| 64 | + |
| 65 | +@dataclass |
| 66 | +class RoomInfo(StateBase): |
| 67 | + cover_audit_reason: str = "" |
| 68 | + cover_url: str = "" |
| 69 | + cover_status: CoverStatus = CoverStatus.AUDIT_IN_PROGRESS |
| 70 | + cover_data: Any = None |
| 71 | + room_id: str = "" |
| 72 | + title: str = "" |
| 73 | + parent_area: str = "" |
| 74 | + area: str = "" |
| 75 | + announcement: str = "" |
| 76 | + recent_areas: List[str] = field(default_factory=list) |
| 77 | + recent_title: List[str] = field(default_factory=list) |
| 78 | + |
61 | 79 |
|
62 | 80 | # Queue to communicate with OBS in a separate thread |
63 | 81 | obs_req_queue = Queue() |
64 | 82 |
|
65 | 83 | # Scan status flags for login |
66 | | -scan_status = ThreadSafeDict.new(_SCAN_STATUS_INITIALIZATION) |
| 84 | +scan_status = ScanStatus() |
67 | 85 |
|
68 | 86 | # Stream status stores fetched RTMP info and verification state |
69 | | -stream_status = ThreadSafeDict.new(_STREAM_STATUS_INITIALIZATION) |
| 87 | +stream_status = StreamStatus() |
70 | 88 |
|
71 | | -app_settings = ThreadSafeDict.new(_APP_CONFIG_INITIALIZATION) |
| 89 | +app_settings = AppSettings() |
72 | 90 |
|
73 | 91 | if (app := get_password(KEYRING_SERVICE_NAME, |
74 | 92 | KEYRING_APP_SETTINGS)) is not None: |
75 | 93 | app_settings.update(loads(app)) |
76 | 94 |
|
77 | 95 | # Managed by models.workers.credential_manager |
78 | | -room_info = ThreadSafeDict({}) |
79 | | -obs_settings = ThreadSafeDict({}) |
80 | | -usernames = ThreadSafeDict({}) |
| 96 | +room_info = RoomInfo() |
| 97 | +obs_settings = ObsSettings() |
| 98 | +usernames = {} |
81 | 99 | # A cache of cookie indices |
82 | 100 | cookie_indices = [] |
83 | 101 |
|
@@ -125,24 +143,24 @@ def create_session() -> Session: |
125 | 143 | return session |
126 | 144 |
|
127 | 145 |
|
128 | | -def app_settings_default(): |
129 | | - app_settings.update(_APP_CONFIG_INITIALIZATION) |
| 146 | +def app_settings_default() -> None: |
| 147 | + app_settings.reset() |
130 | 148 |
|
131 | 149 |
|
132 | | -def scan_settings_default(): |
133 | | - scan_status.update(_SCAN_STATUS_INITIALIZATION) |
| 150 | +def scan_settings_default() -> None: |
| 151 | + scan_status.reset() |
134 | 152 | scan_status["const_updated"] = True |
135 | 153 |
|
136 | 154 |
|
137 | | -def room_info_default(): |
138 | | - _ROOM_INFO_INITIALIZATION["recent_areas"].clear() |
139 | | - _ROOM_INFO_INITIALIZATION["recent_title"].clear() |
140 | | - room_info.update(_ROOM_INFO_INITIALIZATION) |
| 155 | +def room_info_default() -> None: |
| 156 | + room_info.recent_areas.clear() |
| 157 | + room_info.recent_title.clear() |
| 158 | + room_info.reset() |
141 | 159 |
|
142 | 160 |
|
143 | | -def stream_status_default(): |
144 | | - stream_status.update(_STREAM_STATUS_INITIALIZATION) |
| 161 | +def stream_status_default() -> None: |
| 162 | + stream_status.reset() |
145 | 163 |
|
146 | 164 |
|
147 | | -def obs_settings_default(): |
148 | | - obs_settings.update(_OBS_SETTINGS_INITIALIZATION) |
| 165 | +def obs_settings_default() -> None: |
| 166 | + obs_settings.reset() |
0 commit comments