/
config.py
147 lines (112 loc) · 4.1 KB
/
config.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import itertools
import os
from pathlib import Path
from typing import NamedTuple
import openai
from tinydb import TinyDB
from orjson_storage import ORJSONStorage
class FriendConfig(NamedTuple):
is_friend: bool
name: str
icon: str
good_icon: str
bad_icon: str
channel: str
def ui_config(self) -> dict[str, str]:
return UI_CONFIG | {
'IS_FRIEND': self.is_friend,
'STREAMER_NAME': self.name,
'STREAMER_ICON': self.icon,
'STREAMER_GOOD_ICON': self.good_icon,
'STREAMER_BAD_ICON': self.bad_icon
}
for require in ['yt-dlp', 'ffmpeg']:
assert any(os.path.exists(os.path.join(p, require))
for p in os.environ['PATH'].split(os.pathsep)), \
'You are missing the required dependency: ' + require
MAX_STARS = 2
# (if applicable)
# don't forget to adjust the easter egg (STREAMER_GOOD_ICON, STREAMER_BAD_ICON) values in results.jinja2
# maximum number of concurrent connections per userscript user
MAX_USERSCRIPT_SLOTS = 3
RANK_FILE_CONVERT_EXT = {'.png'}
RANK_FILE_EXT = '.webp'
PASSWORD = os.getenv('PASSWORD', None)
if PASSWORD is None:
print('[WARN] 🚧 You have not set the PASSWORD environment variable')
TTV_TOKEN = os.environ['TTV_TOKEN']
TTV_USERNAME = os.environ['TTV_USERNAME']
TTV_CHANNEL = os.environ['TTV_CHANNEL']
VOTE_WHITELIST = set(u.strip() for u in os.getenv('VOTE_WHITELIST', '').lower().split(','))
NO_MONITOR = os.getenv('NO_MONITOR') == '1'
NO_DOWNLOAD = os.getenv('NO_DOWNLOAD') == '1'
NO_AUTO_FINISH = os.getenv('NO_AUTO_FINISH') == '1'
DUMMY_VOTES = int(os.getenv('DUMMY_VOTES', '0'))
DATA_DIR = Path('data')
DATA_DIR.mkdir(exist_ok=True)
CLIPS_PATH = DATA_DIR / 'clips.txt'
CLIPS_REPLAY_PATH = DATA_DIR / 'clips_replay.txt'
BLACKLIST_PATH = DATA_DIR / 'blacklist.txt'
DB_PATH = DATA_DIR / 'db.json'
SUMMARY_MIN_VOTES = int(os.getenv('SUMMARY_MIN_VOTES', '5'))
# ensure proper file permissions
for file in [CLIPS_PATH, CLIPS_REPLAY_PATH, BLACKLIST_PATH, DB_PATH]:
with open(file, 'a+') as f:
pass
CACHE_DIR = DATA_DIR / 'cache'
CACHE_DIR.mkdir(exist_ok=True)
RANKS_DIR = DATA_DIR / 'ranks'
RANKS_DIR.mkdir(exist_ok=True)
DOWNLOAD_DIR = DATA_DIR / 'download'
DOWNLOAD_DIR.mkdir(exist_ok=True)
BOARDS_DIR = DATA_DIR / 'boards'
BOARDS_DIR.mkdir(exist_ok=True)
# ensure proper directory permissions
for dir in [CACHE_DIR, DOWNLOAD_DIR, BOARDS_DIR]:
assert os.access(dir, os.W_OK | os.X_OK), f'Permission denied: {dir}'
OPENAI_KEY = os.getenv('OPENAI_KEY', None)
if OPENAI_KEY:
openai.api_key = OPENAI_KEY
FAST_MODEL = os.getenv('DEFAULT_MODEL', 'gpt-3.5-turbo')
SMART_MODEL = os.getenv('SMART_MODEL', 'gpt-4')
N_TOP_USERS = 5
UI_CONFIG = {
'APP_NAME': 'Teodle',
'APP_TITLE': 'Teodle',
'HEAD_PREFIX': 'teo',
'STREAMER_NAME': 'Teo',
'STREAMER_ICON': 'teo.png',
'STREAMER_GOOD_ICON': 'teo-gold.png', # optional
'STREAMER_BAD_ICON': 'laugh.png', # optional
'FIRST_PLACE_ICON': 'jam.gif',
'MVP_ICON': 'chad.webp',
'FRIENDS': []
}
# override UI_CONFIG with environment variables
for key, default in UI_CONFIG.items():
if (val := os.getenv(key, None)) is not None:
UI_CONFIG[key] = val
FRIENDS: list[FriendConfig] = UI_CONFIG['FRIENDS']
FRIENDS.append(FriendConfig(
is_friend=False,
name=UI_CONFIG['STREAMER_NAME'],
icon=UI_CONFIG['STREAMER_ICON'],
good_icon=UI_CONFIG['STREAMER_GOOD_ICON'],
bad_icon=UI_CONFIG['STREAMER_BAD_ICON'],
channel=TTV_CHANNEL))
for i in itertools.count():
if (name := os.getenv(f'FRIEND_{i}_NAME')) is None \
or (icon := os.getenv(f'FRIEND_{i}_ICON')) is None \
or (good_icon := os.getenv(f'FRIEND_{i}_GOOD_ICON')) is None \
or (bad_icon := os.getenv(f'FRIEND_{i}_BAD_ICON')) is None \
or (channel := os.getenv(f'FRIEND_{i}_CHANNEL')) is None:
break
FRIENDS.append(FriendConfig(
is_friend=True,
name=name,
icon=icon,
good_icon=good_icon,
bad_icon=bad_icon,
channel=channel))
print(f'[CONFIG] Loaded 1+{len(FRIENDS) - 1} friend profiles')
DB = TinyDB(DB_PATH, storage=ORJSONStorage)