Passed
Push — master ( 1a530f...d58f4a )
by manny
02:01 queued 10s
created

racetime_obs.update_sources_preview()   A

Complexity

Conditions 3

Size

Total Lines 21
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 19
nop 0
dl 0
loc 21
rs 9.45
c 0
b 0
f 0
1
from threading import Thread
2
from gadgets.ladder_timer import LadderTimer
3
import gettext
4
import os
5
6
import obspython as obs
7
import clients.racetime_client as racetime_client
8
import scripting.coop_scripting as coop_scripting
9
import scripting.media_player_scripting as media_player_scripting
10
import scripting.qualifier_scripting as qualifier_scripting
11
import scripting.setup_scripting as setup_scripting
12
import scripting.timer_scripting as timer_scripting
13
import scripting.ladder_scripting as ladder_scripting
14
from rtgg_obs import RacetimeObs
15
from scripting import fill_race_list, fill_source_list, set_source_text
16
from scripting import ScriptProperties as sp
17
18
_ = None
19
rtgg_obs = RacetimeObs()
20
ladder_timer = LadderTimer(rtgg_obs.logger)
21
ladder_scripting.ladder_timer = ladder_timer
22
23
24
def script_path():
25
    # PLACEHOLDER
26
    # this function gets injected by OBS with actual script path
27
    pass
28
29
30
def script_description():
31
    set_locale()
32
    message = _(
33
        "Select a text source to use as your timer and enter your "
34
        "full username on racetime.gg  (including discriminator). This "
35
        "only needs to be done once. Then select the race room each "
36
        "race you join and stop worrying about whether you started your "
37
        "timer or not."
38
    )
39
    return (
40
        "<center>racetime-obs xxVERSIONxx<hr>"
41
        "<p>" + message + "<hr/></p>"
42
    )
43
44
45
def script_load(settings):
46
    obs.obs_frontend_add_event_callback(on_load)
47
48
    rtgg_obs.timer.use_podium_colors = obs.obs_data_get_bool(
49
        settings, "use_podium")
50
51
    rtgg_obs.media_player.last_session_race = obs.obs_data_get_string(
52
        settings, "last_session_race")
53
54
    obs.obs_data_set_string(settings, "race", sp.none_races)
55
56
57
def on_load(event):
58
    if event == obs.OBS_FRONTEND_EVENT_FINISHED_LOADING:
59
        race_update_t = Thread(target=rtgg_obs.race_update_thread)
60
        race_update_t.daemon = True
61
        race_update_t.start()
62
63
64
def script_save(settings):
65
    obs.obs_data_set_bool(settings, "use_podium",
66
                          rtgg_obs.timer.use_podium_colors)
67
    obs.obs_data_set_string(
68
        settings, "last_session_race", rtgg_obs.selected_race)
69
70
71
def script_update(settings):
72
    setup_scripting.script_update_setup_settings(settings, rtgg_obs)
73
    timer_scripting.script_update_timer_settings(
74
        settings, rtgg_obs, update_sources
75
    )
76
    coop_scripting.script_update_coop_settings(settings, rtgg_obs)
77
    qualifier_scripting.script_update_qualifier_settings(settings, rtgg_obs)
78
    media_player_scripting.script_update_media_player_settings(
79
        settings, rtgg_obs
80
    )
81
    ladder_scripting.script_update_ladder_settings(settings)
82
83
    rtgg_obs.full_name = obs.obs_data_get_string(settings, "username")
84
85
    rtgg_obs.timer.source_name = obs.obs_data_get_string(settings, "source")
86
87
    rtgg_obs.selected_race = obs.obs_data_get_string(settings, "race")
88
    rtgg_obs.category = obs.obs_data_get_string(settings, "category_filter")
89
90
91
def script_defaults(settings):
92
    set_locale()
93
    obs.obs_data_set_default_string(settings, "race_info", _("Race info"))
94
    obs.obs_data_set_default_string(settings, "race", "None")
