Часть 1 из 12
Строки: 1-2000 из 22262
================================================================================

================================================================================
ДЕРЕВО ПРОЕКТА
================================================================================
Корень: /home/developer/www/gems_island/od/htdocs

.
1argLog.txt
app
app/compilelist.php
app/compilelist.php.bak.2016.03.24
app/controllers
app/controllers/abstractController.php
app/controllers/boosterController.php
app/controllers/cacheController.php
app/controllers/dailyController.php
app/controllers/eventController.php
app/controllers/gameController.php
app/controllers/generalController.php
app/controllers/generalController.php.bak
app/controllers/giftController.php
app/controllers/log
app/controllers/lotteryController.php
app/controllers/mailController.php
app/controllers/mailController.php.bak
app/controllers/missionController.php
app/controllers/playlistController.php
app/controllers/shopController.php
app/controllers/statisticsController.php
app/controllers/storageController.php
app/controllers/userController.php
app/models
app/models/abstractModel.php
app/models/adminModel.php
app/models/booster_statModel.php
app/models/char_statModel.php
app/models/companyModel.php
app/models/company_statModel.php
app/models/daily_bonus_statModel.php
app/models/event_by_timeModel.php
app/models/eventModel.php
app/models/event_statModel.php
app/models/friendModel.php
app/models/gameModel.php
app/models/giftModel.php
app/models/goldpriceModel.php
app/models/levelModel.php
app/models/library_statModel.php
app/models/log
app/models/lotteryModel.php
app/models/lotteryModel.php.bak
app/models/lottery_statModel.php
app/models/mailModel.php
app/models/mission_keyModel.php
app/models/missionModel.php
app/models/missionModel.php.bak
app/models/missionModel.php.bak.2016.03.24
app/models/missionModel.php.bak.2016.04.11
app/models/mission.php
app/models/mission_statModel.php
app/models/Model.php
app/models/Model.php.bak.2016.03.24
app/models/notificationModel.php
app/models/playlist
app/models/playlist/playlist_statModel.php
app/models/session_keyModel.php
app/models/shop
app/models/shop/shop_booster_set_statModel.php
app/models/shop/shop_booster_statModel.php
app/models/shop/shop_booster_stat_setModel.php
app/models/shop/shop_energy_max_statModel.php
app/models/shop/shop_energy_statModel.php
app/models/shop/shop_game_in_max_statModel.php
app/models/shop/shop_game_out_max_statModel.php
app/models/shop/shop_game_out_max_statModel.php.php
app/models/shop/shopModel.php
app/models/shop/shopModel.php.bak.2016.04.07
app/models/shop/shop_money1_statModel.php
app/models/shop/shop_money2_statModel.php
app/models/shop/shop_playlist_set_statModel.php
app/models/shop/shop_playlist_set_statModel.php.php
app/models/shop/shop_playlist_statModel.php
app/models/shop/shop_promotion_statModel.php
app/models/shop/shop_social_statModel.php
app/models/shop/shop_stage_statModel.php
app/models/stage_keyModel.php
app/models/stageModel.php
app/models/stageModel.php.bak.2016.04.07
app/models/stage_statModel.php
app/models/stage_timeModel.php
app/models/statistics
app/models/statistics/statistics_game_detailModel.php
app/models/statistics/statistics_gameModel.php
app/models/statistics/statistics_games_rivalModel.php
app/models/statistics/statistics_game_totalModel.php
app/models/statistics/statistics_mission_countModel.php
app/models/statistics/statistics_missionModel.php
app/models/statistics/statisticsModel.php
app/models/statistics/statistics_playlist_playModel.php
app/models/statistics/statistics_roundModel.php
app/models/statistics/statistics_taskModel.php
app/models/storageModel.php
app/models/task_statModel.php
app/models/user_boosterModel.php
app/models/user_daily_actionsModel.php
app/models/user_game_ask_bufferModel.php
app/models/user_gameModel.php
app/models/userModel.php
app/models/user_ordersModel.php
app/models/user_playlistModel.php
app/models/user_playlist_setModel.php
app/models/user_roundModel.php
app/models/user_taskModel.php
app/models/varModel.php
app/models/wordModel.php
app/models/word.php
collect_context.py
common.php
conf
conf/config_my.php
conf/config.php
conf/config.php.2016.06.22.bak
conf/config.php.2017.04.17.bak
conf/config.php.2019.01.29.bak
conf/config.php.2019.01.31.bak
conf/config.php.2019.08.26.bak
crossdomain.xml
index_admin.php
index_cback_od.php
indexcback.php.php
index_cback_vk.php
index_for_debug.php
index_for_watch.php
index_notification_od_all.php
index_notification_od_one.php
index.php
index.php.bak
index_server_add_money.php
index_server_cache_flush.php
index_server_script.php
index_server_script_test.php
index_server_send_mail_to_all.php
lib
lib/__cache_included.php
lib/cache.php
lib/__cache_unincluded.php
lib/common.php
lib/db.php
lib/errors.php
lib/inputParser.php
lib/jsonCoder.php
lib/jsonView.php
lib/log_crash.php
lib/log.php
lib/notifications.php
lib/social
lib/social/abstractDriver.php
lib/social/odDriver.php
lib/social/odDriver.php_2019.08.26.bak
lib/social/odnoklassDriver.php
lib/social/social.php
lib/social/vkDriver.php


================================================================================
ФАЙЛ: index_notification_od_one.php
================================================================================

<?php

require ("common.php");
//22222222222 

LOG::printLine();
LOG::printDate();
LOG::printText("server_script_start");
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
ignore_user_abort();
set_time_limit(36000);
$response = array();



$socialId = SOCIAL_ID;


$aCommand ['uid'] = 518141720992;
social::$authAPI = social::get(SConfig::$social [$socialId] ['name'], SConfig::$social [$socialId] ['apiId'], SConfig::$social [$socialId] ['apiSecret'], $aCommand ['uid']);
   

try {
    
    //social::$authAPI->sendMass("123");
    social::$authAPI->sendSimple(518141720992, "Проверка 123");
 
    
    LOG::printText('timerModel:sendNotificationTask()_begin');  
         
          $aNotificationList = Model::factory('notification')->getList(array('flag_send' => 0), array('id'));
          $countNotSendNotif = count($aNotificationList);
          
          if($countNotSendNotif > 0 )
          {
              //РїРѕСЃР»Р°С‚СЊ РїРµСЂРІРѕРµ
              $aNotificationRecord =  $aNotificationList[0];
              $aNotification       =  Model::factory('notification', $aNotificationRecord['id'])->get();
              $massage             =  $aNotification['text'];
              
              $aNotification['flag_send'] = 1;
              Model::factory('notification')->create($aNotification);
              LOG::printText("timerModel:sendNotificationTask() | massage = $massage");
              
              //----------------    
              //$res = social::$authAPI->sendAll($massage); 
              $response = social::$authAPI->sendNotif(518141720992, $massage);
              //$response = social::$authAPI->sendNotif(189796475794, $massage);
              //----------------
               echo "sendNotif : OK (".$date.")";
          } 
          else
          {
              LOG::printText("timerModel:sendNotification() | send_error");  
          }
          
          LOG::printText('timerModel:sendNotification()_end');  
   
} catch (Exception $e) {
    errors::$errorQueue [] = array('modul', $e->getMessage(), $e->getCode());
}
if (notifications::exist()) {
    $response = array_merge($response, notifications::getList());
}
if (count(errors::$errorQueue) > 0) {
    $response = array_merge($response, errors::$errorQueue);
}
$viewClass = SConfig::$defaultView . "View";

$view = new $viewClass ();
$view->display($response);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
LOG::printText("server_script_end");
LOG::printDate();
LOG::printLine();
LOG::printLine();
//$viewClass = SConfig::$defaultView . "View";
//$view = new $viewClass ();
//$view->display ( $response );
//fclose( $f); 
?>


================================================================================
ФАЙЛ: conf/config.php
================================================================================

<?php

//-------------------------------------------------------------------------
//имя базы данных
define ( "DB_NAME", "gems_island_od" );
//-------------------------------------------------------------------------
//имя пользователя 
define ( "DB_USER", "user_gi_od" );
//-------------------------------------------------------------------------
//пароль пользователя 
define ( "DB_PASS", "k5ad_cpn5v78_od" );
//-------------------------------------------------------------------------
//хост доступа к БД
#define ( "DB_HOST", "95.183.12.8" );
define ( "DB_HOST", "localhost" );
//-------------------------------------------------------------------------
//порт доступа к БД
define ( "DB_PORT", "3306" );
//-------------------------------------------------------------------------
define ( "DB_PREF", "" );
define ( 'DB_EXCEPTION', true );

//-------------------------------------------------------------------------
//адрес кеша
define ( 'CACHE_SERVER', '127.0.0.1' );
//-------------------------------------------------------------------------
//порт кеша
define ( 'CACHE_PORT', '11211' );
//-------------------------------------------------------------------------
//префикс таблиц в кеше 
define ( 'CACHE_PREFIX', 'gems_island_od_' );
//-------------------------------------------------------------------------
//номер социальной сети:
//1 - vk
//2 - fb
//3 - mw
//4 - od
define ( 'SOCIAL_ID', 4);
//-------------------------------------------------------------------------


//-------------------------------------------------------------------------
//внутренний ключ приложения, зашитый на сервере и на клиенте и добавляемый 
//во всех запросах к подписи(сигнатуре):  
define ( 'INTERNAL_SECRET_KEY', '6432E5A2816E17227A52E6DC');
//-------------------------------------------------------------------------

//
define ( 'PATH_TO_IMAGE_GOLD', 'http://testsite.ru/money.png' );


//------------------------------------------------------------------------------------------------------------------------------------
//инидтификационный номер приложения в соц.сети
define ( 'APP_ID', 1131444224  );
//access token
define ( 'ACCESS_TOKEN', '35');   //access_token
//секретный ключ приложения
define ( 'CLIENT_SECRET', '85C75FAD094DA642BDE6311B'); 

define ( 'APP_KEY', 'CBAJHBHEEBABABABA' );

SConfig::$social = array (
1 => array ('name' => 'vk',         'apiId' => 'XX',      'apiSecret' => 'YY' ),  
2 => array ('name' => 'fb',         'apiId' => 'XX',      'apiSecret' => 'YY' ), 
3 => array ('name' => 'mw',         'apiId' => 'XX',      'apiSecret' => 'YY' ),
4 => array ('name' => 'od',         'apiId' => '1131444224',      'apiSecret' => '85C75FAD094DA642BDE6311B',    'apiPublic' => 'CBAJHBHEEBABABABA' ) );

//тестовое ли приложение или боевое
//параметр для удобства отладки
Sconfig::$test_flag              = true;
//------------------------------------------------------------------------------------------------------------------------------------
//Включает/выключает использование ключа ессии при обработки запросов
Sconfig::$session_key_flag       = false;
//------------------------------------------------------------------------------------------------------------------------------------
//Включает/выключает уникальную подпись при обработки запросов 
Sconfig::$request_signature_flag = false;  
//------------------------------------------------------------------------------------------------------------------------------------
//Включает/выключает логи начисления/списания валют                
Sconfig::$log_money_flag         = true;                
//------------------------------------------------------------------------------------------------------------------------------------

