Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

[BETA] Users Of The Day (another version)

Здесь авторы постили бета-версии своих модификаций для phpBB 2.0.x. Внимание! Не устанавливайте бета-версии модов на работающие форумы!
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 19 лет
Контактная информация:

[BETA] Users Of The Day (another version)

Сообщение quazi »

предлагаю вариацию на тему мода Users Of The Day, который где-то мелкал на этом форуме, но точно есть на офф.сайте

особенности
1. показывает всех пользователей форума за день и текущий час
2. показывает только тех пользователей, которые разрешили себя показывать (опция "Скрывать ваше пребывание на форуме" отключена)
3. админы видят всех пользователей, "скрывающиеся" юзеры отображаются курсивом
4. пребывание админов скрыто от всех пользователей
5. админы видят IP пользователей и их время последнего пребывания на форуме во всплывающей подсказке

возможные минусы
1. видимостью админов не возможно манипулировать (хотя можно настроить)
2. в отличии от аналогов выполняется 2 более структурированных запроса к БД (возможно это недостаток, однако при генерации страниц в среднем на форуме выполняется около 12-17 запросов. но главная страница запрашивается по отношению к другим в соотношении примерно 1:10. то есть лишним запросом можно пренебречь)

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

##############################################################
## MOD Title: Users Of The Day
## MOD Author: quazi < nomail@nospam.com > ( N/A ) N/A
## MOD Description: This modification allows to see users who visited forum at the recent day and last hour (if actual user turn on feature 'View online' in his own profile. In other hand admin see all users always however himself stays invisible. If You want show admins for all users comment the condition marked by line // admin is not visible anywhere
## MOD Version: 1.1.0
##
## Installation Level: Easy
## Installation Time: 5 Minutes
## Files To Edit: (5) includes/functions.php, includes/page_header.php, templates/subSilver/index_body.tpl, language/lang_russian/lang_main.php, language/lang_english/lang_main.php
## Included Files: n/a
##############################################################
## For Security Purposes, Please Check: http://www.phpbb.com/mods/ for the
## latest version of this MOD. Downloading this MOD from other sites could cause malicious code
## to enter into your phpBB Forum.
##############################################################
## Author Notes: Previous idea of the mod had been generated by WingLion
##               at the Russian phpBB community http://phpbbguru.net/community/viewtopic.php?p=26942
##
##############################################################
## MOD History:
##
##     2005-07-14 10:26:00 - The first release
##
##############################################################
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################

#
#----[ OPEN ]-------------------------------------------------------------
#
includes/functions.php

#
#----[ FIND ]--------------------------------------------------------------
#
function create_date($format, $gmepoch, $tz)
{
        global $board_config, $lang;
        static $translate;

        if ( empty($translate) && $board_config['default_lang'] != 'english' )
        {
                @reset($lang['datetime']);
                while ( list($match, $replace) = @each($lang['datetime']) )
                {
                        $translate[$match] = $replace;
                }
        }

        return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz)), $translate) : @gmdate($format, $gmepoch + (3600 * $tz));
}

#
#----[ REPLACE WITH ]--------------------------------------------------
#
function create_date($format, $gmepoch, $tz, $skipDelta=true)
{
        global $board_config, $lang;
        static $translate;
        if ( !$gmepoch )
        {
                return $lang['datetime']['Hidden_time'];
        }

        preg_match('/([\+\-])?(\d\d)(\d\d)/', date('O'), $matches);
        $h = (int)($matches[1] . $matches[2]);
        $m = (int)($matches[1] . $matches[3]);
        $tz_delta = ($h + $m / 60 - $tz) * 3600;
        $time = $gmepoch - $tz_delta;
        if ( $skipDelta ) {
                $midnight = mktime(0, 0, 0) - $tz_delta;
                $delta = $time - $midnight;
                if ($delta >= 0 && $delta < 86400)
                {
                        return $lang['datetime']['Today'] . date('H:i', $time);
                }
                else
                if ($delta < 0 && $delta > -86400)
                {
                        return $lang['datetime']['Yesterday'] . date('H:i', $time);
                }
        }
        $pre_format = @date($format, $time);

        if ( empty($translate) && $board_config['default_lang'] != 'english' )
        {
                @reset($lang['datetime']);
                while ( list($match, $replace) = @each($lang['datetime']) )
                {
                        $translate[$match] = $replace;
                }
        }

        return ( !empty($translate) ) ? strtr($pre_format, $translate) : $pre_format;
        //return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + (3600 * $tz)), $translate) : @gmdate($format, $gmepoch + (3600 * $tz));
}

