Jump to content
View in the app

A better way to browse. Learn more.

IPBMafia.ru - поддержка Invision Community, релизы, темы, плагины и приложения

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Налик

Пользователи
  • Регистрация

  • В сети

Everything posted by Налик

  1. SlawkA поставил требование сложного пароля, одобрение поста в случаях когда в нем встречаются ссылки на внешний сайт, одобрение первых 3х постов. Проблему сейчас это не решит, но надеюсь в будущем это исправит ситуацию. Еще были мысли для группы пользователей требовать прохождение каптчи при написании первых 3х постов, но увы такого нету. Ну и сброс пароля, такого тоже увы нету.
  2. С одной. У меня всего 1 группа: "Пользователи" + добавляется дополнительная после некоторых фильтров "Активные пользователи" И еще вопрос, можно ли у пользователя потребовать смену пароля? Ну то есть вот я вижу, что с этого IP было 39 авторизаций. Блокировать людей нельзя, это как бы не правильно, адекватным решением было бы сбросить им пароль и не пускать на форум пока они его не изменят.
  3. Всем привет! Вопрос к знатокам. На форуме постоянно появляется спам от аккаунтов зарегистрированных людьми. Я точно уверен, что аккаунт зарегистрирован человеком. Я вижу, что он проявлял активность на форуме. Но потом с его аккаунта начался спам. И таких случаев много. Я захожу в историю IP пользователя и вижу, что он регистрировался с одного IP, но спам шел с другого IP. История авторизаций этого IP подтверждает мою теорию. Вероятно взлом, но этих аккаунтов множество. Что делать в такой ситуации? И тут вопрос логический. Это взлом почты пользователя или взлом именно аккаунта пользователя на форуме. И как от этого защитится..
  4. В общем приходится в функции mergeAndSend заменять содержимое переменной $htmlContent. Решение очень корявое, но я не знаток IPS. Нашел - написал костыль
  5. Пока нашел окончательный вид сообщения в этом файле /forum/system/Email/Email.php, функция /** * Merge and Send * * @param array $recipients Array where the keys are the email addresses to send to and the values are an array of variables to replace * @param mixed $fromEmail The email address to send from. If NULL, default setting is used. NOTE: This should always be a site-controlled domin. Some services like Sparkpost require the domain to be validated. * @param mixed $fromName The name the email should appear from. If NULL, default setting is used * @param array $additionalHeaders Additional headers to send. Merge tags can be used like in content. * @param \IPS\Lang $language The language the email content should be in * @return int Number of successful sends */ public function mergeAndSend( $recipients, $fromEmail = NULL, $fromName = NULL, $additionalHeaders = array(), \IPS\Lang $language ) { $return = 0; /* Get the current locale, and then set the language's locale so datetime formatting in templates is correct for this language */ $currentLocale = setlocale( LC_ALL, '0' ); $language->setLocale(); foreach ( $recipients as $address => $vars ) { $member = \IPS\Member::load( $address, 'email' ); $subject = $this->compileSubject( $member, $language ); $htmlContent = $this->compileContent( 'html', $member, $language ); $plaintextContent = $this->compileContent( 'plaintext', $member, $language ); $_additionalHeaders = $additionalHeaders; foreach ( $vars as $k => $v ) { $language->parseEmail( $v ); $htmlContent = str_replace( "*|{$k}|*", $v, $htmlContent ); $plaintextContent = str_replace( "*|{$k}|*", $v, $plaintextContent ); $subject = str_replace( "*|{$k}|*", $v, $subject ); foreach ( $_additionalHeaders as $headerKey => $headerValue ) { $_additionalHeaders[ $headerKey ] = str_replace( "*|{$k}|*", $v, $headerValue ); } } if ( static::buildFromContent( $subject, $htmlContent, $plaintextContent, $this->type, FALSE )->send( $address, array(), array(), $fromEmail, $fromName, $_additionalHeaders ) ) { $return++; } } /* Now restore the locale we started with */ \IPS\Lang::restoreLocale( $currentLocale ); return $return; } Но пока еще не разобрался как формируется $htmlContent, в каком месте берется само сообщение.
  6. Я создал тему в которой написал сообщение "wwwwwwwwwww". Потом я ответил в этой же теме, так же написал сообщение "wwwwwwwwwww". /system/Notification/Notification.php /** * Send emails * * @param array $emails Emails to send * @param array $emailRecipients Email recipients * @return void */ protected function sendEmails( $emails, $emailRecipients ) { //Лог $text = print_r($emails,true); $text = date("d.m.Y H:i:s").' '.$_SERVER['REMOTE_ADDR'].' '.$text.PHP_EOL.PHP_EOL; if (!file_exists($_SERVER['DOCUMENT_ROOT']."/forum/error/")) { mkdir($_SERVER['DOCUMENT_ROOT']."/forum/error/", 0777, true); } file_put_contents($_SERVER['DOCUMENT_ROOT']."/forum/error/logs.txt", $text, FILE_APPEND); foreach ( $emails as $languageId => $email ) { if ( !empty( $emailRecipients[ $languageId ] ) ) { $email->mergeAndSend( $emailRecipients[ $languageId ], NULL, NULL, array(), \IPS\Lang::load( $languageId ) ); } } } Содержимое файлов в случае ответа в топике и в случае создания нового топика отличаются. В случае ответа - файл Reply, видно отправляемое сообщение "wwwwwwwwwww" [_data:protected] => Array ( [topic_id] => 2923 [post_date] => 1636395890 [author_id] => 1 [author_name] => Nalik [post] => <p> wwwwwwwwwww </p> [ip_address] => **.**.**.** [new_topic] => 0 [queued] => 0 [post_bwoptions] => 0 [pid] => 18704 [append_edit] => 0 [edit_time] => [edit_name] => [post_key] => 0 [post_htmlstate] => 0 [post_edit_reason] => [pdelete_time] => 0 [post_field_int] => 0 [post_field_t1] => [post_field_t2] => [nbpinned] => 0 ) В случае создания топика - файл NewTopic нет информации об отправляемом сообщении. NewTopic.txt Reply.txt Возможно при создании топика текст сообщения подставляется из какого-то другого файла?
  7. Respected вопрос немного другой. Мне нужно узнать где генерируется отправка уведомлений на Email при создании топика Наверное зря я в целом завел речь о плагине. Задача в том, чтобы найти файл и функцию из которой отправляется уведомление при создании нового контента)
  8. На разные условия, во вложении скрин В сообщении можно скрывать часть текста в блок и ставить условия видимости. Скрытый блок оборачивается в <div class="hideContent"></div> При отправки уведомлений на почту я проверяю наличие текста hideContent и заменяю сообщение Как уже сказал, проблема в том, что при создании нового топика я не пойму откуда берется сообщение. Я отдебажил весь файл /forum/system/Notification/Notification.php и вижу, что уведомления формируются в функции public function send( $sentTo = array() ) и отправляются через функцию protected function sendEmails( $emails, $emailRecipients ) Данные об отправляемом сообщении находятся в переменной $emails И когда я отвечаю в топике, то вижу в этой переменной текст сообщения. Но когда я создаю топик, текста сообщения в этой переменной нет, хотя есть название топика. В общем я не могу найти место откуда берется сообщение при создании топика. Respected Собственно вот уведомления которые приходят на почту: При создании нового топика. При написание сообщения в уже созданном топике.
  9. Здравствуйте. Установлен плагин Hide with conditions, допиленный на разные условия. Суть в том, что он скрывает сообщение и показывает его только при определенных условиях, например если наступила определенная дата или если у пользователя больше N сообщений и т.д. Проблема начинается когда пользователю подписанному на тебя приходит уведомления на почту с содержимым скрытого сообщения. И соответственно сообщение видно. Хотя должно быть скрыто. Я нашел файл из которого отправляется уведомление о создании нового сообщения /forum/system/Notification/Notification.php И допилил его следующим образом (Все скрытые сообщения содержат класс hideContent) и если этот текст найден в сообщении вместо него показывается текст, что сообщение скрыто. //Скрыть содержимое хайда if(stripos($this->emailParams[0]->post, 'hideContent') !== false) $this->emailParams[0]->post = '<p style="font-style: italic; color: gray; ">'.($language == 2 ? 'Посетите сайт, чтобы прочитать скрытый текст.' : 'Visit the site to read the hidden text.').'</p>'; Теперь когда я в теме оставлю сообщение под хайдом все ок, на почту приходит уведомление о том, что сообщение скрыто. Но когда я создаю новую тему с сообщением под хайдом, то пользователю приходит сообщение снова открытое. Можете подсказать в каком месте идет отправка уведомлений при создании новой темы?
  10. Как получить дату регистрации в Unix формате? Пробовал так, но возвращает не ту дату, которая находится в БД таблицы core_members strtotime($member->joined->format( 'd.m.Y H:i:s' )) strtotime($member->joined)
  11. Desti Вы предлагаете это сделать в менеджере меню? Не вижу где бы там можно было прописать код.
  12. Можно ли как-то в коде сделать отправку сообщения от имени указанного пользователя (например конкретного администратора или модератора) адресованное указанному пользователю? Сейчас я это делаю прямым редактированием БД, но возможно есть более простой код которого я не знаю? Что-то вроде $IPS->sendMessage('userID','subject','message'); Кстати ранее я поднимал эту тему, но не получил ответа
  13. Здравствуйте, кто знает как можно сделать разные пункты меню в зависимости от языка форума пользователя? Ну то есть выбрано у пользователя отображение форума на русском языке, значит у него видны одни пункты меню, а если выбран английский язык, то уже другие пункты меню. Просто я хочу предлагать русским пользователям переходить по одним ссылкам в меню, а иностранным по другим.
  14. Сделал проверку находится ли в первом или последнем сообщении скрытый контент и в соответствии с этим либо запрещаю превью, либо разрешаю)
  15. siv1987 ага уже нашел, спасибо)
  16. Здравствуйте. На форуме установлен плагин скрытия контента Hide with conditions 1.0.0, в нем есть баг. Если скрыть контент в первом сообщение топика, то в самой теме контент скрыт. Но если перейти к списку тем и навести на наименование темы курсор мышки и подержать 1.5 секунды, то для темы вылезет всплывающее окошко с содержимым темы в котором скрытый контент уже перестанет быть скрытым. Подскажите пожалуйста как отключить превью для тем? Как вариант можно вырезать из шаблона темы (forums->front->forums->topicRow) код отвечающий за превью. Но это не решит самой проблемы, так как в браузере в редакторе исходного кода их можно вставить в ручную и посмотреть превью темы) <a href='{$row->url()}' class='' title='{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}{lang="content_deleted"}{{endif}} {{if $row->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $row->tableHoverUrl and $row->canView()}} data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5'{{endif}}{{if $row->canEdit()}} data-role="editableTitle"{{endif}}> //Вырезать эти строки data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5' В общем как отключить полностью превью для тем, на уровне системы?
  17. siv1987 спасибо что дали направление поиска проблемы, это решило её правильным образом) В файле profile.php в функции content() добавил проверку на количество контента пользователя, в случае если он равен 0, то не делать редирект. У меня это находилось в 506 строке. Код ниже, доработка помечена комментарием //Доработка /* Build Output */ if ( !$currentType ) { $query = \IPS\Content\Search\Query::init()->filterByAuthor( $this->member )->setOrder( \IPS\Content\Search\Query::ORDER_NEWEST_UPDATED )->setPage( $page ); $results = $query->search(); /* If we requested a higher page than is allowed, redirect back to last page */ $totalResults = $results->count( TRUE ); if( ceil( $totalResults / $query->resultsToGet ) < $page ) { if($this->member->member_posts != 0) //Доработка { $highestPage = floor( $totalResults / $query->resultsToGet ); \IPS\Output::i()->redirect( \IPS\Request::i()->url()->setQueryString( 'page', $highestPage ?: 1 ), NULL, 303 ); } } $pagination = trim( \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination( $this->member->url()->setQueryString( array( 'do' => 'content', 'all_activity' => 1 ) ), ceil( $results->count( TRUE ) / $query->resultsToGet ), $page, $query->resultsToGet ) ); if ( \IPS\Request::i()->isAjax() AND \IPS\Request::i()->all_activity ) { \IPS\Output::i()->json( array( 'rows' => \IPS\Theme::i()->getTemplate('profile')->userContentStream( $this->member, $results, $pagination ) ) ); return; } else { $output = \IPS\Theme::i()->getTemplate('profile')->userContentStream( $this->member, $results, $pagination ); } } Упростил код. 504 строка if( ceil( $totalResults / $query->resultsToGet ) < $page && $this->member->member_posts != 0) { $highestPage = floor( $totalResults / $query->resultsToGet ); \IPS\Output::i()->redirect( \IPS\Request::i()->url()->setQueryString( 'page', $highestPage ?: 1 ), NULL, 303 ); } Хотя пожалуй лучше будет даже так && $this->member->member_posts > 0
  18. Увы не придумал ничего лучше размещения этого скрипта в index.php в самом верху. if(strpos($_SERVER['REQUEST_URI'], '/content/')) { ob_start(); require_once 'init.php'; $urlID = explode('-', explode("/", $_SERVER['REQUEST_URI'])[3])[0]; $profile_IPS = \IPS\Member::load( $urlID ); if($profile_IPS->member_posts <= 0) { $urlGo = 'https://site.ru/forum/profile/'.$profile_IPS->member_id.'-q/'; header('Location: '.$urlGo); ob_flush(); exit; } } Если находимся на странице содержащей в URL текст /content/, то смотрим существует ли у пользователя хоть 1 сообщение, если их нет то выполняем редирект на его профиль. Вот такой некрасивый костыль. Возможно кому-то пригодиться или кто-то предложит решение лучше.
  19. Ryo я находил, выкладывали не плагин, а скрипт который на прямую с БД работает и он для моей версии IPS некорректно работает) В общем задачу я решил указанным выше способом, спасибо)
  20. Придется дописывать код $post = \IPS\forums\Topic\Post::load($topic->topic_firstpost); $post->post_date = 1523375996; $post->save();
  21. WaNted я делал это через скобки😀 Спасибо!) WaNted жалко, что связный пост все равно не меняет времени публикации.
  22. siv1987 это поля таблицы mysql "forums_topics", там нужно будет тогда еще менять значение поля "post_date" в таблице "forums_posts" и значение полей "index_date_created" и "index_date_updated" в таблице "core_search_index". Конечно можно это напрямую в БД делать, но нет ли кода который позволит это сделать от самого IPS? Ну что-то типа $topic = \IPS\forums\Topic::load($ID); $topic->start_date(1554910672); //1554910672 - unix time
  23. siv1987 теперь понял, спасибо)
  24. $topic = \IPS\forums\Topic::load($ID); $topic->unhide(FALSE); Таким кодом можно открыть скрытую тему. А как изменить время создания топика? Ну естественно со всеми вытекающими. То есть изменяем время создания топика и соответственно время первого сообщения топика.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.