mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
249 lines
9.4 KiB
C++
249 lines
9.4 KiB
C++
#include "RequestHandler.h"
|
|
|
|
RequestResult RequestHandler::GetSceneItemList(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
|
|
if (!scene)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
json responseData;
|
|
responseData["sceneItems"] = Utils::Obs::ListHelper::GetSceneItemList(obs_scene_from_source(scene));
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::GetGroupSceneItemList(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY);
|
|
if (!scene)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
json responseData;
|
|
responseData["sceneItems"] = Utils::Obs::ListHelper::GetSceneItemList(obs_group_from_source(scene));
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::GetSceneItemId(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
|
if (!(sceneSource && request.ValidateString("sourceName", statusCode, comment)))
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
OBSScene scene = obs_scene_from_source(sceneSource);
|
|
if (!scene) {
|
|
scene = obs_group_from_source(sceneSource);
|
|
if (!scene) // This should never happen
|
|
return RequestResult::Error(RequestStatus::GenericError, "Somehow the scene was found but the scene object could not be fetched. Please report this to the obs-websocket developers.");
|
|
}
|
|
|
|
std::string sourceName = request.RequestData["sourceName"];
|
|
|
|
OBSSceneItemAutoRelease item = Utils::Obs::SearchHelper::GetSceneItemByName(scene, sourceName);
|
|
if (!item)
|
|
return RequestResult::Error(RequestStatus::ResourceNotFound, "No scene items were found in the specified scene by that name.");
|
|
|
|
json responseData;
|
|
responseData["sceneItemId"] = obs_sceneitem_get_id(item);
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::CreateSceneItem(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment);
|
|
if (!sceneSource)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
OBSScene scene = obs_scene_from_source(sceneSource);
|
|
|
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
|
if (!source)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
if (request.RequestData["sceneName"] == request.RequestData["sourceName"])
|
|
return RequestResult::Error(RequestStatus::CannotAct, "You cannot create scene item of a scene within itself.");
|
|
|
|
bool sceneItemEnabled = true;
|
|
if (request.Contains("sceneItemEnabled")) {
|
|
if (!request.ValidateOptionalBoolean("sceneItemEnabled", statusCode, comment))
|
|
return RequestResult::Error(statusCode, comment);
|
|
sceneItemEnabled = request.RequestData["sceneItemEnabled"];
|
|
}
|
|
|
|
OBSSceneItemAutoRelease sceneItem = Utils::Obs::ActionHelper::CreateSceneItem(source, scene, sceneItemEnabled);
|
|
if (!sceneItem)
|
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene item.");
|
|
|
|
json responseData;
|
|
responseData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::RemoveSceneItem(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment);
|
|
if (!sceneItem)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
obs_sceneitem_remove(sceneItem);
|
|
|
|
return RequestResult::Success();
|
|
}
|
|
|
|
RequestResult RequestHandler::DuplicateSceneItem(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment);
|
|
if (!sceneItem)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
// Get destination scene
|
|
obs_scene_t *destinationScene;
|
|
if (request.Contains("destinationSceneName")) {
|
|
destinationScene = request.ValidateScene2("destinationSceneName", statusCode, comment);
|
|
if (!destinationScene)
|
|
return RequestResult::Error(statusCode, comment);
|
|
} else {
|
|
destinationScene = obs_sceneitem_get_scene(sceneItem);
|
|
obs_scene_addref(destinationScene);
|
|
}
|
|
|
|
if (obs_sceneitem_is_group(sceneItem) && obs_sceneitem_get_scene(sceneItem) == destinationScene) {
|
|
obs_scene_release(destinationScene);
|
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Scenes may only have one instance of a group.");
|
|
}
|
|
|
|
// Get scene item details
|
|
OBSSource sceneItemSource = obs_sceneitem_get_source(sceneItem);
|
|
bool sceneItemEnabled = obs_sceneitem_visible(sceneItem);
|
|
obs_transform_info sceneItemTransform;
|
|
obs_sceneitem_crop sceneItemCrop;
|
|
obs_sceneitem_get_info(sceneItem, &sceneItemTransform);
|
|
obs_sceneitem_get_crop(sceneItem, &sceneItemCrop);
|
|
|
|
// Create the new item
|
|
OBSSceneItemAutoRelease newSceneItem = Utils::Obs::ActionHelper::CreateSceneItem(sceneItemSource, destinationScene, sceneItemEnabled, &sceneItemTransform, &sceneItemCrop);
|
|
obs_scene_release(destinationScene);
|
|
if (!newSceneItem)
|
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene item.");
|
|
|
|
json responseData;
|
|
responseData["sceneItemId"] = obs_sceneitem_get_id(newSceneItem);
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::GetSceneItemTransform(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
|
if (!sceneItem)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
json responseData;
|
|
responseData["sceneItemTransform"] = Utils::Obs::DataHelper::GetSceneItemTransform(sceneItem);
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::GetSceneItemEnabled(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
|
if (!sceneItem)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
json responseData;
|
|
responseData["sceneItemEnabled"] = obs_sceneitem_visible(sceneItem);
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::SetSceneItemEnabled(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
|
if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment)))
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
bool sceneItemEnabled = request.RequestData["sceneItemEnabled"];
|
|
|
|
obs_sceneitem_set_visible(sceneItem, sceneItemEnabled);
|
|
|
|
return RequestResult::Success();
|
|
}
|
|
|
|
RequestResult RequestHandler::GetSceneItemLocked(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
|
if (!sceneItem)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
json responseData;
|
|
responseData["sceneItemLocked"] = obs_sceneitem_locked(sceneItem);
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::SetSceneItemLocked(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
|
if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment)))
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
bool sceneItemLocked = request.RequestData["sceneItemLocked"];
|
|
|
|
obs_sceneitem_set_locked(sceneItem, sceneItemLocked);
|
|
|
|
return RequestResult::Success();
|
|
}
|
|
|
|
RequestResult RequestHandler::GetSceneItemIndex(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
|
if (!sceneItem)
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
json responseData;
|
|
responseData["sceneItemIndex"] = obs_sceneitem_get_order_position(sceneItem);
|
|
|
|
return RequestResult::Success(responseData);
|
|
}
|
|
|
|
RequestResult RequestHandler::SetSceneItemIndex(const Request& request)
|
|
{
|
|
RequestStatus::RequestStatus statusCode;
|
|
std::string comment;
|
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
|
if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192)))
|
|
return RequestResult::Error(statusCode, comment);
|
|
|
|
int sceneItemIndex = request.RequestData["sceneItemIndex"];
|
|
|
|
obs_sceneitem_set_order_position(sceneItem, sceneItemIndex);
|
|
|
|
return RequestResult::Success();
|
|
}
|