Adaptive Hide BBCodes + Reputation System (обновлено)

Поддержка старых модов или модов, созданных авторами не из нашего сообщества, а также любые вопросы, связанные с модами для phpBB 3.0.x, кроме относящихся к форуму Для авторов (phpBB 3.0.x).
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение alaon »

Доброго дня. На моём форуме установлены 2 этих мода. После того, как я установил мод Reputation System, встала задача доработать мод Adaptive Hide BBCodes так, чтобы он позволял скрывать текст в сообщениях в зависимости от величины репутации пользователя. Нужен дополнительный BB-код, например, [rhide], который пользователи будут указывать в сообщениях, текст которых пожелают закрыть. Также был нужен бб-код для сокрытия текста от глаз всех участников, кроме тех, кто перечислен. И хотя кто-то говорил, что это абсурд, однако это бывает крайне нужно и удобно. Например, мои пользователи кладут ценную информацию по игровым багам под хайд по критерию репутации и сообщений, но для определённого числа пользователей, кому далеко до выполнения требований хайда, но хорошо себя зарекомендовали, выдают так называемый "личный" хайд. Так им удобнее. Ну, да ладно. Приступим.

1. В файле posting.php после строки

Код: Выделить всё

$hide_search_ary[] = '!\[ghide:' . $post_data['bbcode_uid'] . '\](.*?)\[/ghide:' . $post_data['bbcode_uid'] . '\]!s';
добавил

Код: Выделить всё

$hide_search_ary[] = '!\[rhide\=([a-zA-Z0-9-+.,_ ]+):' . $post_data['bbcode_uid'] . '\](.*?)\[/rhide:' . $post_data['bbcode_uid'] . '\]!s';
$hide_search_ary[] = '!\[rhide:' . $post_data['bbcode_uid'] . '\](.*?)\[/rhide:' . $post_data['bbcode_uid'] . '\]!s';
2. В файле includes/bbcode.php ищем строку

Код: Выделить всё

}
// end Adaptive Hide BBcodes MOD
и перед ней добавляем

Код: Выделить всё

// Addon by me

// Выполняется, если добавлен тег [rhide], то есть, виден только группе-по-умолчанию АВТОРА сообщения              
if (substr_count($preg['search'][0], '[rhide') && !$auth->acl_get('m_edit', $row['forum_id']) && $user->data['user_id'] != $poster_id)
{
  if (substr_count($preg['search'][0], '[rhide:') && ($user->data['user_id'] == ANONYMOUS || $user->data['is_bot'] == 1))
  {
    $hide_cause = sprintf($user->lang('ADAPT_HIDE_GUEST_REPUTATION'), '1');
    $message = preg_replace($preg['search'], array(0 => '[rhide:' . $this->bbcode_uid . ']' . $hide_cause . '[/rhide:' . $this->bbcode_uid . ']'), $message);
  }
  
  // Тег [rhide=] найден
  if (substr_count($preg['search'][0], '[rhide\=') && !$auth->acl_get('m_edit', $row['forum_id']) && $user->data['user_id'] != $poster_id)
  {	            	    
    // Получаем список групп, в которых состоит пользователь
    $sql = 'SELECT group_id 
      FROM ' . USER_GROUP_TABLE . ' 
      WHERE user_id = ' . (int)$user->data['user_id'] . ' 
      AND user_pending = 0';
    $result = $db->sql_query($sql);
    $poster_groups = array();
    while ($sql_row = $db->sql_fetchrow($result))
    {
      $poster_groups[] = $sql_row['group_id'];
    }
    $db->sql_freeresult($result);
    $ignore_groups = explode(',', ADAPT_HIDE_IGNORE_LIMIT_GROUPS);
    $ignore_limit = false;
    foreach ($poster_groups as $poster_group)
    {
      if (in_array($poster_group, $ignore_groups))
      {
        $ignore_limit = true;
        break;
      }
    }
    
    // Получаем текущие очки репутации пользователя
    $sql = 'SELECT user_reputation 
      FROM ' . USERS_TABLE . ' 
      WHERE user_id = ' . (int)$user->data['user_id'];
    $result = $db->sql_query($sql);
    $sql_row = $db->sql_fetchrow($result);
    $db->sql_freeresult($result);
    $user_reputation = $sql_row['user_reputation'];
    $hide_matches = array();
    preg_match_all($preg['search'][0], $message, $hide_matches);
    
    // Действуем
    foreach ($hide_matches[1] as $key => $rep_points)
    {
      if (!$ignore_limit)
      {
        $rep_points = min($rep_points, ADAPT_HIDE_LIMIT_POSTS, $user_reputation);
      }
      $hide_cause = false;
      if ($user->data['user_id'] == ANONYMOUS || $user->data['is_bot'] == 1)
      {
        if ($rep_points == 0)
        {
          $hide_cause = $user->lang('ADAPT_HIDE_GUEST_REPUTATION');
        }
        else
        {
          $hide_cause = sprintf($user->lang('ADAPT_HIDE_GUEST_REPUTATION'), $rep_points);
        }
      }
      elseif ($user->data['user_reputation'] < $rep_points)
      {
        $hide_cause = sprintf($user->lang('ADAPT_HIDE_REPUTATION'), $rep_points);
      }
      if ($hide_cause)
      {
        $message = str_replace($hide_matches[0][$key], '[rhide=' . $rep_points . ':' . $this->bbcode_uid . ']' . $hide_cause . '[/rhide:' . $this->bbcode_uid . ']', $message);	
      }
    }
  }
}

