module_title = _t('internalmail', 'Messages'); } /** * Системные настройки модуля * @param array $options @ref * @return string */ public function settingsSystem(array &$options = []): string { return $this->template('admin/settings.sys', ['options' => &$options]); } /** * Список шаблонов уведомлений * @return array */ public function sendmailTemplates(): array { return [ 'internalmail_new_message' => [ 'title' => _t('internalmail', 'Messages: New Message'), 'description' => _t('internalmail', 'Notification sent to the user when a new message is received'), 'vars' => [ '{name}' => _t('users', 'Name'), '{email}' => _t('', 'Email'), '{link}' => _t('internalmail', 'Link for Reading the Message'), '{message}' => _t('internalmail', 'Message Text'), ], 'priority' => 30, 'enotify' => Users::ENOTIFY_INTERNALMAIL, ], 'internalmail_new_message_newuser' => [ 'title' => _t('internalmail', 'Messages: New Message for a Non-Activated User'), 'description' => _t('internalmail', 'Notification sent to a non-activated user'), 'vars' => [ '{link_activate}' => _t('internalmail', 'Link to Chat and Activation'), '{message}' => _t('internalmail', 'Sent Message Text'), ], 'priority' => 31, 'enotify' => 0, # всегда 'force_verified' => true, ], ]; } /** * Формирование URL * @param string $key ключ * @param array $params параметры * @param bool $dynamic динамическая ссылка * @return string */ public function url(string $key, array $params = [], $dynamic = false): string { return $this->router->url('internalmail-' . $key, $params, ['dynamic' => $dynamic, 'module' => 'internalmail']); } /** * Метод обрабатывающий ситуацию с удалением пользователя * @param int $userID ID пользователя * @param array $options доп. параметры удаления * @return void */ public function onUserDeleted($userID, array $options = []) { if ($this->attachmentsEnabled()) { $attach = $this->attach(); $filter = [ ':u' => ['(author = :user OR recipient = :user)', ':user' => $userID], ':a' => ['attach != :empty', ':empty' => ''], ]; $data = $this->model->messagesByFilter($filter, ['attach'], ['oneArray' => false]); foreach ($data as $v) { $path = $attach->getAttachPath($v['attach']); if (file_exists($path)) { @unlink($path); } } } $this->model->onUserDeleted($userID, $options); } /** * Получаем список папок * @return array */ public function getFolders() { return [ static::FOLDER_FAVORITE => [ 'title' => _t('internalmail', 'Favorites'), 'notforadmin' => false, 'icon' => 'fa fa-star', 'icon-admin' => 'icon-star', 'class' => 'fav', ], static::FOLDER_IGNORE => [ 'title' => _t('internalmail', 'Ignored'), 'notforadmin' => true, 'icon' => 'fa fa-ban', 'icon-admin' => 'icon-ban-circle', 'class' => 'ignore', ], ]; } /** * Инициализация компонента работы с вложениями * @return Attachment */ public function attach() { return Attachment::i(); } /** * Загрузка приложения к сообщению * @param string $inputName имя input-file поля * @param array $extensions разрешенные типы файлов * @return string|bool имя загруженного файла */ public function attachUpload(string $inputName = 'attach', array $extensions = []) { if (! $this->attachmentsEnabled()) { return ''; } $attach = $this->attach(); $attach->setAllowedExtensions($extensions); $result = $attach->uploadFILES($inputName, 10); if (empty($result)) { return ''; } foreach ($result as & $v) { if (! empty($v['error'])) { $this->errors->setUploadError($v['error']); return ''; } unset($v['error']); } unset($v); return $result; } /** * Включены ли вложения * @return bool */ public function attachmentsEnabled(): bool { return $this->config('internalmail.attachments', true, TYPE_BOOL); } /** * Включены ли папки: избранные, игнорирую * @return bool */ public function foldersEnabled(): bool { return $this->config('internalmail.folders', true, TYPE_BOOL); } /** * Формирование списка директорий/файлов требующих проверки на наличие прав записи * @return array */ public function writableCheck() { return array_merge(parent::writableCheck(), [ bff::path('im') => 'dir', # вложения ]); } /** * Поиск "минус слов" в строке * @param string $text строка * @param string|null $spamWord @ref найденное слово * @param string|null $lang * @return bool true - нашли минус слово */ protected function spamMinusWordsFound(string $text, ?string &$spamWord = '', ?string $lang = null) { $lang = $lang ?? $this->locale->current(); $minusWords = func::unserialize($this->config('internalmail.spam.minuswords.prepared', '')); if (! empty($minusWords[$lang])) { return TextParser::minuswordsSearch($text, $spamWord, $minusWords[$lang]); } return false; } /** * Поиск "минус слов" в строке * @param array $p параметры с @ref данными * @return bool */ public function spamMinusWordsSearch($p) { if (empty($p['text'])) { return false; } if (! isset($p['word'])) { $p['word'] = ''; } return $this->spamMinusWordsFound($p['text'], $p['word'], $p['lang'] ?? null); } }