Replaced Misuzu Colour library with the Index ones.

This commit is contained in:
flash 2023-01-02 23:48:04 +00:00
parent f9d2ca2bb5
commit 4f3d0c5246
11 changed files with 36 additions and 136 deletions

@ -1 +1 @@
Subproject commit a0b3a08d7f8324ea2ec4e920c38b00646e0a9a6f Subproject commit 66a35f030f9eec02d8e51710c7de2161d2a1796f

View file

@ -1,6 +1,8 @@
<?php <?php
namespace Misuzu; namespace Misuzu;
use Index\Colour\Colour;
use Index\Colour\ColourRGB;
use Misuzu\Users\User; use Misuzu\Users\User;
use Misuzu\Users\UserRole; use Misuzu\Users\UserRole;
use Misuzu\Users\UserRoleNotFoundException; use Misuzu\Users\UserRoleNotFoundException;
@ -53,9 +55,9 @@ if(!empty($_POST['role']) && is_array($_POST['role']) && CSRF::validateRequest()
} }
if(!empty($_POST['role']['colour']['inherit'])) { if(!empty($_POST['role']['colour']['inherit'])) {
$roleColour = Colour::none(); $roleColour = \Index\Colour\Colour::none();
} else { } else {
$roleColour = Colour::fromRgb( $roleColour = new ColourRGB(
(int)($_POST['role']['colour']['red'] ?? -1), (int)($_POST['role']['colour']['red'] ?? -1),
(int)($_POST['role']['colour']['green'] ?? -1), (int)($_POST['role']['colour']['green'] ?? -1),
(int)($_POST['role']['colour']['blue'] ?? -1) (int)($_POST['role']['colour']['blue'] ?? -1)

View file

@ -1,6 +1,7 @@
<?php <?php
namespace Misuzu; namespace Misuzu;
use Index\Colour\Colour;
use Misuzu\Users\User; use Misuzu\Users\User;
use Misuzu\Users\UserNotFoundException; use Misuzu\Users\UserNotFoundException;
use Misuzu\Users\UserRole; use Misuzu\Users\UserRole;
@ -138,12 +139,11 @@ if(CSRF::validateRequest() && $canEdit) {
if(!empty($_POST['colour']) && is_array($_POST['colour'])) { if(!empty($_POST['colour']) && is_array($_POST['colour'])) {
$setColour = null; $setColour = null;
if(!empty($_POST['colour']['enable'])) if(!empty($_POST['colour']['enable'])) {
try { $setColour = \Index\Colour\Colour::parse((string)($_POST['colour']['hex'] ?? ''));
$setColour = Colour::fromHex((string)($_POST['colour']['hex'] ?? '')); if($setColour->shouldInherit())
} catch(\Exception $ex) { $notices[] = 'Invalid colour specified.';
$notices[] = $ex->getMessage(); }
}
if(empty($notices)) if(empty($notices))
$userInfo->setColour($setColour); $userInfo->setColour($setColour);

View file

@ -1,96 +0,0 @@
<?php
namespace Misuzu;
use InvalidArgumentException;
class Colour {
private const FLAG_INHERIT = 0x40000000;
private const READABILITY_THRESHOLD = 186;
private const LUMINANCE_WEIGHT_RED = .299;
private const LUMINANCE_WEIGHT_GREEN = .587;
private const LUMINANCE_WEIGHT_BLUE = .114;
private int $raw = 0;
public function __construct(?int $raw = 0) {
$this->raw = ($raw ?? 0) & 0x7FFFFFFF;
}
public static function none(): self {
return new Colour(self::FLAG_INHERIT);
}
public static function fromRgb(int $red, int $green, int $blue): self {
$raw = (($red & 0xFF) << 16)
| (($green & 0xFF) << 8)
| ($blue & 0xFF);
return new Colour($raw);
}
public static function fromHex(string $hex): self {
if($hex[0] === '#')
$hex = mb_substr($hex, 1);
if(!ctype_xdigit($hex))
throw new InvalidArgumentException('Argument contains invalid characters.');
$length = mb_strlen($hex);
if($length === 3) {
$hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
} elseif($length !== 6) {
throw new InvalidArgumentException('Argument is not a hex string.');
}
return new Colour(hexdec($hex));
}
public function getRaw(): int {
return $this->raw;
}
public function getInherit(): bool {
return ($this->getRaw() & self::FLAG_INHERIT) > 0;
}
public function getRed(): int {
return ($this->getRaw() & 0xFF0000) >> 16;
}
public function getGreen(): int {
return ($this->getRaw() & 0xFF00) >> 8;
}
public function getBlue(): int {
return ($this->getRaw() & 0xFF);
}
public function getLuminance(): float {
return self::LUMINANCE_WEIGHT_RED * $this->getRed()
+ self::LUMINANCE_WEIGHT_GREEN * $this->getGreen()
+ self::LUMINANCE_WEIGHT_BLUE * $this->getBlue();
}
public function getHex(): string {
return str_pad(dechex($this->getRaw() & 0xFFFFFF), 6, '0', STR_PAD_LEFT);
}
public function getCSS(): string {
if($this->getInherit())
return 'inherit';
return '#' . $this->getHex();
}
public function extractCSSContract(
string $dark = 'dark', string $light = 'light', bool $inheritIsDark = true
): string {
if($this->getInherit())
return $inheritIsDark ? $dark : $light;
return $this->getLuminance() > self::READABILITY_THRESHOLD ? $dark : $light;
}
public function __toString() {
return $this->getCSS();
}
}

View file

@ -1,6 +1,7 @@
<?php <?php
namespace Misuzu\SharpChat; namespace Misuzu\SharpChat;
use Index\Colour\Colour;
use Index\Http\HttpFx; use Index\Http\HttpFx;
use Misuzu\Config\IConfig; use Misuzu\Config\IConfig;
use Misuzu\Config\CfgType; use Misuzu\Config\CfgType;
@ -70,7 +71,7 @@ final class SharpChatRoutes {
return $out; return $out;
} }
public static function login($response, $request): void { public function login($response, $request): void {
$currentUser = User::getCurrent(); $currentUser = User::getCurrent();
$configKey = $request->hasParam('legacy') ? 'chatPath.legacy' : 'chatPath.normal'; $configKey = $request->hasParam('legacy') ? 'chatPath.legacy' : 'chatPath.normal';
$chatPath = $this->config->getValue($configKey, CfgType::T_STR, '/'); $chatPath = $this->config->getValue($configKey, CfgType::T_STR, '/');
@ -147,7 +148,7 @@ final class SharpChatRoutes {
return [ return [
'user_id' => $userInfo->getId(), 'user_id' => $userInfo->getId(),
'username' => $userInfo->getUsername(), 'username' => $userInfo->getUsername(),
'colour_raw' => $userInfo->getColour()->getRaw(), 'colour_raw' => Colour::toMisuzu($userInfo->getColour()),
'rank' => $rank = $userInfo->getRank(), 'rank' => $rank = $userInfo->getRank(),
'perms' => SharpChatPerms::convert($userInfo), 'perms' => SharpChatPerms::convert($userInfo),
]; ];
@ -238,7 +239,7 @@ final class SharpChatRoutes {
'success' => true, 'success' => true,
'user_id' => $userInfo->getId(), 'user_id' => $userInfo->getId(),
'username' => $userInfo->getUsername(), 'username' => $userInfo->getUsername(),
'colour_raw' => $userInfo->getColour()->getRaw(), 'colour_raw' => Colour::toMisuzu($userInfo->getColour()),
'rank' => $rank = $userInfo->getRank(), 'rank' => $rank = $userInfo->getRank(),
'hierarchy' => $rank, 'hierarchy' => $rank,
'is_silenced' => date('c', $userInfo->isSilenced() || $userInfo->isBanned() ? ($userInfo->isActiveWarningPermanent() ? strtotime('10 years') : $userInfo->getActiveWarningExpiration()) : 0), 'is_silenced' => date('c', $userInfo->isSilenced() || $userInfo->isBanned() ? ($userInfo->isActiveWarningPermanent() ? strtotime('10 years') : $userInfo->getActiveWarningExpiration()) : 0),
@ -267,7 +268,7 @@ final class SharpChatRoutes {
'user_id' => $userInfo->getId(), 'user_id' => $userInfo->getId(),
'id' => $userInfo->getId(), 'id' => $userInfo->getId(),
'username' => $userInfo->getUsername(), 'username' => $userInfo->getUsername(),
'colour_raw' => $userInfo->getColour()->getRaw(), 'colour_raw' => Colour::toMisuzu($userInfo->getColour()),
'rank' => $rank = $userInfo->getRank(), 'rank' => $rank = $userInfo->getRank(),
'ip' => $warning->getUserRemoteAddress(), 'ip' => $warning->getUserRemoteAddress(),
'is_permanent' => $isPermanent, 'is_permanent' => $isPermanent,

View file

@ -4,7 +4,7 @@ namespace Misuzu\Users;
use DateTime; use DateTime;
use DateTimeZone; use DateTimeZone;
use JsonSerializable; use JsonSerializable;
use Misuzu\Colour; use Index\Colour\Colour;
use Misuzu\DB; use Misuzu\DB;
use Misuzu\HasRankInterface; use Misuzu\HasRankInterface;
use Misuzu\Memoizer; use Misuzu\Memoizer;
@ -140,17 +140,17 @@ class User implements HasRankInterface, JsonSerializable {
public function getColour(): Colour { // Swaps role colour in if user has no personal colour public function getColour(): Colour { // Swaps role colour in if user has no personal colour
if($this->realColour === null) { if($this->realColour === null) {
$this->realColour = $this->getUserColour(); $this->realColour = $this->getUserColour();
if($this->realColour->getInherit()) if($this->realColour->shouldInherit())
$this->realColour = $this->getDisplayRole()->getColour(); $this->realColour = $this->getDisplayRole()->getColour();
} }
return $this->realColour; return $this->realColour;
} }
public function setColour(?Colour $colour): self { public function setColour(?Colour $colour): self {
return $this->setColourRaw($colour === null ? null : $colour->getRaw()); return $this->setColourRaw($colour === null ? null : Colour::toMisuzu($colour));
} }
public function getUserColour(): Colour { // Only ever gets the user's actual colour public function getUserColour(): Colour { // Only ever gets the user's actual colour
if($this->userColour === null) if($this->userColour === null)
$this->userColour = new Colour($this->getColourRaw()); $this->userColour = Colour::fromMisuzu($this->getColourRaw());
return $this->userColour; return $this->userColour;
} }
public function getColourRaw(): int { public function getColourRaw(): int {

View file

@ -2,6 +2,7 @@
namespace Misuzu\Users; namespace Misuzu\Users;
use Index\DateTime; use Index\DateTime;
use Index\Colour\Colour;
abstract class UserInfo { abstract class UserInfo {
abstract public function getId(): string; abstract public function getId(): string;
@ -14,15 +15,14 @@ abstract class UserInfo {
abstract public function getDisplayRoleId(): string; abstract public function getDisplayRoleId(): string;
// need Index colour type abstract public function getColour(): Colour;
//abstract public function getColour(): ?int;
abstract public function getCreatedDate(): DateTime; abstract public function getCreatedDate(): DateTime;
abstract public function getLastActiveDate(): DateTime; abstract public function getLastActiveDate(): DateTime;
abstract public function getDeletedDate(): DateTime; abstract public function getDeletedDate(): DateTime;
public function hasColour(): bool { public function hasColour(): bool {
return $this->getColour() !== null; return !$this->getColour()->shouldInherit();
} }
private static DateTime $epoch; private static DateTime $epoch;

View file

@ -2,7 +2,7 @@
namespace Misuzu\Users; namespace Misuzu\Users;
use ArrayAccess; use ArrayAccess;
use Misuzu\Colour; use Index\Colour\Colour;
use Misuzu\DB; use Misuzu\DB;
use Misuzu\HasRankInterface; use Misuzu\HasRankInterface;
use Misuzu\Memoizer; use Misuzu\Memoizer;
@ -98,12 +98,12 @@ class UserRole implements ArrayAccess, HasRankInterface {
} }
public function getColour(): Colour { public function getColour(): Colour {
if($this->colour === null || ($this->getColourRaw() ?? 0x40000000) !== $this->colour->getRaw()) if($this->colour === null || ($this->role_colour ?? 0x40000000) !== Colour::toMisuzu($this->colour))
$this->colour = new Colour($this->role_colour ?? 0x40000000); $this->colour = Colour::fromMisuzu($this->role_colour ?? 0x40000000);
return $this->colour; return $this->colour;
} }
public function setColour(Colour $colour): self { public function setColour(Colour $colour): self {
$this->role_colour = $colour->getInherit() ? null : $colour->getRaw(); $this->role_colour = $colour->shouldInherit() ? null : Colour::toMisuzu($colour);
$this->colour = $this->colour; $this->colour = $this->colour;
return $this; return $this;
} }

View file

@ -46,7 +46,7 @@
<label class="form__label"> <label class="form__label">
<div class="form__label__text">Inherit Colour</div> <div class="form__label__text">Inherit Colour</div>
<div class="form__label__input"> <div class="form__label__input">
{{ input_checkbox('role[colour][inherit]', '', role_info is not null ? role_info.colour.inherit : true) }} {{ input_checkbox('role[colour][inherit]', '', role_info is not null ? role_info.colour.shouldInherit : true) }}
</div> </div>
</label> </label>

View file

@ -99,11 +99,11 @@
<label class="form__label"> <label class="form__label">
<div class="form__label__text">Custom Colour</div> <div class="form__label__text">Custom Colour</div>
<div class="form__label__input"> <div class="form__label__input">
{{ input_checkbox('colour[enable]', '', not user_info.userColour.inherit, '', '', false, null, not can_edit_user) }} {{ input_checkbox('colour[enable]', '', not user_info.userColour.shouldInherit, '', '', false, null, not can_edit_user) }}
</div> </div>
</label> </label>
{{ input_colour(can_edit_user ? 'colour[hex]' : '', '', '#%s'|format(user_info.userColour.hex)) }} {{ input_colour(can_edit_user ? 'colour[hex]' : '', '', user_info.userColour) }}
</div> </div>
{# TODO: if the hierarchy of the current user is too low to touch the role then opacity should be lowered and input disabled #} {# TODO: if the hierarchy of the current user is too low to touch the role then opacity should be lowered and input disabled #}

View file

@ -118,27 +118,20 @@ function render_info(?string $message, int $httpCode, string $template = 'errors
} }
function html_colour(?int $colour, $attribs = '--user-colour'): string { function html_colour(?int $colour, $attribs = '--user-colour'): string {
$colour = $colour == null ? \Misuzu\Colour::none() : new \Misuzu\Colour($colour); $colour = (string)\Index\Colour\Colour::fromMisuzu($colour ?? 0x40000000);
if(is_string($attribs)) { if(is_string($attribs))
$attribs = [ $attribs = [ $attribs => '%s' ];
$attribs => '%s',
];
}
if(!$attribs) { if(!$attribs)
$attribs = [ $attribs = [
'color' => '%s', 'color' => '%s',
'--user-colour' => '%s', '--user-colour' => '%s',
]; ];
}
$css = ''; $css = '';
$value = $colour->getCSS(); foreach($attribs as $name => $format)
$css .= $name . ':' . sprintf($format, $colour) . ';';
foreach($attribs as $name => $format) {
$css .= $name . ':' . sprintf($format, $value) . ';';
}
return $css; return $css;
} }