Пример #1
0
 private function runGet()
 {
     $request = Yii::$app->getRequest();
     $model = DynamicModel::validateData(['id' => $request->get('id'), 'screen_name' => $request->get('screen_name'), 'count' => $request->get('count'), 'newer_than' => $request->get('newer_than'), 'older_than' => $request->get('older_than')], [[['id'], 'exist', 'targetClass' => Battle::className(), 'targetAttribute' => 'id'], [['screen_name'], 'exist', 'targetClass' => User::className(), 'targetAttribute' => 'screen_name'], [['newer_than', 'older_than'], 'integer'], [['count'], 'default', 'value' => 10], [['count'], 'integer', 'min' => 1, 'max' => 100]]);
     if (!$model->validate()) {
         return $this->formatError($model->getErrors(), 400);
     }
     $query = Battle::find()->innerJoinWith('user')->with(['user', 'user.userStat', 'lobby', 'rule', 'map', 'weapon', 'weapon.subweapon', 'weapon.special', 'rank', 'battleImageResult', 'battleImageJudge'])->orderBy('{{battle}}.[[id]] DESC')->limit((int) $model->count);
     if ($model->id != '') {
         $query->andWhere(['{{battle}}.[[id]]' => $model->id]);
     }
     if ($model->screen_name != '') {
         $query->andWhere(['{{user}}.[[screen_name]]' => $model->screen_name]);
     }
     if ($model->newer_than > 0) {
         $query->andWhere(['>', '{{battle}}.[[id]]', $model->newer_than]);
     }
     if ($model->older_than > 0) {
         $query->andWhere(['<', '{{battle}}.[[id]]', $model->older_than]);
     }
     $list = $query->all();
     if ($model->id != '') {
         return empty($list) ? null : $this->runGetImpl(array_shift($list));
     }
     $resp = Yii::$app->getResponse();
     $resp->format = 'json';
     return array_map(function ($model) {
         return $model->toJsonArray();
     }, $list);
 }
Пример #2
0
 public function getRecentWPData()
 {
     $query = Battle::find()->with(['rule'])->innerJoinWith(['rule', 'rule.mode'])->joinWith(['lobby'])->andWhere(['{{battle}}.[[user_id]]' => $this->user->id, '{{game_mode}}.[[key]]' => 'gachi'])->andWhere(['not', ['{{battle}}.[[is_win]]' => null]])->andWhere(['or', ['{{battle}}.[[lobby_id]]' => null], ['<>', '{{lobby}}.[[key]]', 'private']])->orderBy('{{battle}}.[[id]] DESC');
     $battles = [];
     foreach ($query->each() as $battle) {
         $battles[] = (object) ['index' => -1 * count($battles), 'is_win' => $battle->is_win, 'rule' => $battle->rule->key, 'totalWP' => null, 'movingWP' => null, 'movingWP50' => null];
     }
     if (empty($battles)) {
         return [];
     }
     $battles = array_reverse($battles);
     $fMoving = function ($range, $currentIndex) use(&$battles) {
         if ($currentIndex + 1 < $range) {
             return null;
         }
         $tmp = array_slice($battles, $currentIndex + 1 - $range, $range);
         $win = count(array_filter($tmp, function ($a) {
             return $a->is_win;
         }));
         return $win * 100 / $range;
     };
     $totalWin = 0;
     $totalCount = 0;
     foreach ($battles as $i => $battle) {
         ++$totalCount;
         if ($battle->is_win) {
             ++$totalWin;
         }
         $battle->totalWP = $totalWin * 100 / $totalCount;
         $battle->movingWP = $fMoving(20, $i);
         $battle->movingWP50 = $fMoving(50, $i);
     }
     return $battles;
 }
Пример #3
0
 public function run()
 {
     Yii::$app->response->format = 'json';
     $request = Yii::$app->getRequest();
     $screenName = $request->get('screen_name');
     $user = null;
     if ($screenName != '') {
         if (is_scalar($screenName) && ($user = User::findOne(['screen_name' => $screenName]))) {
             // ok
         } else {
             return ['error' => ['screen_name' => ['not found']]];
         }
     }
     $now = @$_SERVER['REQUEST_TIME'] ?: time();
     $subQuery = (new \yii\db\Query())->select(['id' => 'MAX({{battle}}.[[id]])'])->from('battle')->andWhere(['>=', '{{battle}}.[[at]]', gmdate('Y-m-d H:i:sO', $now - 60 * 86400)])->groupBy('{{battle}}.[[user_id]]');
     if ($user) {
         $subQuery->andWhere(['{{battle}}.[[user_id]]' => $user->id]);
     }
     $battles = Battle::find()->andWhere(['in', '{{battle}}.[[id]]', $subQuery])->with(['user', 'user.userStat', 'lobby', 'rule', 'map', 'weapon', 'weapon.subweapon', 'weapon.special', 'rank', 'battleImageResult', 'battleImageJudge'])->limit(500)->orderBy('{{battle}}.[[id]] DESC');
     $ret = [];
     foreach ($battles->each() as $model) {
         $json = $model->user->toJsonArray();
         $json['latest_battle'] = $model->toJsonArray(['user', 'death_reasons']);
         $ret[] = $json;
     }
     if ($user) {
         return count($ret) >= 1 ? array_shift($ret) : null;
     }
     return $ret;
 }
