Перейти к контенту

[1.x.x]Online / Offline


Рекомендуемые сообщения

Название: Online / Offline

Добавил: Matrix

Добавлен: 11 Июл 2003

Обновлен: 11 Июл 2003

Категория: IP.Board 1.x.x

 

Хороший хак.

Контролируется через админку.

Может использовать как текст, так и изображения.

Модификация была обновлена 12.7.2003, 4:56

 

Нажмите здесь, чтобы скачать файл

Ссылка на комментарий
Поделиться на других сайтах

  • 1 год спустя...

У меня возникло 2 вопроса :

1)."Подойдет ли этот мод для версии IPB 1.3 ?"

2)."Можно ли поменять место расположение картинки Online / Offline ?"(В смысле что бы она находилась над Аватаром пользователя)

Ссылка на комментарий
Поделиться на других сайтах

У меня появилась проблема после установки ! Теперь у меня Статус "Online / Offline" , отображается в дух местах (над Аватаром и под датой регистрации )

 

Как мне это исправить ?

Ссылка на комментарий
Поделиться на других сайтах

Жаль, что не ответили по поводу версии.

Я попытался поставить на 1.3 и теперь админ панель вываливает ошибку 26 строки. В чём меня запутала. Исправлениия в файле admin_pages были в строке 51, а именно надо было добавить после строки:

19 =>array( 'Warning Set-up' , 'act=op&code=warn' ),

сточку:

20 =>array( 'Настройки Онлайн/Оффлайн' , 'act=sonline' ), но 20 уже есть и я её сделал 21.

после войти в ACP не возможно.

 

так же после исправления admin_pages проскакивает строчка

Warning: Invalid argument supplied for foreach() in /home/vhosts***.forumat.com/sources/Admin/admin_functions.php on line 738

но это я подозреваю связано.

 

Помогите!

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...
странно ... на локалхосту поработал потом помер, теперь на реальном форуме упорно считает всех Offline ... что могло произойти ?
Ссылка на комментарий
Поделиться на других сайтах

Dekker а сколько у тебя размер сессии?

Не знаю зачем так сложно написан мод, там нужно просто добавить LEFT JOIN в запрос постов.

Ссылка на комментарий
Поделиться на других сайтах

Song

продолжительность сесии == 1800 в секундах

 

сам запрос

 

$DB->query( "SELECT s.member_id FROM ipb_sessions s, ipb_posts p WHERE p.topic_id='".$this->topic['tid']."' and p.queued !='1' AND s.member_id <>'0' AND s.running_time > '$time' AND s.member_id=p.author_id AND  s.login_type !='1'");

 

причем у меня в сесиях login_type == "-1"

 

думал что из-за этого, черта с два, думал префиксы не те, сменил на свои "IPB_" опять ничего

 

там нужно просто добавить LEFT JOIN в запрос постов.

у меня уже мозги подзакипают ... в какое именно место в вышеуказанном коде ? :D

 

мод, это общий мод, вернее просто обрусенный с ib planet там тоже самое.

Ссылка на комментарий
Поделиться на других сайтах

Dekker

онлайн определяется по наличию session_id в таблице сессий, соответствующем конкретному юзеру.

Чтобы всё правильно показывало, у тебя долно соблюдаться два условия

1) время поставленное в моде должно соответствовать времени сессии

2) время вывода онлайн участников должно быть равно времени сессии, а то будет так: "Написано Online, а в списке активных пользователей нет".

 

У тебя вероятно п. 1 не выполняется. Но я не понимаю для чего вообще в моде стоит 900 секунд? :D

Надо было просто ориентироваться на время сесии.

В таблице есть значит онлайн, нет - значит офлайн.

Ссылка на комментарий
Поделиться на других сайтах

theIggs

куски кода из Topics.php

 

после строки $this->topic['TOPIC_START_DATE'] = $std->get_date( $this->topic['start_date'], 'LONG' );

