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