Часть 2 из 12
Строки: 2001-4000 из 22262
================================================================================

/**
 * 
 * Последовательное проходение миссиий
 * 
 * 
 * 
 */
 
class missionController extends abstractController {

    /**
    * Попросить ключ для открытия этапа 
    * 
    * У одного конкретного пользователя можно попросить один ключ для одного этапа
    * Время просбы фиксируется. В случае если игрок, которому напрвляется просьба не отвечает на нее 
    * повтороно просьбу можно послать через var.gift_time_limit секунд. Если попытаться послать раньше, 
    * вернется ошибка (-121).
    * В случае если повторная просьба будет послана через var.stage_key_time_limit секунд, время просбы перезапишется 
    * и будет считаться что именно с этого момента была сделана просьба. 
    * Ключи можно попросить только для уже существующего этапа (он есть в табл.stage_stat).
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||mission.stage_key_ask|||m||0||1||{"user_donator_id":"100200301","stage_stat_id":1}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * В случае если к игроку уже был послан запрос меньше чем через var.stage_key_time_limit секунд
    * [["mission.stage_key_ask",{"result":-121,"text":"too little time since the previous ask"}]]
    * Если все нормально 
    * [["mission.stage_key_ask",{"result":1,"stage_key":{"id":"39","user_id":"100200300","user_donator_id":"100200301","stage_stat_id":"1","status":"0","time":43200}}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (bigint)  <b>  user_donator_id  </b>  :  номер игрока из соц сети у которого просят ключ
    *  -  (int)     <b>  stage_stat_id    </b>  :  номер этапа, соотвествует id в табл. stage_stat
    *  -  (int)     <b>  count      </b>  :  число даримых объектов, по умолчанию: 1
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (Object)  stage_key              :Объект с множеством свойств имя/значение:  
    *  -  -  (int)     id                         : номер просьбы ключа. соотвествует id в табл. stage_key
    *  -  -  (bigint)  user_id                    : номер игрока из соц сети который просит ключ (при status = 0) или обладает ключем (при status = 1)
    *  -  -  (bigint)  user_donator_id            : номер игрока из соц сети у которого просят ключ
    *  -  -  (int)     stage_stat_id              : номер этапа, соотвествует id в табл. stage_stat                 
    *  -  -  (int)     status                     : статус ключа 0 - ключ попросили и друга. 1 - друг в ответ на просбу прислал ключ, т.е. он уже есть у игрока
    *  -  -  (int)     time                       : время до момента когда можно напомнить о просьбе. просить можно только 1 ключ. если status = 1 то в этом поле время с момента когда ключ послали
    */                                          
    public function stage_key_askAction( $args ){
         try{
             
             $user_donator_id      = -1;  
             if(TRUE == isset($args["user_donator_id"])){
                $user_donator_id = $args["user_donator_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_donator_id not exist" ); 
             }
             
             $user_id        = -1;             //кто просит о подарке;  
             if(TRUE == $this->user->id){
                $user_id = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_id not exist" ); 
             }
             
             $stage_stat_id = 0;
             if(TRUE == isset($args["stage_stat_id"])){
                $stage_stat_id = $args["stage_stat_id"];           
             }   else {
                errors::exc(errors::errorIncorrectInput,"stage_stat_id not exist" ); 
             }

             return Model::factory('stage')->stageKeyAsk($user_id, $user_donator_id,  $stage_stat_id);
             
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "missionController", "stage_key_askAction", $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||100200301|||s_key||-1|||m||0||0||mission.stage_key_send|||m||0||1||{"stage_key_id":"39"}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mission.stage_key_send",{"result":1,"stage_key":{"id":"39","user_id":"100200300","user_donator_id":"100200301","stage_stat_id":"1","status":1,"time":0}}]]
    * </code>
    * 
    * Возвращает -20, если нет предмета который нужно подарить
    * 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)       $stage_key_id        :  номер просьбы ключа. соотвествует id в табл. stage_key
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (Object)  stage_key              :Объект с множеством свойств имя/значение:  
    *  -  -  (int)     id                         : номер просьбы ключа. соотвествует id в табл. stage_key
    *  -  -  (bigint)  user_id                    : номер игрока из соц сети который просит ключ (при status = 0) или обладает ключем (при status = 1)
    *  -  -  (bigint)  user_donator_id            : номер игрока из соц сети у которого просят ключ
    *  -  -  (int)     stage_stat_id              : номер этапа, соотвествует id в табл. stage_stat                 
    *  -  -  (int)     status                     : статус ключа 0 - ключ попросили и друга. 1 - друг в ответ на просбу прислал ключ, т.е. он уже есть у игрока
    *  -  -  (int)     time                       : время с момента когда ключ послали
    *  */                                          
    public function stage_key_sendAction( $args ){
         try{
             
             $user_donator_id        = -1;             //кто просит о подарке;  
             if(TRUE == $this->user->id){
                $user_donator_id = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_donator_id not exist" ); 
             }
             
             $stage_key_id      = -1;  
             if(TRUE == isset($args["stage_key_id"])){
                $stage_key_id = $args["stage_key_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"stage_key_id not exist" ); 
             }
                                
             return Model::factory('stage')->stageKeySend($user_donator_id, $stage_key_id);

         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "giftController", "sendAction", $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||100200301|||s_key||-1|||m||0||0||mission.stage_key_refresh|||m||0||1||{}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mission.stage_key_refresh",[{"id":"39","user_id":"100200300","user_donator_id":"100200301","stage_stat_id":"1","status":"1","time":30}]]]
    * </code>
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                : "1" - успех / "-x" - ошибка;  
    *  -  (array)   stage_key                 : <b>ключи для этапов которые игрок попросил у друзей или которые игрок уже получил от друзей</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер просьбы ключа. соотвествует id в табл. stage_key
    *  -  -  (bigint)  user_id                    : номер игрока из соц сети который просит ключ (при status = 0) или обладает ключем (при status = 1)
    *  -  -  (bigint)  user_donator_id            : номер игрока из соц сети у которого просят ключ
    *  -  -  (int)     stage_stat_id              : номер этапа, соотвествует id в табл. stage_stat                 
    *  -  -  (int)     status                     : статус ключа 0 - ключ попросили и друга. 1 - друг в ответ на просбу прислал ключ, т.е. он уже есть у игрока
    *  -  -  (int)     time                       : время до момента когда можно напомнить о просьбе. просить можно только 1 ключ. если status = 1 то в этом поле время с момента когда ключ послали
    */   
    public function stage_key_refreshAction( $args ){
         try{
             
             $user_id        = -1;             
             if(TRUE == $this->user->id){
                $user_id = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_id not exist" ); 
             }
     
             return Model::factory('stage')->getStageActualKey($user_id);
     
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "missionController", "stage_key_refreshAction", $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||100200301|||s_key||-1|||m||0||0||mission.stage_key_cancel|||m||0||1||{"stage_key_id":"32"}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mission.stage_key_cancel",{"result":1,"stage_key_id":"32"}]]
    * </code>
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                : "1" - успех / "-x" - ошибка;  
    */   
    public function stage_key_cancelAction( $args ){
         try{
             
             $user_id        = -1;             
             if(TRUE == $this->user->id){
                $user_id = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_id not exist" ); 
             }
             
             $stage_key_id      = -1;  
             if(TRUE == isset($args["stage_key_id"])){
                $stage_key_id = $args["stage_key_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"stage_key_id not exist" ); 
             }
                
     
             return Model::factory('stage')->stageKeyCancel($user_id, $stage_key_id);
     
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "missionController", "stage_key_refreshAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
         }
     } 
     
    /**
    * Начинает миссию
    * 
    * Инициализируется начало миссии
    * <br>Миссию можно начать, если:
    * <br>1) Она первая в списке миссий этапа
    * <br>2) Она уже была пройдена (т.е. есть запись о ней в табл.mission )
    * <br>3) Предыдущие миссии этапа уже пройдены(т.е. есть записи о них в табл.mission ). При этом position предыдущих миссий может быть расставлен не по-порядку. 
    * <br>4) Миссия еще не пройдена(т.е. нет записи о них в табл.mission ) и нет запрета на переигрование(в табл. mission_stat в поле replay_flag = 1). 
    * 
    * 
    * 
    * <br>В случае если не все предыдущие миссии пройдены ("result" => -5, "text" => "not completed the previous mission"); 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://sweetbear.info/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||mission.start|||m||0||1||{"mission_stat_id":1}
    * </code> 
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mission.start",{"result":1,"mission":{"mission_stat_id":1,"start_key":516408}}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)  $mission_stat_id      :  номер статической миссии (общий номер)
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result    :  "1" - успех / "-x" - ошибка;;
    *  -  (Object)  mission   : <b> Информация о начинаемой миссии</b>. Объект с множеством свойств имя/значение:
    *  -  -  (int)     mission_stat_id                :  номер статической миссии
    *  -  -  (string)  start_key                      :  подпись текущей миссии 
    * 
    */   
    public function startAction( $args ){
         try{
             $user_id      = $this->user->id; 
             
             $mission_id   = -1;            
             
             if(TRUE == isset($args["mission_stat_id"])){
                $mission_stat_id = $args["mission_stat_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"mission stat id not exist" ); 
             }  
             return Model::factory("mission")->startMission($user_id, $mission_stat_id);
             
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "startAction", $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||mission.stage_time_check|||m||0||1||{"company_stat_id":"0", "stage_position":"1"}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mission.stage_time_check",{"result":1,"stage_time_id":"3","company_stat_id":0,"stage_position":"1","time":0}]]
    * [["mission.stage_time_check",{"result":1,"stage_time_id":"3","company_stat_id":0,"stage_position":"1","time":752}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)     company_stat_id       : id компании в таблице со статическими данными company_stat              
    *  -  (int)     stage_position        : порядковая позиция этапа в компании             
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                : "1" - успех / "-x" - ошибка;  
    *  -  (int)     stage_time_id         : id записи, соотвествует id в табл. stage_time
    *  -  (int)     company_stat_id       : id компании в таблице со статическими данными company_stat              
    *  -  (int)     stage_position        : порядковая позиция этапа в компании               
    *  -  (int)     time                  : время(в сек.) до того как этап откроется без платы за него
    */ 
    
    public function stage_time_checkAction( $args ){
         try{
             
             $user_id        = -1;             
             if(TRUE == $this->user->id){
                $user_id = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_id not exist" ); 
             }
     
             $company_stat_id = 0;
             if(TRUE == isset($args["company_stat_id"])){
                $stage_stat_id = $args["company_stat_id"];           
             }   else {
                errors::exc(errors::errorIncorrectInput,"company_stat_id not exist" ); 
             }
             
             $stage_position = 0;
             if(TRUE == isset($args["stage_position"])){
                $stage_position = $args["stage_position"];           
             }   else {
                errors::exc(errors::errorIncorrectInput,"stage_position not exist" ); 
             }
             
             return Model::factory('stage')->checkStageTime($user_id, $company_stat_id, $stage_position);
     
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "missionController", "stage_time_checkAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
         }
     } 
     
    /**
    * 
    * Завершение миссии
    * При завершении миссии существует два варианта подсчета вознаграждения: 
    * 1) в случае vars.mission_prize_sum_system = 0, или если этого поля нет в vars вообще:
    * каждый раз когда очков (points) хватает хотя-бы на одну звезду, и не зависимо от того сколько звезд было после предыдущего запуска миссии
    * игроку начисляется бонус mission_stat.prize_booster_type, mission_stat.prize_booster_count, mission_stat.prize_money1, 
    * mission_stat.prize_money2,  mission_stat.prize_energy, mission_stat.prize_exp;
    * 2) в случае vars.mission_prize_sum_system = 1:
    * игроку начисляется бонус за каждую полученную им звезду отдельно,
    * велечина вознаграждения берется из mission_stat.prize_*,mission_stat.prize1_*,mission_stat.prize2_*
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://sweetbear.info/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||mission.end|||m||0||1||{"start_key":516408, "point":15}
    * </code> 
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * В случае если очков недостаточно чтобы набрать хотябы 1 star и пройти миссию:
    * [["mission.end",{"result":0}]]
    * Если очков достаточно чтобы набрать хотябы 1 star
    * [["mission.end",{"result":1,"mission":{"mission_stat_id":"0","point":15,"star":3},"prize":{"booster_type":0,"booster_count":0,"money":0,"exp":0,"energy":0,"money2":0},"prize2":{"booster_type":0,"booster_count":0,"money":0,"exp":0,"energy":0,"money2":0},"prize3":{"booster_type":0,"booster_count":0,"money":"30","exp":0,"energy":0,"money2":"3"}}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)  $start_key            :  число-подпись отсылаемое клиенту во время начала миссии {@link  missionController::startAction()}
    *  -  (int)  $point                :  очки заработанные во время прохождения миссии
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result    :  "1" - выйгрыш / "0" - проигрыш /"-x" - ошибка;;
    *  -  (Object)  mission   :  <b>Информация о завершенной миссии.</b> Объект с множеством свойств имя/значение:
    *  -  -  (int)     mission_stat_id                :  тип миссии (сотвествует id в табл.mission_stat) 
    *  -  -  (int)     point                          :  кол-во очков текущий результат
    *  -  -  (int)     star                           :  кол-во звезд текущий результат
    *  -  (Object)  prize     : <b>Приз который выдается игроку в случае победы</b>  Объект с множеством свойств имя/значение:
    *  -  -  (int)     booster_type            : тип бустера который выдается в качестве награды за победу
    *  -  -  (int)     booster_count           : кол-во бустеров которые выдаются в качестве награды за победу
    *  -  -  (int)     money1                  : кол-во money1
    *  -  -  (int)     exp                     : кол-во exp
    *  -  -  (int)     money2                  : валюта 2 (жетоны для латереи)
    *  -  (Object)  prize2     : <b>Приз который выдается игроку в случае победы</b>  Объект с множеством свойств имя/значение:
    *  -  -  (int)     booster_type            : тип бустера который выдается в качестве награды за победу
    *  -  -  (int)     booster_count           : кол-во бустеров которые выдаются в качестве награды за победу
    *  -  -  (int)     money1                  : кол-во money1
    *  -  -  (int)     exp                     : кол-во exp
    *  -  -  (int)     money2                  : валюта 2 (жетоны для латереи)
    *  -  (Object)  prize3     : <b>Приз который выдается игроку в случае победы</b>  Объект с множеством свойств имя/значение:
    *  -  -  (int)     booster_type            : тип бустера который выдается в качестве награды за победу
    *  -  -  (int)     booster_count           : кол-во бустеров которые выдаются в качестве награды за победу
    *  -  -  (int)     money1                  : кол-во money1
    *  -  -  (int)     exp                     : кол-во exp
    *  -  -  (int)     money2                  : валюта 2 (жетоны для латереи)

    * 
    */ 
    public function endAction( $args ){
         try{
             $user_id      = $this->user->id; 
           
             if(0){
                 $mission_id = -1;
                 if(TRUE == isset($args["id"])){
                    $mission_stat_id = $args["id"];           
                 } else {
                    errors::exc(errors::errorIncorrectInput,"param mission_stat_id not exist" ); 
                 } 
             }
             
             $start_key = -1;
             if(TRUE == isset($args["start_key"])){
                $start_key = $args["start_key"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"param start_key not exist" ); 
             }
             
             $point = -1;
             if(TRUE == isset($args["point"])){
                $point = $args["point"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"param point not exist" ); 
             }

             return Model::factory("mission")->endMission($user_id, $start_key, $point);
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "startAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
    
    /**
    * Открывает новый этап 
    * 
    * Открывает новый этап
    * 
    * При открытии этапа, создастся запись в табл. stage И в случае если этот этап первый в компании(position = 0) то и в табл. company. 
    * Этап можно открыть только если:
    * 1)пройдены все миссии в предыдущем этапе компании к которой этап относится
    * 2)хватает выбранного ресурса: 
    * - ключи, необходимое кол-во в var.stage_start_cost_key 
    * - время, необходимое кол-во в var.stage_start_cost_time
    * - money1, необходимое кол-во в var.stage_start_cost_money1
    * 
    //* - голоса, в var.stage_start_cost_social находится id записи в табл. shop_social_stat. (при этом запрос на открытие должен прийти к index_cback)  
    * 
    * Первый (position: 0) этап в компании открывается бесплатно.
    *   
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://sweetbear.info/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||mission.stage_start|||m||0||1||{"stage_stat_id":0, "cost_type":0}
    * </code> 
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mission.stage_start",{"result":1,"cost_type":0,"company":{"id":"7","user_id":"100200300","company_stat_id":"0"},"stage":{"id":"10","stage_stat_id":"0","star":"0","flag_complete":"0"}}]]
    * Если открыть этап не получается: 
    * [["mission.stage_start",{"result":-122,"text":"not enough stage keys"}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)  $stage_stat_id        :  статический номер этапа (сотвествует id в табл.stage_stat) 
    *  -  (int)  $cost_type            :  тип расплаты за этап: 0 - ключи, 1 - время, 2 - money1, 3 - голоса
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result    :  "1" - успех / "-x" - ошибка;;
    *  -  (int)     $stage_stat_id        :  статический номер этапа (сотвествует id в табл.stage_stat) 
    * 
    *  -  (Object)  company   : <b> Информация о компании</b>. Объект с множеством свойств имя/значение:
    *  -  -  (int)     id                             :  номер компании игрока (сотвествует id в табл.company) 
    *  -  -  (int)     company_stat_id                :  тип компании (сотвествует id в табл.company_stat) 
    * 
    *  -  (Object)  stage     : <b> Информация о этапе</b>. Объект с множеством свойств имя/значение:
    *  -  -  (int)     id                             :  динамический номер этапа игрока (сотвествует id в табл.stage) 
    *  -  -  (int)     stage_stat_id                  :  статический номер этапа (сотвествует id в табл.stage_stat) 
    *  -  -  (int)     star                           :  кол-во звезд заработанных за этап
    *  -  -  (int)     flag_complete                  :  флаг, завершен ли этап
    * 
    */   
    public function stage_startAction( $args ){
         try{
             $user_id      = $this->user->id; 
             
             $stage_stat_id = -1;            
             
             if(TRUE == isset($args["stage_stat_id"])){
                $stage_stat_id = $args["stage_stat_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"mission stat id not exist" ); 
             }  
             
             if(TRUE == isset($args["cost_type"])){
                $cost_type = $args["cost_type"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"cost_type not exist" ); 
             }
             
             if($cost_type < 0 || $cost_type >= 3){
                errors::exc(errors::errorIncorrectInput,"cost_type not available or not exist" );  
             }  
             
             return Model::factory("stage")->stageStart($user_id, $stage_stat_id, $cost_type);
             
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "stage_startAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }                        
    
    /**
    * Завершает этап
    * 
    * Проверяет все ли миссии в этапе выполнены. Помечает этап как выполненный и выдает награду
    * При завершении этапа создается таймер (запись в табл. stage_time) отсчитывающий время до открытия следующего этапа в текущей компании, 
    * при этом позиция следующего этапа расчитывается как: 
    * позиция_следующего_этапа = позиция_текущего_этапа + 1 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://sweetbear.info/base/od/htdocs/index.php?m=?m=|||uid||100200300|||s_key||-1|||m||0||0||mission.stage_end|||m||0||1||{"id":10}
    * </code> 
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mission.stage_end",{"result":1,"stage":{"id":"10","user_id":"100200300","stage_stat_id":"0","star":5,"flag_complete":1},"prize":{"booster_type":0,"booster_count":0,"money":0,"exp":0}}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)  $id          :  динамический номер этапа 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result    :  "1" - успех / "-x" - ошибка;;
    * 
    *  -  (Object)  stage     : <b> Информация о этапе</b>. Объект с множеством свойств имя/значение:
    *  -  -  (int)     id                             :  динамический номер этапа игрока (сотвествует id в табл.stage) 
    *  -  -  (int)     stage_stat_id                  :  статический номер этапа (сотвествует id в табл.stage_stat) 
    *  -  -  (int)     star                           :  кол-во звезд заработанных за этап
    *  -  -  (int)     flag_complete                  :  флаг, завершен ли этап
    * 
    *  -  (Object)  prize     : <b>Приз который выдается игроку в случае победы</b> В  случае проигрыша вернется "prize":null. Объект с множеством свойств имя/значение:
    *  -  -  (int)     booster_type            : тип бустера который выдается в качестве награды за победу
    *  -  -  (int)     booster_count           : кол-во бустеров которые выдаются в качестве награды за победу
    *  -  -  (int)     money1                  : кол-во money1
    *  -  -  (int)     exp                     : кол-во exp
    * 
    */   
    public function stage_endAction( $args ){
         try{
             $user_id      = $this->user->id; 
             
             $stage_id = -1;            
             
             if(TRUE == isset($args["id"])){
                $stage_id = $args["id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"stage id not exist" ); 
             }     
             
             return Model::factory("stage")->stageEnd($user_id, $stage_id);
             
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameController", "stage_endAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
    
    
    /**
    * Обновляет информацию о этапах пользователя
    * 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://sweetbear.info/base/od/htdocs/index.php?m=?m=|||uid||100200300|||s_key||-1|||m||0||0||mission.stage_refresh|||m||0||1||{}
    * </code> 
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mission.stage_refresh",{"result":1,"stage":[{"id":"62","user_id":"514694734266","stage_stat_id":"0","star":"33","flag_complete":"1"},{"id":"64","user_id":"514694734266","stage_stat_id":"1","star":"20","flag_complete":"1"},{"id":"65","user_id":"514694734266","stage_stat_id":"2","star":"0","flag_complete":"0"}],"stage_key":[{"id":"19","user_id":"514694734266","user_donator_id":"570205322752","stage_stat_id":"1","status":"0","time":0},{"id":"20","user_id":"514694734266","user_donator_id":"537334825174","stage_stat_id":"1","status":"0","time":0},{"id":"21","user_id":"514694734266","user_donator_id":"537334825174","stage_stat_id":"2","status":"0","time":0},{"id":"7","user_id":"570205322752","user_donator_id":"514694734266","stage_stat_id":"1","status":"1","time":10416089}],"stage_time":[{"id":"40","company_stat_id":"0","stage_position":"5","time":0}]}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)  $id          :  динамический номер этапа 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result    :  "1" - успех / "-x" - ошибка;;
    *  -  (array)   stage                     : <b>этапы которые открыты у игрока</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер компании в табл.company
    *  -  -  (int)     stage_stat_id              : id в табл. stage_stat
    *  -  -  (int)     star                       : звезды на каждом этапе считаются отдельно (сумма звезд всех пройденных миссий)
    *  -  -  (int)     flag_complete              : флаг - завершен ли этап 
    * 
    *  -  (array)   stage_key                 : <b>ключи для этапов которые игрок попросил у друзей или которые игрок уже получил от друзей</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер просьбы ключа. соотвествует id в табл. stage_key
    *  -  -  (bigint)  user_id                    : номер игрока из соц сети который просит ключ (при status = 0) или обладает ключем (при status = 1)
    *  -  -  (bigint)  user_donator_id            : номер игрока из соц сети у которого просят ключ
    *  -  -  (int)     stage_stat_id              : номер этапа, соотвествует id в табл. stage_stat                 
    *  -  -  (int)     status                     : статус ключа 0 - ключ попросили и друга. 1 - друг в ответ на просбу прислал ключ, т.е. он уже есть у игрока
    *  -  -  (int)     time                       : время до момента когда можно напомнить о просьбе. просить можно только 1 ключ. если status = 1 то в этом поле время с момента когда ключ послали
    * 
    *  -  (array)   stage_time                 : <b>время до открытия следующего этапа (если один или несколько из предыдущих этапов завершены)</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     stage_stat_id              : id в табл. stage_stat
    *  -  -  (int)     time                       : сколько осталось до открытия этапа

    *
    */   
    public function stage_refreshAction( $args ){
         try{
             $user_id      = $this->user->id; 

             return Model::factory("stage")->refreshStage($user_id);
             
         } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "missionController", "stage_refreshAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
    
    
}

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

<?php

/**
 * Механизмы отправки и получения подарков 
 *  
 */
 
class giftController extends abstractController {

    
    /**
    * Послать подарок
    * 
    * Порадок можно слать каждому конкретному игроку только один, пока тот его не заберет. 
    * Раз в var.gift_time_limit секунд, можно попытаться послать подарок такого же типа, но это действие только перепишет время в gift["time"], по которому можно ориентироваться на то чтобы посылать не слишком часто.
    * Тип подарка: 0 - энегрия, 1 - money1.
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200301|||s_key||-1|||m||0||0||gift.send|||m||0||1||{"user_from":100200301,"user_to":100200300,"type":0,"count":1}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["gift.send",{"result":1,"gift":{"result":1,"gift":{"id":"8","user_id_out":"100200301","user_id_in":"100200300","type":"0","count":"1","status":"1","time":43044}}}]]
    * </code>
    * 
    * Возвращает -20, если нет предмета который нужно подарить
    * 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (bigint)  <b>  user_from  </b>  :  номер игрока из соц сети который посылает подарок  
    *  -  (bigint)  <b>  user_to    </b>  :  номер игрока из соц сети которому посылается подарок (который просит подарок)
    *  -  (int)     <b>  type       </b>  :  тип подарка: 0 - энегрия, 1 - money1, по умолчанию: 0
    *  -  (int)     <b>  count      </b>  :  число даримых объектов, по умолчанию: 1
    *  -  (int)     <b>  ask_id     </b>  :  (<b> необязательный параметр </b>) номер просьбы, в случае если она была, на которую отвечает игрок, посылающий подарок. по умолчанию: -1. заложен на будущее в расчете что просьб может быть несколько. 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (Object)  gift                   :Объект с множеством свойств имя/значение:  
    *  -  -  (int)     gift_id                : номер подарка (табл. "gift" )
    *  -  -  (bigint)  user_from              : номер игрока из соц сети который посылает подарок (у которого просят подарок)
    *  -  -  (bigint)  user_to                : номер игрока из соц сети которому посылается подарок (который просит подарок)
    *  -  -  (int)     status                 : статус подарка (0 - ждет когда его заберут, 1 - подарок забрали)
    *  -  -  (int)     type                   : тип подарка: 0 - энегрия, 1 - money1, по умолчанию: 0
    *  -  -  (int)     count                  : число даримых объектов
    *  -  -  (int)     time                   : время до момента когда можно дарить(просить) подарок - подарить или попросить можно только 1 подарок от 1го человека, поэтому время для того чтобы клиент ориентировался
    */                                          
    public function sendAction( $args ){
         try{
             
             $user_from      = -1;  
             if(TRUE == isset($args["user_from"])){
                $user_from = $args["user_from"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_from not exist" ); 
             }
             
             $user_to        = -1;  
             if(TRUE == isset($args["user_to"])){
                $user_to = $args["user_to"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_to not exist" ); 
             }
             
             $type = 0;
             if(TRUE == isset($args["type"])){
                $type = $args["type"];           
             }
             $count = 0;
             if(TRUE == isset($args["count"])){
                $count = $args["count"];           
             }
             
             $ask_id = -1;
             if(TRUE == isset($args["ask_id"])){
                $ask_id = $args["ask_id"];           
             }
             
             return Model::factory('gift')->sendGift($user_from, $user_to, $type, $count, $ask_id);
             //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 - энегрия, 1 - money1.
    * Время просбы фиксируется. В случае если игрок, которому напрвляется просьба не отвечает на нее. 
    * Повтороно просьбу можно послать через var.gift_time_limit секунд. Если попытаться послать раньше, 
    * вернется ошибка (-101).
    * В случае если повторная просьба будет послана через var.gift_time_limit секунд, время просбы перезапишется 
    * и будет считаться что именно с этого момента была сделана просьба. 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||gift.ask|||m||0||1||{"user_from":100200301,"type":0,"count":1}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * 
    * [["gift.ask",{"result":1,"gift":{"id":"8","user_id_out":"100200301","user_id_in":"100200300","type":"0","count":"1","status":"1","time":43200}}]]
    * 
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (bigint)  <b>  user_from  </b>  :  номер игрока из соц сети у которого просят подарок (который будет посылает подарок)
    *  -  (int)     <b>  type       </b>  :  тип подарка: 0 - энегрия, 1 - money1, по умолчанию: 0
    *  -  (int)     <b>  count      </b>  :  число даримых объектов, по умолчанию: 1
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (Object)  gift                   :Объект с множеством свойств имя/значение:  
    *  -  -  (int)     gift_id                : номер подарка (табл. "gift" )
    *  -  -  (bigint)  user_from              : номер игрока из соц сети который посылает подарок (у которого просят подарок)
    *  -  -  (bigint)  user_to                : номер игрока из соц сети которому посылается подарок (который просит подарок)
    *  -  -  (int)     status                 : статус подарка (0 - подарок попросили, 1 - подарок послали, ожидание когда его забирут, 2 - подарок забрали)
    *  -  -  (int)     type                   : тип подарка: 0 - энегрия, 1 - money1, по умолчанию: 0
    *  -  -  (int)     count                  : число даримых объектов
    *  -  -  (int)     time                   : время до момента когда можно дарить(просить) подарок - подарить или попросить можно только 1 подарок от 1го человека, поэтому время для того чтобы клиент ориентировался
    */                                          
    public function askAction( $args ){
         try{
             
             $user_from      = -1;  
             if(TRUE == isset($args["user_from"])){
                $user_from = $args["user_from"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_from not exist" ); 
             }
             
             $user_to        = -1;             //кто просит о подарке;  
             if(TRUE == $this->user->id){
                $user_to = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_to not exist" ); 
             }
             
             $type = 0;
             if(TRUE == isset($args["type"])){
                $type = $args["type"];           
             }
             $count = 0;
             if(TRUE == isset($args["count"])){
                $count = $args["count"];           
             }
             
             return Model::factory('gift')->askGift($user_from, $user_to, $type, $count);
             
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "giftController", "askAction", $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||gift.get|||m||0||1||{"gift_id":5}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["gift.get",{"result":1,"gift":{"result":1,"gift":{"id":"8","user_id_out":"100200301","user_id_in":"100200300","type":"0","count":"1","status":"2","time":43200}}}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (bigint)  <b>  user_from  </b>  :  номер игрока из соц сети который посылает подарок  (у которого просят подарок)
    *  -  (int)     <b>  type       </b>  :  тип подарка: 0 - энегрия, 1 - money1, по умолчанию: 0
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;  
    *  -  (Object)  gift                   :Объект с множеством свойств имя/значение:  
    *  -  -  (int)     gift_id                : номер подарка (табл. "gift" )
    *  -  -  (bigint)  user_from              : номер игрока из соц сети который посылает подарок (у которого просят подарок)
    *  -  -  (bigint)  user_to                : номер игрока из соц сети которому посылается подарок (который просит подарок)
    *  -  -  (int)     status                 : статус подарка (0 - подарок попросили, 1 - подарок послали, ожидание когда его забирут, 2 - подарок забрали)
    *  -  -  (int)     type                   : тип подарка: 0 - энегрия, 1 - money1, по умолчанию: 0
    *  -  -  (int)     count                  : число даримых объектов
    *  -  -  (int)     time                   : время до момента когда можно дарить(просить) подарок - подарить или попросить можно только 1 подарок от 1го человека, поэтому время для того чтобы клиент ориентировался
    */                                          
    public function getAction( $args ){
         try{
             
             $user_from      = -1;  
             if(TRUE == isset($args["gift_id"])){
                $gift_id = $args["gift_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"gift_id not exist" ); 
             }
             
             $user_to        = -1;             //кто заказывает дуэль;  
             if(TRUE == $this->user->id){
                $user_to = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_to not exist" ); 
             }
             
             $type = 0;
             if(TRUE == isset($args["type"])){
                $type = $args["type"];           
             }
             $count = 0;
             if(TRUE == isset($args["count"])){
                $count = $args["count"];           
             }
             
             return  Model::factory('gift')->getGift($user_id, $gift_id);
             //return array("result" => 1, "gift" => $gift);
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "giftController", "askAction", $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||gift.refresh|||m||0||1||{}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["gift.refresh",{"result":1,"gift":{"result":1,"gift":[{"id":"7","user_id_out":"100200300","user_id_in":"100200301","type":"0","count":"1","status":"2","time":41708},{"id":"8","user_id_out":"100200301","user_id_in":"100200300","type":"0","count":"1","status":"2","time":43010}]}}]]
    * </code>
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                : "1" - успех / "-x" - ошибка;  
    *  -  (array)  gift_list                  : Массив объектов, каждый объект которого содержит следующие свойства:
    *  -  -  (int)     gift_id                : номер подарка (табл. "gift" )
    *  -  -  (bigint)  user_from              : номер игрока из соц сети который посылает подарок (у которого просят подарок)
    *  -  -  (bigint)  user_to                : номер игрока из соц сети которому посылается подарок (который просит подарок)
    *  -  -  (int)     status                 : статус подарка (0 - подарок попросили, 1 - подарок послали, ожидание когда его забирут, 2 - подарок забрали)
    *  -  -  (int)     type                   : подарка: 0 - энегрия, 1 - money1, по умолчанию: 0
    *  -  -  (int)     count                  : число даримых объектов
    *  -  -  (int)     time                   : время до момента когда можно дарить(просить) подарок - подарить или попросить можно только 1 подарок от 1го человека, поэтому время для того чтобы клиент ориентировался
   */                                          
    public function refreshAction( $args ){
         try{
             
             $user_id        = -1;             //кто заказывает дуэль;  
             if(TRUE == $this->user->id){
                $user_id = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_id not exist" ); 
             }
             
             return Model::factory('gift')->refreshGift($user_id);
             //return array("result" => 1, "gift" => $gift_list);
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "giftController", "refreshAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
         }
     }
}

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

<?php

/**
 * Механизмы отправки и просмотра почтовых сообщений 
 *  
 */
 
class mailController extends abstractController {

    
    /**
    * Посылает письмо
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||mail.send|||m||0||1||{"user_from":100200300,"user_to":100200301,"title":"Тема","text":"Тестовое сообщение"}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mail.send",{"result":1,"mail_id":"6"}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (bigint)  <b>  user_from  </b>  :  номер игрока из соц сети который посылает письмо
    *  -  (bigint)  <b>  user_to    </b>  :  номер игрока из соц сети которому посылается письмо
    *  -  (string)  <b>  title      </b>  :  заголовок письма (не обязательно) (максимум 100 символов, подрезается)
    *  -  (string)  <b>  text       </b>  :  текст письма (максимум 200 символов, подрезается)
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (int)     mail_id                : номер сообщения из табл. "mail" 
    */                                          
    public function sendAction( $args ){
         try{
             $user_from = $this->user->id;
             $user_to   = $args['user_to'];
             $title     = $args['title'];
             $text      = $args['text'];
             
             $mail_id = Model::factory('mail')->sendMail($user_from, $user_to, $title, $text);
             return array("result" => 1, "mail_id" => $mail_id);
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "mailController", "sendAction", $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||mail.del|||m||0||1||{"mail_id":6}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mail.del",{"result":1,"mail_id":"6"}]]
    * </code> 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)  $mail_id  :  номер письма из табл. mail
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка; 
    *  -  (int)     mail_id                : id удаленного письма
    */
    public function delAction( $args ){
         try{
             $mail_id = $args['mail_id'];
             Model::factory('mail')->deleteMail($this->user->id, $mail_id);
		     return array("result" => 1, "mail_id" => $mail_id);
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "mailController", "delAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
         }
    }
     
    /**
    * Изменяет статс письма 
    * 
    * Изменяет статс письма с "непрочитано" = 0 на "прочитано" = 1
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||mail.change_status|||m||0||1||{"mail_id":6}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mail.change_status",{"result":1,"mail_id":7}]]
    * </code> 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)  <b>  mail_id  </b>  :  номер письма из табл. mail
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (int)     mail_id                : id письма
    */ 
    public function change_statusAction( $args ){
         try{
             $mail_id = $args['mail_id'];
             Model::factory('mail')->changeMailReadStatus($this->user->id, $mail_id);
             return array("result" => 1, "mail_id" => $mail_id);
         
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "mailController", "change_statusAction", $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||100200301|||s_key||-1|||m||0||0||mail.get_mail_in|||m||0||1||{}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mail.get_mail_in",{"result":1,"mail_in":[{"id":"1","date":"1375772715","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст1","read_status":"0"},{"id":"2","date":"1375772778","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст1","read_status":"0"},{"id":"3","date":"1375772810","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст1","read_status":"0"},{"id":"4","date":"1375773225","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст1","read_status":"0"},{"id":"5","date":"1375773449","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст-пример1","read_status":"0"},{"id":"7","date":"1389124841","user_id_out":"100200300","user_id_in":"100200301","title":"Тема","text":"Тестовое сообщение","read_status":"1"},{"id":"8","date":"1389125319","user_id_out":"100200300","user_id_in":"100200301","title":"Тема","text":"Тестовое сообщение","read_status":"0"},{"id":"9","date":"1389125321","user_id_out":"100200300","user_id_in":"100200301","title":"Тема","text":"Тестовое сообщение","read_status":"0"}]}]]
    * </code> 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (array)   mail_in                : <b>Входящие сообщения</b>. Массив объектов, каждый объект которого содержит следующие свойства:
    *  -  -  (int)      id                      : порядковый номер сообщения в общем списке
    *  -  -  (int)      date                    : вермя отправки сообщения (timestamp)
    *  -  -  (bigint)   user_id_out             : id-игрока отправителя 
    *  -  -  (bigint)   user_id_in              : id-игрока получателя 
    *  -  -  (string)   title                   : заглавие письма
    *  -  -  (string)   text                    : текст письма
    *  -  -  (int)      read_status             : статус прочтения (1 - прочтено, 0 - не прочтено)
    * 
    */
     public function get_mail_inAction(){
         try{
             $user_id = $this->user->id;
             return Model::factory('mail')->getUserMailIn($user_id);
         
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "mailController", "get_mail_inAction", $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||mail.get_mail|||m||0||1||{}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["mail.get_mail",{"result":1,"mail":[{"id":"1","date":"1375772715","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст1","read_status":"0"},{"id":"2","date":"1375772778","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст1","read_status":"0"},{"id":"3","date":"1375772810","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст1","read_status":"0"},{"id":"4","date":"1375773225","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст1","read_status":"0"},{"id":"5","date":"1375773449","user_id_out":"100200300","user_id_in":"100200301","title":"Заголовок1","text":"Текст-пример1","read_status":"0"},{"id":"7","date":"1389124841","user_id_out":"100200300","user_id_in":"100200301","title":"Тема","text":"Тестовое сообщение","read_status":"1"},{"id":"8","date":"1389125319","user_id_out":"100200300","user_id_in":"100200301","title":"Тема","text":"Тестовое сообщение","read_status":"0"},{"id":"9","date":"1389125321","user_id_out":"100200300","user_id_in":"100200301","title":"Тема","text":"Тестовое сообщение","read_status":"0"}]}]]
    * </code> 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (array)   mail                   : <b>Cообщения</b>. Массив объектов, каждый объект которого содержит следующие свойства:
    *  -  -  (int)      id                      : порядковый номер сообщения в общем списке
    *  -  -  (int)      date                    : вермя отправки сообщения (timestamp)
    *  -  -  (bigint)   user_id_out             : id-игрока отправителя 
    *  -  -  (bigint)   user_id_in              : id-игрока получателя 
    *  -  -  (string)   title                   : заглавие письма
    *  -  -  (string)   text                    : текст письма
    *  -  -  (int)      read_status             : статус прочтения (1 - прочтено, 0 - не прочтено)
    * 
    */
     public function get_mailAction(){
         try{
             $user_id = $this->user->id;
             return Model::factory('mail')->getUserMailAll($user_id);
        
         } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "mailController", "get_mailAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
         }
     }  
}

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

<?php
/**
 * 
 * Класс модели пользователя
 * Функции взаимодействия профилем игрока.
 * Для всех запросов uid пользователя должен быть в подписи к запросам.
 * <br>Для всех нижеперечисленных запросов <b>кроме {@link userController::initAction()}</b> подразумевается, 
 * что нужно добавить в подпись s_key (в случае если он включен в config-файле).
 * 
 * <br> В качестве первого запроса, инициализирующего пользоватлея следует использовать {@link userController::initAction()}, 
 * он же создаст профиль нового пользователя в случае если он не существует. 
 * 
 * 
 * @todo вынести информацию про s_key и подписи на страницу приветствия. 
 */
 
class userController extends abstractController 
{
    
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    
    /**
    * @ignore
    * Инициализация нового пользователя в игре. 
    * 
    * Инициализация нового пользователя в игре. 
    * 
    * <br>Запрос не требует в подписи id-пользователя(uid).
    * <br>Запрос не требует ключа сессии(s_key), в случае если он включен.
    * <br>В качестве альтернативы данному запросу и для упрощения, функцианал инициализации нового пользователя 
    * добавлен запросу {@link  userController::initAction()}. 
    * Возвращаемые значения функций   {@link userController::new_userAction()} и  {@link userController::initAction()} полностью идентичны. В том числе 
    * - Запрос не требует ключа сессии(s_key), в случае если он включен в config.  
    * - Назначает новый ключ игровой сессии s_key, в случае если он включен в config.
    * 
    * <b>При создании нового игрока:</b>
    *  -  Игроку будут отданы бустеры перечисленные в vars.base_booster, число кажого из них = vars.base_booster_count 
    * 
    * <br>Пример запроса к серверу:
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.new_user|||m||0||1||{}
    * </code>
    * 
    * <br>Пример ответа от сервера:
    * <br> 
    * <code>
    * [["user.new_user",{"result":1,"user":{"money1":"100","money2":"1","energy":"100","energy_max":"100","game_out":"0","game_out_max":"5","game_in":"0","game_in_max":"10","point":"0","star":"0"},"daily_bonus":{"flag_daily_bonus":1,"count_of_days":0},"user_playlist":[{"id":"162","playlist_id":"0","use_status":"1","use_count":"1"},{"id":"163","playlist_id":"1","use_status":"1","use_count":"1"},{"id":"164","playlist_id":"2","use_status":"0","use_count":"5"},{"id":"165","playlist_id":"3","use_status":"0","use_count":"5"}],"user_booster":{"type0":"2","type1":"2","type2":"0","type3":"0","type4":"0","type5":"0","type6":"0","type7":"0","type8":"0","type9":"0"},"game_list":[],"round_list":[],"statistics_game_detail":[]}]]
    * </code> 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                    : "1" - успех / "-x" - ошибка;
    *  -  (Object)  user                      : <bДанные игрока</b>. Объект, с множеством свойств имя/значение:
    *  -  -  (int)     money1                    : валюта1;
    *  -  -  (int)     money2                    : валюта2;
    *  -  -  (int)     energy                    : энергия;
    *  -  -  (int)     energy_max                : максимальное самовосполняемое кол-во энергии;
    *  -  -  (int)     time_to_next_recovery       : время(в сек.) до следующего восстановления энергии. Если time_to_next_recovery = -1, то восстановление не происходит. Энергия восстанавливается через кадждые vars.energy_recovery_time_period на vars.energy_recovery_count пунктов;
  
	*  -  -  (int)     game_out                  : кол-во текущих исходящих игр;
    *  -  -  (int)     game_out_max              : кол-во возможных исходящих игр;
    *  -  -  (int)     game_in                   : кол-во текущих входящих игр;
    *  -  -  (int)     game_in_max               : кол-во возможных входящих игр;
    
	//  -  -  (int)     point                     : число очков набранное игроком(не может быть больше vars.points_in_star, если превышает то добавляется +1 star и далее наполнение продолжается с 0 до vars.points_in_star и т.д.);
    //  -  -  (int)     star                      : число звезд, накапливается в течении игры;
    
	*  -  (Object)  daily_bonus               : <b>Данные о ежедневном бонусе игрока</b>. Объект, с множеством свойств имя/значение:
    *  -  -  (int)     flag_daily_bonus          : флаг (1 - ежедневный бонус начислен, 0 - не начислен);
    *  -  -  (int)     count_of_days             : число дней подряд, без пропуска, которое игрок заходит в игру. (от 0 до 6). <b>Если flag_daily_bonus=0 не пресылается</b>;
    *  -  (Object)  user_booster              : <b>Данные о бустерах которые есть в наличи у пользователя</b>. Объект, с множеством свойств имя/значение:
    *  -  -  (int)     type0                     : кол-во плейлистов типа0, которые есть в наличии у игрока.
    *  -  -  (int)     type1                     : кол-во плейлистов типа1, которые есть в наличии у игрока.
    *  -  -  (int)     type2                     : кол-во плейлистов типа2, которые есть в наличии у игрока.
    *  -  -  (int)     type3                     : кол-во плейлистов типа3, которые есть в наличии у игрока.
    *  -  -  (int)     type4                     : кол-во плейлистов типа4, которые есть в наличии у игрока.
    *  -  -  (int)     type5                     : кол-во плейлистов типа5, которые есть в наличии у игрока.
    *  -  -  (int)     type6                     : кол-во плейлистов типа6, которые есть в наличии у игрока.
    *  -  -  (int)     type7                     : кол-во плейлистов типа7, которые есть в наличии у игрока.
    *  -  -  (int)     type8                     : кол-во плейлистов типа8, которые есть в наличии у игрока.
    *  -  -  (int)     type9                     : кол-во плейлистов типа9, которые есть в наличии у игрока.
    *  -  -  (int)     type9                     : кол-во плейлистов типа9, которые есть в наличии у игрока.
    *  -  (array)   game_list                 : <b>Информация о запущенных играх</b>. При создании пользователя, должен быть пустым.
    *  -  (array)   round_list                : <b>Информация о запущенных раунда</b>. При создании пользователя, должен быть пустым.
    *  -  (array)   statistics_game_detail    : <b>Статистическа информация относящаяся к игроке</b>. При создании пользователя, должен быть пустым.
    *  -  все возвращаемые данные данные сходы с {@link  userController::initAction()}
    * 
    */
    private function new_userAction(){ 
        try{

            $this->user->saveProfile();
            $user_id = $this->user->id;
            
            return $this->user->initUser();
            
        } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "new_userAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }                                                                                                                           
    }
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    /**
    * Инициализация конкретного пользователя в игре. 
    * 
    * 
    * Возвращает информацию о пользователе в игре. 
    * В случае если профиля пользователя не существует, создается новый профиль.
    * - Запрос не требует ключа сессии(s_key), в случае если он включен в config-файле.  
    * - Назначает новый ключ игровой сессии s_key, в случае если он включен в config-файле.
    * <br>Запрос вызывается клинетом при каждом новом запуске игры.
    * 
    * <b>При создании нового игрока:</b>
    *  -  Игроку будут отданы бустеры перечисленные в vars.base_booster, число кажого из них = vars.base_booster_count 
    * 
    * <br>Пример запроса к серверу:
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||user.init|||m||0||1||{}
    * </code>
    * 
    * <br>Пример ответа от сервера:
    * <br> 
    * <code>
    * 
    * [["user.init",{"result":1,"user":{"money1":150,"money2":1,"energy":8,"energy_max":"5","time_to_next_recovery":-1},"daily_bonus":{"flag_daily_bonus":0,"count_of_days":0},"lottery_bonus":{"flag_lottery_bonus":0},"user_booster":{"type0":"3","type1":"3","type2":"0","type3":"0","type4":"0","type5":"3","type6":"0","type7":"0","type8":"0","type9":"0"},"company":[],"stage":[],"stage_key":[{"id":"3208580","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"0","status":"1","time":531},{"id":"3208581","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"0","status":"1","time":531},{"id":"3208582","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"0","status":"1","time":531},{"id":"3208583","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"100","status":"1","time":531},{"id":"3208584","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"100","status":"1","time":531},{"id":"3208585","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"100","status":"1","time":531},{"id":"3208586","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"200","status":"1","time":531},{"id":"3208587","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"200","status":"1","time":531},{"id":"3208588","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"200","status":"1","time":531},{"id":"3208589","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"300","status":"1","time":531},{"id":"3208590","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"300","status":"1","time":531},{"id":"3208591","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"300","status":"1","time":531},{"id":"3208592","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"400","status":"1","time":531},{"id":"3208593","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"400","status":"1","time":531},{"id":"3208594","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"400","status":"1","time":531},{"id":"3208595","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"500","status":"1","time":531},{"id":"3208596","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"500","status":"1","time":531},{"id":"3208597","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"500","status":"1","time":531},{"id":"3208598","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"600","status":"1","time":531},{"id":"3208599","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"600","status":"1","time":531},{"id":"3208600","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"600","status":"1","time":531},{"id":"3208601","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"700","status":"1","time":531},{"id":"3208602","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"700","status":"1","time":531},{"id":"3208603","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"700","status":"1","time":531},{"id":"3208604","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"800","status":"1","time":531},{"id":"3208605","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"800","status":"1","time":531},{"id":"3208606","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"800","status":"1","time":531},{"id":"3208607","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"900","status":"1","time":531},{"id":"3208608","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"900","status":"1","time":531},{"id":"3208609","user_id":"100200710","user_donator_id":"556818369153","stage_stat_id":"900","status":"1","time":531}],"stage_time":[],"mission":[],"friend_bonus_list":[],"first_input_flag":0,"arr_event":[]}]]
    * 
    * </code> 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                    : "1" - успех / "-x" - ошибка;
    *  -  (Object)  user                      : <b>Данные игрока</b>. Объект, с множеством свойств имя/значение:
    *  -  -  (int)     money1                      : валюта1;
    *  -  -  (int)     money2                      : валюта2;
    *  -  -  (int)     energy                      : энергия;
    *  -  -  (int)     energy_max                  : максимальное самовосполняемое кол-во энергии;
    *  -  -  (int)     time_to_next_recovery       : время(в сек.) до следующего восстановления энергии. Если time_to_next_recovery = -1, то восстановление не происходит. Энергия восстанавливается через кадждые vars.energy_recovery_time_period на vars.energy_recovery_count пунктов;
    * 
    //   -  -  (int)     energy_type                 : тип используемой энергии (0 - обычная энергия, 1- безграничная энергия на 1 день, полностью безграничная энергия)
    //   -  -  (int)     time_to_unlimited_end       : время(timestamp) окончания действия режима бесконечной энергии. поле полезно только при использовании energy_type=1, в остальных случиях игнорируется. 
 
 
    *  -  (Object)  daily_bonus               : <b>Данные о ежедневном бонусе игрока</b>. Объект, с множеством свойств имя/значение:
    *  -  -  (int)     flag_daily_bonus            : <br> == 0 : бонус не доступен или уже получен в предыдущие запуски игры.
    *                                                <br> == 1 : пользователь получил бонус (Если vars.daily_bonus_accept_default == 1 или константы не существует).
    *                                                <br> == 1 : бонус доступен для того чтобы пользователь его забрал (Если  vars.daily_bonus_accept_default == 0)
    *                                                
    *  -  -  (int)     count_of_days               : число дней подряд, без пропуска, которое игрок заходит в игру. 
    * 
    *  -  (Object)  lottery_bonus               : <b>Данные о восстановлении попытки воспользоваться лотереей игрока (+ 1 money2, учитывается в user[money2])</b>. Объект, с множеством свойств имя/значение:
    *  -  -  (int)     flag_lottery_bonus            : флаг (1 - плюс одна попытка использовать лотерею (+ 1 money2, учитывается в user[money2]), 0 - не начислено попыток);
    * 
    * 
    *  -  (Object)  user_booster              :  <b>Данные о бустерах которые есть в наличи у пользователя</b>. Объект, с множеством свойств имя/значение:
    *  -  -  (int)     type0                       : кол-во плейлистов типа0, которые есть в наличии у игрока.
    *  -  -  (int)     type1                       : кол-во плейлистов типа1, которые есть в наличии у игрока.
    *  -  -  (int)     type2                       : кол-во плейлистов типа2, которые есть в наличии у игрока.
    *  -  -  (int)     type3                       : кол-во плейлистов типа3, которые есть в наличии у игрока.
    *  -  -  (int)     type4                       : кол-во плейлистов типа4, которые есть в наличии у игрока.
    *  -  -  (int)     type5                       : кол-во плейлистов типа5, которые есть в наличии у игрока.
    *  -  -  (int)     type6                       : кол-во плейлистов типа6, которые есть в наличии у игрока.
    *  -  -  (int)     type7                       : кол-во плейлистов типа7, которые есть в наличии у игрока.
    *  -  -  (int)     type8                       : кол-во плейлистов типа8, которые есть в наличии у игрока.
    *  -  -  (int)     type9                       : кол-во плейлистов типа9, которые есть в наличии у игрока.
     * 
    *  -  (array)   company                   : <b>компании в которых учавствует игрок</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер компании в табл.company
    *  -  -  (int)     company_stat_id            : id в табл. company_stat
    * 
    *  -  (array)   stage                     : <b>этапы которые открыты у игрока</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер компании в табл.company
    *  -  -  (int)     stage_stat_id              : id в табл. stage_stat
    *  -  -  (int)     star                       : звезды на каждом этапе считаются отдельно (сумма звезд всех пройденных миссий)
    *  -  -  (int)     flag_complete              : флаг - завершен ли этап 
    * 
    *  -  (array)   stage_key                 : <b>ключи для этапов которые игрок попросил у друзей или которые игрок уже получил от друзей</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер просьбы ключа. соотвествует id в табл. stage_key
    *  -  -  (bigint)  user_id                    : номер игрока из соц сети который просит ключ (при status = 0) или обладает ключем (при status = 1)
    *  -  -  (bigint)  user_donator_id            : номер игрока из соц сети у которого просят ключ
    *  -  -  (int)     stage_stat_id              : номер этапа, соотвествует id в табл. stage_stat                 
    *  -  -  (int)     status                     : статус ключа 0 - ключ попросили и друга. 1 - друг в ответ на просбу прислал ключ, т.е. он уже есть у игрока
    *  -  -  (int)     time                       : время до момента когда можно напомнить о просьбе. просить можно только 1 ключ. если status = 1 то в этом поле время с момента когда ключ послали
    * 
    *  -  (array)   stage_time                 : <b>время до открытия следующего этапа (если один или несколько из предыдущих этапов завершены)</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     stage_stat_id              : id в табл. stage_stat
    *  -  -  (int)     time                       : сколько осталось до открытия этапа
    * 
    *  -  (array)   mission                   : <b>миссии которые игрок прошел или пытался пройти</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер миссии в табл.mission
    *  -  -  (int)     mission_stat_id            : id в табл. mission_stat
    *  -  -  (int)     point                      : кол-во очков за миссию
    *  -  -  (int)     star                       : кол-во звезд за миссию
    *  -  (array)   friend_bonus_list         : <b>друзья которые приняли приглашение от игрока с последнего визита игрока в игру. за каждого друга игрок получает бонус: var.friend_invite_bonus_money1 и var.friend_invite_bonus_energy </b>. Массив id друзей 
    *  -  (int)     first_input_flag          : <b>флаг определяет первый заход в игру (1) или не первый (0)
    *  -  (Object)  arr_event              : Список событий доступных игроку. Массив объектов, каждый объект которого содержит следующие свойства: :  
    *  -  -  (int)     event_stat_id       : порядковый номер события из таблицы event.stat
    *  -  -  (int)     time_to_use         : сколько времени до следующего использования (в секундах)
    */
    public function initAction(){ 
        try{
            if($this->user->exist()){    
                return $this->user->initUser();
            } else {
                $this->user->saveProfile();
                
                $first_input_flag = 1;
                return $this->user->initUser( $first_input_flag );
            }
        } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "initAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }
    
    
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    /**
    * Основные данные пользователя
    * 
    * Возвращает основные данные о пользователе 
    * 
    * <br>Пример запроса к серверу:
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.get_profile_data|||m||0||1||{}
    * </code>
    * 
    * <br>Пример ответа от сервера:
    * <br> 
    * <code>
    * [["user.get_profile_data",{"result":1,"user":{"id":"100200710","money1":1040,"money2":1041,"energy":160,"energy_max":115,"game_out":"0","game_out_max":8,"game_in":"0","game_in_max":16,"time_to_next_recovery":-1}}]]
    * </code>
    *  
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (Object)  user                   : <bДанные игрока</b>. Данные приводятся для случая, когда арумент "full":false. В случае если "full":true, приводятся допольнительные данные в данный момент не используемые. Объект, с множеством свойств имя/значение:
    *  -  -  (int)     money1                      : валюта1;
    *  -  -  (int)     money2                      : валюта2;
    *  -  -  (int)     energy                      : энергия;
    *  -  -  (int)     energy_max                  : максимальное самовосполняемое кол-во энергии;
    // -  -  (int)     energy_type                 : тип используемой энергии (0 - обычная энергия, 1- безграничная энергия на 1 день, полностью безграничная энергия)
    *  -  -  (int)     time_to_next_recovery       : время(в сек.) до следующего восстановления энергии. Если time_to_next_recovery = -1, то восстановление не происходит. Энергия восстанавливается через кадждые vars.energy_recovery_time_period на vars.energy_recovery_count пунктов;
    *  -  -  (array)   mission                   : <b>миссии которые игрок прошел или пытался пройти</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  -  (int)     id                         : номер миссии в табл.mission
    *  -  -  -  (int)     mission_stat_id            : id в табл. mission_stat
    *  -  -  -  (int)     point                      : кол-во очков за миссию
    *  -  -  -  (int)     star                       : кол-во звезд за миссию
   
    * 
    */
    public function get_profile_dataAction(){
        try{
        
            $data = $this->user->getProfileData(); 
            return array("result" => 1, "user" => $data);
       
        } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "get_profile_dataAction", $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||100200710|||s_key||-1|||m||0||0||user.get_profile|||m||0||1||{"full":true,"ids":{"0":100200300,"1":100200710}}
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.get_profile|||m||0||1||{"full":false}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["user.get_profile",{"result":1,"users":[{"id":"100200300","name":"unknow","level":"1","exp":"0.00000000000000","money1":"150","money2":"1","energy":"490","energy_max":"5","time_to_next_recovery":-1,"mission":[{"id":"1","mission_stat_id":"0","point":"200","star":"3"}]},{"id":"100200710","name":"unknow","level":"1","exp":"0.00000000000000","money1":"220","money2":"1","energy":"500","energy_max":"5","time_to_next_recovery":-1,"mission":[]}]}]]
    * </code
    *  
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (string)  <b>  full  </b> :  Возвращаться краткую выборку (full="true") или полную( full="false")
    *  -  (array)   <b>  ids   </b>  :  Массив id-играков, данные которых требуется найти. Не обязательное поле. В случае его отсутствия вернутся данные пользоватля отправляющего запрос. 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    *  -  (Object)  users                  : <b>Данные игроков</b>. Данные приводятся для случая, когда арумент "full":false. В случае если "full":true, приводятся допольнительные данные в данный момент не используемые. Массив объектов, каждый объект которого содержит следующие свойства:
    *  -  -  (int)     money1                      : валюта1;
    *  -  -  (int)     money2                      : валюта2;
    *  -  -  (int)     energy                      : энергия;
    *  -  -  (int)     energy_max                  : максимальное самовосполняемое кол-во энергии;
    // -  -  (int)     energy_type                 : тип используемой энергии (0 - обычная энергия, 1- безграничная энергия на 1 день, полностью безграничная энергия)
    *  -  -  (int)     time_to_next_recovery       : время(в сек.) до следующего восстановления энергии. Если time_to_next_recovery = -1, то восстановление не происходит. Энергия восстанавливается через кадждые vars.energy_recovery_time_period на vars.energy_recovery_count пунктов;
    *  -  -  (int)     time_to_next_recovery       : время(в сек.) до следующего восстановления энергии. Если time_to_next_recovery = -1, то восстановление не происходит. Энергия восстанавливается через кадждые vars.energy_recovery_time_period на vars.energy_recovery_count пунктов;
    *  -  -  (array)   mission                   : <b>миссии которые игрок прошел или пытался пройти</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  -  (int)     id                         : номер миссии в табл.mission
    *  -  -  -  (int)     mission_stat_id            : id в табл. mission_stat
    *  -  -  -  (int)     point                      : кол-во очков за миссию
    *  -  -  -  (int)     star                       : кол-во звезд за миссию
   */
    public function get_profileAction($args){
        try{
        
            $full  = $args['full'];
            $ids   = $args['ids'];
            
            if(is_array($ids)){ 
                $data = $this->user->getProfile($full, $ids);               
            } else {
                $data[0] = $this->user->getProfile($full); 
            }  
            return array("result" => 1, "users" => $data); 
       
        } catch (Exception $e){
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "get_profileAction");
            throw new Exception ($e->getMessage(), $e->getCode());
        }     
    } 
    
    

   
   
   
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    /**
     * Начисляет/снимает валюту игрока
     * Не использовать функцию клиентом напрямую
     * @ignore
     * !Не использовать функцию клиентом напрямую
     * @param  array  $args  массив входных данные
     *  -  (int)   money1    : Валюта1 
     *  -  (int)   money2    : Валюта2 
     *  -  (int)   reason_id : Тип операции (соответствует одному из значений перечесления возможных операций с валютами) 
     * @return int 
     */   
    public function change_moneyAction($args){
        try{
            if(0){    
            $money1    = $args['money1'];
            $money2    = $args['money2'];
            $reason_id = $args['reason_id'];
                
            return $this->user->changeMoney($money1, $money2, $reason_id);
            }
        } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "change_moneyAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
        
    }  
     /**



     * Изменяет эренигю у игрока. 
     * Возможно уменьшение энегрии, увеличение не производится.
     * 
       * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.check_energy|||m||0||1||{"energy":"-1","reason_id":"1"}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["user.change_energy",{"result":1,"energy":"-1","reason_id":"1","user_energy":0}]]
     * </code> 
* 
     * @param  array  $args  массив входных данные




     *  -  (int)   energy    : кол-во энергии (при уменьшении, число должно быть отрицательным)
     *  -  (int)   reason_id : Тип операции (для статистики)
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)   result                 : "1" - успех / "-x" - ошибка;
     *  -  (int)   energy      : кол-во энергии (при уменьшении, число должно быть отрицательным)
     *  -  (int)   reason_id   : Тип операции (для статистики)
     *  -  (int)   user_energy : текущее кол-во энергии у игрока
     */   
    public function change_energyAction($args){
        try{



            
            
             $energy = 0;
             if(TRUE == isset($args["energy"])){
                $energy = $args["energy"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"energy not exist" ); 
             } 
             $reason_id = 0;
             if(TRUE == isset($args["reason_id"])){
                $reason_id = $args["reason_id"];           

             } else {
                errors::exc(errors::errorIncorrectInput,"reason_id not exist" ); 
             } 
                
             if($energy >= 0){
                return array("result" => -17, "text" => "adding energy impossible");
             }
                
             $user_energy = 0;
                
                                                                                        
             if($this->user->changeEnergy($energy, $reason_id, $user_energy)){

                return array("result" => 1, "energy" => $energy, "reason_id" => $reason_id, "user_energy" => $user_energy);
             } else {
                return array("result" => -18, "text" => "error in changes of energy");
             }
        
            //---------------------------------------------------------

        } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "change_energyAction", $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||100200710|||s_key||-1|||m||0||0||user.check_energy|||m||0||1||{}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["user.check_energy",{"result":1,"user_energy":{"energy":22,"energy_max":"100","time_to_next_recovery":27}}]]
     * </code> 
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     *  -  (Object)  energy                : <b>Данные о энергии игрока</b>. Массив объектов, каждый объект которого содержит следующие свойства:
     *  -  -  (int)    energy                      : энергия
     *  -  -  (int)    energy_max                  : максимальное кол-во восполняемой энергии 
     *  -  -  (int)    time_to_next_recovery       : время до следующего восполнения, в секундах (-1 , если восполнение не требуется)
     //  -  -  (int)    energy_type                 : тип энергии 0 - обычная, 1 - бесконечная на 1 день, 2 - бесконечная
     //  -  -  (int)    time_to_unlimited_end       : сколько секунд осталось до окончания периода бесконечности   (актуально только при energy_type = 1)

     * 
     * 
     */
     public function check_energyAction(){
            try{
                return array("result" => 1, "user_energy" => $this->user->checkEnergyRecoveryStatus());
            } catch (Exception $e){
         
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "check_energyAction", $this->user->id);
            return errors::errorException;  
        }
     }
     
    /**
    * 
    * Покупка Валюты1 за игровые ресурсы
    * 
    * Покупка Валюты1 за Валюту2
    * 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.buy_money1|||m||0||1||{"price_id":0}
    * </code> 
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>                                
    * [["user.buy_energy",{"result":1}]]   
    * </code>
    * 
    * @param  Object Входные данные. Объект со свойством имя/значение:
    *  -  (int)   <b>  price_id  </b>  :   позиция в прайсе (табл. shop_money1_stat)
    * 
    *  
    * @return Object Объект со свойстовм имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    * 
    */
     public function buy_money1Action($args){
            try{
                $price_id    = $args['price_id'];   
                if( $this->user->buyMoney1($price_id)){
                    return array("result" => 1);
                } else {
                    return array("result" => 0);
                }
            } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "buy_money1Action", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
     }
     
      /**
    * 
    * Покупка Валюты2 за игровые ресурсы
    * 
    * Покупка Валюты2 за Валюту1
    * 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.buy_money2|||m||0||1||{"price_id":0}
    * </code> 
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>                                
    * [["user.buy_money2",{"result":1}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект со свойством имя/значение:
    *  -  (int)   <b>  price_id  </b>  :   позиция в прайсе (табл. shop_money2_stat)
    * 
    *  
    * @return Object Объект со свойстовм имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    * 
    */
     public function buy_money2Action($args){
            try{
                $price_id    = $args['price_id'];   
                if( $this->user->buyMoney2($price_id)){
                    return array("result" => 1);
                } else {
                    return array("result" => 0);
                }
            } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "buy_money2Action", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
     }
     
     
    /**
    * 
    * Покупка энергии 
    * 
    * В момент покупки, пересчитается текущее кол-во энергии у пользователя, 
    * и к этому значению добавится кол-во едниниц указанное в прайсе.
    * В случае покупки, значение energy может стать больше значения максимально восстанавливаемой энергии energy_max.
    // <br>Если в данный момент тип energy_type = 0, может быть куплена как энегрия energy_type = 2 и energy_type = 1
    // <br>Если в данный момент тип energy_type = 1, может быть куплена только energy_type = 2
    // <br>Если в данный момент тип energy_type = 2, уже нельзя покупать энергию
    * 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.buy_energy|||m||0||1||{"price_id":0}
    * </code> 
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["user.buy_energy",{"result":1}]]
    * </code>
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int)   <b>  price_id  </b>  :   позиция в прайсе (табл. shop_energy_stat)
    * 
    *  
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
    * 
    */
     public function buy_energyAction($args){
            try{
                $price_id    = $args['price_id'];   
                if( $this->user->buyEnergy($price_id)){
                    return array("result" => 1);
                } else {
                    return array("result" => 0);
                }
            } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "buy_energyAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
         
     }
     
    /**
    * 
     * Увеличение верхней границы значения восполняемой энергии восполняемой энергии за игровые ресурсы (Валюта1, Валюта2)
     * 
     * Увеличение верхней границы значения восполняемой энергии восполняемой энергии за игровые ресурсы (Валюта1, Валюта2)
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.buy_energy_max|||m||0||1||{"price_id":0}
     * </code> 
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["user.buy_energy_max",{"result":1}]]
     * </code>
     * 
     * 
     * @param Object Входные данные. Объект с множеством свойств имя/значение:
     * - (int)   <b>  price_id  </b>  :   позиция в прайсе (табл. shop_energy_max_stat)
     * 
     *    
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     * 
     */
     
     public function buy_energy_maxAction($args){
            try{
                $price_id    = $args['price_id'];   
                if($this->user->buyEnergyMax($price_id)){
                    return array("result" => 1);
                } else {
                    return array("result" => 0);
                }
            } catch (Exception $e){
             
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "buy_energy_maxAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
     }
     
     
     
    /**
     * Покупка нового этапа 
     * @ignore
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://10.10.77.74/honey/vk/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.buy_stage|||m||0||1||{"cost_type":0}
     * http://10.10.77.74/honey/vk/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.buy_stage|||m||0||1||{"cost_type":2,"friends_array":["100200300","100200305","100200308"]}
     * </code> 
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * http://10.10.77.74/honey/vk/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.buy_stage|||m||0||1||{"cost_type":0}
     * </code>
     * 
     * @param  Object Входные данные. Объект с множеством свойств имя/значение:
     *  -  (int)   <b>  cost_type  </b>  : за что покупается новый этап:
     // <br> 0 - за stars(items).  кол-во stars у игрока не меняется, просто stars должно быть достаточно
     * <br> 1 - за money1. с игрока списывается money1.
     * <br> 2 - за friends.  сервер проверяет достаточно ли друзей, веря при этом, тому кол-ву друзей который присылвает клиент.
     *  -  (int)   <b>  friends_array  </b>  : массив друзей игрока. Параметр обязателен только для cost_type = 2
     * 
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     *  -  (int)     stage                  : этап на котором сейчас игрок
     * 
     */
     
     public function buy_stageAction($args){
         try{
             $cost_type = 0;
             if(TRUE == isset($args["cost_type"])){
                 $cost_type = $args["cost_type"];           
             } else {
                 errors::exc(errors::errorIncorrectInput,"cost_type id not exist" ); 
             }
             
             $friends_count = 0;
             if($cost_type == 2){
                 if(TRUE == isset($args["friends_array"])){
                     $friends_array = $args["friends_array"];           
                 } else {
                     errors::exc(errors::errorIncorrectInput,"friends_array not exist" ); 
                 }             
             }
             
             
                                  
              $user_stage = 0;     
              if($this->user->buyStage($cost_type, $user_stage, $friends_array)){
                  return array("result" => 1, "stage" => $user_stage);
              } else {
                  return array("result" => 0, "stage" => $user_stage);
              }
         } catch (Exception $e){
         
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "buy_energy_maxAction", $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||100200710|||s_key||-1|||m||0||0||user.accept_invitation|||m||0||1||{"user_inviter_id":100200300}
     * </code> 
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["user.accept_invitation",{"result":1}]]
     * </code>
     * 
     * 
     * @param Object Входные данные. Объект с множеством свойств имя/значение:
     * - (int)   <b>  user_inviter_id  </b>  :   id игрока чьим приглашением воспользвался текущий пользователь
     * 
     *    
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     * 
     */
    public function accept_invitationAction($args){ 
       try{
           
             $user_inviter_id = -1;  
             if(TRUE == isset($args["user_inviter_id"])){
                $user_inviter_id = $args["user_inviter_id"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_inviter_id not exist" ); 
             }
    
           return $this->user->acceptInvitation( $user_inviter_id);
    
       } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "accept_invitation", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
       }
    } 
    
    
   
	   //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    /**
     * Поиск последних операций покупки товара за валюту соц.сети (последние платежи), с последующим изменениме их 
     * статуса на "просмотренные клиентом". 
     * <br> Пояснения:
     * <br>Все необходимые начисления купленных товаров со стороны сервера производятся непосредственно
     * в момент успешного завершения платежа. 
     * При этом, в момент завершения платежа, платеж помечается как "не просмотренный клиентом".
     * Данный статус изменяется на "просмотренный клиентом" в следующих случаях:
     * <br> 1) клиент проводит повторную инициализацию (перезагрузит игру) {@link userController::initAction()},
     *  в этому случае вся информация о купленных товарах отражается в возвращаеой при инициализации 
     *  информации;
     * <br> 2) клиент запускает текущую функцию {@link userController::check_ordersAction()} для получаения новой 
     *  информации о выполненном платеже(платежах) с целью обновления текущих данных. 
     *                
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||user.check_orders|||m||0||1||{}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["user.check_orders",{"result":1,"user_orders":[{"item_id":"6"},{"item_id":"6"}]}]]
     * </code> 
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     *  -  (Object)  user_orders            : Осуществленные платежи, еще не просмотренные клиентом. Массив объектов, каждый объект которого содержит следующие свойства:
     *  -  -  (int)    item_id                 : номер позиции в прайсе товаров, соотвествует id в табл. shop_social_stat (запись в таблице по текущему id содержит исчерпывающую информацию по преобретенному товару).
     * 
     * 
     */
     public function check_ordersAction(){
            try{
                
                return array("result" => 1, "user_orders" => Model::factory("user_orders")->get_and_change_uninform_orders( $this->user->id ));
            } catch (Exception $e){
         
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "check_energyAction", $this->user->id);
            return errors::errorException;  
        }
     } 
	 
	 
	 
	 
	 
	//--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //не доделанные функции:
    
    /**
    * Запомнить профиль пользователя
    * 
    * @ignore
    * @return mixed|multitype: mixed
    */
	private function saveProfileAction($args){ 
       try{
    
	       return $this->user->saveProfile();
    
       } catch (Exception $e){
             
           LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "saveProfileAction", $this->user->id);
           throw new Exception ($e->getMessage(), $e->getCode());
       }
	}
	

    /**
    * Конвертирование валюты
    * 
    * @ignore
    * @return mixed|multitype: mixed
    */
    private function convert_social_moneyAction( $args ){
    
        $count = count($args);
        //LOG::printText("convertgoldAction:$count");
        $gold_id = $args['gold_id'];
        $to_type = $args['to_type']; 
        