define ( 'PRODUCTION', true );


================================================================================
ФАЙЛ: conf/config_my.php
================================================================================

<?php

//-------------------------------------------------------------------------
//имя базы данных
define ( "DB_NAME", "okeania_od" );
//-------------------------------------------------------------------------
//имя пользователя 
define ( "DB_USER", "user_okeania_od" );
//-------------------------------------------------------------------------
//пароль пользователя 
define ( "DB_PASS", "k5ed_r7n3o87_od" );
//-------------------------------------------------------------------------
//хост доступа к БД
define ( "DB_HOST", "localhost" );
//-------------------------------------------------------------------------
//порт доступа к БД
define ( "DB_PORT", "3306" );
//-------------------------------------------------------------------------
define ( "DB_PREF", "" );
define ( 'DB_EXCEPTION', true );

//-------------------------------------------------------------------------
//адрес кеша
define ( 'CACHE_SERVER', '127.0.0.1' );
//-------------------------------------------------------------------------
//порт кеша
define ( 'CACHE_PORT', '11211' );
//-------------------------------------------------------------------------
//префикс таблиц в кеше 
define ( 'CACHE_PREFIX', 'okeania_od_' );
//-------------------------------------------------------------------------
//номер социальной сети:
//1 - vk
//2 - fb
//3 - mw
//4 - od
define ( 'SOCIAL_ID', 4);
//-------------------------------------------------------------------------


//-------------------------------------------------------------------------
//внутренний ключ приложения, зашитый на сервере и на клиенте и добавляемый 
//во всех запросах к подписи(сигнатуре):  
define ( 'INTERNAL_SECRET_KEY', '4C842C496A934977D0B2DE98');
//-------------------------------------------------------------------------

//
define ( 'PATH_TO_IMAGE_GOLD', 'http://testsite.ru/money.png' );


//------------------------------------------------------------------------------------------------------------------------------------
//инидтификационный номер приложения в соц.сети
define ( 'APP_ID', 188462336  );
//access token
define ( 'ACCESS_TOKEN', '35');   //access_token
//секретный ключ приложения
define ( 'CLIENT_SECRET', '4C842C496A934977D0B2DE98'); 

define ( 'APP_KEY', 'CBAIICPNABABABABA' );

SConfig::$social = array (
1 => array ('name' => 'vk',         'apiId' => 'XX',      'apiSecret' => 'YY' ),  
2 => array ('name' => 'fb',         'apiId' => 'XX',      'apiSecret' => 'YY' ), 
3 => array ('name' => 'mw',         'apiId' => 'XX',      'apiSecret' => 'YY' ),
4 => array ('name' => 'od',         'apiId' => '217155328',      'apiSecret' => '4C842C496A934977D0B2DE98',    'apiPublic' => 'CBAIICPNABABABABA' ) );

//тестовое ли приложение или боевое
//параметр для удобства отладки
Sconfig::$test_flag              = true;
//------------------------------------------------------------------------------------------------------------------------------------
//Включает/выключает использование ключа ессии при обработки запросов
Sconfig::$session_key_flag       = true;
//------------------------------------------------------------------------------------------------------------------------------------
//Включает/выключает уникальную подпись при обработки запросов 
Sconfig::$request_signature_flag = true;  
//------------------------------------------------------------------------------------------------------------------------------------
//Включает/выключает логи начисления/списания валют                
Sconfig::$log_money_flag         = true;                
//------------------------------------------------------------------------------------------------------------------------------------

define ( 'PRODUCTION', true );


================================================================================
ФАЙЛ: index.php
================================================================================

<?php   
require ("common.php");    //Подключаются библиотеки и основыне классы
header('Content-type: text/html');
header('Access-Control-Allow-Origin: *');
$response = array ();
    $TYPE_APPLYCATION = Sconfig::$test_flag;
    $sVisualKey = rand(1000, 9999);
                            
    $data      = $_REQUEST['m'];
    //------------------------------------------------------------------------------------------
    //------------------------------------------------------------------------------------------
    //------------------------------------------------------------------------------------------
    //подпись для каждого запроса:
    if(true == Sconfig::$request_signature_flag){
        
        //вынести этот параметр в конфигурационный файл
        $sKeySig = INTERNAL_SECRET_KEY;
                        
        //$sSig = md5(strtolower($_REQUEST['m']).$sKeySig);
        $sSig = md5( Model::factory("word")->strtolower_rus($_REQUEST['m']).$sKeySig);
       
        //setlocale(LC_ALL, 'ru_RU.CP1251');
        //$c = strtoupper(  $_REQUEST['m'] );
        //$c = Model::factory("word")->convert_to_in( $_REQUEST['m'] );
        //$sSig = md5( mb_strtolower( $c ).$sKeySig );
        
        $keyClient = $_REQUEST['k'];
           
        $sPiceMd5 = substr($sSig,0,15); 
        if(0 != strcmp( $sPiceMd5, $keyClient )){
            die("Invalid COD private key from string"); 
        }
    } 
    //------------------------------------------------------------------------------------------
    //------------------------------------------------------------------------------------------
    //------------------------------------------------------------------------------------------
   
    $aComp = explode("|||", $data);
    $aCommand = array();
    $aCommand['m'] = array();
    
    for( $Index = 0; $Index < count( $aComp); $Index++ )
    {
        $Command = explode("||", $aComp[$Index]);  
        if( $Command[0] != "m")
        {
            $aCommand[ $Command[0] ] = $Command[1];
        }
        else
        {
            if( ! array_key_exists( $Command[1], $aCommand['m']) )
                $aCommand['m'][ $Command[1]] = array();
            $aCommand['m'][ $Command[1]][ $Command[2]] = $Command[3];
        } 
    }
 
/* Парсим входящие данные */
try 
{       
    $uid_1 = 0;
    $u = $aCommand ['uid'];
    $a = $aCommand ['auth_key'];
    if (! isset ( $aCommand ['uid'] ) ){
        errors::exc ( errors::errorIncorrectInput, 'Wrong auth' );
    }
    $s_key = "";    
    $socialId = SOCIAL_ID;
    $uid_1 = $aCommand ['uid'];  
    if (! isset ( SConfig::$social [$socialId] ) || ! $aCommand ['uid'])
    {
        $uid_1 = $aCommand ['uid'];
        errors::exc ( errors::errorIncorrectInput, 'Cant find social network' );
    }    
    $ip = new inputParser ( $aCommand );
                            
    $user = Model::factory ( 'user', $uid_1 );
    while ( $cmd = $ip->getCmd () ) 
    { 
        if (is_array ( $cmd )) 
        {
            $ca = $cmd [0];
            
            $args = JsonCoder::jsonDecode( $cmd [1], true );
            //$args = json_decode ( $cmd [1], true );

            $ca2 = explode ( ".", $ca );
            
            if (count ( $ca2 ) == 2) {
                $controller = $ca2 [0] . "Controller";
                $action = $ca2 [1] . "Action";
            } 
            else if (count ( $ca2 ) == 1){
                $controller = "indexController";
                $action = $ca2 [0] . "Action";
            } 
            else {
                $response [] = array ($ca, '', errors::errorIncorrectCommand );
                continue;
            }

            if (class_exists ( $controller )){ 
                //Если контроллер существует
                $ctrl = new $controller ( $user );
                if (method_exists ( $ctrl, $action )){
                // Если действие существует
                    try {
                        $id = $uid_1;
                        if (
                            //strtolower ( $ca ) != 'user.saveprofile' &&
                            strtolower ( $ca ) != 'user.new_user'        &&                        
                            strtolower ( $ca ) != 'description.get_data' && 
                            strtolower ( $ca ) != 'user.init'            &&
                            strtolower ( $ca ) != 'general.get_data'            
                            ) //initial commands - always miss them   
                        {
                            $answer = $ctrl->user->checkExist ();    //if return "-1" => user is not created
                            if($answer == -1){
       
                            }
                            if(Sconfig::$session_key_flag == TRUE){
                                $ctrl->user->checkSessionKey( $aCommand ['s_key'] );
                                $s_key = $aCommand ['s_key'];
                            }
                        }
                        else
                        {
                        }

                        $response [] = array ($ca, $ctrl->$action ( $args ) );
                        $id_user  = $uid_1;
                        $stringCA = strtolower ( $ca );
                        $id = $uid_1;
                        if(strtolower ( $ca ) == 'user.new_user'  ||  strtolower ( $ca ) == 'user.init'){
                              if(Sconfig::$session_key_flag == TRUE){
                                  $s_key =  $response[0][1]['s_key'];
                              }
                        }
                        else if(strtolower ( $ca ) == 'general.get_data' ){
                        }                                                                                                       
                        else{
                        }
                    } 
                    
                    catch ( Exception $e ){ 
                        //Обертка эксепшеном контроллера для того чтобы очередь команд не прерывалась
                        $response [] = array ($ca, $e->getMessage (), $e->getCode () );
                    }
                } 
                else{
                // Если действие не существует
                    $response [] = array ($ca, '', errors::errorNoAction );
                }
            } 
            else 
            {
            //Если контроллер не существует
                $response [] = array ($ca, '', errors::errorNoController );
            }
        } 
        else 
        {
            $response [] = array ('', $cmd, errors::errorUnknown );
        }
    }
} 
catch ( Exception $e ){ 
    //Эксепшен для всего остального(работа с соц.апи, очередью команд)
    
   // errors::$errorQueue [] = array ('', $e->getMessage (), $e->getCode () );
    errors::$errorQueue [] = array ('', $e->getMessage (), $e->getCode () );
}

if (notifications::exist ()){
    $response = array_merge ( $response, notifications::getList () );
}

if (count ( errors::$errorQueue ) > 0){
    $response = array_merge ( $response, errors::$errorQueue );
}
       
$viewClass = SConfig::$defaultView . "View";
$view = new $viewClass ();
$view->display ( $response );

?>


================================================================================
ФАЙЛ: index_server_script.php
================================================================================

<?php   
                                 
require ("common.php");   
//22222222222 

