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);
}
}