Passed
Push — master ( e44069...5b9119 )
by manny
01:44
created

racetime_obs.script_update()   A

Complexity

Conditions 3

Size

Total Lines 46
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 36
dl 0
loc 46
rs 9.016
c 0
b 0
f 0
cc 3
nop 1
1
from threading import Thread
2
import obspython as obs
3
import racetime_client
4
from rtgg_obs import RacetimeObs
5
6
rtgg_obs = RacetimeObs()
7
8
def script_description():
9
    return "<center><p>Select a text source to use as your timer and enter your full " + \
10
        "username on racetime.gg  (including discriminator). This only needs " + \
11
        "to be done once.\n\nThen select the race room each race you join and " + \
12
        "stop worrying about whether you started your timer or not.<hr/></p>"
13
14
15
def script_load(settings):
16
    rtgg_obs.timer.use_podium_colors = obs.obs_data_get_bool(settings, "use_podium")
17
18
    race_update_t = Thread(target=rtgg_obs.race_update_thread)
19
    race_update_t.daemon = True
20
    race_update_t.start()
21
22
23
def script_save(settings):
24
    obs.obs_data_set_bool(settings, "use_podium", rtgg_obs.timer.use_podium_colors)
25
26
def script_update(settings):
27
28
    obs.timer_remove(rtgg_obs.update_sources)
29
30
    rtgg_obs.update_logger(obs.obs_data_get_bool(settings, "enable_log"),
31
        obs.obs_data_get_bool(settings, "log_to_file"),
32
        obs.obs_data_get_string(settings, "log_file"), 
33
        obs.obs_data_get_string(settings, "log_level"))
34
35
    rtgg_obs.full_name = obs.obs_data_get_string(settings, "username")
36
37
    rtgg_obs.timer.source_name = obs.obs_data_get_string(settings, "source")
38
39
    rtgg_obs.selected_race = obs.obs_data_get_string(settings, "race")
40
    rtgg_obs.category = obs.obs_data_get_string(settings, "category_filter")
41
42
    rtgg_obs.timer.use_podium_colors = obs.obs_data_get_bool(settings, "use_podium")
43
    rtgg_obs.timer.pre_color = obs.obs_data_get_int(settings, "pre_color")
44
    rtgg_obs.timer.first_color = obs.obs_data_get_int(settings, "first_color")
45
    rtgg_obs.timer.second_color = obs.obs_data_get_int(settings, "second_color")
46
    rtgg_obs.timer.third_color = obs.obs_data_get_int(settings, "third_color")
47
    rtgg_obs.timer.racing_color = obs.obs_data_get_int(settings, "racing_color")
48
    rtgg_obs.timer.finished_color = obs.obs_data_get_int(settings, "finished_color")
49
50
    if rtgg_obs.timer.source_name != "" and rtgg_obs.selected_race != "":
51
        obs.timer_add(rtgg_obs.update_sources, 100)
52
        rtgg_obs.timer.enabled = True
53
    else:
54
        rtgg_obs.timer.enabled = False
55
    rtgg_obs.logger.debug(f"timer.enabled is {rtgg_obs.timer.enabled}")
56
    rtgg_obs.logger.debug(f"timer.source_name is {rtgg_obs.timer.source_name}")
57
    rtgg_obs.logger.debug(f"selected_race is {rtgg_obs.selected_race}")
58
59
    rtgg_obs.coop.enabled = obs.obs_data_get_bool(settings, "use_coop")
60
    rtgg_obs.coop.partner = obs.obs_data_get_string(settings, "coop_partner")
61
    rtgg_obs.coop.opponent1 = obs.obs_data_get_string(settings, "coop_opponent1")
62
    rtgg_obs.coop.opponent2 = obs.obs_data_get_string(settings, "coop_opponent2")
63
    rtgg_obs.coop.source_name = obs.obs_data_get_string(settings, "coop_source")
64
    rtgg_obs.coop.label_source_name = obs.obs_data_get_string(settings, "coop_label")
65
66
    rtgg_obs.qualifier.enabled = obs.obs_data_get_bool(settings, "use_qualifier")
67
    rtgg_obs.qualifier.qualifier_cutoff = obs.obs_data_get_int(settings, "qualifier_cutoff")
68
    rtgg_obs.qualifier.qualifier_par_source = obs.obs_data_get_string(
69
        settings, "qualifier_par_source")
70
    rtgg_obs.qualifier.qualifier_score_source = obs.obs_data_get_string(
71
        settings, "qualifier_score_source")
72
73
74
def script_defaults(settings):
75
    obs.obs_data_set_default_string(settings, "race_info", "Race info")
76
    obs.obs_data_set_default_string(settings, "race", "")