LOG::printLine();  
LOG::printDate();
LOG::printText("server_script_start");
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  ignore_user_abort ();
  set_time_limit ( 36000 );
  $response = array ();
  
  
     
  $socialId = SOCIAL_ID;
  
  
  $aCommand ['uid'] = 147784953;
  social::$authAPI = social::get ( SConfig::$social [$socialId] ['name'], SConfig::$social [$socialId] ['apiId'], SConfig::$social [$socialId] ['apiSecret'], $aCommand ['uid'] );
    
    //-------------------------------------------------------------------------------------------------------------------
    //Controller
    //----------
        
    /*
    $ip = new inputParser ( $aCommand );

    $user = Model::factory ( 'user', social::$authAPI->getUserId () );
    
    $ca  = "timer.check";
    $ca2 = explode ( ".", $ca ); 
            
    $controller = $ca2 [0] . "Controller";
    $action     = $ca2 [1] . "Action";
             
    LOG::printText("$controller");   
    LOG::printText("$action");   
                                                  
    if (class_exists ( $controller )) 
    { 
       $ctrl = new $controller ( $user );
             
       if (method_exists ( $ctrl, $action )) 
       { 
           $response [] = array ($ca, $ctrl->$action ( $args ) );
       } 
    }

    */
    
    //----------
    //Controller
    //-------------------------------------------------------------------------------------------------------------------
    //social::$authAPI->sendHello(147784953);     
    //TEST FUNCTIONS
    //-------------------------------------------------------------------
    //-------------------------------------------------------------------
    //Model::factory('timer')->scriptReInitAccessGroops_2012_12_18();
    //Model::factory('timer')->scriptReInitAccessGroops(25000);
    //Model::factory('timer')->scriptSanta_2013_01_10();   

    try{
       
       if(1){ 
            //$aNotificationList = Model::factory('notification')->getList(array('flag_send' => 0), array('id'));
           $aNotificationList = Model::factory('notification')->getList();
       }
       
       if(0){ 
           $user_id         =  518141720992; 
           $a = Model::factory("user", $user_id)->initUser();
       }
       
       if(0){ 
           $user_id         =  100200300; 
           $a = Model::factory("stage")->getStageActualTime($user_id);
       }
       //$a = Model::factory("user", 100200300)->initUser();
       
       //stageStart($user_id, $stage_stat_id, $cost_type)
       //---------------------------------------------------------------------------------------
       //проверка: поиск предыдущего этапа
       //getPreviousStage( $user_id, $stage_stat_id, &$arr_previous_stage_stat = array())
       if(0){
           $arr_previous_stage_stat = array();
           $a = Model::factory("stage")->getPreviousStage( 100200300, 0, $arr_previous_stage_stat );
       }
       //---------------------------------------------------------------------------------------
       if(0){
           $arr_previous_stage_stat = array();
           $user_id         =  100200300;
           $company_stat_id = 0;
           $arr_company     = array();
           $a = Model::factory("company")->createCompany(100200300, $company_stat_id, $arr_company);
       }
       //---------------------------------------------------------------------------------------
       //запуск нового этапа
       //stageStart($user_id, $stage_stat_id, $cost_type)
       if(0){
           $user_id =  100200300;
           $stage_stat_id = 0;
           $cost_type = 2; // ключи   0 0- ключи, 1 - время, 3 - money 1  
           $a = Model::factory("stage")->stageStart($user_id, $stage_stat_id, $cost_type);
       }
       //---------------------------------------------------------------------------------------
       
       
       
       
       //---------------------------------------------------------------------------------------
       //проверка начисления опыта
       if(0){
           $user_id     = 100200300;
           $reason_id   = 10;
           $exp         = 100;
           $a = Model::factory("user", $user_id)->changeExp($exp, $reason_id);
       }
       
       
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       //запуск миссии
       //startMission($user_id, $mission_stat_id)
       if(0){
           $user_id         =  100200300;
           $mission_stat_id = 2;
           $a = Model::factory("mission")->startMission($user_id, $mission_stat_id);
       }
       
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       
       //запуск миссии
       //startMission($user_id, start_key, point)
       if(0){
           $user_id         = 100200300;
           $start_key       = 77245;
           $point           = 180;
           $a = Model::factory("mission")->endMission($user_id, $start_key, $point);
       }
       //--------------------------------------------------------------------------------------- 
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       
       
       //покупка товаров за соц. валюту
       //endMission($user_id, start_key, point)
       if(0){         
           $uid            = 100200300;
           $item_id        = 20;
           $item_price     = 20;
           $a = Model::factory("shop")->buyGoods( $uid, $item_id, $item_price);   
       }
       //--------------------------------------------------------------------------------------- 
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       
       
       //попросить у друга подарок
       //askGift($user_from, $user_to, $type, $count);
       if(0){         
           $user_from      = 100200301;
           $user_to        = 100200300;
           $type           = 1;
           $count          = 1;
           $a = Model::factory("gift")->askGift($user_from, $user_to, $type, $count);
       }
       //--------------------------------------------------------------------------------------- 
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       
       //послать другу подарок
       //sendGift($user_from, $user_to, $type, $count, $ask_id);
       if(0){         
           $user_from      = 100200301;
           $user_to        = 100200300;
           $type           = 1;
           $count          = 1;
           $ask_id         = 13561;
           $a = Model::factory('gift')->sendGift($user_from, $user_to, $type, $count, $ask_id);
       }
       //--------------------------------------------------------------------------------------- 
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       
       //забрать присланный другом подарок
       //sendGift($user_from, $user_to, $type, $count, $ask_id);
       if(0){     
           $user_to         = 100200300; // $user_id = $user_to т.к. это тот игрок который забирает подарок    
           $gift_id         = 13561;
           $a = Model::factory('gift')->getGift($user_to, $gift_id);
       }
       //--------------------------------------------------------------------------------------- 
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       
       //обновить данные о подарках
       //sendGift($user_from, $user_to, $type, $count, $ask_id);
       if(0){     
           $user_id         = 100200300; // $user_id = $user_to т.к. это тот игрок который забирает подарок    
           $a = Model::factory('gift')->refreshGift($user_id);
       }
       //--------------------------------------------------------------------------------------- 
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       if(0){  
           $user_id            = 100200300; 
           $user_inviter_id    = 100200301; 
           Model::factory('user', $user_id)->acceptInvitation($user_inviter_id);
       }
       //--------------------------------------------------------------------------------------- 
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       
       if(0){     
           $user_id            = 100200300; 
           $user_inviter_id    = 100200301;    
           $friend_bonus_list = array();
           Model::factory('user', $user_id)->checkInvitation( $friend_bonus_list );
           $result['friend_bonus_list']      = $friend_bonus_list;
       }
       //--------------------------------------------------------------------------------------- 
       //---------------------------------------------------------------------------------------
       //---------------------------------------------------------------------------------------
       
       $a = 10;
       
       
       
       //$a = Model::factory("mission")->startMission(100200300, 0);
       
       
       //"mission_stat_id":2, "start_key":775723, "point":200
       //$a = Model::factory("mission")->endMission(100200300, 940521, 200);
       
       
       
       //$a = Model::factory("mission")->stageKeyAsk(100200300, 100200301, 1);
       //$a = Model::factory("mission")->stageKeySend(100200301, 1);
       
       
       
       //$a = Model::factory("mission")->startMission(100200300, 2);
       //$a = Model::factory("mission")->endMission(100200300, 511854, 200);
       
       //$a = Model::factory("mission")->checkStageTime(100200300, 0);
       //$a = Model::factory("mission")->checkStageTime(100200301, 0, 0);
       //$a = Model::factory("mission")->checkCompliteStage( 100200300, 0 );
       //$a = Model::factory("stage")->giveStageKeyToNewUser( 100200300 );
       
       $a = 10;
       //Model::factory("user_task")->getRightSign(100200300, 42, &$sign);
     
       //http://195.208.224.103/test/wp/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.initialization|||m||0||1||{%22user_target_id%22:100200301}ia 
       //http://195.208.224.103/test/wp/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.get_start_data|||m||0||1||{%22game_id%22:5}
       //http://195.208.224.103/test/wp/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.start|||m||0||1||{%22game_id%22:5,%20%22playlist_id%22:1}
       //http://195.208.224.103/test/wp/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.end|||m||0||1||{"game_id":5,"playlist_id":1,"start_round_key":579259,"answer0":"Привет","time0":20}
       //--------------------------------------------------------------------------------------------------------------------------------------------------------------
        
       //$response [] = Model::factory('user', 3074750)->findRivals(3);
       //$response [] = Model::factory('user_playlist')->use_playlist(3074750, 1);
       // $response [] = Model::factory('user_playlist')->(3074750, 1);
        
       //$res = array();
       //Model::factory('timer')->check();  
    
    }  
catch ( Exception $e ){                               
    errors::$errorQueue [] = array ('modul', $e->getMessage (), $e->getCode () );
}
if (notifications::exist ()) {
    $response = array_merge ( $response, notifications::getList () );
}
if (count ( errors::$errorQueue ) > 0) {
    $response = array_merge ( $response, errors::$errorQueue );
}
$viewClass = SConfig::$defaultView . "View";

$view = new $viewClass ();
$view->display ( $response );

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
LOG::printText("server_script_end");
LOG::printDate();
LOG::printLine();  
LOG::printLine();  
//$viewClass = SConfig::$defaultView . "View";
//$view = new $viewClass ();
//$view->display ( $response );

//fclose( $f); 
?>


================================================================================
ФАЙЛ: app/controllers/lotteryController.php
================================================================================

<?php

/**
 * Лотерея (колесо фартуны)
 * 
 * Колесо фартуны состоит из секторов, каждый из которых содержит описание приза, выдающегося пользователю по результатам использования лотереи.
 * Список возможных призов приводится в табл. lottery_stat, число секторов определяется в vars.lottery_sector_count и не может быть больше 8. 
 * Какой именно шаблон колеса фартуны (запись из табл. lottery_stat) используется в текущий момент определено в константе vars.lottery_active_id.
 * Выйгрышный сектор подбирается случайно с равной вероятностью для любого сектора. 
 * D табл. lottery_stat: sector_N_type, sector_N_count, sector_N_extra - это информация о секторе N. 
 * - sector_N_type - задает тип призовых ресурсов:
 * - sector_N_type = 0 выдается money1  в колличестве sector_N_count
 * - sector_N_type = 1 выдается энергия в колличестве sector_N_count
 * - sector_N_type = 2 выдается бустер в колличестве sector_N_count, тип бустера определяется в sector_N_extra;
 * - sector_N_type = 3 выдается exp в колличестве sector_N_count
 * - sector_N_type = 4 разрешается выполнить какое-то запланированное действие на клиенте, где id действия клиента определяется в , тип бустера определяется в sector_N_extra
 * 
 * <b>Пример использования (значения табл. lottery_stat):</b>
 * 
 * - sector_0_type = 2 ( 2й тип, бустер)
 * - sector_0_count = 2 (количество бустеров, два бустера)
 * - sector_0_extra = 1 (тип бустера это id из таблицы booster_stat)
 * 
 * - sector_1_type = 2 ( 2й тип,  бустер)
 * - sector_1_count = 3 (три бустера)
 * - sector_1_extra = 2 (тип бустера это id из таблицы booster_stat)
 * 
 * - sector_2_type = 1 (1й тип, энерия/жизни)
 * - sector_2_count = 3 ( три жизни жизнь)
 * - sector_2_extra = -1 (не имеет значение что в этом поле)
 * 
 * - sector_3_type = 0 (0й тип, значит money1)
 * - sector_3_count = 5 (пять money1)
 * - sector_3_extra = -1 (не имеет значение что в этом поле)
 * 
 * - sector_4_type = 0 (0й тип, значит money1)
 * - sector_4_count = 10 (десять money1)
 * - sector_4_extra = -1 (не имеет значение что в этом поле)
 * 
 * 
 * <br>В качестве платы за лотереию используется money1 и money2 (при соотвествующих аргументах функции lottery.lottery_use)
 * 
 * <br>Валюта money2 ассациируется с лотерей(в рамках текущей игры) и может применятся клиентом как валюта единственно предназначение которой - плата за запуск лотереи.
 * <br>Валюта money2 может быть выдана пользователю следующими спосбовами: 
 * - 1) получена раз в день: в зависимости от константы var.lottery_recovery_system может по-разному восполнятся (см. ниже описание константы);
 * - 2) получена в рамках выдачи ежедневного бонуса 
 * - 3) получена за событие
 * - 4) куплена за валюту соц сети. 
 * - 5) получена за приглашенного друга
 * 
 * константы, используемые в лотереи:
 * в табл. var:
 *  -  (int)     lottery_active_id               : id из табл.lottry_stat, какой именно шаблон (строка из таблицы) используется в текущий момент
 *  -  (int)     lottery_sector_count            : сколько секторов задействовано в лотереи ( число должно быть < 8 ), в табл.lottry_stat могут быть описаны 8 секторов, текущая константа ограничивает количество секторов из табл.lottry_stat которые используются на текущий момент
 *  -  (int)     lottery_recovery_system         : способ начисления money2, за которые можно запустить лотерю(
 *  -  +  0 : money2 не восстанавливается сама по себе никогда |
 *  -  +  1 : money2 восстанавливается раз в день, в момент первого захода пользователя в игру, но только если в этот момент money2 == 0 |
 *  -  +  2 : money2 всегда увеличивается на 1 во время первого захода пользователя в игру)
   
 */
 