добавляем
if ($ibforums->vars['status_set'] ==  1)
{

$off_text = ($ibforums->vars['off_status_color']);
$on_text = ($ibforums->vars['on_status_color']);
$off_image = ($ibforums->vars['off_status_image']);
$on_image = ($ibforums->vars['on_status_image']);
$img_dir = ($ibforums->vars['img_url']);
$s_pre = ($ibforums->vars['status_prefix']);
$user_name = 'Member'; // Will be a username variable in v3.5


$ibforums->lang['M_On_T'] = preg_replace( "/<#ON_COLOR#>/", $on_text, $ibforums->lang['M_On_T']);
$ibforums->lang['M_On_T'] = preg_replace( "/<#S_PRE#>/", $s_pre, $ibforums->lang['M_On_T']);
$ibforums->lang['M_Off_T'] = preg_replace( "/<#OFF_COLOR#>/", $off_text, $ibforums->lang['M_Off_T']);
$ibforums->lang['M_Off_T'] = preg_replace( "/<#S_PRE#>/", $s_pre, $ibforums->lang['M_Off_T']);

$ibforums->lang['M_On_I'] = preg_replace( "/<#ON_IMAGE#>/", $img_dir.'/'.$on_image, $ibforums->lang['M_On_I']);
$ibforums->lang['M_On_I'] = preg_replace( "/<#U_NAME#>/", $user_name, $ibforums->lang['M_On_I']);
$ibforums->lang['M_On_I'] = preg_replace( "/<#S_PRE#>/", $s_pre, $ibforums->lang['M_On_I']);
$ibforums->lang['M_Off_I'] = preg_replace( "/<#U_NAME#>/", $user_name, $ibforums->lang['M_Off_I']);
$ibforums->lang['M_Off_I'] = preg_replace( "/<#OFF_IMAGE#>/", $img_dir.'/'.$off_image, $ibforums->lang['M_Off_I']);
$ibforums->lang['M_Off_I'] = preg_replace( "/<#S_PRE#>/", $s_pre, $ibforums->lang['M_Off_I']);

}

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

после
//--------------------------------------------
// Grab the posts we'll need
//--------------------------------------------
добавляем

if ($ibforums->vars['status_set'] ==  1)
{

$time=time()-900;

$online_ornot = Array();

$DB->query( "SELECT s.member_id FROM ipb_sessions s,  ipb_posts p WHERE p.topic_id='".$this->topic['tid']."' and p.queued !='1' AND s.member_id <>'0' AND s.running_time > '$time' AND s.member_id=p.author_id AND  s.login_type !='1'");

while ($stuff = $DB->fetch_row())
{
$online_ornot[$stuff['member_id']] = 1;
}

}

вот здесь пробовал исключать, менять запросы, ничерта не получаеться, вернее тот же тупой offline

перед строкой 
$row['post_css'] = $post_count % 2 ? 'post1' : 'post2';

добавляем
if ($ibforums->vars['status_set'] ==  1)
{

if ($ibforums->vars['status_type'] == "text")
{
$Shadow_ON = $ibforums->lang['M_On_T'];
$Shadow_OFF = $ibforums->lang['M_Off_T'];
}
else if ($ibforums->vars['status_type'] == "image")
{
$Shadow_ON = $ibforums->lang['M_On_I'];
$Shadow_OFF = $ibforums->lang['M_Off_I'];
}
else if ($ibforums->vars['status_type'] == "")
{
$Shadow_ON = "";
$Shadow_OFF = "";
}
else
{
$Shadow_ON = "";
$Shadow_OFF = "";
}

if ($online_ornot[$row['author_id']])
  {
  $poster['member_status']= "$Shadow_ON";
  }
  else if ($row['author_id'])
  {
  $poster['member_status']= "$Shadow_OFF";
  }
  else
  {
  $poster['member_status']="";
  }

}

логику вроде всю проверил, но у меня уже мозги буксуют ...

 

собствено, собака где-то здесь, остальное, файлы админки и скина работают исправно.

Добавлено в [mergetime]1098982581[/mergetime]

Song

Но я не понимаю для чего вообще в моде стоит 900 секунд? Надо было просто ориентироваться на время сесии.

значит кусок

AND s.running_time > '$time'

из запроса просто можно выкинуть вместе с $time=time()-900; ?

 

можно конечно и выбросить.

Ссылка на комментарий
Поделиться на других сайтах

if ($ibforums->vars['status_set'] ==  1)
{

$time=time()-900;

$online_ornot = Array();

$DB->query( "SELECT s.member_id FROM ipb_sessions s,  ipb_posts p WHERE p.topic_id='".$this->topic['tid']."' and p.queued !='1' AND s.member_id <>'0' AND s.running_time > '$time' AND s.member_id=p.author_id AND  s.login_type !='1'");

while ($stuff = $DB->fetch_row())
{
$online_ornot[$stuff['member_id']] = 1;
}

}

Тут фигня какая-то. Зачем тут таблица posts?

SELECT s.member_id FROM ibf_sessions s WHERE s.member_id <>'0' AND s.running_time > '$time' AND s.login_type !='1'");

Если мембер сейчас активен, то получит свою единичку в $online_ornot.

Добавлено в [mergetime]1098985549[/mergetime]

значит кусок

 

CODE

AND s.running_time > '$time'

 

 

из запроса просто можно выкинуть вместе с $time=time()-900; ?

Не рекомендуется. Он тут для того, чтобы отсекать неактивные сессии. Сессии по дефолту хранятся в базе час, а онлайн-пользователи по тому же дефолту обычно считаются только на 15 минут назад... Посему тут отсекаются все слишком старые сессии.

