Example #1
0
 public function getPeer()
 {
     if (!empty($this->_peer)) {
         return $this->_peer;
     }
     //先看能不能找到,不能找到就新建
     //通过client_tag找
     $peer = Peer::findOne(['seed_id' => $this->seed->seed_id, 'user_id' => Yii::$app->user->identity->getId(), 'client_tag' => $this->base64_peer_id]);
     if (empty($peer)) {
         //尝试用ipv4 + ipv6找
         $peer = Peer::findOne(['seed_id' => $this->seed->seed_id, 'user_id' => Yii::$app->user->identity->getId(), 'ipv4_addr' => $this->ipv4, 'ipv4_port' => $this->ipv4port, 'ipv6_addr' => $this->ipv6, 'ipv6_port' => $this->ipv6port]);
     }
     //仍然没找到,新建条目
     if (empty($peer)) {
         $peer = new Peer();
         $peer->seed_id = $this->seed->seed_id;
         $peer->user_id = Yii::$app->user->identity->getId();
         //这里不能保存,否则会导致触发器误判
     }
     $peer->ipv4_addr = $this->ipv4;
     $peer->ipv4_port = $this->ipv4port;
     $peer->ipv6_addr = $this->ipv6;
     $peer->ipv6_port = $this->ipv6port;
     $peer->client_tag = $this->base64_peer_id;
     $peer->status = intval($this->left) == 0 ? 'Seeder' : 'Leecher';
     $this->_peer = $peer;
     return $peer;
 }
 public function actionAnnounce()
 {
     Yii::$app->response->headers->add("Content-Type", "text/plain");
     Yii::trace(print_r(Yii::$app->request->get(), true));
     $form = new QueryPeersForm();
     $form->attributes = Yii::$app->request->get();
     Yii::info($form->ip);
     $peer_list = null;
     if ($form->validate()) {
         $peer = $form->peer;
         $peer->real_up = $form->uploaded;
         $peer->real_down = $form->downloaded;
         if ($peer->user_id == $form->seed->publisher_user_id) {
             $peer->up_coef = 200;
             //做种者两倍上传
         }
         $peer->save();
         //处理event
         switch ($form->event) {
             case 'regular':
                 break;
             case 'started':
                 //do nothing?
                 break;
             case 'stopped':
                 $peer->delete();
                 break;
             case 'completed':
                 $event = new SeedEvent();
                 $event->seed_id = $form->seed->seed_id;
                 $event->user_id = Yii::$app->user->identity->getId();
                 $event->event_type = 'Completed';
                 $event->insert();
                 $form->seed->completed_count++;
                 $form->seed->save();
                 break;
             default:
                 Yii::warning("Unknown event", static::className());
         }
         if ($form->numwant == 0) {
             $form->numwant = 100;
         }
         //Seeder会排到前面
         $peer_list = Peer::find()->where(['seed_id' => $form->seed->seed_id])->orderBy(['status' => SORT_ASC, 'update_time' => SORT_DESC])->limit(min(300, intval($form->numwant)))->all();
     } else {
         $errors = $form->errors;
         Yii::warning($errors);
     }
     return $this->renderPartial("queryPeerList", ['peer_list' => $peer_list, 'form' => $form]);
 }
Example #3
0
 public function actionDeleteStalePeer()
 {
     Peer::deleteAll("update_time <= now() - '1 hour'::interval");
 }
Example #4
0
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getPeers()
 {
     return $this->hasMany(Peer::className(), ['seed_id' => 'seed_id']);
 }
Example #5
0
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getPeers()
 {
     return $this->hasMany(Peer::className(), ['lifecycle_id' => 'record_id']);
 }