#
#----[ OPEN ]-------------------------------------------------------------
#
includes/page_header.php


#
#----[ FIND ]-------------------------------------------------------------
#
//
// Obtain number of new private messages
// if user is logged in
//


#
#----[ ADD, BEFORE ]------------------------------------------------------
#

// +Users of the day MOD
$userdata_time = 3600 * ( floatval($userdata['user_timezone']) ? $userdata['user_timezone'] : @$board_config['board_timezone'] );
$day_guest_userlist = $day_userlist = array();
$day_users = array('reg' => 0, 'hidden' => 0, 'guest' => 0, 'hour' => 0);

$sql = "SELECT u.user_id, u.username, u.user_level, u.user_lastvisit, u.user_session_time, s.session_time, s.session_ip, s.session_logged_in, u.user_allow_viewonline
	FROM " . USERS_TABLE . " u 
		LEFT JOIN " . SESSIONS_TABLE . " s
		ON u.user_id = s.session_user_id
	WHERE u.user_session_time >= " . mktime(0, 0, 0) . "
	GROUP BY u.username
	ORDER BY u.username ASC, u.user_session_time ASC";
if ( !($result = $db->sql_query($sql)) )
{
	message_die(GENERAL_ERROR, 'Could not obtain user/day information', '', __LINE__, __FILE__, $sql);
}

while( $row = $db->sql_fetchrow($result) )
{
	// all users visible by admin (including their IP)
	$user_tooltip = '';
	if ($userdata['user_level'] == ADMIN)
	{
		$user_tooltip = ' title="' . @$row['username'] . ' [' . decode_ip(@$row['session_ip']) . '] ' . create_date($userdata['date_format'], @$row['user_session_time'], $board_config['board_timezone'], true) . '"';
	}

	// color definition
	$style_color = '';
	if ( $row['user_level'] == ADMIN )
	{
		// admin is not visible anywhere
		if ($userdata['user_level'] != ADMIN)
		{
			continue;
		}
		$row['username'] = '<b>' . $row['username'] . '</b>';
		$style_color = 'style="color:#' . $theme['fontcolor3'] . '"';
	}
	else if ( $row['user_level'] == MOD )
	{
		$row['username'] = '<b>' . $row['username'] . '</b>';
		$style_color = 'style="color:#' . $theme['fontcolor2'] . '"';
	}

	if ( $row['user_allow_viewonline'] )
	{
		$day_users['reg']++;
	}
	else
	{
		$day_users['hidden']++;
		$row['username'] = '<i>' . $row['username'] . '</i>';
	}

	// Users at last hour
	if ( $row['user_session_time'] >= mktime(date("H"), 0, 0) )
	{
		$day_users['hour']++;
	}

	// all users visible for admin
	if ( $userdata['user_level'] == ADMIN || $row['user_allow_viewonline'] )
	{
		$day_userlist[] = '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color . $user_tooltip . '>' . $row['username'] . '</a>';
	}
}

$sql = "SELECT s.session_ip, MAX(s.session_time) AS session_time
	FROM " . USERS_TABLE . " u 
		LEFT JOIN " . SESSIONS_TABLE . " s 
		ON u.user_id = s.session_user_id 
	WHERE u.user_id = " . ANONYMOUS . "
	AND s.session_time >= " . mktime(0, 0, 0) . " 
	GROUP BY s.session_ip
	ORDER BY session_time ASC";
	
if( !($result = $db->sql_query($sql)) )
{
	message_die(GENERAL_ERROR, 'Could not obtain guest user/day information', '', __LINE__, __FILE__, $sql);
}