// uhide - личный хайд
if (substr_count($preg['search'][0], '[uhide') && !$auth->acl_get('m_edit', $row['forum_id']) && $user->data['user_id'] != $poster_id)
{              
  if (substr_count($preg['search'][0], '[uhide\='))
  {
     $hide_matches = array();
     preg_match_all($preg['search'][0], $message, $hide_matches);
     foreach ($hide_matches[1] as $key => $users)
     {
        $users_ary = explode(',', $users);
        $uhide = true;
        foreach ($users_ary as $username)
        {
           if ($username==$user->data['username'])
           {
              $uhide = false;
              break;
           }
        }
        if ($uhide)
        {
           $tousers = '<em><b>' . preg_replace('/([,.;])(?=\S)/', '$1 ', $users) . '</b></em>';
           $message = str_replace($hide_matches[0][$key], '[uhide=' . $users . ':' . $this->bbcode_uid . ']' . $user->lang('ADAPT_HIDE_USERS') . $tousers . '[/uhide:' . $this->bbcode_uid . ']', $message);
        }
     }
  }
}
// end Addon by me
3. В includes/functions_posting.php после

Код: Выделить всё

$hide_search_ary[] = '!\[ghide\](.*?)\[/ghide\]!s';
добавил

Код: Выделить всё

$hide_search_ary[] = '!\[rhide\=([a-zA-Z0-9-+.,_ ]+)\](.*?)\[/rhide\]!s';
$hide_search_ary[] = '!\[rhide\](.*?)\[/rhide\]!s';
$hide_search_ary[] = '!\[uhide\=([a-zA-Z0-9-+.,_ ]+)\](.*?)\[/uhide\]!s';
4. Аналогично для ucp_pm_compose.php, после

Код: Выделить всё

$hide_search_ary[] = '!\[ghide\](.*?)\[/ghide\]!s';
добавил

Код: Выделить всё

$hide_search_ary[] = '!\[rhide\=([a-zA-Z0-9-+.,_ ]+)\](.*?)\[/rhide\]!s';
$hide_search_ary[] = '!\[rhide\](.*?)\[/rhide\]!s';
$hide_search_ary[] = '!\[uhide\=([a-zA-Z0-9-+.,_ ]+)\](.*?)\[/uhide\]!s';
и после

Код: Выделить всё

$hide_search_ary[] = '!\[ghide:' . $post['bbcode_uid'] . '\](.*?)\[/ghide:' . $post['bbcode_uid'] . '\]!s';
добавил

Код: Выделить всё

$hide_search_ary[] = '!\[rhide\=([a-zA-Z0-9-+.,_ ]+):' . $post['bbcode_uid'] . '\](.*?)\[/rhide:' . $post['bbcode_uid'] . '\]!s';
$hide_search_ary[] = '!\[rhide:' . $post['bbcode_uid'] . '\](.*?)\[/rhide:' . $post['bbcode_uid'] . '\]!s';
$hide_search_ary[] = '!\[uhide\=([a-zA-Z0-9-+.,_ ]+):' . $post['bbcode_uid'] . '\](.*?)\[/uhide:' . $post['bbcode_uid'] . '\]!s';
5. В файле adaptive_hide_bbcodes.php, после

