--выполнить запросы (ВНИМАНИЕ! если установлен аддон /me то первый запрос выполнять не нужно)

ALTER TABLE `bb_chat` ADD `type` tinyint(1) DEFAULT '0';

INSERT INTO `bb_config` (`config_name`, `config_value`) VALUES
('quiz', '1'),
('quiz_reward', '100');

INSERT INTO `bb_cron` (`cron_id`, `cron_active`, `cron_title`, `cron_script`, `schedule`, `run_day`, `run_time`, `run_order`, `last_run`, `next_run`, `run_interval`, `log_enabled`, `log_file`, `log_sql_queries`, `disable_board`, `run_counter`) VALUES
('', 1, 'Викторина для чата', 'chat_quiz.php', 'hourly', '', '00:00:00', 255, '0000-00-00 00:00:00', '0000-00-00 00:00:00', '00:00:00', 0, '', 0, 0, 0);

--открыть admin_board.php и найти

'SEED_BONUS_USER_REGDATE' => $new['seed_bonus_user_regdate'],

--после вставить

'QUIZ'                    => $new['quiz'],
'QUIZ_REWARD'             => $new['quiz_reward'],

--admin_board.tpl найти

<tr class="row3 med"><td colspan="2"></td></tr>

--заменить на

<tr class="row3 med"><td class="bold tCenter" colspan="2">Настройки викторины в чате</td></tr>
<tr>
	<td><h4>Включить викторину?</h4></td>
	<td>
		<label><input type="radio" name="quiz" value="1" <!-- IF QUIZ -->checked="checked"<!-- ENDIF --> />{L_YES}</label>&nbsp;&nbsp;
		<label><input type="radio" name="quiz" value="0" <!-- IF not QUIZ -->checked="checked"<!-- ENDIF --> />{L_NO}</label>
	</td>
</tr>
<tr>
	<td><h4>Вознаграждение за правильный ответ</h4></td>
	<td><input class="post" type="text" size="25" maxlength="100" name="quiz_reward" value="{QUIZ_REWARD}" /></td>
</tr>
<tr class="row3 med"><td colspan="2"></td></tr>

--открыть chat.php

--если установлен аддон /me то просто найдите

case 'me':
            $txt = $username.' '.$command[0][2];

            return $txt;

            break;

--замените на

case 'me':
            $txt = $username.' '.$command[0][2];

            return ['type' => 1,'txt' => $txt];

            break;

        case 'a':
            $txt = $username.' отвечает на вопрос викторины: '.$command[0][2];

            return ['type' => 2, 'txt' => $txt];
            break;

--найти

$commands = commands_to_text($message, $userdata['user_id']);
if($commands)
{
    $text_html = $commands;
	$query = "INSERT INTO bb_chat (user_id, time, text, text_html, ip, type) VALUES ('{$userdata['user_id']}', '". TIMENOW ."', '". DB()->escape($message) ."', '". DB()->escape($text_html) ."', '". USER_IP ."', '1')";
}
else
{
	$text_html = bbcode2html(prepare_message($message));
	$text_html = preg_replace_callback("/\[n\](.*?)\[\/n\]/siu", 'parse_username', $text_html);
	$query = "INSERT INTO bb_chat (user_id, time, text, text_html, ip) VALUES ('{$userdata['user_id']}', '". TIMENOW ."', '". DB()->escape($message) ."', '". DB()->escape($text_html) ."', '". USER_IP ."')";
}

DB()->query($query);

--заменить

$commands = commands_to_text($message, $userdata['user_id']);
if(!empty($commands['txt']))
{
        $text_html = $commands['txt'];
        $query = "INSERT INTO bb_chat (user_id, time, text, text_html, ip, type) VALUES ('{$userdata['user_id']}', '". TIMENOW ."', '".DB()->escape($message)."', '". DB()->escape($text_html) ."', '". USER_IP ."', '". $commands['type'] ."')";
}
else
{
    $text_html = bbcode2html(prepare_message($message));
    $text_html = preg_replace_callback("/\[n\](.*?)\[\/n\]/siu", 'parse_username', $text_html);
    $query = "INSERT INTO bb_chat (user_id, time, text, text_html, ip) VALUES ('{$userdata['user_id']}', '". TIMENOW ."', '". DB()->escape($message) ."', '". DB()->escape($text_html) ."', '". USER_IP ."')";
}

