<?php namespace HashOver;// Copyright (C) 2015-2021 Jacob Barkdull// This file is part of HashOver.//// HashOver is free software: you can redistribute it and/or modify// it under the terms of the GNU Affero General Public License as// published by the Free Software Foundation, either version 3 of the// License, or (at your option) any later version.//// HashOver is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Affero General Public License for more details.//// You should have received a copy of the GNU Affero General Public License// along with HashOver.  If not, see <http://www.gnu.org/licenses/>.class Avatars{	protected $setup;	protected $isVector;	protected $gravatar;	protected $iconSize;	protected $avatar;	protected $png;	protected $svg;	protected $fallback;	// Supported icon sizes	protected $iconSizes = array (45, 64, 128, 256, 512);	// Initial setup	public function __construct (Setup $setup)	{		// Store parameters as properties		$this->setup = $setup;		// Whether icon is vector based on setting		$this->isVector = ($setup->imageFormat === 'svg');		// Get HTTPS status		$is_https = $setup->isHTTPS ();		// Use HTTPS if this file is requested with HTTPS		$http = ($is_https ? 'https' : 'http') . '://';		$subdomain = $is_https ? 'secure' : 'www';		// Construct Gravatar icon URL		$this->gravatar = $http . $subdomain . '.gravatar.com/avatar/';		// Icon setup		$this->iconSetup ($setup->iconSize);	}	// Gets default avatar size closest to the given size	protected function closestSize ($size = 45)	{		// Current supported size		$closest = $this->iconSizes[0];		// Find the closest size		for ($i = 0, $il = count ($this->iconSizes); $i < $il; $i++) {			// Check if the size is too small			if ($size > $closest) {				// If so, increase closest size				$closest = $this->iconSizes[$i];			} else {				// If not, end the loop				break;			}		}		return $closest;	}	// Sets up avatar	protected function iconSetup ($size = 45)	{		// Set icon size (256 for vector)		$this->iconSize = $this->isVector ? 256 : $size;		// Set default icon size (256 for vector)		$default_size = $this->isVector ? 256 : $this->closestSize ($size);		// Default avatar file names		$avatar = $this->setup->httpImages . '/avatar';		$this->png = $avatar . '-' . $default_size . '.png';		$this->svg = $avatar . '.svg';		// Set avatar property to appropriate type		$this->avatar = $this->isVector ? $this->svg : $this->png;		// Check if avatar is set to custom		if ($this->setup->gravatarDefault === 'custom') {			// If so, direct 404s to local PNG avatar image			$fallback = $this->png;			// Make avatar path absolute when not accessed remotely			if ($this->setup->remoteAccess === false) {				$fallback = $this->setup->absolutePath . $fallback;			}			// And set final fallback avatar path property			$this->fallback = $fallback;		} else {			// If not, direct 404s to a themed default			$this->fallback = $this->setup->gravatarDefault;		}	}	// Attempt to get Gravatar avatar image	public function getGravatar ($hash, $abs = false, $size = false)	{		// Decide desired size of icon		$size = $size ?: $this->setup->iconSize;		// Perform setup again if the size doesn't match		if ($size !== $this->iconSize) {			$this->iconSetup ($size);		}		// If no hash is given, return the default avatar		if (empty ($hash)) {			// Return absolute path if told to and accessed remotely			if ($abs === true and $this->setup->remoteAccess !== true) {				return $this->setup->absolutePath . $this->avatar;			}			// Otherwise, return avatar path as-is			return $this->avatar;		}		// Gravatar URL		$gravatar  = $this->gravatar . $hash . '.png?r=pg';		$gravatar .= '&amp;s=' . urlencode ($this->iconSize);		$gravatar .= '&amp;d=' . urlencode ($this->fallback);		// Force Gravatar default avatar if enabled		if ($this->setup->gravatarForce === true) {			$gravatar .= '&amp;f=y';		}		// Redirect Gravatar image		return $gravatar;	}}