Ссылка на комментарий
Поделиться на других сайтах

Тут фигня какая-то. Зачем тут таблица posts?

Потому что получать надо не всех мемберов из сессий, а только тех, чьи сообщения есть в топике.

 

2Dekker, выбрось этот мод полностью, давай я тебе напишу свой, меньше в 3 раза.

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

Ссылка на комментарий
Поделиться на других сайтах

так, господа,

 

login : Script

pass : 123456

 

тестовая тема

 

http://crimea-board.net/index.php?showtopic=1868

 

Song

сколько пива или денег ? :D

Ссылка на комментарий
Поделиться на других сайтах

Dekker

если ты согласен на мой мод тогда от требуется

1) создать во всех макросах в скинах макрос ONLINE и сделать ему что надо (надпись там или картинку может)

2) прислать мне твой Topics.php

Добавлено в [mergetime]1098988499[/mergetime]

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

Ссылка на комментарий
Поделиться на других сайтах

Потому что получать надо не всех мемберов из сессий, а только тех, чьи сообщения есть в топике.

Не обязательно, особенно ценой такого усложнения запроса...

Только единственное, что он привязан к сроку сессии.

Зачем? :D

Ссылка на комментарий
Поделиться на других сайтах

theIggs

я ж объяснил ;)

Уже 2 раза. :D

Но в принципе это его дело, может переделать

Просто LEFT JOIN таблица (по внешнему ключу) будет работать

быстрей чем LEFT JOIN (по внешнему ключу + доп_условию)

причём заметь в стандартном инвижине поля в доп. условии не проиндексированы.

Ссылка на комментарий
Поделиться на других сайтах

собственно что помешало нормально работать моду, другой мод Pin First Post в котором используеться три (!) повторяющихся одинаковых запроса, так что мож прийдеться или пересмотреть или установить другой. для желающих (с согласия автора мода) могу привести решение проблемы.

 

сам мод первого поднятого сообщения в аттаче (ну или в архиве), у кого остались силы, могут попробовать разобраться в конфликте модификаций :D

v_pinned_post.zip

Ссылка на комментарий
Поделиться на других сайтах

У меня установлен мод от Игса по перемещению и удалению отдельных сообщений, я галочки от этого мода приспособил для того чтобы поднимать наверх любое сообщение в теме. Правда только одно сообщение т.к. pid сообщения я храню в ibf_topics. ibf_posts мне патчить целое дело ;)

Как у меня работает

 

function process_posts() {

while ($row = $DB->fetch_row() )
{
цикл вывода топиков

}
}

....
....
// начало обработки
если есть пришпиленный пост
{
   $DB->query("запрос всех реквизитов поста на пришпиленный pid");
   process_posts()
}

// обычный запрос на топики
$DB->query("запрос на сообщения всего топика кроме пришпиленного")
process_posts();

 

Итого у меня в худшем случае 2 запроса и один цикл вывода. Всё красиво и понятно. А вот у тебя Dekker... :D

Ссылка на комментарий
Поделиться на других сайтах

  • 5 месяцев спустя...

Какой запрос оптимальней/быстрее?

 

Этот (тот что в моде):

SELECT s.member_id FROM ibf_sessions s, ibf_posts p WHERE p.topic_id='".$this->topic['tid']."' and p.queued !='1' AND s.member_id<>'0' AND s.running_time > $time AND s.member_id=p.author_id AND s.login_type !='1'

 

Или этот:

SELECT s.member_id FROM ibf_sessions s WHERE s.member_id<>'0' AND s.running_time > $time AND s.login_type !='1' AND s.member_id IN (SELECT distinct (author_id) FROM ibf_posts WHERE topic_id='".$this->topic['tid']."' and queued !='1')

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...
  • 2 месяца спустя...

Первый ИМХО.

 

Также ещё, второй - это с подзапросом, может исполняться не на всех серверах.

Ссылка на комментарий
Поделиться на других сайтах

А не легче просто проверять существует всё ещё сессия или нет, если существует то просто выводит online, если чел. ушёл и сессия прервалась то всё, offline. Или я, что-то не так говорю?
Ссылка на комментарий
Поделиться на других сайтах

Ну мы вроде как и обсуждаем как проверять наличие сессии.

 

Уже выяснили, если к ibf_posts делать LEFT JOIN ibf_sessions, то будут дублироваться посты ;)

 

Я себе объеденил запрос "кто просматривает тему" с этим. Расширив запрос на выдачу всей таблицы ibf_sessions :) . Но на счет того, что лучшим образом поступил не уверен :D. Но и не жалуюсь :)

Ссылка на комментарий
Поделиться на других сайтах

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.