105 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
require_once "vendor/autoload.php";
 | 
						|
 | 
						|
require_once "common_func.php";
 | 
						|
 | 
						|
require_once "AutoStoring.php";
 | 
						|
 | 
						|
require_once "privilege_levels.php";
 | 
						|
 | 
						|
require_once "User.php";
 | 
						|
 | 
						|
class UserMgr
 | 
						|
{
 | 
						|
    public \SleekDB\Store $db;
 | 
						|
 | 
						|
    function __construct()
 | 
						|
    {
 | 
						|
        // create database
 | 
						|
        $this->db = new \SleekDB\Store(USERDB, DATADIR, ["timeout" => false]);
 | 
						|
    }
 | 
						|
 | 
						|
    // Get user by nickname. Returns with a User object if found, null else.
 | 
						|
    function getUser(string $nickname): User|null
 | 
						|
    {
 | 
						|
        $user_data_array = $this->db->findBy(["nickname", "=", $nickname]);
 | 
						|
        return count($user_data_array) != 0 ? User::fromArray($this, $user_data_array[0]) : null;
 | 
						|
    }
 | 
						|
 | 
						|
    // Update user.
 | 
						|
    function updateUser(User $user): void
 | 
						|
    {
 | 
						|
        $a = $user->toArray(); // convert to array
 | 
						|
        $this->db->update($a); // update using the extracted array
 | 
						|
    }
 | 
						|
 | 
						|
    // checks if a nickname is taken
 | 
						|
    function isNicknameTaken(string $nickname): bool
 | 
						|
    {
 | 
						|
        return !($this->db->findOneBy(["nickname", "=", $nickname]) == null);
 | 
						|
    }
 | 
						|
 | 
						|
    // Add new user.
 | 
						|
    function addUser(string $nickname, string $password, string $realname, string $privilege = PRIVILEGE_PLAYER): bool
 | 
						|
    {
 | 
						|
        if ($this->isNicknameTaken($nickname)) { // user exists
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $a = [
 | 
						|
            "nickname" => $nickname,
 | 
						|
            "password" => password_hash($password, PASSWORD_DEFAULT),
 | 
						|
            "realname" => $realname,
 | 
						|
            "privilege" => $privilege
 | 
						|
        ];
 | 
						|
 | 
						|
        // create user object
 | 
						|
        $user = User::fromArray($this, $a);
 | 
						|
 | 
						|
//        // add user to specific groups FIXME!!!!
 | 
						|
//        foreach ($groupids as $groupid) {
 | 
						|
//            change_group_user_assignments($groupid, $nickname, null);
 | 
						|
//        }
 | 
						|
 | 
						|
        $this->db->insert($user->toArray(["_id"]));
 | 
						|
 | 
						|
        return true; // user registration successful
 | 
						|
    }
 | 
						|
 | 
						|
    // Delete user from the storage
 | 
						|
    function deleteUser(string $nickname): void
 | 
						|
    {
 | 
						|
        // cannot delete quizmaster
 | 
						|
        if ($nickname == QUIZMASTER_NICKNAME) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
//        $user = $this->getUser($nickname);
 | 
						|
//        if ($user !== null) {
 | 
						|
//            foreach ($user->getGroups() as $groupid) {
 | 
						|
//                change_group_user_assignments($groupid, null, $nickname);
 | 
						|
//            }
 | 
						|
        $this->db->deleteBy(["nickname", "=", $nickname]);
 | 
						|
        //}
 | 
						|
    }
 | 
						|
 | 
						|
    // Dump all users. Users come wrapped in User objects.
 | 
						|
    function getAllUsers(): array
 | 
						|
    {
 | 
						|
        return array_map(fn($a): User => User::fromArray($this, $a), $this->db->findAll());
 | 
						|
    }
 | 
						|
 | 
						|
    // Get all nicknames.
 | 
						|
    function getAllNicknames(): array
 | 
						|
    {
 | 
						|
        $qb = $this->db->createQueryBuilder();
 | 
						|
        return array_map(fn($c): string => $c["nickname"], $qb->select(["nickname"])->getQuery()->fetch());
 | 
						|
    }
 | 
						|
 | 
						|
    // Sanitize nicknames. Clear non-existent nicknames from the array.
 | 
						|
    function sanitizeNicknames(array $nicknames): array {
 | 
						|
        $a = $this->db->findBy(["nickname", "IN", $nicknames]);
 | 
						|
        return array_map(fn($a) => $a["nickname"], $a);
 | 
						|
    }
 | 
						|
} |