DB()->query($query);

--найти

$commands = commands_to_text($text, $row['user_id']);
if ($commands) {
    $text_html = $commands;
} else {
    $text_html = bbcode2html(prepare_message($text));
    $text_html = preg_replace_callback("/\[n\](.*?)\[\/n\]/siu", 'parse_username', $text_html);
}

--заменить

$commands = commands_to_text($text, $row['user_id']);
if ($commands['txt']) {
    $text_html = $commands['txt'];
} else {
    $text_html = bbcode2html(prepare_message($text));
    $text_html = preg_replace_callback("/\[n\](.*?)\[\/n\]/siu", 'parse_username', $text_html);
}

ЕСЛИ НЕ УСТАНОВЛЕН АДДОН /me, то выполните следующие действия:

--открываем index.php и находим:

foreach($sql as $row)
{
	
	$message = '<div class="row1 chat-comment" id="pp_'. $row['id'] .'"><div style="min-height: 32px;">';
	$message .= ($row['user_id'] == GUEST_UID) ? '' : '<a href="'. PROFILE_URL . $row['user_id'] .'">';
	$message .= str_replace('<img', '<img align="left" height="32" width="32" style="padding-right: 3px;"', get_avatar($row['user_id'], $row['avatar_ext_id'], !bf($row['user_opt'], 'user_opt', 'dis_avatar')));
	$message .= ($row['user_id'] == GUEST_UID) ? '' : '</a>';
	if(IS_AM)
	{
		$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
		$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
	}
	$title_ip = (IS_ADMIN) ? decode_ip($row['ip']) : 'Ник в чат';
	$message .= '<a href="#" class="bold" title="'. $title_ip .'" onclick="add_nick(\'[n]'. $row['username'] .'[/n]\'); return false;">'. str_replace('title="', 'data="', profile_url(array('username' => $row['username'], 'user_rank' => $row['user_rank']))) .'</a><div class="small">'. bb_date($row['time']) .'</div></div>';
	$message .= '<div class="spacer_2"></div><span style="font-size: 11px;">'. $row['text_html'] .'</span></div>';
	$message .= (IS_AM) ? '<span id="pe_'. $row['id'] .'"></span>' : '';

    $template->assign_block_vars('chat', array(
        'TEXT'        => $message,
    ));
}

--заменяем на:

foreach($sql as $row)
    {
		if($row['type'] == 1)
		{
			$message = '<div class="row1 chat-comment" id="pp_'. $row['id'] .'"><div style="min-height: 32px; font-size: 11px;">';
			$message .= bb_date($row['time']);
			if(IS_AM)
			{
				$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
				$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
			}
			$message .= '</div>';
			$message .= '<span style="font-size: 11px;">'. $row['text_html'] .'</span></div>';
			$message .= (IS_AM) ? '<span id="pe_'. $row['id'] .'"></span>' : '';
		}
		else
		{
			$message = '<div class="row1 chat-comment" id="pp_'. $row['id'] .'"><div style="min-height: 32px;">';
			$message .= ($row['user_id'] == GUEST_UID) ? '' : '<a href="'. PROFILE_URL . $row['user_id'] .'">';
			$message .= str_replace('<img', '<img align="left" height="32" width="32" style="padding-right: 3px;"', get_avatar($row['user_id'], $row['avatar_ext_id'], !bf($row['user_opt'], 'user_opt', 'dis_avatar')));
			$message .= ($row['user_id'] == GUEST_UID) ? '' : '</a>';
			if(IS_AM)
			{
				$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
				$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
			}
			$title_ip = (IS_ADMIN) ? decode_ip($row['ip']) : 'Ник в чат';
			$message .= '<a href="#" class="bold" title="'. $title_ip .'" onclick="add_nick(\'[n]'. $row['username'] .'[/n]\'); return false;">'. str_replace('title="', 'data="', profile_url(array('username' => $row['username'], 'user_rank' => $row['user_rank']))) .'</a><div class="small">'. bb_date($row['time']) .'</div></div>';
			$message .= '<div class="spacer_2"></div><span style="font-size: 11px;">'. $row['text_html'] .'</span></div>';
			$message .= (IS_AM) ? '<span id="pe_'. $row['id'] .'"></span>' : '';
		}

        $template->assign_block_vars('chat', array(
            'TEXT'        => $message,
        ));
    }
	