95
    obs.obs_data_set_default_int(settings, "qualifier_cutoff", 3)
96
97
98
def set_locale():
99
    global _
100
    if _ is None:
101
        os.environ['LOCALEDIR'] = script_path() + "locales"
102
        os.environ['LANGUAGE'] = obs.obs_get_locale()[0:2]
103
        lang = gettext.translation(
104
            "racetime-obs", localedir=os.environ['LOCALEDIR'])
105
        _ = lang.gettext
106
107
108
def script_properties():
109
    props = obs.obs_properties_create()
110
    setup_scripting.script_setup(
111
        props, new_race_selected, new_category_selected
112
    )
113
114
    refresh = obs.obs_properties_add_button(
115
        props, "button", _("Refresh"), lambda *props: None)
116
    obs.obs_property_set_modified_callback(refresh, refresh_pressed)
117
    timer_scripting.script_timer_settings(props, rtgg_obs,)
118
    coop_scripting.script_coop_settings(props, rtgg_obs)
119
    qualifier_scripting.script_qualifier_settings(props, rtgg_obs)
120
    media_player_scripting.script_media_player_settings(
121
        props, rtgg_obs, media_player_toggled
122
    )
123
    ladder_scripting.script_ladder_settings(props)
124
125
    return props
126
127
128
def refresh_pressed(props, prop, *args, **kwargs):
129
    fill_source_list(obs.obs_properties_get(props, "source"))
130
    fill_source_list(obs.obs_properties_get(props, "coop_our_source"))
131
    fill_source_list(obs.obs_properties_get(props, "coop_opponent_source"))
132
    fill_source_list(obs.obs_properties_get(props, "qualifier_par_source"))
133
    fill_source_list(obs.obs_properties_get(props, "qualifier_score_source"))
134
    fill_race_list(rtgg_obs, obs.obs_properties_get(props, "race"),
135
                   obs.obs_properties_get(props, "category_filter"))
136
    coop_scripting.fill_coop_entrant_lists(props, rtgg_obs)
137
    if rtgg_obs.race is not None:
138
        rtgg_obs.coop.update_coop_text(rtgg_obs.race, rtgg_obs.full_name)
139
        update_coop_sources()
140
        rtgg_obs.qualifier.update_qualifier_text(
141
            rtgg_obs.race, rtgg_obs.full_name)
142
        rtgg_obs.media_player.race_updated(
143
                rtgg_obs.race, rtgg_obs.full_name)
144
    return True
145
146
147
def new_race_selected(props, prop, settings):
148
    set_locale()
149
    rtgg_obs.race_changed = True
150
    obs.timer_remove(update_sources)
151
152
    rtgg_obs.selected_race = obs.obs_data_get_string(settings, "race")
153
    if rtgg_obs.selected_race == sp.none_races:
154
        rtgg_obs.race = None
155
    if rtgg_obs.selected_race == sp.alttpr_ladder:
156
        rtgg_obs.race = None
157
        ladder_timer.enabled = True
158
    else:
159
        ladder_timer.enabled = False
160
    r = racetime_client.get_race_by_name(rtgg_obs.selected_race)
161
    if r is not None:
162
        rtgg_obs.race = r
163
        rtgg_obs.coop.update_coop_text(rtgg_obs.race, rtgg_obs.full_name)
164
        rtgg_obs.qualifier.update_qualifier_text(
165
            rtgg_obs.race, rtgg_obs.full_name)
166
        rtgg_obs.media_player.race_updated(
167
                rtgg_obs.race, rtgg_obs.full_name)
168
        rtgg_obs.logger.info(f"new race selected: {rtgg_obs.race}")
169
        obs.obs_data_set_default_string(settings, "race_info", r.info)
170
        coop_scripting.fill_coop_entrant_lists(props, rtgg_obs)
171
        rtgg_obs.timer.enabled = True
172
        obs.timer_add(update_sources, 100)
