Перейти к содержимому
Русский язык для Invision Community 5

Помогите создать tasks

Здравствуйте. Я не знаком с программированием, только на уровне чтения ну и основ. Мне нужно реализовать следующее:

 

В таблице 1 содержатся данные игрового аккаунта, в котором есть полу active и оно принимает значения 0 или 1.

 

Эта активность берется с двух других таблиц, где сравниваются ИГРОКИ и ИГРЫ, там где ИГРЫ есть дата игры, по ней и будет проходить сравнение, если игрок играл за последний месяц, то должно передаваться значение 1.

 

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

 

Т.е запрос примерно такой: Если "игрок" (stats_gameplayers.gameid, stats_gameplayers.name, stats_gameplayers.spoofedrealm) есть в "играх" за последний месяц (stats_games.id) то условие выполняется, true.

 

/**
* memberActive Task
*/
class _memberActive extends \IPS\Task
{
/**
 * Execute
 *
 * If ran successfully, should return anything worth logging. Only log something
 * worth mentioning (don't log "task ran successfully"). Return NULL (actual NULL, not '' or 0) to not log (which will be most cases).
 * If an error occurs which means the task could not finish running, throw an \IPS\Task\Exception - do not log an error as a normal log.
 * Tasks should execute within the time of a normal HTTP request.
 *
 * @return	mixed	Message to log or NULL
 * @throws	\IPS\Task\Exception
 */
public function execute()
{
	$db = \IPS\sharedstats\DB::get();
    $accounts = [];
    foreach($db::i('stats')->select('id, status, name, active, server, created', 'stats_forum_connections') as $acc) {
           $accounts[$acc['id']] = [
               'status' => $acc['status'],
               'name' => $acc['name'],
               'server' => $acc['server'],
               'active'   => $acc['active']
           ];
       }
       $this->updateAccounts($accounts);
}

/**
 * Cleanup
 *
 * If your task takes longer than 15 minutes to run, this method
 * will be called before execute(). Use it to clean up anything which
 * may not have been done
 *
 * @return	void
 */
public function cleanup()
{

}

   /**
    * @param $accounts
    */
   protected function updateAccounts($accounts)
   {
       foreach($accounts as $id => $acc) {
           $data = $this->fetchAccount($acc);
           $account = \IPS\sharedstats\Records\ForumConnection::load($id);
           if(!$data) {
               $account->active = '0';
           } else {
               $account->active = '1';
           }
           $account->save();
       }
}

   protected function fetchAccount($acc)
   {
       $result = true;

       if (FALSE === $result) {
           return false;
       } else {
           return json_decode($result, true);
       }
}

}

 

Это готовый таск, он рабочий, данные изменяются где надо. Нужно вместо $result = true; вставить SQL запрос правильный.

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

Сделайте пожалуйста, и с этим вопросом покончено )))

Я же Вам написал выше

1. Ставьте всем 0

2. Ставьте 1 тем, кто играл.

и http://ipbskins.ru/forum/topic15678.html/page__view__findpost__p__104902, начиная с "Сделайте так"

Нужно только 2 и 3 коды изменить

  • Автор

А, вы предлагаете первым запросом таска в базу сбрасывать все значения?

 

	public function execute()
{
       $db = \IPS\sharedstats\DB::get();
$db::i('stats')->update('stats_forum_connections', array('active' => 0));
	$names = iterator_to_array($db::i('stats')->select(
	    "CONCAT(stats_gameplayers.name, stats_gameplayers.spoofedrealm)",
	    'stats_gameplayers',
	    array( 'UNIX_TIMESTAMP(stats_games.datetime)>?', \IPS\DateTime::create()->sub(new \DateInterval('P30D'))->getTimestamp()),
	    null,
	    null,
	    array('stats_gameplayers.name', 'stats_gameplayers.spoofedrealm')
	)->join(
	    'stats_games',
	    'stats_games.id=stats_gameplayers.gameid'
	));
	if (count($names))
	{
	    $db::i('stats')->update('stats_forum_connections', array('active' => 1), $db::i('stats')->in("CONCAT(name, server)", $names));
	}
}

Изменено пользователем TemKa_SD

А, вы предлагаете первым запросом таска в базу сбрасывать все значения?

Да

 

.....
       $db::i('stats')->update('stats_forum_connections', array('active' => 0));

       $names = iterator_to_array($db::i('stats')->select(
           "CONCAT(stats_gameplayers.name, stats_gameplayers.spoofedrealm)",
           'stats_gameplayers',
           array( 'UNIX_TIMESTAMP(stats_games.datetime)>?', \IPS\DateTime::create()->sub(new \DateInterval('P30D'))->getTimestamp()),
           null,
           null,
           array('stats_gameplayers.name', 'stats_gameplayers.spoofedrealm')
       )->join(
           'stats_games',
           'stats_games.id=stats_gameplayers.gameid'
       ));
       if (count($names))
       {
           $db::i('stats')->update('stats_forum_connections', array('active' => 1), $db::i('stats')->in("CONCAT(name, server)", $names));
       }

  • Автор

Да

 

Да, я уже поправил своё сообщение подумав секунду. Спасибо за помощь )

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.