while( $row = $db->sql_fetchrow($result) )
{
	// guests per last hour
	if ( $row['session_time'] >= gmmktime(date("H"), 0, 0) - $userdata_time )
	{
		$day_users['hour']++;
	}

	// guests per day
	$day_users['guest']++;

	// guest IP visible by admin
	if ($userdata['user_level'] == ADMIN)
	{
		$day_guest_userlist[$row['user_session_time']][] = '<span class="guest" title="[' . decode_ip($row['session_ip']) . '] ' . create_date($userdata['date_format'], $row['session_time'], $board_config['board_timezone'], true) . '">' . decode_ip($row['session_ip']) . '</span>';
	}
}

// logged, hidden and guest users counts and list of logged users
$day_userlist = ( isset($forum_id) ) ? '' : sprintf($lang['Users_Stat'], $day_users['reg'] + $day_users['hidden'] + $day_users['guest'], $day_users['reg'], $day_users['hidden'], $day_users['guest'], $day_users['hour'], implode(', ', $day_userlist));

// admin collected guests' ips and times and resort by time
if ($userdata['user_level'] == ADMIN)
{
	foreach ($day_guest_userlist as $k => $v)
	{
		$day_guest_userlist[$k] = implode('', $day_guest_userlist[$k]);
	}
	$day_userlist .= '<br /><hr />' . "\n";
	$day_userlist .= '<style type="text/css">.guest{border: 1px solid #CCC; display: block; float: left; margin: 1px; padding: 0; text-align: center; width: 100px;}</style>';
	$day_userlist .= implode('', $day_guest_userlist);
}
// -Users of the day MOD


#
#----[ FIND ]-------------------------------------------------------------------
#
        'LOGGED_IN_USER_LIST' => $online_userlist,
	

#
#----[ ADD, AFTER ]-------------------------------------------------------------
#
	// +Users Of The Day
	'USERS_OF_THE_DAY_LIST' => $day_userlist,
	// -Users Of The Day


#
#----[ OPEN ]-------------------------------------------------------------------
#
templates/subSilver/index_body.tpl


#
#----[ FIND ]-------------------------------------------------------------------
#
  <tr>
	<td class="row1" align="left"><span class="gensmall">{TOTAL_USERS_ONLINE} &nbsp; [ {L_WHOSONLINE_ADMIN} ] &nbsp; [ {L_WHOSONLINE_MOD} ]<br />{RECORD_USERS}<br />{LOGGED_IN_USER_LIST}</span></td>
  </tr>


#
#----[ ADD, BEFORE ]------------------------------------------------------------
#
<tr>
<td class="row1" align="left"><span class="gensmall">{USERS_OF_THE_DAY_LIST}</span></td>
</tr>


#
#----[ OPEN ]------------------------------------------------------------------
#
language/lang_russian/lang_main.php


#
#----[ FIND ]------------------------------------------------------------------
#
?>


#
#----[ ADD, BEFORE ]------------------------------------------------------------
#
$lang['Users_Stat'] = 'Сегодня наш форум поcетило пользователей: <b>%d</b><br />Зарегистрированных: %d, скрытых: %d и гостей: %d, из них <b>%d</b> в течение последнего часа<br />Зарегистрированные пользователи: %s';


#
#----[ OPEN ]------------------------------------------------------------------
#
language/lang_english/lang_main.php


#
#----[ FIND ]------------------------------------------------------------------
#
?>


#
#----[ ADD, BEFORE ]------------------------------------------------------------
#
$lang['Users_Stat'] = 'In total <b>%d</b> user have visited this site today <br />%d Registered, %d Hidden and %d Guests, <b>%d</b> of them within the last hour <br />Registered Users: %s';


# EoM
Последний раз редактировалось quazi 10.10.2006 19:30, всего редактировалось 6 раз.
sigal
phpBB Plus
Сообщения: 442
Стаж: 19 лет 10 месяцев
Откуда: КПРФ ;)

Сообщение sigal »

quazi
ну, хороший мод. В принуипе все эти фичи есть в моде Last Visit Hack. но он гораздо тяжелей в установке и в нем много лишнего, чего мне например не надо было..
Аватара пользователя
automan
phpBB 2.0.1
Сообщения: 252
Стаж: 18 лет 11 месяцев
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Сообщение automan »