--открываем chat.php и находим:

function parse_username($username)
{
	$username = $username[1];
	$row = DB()->fetch_row("SELECT user_id, user_rank FROM ". BB_USERS ." WHERE username = '". DB()->escape($username) ."'");
	if($row) $username = '<a href="'. PROFILE_URL . $row['user_id'] .'">'. $username .'</a>';
	return $username;
}

--после вставляем:

function commands_to_text($message, $user_id)
{
	$username = $txt = '';

	$row = DB()->fetch_row("SELECT username, user_rank, user_id FROM ". BB_USERS ." WHERE user_id = '". DB()->escape($user_id) ."'");
	if($row) $username = '<a href="'. PROFILE_URL . $row['user_id'] .'">'. $row['username'].'</a>';

	preg_match_all('#\/(.*?) ([\S].*)#', $message, $command, PREG_SET_ORDER);

	switch(@$command[0][1])
	{
		case 'me':
            $txt = $username.' '.$command[0][2];

            return ['type' => 1,'txt' => $txt];

            break;

        case 'a':
            $txt = $username.' отвечает на вопрос викторины: '.$command[0][2];

            return ['type' => 2, 'txt' => $txt];
            break;

		default:
			return false;

	}

}

--находим:

foreach($sql as $row)
{
	if(($row['id'] > $id) && ($row['id'] <= $max_id))
	{
		
		$message .= '<div class="row1 chat-comment" id="pp_'. $row['id'] .'"><div style="min-height: 32px;">';
		$message .= ($row['user_id'] == GUEST_UID) ? '' : '<a href="'. make_url(PROFILE_URL . $row['user_id']) .'">';
		$message .= str_replace('<img', '<img align="left" height="32" width="32" style="padding-right: 3px;"', get_avatar($row['user_id'], $row['avatar_ext_id'], !bf($row['user_opt'], 'user_opt', 'dis_avatar')));
		$message .= ($row['user_id'] == GUEST_UID) ? '' : '</a>';
		if(IS_AM)
		{
			$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
			$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
		}
		$title_ip = (IS_ADMIN) ? decode_ip($row['ip']) : 'Ник в чат';
		$message .= '<a href="#" class="bold" title="'. $title_ip .'" onclick="add_nick(\'[n]'. $row['username'] .'[/n]\'); return false;">'. str_replace('title="', 'data="', profile_url(array('username' => $row['username'], 'user_rank' => $row['user_rank']))) .'</a><div class="small">'. bb_date($row['time']) .'</div></div>';
        $message .= '<div class="spacer_2"></div><span style="font-size: 11px;">'. $row['text_html'] .'</span></div>';
		$message .= (IS_AM) ? '<span id="pe_'. $row['id'] .'"></span>' : '';
	}
}

--заменяем на:

foreach($sql as $row)
{
	if(($row['id'] > $id) && ($row['id'] <= $max_id))
	{
		if($row['type'] == 1)
		{
			$message .= '<div class="row1 chat-comment" id="pp_'. $row['id'] .'"><div style="min-height: 32px; font-size: 11px;">';
			$message .= bb_date($row['time']);
			if(IS_AM)
			{
				$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
				$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
			}
			$message .= '</div>';
			$message .= '<span style="font-size: 11px;">'. $row['text_html'] .'</span></div>';
			$message .= (IS_AM) ? '<span id="pe_'. $row['id'] .'"></span>' : '';
		}
		else
		{
			$message .= '<div class="row1 chat-comment" id="pp_'. $row['id'] .'"><div style="min-height: 32px;">';
			$message .= ($row['user_id'] == GUEST_UID) ? '' : '<a href="'. make_url(PROFILE_URL . $row['user_id']) .'">';
			$message .= str_replace('<img', '<img align="left" height="32" width="32" style="padding-right: 3px;"', get_avatar($row['user_id'], $row['avatar_ext_id'], !bf($row['user_opt'], 'user_opt', 'dis_avatar')));
			$message .= ($row['user_id'] == GUEST_UID) ? '' : '</a>';
			if(IS_AM)
            {
				$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
				$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
			}
			$title_ip = (IS_ADMIN) ? decode_ip($row['ip']) : 'Ник в чат';
			$message .= '<a href="#" class="bold" title="'. $title_ip .'" onclick="add_nick(\'[n]'. $row['username'] .'[/n]\'); return false;">'. str_replace('title="', 'data="', profile_url(array('username' => $row['username'], 'user_rank' => $row['user_rank']))) .'</a><div class="small">'. bb_date($row['time']) .'</div></div>';
			$message .= '<div class="spacer_2"></div><span style="font-size: 11px;">'. $row['text_html'] .'</span></div>';
		    $message .= (IS_AM) ? '<span id="pe_'. $row['id'] .'"></span>' : '';
		}
	}
}

--находим:

$text_html = bbcode2html(bbcode_chat(prepare_message($message)));
$text_html = preg_replace_callback("/\[n\](.*?)\[\/n\]/siu", 'parse_username', $text_html);

DB()->query("INSERT INTO bb_chat (user_id, time, text, text_html, ip) VALUES ('{$userdata['user_id']}', '". TIMENOW ."', '". DB()->escape($message) ."', '". DB()->escape($text_html) ."', '". USER_IP ."')");

--заменяем на:

$commands = commands_to_text($message, $userdata['user_id']);
if(!empty($commands['txt']))
{
    $text_html = $commands['txt'];
    $query = "INSERT INTO bb_chat (user_id, time, text, text_html, ip, type) VALUES ('{$userdata['user_id']}', '". TIMENOW ."', '". DB()->escape($message) ."', '". DB()->escape($text_html) ."', '". USER_IP ."', '". $commands['type'] ."')";
}
else
{
    $text_html = bbcode2html(prepare_message($message));
    $text_html = preg_replace_callback("/\[n\](.*?)\[\/n\]/siu", 'parse_username', $text_html);
    $query = "INSERT INTO bb_chat (user_id, time, text, text_html, ip) VALUES ('{$userdata['user_id']}', '". TIMENOW ."', '". DB()->escape($message) ."', '". DB()->escape($text_html) ."', '". USER_IP ."')";
}

DB()->query($query);

--находим:

if(mb_strlen($text) > 2)
	{
		$text_html = bbcode2html(bbcode_chat(prepare_message($text)));
		$text_html = preg_replace_callback("/\[n\](.*?)\[\/n\]/siu", 'parse_username', $text_html);

--заменяем на:

if (mb_strlen($text) > 2) {
	$commands = commands_to_text($text, $row['user_id']);
	    if ($commands['txt']) {
			$text_html = $commands['txt'];
		} else {
			$text_html = bbcode2html(prepare_message($text));
			$text_html = preg_replace_callback("/\[n\](.*?)\[\/n\]/siu", 'parse_username', $text_html);
		}

--находим:

else $this->ajax_die('Слишком короткое сообщение.');

$message = '<div style="min-height: 32px;">';
$message .= ($row['user_id'] == GUEST_UID) ? '' : '<a href="'. make_url(PROFILE_URL . $row['user_id']) .'">';
$message .= str_replace('<img', '<img align="left" height="32" width="32" style="padding-right: 3px;"', get_avatar($row['user_id'], $row['avatar_ext_id'], !bf($row['user_opt'], 'user_opt', 'dis_avatar')));
$message .= ($row['user_id'] == GUEST_UID) ? '' : '</a>';
if(IS_AM)
{
	$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
	$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
}
$title_ip = (IS_ADMIN) ? decode_ip($row['ip']) : 'Ник в чат';
$message .= '<a href="#" class="bold" title="'. $title_ip .'" onclick="add_nick(\'[n]'. $row['username'] .'[/n]\'); return false;">'. str_replace('title="', 'data="', profile_url(array('username' => $row['username'], 'user_rank' => $row['user_rank']))) .'</a><div class="small">'. bb_date($row['time']) .'</div></div>';
$message .= '<div class="spacer_2"></div><span style="font-size: 11px;">'. $text_html .'</span>';

--заменяем на:

else $this->ajax_die('Слишком короткое сообщение.');

if ($row['type'] == 1)
{
	$message = '<div style="min-height: 32px; font-size: 11px;">';
	$message .= bb_date($row['time']);
	if(IS_AM)
	{
		$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
		$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
	}
	$message .= '</div>';
	$message .= '<span style="font-size: 11px;">'. $text_html .'</span></div>';
}
else
	{
		$message = '<div style="min-height: 32px;">';
		$message .= ($row['user_id'] == GUEST_UID) ? '' : '<a href="'. make_url(PROFILE_URL . $row['user_id']) .'">';
		$message .= str_replace('<img', '<img align="left" height="32" width="32" style="padding-right: 3px;"', get_avatar($row['user_id'], $row['avatar_ext_id'], !bf($row['user_opt'], 'user_opt', 'dis_avatar')));
		$message .= ($row['user_id'] == GUEST_UID) ? '' : '</a>';
		if(IS_AM)
		{
			$message .= '<input onclick="set_hid_chbox('. $row['id'] .');" class="floatR chat-post" type="checkbox" value="'. $row['id'] .'" />';
			$message .= '<span onclick="edit_comment('. $row['id'] .'); return false;" class="txtb floatR">[p]</span>';
		}
		$title_ip = (IS_ADMIN) ? decode_ip($row['ip']) : 'Ник в чат';
		$message .= '<a href="#" class="bold" title="'. $title_ip .'" onclick="add_nick(\'[n]'. $row['username'] .'[/n]\'); return false;">'. str_replace('title="', 'data="', profile_url(array('username' => $row['username'], 'user_rank' => $row['user_rank']))) .'</a><div class="small">'. bb_date($row['time']) .'</div></div>';
		$message .= '<div class="spacer_2"></div><span style="font-size: 11px;">'. $text_html .'</span>';
	}
	

--открыть main.php и в конец добавить

$lang['QUIZ'] = [
    1 => ['q'=>'Сколько граней у куба?', 'a'=>'6'],
    2 => ['q'=>'Сколько ног у улитки?', 'a'=>'1'],
    3 => ['q'=>'Назовите ближайшую к нам звезду', 'a'=>'солнце'],
    4 => ['q'=>'Сколько у человека основных органов чувств?', 'a'=>'5'],
    5 => ['q'=>'Сколько музыкантов в квинтете?', 'a'=>'5'],
    6 => ['q'=>'Что делает человек всю жизнь, не останавливаясь?', 'a'=>'дышит'],
    7 => ['q'=>'Как зовут администратора?', 'a'=>'admin'],
    8 => ['q'=>'Сколько длилась столетняя война?', 'a'=>'116'],
    9 => ['q'=>'Сколько килобайт в 1 мегабайте?', 'a'=>'1024'],
    10 => ['q'=>'Чей домик оказался крепче всех в сказке "3 поросенка"?', 'a'=>'наф-наф'],
];

файл chat_quiz.php положить в library/includes/cron/jobs/