You've already forked wp-fedistream
WP FediStream - Stream music over ActivityPub Features: - Custom post types: Artist, Album, Track, Playlist - Custom taxonomies: Genre, Mood, License - User roles: Artist, Label - Admin dashboard with statistics - Frontend templates and shortcodes - Audio player with queue management - ActivityPub integration with actor support - WooCommerce product types for albums/tracks - User library with favorites and history - Notification system (in-app and email) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
309 lines
9.7 KiB
PHP
309 lines
9.7 KiB
PHP
<?php
|
|
/**
|
|
* User roles and capabilities.
|
|
*
|
|
* @package WP_FediStream
|
|
*/
|
|
|
|
namespace WP_FediStream\Roles;
|
|
|
|
// Prevent direct file access.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Capabilities class.
|
|
*
|
|
* Handles custom user roles and capabilities.
|
|
*/
|
|
class Capabilities {
|
|
|
|
/**
|
|
* Post type capabilities.
|
|
*
|
|
* @var array
|
|
*/
|
|
private const POST_TYPE_CAPS = array(
|
|
'fedistream_artist' => array(
|
|
'edit_post' => 'edit_fedistream_artist',
|
|
'read_post' => 'read_fedistream_artist',
|
|
'delete_post' => 'delete_fedistream_artist',
|
|
'edit_posts' => 'edit_fedistream_artists',
|
|
'edit_others_posts' => 'edit_others_fedistream_artists',
|
|
'publish_posts' => 'publish_fedistream_artists',
|
|
'read_private_posts' => 'read_private_fedistream_artists',
|
|
),
|
|
'fedistream_album' => array(
|
|
'edit_post' => 'edit_fedistream_album',
|
|
'read_post' => 'read_fedistream_album',
|
|
'delete_post' => 'delete_fedistream_album',
|
|
'edit_posts' => 'edit_fedistream_albums',
|
|
'edit_others_posts' => 'edit_others_fedistream_albums',
|
|
'publish_posts' => 'publish_fedistream_albums',
|
|
'read_private_posts' => 'read_private_fedistream_albums',
|
|
),
|
|
'fedistream_track' => array(
|
|
'edit_post' => 'edit_fedistream_track',
|
|
'read_post' => 'read_fedistream_track',
|
|
'delete_post' => 'delete_fedistream_track',
|
|
'edit_posts' => 'edit_fedistream_tracks',
|
|
'edit_others_posts' => 'edit_others_fedistream_tracks',
|
|
'publish_posts' => 'publish_fedistream_tracks',
|
|
'read_private_posts' => 'read_private_fedistream_tracks',
|
|
),
|
|
'fedistream_playlist' => array(
|
|
'edit_post' => 'edit_fedistream_playlist',
|
|
'read_post' => 'read_fedistream_playlist',
|
|
'delete_post' => 'delete_fedistream_playlist',
|
|
'edit_posts' => 'edit_fedistream_playlists',
|
|
'edit_others_posts' => 'edit_others_fedistream_playlists',
|
|
'publish_posts' => 'publish_fedistream_playlists',
|
|
'read_private_posts' => 'read_private_fedistream_playlists',
|
|
),
|
|
);
|
|
|
|
/**
|
|
* Taxonomy capabilities.
|
|
*
|
|
* @var array
|
|
*/
|
|
private const TAXONOMY_CAPS = array(
|
|
'manage_fedistream_genres',
|
|
'manage_fedistream_moods',
|
|
'manage_fedistream_licenses',
|
|
);
|
|
|
|
/**
|
|
* Custom capabilities.
|
|
*
|
|
* @var array
|
|
*/
|
|
private const CUSTOM_CAPS = array(
|
|
'view_fedistream_stats',
|
|
'manage_fedistream_settings',
|
|
);
|
|
|
|
/**
|
|
* Get all custom capabilities.
|
|
*
|
|
* @return array Array of all custom capabilities.
|
|
*/
|
|
public static function get_all_capabilities(): array {
|
|
$caps = array();
|
|
|
|
// Post type capabilities.
|
|
foreach ( self::POST_TYPE_CAPS as $post_type_caps ) {
|
|
$caps = array_merge( $caps, array_values( $post_type_caps ) );
|
|
}
|
|
|
|
// Delete capabilities.
|
|
$caps[] = 'delete_fedistream_artists';
|
|
$caps[] = 'delete_others_fedistream_artists';
|
|
$caps[] = 'delete_published_fedistream_artists';
|
|
$caps[] = 'delete_private_fedistream_artists';
|
|
$caps[] = 'delete_fedistream_albums';
|
|
$caps[] = 'delete_others_fedistream_albums';
|
|
$caps[] = 'delete_published_fedistream_albums';
|
|
$caps[] = 'delete_private_fedistream_albums';
|
|
$caps[] = 'delete_fedistream_tracks';
|
|
$caps[] = 'delete_others_fedistream_tracks';
|
|
$caps[] = 'delete_published_fedistream_tracks';
|
|
$caps[] = 'delete_private_fedistream_tracks';
|
|
$caps[] = 'delete_fedistream_playlists';
|
|
$caps[] = 'delete_others_fedistream_playlists';
|
|
$caps[] = 'delete_published_fedistream_playlists';
|
|
$caps[] = 'delete_private_fedistream_playlists';
|
|
|
|
// Taxonomy capabilities.
|
|
$caps = array_merge( $caps, self::TAXONOMY_CAPS );
|
|
|
|
// Custom capabilities.
|
|
$caps = array_merge( $caps, self::CUSTOM_CAPS );
|
|
|
|
return array_unique( $caps );
|
|
}
|
|
|
|
/**
|
|
* Get Artist role capabilities.
|
|
*
|
|
* @return array Array of capabilities for the Artist role.
|
|
*/
|
|
public static function get_artist_capabilities(): array {
|
|
return array(
|
|
// Core WordPress.
|
|
'read' => true,
|
|
'upload_files' => true,
|
|
|
|
// Own artists.
|
|
'edit_fedistream_artists' => true,
|
|
'edit_published_fedistream_artists' => true,
|
|
'publish_fedistream_artists' => true,
|
|
'delete_fedistream_artists' => true,
|
|
'delete_published_fedistream_artists' => true,
|
|
|
|
// Own albums.
|
|
'edit_fedistream_albums' => true,
|
|
'edit_published_fedistream_albums' => true,
|
|
'publish_fedistream_albums' => true,
|
|
'delete_fedistream_albums' => true,
|
|
'delete_published_fedistream_albums' => true,
|
|
|
|
// Own tracks.
|
|
'edit_fedistream_tracks' => true,
|
|
'edit_published_fedistream_tracks' => true,
|
|
'publish_fedistream_tracks' => true,
|
|
'delete_fedistream_tracks' => true,
|
|
'delete_published_fedistream_tracks' => true,
|
|
|
|
// Own playlists.
|
|
'edit_fedistream_playlists' => true,
|
|
'edit_published_fedistream_playlists' => true,
|
|
'publish_fedistream_playlists' => true,
|
|
'delete_fedistream_playlists' => true,
|
|
'delete_published_fedistream_playlists' => true,
|
|
|
|
// View stats.
|
|
'view_fedistream_stats' => true,
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get Label role capabilities.
|
|
*
|
|
* @return array Array of capabilities for the Label role.
|
|
*/
|
|
public static function get_label_capabilities(): array {
|
|
$caps = self::get_artist_capabilities();
|
|
|
|
// Add label-specific capabilities.
|
|
$label_caps = array(
|
|
// Manage others' content.
|
|
'edit_others_fedistream_artists' => true,
|
|
'edit_others_fedistream_albums' => true,
|
|
'edit_others_fedistream_tracks' => true,
|
|
'edit_others_fedistream_playlists' => true,
|
|
'delete_others_fedistream_artists' => true,
|
|
'delete_others_fedistream_albums' => true,
|
|
'delete_others_fedistream_tracks' => true,
|
|
'delete_others_fedistream_playlists' => true,
|
|
'read_private_fedistream_artists' => true,
|
|
'read_private_fedistream_albums' => true,
|
|
'read_private_fedistream_tracks' => true,
|
|
'read_private_fedistream_playlists' => true,
|
|
'delete_private_fedistream_artists' => true,
|
|
'delete_private_fedistream_albums' => true,
|
|
'delete_private_fedistream_tracks' => true,
|
|
'delete_private_fedistream_playlists' => true,
|
|
|
|
// Manage taxonomies.
|
|
'manage_fedistream_genres' => true,
|
|
'manage_fedistream_moods' => true,
|
|
'manage_fedistream_licenses' => true,
|
|
|
|
// View stats.
|
|
'view_fedistream_stats' => true,
|
|
);
|
|
|
|
return array_merge( $caps, $label_caps );
|
|
}
|
|
|
|
/**
|
|
* Add custom roles.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function add_roles(): void {
|
|
// Remove existing roles first to ensure clean slate.
|
|
remove_role( 'fedistream_artist' );
|
|
remove_role( 'fedistream_label' );
|
|
|
|
// Add Artist role.
|
|
add_role(
|
|
'fedistream_artist',
|
|
__( 'FediStream Artist', 'wp-fedistream' ),
|
|
self::get_artist_capabilities()
|
|
);
|
|
|
|
// Add Label role.
|
|
add_role(
|
|
'fedistream_label',
|
|
__( 'FediStream Label', 'wp-fedistream' ),
|
|
self::get_label_capabilities()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Remove custom roles.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function remove_roles(): void {
|
|
remove_role( 'fedistream_artist' );
|
|
remove_role( 'fedistream_label' );
|
|
}
|
|
|
|
/**
|
|
* Add capabilities to administrator role.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function add_admin_capabilities(): void {
|
|
$admin = get_role( 'administrator' );
|
|
|
|
if ( ! $admin ) {
|
|
return;
|
|
}
|
|
|
|
// Add all custom capabilities.
|
|
$all_caps = self::get_all_capabilities();
|
|
foreach ( $all_caps as $cap ) {
|
|
$admin->add_cap( $cap );
|
|
}
|
|
|
|
// Add management capability.
|
|
$admin->add_cap( 'manage_fedistream_settings' );
|
|
}
|
|
|
|
/**
|
|
* Remove capabilities from administrator role.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function remove_admin_capabilities(): void {
|
|
$admin = get_role( 'administrator' );
|
|
|
|
if ( ! $admin ) {
|
|
return;
|
|
}
|
|
|
|
// Remove all custom capabilities.
|
|
$all_caps = self::get_all_capabilities();
|
|
foreach ( $all_caps as $cap ) {
|
|
$admin->remove_cap( $cap );
|
|
}
|
|
|
|
$admin->remove_cap( 'manage_fedistream_settings' );
|
|
}
|
|
|
|
/**
|
|
* Install roles and capabilities.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function install(): void {
|
|
self::add_roles();
|
|
self::add_admin_capabilities();
|
|
}
|
|
|
|
/**
|
|
* Uninstall roles and capabilities.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function uninstall(): void {
|
|
self::remove_roles();
|
|
self::remove_admin_capabilities();
|
|
}
|
|
}
|