quazi писал(а):админы видят IP пользователей и их время последнего пребывания на форуме во всплывающей подсказке
что то не пашет эта фича :roll:
maT
phpBB 1.4.1
Сообщения: 43
Стаж: 19 лет
Откуда: с небес!
Контактная информация:

Сообщение maT »

automan
может java скрипты отключены?
Да будет ТАК!

www.mympei.ru - неОфициальный сайт МЭИ (ТУ). Полезная инфа для студентов. халява!
Аватара пользователя
automan
phpBB 2.0.1
Сообщения: 252
Стаж: 18 лет 11 месяцев
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Сообщение automan »

maT, нет
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 19 лет
Контактная информация:

Сообщение quazi »

немного подправил первый пост
был не совсем корректный подсчет скрытых пользователей

maT, automan, не в ту сторону думаете
javascript здесь не при чем. всплывающие подсказки никак не связаны со скриптами. это стандартная фича браузеров
Аватара пользователя
automan
phpBB 2.0.1
Сообщения: 252
Стаж: 18 лет 11 месяцев
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Сообщение automan »

quazi писал(а):maT, automan, не в ту сторону думаете
javascript здесь не при чем. всплывающие подсказки никак не связаны со скриптами. это стандартная фича браузеров
на трех браузерах пробывал и не пашет
quazi писал(а):был не совсем корректный подсчет скрытых пользователей
что именно было не коректно
quazi писал(а):немного подправил первый пост
скажи плиз какой кусок править
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 19 лет
Контактная информация:

Сообщение quazi »

automan
maT
послушайте. я совершенно не собираюсь вам разжевывать что ставить, как ставить учитывая, что по установке форума много написано и разжевано.

есть форум, есть желание ставить - ставьте. есть мод есть необходимость в нем - ставьте. если возникли серьезные проблемы я их помогу решить,

а подобные высказывания "на трех браузерах пробывал и не пашет" я отметаю и не буду отвечать. вы абсолютно не умеете думать и совершенно не понимаете элементарных вещей.

аналог этого мода есть. вернее мной мод был написан после установки оригинала, который мне не понравился. я его полностью переписал. из будучи программистом и сторонником открытых кодов я выложил решение на всеобщее обозрение, критику и пользование
Аватара пользователя
Nikel
phpBB 2.0.5
Сообщения: 496
Стаж: 18 лет 11 месяцев
Откуда: Киев
Контактная информация:

Сообщение Nikel »

quazi
Потестил , все вроде пока нормально :D
Хочешь помочь коллеге- поделись опытом, хочешь помочь профессионалу-отойди и не мешай, хочешь помочь дураку... Сам дурак
Аватара пользователя
automan
phpBB 2.0.1
Сообщения: 252
Стаж: 18 лет 11 месяцев
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Сообщение automan »

quazi писал(а):послушайте. я совершенно не собираюсь вам разжевывать что ставить, как ставить учитывая, что по установке форума много написано и разжевано.
я что спрашивал как ставить мод ?
quazi писал(а):есть форум, есть желание ставить - ставьте. есть мод есть необходимость в нем - ставьте. если возникли серьезные проблемы я их помогу решить,
да я же не спрашивал, ставить мне его или нет
к чему эти пустые цитаты или пошуметь хочется ?

quazi писал(а):а подобные высказывания "на трех браузерах пробывал и не пашет" я отметаю и не буду отвечать. вы абсолютно не умеете думать и совершенно не понимаете элементарных вещей.
я ставил мод который я выкладывал в соседне мтопике и внем это не пашет
возможно в вашей модификации это есть



я просто спросил какие куски кода оригинального мода вы изменили
Jovani
phpBB 2.0.5
Сообщения: 477
Стаж: 19 лет 11 месяцев
Контактная информация:

Сообщение Jovani »