Код: Выделить всё

'ADAPT_HIDE_QUOTE'			=>	'[i]Скрытый текст[/i]',
добавил

Код: Выделить всё

'ADAPT_HIDE_GUEST_REPUTATION'	=>	'<i>Скрытый текст. Нужно быть зарегистрированным и иметь %d репутации.</i>',
'ADAPT_HIDE_REPUTATION' =>	'<i>Скрытый текст. Нужно иметь %d репутации.</i>',
'ADAPT_HIDE_USERS'         =>   '<i>Скрытый текст. Доступен только пользователям с никами </i>'
6. Добавил в админке 3 новых BB-кода:
Использование BBCode - [rhide]{TEXT}[/rhide]
Замена HTML - <div class="adapthide">{TEXT}</div>
Подсказка - Скрытый текст: [rhide]текст[/rhide] (скрытие от гостей и пользователей с репутацией меньше 1) или [rhide=]текст[/rhide] (скрытие по количеству репутации)
Показывать на странице ответа - Да (поставить галочку)

Использование BBCode - [rhide={NUMBER}]{TEXT}[/rhide]
Замена HTML - <div class="adapthide">{TEXT}</div>
Показывать на странице ответа - Нет

Использование BBCode - [uhide]{TEXT}[/uhide]
Замена HTML - <div class="adapthide">{TEXT}</div>
Подсказка - Скрытый текст: [uhide=ник1,ник2...]текст[/uhide] (скрытие от всех пользователей, кроме тех, чьи ники указаны через запятую)
Показывать на странице ответа - Да (поставить галочку)
Итог - скрытие по критериям работает, глюков не замечено, да и не должно глючить. Меня интересует только один момент - каково, при данном коде, будет скрытие от ботов? Также, прошу знающих просмотреть код на предмет "всё ли в порядке". Поскольку код является фактически копипастой из этого же мода, то я мог не учесть чего-нибудь важного - данный фикс для меня первый в области phpbb. Заранее спасибо за любые подсказки.

Версия мода Adaptive Hide BBcodes - 1.0.1

Уточнение: пользователь sweetah напомнил, что способ скрытия по никам может быть проигнорирован, если на форуме включена опция смены ника пользователем. Лично у меня она всегда выключена, как и установлено по умолчанию, но если вы считаете необходимым дать пользователям такую возможность, то следует использовать вариант хайда по ID пользователя, как описано здесь, либо в дополнение к моим правкам добавить также строчки по приведённой ссылке, но с соответствующими правками (например, вместо uhide использовать uidhide) - пусть будут, но включать бб-коды в зависимости от текущих настроек конференции.
Последний раз редактировалось alaon 13.01.2015 19:47, всего редактировалось 1 раз.
pereval103
phpBB 1.0.0
Сообщения: 4
Стаж: 11 лет 9 месяцев

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение pereval103 »

Подскажи какой именно мод Reputation System (обновлено)
стоит у вас или нужен для репутации как вы сделали.
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение alaon »

pereval103 писал(а):какой именно мод Reputation System
Если б я помнил ) Копирайты пришлось грохнуть из-за внешних ссылок, так что не знаю точно, но это тот мод, который использует AJAX (остальные его не используют). Зайди ко мне да посмотри.
pereval103
phpBB 1.0.0
Сообщения: 4
Стаж: 11 лет 9 месяцев

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение pereval103 »

че так и не кто и не подскажит как сделать хайд на репутацию
Anvar
Former team member
Сообщения: 1964
Стаж: 16 лет 5 месяцев
Благодарил (а): 67 раз
Поблагодарили: 800 раз

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение Anvar »

pereval103, А первый пост разве не его описывает?
pereval103
phpBB 1.0.0
Сообщения: 4
Стаж: 11 лет 9 месяцев

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение pereval103 »

описывает,, тогда попросту встает второй ком блином какой именно мод Reputation System он ставил из много и без знаний методом тыка это не реально
Аватара пользователя
Пчелкин
phpBB 3.3.0
Сообщения: 11361
Стаж: 16 лет 8 месяцев
Благодарил (а): 1832 раза
Поблагодарили: 1358 раз

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение Пчелкин »

