bind('user_id_1', $user); $getPerms->bind('user_id_2', $user); return $memo[$user] = $getPerms->fetch(); } function perms_delete_user(int|string $user): bool { if(is_string($user)) $user = (int)$user; if($user < 1) return false; $deletePermissions = \Misuzu\DB::prepare(' DELETE FROM `msz_permissions` WHERE `role_id` IS NULL AND `user_id` = :user_id '); $deletePermissions->bind('user_id', $user); return $deletePermissions->execute(); } function perms_get_role(int $role): array { if($role < 1) { return perms_get_blank(); } static $memo = []; if(array_key_exists($role, $memo)) { return $memo[$role]; } $getPerms = \Misuzu\DB::prepare(sprintf( ' SELECT %s FROM `msz_permissions` WHERE `role_id` = :role_id AND `user_id` IS NULL ', perms_get_select() )); $getPerms->bind('role_id', $role); return $memo[$role] = $getPerms->fetch(); } function perms_get_user_raw(int|string $user): array { if(is_string($user)) $user = (int)$user; if($user < 1) return perms_create(); $getPerms = \Misuzu\DB::prepare(sprintf(' SELECT `%s` FROM `msz_permissions` WHERE `user_id` = :user_id AND `role_id` IS NULL ', implode('`, `', perms_get_keys()))); $getPerms->bind('user_id', $user); $perms = $getPerms->fetch(); if(empty($perms)) { return perms_create(); } return $perms; } function perms_set_user_raw(int|string $user, array $perms): bool { if(is_string($user)) $user = (int)$user; if($user < 1) return false; $realPerms = perms_create(); $permKeys = array_keys($realPerms); foreach($permKeys as $perm) { $realPerms[$perm] = (int)($perms[$perm] ?? 0); } $setPermissions = \Misuzu\DB::prepare(sprintf( ' REPLACE INTO `msz_permissions` (`role_id`, `user_id`, `%s`) VALUES (NULL, :user_id, :%s) ', implode('`, `', $permKeys), implode(', :', $permKeys) )); $setPermissions->bind('user_id', $user); foreach($realPerms as $key => $value) { $setPermissions->bind($key, $value); } return $setPermissions->execute(); } function perms_get_role_raw(int $role): array { if($role < 1) { return perms_create(); } $getPerms = \Misuzu\DB::prepare(sprintf(' SELECT `%s` FROM `msz_permissions` WHERE `user_id` IS NULL AND `role_id` = :role_id ', implode('`, `', perms_get_keys()))); $getPerms->bind('role_id', $role); $perms = $getPerms->fetch(); if(empty($perms)) { return perms_create(); } return $perms; } function perms_check(?int $perms, ?int $perm, bool $strict = false): bool { $and = ($perms ?? 0) & ($perm ?? 0); return $strict ? $and === $perm : $and > 0; } function perms_check_user(string $prefix, int|string|null $userId, int $perm, bool $strict = false): bool { if(is_string($userId)) $userId = (int)$userId; return $userId > 0 && perms_check(perms_get_user($userId)[$prefix] ?? 0, $perm, $strict); } function perms_check_bulk(int $perms, array $set, bool $strict = false): array { foreach($set as $key => $perm) { $set[$key] = perms_check($perms, $perm, $strict); } return $set; } function perms_check_user_bulk(string $prefix, int|string|null $userId, array $set, bool $strict = false): array { $perms = perms_get_user($userId)[$prefix] ?? 0; return perms_check_bulk($perms, $set, $strict); } function perms_for_comments(string|int $userId): array { return perms_check_user_bulk(MSZ_PERMS_COMMENTS, $userId, [ 'can_comment' => MSZ_PERM_COMMENTS_CREATE, 'can_delete' => MSZ_PERM_COMMENTS_DELETE_OWN | MSZ_PERM_COMMENTS_DELETE_ANY, 'can_delete_any' => MSZ_PERM_COMMENTS_DELETE_ANY, 'can_pin' => MSZ_PERM_COMMENTS_PIN, 'can_lock' => MSZ_PERM_COMMENTS_LOCK, 'can_vote' => MSZ_PERM_COMMENTS_VOTE, ]); } function forum_get_parent_id(int $forumId): int { if($forumId < 1) return 0; static $memoized = []; if(array_key_exists($forumId, $memoized)) return $memoized[$forumId]; $getParent = \Misuzu\DB::prepare(' SELECT `forum_parent` FROM `msz_forum_categories` WHERE `forum_id` = :forum_id '); $getParent->bind('forum_id', $forumId); return (int)$getParent->fetchColumn(); } function forum_perms_get_user(?int $forum, int $user): array { $perms = perms_get_blank(MSZ_FORUM_PERM_MODES); if($user < 0 || $forum < 0) return $perms; static $memo = []; $memoId = "{$forum}-{$user}"; if(array_key_exists($memoId, $memo)) return $memo[$memoId]; if($forum > 0) $perms = forum_perms_get_user( forum_get_parent_id($forum), $user ); $getPerms = \Misuzu\DB::prepare(sprintf( ' SELECT %s FROM `msz_forum_permissions` WHERE (`forum_id` = :forum_id OR `forum_id` IS NULL) AND ( (`user_id` IS NULL AND `role_id` IS NULL) OR (`user_id` = :user_id_1 AND `role_id` IS NULL) OR ( `user_id` IS NULL AND `role_id` IN ( SELECT `role_id` FROM `msz_users_roles` WHERE `user_id` = :user_id_2 ) ) ) ', perms_get_select(MSZ_FORUM_PERM_MODES) )); $getPerms->bind('forum_id', $forum); $getPerms->bind('user_id_1', $user); $getPerms->bind('user_id_2', $user); $userPerms = $getPerms->fetch(); foreach($perms as $key => $value) $perms[$key] |= $userPerms[$key] ?? 0; return $memo[$memoId] = $perms; } function forum_perms_check_user( string $prefix, ?int $forumId, ?int $userId, int $perm, bool $strict = false ): bool { return perms_check(forum_perms_get_user($forumId, $userId)[$prefix] ?? 0, $perm, $strict); }