mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
RequestHandler: Add some more requests
This commit is contained in:
parent
584be06398
commit
5cf2b50b63
@ -48,6 +48,8 @@ const std::map<std::string, RequestMethodHandler> RequestHandler::_handlerMap
|
||||
{"ToggleInputMute", &RequestHandler::ToggleInputMute},
|
||||
{"GetInputVolume", &RequestHandler::GetInputVolume},
|
||||
{"SetInputVolume", &RequestHandler::SetInputVolume},
|
||||
{"SetInputName", &RequestHandler::SetInputName},
|
||||
{"CreateInput", &RequestHandler::CreateInput},
|
||||
};
|
||||
|
||||
RequestResult RequestHandler::ProcessRequest(const Request& request)
|
||||
|
@ -62,6 +62,8 @@ class RequestHandler {
|
||||
RequestResult ToggleInputMute(const Request&);
|
||||
RequestResult GetInputVolume(const Request&);
|
||||
RequestResult SetInputVolume(const Request&);
|
||||
RequestResult SetInputName(const Request&);
|
||||
RequestResult CreateInput(const Request&);
|
||||
|
||||
static const std::map<std::string, RequestMethodHandler> _handlerMap;
|
||||
};
|
||||
|
@ -203,3 +203,79 @@ RequestResult RequestHandler::SetInputVolume(const Request& request)
|
||||
|
||||
return RequestResult::Success();
|
||||
}
|
||||
|
||||
RequestResult RequestHandler::SetInputName(const Request& request)
|
||||
{
|
||||
RequestStatus::RequestStatus statusCode;
|
||||
std::string comment;
|
||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
||||
if (!input || !request.ValidateString("newInputName", statusCode, comment))
|
||||
return RequestResult::Error(statusCode, comment);
|
||||
|
||||
std::string newInputName = request.RequestData["newInputName"];
|
||||
|
||||
OBSSourceAutoRelease existingSource = obs_get_source_by_name(newInputName.c_str());
|
||||
if (existingSource)
|
||||
return RequestResult::Error(RequestStatus::SourceAlreadyExists, "A source already exists by that new input name.");
|
||||
|
||||
obs_source_set_name(input, newInputName.c_str());
|
||||
|
||||
return RequestResult::Success();
|
||||
}
|
||||
|
||||
RequestResult RequestHandler::CreateInput(const Request& request)
|
||||
{
|
||||
// Initial validation
|
||||
RequestStatus::RequestStatus statusCode;
|
||||
std::string comment;
|
||||
OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment);
|
||||
if (!request.ValidateString("inputName", statusCode, comment) ||
|
||||
!request.ValidateString("inputKind", statusCode, comment) ||
|
||||
!sceneSource)
|
||||
{
|
||||
return RequestResult::Error(statusCode, comment);
|
||||
}
|
||||
|
||||
// Verify that no other inputs share the name
|
||||
std::string inputName = request.RequestData["inputName"];
|
||||
OBSSourceAutoRelease existingInput = obs_get_source_by_name(inputName.c_str());
|
||||
if (existingInput)
|
||||
return RequestResult::Error(RequestStatus::SourceAlreadyExists, "A source already exists by that input name.");
|
||||
|
||||
// Verify that the input kind is valid
|
||||
std::string inputKind = request.RequestData["inputKind"];
|
||||
auto kinds = Utils::Obs::ListHelper::GetInputKindList();
|
||||
if (std::find(kinds.begin(), kinds.end(), inputKind) == kinds.end())
|
||||
return RequestResult::Error(RequestStatus::InvalidInputKind, "Your specified input kind is not supported by OBS. Check that your specified kind is properly versioned and that any necessary plugins are loaded.");
|
||||
|
||||
// Get input settings if they exist
|
||||
OBSDataAutoRelease inputSettings = nullptr;
|
||||
if (request.RequestData.contains("inputSettings") && !request.RequestData["inputSettings"].is_null()) {
|
||||
if (!request.ValidateObject("inputSettings", statusCode, comment, true))
|
||||
return RequestResult::Error(statusCode, comment);
|
||||
|
||||
inputSettings = Utils::Json::JsonToObsData(request.RequestData["inputSettings"]);
|
||||
}
|
||||
|
||||
// Get the destination scene
|
||||
OBSScene scene = obs_scene_from_source(sceneSource);
|
||||
|
||||
// Get scene item enable state if it exists
|
||||
bool sceneItemEnabled = true;
|
||||
if (request.RequestData.contains("sceneItemEnabled") && !request.RequestData["sceneItemEnabled"].is_null()) {
|
||||
if (!request.ValidateBoolean("sceneItemEnabled", statusCode, comment))
|
||||
return RequestResult::Error(statusCode, comment);
|
||||
|
||||
sceneItemEnabled = request.RequestData["sceneItemEnabled"];
|
||||
}
|
||||
|
||||
// Create the input and add it as a scene item to the destination scene
|
||||
obs_sceneitem_t *sceneItem = Utils::Obs::ActionHelper::CreateInput(inputName, inputKind, inputSettings, scene, sceneItemEnabled);
|
||||
|
||||
if (!sceneItem)
|
||||
return RequestResult::Error(RequestStatus::RequestProcessingFailed, "Creation of the input or scene item failed.");
|
||||
|
||||
json responseData;
|
||||
responseData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
||||
return RequestResult::Success(responseData);
|
||||
}
|
||||
|
@ -136,6 +136,38 @@ const bool Request::ValidateArray(const std::string keyName, RequestStatus::Requ
|
||||
return true;
|
||||
}
|
||||
|
||||
obs_source_t *Request::ValidateScene(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
||||
{
|
||||
if (!ValidateString(keyName, statusCode, comment))
|
||||
return nullptr;
|
||||
|
||||
std::string sceneName = RequestData[keyName];
|
||||
|
||||
obs_source_t *ret = obs_get_source_by_name(sceneName.c_str());
|
||||
if (!ret) {
|
||||
statusCode = RequestStatus::SceneNotFound;
|
||||
comment = std::string("No scene was found by the name of `") + sceneName + "`.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (obs_source_get_type(ret) != OBS_SOURCE_TYPE_SCENE) {
|
||||
obs_source_release(ret);
|
||||
statusCode = RequestStatus::InvalidSourceType;
|
||||
comment = "The specified source is not a scene.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
OBSScene scene = obs_scene_from_source(ret);
|
||||
if (obs_scene_is_group(scene)) {
|
||||
obs_source_release(ret);
|
||||
statusCode = RequestStatus::InvalidSourceType;
|
||||
comment = "The specified source is not a scene.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
obs_source_t *Request::ValidateInput(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
||||
{
|
||||
if (!ValidateString(keyName, statusCode, comment))
|
||||
|
@ -21,6 +21,7 @@ struct Request
|
||||
const bool ValidateObject(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
|
||||
const bool ValidateArray(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
|
||||
|
||||
obs_source_t *ValidateScene(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||
obs_source_t *ValidateInput(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||
|
||||
const uint8_t RpcVersion;
|
||||
|
Loading…
Reference in New Issue
Block a user