public function save() { if (!$this->validate()) { return false; } $db = \Yii::$app->db; $transaction = $db->beginTransaction(); try { $promotion = new Promotion(); $promotion->user_id = \Yii::$app->user->getId(); $promotion->url = $this->url; $promotion->page_id = VKApi::getGroupIdByUrl($this->url); $promotion->status = Promotion::NOT_MODERATED; $promotion->save(); if ($this->hasLikeQuery()) { $likeTask = new Task(); $likeTask->service_id = Service::LIKE_VK; $likeTask->promotion_id = $promotion->id; $likeTask->task = json_encode($this->getLikeQuery()); $likeTask->save(); } if ($this->hasRepostQuery()) { $likeTask = new Task(); $likeTask->service_id = Service::REPOST_VK; $likeTask->promotion_id = $promotion->id; $likeTask->task = json_encode($this->getRepostQuery()); $likeTask->save(); } if ($this->hasCommentQuery()) { $likeTask = new Task(); $likeTask->service_id = Service::COMMENT_VK; $likeTask->promotion_id = $promotion->id; $likeTask->task = json_encode($this->getCommentQuery()); $likeTask->save(); } $transaction->commit(); } catch (Exception $e) { $transaction->rollBack(); return false; } return true; }
public function actionGo() { $groups = Promotion::findAll(['status' => Promotion::MODERATED]); foreach ($groups as $group) { $wall = VKApi::getWallPosts($group->page_id); if ($wall) { $parsingPeriod = mktime(strftime('-1 hour', time())); foreach ($wall as $post) { //если пост подходит по времени if ($post['date'] > $parsingPeriod) { //формирум урл поста https://vk.com/feed?w=wall-57424472_71791 $dbPost = new Post(); $dbPost->post_id = $post['id']; $dbPost->promotion_id = $group->page_id; $dbPost->save(); $postUrl = 'https://vk.com/feed?w=wall' . $group->page_id . '_' . $post['id']; //получаем таски $tasks = Task::findAll(['promotion_id' => $group->id]); foreach ($tasks as $task) { $taskArr = json_decode($task->task); //дописываем в урл и цену лайков $taskArr['task']['url'] = $postUrl; $taskArr['task']['cost'] = $task->service->minimum_likes_per_task; //получаем цену таска $pricePerOne = $task->service->price_per_one_task; $priceAll = $pricePerOne * $taskArr['task']['members_count']; //списываем деньги с пользователя к которому он относится $user = $group->user; if ($user->money - $priceAll >= 0) { $user->money -= $priceAll; $user->save(); //если хватило то отсылаем таск $this->setTask($taskArr); } } } } } usleep(335000); } }
/** * @return \yii\db\ActiveQuery */ public function getTasks() { return $this->hasMany(Task::className(), ['promotion_id' => 'id']); }