77
78
def script_properties():
79
    props = obs.obs_properties_create()
80
81
    setup_group = obs.obs_properties_create()
82
    obs.obs_properties_add_group(
83
        props, "initial_setup", "Initial setup - Check to make changes", obs.OBS_GROUP_CHECKABLE, setup_group)
84
    p = obs.obs_properties_add_list(
85
        setup_group, "source", "Text Source", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING)
86
    rtgg_obs.fill_source_list(p)
87
    obs.obs_properties_add_text(
88
        setup_group, "username", "Username", obs.OBS_TEXT_DEFAULT)
89
    logging = obs.obs_properties_add_bool(
90
        setup_group, "enable_log", "Enable logging")
91
    log_levels = obs.obs_properties_add_list(
92
        setup_group, "log_level", "Log lever", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING)
93
    obs.obs_property_list_add_string(log_levels, "Error", "Error")
94
    obs.obs_property_list_add_string(log_levels, "Debug", "Debug")
95
    obs.obs_property_list_add_string(log_levels, "Info", "Info")
96
    obs.obs_property_set_long_description(
97
        logging, "Generally, only log errors unless you are developing or are trying to find a specific problem.")
98
    obs.obs_properties_add_bool(setup_group, "log_to_file", "Log to file?")
99
    #obs.obs_property_set_modified_callback(p, log_to_file_toggled)
100
    obs.obs_properties_add_path(
101
        setup_group, "log_file", "Log File", obs.OBS_PATH_FILE_SAVE, "Text files(*.txt)", None)
102
103
    category_list = obs.obs_properties_add_list(
104
        props, "category_filter", "Filter by Category", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING)
105
    race_list = obs.obs_properties_add_list(
106
        props, "race", "Race", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING)
107
    obs.obs_property_set_modified_callback(race_list, new_race_selected)
108
    obs.obs_property_set_modified_callback(
109
        category_list, new_category_selected)
110
111
    p = obs.obs_properties_add_text(
112
        props, "race_info", "Race Desc", obs.OBS_TEXT_MULTILINE)
113
    obs.obs_property_set_enabled(p, False)
114
115
    refresh = obs.obs_properties_add_button(
116
        props, "button", "Refresh", lambda *props: None)
117
    obs.obs_property_set_modified_callback(refresh, refresh_pressed)
118
119
    p = obs.obs_properties_add_bool(
120
        props, "use_podium", "Use custom color for podium finishes?")
121
    obs.obs_property_set_modified_callback(p, podium_toggled)
122
123
    podium_group = obs.obs_properties_create()
124
    obs.obs_properties_add_group(
125
        props, "podium_group", "Podium Colors", obs.OBS_GROUP_NORMAL, podium_group)
126
    obs.obs_property_set_visible(obs.obs_properties_get(
127
        props, "podium_group"), rtgg_obs.timer.use_podium_colors)
128
129
    obs.obs_properties_add_color(podium_group, "pre_color", "Pre-race:")
130
    obs.obs_properties_add_color(podium_group, "racing_color", "Still racing:")
131
    obs.obs_properties_add_color(podium_group, "first_color", "1st place:")
132
    obs.obs_properties_add_color(podium_group, "second_color", "2nd place:")
133
    obs.obs_properties_add_color(podium_group, "third_color", "3rd place:")
134
    obs.obs_properties_add_color(
135
        podium_group, "finished_color", "After podium:")
136
137
    p = obs.obs_properties_add_bool(
138
        props, "use_coop", "Display coop information?")
139
    obs.obs_property_set_modified_callback(p, coop_toggled)
140
141
    coop_group = obs.obs_properties_create()
142
    obs.obs_properties_add_group(
143
        props, "coop_group", "Co-op Mode", obs.OBS_GROUP_NORMAL, coop_group)
144
    obs.obs_property_set_visible(
145
        obs.obs_properties_get(props, "coop_group"), rtgg_obs.coop.enabled)
146
    p = obs.obs_properties_add_list(
147
        coop_group, "coop_partner", "Co-op Partner", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING)
148
    p = obs.obs_properties_add_list(
149
        coop_group, "coop_opponent1", "Co-op Opponent 1", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING)
150
    p = obs.obs_properties_add_list(
151
        coop_group, "coop_opponent2", "Co-op Opponent 2", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING)
152
    rtgg_obs.fill_coop_entrant_lists(props)
153
    p = obs.obs_properties_add_list(coop_group, "coop_source", "Coop Text Source",
154
                                    obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING)
155
    obs.obs_property_set_long_description(
156
        p, "This text source will display the time that the last racer needs to finish for their team to win")
157
    rtgg_obs.fill_source_list(p)