173
    elif ladder_timer.enabled:
174
        obs.timer_add(update_sources, 100)
175
    elif rtgg_obs.preview_mode:
176
        obs.timer_add(update_sources, 100)
177
    else:
178
        obs.obs_data_set_default_string(
179
            settings, "race_info", _("Race not found"))
180
    return True
181
182
183
def new_category_selected(props, prop, settings):
184
    rtgg_obs.category = obs.obs_data_get_string(settings, "category_filter")
185
    rtgg_obs.logger.info(f"new category selected: {rtgg_obs.category}")
186
    fill_race_list(rtgg_obs, obs.obs_properties_get(props, "race"), prop)
187
    return True
188
189
190
def media_player_toggled(props, prop, settings):
191
    vis = obs.obs_data_get_bool(settings, "use_media_player")
192
    obs.obs_property_set_visible(
193
        obs.obs_properties_get(props, "media_player_group"), vis)
194
    return True
195
196
197
def update_sources():
198
    if rtgg_obs.preview_mode:
199
        update_sources_preview()
200
201
    if rtgg_obs.race is not None:
202
        if rtgg_obs.timer.is_enabled():
203
            color, time = rtgg_obs.timer.get_timer_text(
204
                rtgg_obs.race, rtgg_obs.full_name)
205
            set_source_text(rtgg_obs.timer.source_name, time, color)
206
        update_coop_sources()
207
        if rtgg_obs.qualifier.is_enabled():
208
            set_source_text(rtgg_obs.qualifier.par_source,
209
                            rtgg_obs.qualifier.par_text, None)
210
            set_source_text(rtgg_obs.qualifier.score_source,
211
                            rtgg_obs.qualifier.entrant_score, None)
212
        if rtgg_obs.media_player.enabled:
213
            rtgg_obs.media_player.race_updated(
214
                rtgg_obs.race, rtgg_obs.full_name)
215
    elif ladder_timer.enabled:
216
        color, time = ladder_timer.get_timer_text()
217
        set_source_text(rtgg_obs.timer.source_name, time, color)
218
        stats = ladder_timer.get_stats()
219
        set_source_text(ladder_timer.stats_source, stats, None)
220
221
222
def update_sources_preview():
223
    color, time = rtgg_obs.timer.get_timer_text_preview()
224
    set_source_text(rtgg_obs.timer.source_name, time, color)
225
    if (rtgg_obs.coop.is_enabled()):
226
        rtgg_obs.coop.update_coop_text_preview()
227
        set_source_text(
228
                rtgg_obs.coop.our_time_source,
229
                rtgg_obs.coop.our_time_text,
230
                rtgg_obs.coop.our_time_color
231
            )
232
        set_source_text(
233
                rtgg_obs.coop.opponent_time_source,
234
                rtgg_obs.coop.opponent_time_text,
235
                rtgg_obs.coop.opponent_time_color
236
            )
237
    if (rtgg_obs.qualifier.is_enabled):
238
        rtgg_obs.qualifier.update_qualifier_text_preview()
239
        set_source_text(rtgg_obs.qualifier.par_source,
240
                        rtgg_obs.qualifier.par_text, None)
241
        set_source_text(rtgg_obs.qualifier.score_source,
242
                        rtgg_obs.qualifier.entrant_score, None)
243
244
245
def update_coop_sources():
246
    if rtgg_obs.coop.is_enabled():
247
        rtgg_obs.coop.update_coop_text(rtgg_obs.race, rtgg_obs.full_name)
248
        set_source_text(
249
            rtgg_obs.coop.our_time_source,
250
            rtgg_obs.coop.our_time_text,
251
            rtgg_obs.coop.our_time_color
252
        )
253
        set_source_text(
254
            rtgg_obs.coop.opponent_time_source,
255
            rtgg_obs.coop.opponent_time_text,
256
            rtgg_obs.coop.opponent_time_color
257
        )
258