SpreadQuiz/class/Group.php
2025-09-30 22:44:06 +02:00

226 lines
5.8 KiB
PHP

<?php
require_once "AutoStoring.php";
class Group extends AutoStoring
{
private int $_id; // Group's ID (assigned by SleekDB)
private string $name; // Group's name
private bool $unique; // Indicates if name is unique or not
private string $owner; // Group owner's nickname
private string $description; // Group description
private array $editors; // Nicknames of users able to manage the group
private array $members; // Nickname of group members
private array $games; // Game IDs assigned to this group
private GroupMgr $groupMgr; // Reference to GroupMgr object managing this group
// --------------
// store modifications to the database
public function storeMods() : void
{
$this->groupMgr->updateGroup($this);
}
// --------------
function __construct(GroupMgr &$groupMgr, string $name, string $description, string $owner, int $id = -1, bool $unique = true, array $editors = [], array $members = [], array $games = [])
{
parent::__construct();
$this->_id = $id;
$this->name = $name;
$this->unique = $unique;
$this->description = $description;
$this->owner = $owner;
$this->editors = $editors;
$this->members = $members;
$this->games = $games;
$this->groupMgr = &$groupMgr;
}
// Create Group from array
static function fromArray(GroupMgr &$groupMgr, array $a): Group
{
$id = $a["_id"] ?? -1;
return new Group($groupMgr, $a["groupname"], $a["description"], $a["owner"], $id, $a["unique"], $a["editors"], $a["users"], $a["games"]);
}
// Convert Group to array
function toArray(array $omit = []): array
{
$a = [
"_id" => $this->_id,
"groupname" => $this->name,
"unique" => $this->unique,
"description" => $this->description,
"owner" => $this->owner,
"editors" => $this->editors,
"users" => $this->members,
"games" => $this->games
];
foreach ($omit as $field) {
unset($a[$field]);
}
return $a;
}
// Get group's ID.
function getID(): int
{
return $this->_id;
}
// Get group's name.
function getName(): string
{
return $this->name;
}
// Set group's name.
function setName(string $name): void
{
$this->name = $name;
$this->storeMods();
}
// Tell if group is unique
function isUnique(): bool
{
return $this->unique;
}
// Get group's description.
function getDescription(): string
{
return $this->description;
}
// Set group's description.
function setDescription(string $description): void
{
$this->description = $description;
$this->storeMods();
}
// Get group's owner.
function getOwner(): string
{
return $this->owner;
}
// Set group's owner.
function setOwner(string $owner): void
{
$this->owner = $owner;
$this->storeMods();
}
// Get list of editors.
function getEditors(): array
{
return $this->editors;
}
// Set editors.
function setEditors(array $editors): void
{
$this->editors = $editors;
$this->storeMods();
}
// Get group members.
function getMembers(): array
{
return $this->members;
}
// Set group members.
function setMembers(array $members): void
{
$this->members = $members;
$this->storeMods();
}
// Get games.
function getGames(): array
{
return $this->games;
}
// Set games.
function setGames(array $games): void
{
$this->games = $games;
$this->storeMods();
}
// Include/exclude members.
function changeMembers(array $nicknames_add, array $nicknames_remove): void
{
foreach ($nicknames_add as $nickname) { // add members
alter_array_contents($this->members, $nickname, null);
}
foreach ($nicknames_remove as $nickname) { // remove members
alter_array_contents($this->members, null, $nickname); // delete from members
alter_array_contents($this->editors, null, $nickname); // delete from editors
}
$this->storeMods(); // store changes
}
// Add members
function addMembers(array $nicknames) : void {
$this->changeMembers($nicknames, []);
}
// Remove members
function removeMembers(array $nicknames) : void {
$this->changeMembers([], $nicknames);
}
// Include/exclude games.
function changeGames(array $gameids_add, array $gameids_remove): void
{
foreach ($gameids_add as $gameid) { // add games
alter_array_contents($this->games, $gameid, null);
}
foreach ($gameids_remove as $gameid) { // remove games
alter_array_contents($this->games, null, $gameid);
}
$this->storeMods(); // store changes
}
// Returns whether the user is an editor of this group.
function isUserEditor(string $nickname): bool
{
return in_array($nickname, $this->editors);
}
// Returns whether the user is an editor or the owner of the group.
function isUserContributor(string $nickname): bool
{
return $this->isUserEditor($nickname) || ($this->owner === $nickname);
}
// Returns if user is member of the group.
function isMember(string $nickname): bool
{
return in_array($nickname, $this->members);
}
// Return if game is assigned to this group.
function isGameAssigned(string $gameid): bool
{
return in_array($gameid, $this->games);
}
// Get groups unique name.
function getUniqueName(): string
{
return $this->name . ($this->unique ? "" : ("#" . $this->_id));
}
}