Passed
Push — master ( 1ed32d...5696b4 )
by manny
01:30 queued 11s
created

racetime_obs.script_properties()   A

Complexity

Conditions 2

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 17
rs 9.85
c 0
b 0
f 0
cc 2
nop 0
1
from threading import Thread
2
from typing import List
3
4
import obspython as obs
5
import racetime_client
6
from helpers.obs_context_manager import (
7
    data_ar, source_ar
8
)
9
from models.category import Category
10
from models.race import Race
11
from rtgg_obs import RacetimeObs
12
13
from scripting import fill_source_list
14
import scripting.setup_scripting as setup_scripting
15
import scripting.timer_scripting as timer_scripting
16
import scripting.coop_scripting as coop_scripting
17
import scripting.qualifier_scripting as qualifier_scripting
18
# import scripting.media_player_scripting as media_player_scripting
19
20
rtgg_obs = RacetimeObs()
21
22
23
def script_description():
24
    return (
25
        "<center><p>Select a text source to use as your timer and enter your"
26
        "full username on racetime.gg  (including discriminator). This only"
27
        "needs to be done once.\n\nThen select the race room each race you "
28
        "join and stop worrying about whether you started your timer or not."
29
        "<hr/></p>"
30
    )
31
32
33
def script_load(settings):
34
    rtgg_obs.timer.use_podium_colors = obs.obs_data_get_bool(
35
        settings, "use_podium")
36
37
    race_update_t = Thread(target=rtgg_obs.race_update_thread)
38
    race_update_t.daemon = True
39
    race_update_t.start()
40
41
42
def script_save(settings):
43
    obs.obs_data_set_bool(settings, "use_podium",
44
                          rtgg_obs.timer.use_podium_colors)
45
46
47
def script_update(settings):
48
    setup_scripting.script_update_setup_settings(settings, rtgg_obs)
49
    timer_scripting.script_update_timer_settings(
50
        settings, rtgg_obs, update_sources
51
    )
52
    coop_scripting.script_update_coop_settings(settings, rtgg_obs)
53
    qualifier_scripting.script_update_qualifier_settings(settings, rtgg_obs)
54
    # media_player_scripting.script_update_media_player_settings(
55
    #     settings, rtgg_obs
56
    # )
57
58
    rtgg_obs.full_name = obs.obs_data_get_string(settings, "username")
59
60
    rtgg_obs.timer.source_name = obs.obs_data_get_string(settings, "source")
61
62
    rtgg_obs.selected_race = obs.obs_data_get_string(settings, "race")
63
    rtgg_obs.category = obs.obs_data_get_string(settings, "category_filter")
64
65
66
def script_defaults(settings):
67
    obs.obs_data_set_default_string(settings, "race_info", "Race info")
68
    obs.obs_data_set_default_string(settings, "race", "")
69
    obs.obs_data_set_default_int(settings, "qualifier_cutoff", 3)
70
71
72
def script_properties():
73
    props = obs.obs_properties_create()
74
    setup_scripting.script_setup(
75
        props, new_race_selected, new_category_selected
76
    )
77
78
    refresh = obs.obs_properties_add_button(
79
        props, "button", "Refresh", lambda *props: None)
80
    obs.obs_property_set_modified_callback(refresh, refresh_pressed)
81
    timer_scripting.script_timer_settings(props, rtgg_obs,)
82
    coop_scripting.script_coop_settings(props, rtgg_obs)
83
    qualifier_scripting.script_qualifier_settings(props, rtgg_obs)
84
    # media_player_scripting.script_media_player_settings(
85
    #     props, rtgg_obs, media_player_toggled
86
    # )
87
88
    return props
89
90
91
def refresh_pressed(props, prop, *args, **kwargs):
92
    fill_source_list(obs.obs_properties_get(props, "source"))
93
    fill_source_list(obs.obs_properties_get(props, "coop_label"))
94
    fill_source_list(obs.obs_properties_get(props, "coop_text"))
95
    fill_source_list(obs.obs_properties_get(props, "qualifier_par_source"))
96
    fill_source_list(obs.obs_properties_get(props, "qualifier_score_source"))
97
    fill_race_list(obs.obs_properties_get(props, "race"),
98
                   obs.obs_properties_get(props, "category_filter"))
99
    if rtgg_obs.race is not None:
100
        rtgg_obs.coop.update_coop_text(rtgg_obs.race, rtgg_obs.full_name)
101
        rtgg_obs.qualifier.update_qualifier_text(
102
            rtgg_obs.race, rtgg_obs.full_name)
103
        # rtgg_obs.media_player.update_race(rtgg_obs.race)
