/** * Creating fight * @return bool */ public function create() { if (!$this->validate()) { return false; } $transaction = Yii::$app->getDb()->beginTransaction(); $saved = false; try { $fight = new Fight(); if ($fight->save()) { $fightOwner = new FightUser(['user_id' => Yii::$app->getUser()->getIdentity()->cid, 'deck_id' => $this->deck_id, 'is_owner' => 1, 'fight_id' => $fight->id]); if ($fightOwner->save()) { $saved = true; $this->_fight = $fight; } } } catch (Exception $e) { $transaction->rollback(); } if ($saved) { $transaction->commit(); } else { $transaction->rollback(); } return $saved; }
/** * User connection request * Will be triggered when the user open the fight page * @param ConnectionInterface $from * @param $data */ public function connectRequest(ConnectionInterface $from, $data) { $fight = $this->manager->getFight($data->fight); $user = FightUser::find()->where('fight_id = :id AND user_id = :user', [':id' => $data->fight, ':user' => $data->user])->one(); // Add connected player $p = $fight->getPlayer($data->index); $isReconnect = !$p->isNew(); if (!$isReconnect) { $fight->addPlayer($data->index, $from, $user, $data->index); } else { $p->connect($from); } // Set user data to manager. Will be used for disconnecting $this->manager->addClient($from, ['user' => $data->user, 'fight' => $data->fight, 'index' => $data->index]); // Log user connection event $this->manager->log("User ({$from->resourceId}) has been " . (!$isReconnect ? 'connected' : 'reconnected') . " to fight {$data->fight}"); // Send message about connecting $player = $fight->getPlayer($data->index); foreach ($fight->getPlayers() as $p) { $response = (new Response())->setAction('message')->setText($player->getName() . ' присоединился к игре'); $p->send($response); } if (!$player->isOwner() && !$isReconnect) { $fight->start(); $response = (new Response())->setAction('connect')->setId($data->user); $fight->getOpponent($data->index)->send($response); } if ($isReconnect && $fight->isFull()) { $fight->getPlayer(1)->startTimer(); $response = (new Response())->setAction('reconnect')->setPlayers($fight->getPlayers())->setFight($fight)->setIds(true); $player->send($response); } }
/** * @return string */ public function actionIndex() { $query = Fight::find(); $fu = FightUser::tableName(); $query->join('LEFT JOIN', $fu, $fu . '.fight_id = ' . Fight::tableName() . '.id AND ' . $fu . '.user_id = ' . \Yii::$app->user->getIdentity()->cid); $query->where($fu . '.id IS NULL'); $query->orderBy('created_at DESC'); $items = new ActiveDataProvider(['query' => $query, 'sort' => false]); return $this->render('index', ['items' => $items, 'model' => new FightForm()]); }
/** * @return \yii\db\ActiveQuery */ public function getFightUsers() { return $this->hasMany(FightUser::className(), ['deck_id' => 'id']); }
/** * Connect * @return bool */ public function connect() { $this->updateAttributes(['status' => self::STATUS_CONNECTED]); $fightUser = new FightUser(['fight_id' => $this->id, 'deck_id' => $this->owner->deck_id, 'is_owner' => 0, 'user_id' => Yii::$app->user->getIdentity()->cid]); return $fightUser->save(); }