class lotteryController extends abstractController {

      /**
     * 
     * Запус лотереи (колеса фартуны)
     * 
     * Список возможных призов приводится в табл. lottery_stat, число секторов определяется в vars.lottery_sector_count и не может быть больше 8.
     * Какой именно шаблон колеса фартуны используется в текущий момент определено в vars.lottery_active_id
     * Выйгрышный сектор подбирается случайно с равной вероятностью для любого сектора.
     *  
     * 
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||76258602678|||s_key||-1|||m||0||0||lottery.lottery_use|||m||0||1||{"cost_type":1}
     * </code> 
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["lottery.lottery_use",{"result":1,"cost_type":1,"prize_sector_number":3,"prize":{"booster_type":0,"booster_count":0,"money1":0,"exp":"10","energy":0}}]]
     * </code>
     * 
     * 
     * @param Object Входные данные. Объект с множеством свойств имя/значение:
     * - (int)   <b>  сost_type  </b>  :   0 - money1, 1- money2  
     //(2- валюта соц сети - только для сервера)
     * 
     *    
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     * 
     */
    public function lottery_useAction($args){ 
       try{
           
             $cost_type = -1;  
             if(TRUE == isset($args["cost_type"])){
                $cost_type = $args["cost_type"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_inviter_id not exist" ); 
             }
    
           return Model::factory("lottery")->useLottery( $this->user->id, $cost_type);
    
       } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "lotteryController", "lottery_use", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
       }
    } 

   
}

================================================================================
ФАЙЛ: app/controllers/eventController.php
================================================================================

<?php

/**
 * Event (События)
 */
 