158
    p = obs.obs_properties_add_list(coop_group, "coop_label", "Coop Label Text Source",
159
                                    obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING)
160
    obs.obs_property_set_long_description(
161
        p, "This text source will be use to display a label such as \'<PartnerName> needs to finish before\' based on who the last racer is")
162
    rtgg_obs.fill_source_list(p)
163
164
    p = obs.obs_properties_add_bool(
165
        props, "use_qualifier", "Display race results as tournament qualifier?")
166
    obs.obs_property_set_modified_callback(p, qualifier_toggled)
167
168
    qualifier_group = obs.obs_properties_create()
169
    obs.obs_properties_add_group(
170
        props, "qualifier_group", "Qualifier Mode", obs.OBS_GROUP_NORMAL, qualifier_group)
171
    obs.obs_property_set_visible(
172
        obs.obs_properties_get(props, "qualifier_group"), rtgg_obs.qualifier.enabled)
173
    p = obs.obs_properties_add_int_slider(
174
        qualifier_group, "qualifier_cutoff", "Use Top X as par time, where X=", 3, 10, 1)
175
    p = obs.obs_properties_add_list(qualifier_group, "qualifier_par_source",
176
                                    "Qualifier Par Time Source", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING)
177
    rtgg_obs.fill_source_list(p)
178
    p = obs.obs_properties_add_list(qualifier_group, "qualifier_score_source",
179
                                    "Qualifier Score Source", obs.OBS_COMBO_TYPE_EDITABLE, obs.OBS_COMBO_FORMAT_STRING)
180
    rtgg_obs.fill_source_list(p)
181
182
    return props
183
184
def refresh_pressed(props, prop, *args, **kwargs):
185
    rtgg_obs.fill_source_list(obs.obs_properties_get(props, "source"))
186
    rtgg_obs.fill_source_list(obs.obs_properties_get(props, "coop_label"))
187
    rtgg_obs.fill_source_list(obs.obs_properties_get(props, "coop_text"))
188
    rtgg_obs.fill_source_list(obs.obs_properties_get(props, "qualifier_par_source"))
189
    rtgg_obs.fill_source_list(obs.obs_properties_get(props, "qualifier_score_source"))
190
    rtgg_obs.fill_race_list(obs.obs_properties_get(props, "race"),
191
                obs.obs_properties_get(props, "category_filter"))
192
    if rtgg_obs.race is not None:
193
        rtgg_obs.coop.update_coop_text(rtgg_obs.race, rtgg_obs.full_name)
194
        rtgg_obs.qualifier.update_qualifier_text(rtgg_obs.race, rtgg_obs.full_name)
195
    return True
196
197
198
def new_race_selected(props, prop, settings):
199
    rtgg_obs.selected_race = obs.obs_data_get_string(settings, "race")
200
    r = racetime_client.get_race(rtgg_obs.selected_race)
201
    if r is not None:
202
        rtgg_obs.race = r
203
        rtgg_obs.coop.update_coop_text(rtgg_obs.race, rtgg_obs.full_name)
204
        rtgg_obs.qualifier.update_qualifier_text(rtgg_obs.race, rtgg_obs.full_name)
205
        rtgg_obs.logger.info(f"new race selected: {rtgg_obs.race}")
206
        obs.obs_data_set_default_string(settings, "race_info", r.info)
207
        rtgg_obs.fill_coop_entrant_lists(props)
208
    else:
209
        obs.obs_data_set_default_string(
210
            settings, "race_info", "Race not found")
211
212
    rtgg_obs.race_changed = True
213
    return True
214
215
216
def new_category_selected(props, prop, settings):
217
    rtgg_obs.category = obs.obs_data_get_string(settings, "category_filter")
218
    rtgg_obs.logger.info(f"new category selected: {rtgg_obs.category}")
219
    rtgg_obs.fill_race_list(obs.obs_properties_get(props, "race"), prop)
220
    return True
221
222
223
def podium_toggled(props, prop, settings):
224
    vis = obs.obs_data_get_bool(settings, "use_podium")
225
    obs.obs_property_set_visible(
226
        obs.obs_properties_get(props, "podium_group"), vis)
227
    return True
228
229
230
def coop_toggled(props, prop, settings):
231
    vis = obs.obs_data_get_bool(settings, "use_coop")
232
    obs.obs_property_set_visible(
233
        obs.obs_properties_get(props, "coop_group"), vis)
234
    return True
235
236
237
def qualifier_toggled(props, prop, settings):
238
    vis = obs.obs_data_get_bool(settings, "use_qualifier")
239
    obs.obs_property_set_visible(
240
        obs.obs_properties_get(props, "qualifier_group"), vis)
241
    return True
242