А запятые и заглавные?
Ну тогда и мне плевать на тебя и ничего подсказывать не буду.
NIKON-D90, AF-S 18-105, AF-S 14-24, AF-S 24-70
pereval103
phpBB 1.0.0
Сообщения: 4
Стаж: 11 лет 9 месяцев

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение pereval103 »

Пчелкин писал(а):А запятые и заглавные?
Ну тогда и мне плевать на тебя и ничего подсказывать не буду.
ну вообщето я не кого не оскорблял, а просил помощи.
нужен именно хайд на репутацию.

Добавлено спустя 1 минуту 16 секунд:
Пчелкин писал(а):А запятые и заглавные?
Ну тогда и мне плевать на тебя и ничего подсказывать не буду
Пчелкин а ты сам пишишь моды
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 14 лет 4 месяца
Благодарил (а): 152 раза
Поблагодарили: 215 раз
Забанен: Бессрочно

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение xisp »

pereval103 писал(а):ну вообщето я не кого не оскорблял,
Плохая орфография и пунктуация раздражают.
phpBBex
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение alaon »

Догадался глянуть в файлы на сервере. В одном из них написано так:
* @package Reputation System
* @author Pico88 (https://github.com/Pico88)
* @copyright (c) 2013
Так что вперёд, на гитхаб.

Добавлено спустя 4 минуты 5 секунд:
pereval103 писал(а):какой именно мод Reputation System он ставил из много
Ну, их всего два, на самом деле. А вообще, я тут подумал, что не имеет значения совершенно, какой именно мод у тебя установлен. Можешь установить любой, хоть мод на медальки. Вся логика бб-кода на репутацию заключается в куске:

Код: Выделить всё

$sql = 'SELECT user_reputation 
      FROM ' . USERS_TABLE . ' 
      WHERE user_id = ' . (int)$user->data['user_id'];
    $result = $db->sql_query($sql);
    $sql_row = $db->sql_fetchrow($result);
    $db->sql_freeresult($result);
    $user_reputation = $sql_row['user_reputation'];
    $hide_matches = array();
    preg_match_all($preg['search'][0], $message, $hide_matches);
Соответственно, отсюда и пляши. Скорректируй запрос под свои нужды и делай хайды хоть по возрасту собаки в профиле.

Добавлено спустя 1 минуту 55 секунд:
Ах, да. Я там где-то ещё косякнул, в коде и совершенно случайно нашёл ошибку. Плюс пара оптимизаций сделана. Как появится лишнее время, обязательно отредактирую пост с учётом изменений.
alaon
phpBB 1.4.3
Сообщения: 83
Стаж: 13 лет 2 месяца
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Adaptive Hide BBCodes + Reputation System (обновлено)

Сообщение alaon »

Здравствуйте. Поднимаю тему, так как нужна помощь. У меня пользователи с кириллическими никами, на них хайд по нику не ставится. Я допилил регулярки из posting.php и includes/functions_posting.php, в соответствии со своими представлениями, так:

Код: Выделить всё

$hide_search_ary[] = '!\[uhide\=([a-zA-Zа-яА-ЯёЁ0-9-+.,_ ]+):' . $post_data['bbcode_uid'] . '\](.*?)\[/uhide:' . $post_data['bbcode_uid'] . '\]!su';
$hide_search_ary[] = '!\[mhide\=([a-zA-Zа-яА-ЯёЁ0-9-+.,_ ]+):' . $post_data['bbcode_uid'] . '\](.*?)\[/mhide:' . $post_data['bbcode_uid'] . '\]!su';

Код: Выделить всё

$hide_search_ary[] = '!\[uhide\=([a-zA-Zа-яА-ЯёЁ0-9-+.,_ ]+)\](.*?)\[/uhide\]!su';
$hide_search_ary[] = '!\[mhide\=([a-zA-Zа-яА-ЯёЁ0-9-+.,_ ]+)\](.*?)\[/mhide\]!su';
Но это не работает. Тег, записанный с кириллицей всё так же не распознаётся. Что я сделал не так или сделал не до конца?

Вернуться в «Поддержка модов для phpBB 3.0.x»