A lot of updates
This commit is contained in:
@@ -296,16 +296,11 @@ command_result ConnectedClient::handleCommandPlaylistList(ts::Command &cmd) {
|
||||
CMD_RESET_IDLE;
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(25);
|
||||
|
||||
auto self_dbid = this->getClientDatabaseId();
|
||||
auto playlist_view_power = this->calculate_permission(permission::i_playlist_view_power, 0);
|
||||
auto self_ref = this->ref();
|
||||
auto playlists = this->server->musicManager->playlists();
|
||||
|
||||
playlists.erase(find_if(playlists.begin(), playlists.end(), [&](const shared_ptr<music::PlayablePlaylist>& playlist) {
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] == self_dbid)
|
||||
return false;
|
||||
|
||||
auto needed_view_power = playlist->permissions()->getPermissionValue(permission::i_playlist_needed_view_power);
|
||||
return !permission::v2::permission_granted(needed_view_power, playlist_view_power, false);;
|
||||
return playlist->client_has_permissions(self_ref, permission::i_playlist_needed_view_power, permission::i_playlist_view_power, music::PlaylistPermissions::do_no_require_granted) != permission::ok;
|
||||
}), playlists.end());
|
||||
|
||||
if(playlists.empty())
|
||||
@@ -322,12 +317,25 @@ command_result ConnectedClient::handleCommandPlaylistList(ts::Command &cmd) {
|
||||
notify[index]["playlist_type"] = entry->properties()[property::PLAYLIST_TYPE].value();
|
||||
notify[index]["playlist_owner_dbid"] = entry->properties()[property::PLAYLIST_OWNER_DBID].value();
|
||||
notify[index]["playlist_owner_name"] = entry->properties()[property::PLAYLIST_OWNER_NAME].value();
|
||||
notify[index]["needed_power_modify"] = entry->permissions()->getPermissionValue(permission::i_playlist_needed_modify_power);
|
||||
notify[index]["needed_power_permission_modify"] = entry->permissions()->getPermissionValue(permission::i_playlist_needed_permission_modify_power);
|
||||
notify[index]["needed_power_delete"] = entry->permissions()->getPermissionValue(permission::i_playlist_needed_delete_power);
|
||||
notify[index]["needed_power_song_add"] = entry->permissions()->getPermissionValue(permission::i_playlist_song_needed_add_power);
|
||||
notify[index]["needed_power_song_move"] = entry->permissions()->getPermissionValue(permission::i_playlist_song_needed_move_power);
|
||||
notify[index]["needed_power_song_remove"] = entry->permissions()->getPermissionValue(permission::i_playlist_song_needed_remove_power);
|
||||
|
||||
auto permissions = entry->permission_manager();
|
||||
auto permission = permissions->permission_value_flagged(permission::i_playlist_needed_modify_power);
|
||||
notify[index]["needed_power_modify"] = permission.has_value ? permission.value : 0;
|
||||
|
||||
permission = permissions->permission_value_flagged(permission::i_playlist_needed_permission_modify_power);
|
||||
notify[index]["needed_power_permission_modify"] = permission.has_value ? permission.value : 0;
|
||||
|
||||
permission = permissions->permission_value_flagged(permission::i_playlist_needed_delete_power);
|
||||
notify[index]["needed_power_delete"] = permission.has_value ? permission.value : 0;
|
||||
|
||||
permission = permissions->permission_value_flagged(permission::i_playlist_song_needed_add_power);
|
||||
notify[index]["needed_power_song_add"] = permission.has_value ? permission.value : 0;
|
||||
|
||||
permission = permissions->permission_value_flagged(permission::i_playlist_song_needed_move_power);
|
||||
notify[index]["needed_power_song_move"] = permission.has_value ? permission.value : 0;
|
||||
|
||||
permission = permissions->permission_value_flagged(permission::i_playlist_song_needed_remove_power);
|
||||
notify[index]["needed_power_song_remove"] = permission.has_value ? permission.value : 0;
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -363,19 +371,19 @@ command_result ConnectedClient::handleCommandPlaylistCreate(ts::Command &cmd) {
|
||||
|
||||
auto power = this->calculate_permission(permission::i_playlist_song_remove_power, 0);
|
||||
if(power.has_value && power.value >= 0)
|
||||
playlist->permissions()->setPermission(permission::i_playlist_song_needed_remove_power, power.value, nullptr);
|
||||
playlist->permission_manager()->set_permission(permission::i_playlist_song_needed_remove_power, {power.value, 0}, permission::v2::set_value, permission::v2::do_nothing);
|
||||
|
||||
power = this->calculate_permission(permission::i_playlist_delete_power, 0);
|
||||
if(power.has_value && power.value >= 0)
|
||||
playlist->permissions()->setPermission(permission::i_playlist_needed_delete_power, power.value, nullptr);
|
||||
playlist->permission_manager()->set_permission(permission::i_playlist_needed_delete_power, {power.value, 0}, permission::v2::set_value, permission::v2::do_nothing);
|
||||
|
||||
power = this->calculate_permission(permission::i_playlist_modify_power, 0);
|
||||
if(power.has_value && power.value >= 0)
|
||||
playlist->permissions()->setPermission(permission::i_playlist_needed_modify_power, power.value, nullptr);
|
||||
playlist->permission_manager()->set_permission(permission::i_playlist_needed_modify_power, {power.value, 0}, permission::v2::set_value, permission::v2::do_nothing);
|
||||
|
||||
power = this->calculate_permission(permission::i_playlist_permission_modify_power, 0);
|
||||
if(power.has_value && power.value >= 0)
|
||||
playlist->permissions()->setPermission(permission::i_playlist_needed_permission_modify_power, power.value, nullptr);
|
||||
playlist->permission_manager()->set_permission(permission::i_playlist_needed_permission_modify_power, {power.value, 0}, permission::v2::set_value, permission::v2::do_nothing);
|
||||
|
||||
Command notify(this->notify_response_command("notifyplaylistcreated"));
|
||||
notify["playlist_id"] = playlist->playlist_id();
|
||||
@@ -392,8 +400,8 @@ command_result ConnectedClient::handleCommandPlaylistDelete(ts::Command &cmd) {
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_delete_power, playlist->permissions()->getPermissionValue(permission::i_playlist_needed_delete_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_delete_power, permission::i_playlist_delete_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
string error;
|
||||
if(!ref_server->musicManager->delete_playlist(playlist->playlist_id(), error)) {
|
||||
@@ -412,8 +420,8 @@ command_result ConnectedClient::handleCommandPlaylistInfo(ts::Command &cmd) {
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_view_power, playlist->permissions()->getPermissionValue(permission::i_playlist_needed_view_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_view_power, permission::i_playlist_view_power, music::PlaylistPermissions::do_no_require_granted); perr)
|
||||
return command_result{perr};
|
||||
|
||||
|
||||
Command notify(this->notify_response_command("notifyplaylistinfo"));
|
||||
@@ -433,8 +441,8 @@ command_result ConnectedClient::handleCommandPlaylistEdit(ts::Command &cmd) {
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_modify_power, playlist->permissions()->getPermissionValue(permission::i_playlist_needed_modify_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_modify_power, permission::i_playlist_modify_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
deque<pair<shared_ptr<property::PropertyDescription>, string>> properties;
|
||||
|
||||
@@ -491,28 +499,41 @@ command_result ConnectedClient::handleCommandPlaylistPermList(ts::Command &cmd)
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::b_virtualserver_playlist_permission_list, 1);
|
||||
{
|
||||
auto value = playlist->calculate_client_specific_permissions(permission::b_virtualserver_playlist_permission_list, this->ref());
|
||||
if(!permission::v2::permission_granted(1, value))
|
||||
return command_result{permission::b_virtualserver_playlist_permission_list};
|
||||
}
|
||||
|
||||
auto permissions = playlist->permissions()->listPermissions(PERM_FLAG_PUBLIC);
|
||||
auto permissions = playlist->permission_manager()->permissions();
|
||||
if(permissions.empty())
|
||||
return command_result{error::vs_critical};
|
||||
return command_result{error::database_empty_result};
|
||||
|
||||
Command result(this->notify_response_command("notifyplaylistpermlist"));
|
||||
|
||||
auto permission_mapper = serverInstance->getPermissionMapper();
|
||||
auto perm_sid = cmd.hasParm("permsid") || cmd.hasParm("names");
|
||||
int index = 0;
|
||||
result["playlist_id"] = playlist->playlist_id();
|
||||
for (const auto &elm : permissions) {
|
||||
if(elm->hasValue()) {
|
||||
result[index]["permid"] = elm->type->type;
|
||||
for (const auto &[perm, value] : permissions) {
|
||||
if(value.flags.value_set) {
|
||||
if (perm_sid)
|
||||
result[index]["permsid"] = permission_mapper->permission_name(this->getType(), perm);
|
||||
else
|
||||
result[index]["permid"] = perm;
|
||||
|
||||
result[index]["permvalue"] = elm->value;
|
||||
result[index]["permnegated"] = elm->flag_negate;
|
||||
result[index]["permskip"] = elm->flag_skip;
|
||||
result[index]["permvalue"] = value.values.value;
|
||||
result[index]["permnegated"] = value.flags.negate;
|
||||
result[index]["permskip"] = value.flags.skip;
|
||||
index++;
|
||||
}
|
||||
if(elm->hasGrant()) {
|
||||
result[index]["permid"] = (uint16_t) (elm->type->type | PERM_ID_GRANT);
|
||||
result[index]["permvalue"] = elm->granted;
|
||||
if(value.flags.grant_set) {
|
||||
if (perm_sid)
|
||||
result[index]["permsid"] = permission_mapper->permission_name_grant(this->getType(), perm);
|
||||
else
|
||||
result[index]["permid"] = perm | PERM_ID_GRANT;
|
||||
|
||||
result[index]["permvalue"] = value.values.grant;
|
||||
result[index]["permnegated"] = 0;
|
||||
result[index]["permskip"] = 0;
|
||||
index++;
|
||||
@@ -531,8 +552,8 @@ command_result ConnectedClient::handleCommandPlaylistAddPerm(ts::Command &cmd) {
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_permission_modify_power, playlist->permissions()->getPermissionValue(permission::i_playlist_needed_permission_modify_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_permission_modify_power, permission::i_playlist_permission_modify_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
auto max_value = this->calculate_permission(permission::i_permission_modify_power, 0, true);
|
||||
if(!max_value.has_value) return command_result{permission::i_permission_modify_power};
|
||||
@@ -556,10 +577,9 @@ command_result ConnectedClient::handleCommandPlaylistAddPerm(ts::Command &cmd) {
|
||||
}
|
||||
|
||||
if (grant) {
|
||||
playlist->permissions()->setPermissionGranted(permType, cmd[index]["permvalue"], nullptr);
|
||||
playlist->permission_manager()->set_permission(permType, {0, cmd[index]["permvalue"]}, permission::v2::do_nothing, permission::v2::set_value);
|
||||
} else {
|
||||
|
||||
playlist->permissions()->setPermission(permType, cmd[index]["permvalue"], nullptr, cmd[index]["permskip"], cmd[index]["permnegated"]);
|
||||
playlist->permission_manager()->set_permission(permType, {cmd[index]["permvalue"],0}, permission::v2::set_value, permission::v2::do_nothing, cmd[index]["permskip"].as<bool>(), cmd[index]["permnegated"].as<bool>());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -574,8 +594,8 @@ command_result ConnectedClient::handleCommandPlaylistDelPerm(ts::Command &cmd) {
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_permission_modify_power, playlist->permissions()->getPermissionValue(permission::i_playlist_needed_permission_modify_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_permission_modify_power, permission::i_playlist_permission_modify_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
auto ignore_granted_values = permission::v2::permission_granted(1, this->calculate_permission(permission::b_permission_modify_power_ignore, 0));
|
||||
bool conOnError = cmd[0].has("continueonerror");
|
||||
@@ -588,10 +608,154 @@ command_result ConnectedClient::handleCommandPlaylistDelPerm(ts::Command &cmd) {
|
||||
return command_result{permission::i_permission_modify_power};
|
||||
}
|
||||
|
||||
|
||||
if (grant) {
|
||||
playlist->permissions()->setPermissionGranted(permType, permNotGranted, nullptr);
|
||||
playlist->permission_manager()->set_permission(permType, {0, 0}, permission::v2::do_nothing, permission::v2::delete_value);
|
||||
} else {
|
||||
playlist->permissions()->deletePermission(permType, nullptr);
|
||||
playlist->permission_manager()->set_permission(permType, {0, 0}, permission::v2::delete_value, permission::v2::do_nothing);
|
||||
}
|
||||
}
|
||||
|
||||
return command_result{error::ok};
|
||||
}
|
||||
|
||||
command_result ConnectedClient::handleCommandPlaylistClientPermList(ts::Command &cmd) {
|
||||
CMD_REF_SERVER(ref_server);
|
||||
CMD_RESET_IDLE;
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(25);
|
||||
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
{
|
||||
auto value = playlist->calculate_client_specific_permissions(permission::b_virtualserver_playlist_permission_list, this->ref());
|
||||
if(!permission::v2::permission_granted(1, value))
|
||||
return command_result{permission::b_virtualserver_playlist_permission_list};
|
||||
}
|
||||
|
||||
auto permissions = playlist->permission_manager()->channel_permissions();
|
||||
if(permissions.empty())
|
||||
return command_result{error::database_empty_result};
|
||||
|
||||
Command result(this->notify_response_command("notifyplaylistclientpermlist"));
|
||||
|
||||
auto client_id = cmd.hasParm("cldbid") ? cmd[0]["cldbid"].as<ClientDbId>() : 0;
|
||||
auto permission_mapper = serverInstance->getPermissionMapper();
|
||||
auto perm_sid = cmd.hasParm("permsid") || cmd.hasParm("names");
|
||||
|
||||
int index = 0;
|
||||
ClientDbId last_client_id{0};
|
||||
result["playlist_id"] = playlist->playlist_id();
|
||||
result["cldbid"] = client_id;
|
||||
for (const auto &[perm, client, value] : permissions) {
|
||||
if(client_id > 0 && client != client_id) continue;
|
||||
|
||||
if(last_client_id != client)
|
||||
result[index]["cldbid"] = client;
|
||||
if(value.flags.value_set) {
|
||||
if (perm_sid)
|
||||
result[index]["permsid"] = permission_mapper->permission_name(this->getType(), perm);
|
||||
else
|
||||
result[index]["permid"] = perm;
|
||||
|
||||
result[index]["permvalue"] = value.values.value;
|
||||
result[index]["permnegated"] = value.flags.negate;
|
||||
result[index]["permskip"] = value.flags.skip;
|
||||
index++;
|
||||
}
|
||||
if(value.flags.grant_set) {
|
||||
if (perm_sid)
|
||||
result[index]["permsid"] = permission_mapper->permission_name_grant(this->getType(), perm);
|
||||
else
|
||||
result[index]["permid"] = perm | PERM_ID_GRANT;
|
||||
|
||||
result[index]["permvalue"] = value.values.grant;
|
||||
result[index]["permnegated"] = 0;
|
||||
result[index]["permskip"] = 0;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
if(index == 0)
|
||||
return command_result{error::database_empty_result};
|
||||
this->sendCommand(result);
|
||||
|
||||
return command_result{error::ok};
|
||||
}
|
||||
|
||||
command_result ConnectedClient::handleCommandPlaylistClientAddPerm(ts::Command &cmd) {
|
||||
CMD_REF_SERVER(ref_server);
|
||||
CMD_RESET_IDLE;
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(5);
|
||||
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
auto client_id = cmd[0]["cldbid"].as<ClientDbId>();
|
||||
if(client_id == 0) return command_result{error::client_invalid_id};
|
||||
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_permission_modify_power, permission::i_playlist_permission_modify_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
auto max_value = this->calculate_permission(permission::i_permission_modify_power, 0, true);
|
||||
if(!max_value.has_value) return command_result{permission::i_permission_modify_power};
|
||||
|
||||
auto ignore_granted_values = permission::v2::permission_granted(1, this->calculate_permission(permission::b_permission_modify_power_ignore, 0));
|
||||
|
||||
bool conOnError = cmd[0].has("continueonerror");
|
||||
for (int index = 0; index < cmd.bulkCount(); index++) {
|
||||
PARSE_PERMISSION(cmd);
|
||||
|
||||
auto val = cmd[index]["permvalue"].as<permission::PermissionValue>();
|
||||
if(permission_require_granted_value(permType) && !permission::v2::permission_granted(val, max_value)) {
|
||||
if(conOnError) continue;
|
||||
return command_result{permission::i_permission_modify_power};
|
||||
}
|
||||
|
||||
if(!ignore_granted_values && !permission::v2::permission_granted(val, this->calculate_permission(permType, 0, true))) {
|
||||
if(conOnError) continue;
|
||||
return command_result{permission::i_permission_modify_power};
|
||||
}
|
||||
|
||||
if (grant) {
|
||||
playlist->permission_manager()->set_channel_permission(permType, client_id, {0, cmd[index]["permvalue"]}, permission::v2::do_nothing, permission::v2::set_value);
|
||||
} else {
|
||||
playlist->permission_manager()->set_channel_permission(permType, client_id, {cmd[index]["permvalue"], 0}, permission::v2::set_value, permission::v2::do_nothing, cmd[index]["permskip"].as<bool>(), cmd[index]["permnegated"].as<bool>());
|
||||
}
|
||||
}
|
||||
|
||||
return command_result{error::ok};
|
||||
}
|
||||
|
||||
command_result ConnectedClient::handleCommandPlaylistClientDelPerm(ts::Command &cmd) {
|
||||
CMD_REF_SERVER(ref_server);
|
||||
CMD_RESET_IDLE;
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(5);
|
||||
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
auto client_id = cmd[0]["cldbid"].as<ClientDbId>();
|
||||
if(client_id == 0) return command_result{error::client_invalid_id};
|
||||
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_permission_modify_power, permission::i_playlist_permission_modify_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
auto ignore_granted_values = permission::v2::permission_granted(1, this->calculate_permission(permission::b_permission_modify_power_ignore, 0));
|
||||
bool conOnError = cmd[0].has("continueonerror");
|
||||
|
||||
for (int index = 0; index < cmd.bulkCount(); index++) {
|
||||
PARSE_PERMISSION(cmd);
|
||||
|
||||
if(!ignore_granted_values && !permission::v2::permission_granted(0, this->calculate_permission(permType, 0, true))) {
|
||||
if(conOnError) continue;
|
||||
return command_result{permission::i_permission_modify_power};
|
||||
}
|
||||
|
||||
|
||||
if (grant) {
|
||||
playlist->permission_manager()->set_channel_permission(permType, client_id, {0, 0}, permission::v2::do_nothing, permission::v2::delete_value);
|
||||
} else {
|
||||
playlist->permission_manager()->set_channel_permission(permType, client_id, {0, 0}, permission::v2::delete_value, permission::v2::do_nothing);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -606,8 +770,8 @@ command_result ConnectedClient::handleCommandPlaylistSongList(ts::Command &cmd)
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_view_power, playlist->permissions()->getPermissionValue(permission::i_playlist_needed_view_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_view_power, permission::i_playlist_view_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
auto songs = playlist->list_songs();
|
||||
if(songs.empty())
|
||||
@@ -640,8 +804,8 @@ command_result ConnectedClient::handleCommandPlaylistSongAdd(ts::Command &cmd) {
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_song_add_power, playlist->permissions()->getPermissionValue(permission::i_playlist_song_needed_add_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_song_needed_add_power, permission::i_playlist_song_add_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
if(!cmd[0].has("invoker"))
|
||||
cmd["invoker"] = "";
|
||||
@@ -672,8 +836,8 @@ command_result ConnectedClient::handleCommandPlaylistSongReorder(ts::Command &cm
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_song_move_power, playlist->permissions()->getPermissionValue(permission::i_playlist_song_needed_move_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_song_needed_move_power, permission::i_playlist_song_move_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
SongId song_id = cmd["song_id"];
|
||||
SongId previous_id = cmd["song_previous_song_id"];
|
||||
@@ -695,8 +859,8 @@ command_result ConnectedClient::handleCommandPlaylistSongRemove(ts::Command &cmd
|
||||
auto playlist = ref_server->musicManager->find_playlist(cmd["playlist_id"]);
|
||||
if(!playlist) return command_result{error::playlist_invalid_id};
|
||||
|
||||
if(playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_song_remove_power, playlist->permissions()->getPermissionValue(permission::i_playlist_song_needed_remove_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_song_needed_remove_power, permission::i_playlist_song_remove_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
SongId song_id = cmd["song_id"];
|
||||
|
||||
@@ -709,85 +873,63 @@ command_result ConnectedClient::handleCommandPlaylistSongRemove(ts::Command &cmd
|
||||
return command_result{error::ok};
|
||||
}
|
||||
|
||||
command_result ConnectedClient::handleCommandMusicBotQueueList(Command& cmd) {
|
||||
return command_result{error::not_implemented}; //FIXME
|
||||
|
||||
/*
|
||||
/****** legacy ******/
|
||||
command_result ConnectedClient::handleCommandMusicBotQueueList(Command& cmd) {
|
||||
CMD_REQ_SERVER;
|
||||
CMD_RESET_IDLE;
|
||||
CMD_CHK_AND_INC_FLOOD_POINTS(25);
|
||||
|
||||
auto bot = this->server->musicManager->findBotById(cmd["bot_id"]);
|
||||
if(!bot) return command_result{error::music_invalid_id};
|
||||
PERM_CHECK_CHANNELR(permission::i_client_music_info, bot->permissionValue(permission::i_client_music_needed_info, bot->currentChannel), this->currentChannel, true);
|
||||
|
||||
auto playlist = dynamic_pointer_cast<music::PlayablePlaylist>(bot->playlist());
|
||||
if(!playlist) return command_result{error::vs_critical};
|
||||
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_view_power, permission::i_playlist_view_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
bool bulked = cmd.hasParm("bulk") || cmd.hasParm("balk") || cmd.hasParm("pipe") || cmd.hasParm("bar") || cmd.hasParm("paypal");
|
||||
int command_index = 0;
|
||||
|
||||
Command notify(this->getExternalType() == CLIENT_VOICE ? "notifymusicqueueentry" : "");
|
||||
{
|
||||
auto history = bot->queue()->history();
|
||||
for(int index = history.size(); index > 0; index--) {
|
||||
if(!bulked)
|
||||
notify = Command(this->getExternalType() == CLIENT_VOICE ? "notifymusicqueueentry" : "");
|
||||
Command notify(this->notify_response_command("notifymusicqueueentry"));
|
||||
auto songs = playlist->list_songs();
|
||||
int begin_index{0};
|
||||
for(auto it = songs.begin(); it != songs.end(); it++)
|
||||
if((*it)->id == playlist->currently_playing())
|
||||
break;
|
||||
else
|
||||
begin_index--;
|
||||
|
||||
apply_song(notify, history[index - 1], command_index);
|
||||
notify[command_index]["queue_index"] = -index;
|
||||
|
||||
if(!bulked)
|
||||
this->sendCommand(notify);
|
||||
else
|
||||
command_index++;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
for(auto it = songs.begin(); it != songs.end(); it++) {
|
||||
if(!bulked)
|
||||
notify = Command(this->getExternalType() == CLIENT_VOICE ? "notifymusicqueueentry" : "");
|
||||
notify = Command(this->notify_response_command("notifymusicqueueentry"));
|
||||
|
||||
auto song = bot->queue()->currentSong();
|
||||
apply_song(notify, song, command_index);
|
||||
notify[command_index]["queue_index"] = 0;
|
||||
//TODO!
|
||||
//apply_song(notify, *it, command_index);
|
||||
notify[command_index]["queue_index"] = begin_index++;
|
||||
|
||||
if(!bulked)
|
||||
this->sendCommand(notify);
|
||||
else if(song)
|
||||
else
|
||||
command_index++;
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
auto queue = bot->queue()->queueEntries();
|
||||
for(int index = 0; index < queue.size(); index++) {
|
||||
if(!bulked)
|
||||
notify = Command(this->getExternalType() == CLIENT_VOICE ? "notifymusicqueueentry" : "");
|
||||
|
||||
apply_song(notify, queue[index], command_index);
|
||||
notify[command_index]["queue_index"] = index + 1;
|
||||
|
||||
if(!bulked)
|
||||
this->sendCommand(notify);
|
||||
else
|
||||
command_index++;
|
||||
}
|
||||
}
|
||||
|
||||
debugMessage(this->getServerId(),"Send: {}",notify.build());
|
||||
if(bulked) {
|
||||
if(command_index > 0) {
|
||||
this->sendCommand(notify);
|
||||
} else return { ErrorType::DBEmpty };
|
||||
} else
|
||||
return command_result{error::database_empty_result};
|
||||
}
|
||||
|
||||
if(this->getExternalType() == CLIENT_VOICE) {
|
||||
if(this->getExternalType() == ClientType::CLIENT_TEAMSPEAK) {
|
||||
Command notify("notifymusicqueuefinish");
|
||||
notify["bot_id"] = bot->getClientDatabaseId();
|
||||
this->sendCommand(notify);
|
||||
}
|
||||
|
||||
return command_result{error::ok};
|
||||
*/
|
||||
}
|
||||
|
||||
command_result ConnectedClient::handleCommandMusicBotQueueAdd(Command& cmd) {
|
||||
@@ -898,8 +1040,8 @@ command_result ConnectedClient::handleCommandMusicBotPlaylistAssign(ts::Command
|
||||
if(ref_server->musicManager->find_bot_by_playlist(playlist))
|
||||
return command_result{error::playlist_already_in_use};
|
||||
|
||||
if(playlist && playlist->properties()[property::PLAYLIST_OWNER_DBID] != this->getClientDatabaseId())
|
||||
ACTION_REQUIRES_GLOBAL_PERMISSION(permission::i_playlist_view_power, playlist->permissions()->getPermissionValue(permission::i_playlist_needed_view_power));
|
||||
if(auto perr = playlist->client_has_permissions(this->ref(), permission::i_playlist_needed_view_power, permission::i_playlist_view_power); perr)
|
||||
return command_result{perr};
|
||||
|
||||
if(!ref_server->musicManager->assign_playlist(bot, playlist))
|
||||
return command_result{error::vs_critical};
|
||||
|
||||
Reference in New Issue
Block a user