2. в отличии от аналогов выполняется 2 более структурированных запроса к БД (возможно это недостаток
Думаю, что не возможно, а так и есть. Один из которых, достаточно тяжелый.

Кроме этого, этот список пользователей, может быть достаточно большим, поэтому, наверно, лучше все таки, выводить его на отдельной странице.
Это решит проблему N2, и наверно, не так уж важно, что-бы список находился именно на главной странице ...
Аватара пользователя
Mr. Anderson
phpBB Guru
phpBB Guru
Сообщения: 7522
Стаж: 20 лет
Откуда: СССР
Благодарил (а): 6 раз
Поблагодарили: 154 раза
Контактная информация:

Сообщение Mr. Anderson »

Есть мнение, что этот список надо бы в админку ;) Реализуете?

PS:
По поводу видимости админов (нет времени самому разбираться) - они вообще не видны (в т.ч. в хузонлайне) или не отображаются только в этом списке? ;)
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Стаж: 20 лет
Поблагодарили: 2 раза
Контактная информация:

Сообщение Xpert »

quazi
Я бы вынес весь код в index.php, если планируется использование только на главной странице.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
quazi
phpBB 2.0.2
Сообщения: 306
Стаж: 19 лет
Контактная информация:

Сообщение quazi »

Jovani
вот оригинальный запрос от ZoZo, чей мой был взят за основу

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

SELECT u.username, u.user_id, u.user_allow_viewonline, u.user_level, 
	s.session_time, s.session_logged_in, s.session_ip
FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s
WHERE u.user_id = s.session_user_id
AND s.session_time >= " . ( time() - 86400 ) . "
$user_forum_sql
ORDER BY u.username ASC, s.session_ip ASC
вот мои запросы

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

// поиск зарегистрированных пользователей
SELECT u.user_id, u.username, u.user_level, u.user_lastvisit, u.user_session_time, 
	s.session_time, s.session_ip, s.session_logged_in, u.user_allow_viewonline
FROM " . USERS_TABLE . " u
LEFT JOIN " . SESSIONS_TABLE . " s ON u.user_id = s.session_user_id
WHERE u.user_session_time >= " . ( mktime(0, 0, 0) ) . "
GROUP BY u.username
ORDER BY u.username ASC, u.user_session_time ASC

// поиск гостей
SELECT s.session_ip, MAX(s.session_time) AS session_time
FROM " . USERS_TABLE . " u
LEFT JOIN " . SESSIONS_TABLE . " s ON u.user_id = s.session_user_id
WHERE u.user_id = " . ANONYMOUS . "
AND s.session_time >= " . ( mktime(0, 0, 0) ) . "
GROUP BY s.session_ip
ORDER BY session_time ASC
каждый из запросов не сложнее другого
следует заметить, что у ZoZo запрос вида AND s.session_time >= " . ( time() - 86400 ) . " некорректно генерирует список пользователей за текущие сутки (от текущего времени - сутки)
в отличие от его запроса мой WHERE u.user_session_time >= " . ( mktime(0, 0, 0) ) . " совершенно корректен - от 0 часов 0 минут 0 секунд текущих суток
Mr. Anderson писал(а):Есть мнение, что этот список надо бы в админку. Реализуете?
не согласен. в админке видны пользователи с их IP. этот мод расчитан как общая публичная статистика посещяемости, видимая каждому, как дополнение - админ может видеть более подробную информацию
в этом моде админы не отражаются именно в списке. чтобы восстановить видимость аминов, достаточно закомментировать строки

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

// admin is not visible anywhere
if ($userdata['user_level'] != ADMIN)
{
	continue;
}
Xpert писал(а):Я бы вынес весь код в index.php
возможно, вы и правы. но следуя логике (кстати не совсем верной) разработчиков список последних активных пользователей генерируется именно в includes/page_header.php. именно по этой причине данных код помещен именно в этот файл
Аватара пользователя
Mr. Anderson
phpBB Guru
phpBB Guru
Сообщения: 7522
Стаж: 20 лет
Откуда: СССР
Благодарил (а): 6 раз
Поблагодарили: 154 раза
Контактная информация:

Сообщение Mr. Anderson »

quazi писал(а):не согласен. в админке видны пользователи с их IP
Разница в том, что видны ТЕКУЩИЕ пользователи! ;) Так понятнее?
Закрыто

Вернуться в «Бета-версии модов для phpBB 2.0.x»