3 namespace wcf\data\smiley
;
5 use wcf\data\category\Category
;
6 use wcf\data\smiley\category\SmileyCategory
;
7 use wcf\system\cache\builder\SmileyCacheBuilder
;
8 use wcf\system\category\CategoryHandler
;
9 use wcf\system\SingletonFactory
;
13 * Manages the smiley cache.
16 * @copyright 2001-2019 WoltLab GmbH
17 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
19 class SmileyCache
extends SingletonFactory
25 protected $cachedSmilies = [];
28 * cached smilies with smiley code as key
31 protected $cachedSmileyByCode = [];
34 * cached smiley categories
35 * @var SmileyCategory[]
37 protected $cachedCategories = [];
40 * enabled smiley categories with at least one smiley
41 * @var SmileyCategory[]
43 protected $visibleCategories;
48 protected array $emojis;
53 protected function init()
56 $this->cachedSmilies
= SmileyCacheBuilder
::getInstance()->getData([], 'smilies');
57 $this->cachedSmileyByCode
= SmileyCacheBuilder
::getInstance()->getData([], 'codes');
58 $smileyCategories = CategoryHandler
::getInstance()->getCategories('com.woltlab.wcf.bbcode.smiley');
60 $this->cachedCategories
[null] = new SmileyCategory(new Category(null, [
62 'parentCategoryID' => 0,
63 'title' => 'wcf.acp.smiley.categoryID.default',
69 foreach ($smileyCategories as $key => $smileyCategory) {
70 $this->cachedCategories
[$key] = new SmileyCategory($smileyCategory);
75 * Returns all smilies.
79 public function getSmilies()
81 return $this->cachedSmilies
;
85 * Returns the smiley with the given smiley code or `null` if no such smiley exists.
90 public function getSmileyByCode($code)
92 return $this->cachedSmileyByCode
[$code] ??
null;
96 * Returns all smiley categories.
98 * @return SmileyCategory[]
100 public function getCategories()
102 return $this->cachedCategories
;
106 * Returns all enabled smiley categories with at least one smiley.
108 * @return SmileyCategory[]
110 public function getVisibleCategories()
112 if ($this->visibleCategories
=== null) {
113 $this->visibleCategories
= [];
115 foreach ($this->cachedCategories
as $key => $category) {
116 if (!$category->isDisabled
) {
117 $category->loadSmilies();
119 if (\
count($category)) {
120 $this->visibleCategories
[$key] = $category;
126 return $this->visibleCategories
;
130 * Returns all the smilies of a category.
132 * @param int $categoryID
135 public function getCategorySmilies($categoryID = null)
137 if (isset($this->cachedSmilies
[$categoryID])) {
138 return $this->cachedSmilies
[$categoryID];
145 * Assigns the smilies and their categories to the template.
149 public function assignVariables()
151 if (!MODULE_SMILEY
) {
155 $smileyCategories = $this->getVisibleCategories();
156 $firstCategory = \reset
($smileyCategories);
157 $defaultSmilies = [];
158 if ($firstCategory) {
159 $defaultSmilies = $this->getCategorySmilies($firstCategory->categoryID ?
: null);
162 WCF
::getTPL()->assign([
163 'defaultSmilies' => $defaultSmilies,
164 'smileyCategories' => $smileyCategories,
169 * Return all smileys that match `:[a-z]+(?:_[a-z]+)*:`.
174 public function getEmojis(): array
176 if (!isset($this->emojis
)) {
178 foreach ($this->getVisibleCategories() as $category) {
179 foreach ($category as $smiley) {
180 foreach ($smiley->smileyCodes
as $smileyCode) {
181 if (\
preg_match('~^:[a-z]+(?:_[a-z]+)*:$~', $smileyCode)) {
182 $this->emojis
[$smileyCode] = $smiley;
189 return $this->emojis
;