class eventController extends abstractController {

    
    /**
    * Проверить конкретное событие
    * 
    * Проверить событие
    * Тип события: 0 - ежедневное событие, повторное использование которого возможно после 00:00 следуещего дня
    * в случае, если в event_stat.enable_flag = 0, событие считается выключеным и не доступным, при попытки check такое событие вернется -2
    * в случае, если в event_stat.replay_flag = 1 и при этом event_stat.type_id = 0, событие является одноразовым и после первого использования становится недоступным, при попытки check такое событие вернется -3
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200301|||s_key||-1|||m||0||0||event.use|||m||0||1||{"event_stat_id":0}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["event.check",{"result":1,"event_stat_id":0,"event":{"id":"0","event_stat_id":"0","time_to_use":0}}]]
    * </code>
    * 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:

    *  -  (int)     <b>  event_stat_id       </b>  :  порядковый номер события из таблицы event.stat
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка
    *  -  (int)     event_stat_id          :  порядковый номер события из таблицы event.stat
    *  -  (Object)  event                  :Объект с множеством свойств имя/значение:  
    *  -  -  (int)     time_to_use         : сколько времени до следующего использования (в секундах)
    */                                          
    public function checkAction( $args ){
         try{
                                                                                           
             
             $user_id  = $this->user->id; 
              
             $event_stat_id      = -1;  
             if(TRUE == isset($args["event_stat_id"])){
                $event_stat_id = $args["event_stat_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"event_stat_id not exist" ); 
             }
             
             $arr_event = array();
             $result = Model::factory("event")->checkActual( $user_id, $event_stat_id, $arr_event);
             
             switch($result){
                 case 1:{
                     return array("result" => 1, "event_stat_id" => $event_stat_id, "event" => $arr_event); 
                 } break;
                 case 0:{
                     return array("result" => 0, "event_stat_id" => $event_stat_id, "event" => $arr_event); 
                 } break;
                 case -2:{
                     return array("result" => -2, "text" => "event disable");  
                 } break;
                 case -3:{
                     return array("result" => -3, "text" => "one time event, already use");  
                 } break;
                 default:{
                     return array("result" => -1, "text" => "");  
                 } break;
             }
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "giftController", "sendAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
         }
     }
    
      /**
    * Проверить все события
    * 
    * Тип события: 0 - ежедневное событие, повторное использование которого возможно после 00:00 следуещего дня
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200301|||s_key||-1|||m||0||0||event.refresh|||m||0||1||{}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>        
    * [["event.refresh",{"result":1,"arr_event":[{"event_stat_id":"0","time_to_use":77299}]}]]
    * </code>
    * 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (Object)  arr_event              : Список событий доступных игроку. Массив объектов, каждый объект которого содержит следующие свойства: :  
    *  -  -  (int)     event_stat_id       : порядковый номер события из таблицы event.stat
    *  -  -  (int)     time_to_use         : сколько времени до следующего использования (в секундах)
    */                                          
    public function refreshAction( $args ){
         try{
                                                                                           
             
             $user_id  = $this->user->id; 
             
             $arr_all_event = array();
             if(!Model::factory("event")->refreshAll( $user_id, $arr_all_event)){
                 return array("result" => 0, "arr_event" => $arr_all_event); 
             }
             
                 return array("result" => 1, "arr_event" => $arr_all_event); 
             //return array("result" => 1, "gift" => $gift);
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "giftController", "sendAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
         }
     } 
     
   /**
    * Использовать событие
    * 
    * Тип события: 0 - ежедневное событие, повторное использование которого возможно после 00:00 следуещего дня
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200301|||s_key||-1|||m||0||0||event.use|||m||0||1||{"event_stat_id":0}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["event.use",{"result":1,"event_stat_id":0,"event":{"time_to_use":21681},"prize":{"money1":"100","money2":0,"energy":"1","booster_type":"0","booster_count":"1"}}]]
    * </code>
    * 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:

    *  -  (int)     <b>  event_stat_id       </b>  :  порядковый номер события из таблицы event.stat
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "1" - событие уже использовано, нужно подождать время восстановления, "-x" - ошибка;
    *  -  (int)     event_stat_id          :  порядковый номер события из таблицы event.stat
    *  -  (Object)  event                  : Объект с множеством свойств имя/значение:  
    *  -  -  (int)     time_to_use         : сколько времени до следующего использования (в секундах)
    *  -  (Object)  prize                  : Приз за успешное использование события. Объект с множеством свойств имя/значение:  
    *  -  -  (int)     money1              : количество бонусой валюты1
    *  -  -  (int)     energy              : количество бонусой энергии
    *  -  -  (int)     booster_type        : тип призового бустреа
    *  -  -  (int)     booster_count       : количество призовых бустеров
    *  -  -  (int)     money2              : количество бонусой валюты2
    */                                          
    public function useAction( $args ){
         try{
                                                                                           
             
             $user_id  = $this->user->id; 
              
             $event_stat_id      = -1;  
             if(TRUE == isset($args["event_stat_id"])){
                $event_stat_id = $args["event_stat_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"event_stat_id not exist" ); 
             }
             
             $arr_event = array();
             $arr_prize = array();
             $result = Model::factory("event")->useEvent( $user_id, $event_stat_id, $arr_event, $arr_prize);
             
             switch($result){
                 case 1:{
                     return array("result" => 1, "event_stat_id" => $event_stat_id, "event" => $arr_event, "prize" => $arr_prize ); 
                 } break;
                 case 0:{
                     return array("result" => 0, "event_stat_id" => $event_stat_id, "event" => $arr_event, "prize" => $arr_prize);
                 } break;
                 case -2:{
                     return array("result" => -2, "text" => "event disable");  
                 } break; 
                 case -3:{
                     return array("result" => -3, "text" => "one time event, already use");  
                 } break;
                 default:{
                     return array("result" => -1, "text" => "");  
                 } break;
             }

         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "giftController", "useAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
         }
     }
   
}

================================================================================
ФАЙЛ: app/controllers/statisticsController.php
================================================================================

<?php

/**
 * Запись и получение статистической информации о игре
 *  
 */
 
class statisticsController extends abstractController {
    
}

================================================================================
ФАЙЛ: app/controllers/shopController.php
================================================================================

<?php

/**
 * @ignore
 * Попкупка товаров в игре
 * @link http://188.120.253.174/base/od/files/shop_scheme.png Схема таблиц базы данных игрового магазина. 
 *  
 */
 
class shopController extends abstractController {
    
    /**
    * Возвращает весь список товаров на продажу  
    * 
    * Возвращает весь список товаров на продажу 
    *
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||shop.get_price|||m||0||1||{}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["shop.get_price",{"result":1,"shop":{"shop_social_stat":[{"id":"0","buy_money1":"100","buy_money2":"10","buy_energy":"10","buy_booster_set":"0,1","buy_playlist":"","buy_promotion":"-1","cost_social_money":"1","description":"Валюта","image_path":"http://example.com/image.png"},{"id":"1","buy_money1":"155","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"2","description":"Валюта","image_path":"http://example.com/image.png"},{"id":"2","buy_money1":"270","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"1","description":"Валюта","image_path":"http://example.com/image.png"},{"id":"3","buy_money1":"580","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"4","buy_money1":"1200","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"5","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"6","buy_money1":"0","buy_money2":"0","buy_energy":"25","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"7","buy_money1":"0","buy_money2":"0","buy_energy":"40","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"8","buy_money1":"0","buy_money2":"0","buy_energy":"50","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"9","buy_money1":"0","buy_money2":"0","buy_energy":"100","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"10","buy_money1":"0","buy_money2":"0","buy_energy":"150","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"11","buy_money1":"0","buy_money2":"0","buy_energy":"200","buy_booster_set":"","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"12","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"1,2","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"13","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"2,3","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""},{"id":"14","buy_money1":"200","buy_money2":"0","buy_energy":"0","buy_booster_set":"1,2,3","buy_playlist":"","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":""}],"shop_money1_stat":[{"id":"0","count":"100","buy_way":"0","bonus_percent":"0","cost_money2":"0","visible_flag":"0","social_shop_id":"0"},{"id":"1","count":"155","buy_way":"1","bonus_percent":"5","cost_money2":"0","visible_flag":"0","social_shop_id":"1"},{"id":"2","count":"270","buy_way":"1","bonus_percent":"10","cost_money2":"0","visible_flag":"0","social_shop_id":"2"},{"id":"3","count":"580","buy_way":"1","bonus_percent":"15","cost_money2":"0","visible_flag":"0","social_shop_id":"3"},{"id":"4","count":"1200","buy_way":"1","bonus_percent":"20","cost_money2":"0","visible_flag":"0","social_shop_id":"4"},{"id":"5","count":"7000","buy_way":"0","bonus_percent":"70","cost_money2":"0","visible_flag":"0","social_shop_id":"5"}],"shop_money2_stat":[{"id":"0","count":"5","buy_way":"0","bonus_percent":"0","cost_money1":"10","visible_flag":"0","social_shop_id":"0"}],"shop_energy_stat":[{"id":"0","count":"10","buy_way":"0","bonus_percent":"0","cost_money1":"10","cost_money2":"0","visible_flag":"0","social_shop_id":"6"},{"id":"1","count":"20","buy_way":"0","bonus_percent":"5","cost_money1":"18","cost_money2":"0","visible_flag":"0","social_shop_id":"7"},{"id":"2","count":"30","buy_way":"0","bonus_percent":"0","cost_money1":"25","cost_money2":"0","visible_flag":"0","social_shop_id":"8"},{"id":"3","count":"40","buy_way":"0","bonus_percent":"0","cost_money1":"34","cost_money2":"0","visible_flag":"0","social_shop_id":"9"},{"id":"4","count":"50","buy_way":"0","bonus_percent":"0","cost_money1":"100","cost_money2":"0","visible_flag":"0","social_shop_id":"10"},{"id":"5","count":"60","buy_way":"0","bonus_percent":"0","cost_money1":"500","cost_money2":"0","visible_flag":"0","social_shop_id":"11"}],"shop_energy_max_stat":[{"id":"0","count":"5","buy_way":"0","bonus_percent":"10","cost_money1":"0","cost_money2":"0","visible_flag":"0","social_shop_id":"0"},{"id":"1","count":"10","buy_way":"10","bonus_percent":"0","cost_money1":"0","cost_money2":"0","visible_flag":"0","social_shop_id":"0"}],"shop_booster_stat":[{"id":"0","buy_booster_set":"0","buy_way":"1","cost_money1":"10","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"1","buy_booster_set":"1","buy_way":"1","cost_money1":"15","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"2","buy_booster_set":"2","buy_way":"1","cost_money1":"20","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"3","buy_booster_set":"3","buy_way":"1","cost_money1":"25","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"4","buy_booster_set":"4","buy_way":"1","cost_money1":"30","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"5","buy_booster_set":"5","buy_way":"1","cost_money1":"35","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"6","buy_booster_set":"6","buy_way":"1","cost_money1":"40","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"7","buy_booster_set":"7","buy_way":"1","cost_money1":"45","cost_money2":"0","visible_flag":"0","social_shop_id":"0"},{"id":"8","buy_booster_set":"8","buy_way":"1","cost_money1":"50","cost_money2":"0","visible_flag":"0","social_shop_id":"0"},{"id":"9","buy_booster_set":"9","buy_way":"1","cost_money1":"55","cost_money2":"0","visible_flag":"0","social_shop_id":"0"}],"shop_booster_set_stat":[{"id":"0","type":"0","count":"1"},{"id":"1","type":"1","count":"1"},{"id":"2","type":"2","count":"1"},{"id":"3","type":"3","count":"1"},{"id":"4","type":"4","count":"1"},{"id":"5","type":"5","count":"1"},{"id":"6","type":"6","count":"1"},{"id":"7","type":"7","count":"1"},{"id":"8","type":"8","count":"1"},{"id":"9","type":"9","count":"1"}],"shop_playlist_stat":[{"id":"0","buy_playlist":"0","buy_way":"0","cost_money1":"10","cost_money2":"7","visible_flag":"1","social_shop_id":"0"},{"id":"1","buy_playlist":"3","buy_way":"0","cost_money1":"30","cost_money2":"10","visible_flag":"1","social_shop_id":"1"},{"id":"2","buy_playlist":"3","buy_way":"0","cost_money1":"50","cost_money2":"15","visible_flag":"1","social_shop_id":"1"}],"shop_promotion_stat":[{"id":"0","buy_promotion":"0","buy_way":"1","cost_money1":"1000","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"1","buy_promotion":"1","buy_way":"1","cost_money1":"100","cost_money2":"0","visible_flag":"1","social_shop_id":"0"}]}}]]
    * </code> 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)   result                  : "1" - успех / "-x" - ошибка   
    *  -  (array)   shop_social_stat      : <b>цены продаваемые товары товара за валюту соц.сети</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     buy_money1                 : количество продоваемой Валюты1
    *  -  -  (int)     buy_money2                 : количество продоваемой Валюты2
    *  -  -  (int)     buy_energy                 : количество продоваемой Энергии
    *  -  -  (string)  buy_booster_set            : список указателей(через запятую) на запись в таблице (shop_booster_set_stat) с информацией о продоваемых бустерах 
    *  -  -  (int)     buy_promotion              : номер продоваемой акции  
    *  -  -  (int)     cost_social_money          : цена за товары в валюте соц сети
    *  -  -  (string)  description                : кратокое описание продоваемого товара(совокупности товаров)
    *  -  -  (string)  image_path                 : изображение соответствующее продоваемому товару(совокупности товаров)
    * 
    *  -  (array)   shop_money1_stat      : <b>цены для на продаваеомую валюту1</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     count                      : количество покупаемого товара
    *  -  -  (int)     bonus_percent              : бонус в процентах относительно наименее выгодной цены(информационное поле)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_money2_stat      : <b>цены на продаваемую Валюту2</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     count                      : количество покупаемого товара
    *  -  -  (int)     bonus_percent              : бонус в процентах относительно наименее выгодной цены(информационное поле)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    * *  -  (array)   shop_energy_stat      : <b>цены на продаваемую энергию</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     count                      : количество покупаемого товара
    *  -  -  (int)     bonus_percent              : бонус в процентах относительно наименее выгодной цены(информационное поле)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_energy_max_stat      : <b>цены на продаваеомые единиц увеличения максимальное число энергии</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     count                      : количество покупаемого товара
    *  -  -  (int)     bonus_percent              : бонус в процентах относительно наименее выгодной цены(информационное поле)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_booster_stat         : <b>цены на продаваемые бустеры</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (string)     buy_booster_set         : указатель на записи в таблице со списком покупаемых бустеров (табл.shop_booster_set_stat)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_booster_set_stat         : <b>тип и колличество бустера для продажи</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     type                       : тип бустрера
    *  -  -  (int)     count                      : количество 
    * 
    *  -  (array)   shop_promotion             : <b>цены на продаваемые действтия</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     buy_promotion              : продваемые действий/акции, вшито в коде  
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
   */ 
    public function get_priceAction(){
        try{ 
            return array("result" => 1,
                         "shop"   => Model::factory("shop")->getClientPrice());
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "shopController", "get_priceAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }   
}


================================================================================
ФАЙЛ: app/controllers/gameController.php
================================================================================

<?php

/**
 * @ignore
 * Механизмы проведения дуэли 
 * @link http://188.120.253.174/base/od/files/game_shame_knockout.png Порядкок запросов при дуэли 
 * @link http://188.120.253.174/base/od/files/game_data_base_knockout.png Архитектруда БД для модуля game
 * 
 */
 
class gameController extends abstractController {

    /*
    * <b>Т.к. в конкретной игре соперник требуется один, все что написано ниже можно проигнорировать. 
    * Однако, если требуется подобрать несколько соперников, ниже следует краткое описание поиска:</b>
    * 
    * <br> Поиск проиходит в следующей последовательности:
    * <br> Происходит поиск игроков-оппонентов, которые подходят по критерию времени посещения (заходившие игру между vars.search_game_time_visit_max и vars.search_game_time_visit_max секунд назад).
    * <br> При этом подбираются только те игроки у которых число входящих дуэлей больше допустимого для них максимума.
    * <br> Т.к. процесс поиска впринципе ресурсоемок, и при этом требуется обеспечить быстродействие, имеетются ограничения на число играков изначально проверяемых на соотвествия критериям подбора. В случае если таких играков на найденно в достаточном количестве, целенапрвалено игнорируется частичное или полное несоотвествие критериям поиска. 
    * <br> В случае если число найденных игроков-оппонентов меньше, чем vars.search_game_count, либо вообще никого не найдено, тогда ищутся любые игроки у которых есть свободные слоты входящих дуэлей без учета времени последнего времени посещения. Однако, в случае если несколько играков-оппанентов полностью подходят по критериям, и число таких играков >= args["rival_count"], функция будет возвращать именно их. 
    * <br> В случае если число играков-оппанентов подходящих по критериям, найдено меньше $rival_count, они будут на первых позицияx в возвращенном массиве id, а за ними будут следовть не подходящие по критериям 
    * <br> В случае если так никто и не найден выбираются $search_game_count любых игроков, с игнорированием числа исходящих у них дуэлей. 
    * <br> В случае если игроков найдено меньше чем vars.search_game_count выбирается столько, сколько найдено.
    */
   
    /**
    * Подыскивает подходящих игроков-соперинков для дуэли.
    * 
    * В данной игре требуется всего один игрок. Но можно предусмотрительно запросить несколько, если необходимо.
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.find_rivals|||m||0||1||{"rival_count":4}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["game.find_rivals",{"result":1,"rival_ids":["100200311","3074751","100200310","100200308"]}]]
    * </code> 
    * 
    *  
    * @param  Object  $args  Объект со свойством имя/значение:
    *  -  (int)   rival_count :  запрашиваемое число игроков-оппонентов
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)   result      : "1" - успех / "-x" - ошибка; 
    *  -  (array) rival_ids   :  Массив, который содержит id-игроков подходящих для проведения с ними дуэли;
    *  -  -  (biging)         :  id-игроков
    */   
    public function find_rivalsAction($args){
        try{
            
            $rival_count      = 4;  
            if(TRUE == isset($args["rival_count"])){
               $rival_count = $args["rival_count"];           
            }

            return Model::factory('user', $this->user->id)->findRivals( $rival_count );
           
        } catch (Exception $e){

            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "find_rivalsAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }  
    }
    
    //--------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------
    /**
    * 
    * Начало дуэли
    * 
    * Инициализирует игру (дуэль) с двумя игроками.
    * 
    * За инициализацию (фактичеки запуск) дуэли с игрока списывается money1 и/или money2 и/или energy. Величины значений определены, соотвественно,
    * в vars.game_start_price_money1, vars.game_start_price_money2, vars.game_start_price_energy.
    * 
    * Если игра между игроками уже началась, то возвращает ошибку (-5).
    * 
    * Возможно инициализировать игру с пользователем, который еще не установил игру, в таком случае следует указать параметр $invite_flag = 1. 
    * В случае необходимости такую игру можно будет удалить точно так же как обучную {@link gameController::cancelAction()}.    
    * При запросе {@link gameController::refreshAction()} игра не будет отличаться от других, инициализированных с уже установившими игру пользователями.  
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.initialization|||m||0||1||{"user_target_id":100200400, "friend_flag":0}
    * 
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["game.initialization",{"result":1,"friend_flag":0,"invite_flag":1,"game":{"id":"41","user_id_0":"100200300","user_id_1":"100200400","rounds_count":"3","active_user":"0","active_round_number":"0","active_round_start_flag":"0","user_cancel":"-1","round_cancel":"-1"},"terms":{"position_bonus_char":"7","open_chars":"хиядтлгщоймо"}}]]
    * </code> 
    *  
    *  
    * 
    * @param  Object  $args  Объект с множеством свойств имя/значение:
    *  - (bigint) user_target_id  :  id-игрока в соц. сети дуэль с которым начинает текущий пользователь.
    *  - (int)    friend_flag     :  флаг указывающий является ли оппонент другом (0 - случайный игрок, 1 - друг) в случае оппанент друг - игнорируется лимит его входящих дуэлей
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)    result    :  "1" - успех / "-x" - ошибка; 
    *  -  (int)    friend_flag     :  флаг указывающий является ли оппонент другом (0 - случайный игрок, 1 - друг) в случае оппанент друг - игнорируется лимит его входящих дуэлей
    *  -  (int)    invite_flag     :  флаг, $invite_flag=1 если игрок с которым инициализируется игра еще не установил игру. В таком случае игра будет проинициализирована, и когда игрок установит игру он сможет сразу принять в ней участие. Если флаг $invite_flag = 1, но игрок уже установил игру, флаг игнорируется а в ответе $invite_flag = 0.
    *  -  (Object)  game                   :  <b> Информация о инициализированной игре </b>. (БД: табл.user_game). Объект с множеством свойств имя/значение:
    *  -  -  (int)     id                        :  номер созданной дуэли.  
    *  -  -  (bigint)  user_id_0                 :  id-игрока начинающего дуэль.                                 
    *  -  -  (bigint)  user_id_1                 :  id-игрока присоединяющегося к дуэли.                         
    *  -  -  (int)     rounds_count              :  максимальное число раундо в этой игре(дуэли) соответствует vars.game_round_count 
    *  -  -  (int)     active_user               :  очередь хода user_id_0=0 или user_id_1=1.                    
    *  -  -  (int)     active_round_number       :  номер по порядку текущего раунда.                                       
    *  -  -  (int)     active_round_start_flag   :  флаг активизации раунда 
    *  -  -  (int)     time_last_activity        :  время прошедшие с последней активности, в скундах.
    *  -  -  (int)     active_round_id           :  id номер текущего раунда (соответствует табл. user_round.id)
    *  -  -  (int)     user_cancel               :  порядковый номер игрока отменившего игру (user_id_0=0 или user_id_1=1).     
    *  -  -  (int)     round_cancel              :  порядковый номер раунда в котором была отменена игра.                       
    *  -  -  (int)     user_winner_game          :  порядковый номер игрока, который выйграл в игре(user_id_0=0 или user_id_1=1).
    * 
    *  -  (Object) terms                   :  <b> Ограничения к загадываемому слову для проинициализированных игр </b>. Ограничения к загадываемому слову. Объект с множеством свойств имя/значение:
    *  -  -  (int)     position_bonus_char       :  позиция в которой цена за букву увеличивается в 2 раза
    *  -  -  (int)     open_chars                :  буквы из которых можно составлять слово-вопрос
    * 
    * 
    */ 
    public function initializationAction($args){
         try{
             
             $user_id_0 = $this->user->id;            //кто заказывает дуэль
 
             $user_id_1      = -1;  
             if(TRUE == isset($args["user_target_id"])){
                $user_id_1 = $args["user_target_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_target_id not exist" ); 
             }
             
             $friend_flag = 0;
             if(TRUE == isset($args["friend_flag"])){
                $friend_flag = $args["friend_flag"];           
             }                                                                           
                          
             return Model::factory("game")->initGame($user_id_0, $user_id_1, $friend_flag);
             
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "initializationAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
    
   
    /**
    * Возвращает список плейлиство для следующей дуэли 
    * 
    * @ignore
    * 
    * Игроку предоставляется несколько случайных плейлистов на выбор перед началом игры.
    * Выбор плейлиста пользователем происходит при следующим после этого запросе {@link gameController::startAction()}
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.get_start_data|||m||0||1||{"game_id":10}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["game.get_start_data",{"result":1,"game":{"id":1,"playlist_set_chosen_flag":1,"playlist_case_count":4,"playlist_case":["1","2","3","0"]}}]]
    * </code>  
    * 
    * @param  Object  $args  Объект со свойством имя/значение:
    *  - (int) game_id  :  номер игры (соответстует id в табл.user_game)
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)    result    :  "1" - успех / "-x" - ошибка; 
    *  -  (array)  game      :  <b>Информация о подобранных для текущего игрока, доступных плейлистах </b>. (данные соотвествуют полям из табл.user_game). Объект с множеством свойств имя/значение: 
    *  -  -  (int)     id                        :  номер записи в табл.user_game. 
    *  -  -  (int)     playlist_case_count       :  число плейлистов доступных для выбора игроку, от 1 до 4.                                  
    *  -  -  (array)   playlist_case             :  <b> Массив, содержащий номера доступных иггроку в текущем раунде плейлистов</b>. Кол-во элементво массива = playlist_case_count. (Значение каждого элемента соотвествует id записи в табл.табл.playlist_stat.)                           
    *  -  -  (int)     playlist_set_chosen_flag  :  был ли сгенерирован список плейлистов в текущем раунде.           default:0     
    * 
    *  Значения для playlist_case случайно подобраны из всех доступных игроку вариантов и не повторяются.
    *  Число возвращаемых вариантов может быть меньше, регулируется константой vars.game_playlist_case_count (<b>но не больше 4, зашито в коде</b>). 
    *  В случае, если у игрока плейлистов меньше чем 4, доступных плейлистов возвращается столько, сколько есть(playlist_case_count). 
    * 
    */ 
    public function get_start_dataAction($args){
         try{
             
             $user_id  = $this->user->id;             //кто заказывает дуэль
            
             $game_id      = -1;  
             if(TRUE == isset($args["game_id"])){
                $game_id = $args["game_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"game_id not exist" ); 
             }
             
             return Model::factory("game")->getStartData($user_id, $game_id);
             
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "get_start_dataAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
    
    
    /**
    * Купить возможность изменить список плейлистов для конкретной игры (id статических плейлистов) и обновить информацию в игре.
    * Запрос может последовать только после запроса {@link gameController::get_start_dataAction()}
    * <br>За смену списка плейлистов с игрока списывается money1 и/или money2 и/или energy. Величины значений определены, соотвественно,
    * vars.buy_playlist_set_price_money1, vars.buy_playlist_set_price_money2, vars.buy_playlist_set_price_energy.
    * <br>Выборка обязательно вернет отличающийся от исходного варианта список доступных плейлистов, в том случае если плейлистов достаточно. 
    * Если пользователю доступно мало плейлистов, функция не будет возвращать все те же самые плейлисты. На этот случай предусмотрен ответ "result":0
    * и валюта в таком случае не снимаются. 
    * 
    * @ignore
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.buy_shuffle_playlist_set|||m||0||1||{"game_id":10}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["game.buy_shuffle_playlist_set",{"result":1,"game":{"id":6,"playlist_set_chosen_flag":"1","playlist_case_count":4,"playlist_case":["0","2","3","1"]}}]]
    * </code>  
    * 
    * @param  Object  $args  Объект со свойством имя/значение:
    *  - (int) game_id  :  номер игры (соответстует id в табл.user_game)    
    * 
    * @return  Object  $args  Объект со свойством имя/значение:
    *  - (int) game_id  :  номер игры в табл.user_game   
     *  -  (Object)  game     :  <b>Информация о подобранных для текущего игрока, доступных плейлистах </b>. (данные соотвествуют полям из табл.user_game). Объект с множеством свойств имя/значение: 
    *  -  -  (int)     id                        :  номер записи в табл.user_game. 
    *  -  -  (int)     playlist_case_count       :  число плейлистов доступных для выбора игроку, от 1 до 4.                                  
    *  -  -  (array)   playlist_case             :  <b> Массив, содержащий номера доступных иггроку в текущем раунде плейлистов</b>. Кол-во элементво массива = playlist_case_count. (Значение каждого элемента соотвествует id записи в табл.табл.playlist_stat.)                           
    *  -  -  (int)     playlist_set_chosen_flag  :  был ли сгенерирован список плейлистов в текущем раунде.           default:0     
   */ 
    public function buy_shuffle_playlist_setAction($args){   
        try{
            $user_id  = $this->user->id;
            
            $game_id      = -1;  
            if(TRUE == isset($args["game_id"])){
               $game_id = $args["game_id"];           
            } else {
               errors::exc(errors::errorIncorrectInput,"game_id not exist" ); 
            }  
             
            return Model::factory('game')->buyShufflePlaylistSet($user_id, $game_id);
           
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "buy_shuffle_playlist_setAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }
   
      
    /**
    * 
    * Начинает игру(дуэль) или продолжает, в случае если игра уже была начата ранее 
    *
    * Игрок присывалет на сервер слово-вопрос для проверки его легальность (сравнения со словами в словаре) 
    * Возвращается значение (result = 0) в случае если слово не подходит - его нет в словаре
    * 
    * При загадывании слова у игрока списывается var.round_energy_price энергии (если энергии не хватает возвращает "result" => -50)
    * 
    * @todo Что давать за очки которые начисляются за загаданное слово? писать их в профиль пользователя и каждый раз когда наберется нужное количество давать плюшку? какую плюшку? 
    * @todo ПРОВЕРИТЬ СТАРТ НА ПРЕДМЕТ НАЧАЛА ИГРЫ С ИГРОКОМ КОТОРОГО ЕЩЕ НЕТ В ИГРЕ
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.start|||m||0||1||{"game_id":24,"question":"лом"}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["game.start",{"result":0}]]
    * [["game.start",{"result":1,"game":{"id":"29","user_id_0":"100200300","user_id_1":"100200301","rounds_count":"3","active_user":1,"active_round_number":"0","active_round_start_flag":1,"time_last_activity":1387398398,"active_round_id":"45","user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"},"round":{"id":"45","user_game_id":"29","round_completed_flag":"0","user_result_0":"-1","user_result_1":"-1"},"task":{"user_round_id":"45","task_stat_id":"15","result_user":0,"active_user":1,"try_count":"2","fail_signs":"","history":"о","mask":"*о*"},"question_points":53}]]
    * </code> 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int) game_id   :  номер игры (соответстует id в табл.user_game)
    *  -  (int) question  :  загадываемое слово
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)    result                :  "1" - успех / "0" - слово не подхдоит / "-x" - ошибка. Возвращается значение (result = 0) в случае если слово не подходит - его нет в словаре. 
    *  -  (Object) game                   :  <b> Информация начатой игре </b>. (БД: табл.user_game). Объект с множеством свойств имя/значение:
    *  -  -  (int)     id                        :  номер созданной дуэли.  
    *  -  -  (bigint)  user_id_0                 :  id-игрока начинающего дуэль.                                 
    *  -  -  (bigint)  user_id_1                 :  id-игрока присоединяющегося к дуэли.                         
    *  -  -  (int)     rounds_count              :  максимальное число раундо в этой игре(дуэли) соответствует vars.game_round_count 
    *  -  -  (int)     active_user               :  очередь хода user_id_0=0 или user_id_1=1.                    
    *  -  -  (int)     active_round_number       :  номер по порядку текущего раунда.                                       
    *  -  -  (int)     active_round_start_flag   :  флаг активизации раунда 
    *  -  -  (int)     time_last_activity        :  время прошедшие с последней активности, в скундах
    *  -  -  (int)     active_round_id           :  id номер текущего раунда (соответствует табл. user_round.id)
    *  -  -  (int)     user_cancel               :  порядковый номер игрока отменившего игру (user_id_0=0 или user_id_1=1).     
    *  -  -  (int)     round_cancel              :  порядковый номер раунда в котором была отменена игра.                       
    *  -  -  (int)     user_winner_game          :  порядковый номер игрока, который выйграл в игре(user_id_0=0 или user_id_1=1).
    *
    *   -  (Object)  round                :  <b>Данные о активном раунде.</b> (БД: табл.user_round). Объект с множеством свойств имя/значение:
    *   -  -  (int)     id                        :  номер раунда.
    *   -  -  (int)     user_game_id              :  номер игры(дуэли) к которой относится текущий раунд. соотвествует табл. uset_game.id
    *   -  -  (int)     round_completed_flag      :  флаг, определяющий закончен раунд(1 - закончен, 0 - не закончен)
    *   -  -  (int)     user_result_0             :  результативность игрока №0 (1 - выигрыш, 0 - проигрыш, "-1" - раунд не завершен)
    *   -  -  (int)     user_result_1             :  результативность игрока №1 (1 - выигрыш, 0 - проигрыш, "-1" - раунд не завершен)
    * 
    *   -  (Object)   task                :  <b>Информация о задании, вопросы и подпись-проверка к ним</b> (БД: табл.user_task). Объект с множеством свойств имя/значение:
    *   -  -  (int)     id                        :  номер задания 
    *   -  -  (int)     user_round_id             :  номер раунда к которому принадлежат задания, соотвествует round.id
    *   -  -  (int)     task_stat_id              :  номер задания в стат. таблице (БД: task_stat.id) указывает на загаданное игроком слово в словаре
    *   -  -  (int)     result_user               :  результат игрока (правильно=1, нет=0) 
    *   -  -  (int)     active_user               :  очередь хода user_id_0=0 или user_id_1=1.                            default:0                          
    *   -  -  (int)     try_count                 :  оставшееся количество попыток угадать букву (если 0 - конец игры)
    *   -  -  (string)  fail_signs                :  ряд букв которые игрок уже пытался угадать и окозалось что они не входят в загаданое слово
    *   -  -  (string)  history                   :  полный ряд букв которые использовал игрок (в порядке использования) отгадывая текущее задание
    *   -  -  (string)  mask                      :  слово-задание, частично или полностью открытое (например, "мо*о*о")                        
    *   -  (int)      question_points     :  <b>Информация количестве полученых за загаданое слово очквов</b>
    * 
    */   
                        
    public function startAction($args){
         try{
             $user_id      = $this->user->id; 
             
             $game_id      = -1;            
             $playlist_id  = -1; 
             
             if(TRUE == isset($args["game_id"])){
                $game_id = $args["game_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"game_id not exist" ); 
             }  
             if(TRUE == isset($args["question"])){
                $question = $args["question"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"question not exist" ); 
             }              
             
             return Model::factory("game")->startGame($user_id, $game_id, $question);
             
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "startAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
    
    /**
    * Завершает раунд или игру, в случае если завершается последний раунд
    * 
    *  @todo Дописать сколько выдается money1 когда очков достаточно для "выдачи звезды" 
    * 
    * При результатам раунда начисляются нагдада:
    * 1) Награда за успешныое выполнение задание (vars.round_win_prize_money1)
    * 1) Поощерение в случае провала задания (vars.round_lose_prize_money1)
    * 
    * <br>По результатам игры(дуэли) начисляется:
    * 1) Награда за выйгранную дуэль (vars.game_win_prize_money1)
    * 2) Поощерение за проигранную дуэль (vars.game_lose_prize_money1)
    * 
    * <br>Данные при завершении раунда переводятся в статистику 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.end|||m||0||1||{"game_id":"30","round_cancel_flag":0,"sign":"л"}
    * </code>
    *  
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["game.end",{"result":1,"game":{"id":"24","user_id_0":"100200300","user_id_1":"100200301","rounds_count":"3","active_user":"0","active_round_number":"1","active_round_start_flag":"1","time_last_activity":1387364047,"active_round_id":"36","user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"},"round":{"id":"36","time_start_server":"1387363952","user_game_id":"24","round_completed_flag":"0","user_result_0":"-1","user_result_1":"1"},"task":{"id":"27","user_round_id":"36","task_stat_id":"15","result_user":"0","active_user":"0","try_count":"2","fail_signs":"","history":"ол","mask":"ло*"},"terms":[]}]]
    * [["game.end",{"result":1,"game":{"id":"24","user_id_0":"100200300","user_id_1":"100200301","rounds_count":"3","active_user":"0","active_round_number":2,"active_round_start_flag":0,"time_last_activity":1387364089,"active_round_id":-1,"user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"},"round":{"id":"36","user_game_id":"24","round_completed_flag":1,"user_result_0":1,"user_result_1":"1"},"task":{"id":"27","user_round_id":"36","task_stat_id":"15","result_user":1,"active_user":"0","try_count":"2","fail_signs":"","history":"олм","mask":"лом"},"terms":{"position_bonus_char":"3","open_chars":"мгхоччюлныйе"}}]]
    * 
    * </code> 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)     game_id             :  номер игры (соответстует id в табл.user_game)
    *  -  (string)  sign               :  буква которую игрок пыатеся угадать
    * 
       * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)    result                :  "1" - успех / "0" - слово не подхдоит / "-x" - ошибка. Возвращается значение (result = 0) в случае если слово не подходит - его нет в словаре. 
    *  -  (Object) game                   :  <b> Информация о состоянии игры </b>. (БД: табл.user_game). Объект с множеством свойств имя/значение:
    *  -  -  (int)     id                        :  номер созданной дуэли.  
    *  -  -  (bigint)  user_id_0                 :  id-игрока начинающего дуэль.                                 
    *  -  -  (bigint)  user_id_1                 :  id-игрока присоединяющегося к дуэли.                         
    *  -  -  (int)     rounds_count              :  максимальное число раундо в этой игре(дуэли) соответствует vars.game_round_count 
    *  -  -  (int)     active_user               :  очередь хода user_id_0=0 или user_id_1=1.                    
    *  -  -  (int)     active_round_number       :  номер по порядку текущего раунда.                                       
    *  -  -  (int)     active_round_start_flag   :  флаг активизации раунда 
    *  -  -  (int)     time_last_activity        :  время прошедшие с последней активности, в скундах
    *  -  -  (int)     active_round_id           :  id номер текущего раунда (соответствует табл. user_round.id)
    *  -  -  (int)     user_cancel               :  порядковый номер игрока отменившего игру (user_id_0=0 или user_id_1=1).     
    *  -  -  (int)     round_cancel              :  порядковый номер раунда в котором была отменена игра.                       
    *  -  -  (int)     user_winner_game          :  порядковый номер игрока, который выйграл в игре(user_id_0=0 или user_id_1=1).
    *
    *   -  (Object)  round                :  <b>Данные о активном раунде.</b> (БД: табл.user_round). Объект с множеством свойств имя/значение:
    *   -  -  (int)     id                        :  номер раунда.
    *   -  -  (int)     user_game_id              :  номер игры(дуэли) к которой относится текущий раунд. соотвествует табл. uset_game.id
    *   -  -  (int)     round_completed_flag      :  флаг, определяющий закончен раунд(1 - закончен, 0 - не закончен)
    *   -  -  (int)     user_result_0             :  результативность игрока №0 (1 - выигрыш, 0 - проигрыш, "-1" - раунд не завершен)
    *   -  -  (int)     user_result_1             :  результативность игрока №1 (1 - выигрыш, 0 - проигрыш, "-1" - раунд не завершен)
    * 
    *   -  (Object)   task                :  <b>Информация о задании, вопросы и подпись-проверка к ним</b> (БД: табл.user_task). Объект с множеством свойств имя/значение:
    *   -  -  (int)     id                        :  номер задания 
    *   -  -  (int)     user_round_id             :  номер раунда к которому принадлежат задания, соотвествует round.id
    *   -  -  (int)     task_stat_id              :  номер задания в стат. таблице (БД: task_stat.id) указывает на загаданное игроком слово в словаре
    *   -  -  (int)     result_user               :  результат игрока (1 - выигрыш, 0 - проигрыш, "-1" - раунд не завершен)
    *   -  -  (int)     active_user               :  очередь хода user_id_0=0 или user_id_1=1.                            default:0                          
    *   -  -  (int)     try_count                 :  оставшееся количество попыток угадать букву (если 0 - конец игры)
    *   -  -  (string)  fail_signs                :  ряд букв которые игрок уже пытался угадать и окозалось что они не входят в загаданое слово
    *   -  -  (string)  history                   :  полный ряд букв которые использовал игрок (в порядке использования) отгадывая текущее задание
    *   -  -  (string)  mask                      :  слово-задание, частично или полностью открытое (например, "мо*о*о")                        
    *
    *  -  (Object) terms                  :  <b> Ограничения к загадываемому слову для проинициализированных игр </b>. В случае слово не разадано возвращается пустой массив. В случае если игрок отгадал слово, или закончились попытки то возвращается информация для загадывания слова оппаненту. Объект с множеством свойств имя/значение:
    *  -  -  (int)     position_bonus_char       :  позиция в которой цена за букву увеличивается в 2 раза
    *  -  -  (int)     open_chars                :  буквы из которых можно составлять слово-вопрос
    * 
    */ 
    public function endAction($args){
         try{
             $user_id              = $this->user->id; 
             $game_id              = 0;
             $round_cancel_flag    = 0;           
             $answer               = "";           
             //----------------------------------------------------------------------
             //проверка корректности входных данных 
             if(FALSE == is_null($args["game_id"])){
                $game_id = $args["game_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"game_id not exist" ); 
             }
             if(FALSE == is_null($args["sign"])){
                $sign = $args["sign"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"sign not exist" ); 
             }
           
             //----------------------------------------------------------------------     
             return Model::factory("game")->endGame($user_id, $game_id, $sign);
      
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "startAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
    
    
    /**
    * Отмена игры. 
    * 
    * Отменить игру может любой из участников, в любой момент. 
    * 
    * <br>Данные при отмене переводятся в статистику, кроме случаев когда отменяется игра с которой не производилось никаких действий кроме инициализации (не сыгнао ни одно задание ни одного раунда)
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.cancel|||m||0||1||{"game_id":14}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["game.cancel",{"result":1,"game":{"id":"26","user_id_0":"100200300","user_id_1":"100200301","rounds_count":"3","active_user":"1","active_round_number":"0","active_round_start_flag":"1","time_last_activity":1387386611,"active_round_id":"40","user_cancel":1,"round_cancel":"0","user_winner_game":0}}]]
    * [["game.cancel",{"result":1,"game":{"id":"42","user_id_0":"100200300","user_id_1":"100100450","rounds_count":"3","active_user":"0","active_round_number":"0","active_round_start_flag":"0","time_last_activity":1389111694,"active_round_id":"-1","user_cancel":0,"round_cancel":"0","user_winner_game":"-1"}}]]
    * </code> 
    * 
    * @todo Вопрос: Начислять ли выйгрыш за раунд игроку при отмене оппанентом игры? 1. Если игрок1 отменяет игру после того как игрок0 завершает свою часть раунда. 2. Игрок1 отменят игру после того как игрок 2 завершает свою часть раунда.
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int) game_id  :  номер игры (соответстует id в табл.user_game)
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 :  "1" - успех / "-x" - ошибка;;
    *  -  (Object)  game                   :  <b> Информация об отмененной игре </b>. (БД: табл.user_game). Объект с множеством свойств имя/значение:
    *  -  -  (int)     id                        :  номер созданной дуэли.  
    *  -  -  (bigint)  user_id_0                 :  id-игрока начинающего дуэль.                                 
    *  -  -  (bigint)  user_id_1                 :  id-игрока присоединяющегося к дуэли.                         
    *  -  -  (int)     rounds_count              :  максимальное число раундо в этой игре(дуэли) соответствует vars.game_round_count 
    *  -  -  (int)     active_user               :  очередь хода user_id_0=0 или user_id_1=1.                    
    *  -  -  (int)     active_round_number       :  номер по порядку текущего раунда.                                       
    *  -  -  (int)     active_round_start_flag   :  флаг активизации раунда 
    *  -  -  (int)     time_last_activity        :  время прошедшие с последней активности, в скундах
    *  -  -  (int)     active_round_id           :  id номер текущего раунда (соответствует табл. user_round.id)
    *  -  -  (int)     user_cancel               :  порядковый номер игрока отменившего игру (user_id_0=0 или user_id_1=1).     
    *  -  -  (int)     round_cancel              :  порядковый номер раунда в котором была отменена игра.                       
    *  -  -  (int)     user_winner_game          :  порядковый номер игрока, который выйграл в игре(user_id_0=0 или user_id_1=1).
    */                 
    public function cancelAction($args){
         try{
             $user_id           = $this->user->id; 
             $game_id           = -1;
            
             if(FALSE == is_null($args["game_id"])){
                $game_id = $args["game_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"game_id not exist" ); 
             }            
            
             return Model::factory("game")->cancelGame($user_id, $game_id);
             
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "cancel", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
    
     /**
    * Возвращает данные обо всех запущенных играх и раундах
    * 
    * Возвращает данные обо всех запущенных играх и раундах
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||game.refresh|||m||0||1||{}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["game.refresh",{"result":1,"game":[{"id":"27","user_id_0":"100200300","user_id_1":"100200301","rounds_count":"3","active_user":"1","active_round_number":"0","active_round_start_flag":"1","time_last_activity":"1387387859","active_round_id":"41","user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"},{"id":"28","user_id_0":"100200300","user_id_1":"100200710","rounds_count":"3","active_user":"0","active_round_number":"0","active_round_start_flag":"1","time_last_activity":"1387388084","active_round_id":"42","user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"}],"round":[{"id":"41","user_game_id":"27","round_completed_flag":"0","user_result_0":"-1","user_result_1":"-1"},{"id":"42","user_game_id":"28","round_completed_flag":"0","user_result_0":"-1","user_result_1":"1"}],"task":[{"id":"35","user_round_id":"41","task_stat_id":"15","result_user":"0","active_user":"1","try_count":"2","fail_signs":"","history":"ол","mask":"ло*"},{"id":"36","user_round_id":"42","task_stat_id":"15","result_user":"1","active_user":"1","try_count":"2","fail_signs":"","history":"олм","mask":"лом"},{"id":"37","user_round_id":"42","task_stat_id":"15","result_user":"0","active_user":"0","try_count":"2","fail_signs":"","history":"ол","mask":"ло*"}],"term":[{"id":"28","position_bonus_char":"7","open_chars":"аюомлйпягшбг"}]}]]
    * [["game.refresh",{"result":1,"game":[{"id":"39","user_id_0":"100200300","user_id_1":"100100301","rounds_count":"3","active_user":"0","active_round_number":"0","active_round_start_flag":"0","time_last_activity":"1389024466","active_round_id":"-1","user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"},{"id":"40","user_id_0":"100200300","user_id_1":"100100350","rounds_count":"3","active_user":"0","active_round_number":"0","active_round_start_flag":"0","time_last_activity":"1389037981","active_round_id":"-1","user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"},{"id":"41","user_id_0":"100200300","user_id_1":"100200400","rounds_count":"3","active_user":"0","active_round_number":"0","active_round_start_flag":"0","time_last_activity":"1389038515","active_round_id":"-1","user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"},{"id":"43","user_id_0":"100200300","user_id_1":"100100450","rounds_count":"3","active_user":"0","active_round_number":"0","active_round_start_flag":"0","time_last_activity":"1389112832","active_round_id":"-1","user_cancel":"-1","round_cancel":"-1","user_winner_game":"-1"}],"round":[],"task":[],"term":[{"id":"39","position_bonus_char":"6","open_chars":"иъйемоэлрдбг"},{"id":"40","position_bonus_char":"7","open_chars":"йшдцпятимыол"},{"id":"41","position_bonus_char":"7","open_chars":"хиядтлгщоймо"},{"id":"43","position_bonus_char":"6","open_chars":"есосмжтлгюая"}]}]]
    * </code> 
    * 
     * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)    result                 :  "1" - успех / "-x" - ошибка;;
    *  -  (array)  game                   :  <b> Информация начатых играх </b>. (БД: табл.user_game). Массив объектов, каждый объект которого содержит следующие свойства:
    *  -  -  (int)     id                        :  номер созданной дуэли.  
    *  -  -  (bigint)  user_id_0                 :  id-игрока начинающего дуэль.                                 
    *  -  -  (bigint)  user_id_1                 :  id-игрока присоединяющегося к дуэли.                         
    *  -  -  (int)     rounds_count              :  максимальное число раундо в этой игре(дуэли) соответствует vars.game_round_count 
    *  -  -  (int)     active_user               :  очередь хода user_id_0=0 или user_id_1=1.                    
    *  -  -  (int)     active_round_number       :  номер по порядку текущего раунда.                                       
    *  -  -  (int)     active_round_start_flag   :  флаг активизации раунда 
    *  -  -  (int)     time_last_activity        :  время прошедшие с последней активности, в скундах
    *  -  -  (int)     active_round_id           :  id номер текущего раунда (соответствует табл. user_round.id)
    *  -  -  (int)     user_cancel               :  порядковый номер игрока отменившего игру (user_id_0=0 или user_id_1=1).     
    *  -  -  (int)     round_cancel              :  порядковый номер раунда в котором была отменена игра.                       
    *  -  -  (int)     user_winner_game          :  порядковый номер игрока, который выйграл в игре(user_id_0=0 или user_id_1=1).
    *
    *   -  (array)  round                 :  <b>Данные о активных раундах.</b> (БД: табл.user_round). Массив объектов, каждый объект которого содержит следующие свойства:
    *   -  -  (int)     id                        :  номер раунда.
    *   -  -  (int)     user_game_id              :  номер игры(дуэли) к которой относится текущий раунд. соотвествует табл. uset_game.id
    *   -  -  (int)     round_completed_flag      :  флаг, определяющий закончен раунд(1 - закончен, 0 - не закончен)
    *   -  -  (int)     user_result_0             :  результативность игрока №0 (1 - выигрыш, 0 - проигрыш, "-1" - раунд не завершен)
    *   -  -  (int)     user_result_1             :  результативность игрока №1 (1 - выигрыш, 0 - проигрыш, "-1" - раунд не завершен)
    * 
    *   -  (array)   task                 :  <b>Информация о заданиях, вопросы и подпись-проверка к ним</b> (БД: табл.user_task). Массив объектов, каждый объект которого содержит следующие свойства:
    *   -  -  (int)     id                        :  номер задания 
    *   -  -  (int)     user_round_id             :  номер раунда к которому принадлежат задания, соотвествует round.id
    *   -  -  (int)     task_stat_id              :  номер задания в стат. таблице (БД: task_stat.id) указывает на загаданное игроком слово в словаре
    *   -  -  (int)     result_user               :  результат игрока (правильно=1, нет=0) 
    *   -  -  (int)     active_user               :  очередь хода user_id_0=0 или user_id_1=1.                            default:0                          
    *   -  -  (int)     try_count                 :  оставшееся количество попыток угадать букву (если 0 - конец игры)
    *   -  -  (string)  fail_signs                :  ряд букв которые игрок уже пытался угадать и окозалось что они не входят в загаданое слово
    *   -  -  (string)  history                   :  полный ряд букв которые использовал игрок (в порядке использования) отгадывая текущее задание
    *   -  -  (string)  mask                      :  слово-задание, частично или полностью открытое (например, "мо*о*о"). полностью открыто в случае если задание (task) завершено                         
    *  
    *  -  (array) terms                   :  <b> Ограничения к загадываемому слову для проинициализированных игр </b>. Ограничения к загадываемому слову. Массив объектов, каждый объект которого содержит следующие свойства:
    *  -  -  (int)     position_bonus_char       :  позиция в которой цена за букву увеличивается в 2 раза
    *  -  -  (int)     open_chars                :  буквы из которых можно составлять слово-вопрос
    * 
    */              
    public function refreshAction(){
        try{
             $user_id           = $this->user->id;
             
             return Model::factory("game")->refreshGames($user_id);
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "refreshAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
        
    }
    
    /**
    * Тестовая функция
    * @ignore      
    */ 
    public function testAction($args){
        try{
            $text = $args["text"];
            $str_result = strcmp($text, "Привет");
       
       return array("text" => $text, "str_result" => $str_result);
                } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "testAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         } 
    }
    
    
}

================================================================================
ФАЙЛ: app/controllers/missionController.php
================================================================================

<?php

