Prototype resizable server icons
parent
2a13c7f737
commit
49cfd69eb5
@ -0,0 +1,84 @@
|
||||
<?php
|
||||
require_once "$PROJECT_ROOT/php/servers/known-servers.php";
|
||||
|
||||
/**
|
||||
* Return local path to room icon.
|
||||
* @param string $room_id Id of room to locate icon for.
|
||||
*/
|
||||
function room_icon_path(string $room_id): string {
|
||||
global $ROOM_ICONS_CACHE;
|
||||
return "$ROOM_ICONS_CACHE/$room_id";
|
||||
}
|
||||
|
||||
/**
|
||||
* Return local path to resized room icon.
|
||||
* @param string $room_id Id of room to locate icon for.
|
||||
* @param string $size Image dimensions.
|
||||
*/
|
||||
function room_icon_path_resized(string $room_id, string $size): string {
|
||||
global $ROOM_ICONS_CACHE;
|
||||
return "$ROOM_ICONS_CACHE/$room_id-$size";
|
||||
}
|
||||
|
||||
/**
|
||||
* Return server path to room icon.
|
||||
* @param string $room_id Id of room to locate icon for.
|
||||
* @param string $size Image dimensions.
|
||||
*/
|
||||
function room_icon_path_relative(string $room_id, string $size): string {
|
||||
global $ROOM_ICONS_RELATIVE;
|
||||
return "$ROOM_ICONS_RELATIVE/$room_id-$size";
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the icon of the given room and return its relative path.
|
||||
* @param \CommunityRoom $room
|
||||
* @param string $size Image dimensions.
|
||||
* @return string Relative path or null if icon is absent.
|
||||
*/
|
||||
function room_icon(\CommunityRoom $room, string $size): ?string {
|
||||
global $ICON_ALLOWLIST;
|
||||
list($width, $height) = explode("x", $size);
|
||||
$width = intval($width);
|
||||
$height = intval($height);
|
||||
assert(!empty($width) && !empty($height));
|
||||
if (!in_array($room->server->get_hostname(), $ICON_ALLOWLIST)) {
|
||||
return null;
|
||||
}
|
||||
if ($room->has_nsfw_keywords()) {
|
||||
return null;
|
||||
}
|
||||
$room_id = $room->get_room_identifier();
|
||||
$icon_cached = room_icon_path($room_id);
|
||||
$icon_resized = room_icon_path_resized($room_id, $size);
|
||||
if (file_exists($icon_resized)) {
|
||||
return room_icon_path_relative($room_id, $size);
|
||||
}
|
||||
if (!file_exists($icon_cached)) {
|
||||
$icon_url = $room->get_icon_url();
|
||||
if (empty($icon_url)) {
|
||||
return null;
|
||||
}
|
||||
log_debug("Fetching icon for $room_id.");
|
||||
$icon = file_get_contents($icon_url);
|
||||
if (empty($icon)) {
|
||||
log_info("$room_id returned empty icon.");
|
||||
}
|
||||
// Cache result, no matter if empty
|
||||
file_put_contents($icon_cached, $icon);
|
||||
}
|
||||
$icon_cached_contents = file_get_contents($icon_cached);
|
||||
if (empty($icon_cached_contents)) {
|
||||
file_put_contents($icon_resized, "");
|
||||
return "";
|
||||
}
|
||||
// Resize image
|
||||
$gd_image = imagecreatefromstring($icon_cached_contents);
|
||||
$gd_resized = imagescale($gd_image, $width, $height);
|
||||
imagewebp($gd_resized, to: $icon_resized);
|
||||
return room_icon_path_relative($room_id, $size);
|
||||
}
|
||||
|
||||
file_exists($ROOM_ICONS_CACHE) or mkdir($ROOM_ICONS_CACHE, 0755, true);
|
||||
file_exists($ROOM_ICONS) or mkdir($ROOM_ICONS, 0755, true);
|
||||
?>
|
Loading…
Reference in New Issue