Skip to content

Commit abceb7a

Browse files
authored
added multi parameter update (#47)
1 parent 7e90215 commit abceb7a

File tree

3 files changed

+90
-15
lines changed

3 files changed

+90
-15
lines changed

pyvts/tests/test_utils.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,22 @@ async def handler(self, websocket):
7272
del self.custom_param[pname]
7373
send_msg["data"] = {"parameter": pname, "message": "Deleted"}
7474
elif dict_msg["messageType"] == "InjectParameterDataRequest":
75-
pname = dict_msg["data"]["parameterValues"][0]["id"]
76-
if pname in self.custom_param:
77-
self.custom_param[pname]["value"] = float(
78-
dict_msg["data"]["parameterValues"][0]["value"]
79-
) * float(dict_msg["data"]["parameterValues"][0]["weight"]) + float(
80-
self.custom_param[pname]["value"]
81-
) * float(
82-
(1 - dict_msg["data"]["parameterValues"][0]["weight"])
83-
)
84-
send_msg["data"] = {"parameter": pname, "message": "set"}
85-
else:
86-
send_msg["data"] = {
87-
"errorID": 500,
88-
"message": "Given parameter start parameter does not exist.",
89-
}
75+
for pdata in dict_msg["data"]["parameterValues"]:
76+
pname = pdata["id"]
77+
if pname in self.custom_param:
78+
self.custom_param[pname]["value"] = float(
79+
pdata["value"]
80+
) * float(pdata["weight"]) + float(
81+
self.custom_param[pname]["value"]
82+
) * float(
83+
(1 - pdata["weight"])
84+
)
85+
send_msg["data"] = {"parameter": pname, "message": "set"}
86+
else:
87+
send_msg["data"] = {
88+
"errorID": 500,
89+
"message": "Given parameter start parameter does not exist.",
90+
}
9091

9192
# About event subscribe
9293
elif dict_msg["messageType"] == "EventSubscriptionRequest":

pyvts/tests/test_vts.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,43 @@ async def test_vts_custon_parameter(myvts: pyvts.vts):
108108
await fake_server.stop()
109109

110110

111+
@pytest.mark.asyncio
112+
async def test_vts_custon_parameter_multi(myvts: pyvts.vts):
113+
"""test vts functions for multi parameter update"""
114+
fake_server = FakeVtubeStudioAPIServer()
115+
await fake_server.start(port=PORT)
116+
await myvts.connect()
117+
param_names = ["test-1", "test-2"]
118+
vals = [0.5, 0.5]
119+
# create custom parameters
120+
for name in param_names:
121+
await myvts.request(
122+
myvts.vts_request.requestCustomParameter(name, default_value=0)
123+
)
124+
custom_param_value = await myvts.request(
125+
myvts.vts_request.requestParameterValue(name)
126+
)
127+
assert custom_param_value["data"]["value"] == 0
128+
# set value for these parameters
129+
await myvts.request(
130+
myvts.vts_request.requestSetMultiParameterValue(param_names, vals)
131+
)
132+
133+
for name in param_names:
134+
custom_param_value = await myvts.request(
135+
myvts.vts_request.requestParameterValue(name)
136+
)
137+
assert custom_param_value["data"]["value"] == 0.5
138+
# delete parameter
139+
await myvts.request(myvts.vts_request.requestDeleteCustomParameter(name))
140+
custom_param_value = await myvts.request(
141+
myvts.vts_request.requestParameterValue(name)
142+
)
143+
assert custom_param_value["data"]["errorID"] == 500
144+
await myvts.close()
145+
await fake_server.stop()
146+
147+
111148
@pytest.mark.asyncio
112149
async def test_vts_event_subscription(myvts: pyvts.vts):
113150
"""test vts functions about event subscribe"""

pyvts/vts_request.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,43 @@ def requestSetParameterValue(
243243
}
244244
return self.BaseRequest("InjectParameterDataRequest", data=data)
245245

246+
def requestSetMultiParameterValue(
247+
self,
248+
parameters: list[str],
249+
values: list[float],
250+
weight: float = 1,
251+
face_found=False,
252+
mode="set",
253+
) -> dict:
254+
"""
255+
Set values for any default or custom parameters.
256+
257+
Args
258+
----------
259+
parameter : list[str]
260+
Names of the parameters
261+
value : list[float]
262+
Values of the data, [-1000000, 1000000]
263+
weight : float, optional
264+
You can mix the your value with vts face tracking parameter, from 0 to 1,
265+
face_found : bool, optional
266+
if true, you will tell VTubeStudio to consider the user face as found,
267+
s.t. you can control when the "tracking lost"
268+
269+
Returns
270+
-------
271+
organized message sending to ``Vtubestudio API``
272+
"""
273+
data = {
274+
"faceFound": face_found,
275+
"mode": mode,
276+
"parameterValues": [
277+
{"id": parameters[i], "weight": weight, "value": values[i]}
278+
for i, _ in enumerate(parameters)
279+
],
280+
}
281+
return self.BaseRequest("InjectParameterDataRequest", data=data)
282+
246283
def requestDeleteCustomParameter(self, parameter) -> dict:
247284
"""
248285
Delete custom parameter

0 commit comments

Comments
 (0)