Commit | Line | Data |
---|---|---|
320f4a6d MW |
1 | <?php |
2 | namespace wcf\data\user\avatar; | |
3 | use wcf\system\exception\SystemException; | |
4 | use wcf\system\request\LinkHandler; | |
320f4a6d | 5 | use wcf\system\WCF; |
5242f6d5 | 6 | use wcf\util\FileUtil; |
d949e64b | 7 | use wcf\util\StringUtil; |
320f4a6d MW |
8 | |
9 | /** | |
10 | * Represents a gravatar. | |
11 | * | |
12 | * @author Marcel Werk | |
2b6cb5c2 | 13 | * @copyright 2001-2015 WoltLab GmbH |
320f4a6d | 14 | * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> |
f4f05aa5 | 15 | * @package com.woltlab.wcf |
320f4a6d MW |
16 | * @subpackage data.user.avatar |
17 | * @category Community Framework | |
18 | * @see http://www.gravatar.com | |
19 | */ | |
20 | class Gravatar extends DefaultAvatar { | |
21 | /** | |
22 | * gravatar base url | |
23 | * @var string | |
24 | */ | |
25 | const GRAVATAR_BASE = 'http://gravatar.com/avatar/%s?s=%d&r=g&d=%s'; | |
26 | ||
27 | /** | |
28 | * gravatar local cache location | |
29 | * @var string | |
30 | */ | |
4ae7fdc1 | 31 | const GRAVATAR_CACHE_LOCATION = 'images/avatars/gravatars/%s-%s.%s'; |
320f4a6d MW |
32 | |
33 | /** | |
34 | * gravatar expire time (days) | |
35 | * @var integer | |
36 | */ | |
37 | const GRAVATAR_CACHE_EXPIRE = 7; | |
38 | ||
39 | /** | |
40 | * user id | |
06355ec3 | 41 | * @var integer |
320f4a6d MW |
42 | */ |
43 | public $userID = 0; | |
44 | ||
45 | /** | |
46 | * gravatar e-mail address | |
47 | * @var string | |
48 | */ | |
49 | public $gravatar = ''; | |
50 | ||
4ae7fdc1 MW |
51 | /** |
52 | * file extension of the gravatar image | |
53 | * @var string | |
54 | */ | |
55 | public $fileExtension = 'png'; | |
56 | ||
320f4a6d MW |
57 | /** |
58 | * urls of this gravatar | |
59 | * @var array<string> | |
60 | */ | |
61 | protected $url = array(); | |
62 | ||
63 | /** | |
64 | * Creates a new Gravatar object. | |
65 | * | |
66 | * @param integer $userID | |
67 | * @param string $gravatar | |
68 | */ | |
4ae7fdc1 | 69 | public function __construct($userID, $gravatar, $fileExtension = 'png') { |
320f4a6d MW |
70 | $this->userID = $userID; |
71 | $this->gravatar = $gravatar; | |
4ae7fdc1 | 72 | $this->fileExtension = $fileExtension; |
320f4a6d MW |
73 | } |
74 | ||
75 | /** | |
0ad90fc3 | 76 | * @see \wcf\data\user\avatar\IUserAvatar::getURL() |
320f4a6d MW |
77 | */ |
78 | public function getURL($size = null) { | |
79 | if ($size === null) $size = $this->size; | |
d949e64b MW |
80 | else { |
81 | switch ($size) { | |
82 | case 16: | |
83 | case 24: | |
84 | $size = 32; | |
85 | break; | |
86 | case 48: | |
ba5df26e | 87 | case 64: |
d949e64b MW |
88 | $size = 96; |
89 | break; | |
90 | } | |
91 | } | |
320f4a6d MW |
92 | |
93 | if (!isset($this->url[$size])) { | |
94 | // try to use cached gravatar | |
4ae7fdc1 | 95 | $cachedFilename = sprintf(self::GRAVATAR_CACHE_LOCATION, md5(mb_strtolower($this->gravatar)), $size, $this->fileExtension); |
320f4a6d MW |
96 | if (file_exists(WCF_DIR.$cachedFilename) && filemtime(WCF_DIR.$cachedFilename) > (TIME_NOW - (self::GRAVATAR_CACHE_EXPIRE * 86400))) { |
97 | $this->url[$size] = WCF::getPath().$cachedFilename; | |
98 | } | |
99 | else { | |
100 | $this->url[$size] = LinkHandler::getInstance()->getLink('GravatarDownload', array( | |
e3369fd2 | 101 | 'forceFrontend' => true |
320f4a6d MW |
102 | ), 'userID='.$this->userID.'&size='.$size); |
103 | } | |
104 | } | |
105 | ||
106 | return $this->url[$size]; | |
107 | } | |
108 | ||
109 | /** | |
110 | * Checks a given email address for gravatar support. | |
111 | * | |
112 | * @param string $email | |
113 | * @return boolean | |
114 | */ | |
115 | public static function test($email) { | |
956b05f1 | 116 | $gravatarURL = sprintf(self::GRAVATAR_BASE, md5(mb_strtolower($email)), 80, GRAVATAR_DEFAULT_TYPE); |
320f4a6d MW |
117 | try { |
118 | $tmpFile = FileUtil::downloadFileFromHttp($gravatarURL, 'gravatar'); | |
119 | @unlink($tmpFile); | |
120 | return true; | |
121 | } | |
122 | catch (SystemException $e) { | |
123 | return false; | |
124 | } | |
125 | } | |
126 | ||
d949e64b MW |
127 | /** |
128 | * @see \wcf\data\user\avatar\IUserAvatar::getImageTag() | |
129 | */ | |
130 | public function getImageTag($size = null) { | |
131 | if ($size === null) $size = $this->size; | |
1a6e8c52 | 132 | |
d949e64b MW |
133 | $retinaSize = null; |
134 | switch ($size) { | |
135 | case 16: | |
136 | $retinaSize = 32; | |
137 | break; | |
138 | case 24: | |
139 | case 32: | |
140 | case 48: | |
141 | $retinaSize = 96; | |
142 | break; | |
143 | case 96: | |
144 | $retinaSize = 128; | |
145 | break; | |
146 | } | |
147 | ||
27509f81 | 148 | return '<img src="'.StringUtil::encodeHTML($this->getURL($size)).'" '.($retinaSize !== null ? ('srcset="'.StringUtil::encodeHTML($this->getURL($retinaSize)).' 2x" ') : '').'style="width: '.$size.'px; height: '.$size.'px" alt="" class="userAvatarImage" />'; |
d949e64b MW |
149 | } |
150 | ||
320f4a6d | 151 | /** |
0ad90fc3 | 152 | * @see \wcf\data\user\avatar\IUserAvatar::canCrop() |
320f4a6d MW |
153 | */ |
154 | public function canCrop() { | |
155 | return false; | |
156 | } | |
157 | } |