104
    return True
105
106
107
def new_race_selected(props, prop, settings):
108
    rtgg_obs.selected_race = obs.obs_data_get_string(settings, "race")
109
    r = racetime_client.get_race_by_name(rtgg_obs.selected_race)
110
    if r is not None:
111
        rtgg_obs.race = r
112
        rtgg_obs.coop.update_coop_text(rtgg_obs.race, rtgg_obs.full_name)
113
        rtgg_obs.qualifier.update_qualifier_text(
114
            rtgg_obs.race, rtgg_obs.full_name)
115
        # rtgg_obs.media_player.update_race(rtgg_obs.race)
116
        rtgg_obs.logger.info(f"new race selected: {rtgg_obs.race}")
117
        obs.obs_data_set_default_string(settings, "race_info", r.info)
118
        coop_scripting.fill_coop_entrant_lists(props, rtgg_obs)
119
    else:
120
        obs.obs_data_set_default_string(
121
            settings, "race_info", "Race not found")
122
123
    rtgg_obs.race_changed = True
124
    return True
125
126
127
def new_category_selected(props, prop, settings):
128
    rtgg_obs.category = obs.obs_data_get_string(settings, "category_filter")
129
    rtgg_obs.logger.info(f"new category selected: {rtgg_obs.category}")
130
    fill_race_list(obs.obs_properties_get(props, "race"), prop)
131
    return True
132
133
134
def media_player_toggled(props, prop, settings):
135
    vis = obs.obs_data_get_bool(settings, "use_media_player")
136
    obs.obs_property_set_visible(
137
        obs.obs_properties_get(props, "media_player_group"), vis)
138
    return True
139
140
141
def update_sources():
142
    if rtgg_obs.race is not None:
143
        if rtgg_obs.timer.is_enabled():
144
            color, time = rtgg_obs.timer.get_timer_text(
145
                rtgg_obs.race, rtgg_obs.full_name)
146
            set_source_text(rtgg_obs.timer.source_name, time, color)
147
        if rtgg_obs.coop.is_enabled():
148
            set_source_text(rtgg_obs.coop.source, rtgg_obs.coop.text, None)
149
            set_source_text(rtgg_obs.coop.label_source,
150
                            rtgg_obs.coop.label_text, None)
151
        if rtgg_obs.qualifier.is_enabled():
152
            set_source_text(rtgg_obs.qualifier.par_source,
153
                            rtgg_obs.qualifier.par_text, None)
154
            set_source_text(rtgg_obs.qualifier.score_source,
155
                            rtgg_obs.qualifier.entrant_score, None)
156
        # if rtgg_obs.media_player.enabled:
157
        #     rtgg_obs.media_player.update_race(rtgg_obs.race)
158
159
160
def fill_race_list(race_list, category_list):
161
    obs.obs_property_list_clear(race_list)
162
    obs.obs_property_list_clear(category_list)
163
    obs.obs_property_list_add_string(category_list, "All", "All")
164
165
    obs.obs_property_list_add_string(race_list, "", "")
166
    races = racetime_client.get_races()
167
    if races is not None:
168
        fill_category_list(category_list, races)
169
        for race in filter_races_by_category(races, rtgg_obs.category):
170
            obs.obs_property_list_add_string(race_list, race.name, race.name)
171
172
173
def fill_category_list(category_list, races: List[Race]):
174
    categories = []
175
    for race in races:
176
        if race.category.name not in categories:
177
            categories.append(race.category.name)
178
            obs.obs_property_list_add_string(
179
                category_list, race.category.name, race.category.name)
180
181
182
def filter_races_by_category(races: List[Race], category: Category) -> Race:
183
    for race in races:
184
        if (
185
            rtgg_obs.category == "" or rtgg_obs.category == "All" or
186
            race.category.name == rtgg_obs.category
187
        ):
188
            yield race
189
190
191
def set_source_text(source_name: str, text: str, color: int):
192
    # copied and modified from scripted-text.py by UpgradeQ
193
    with source_ar(source_name) as source, data_ar() as settings:
194
        obs.obs_data_set_string(settings, "text", text)
195
        source_id = obs.obs_source_get_unversioned_id(source)
196
        if color is not None:
197
            if source_id == "text_gdiplus":
198
                obs.obs_data_set_int(settings, "color", color)  # colored text
199
200
            # freetype2 is BGR, should be reversed for getting correct color
201
            else:
202
                number = "".join(hex(color)[2:])
203
                color = int("0xff" f"{number}", base=16)
204
                obs.obs_data_set_int(settings, "color1", color)
205
206
        obs.obs_source_update(source, settings)
207