Пример #4
0
 public function run()
 {
     $request = Yii::$app->getRequest();
     $user = User::findOne(['screen_name' => $request->get('screen_name')]);
     if (!$user) {
         throw new NotFoundHttpException(Yii::t('app', 'Could not find user'));
     }
     // リスト表示モード切替
     if ($request->get('v') != '') {
         $view = $request->get('v');
         if ($view === 'simple' || $view === 'standard') {
             Yii::$app->response->cookies->add(new Cookie(['name' => 'battle-list', 'value' => $view, 'expire' => time() + 86400 * 366]));
         }
         $next = $_GET;
         unset($next['v']);
         $next[0] = 'show/user';
         $this->controller->redirect(Url::to($next));
         return;
     }
     $battle = Battle::find()->with(['lobby', 'rule', 'rule.mode', 'map', 'weapon', 'weapon.subweapon', 'weapon.special', 'rank', 'rankAfter']);
     $filter = new BattleFilterForm();
     $filter->load($_GET);
     $filter->screen_name = $user->screen_name;
     if ($filter->validate()) {
         $battle->filter($filter);
     }
     $summary = $battle->summary;
     $permLink = Url::to(array_merge(['show/user', 'screen_name' => $user->screen_name], $filter->hasErrors() ? [] : $filter->toPermLink()), true);
     $isPjax = $request->isPjax;
     $template = $this->viewMode === 'simple' ? 'user.simple.tpl' : 'user.tpl';
     return $this->controller->render($template, array_merge(['user' => $user, 'battleDataProvider' => new ActiveDataProvider(['query' => $battle, 'pagination' => ['pageSize' => 100]]), 'summary' => $summary, 'filter' => $filter, 'permLink' => $permLink], $this->makeFilterFormData($user)));
 }
Пример #5
0
 public function postVote(Request $request, $battle_id)
 {
     $this->validate($request, ['rapper_number' => 'required|integer']);
     $user = Auth::user();
     $battle = Battle::find($battle_id);
     if (is_null($user)) {
         return response('', 403);
     }
     // forbidden
     if (is_null($battle)) {
         return response('', 404);
     }
     // Not found
     // check if battle is votable
     if (!$battle->isOpenVoting()) {
         return response('', 405);
     }
     // Method not allowed
     // don't let the user change a vote
     if ($user->votes()->where('battle_id', $battle->id)->get()->first() == null) {
         // build new vote
         $vote = new Vote();
         $vote->user_id = $user->id;
         $vote->battle_id = $battle->id;
         $vote->rapper_number = $request->input('rapper_number');
         // update vote counter
         if ($vote->rapper_number == 0) {
             $battle->votes_rapper1++;
         } else {
             if ($vote->rapper_number == 1) {
                 $battle->votes_rapper2++;
             } else {
                 return response('', 422);
             }
         }
         // Unprocessable Entity
         // save vote count in battle
         $vote->save();
         $battle->save();
     } else {
         return response('', 405);
         // Method not allowed
     }
 }
Пример #6
0
 public function run()
 {
     $subQuery = (new \yii\db\Query())->select(['id' => 'MAX({{battle}}.[[id]])'])->from('battle')->andWhere(['>=', '{{battle}}.[[at]]', gmdate('Y-m-d H:i:sO', time() - 60 * 86400)])->groupBy('{{battle}}.[[user_id]]');
     $battles = Battle::find()->andWhere(['in', '{{battle}}.[[id]]', $subQuery])->with(['user', 'rule', 'map', 'battleImageResult'])->limit(500)->each();
     return $this->controller->render('users.tpl', ['battles' => $battles]);
 }
Пример #7
0
 public function run()
 {
     $active = Battle::find()->andWhere(['in', '{{battle}}.[[id]]', $this->getActiveUserBattleIdList()])->with(['user', 'rule', 'map', 'battleImageResult'])->all();
     return $this->controller->render('index.tpl', ['active' => $active]);
 }