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},
|
{"ToggleInputMute", &RequestHandler::ToggleInputMute},
|
||||||
{"GetInputVolume", &RequestHandler::GetInputVolume},
|
{"GetInputVolume", &RequestHandler::GetInputVolume},
|
||||||
{"SetInputVolume", &RequestHandler::SetInputVolume},
|
{"SetInputVolume", &RequestHandler::SetInputVolume},
|
||||||
|
{"SetInputName", &RequestHandler::SetInputName},
|
||||||
|
{"CreateInput", &RequestHandler::CreateInput},
|
||||||
};
|
};
|
||||||
|
|
||||||
RequestResult RequestHandler::ProcessRequest(const Request& request)
|
RequestResult RequestHandler::ProcessRequest(const Request& request)
|
||||||
|
@ -62,6 +62,8 @@ class RequestHandler {
|
|||||||
RequestResult ToggleInputMute(const Request&);
|
RequestResult ToggleInputMute(const Request&);
|
||||||
RequestResult GetInputVolume(const Request&);
|
RequestResult GetInputVolume(const Request&);
|
||||||
RequestResult SetInputVolume(const Request&);
|
RequestResult SetInputVolume(const Request&);
|
||||||
|
RequestResult SetInputName(const Request&);
|
||||||
|
RequestResult CreateInput(const Request&);
|
||||||
|
|
||||||
static const std::map<std::string, RequestMethodHandler> _handlerMap;
|
static const std::map<std::string, RequestMethodHandler> _handlerMap;
|
||||||
};
|
};
|
||||||
|
@ -203,3 +203,79 @@ RequestResult RequestHandler::SetInputVolume(const Request& request)
|
|||||||
|
|
||||||
return RequestResult::Success();
|
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;
|
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
|
obs_source_t *Request::ValidateInput(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
||||||
{
|
{
|
||||||
if (!ValidateString(keyName, statusCode, comment))
|
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 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;
|
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;
|
obs_source_t *ValidateInput(const std::string keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||||
|
|
||||||
const uint8_t RpcVersion;
|
const uint8_t RpcVersion;
|
||||||
|
Loading…
Reference in New Issue
Block a user