Previous Entry Share Next Entry
Зов сида, как это сделано
shixaro wrote in opentorrent
Некоторое время назад эта хреновина у нас перестала должным образом работать. Писалась и правилась она несколько лет назад ребятами, которые когда-то помогали в разработке, попутно набираясь опыта (или наоборот). PHP-код был признан непригодным и недостойным к поддержке в нынешних реалиях. Поэтому логика была уведена внутрь нашей СУРБД в лице слоника

Функционал следующий: нужно уведомить тех, кто скачал раздачу и засветился сидером, что нужна помощь, нужны сидеры.

Таким образом, у нас имеется следующая функция:


CREATE OR REPLACE FUNCTION call_seed_func (user_id_ integer, topic_id_ integer) RETURNS integer AS $$
DECLARE
  counter INTEGER:=0;
   result INTEGER:=0;
   item RECORD;
   bot_id INTEGER:=-745;
   bot_name CHARACTER VARYING:='Архивариус';
   topic_info RECORD;
   idle_time INTEGER:=86400; -- ограничение на зов сида в секундах
BEGIN
-- Выбираем данные по топику topic_id_
   SELECT f.forum_id, t.topic_title, t.topic_poster, f.forum_name, tor.attach_id, tor.torrent_id, t.call_seed_time
   INTO topic_info
   FROM phpbb_topics t, phpbb_forums f, phpbb_bt_torrents tor
   WHERE
   t.topic_id=topic_id_
   AND t.topic_id=tor.topic_id
   AND tor.active=1
   AND t.forum_id=f.forum_id
   ORDER BY tor.reg_time DESC
   LIMIT 1;
   -- Если давили кнопку меньше суток назад, то отфутболиваем и ничо не делаем
   IF EXTRACT('epoch' FROM (now()))::INTEGER-topic_info.call_seed_time < idle_time THEN return -1; END IF;
   -- Если юзер давит эту кнопку, а сам на раздаче сидит - нифига не делаем снова
   IF (SELECT COUNT(*) FROM phpbb_bt_tracker WHERE expire_time>EXTRACT('epoch' FROM (now()))::INTEGER   AND seeder=1 AND torrent_id=topic_info.torrent_id)>0 THEN return -2; END IF;
   -- Обновляем информацию по топику
   UPDATE phpbb_topics SET call_seed_time=EXTRACT('epoch' FROM (now()))::INTEGER WHERE topic_id=topic_id_;

   FOR item IN (
     SELECT s.user_id, u.user_email, u.user_notify_pm FROM phpbb_bt_users_dl_status s, phpbb_users u
     WHERE
     s.topic_id=topic_id_
     AND s.user_id=u.user_id
     AND s.user_status=2
     AND s.drop_release=0
     AND u.call_seed=1
     AND u.user_id!=user_id_
     )
   LOOP
   counter:=counter+1;
   -- Отправляем ЛС скачавшим
   SELECT send_pm (bot_id, item.user_id, 'Нужна помощь по раздаче "'||topic_info.topic_title||'"! ',
'Здравствуйте!
Ваша помощь необходима в раздаче "'||topic_info.topic_title||'", http://opentorrent.ru/viewtopic.php?t='||topic_id_||'
Если вы решили помочь, но уже удалили torrent-файл, можете скачать его здесь: http://opentorrent.ru/download.php?id='||topic_info.attach_id||'
Надеемся на вашу помощь!',
'', 1, '') INTO result;

   -- Отправляем емейл скачавшим
   IF item.user_email IS NOT NULL AND item.user_notify_pm=1 THEN
   SELECT send_email ('noreply@opentorrent.ru', item.user_email, 'Нужна Ваша помощь в раздаче '||topic_info.topic_title||'', 'Нужна Ваша помощь на раздаче "'||topic_info.topic_title||'", http://opentorrent.ru/viewtopic.php?t='||topic_id_||' .
Посидируйте, пожалуйста, если это возможно.', 'utf-8', 'text/plain') INTO result;
   END IF;

   END LOOP; -- Конец цикла, всех перебрали
   RETURN counter; -- возвращаем количество тех, кому ушло сообщение
  END;
  $$ LANGUAGE plpgsql;


Вызовы send_email() и send_pm() это тоже функции, работающие внутри базы данных, а веб-морда (php-код + шаблоны) это лишь обертка для их вызова.

P.S. все отступы в функции едут, к сожалению, поэтому читабельность страдает.

?

Log in