예제 #1
0
 /**
  * Remove the specified resource from storage.     
  * @return Response
  */
 public function delete()
 {
     $validator = Validator::make(Input::all(), array('id' => 'required|integer', 'api_key' => 'required'));
     if ($validator->fails()) {
         return response()->json(array('errors' => $validator->errors()));
     }
     $this->_isOwner();
     $note = Note::find(Input::get('id'));
     if ($note) {
         $deleted = $note->delete();
         if ($deleted) {
             return response()->json(array('status' => 'successful'));
         }
     }
     return repsonse()->json(array('status' => 'failed'));
 }
예제 #2
0
 public function archive()
 {
     $board = Request::input('board');
     $thread_id = Request::input('id');
     // Validation
     if (!$board || !is_numeric($thread_id)) {
         return response()->json(['error' => 'no board or thread_id']);
     }
     // Is this board blacklisted?
     if (in_array($board, ['gif'])) {
         return response()->json(['error' => 'This board is currently not allowed to be archived.']);
     }
     // Retrieve thread JSON and validate
     $threadJson = @file_get_contents('http://a.4cdn.org/' . $board . '/thread/' . $thread_id . '.json');
     if (!$threadJson) {
         return response()->json(['error' => 'Thread not found. Did it 404?']);
     }
     $threadInformation = json_decode($threadJson);
     if (!$threadInformation) {
         return response()->json(['error' => 'Something went wrong here... Unable to parse response from 4chan']);
     }
     $livePosts = $threadInformation->posts;
     $livePostCount = count($livePosts);
     // Does this thread have more than 10 replies?
     if ($livePostCount <= 10) {
         return response()->json(['error' => 'To archive a thread, it must have at least 10 replies.']);
     }
     // Has this thread been archived in the past?
     $threadCheck = Thread::withTrashed()->where('board', '=', $board)->where('thread_id', '=', $thread_id);
     $postPosition = 0;
     // Default value (start from beginning of thread
     if ($threadCheck->count() > 0) {
         $existingThread = $threadCheck->first();
         // Has this thread been taken down?
         if ($existingThread->deleted_at != null) {
             return response()->json(['error' => 'This thread is not allowed to be archived.']);
         }
         // Is this thread currently busy?
         if ($existingThread->busy) {
             return response()->json(['error' => 'This thread is currently in the process of being archived by someone else.']);
         }
         // Retrieve posts for this thread.
         // Determine at what point we should continue archiving this thread.
         $existingPosts = $existingThread->posts()->withTrashed();
         $existingPostCount = $existingPosts->count();
         // No existing posts? Huh...
         if ($existingPostCount == 0) {
             return response()->json(['error' => 'Something weird happened... Please try again later.']);
         }
         $lastExistingPost = $existingPosts->get()->last();
         // Get last live post (from 4chan API) and compare with the last post
         // we recorded since last archive attempt.
         $lastLivePost = end($livePosts);
         if ($lastExistingPost->chan_id == $lastLivePost->no) {
             return response()->json(['success' => true]);
         }
         // Wait... what? This shouldn't happen.
         if ($existingPostCount > $livePostCount) {
             return repsonse()->json(['error' => 'Something weird happened... Please try again later.']);
         }
         // Update existing thread to become busy.
         $existingThread->busy = 1;
         $existingThread->updated_num++;
         $existingThread->save();
         // Set post position to existingPostCount.
         $postPosition = $postPosition;
     } else {
         // Create a new thread
         $existingThread = new Thread();
         $existingThread->board = $board;
         $existingThread->thread_id = $thread_id;
         $existingThread->busy = 1;
         $existingThread->secret = str_random(8);
         $existingThread->save();
     }
     // Add user IP to list of user IPs
     $update_record = new UpdateRecord();
     $update_record->thread_id = $existingThread->id;
     $update_record->user_ip = Request::ip();
     $update_record->save();
     $postsToInsert = [];
     // Start recording posts, starting at last reply position
     for ($i = $postPosition; $i < $livePostCount; $i++) {
         $livePost = $livePosts[$i];
         $postID = isset($livePost->no) ? $livePost->no : null;
         $subject = isset($livePost->sub) ? $livePost->sub : null;
         $name = isset($livePost->name) ? $livePost->name : "";
         $posterId = isset($livePost->id) ? $livePost->id : null;
         $tripcode = isset($livePost->trip) ? $livePost->trip : null;
         $capcode = isset($livePost->capcode) ? $livePost->capcode : null;
         $postTimestamp = isset($livePost->time) && is_numeric($livePost->time) ? $livePost->time : null;
         $postBody = isset($livePost->com) ? $livePost->com : "";
         // Set image default values
         $imageName = null;
         $imageSize = 0;
         $thumbWidth = 0;
         $thumbHeight = 0;
         $imageWidth = 0;
         $imageHeight = 0;
         $imageUrl = null;
         $originalImageName = null;
         $imageDeleteHash = null;
         $chanImageName = null;
         // Do we have an image with this post? "tim" is only set when there is an image.
         if (isset($livePost->tim) && $livePost->tim > 0) {
             $chanImageName = $livePost->tim . $livePost->ext;
             $imageLink = "http://i.4cdn.org/" . $board . "/src/" . $chanImageName;
             $thumbWidth = $livePost->tn_w;
             $thumbHeight = $livePost->tn_h;
             $imageWidth = $livePost->w;
             $imageHeight = $livePost->h;
             $originalImageName = $livePost->filename . $livePost->ext;
             $imageSize = $livePost->fsize;
             $deleteHash = "";
             $uploadedImage = "/image/image-404.png";
             // Upload to Imgur or Imageshack
             $imgur = new Imgur(env('IMGUR_KEY'));
             $response = json_decode($imgur->upload($imageLink));
             if ($response && isset($response->status) && $response->status == 200) {
                 $uploadedImage = $response->data->link;
                 $deleteHash = $response->data->deletehash;
             } else {
                 // Imgur failed, upload to Imageshack
                 $imageshack = new Imageshack(env('IMAGESHACK_KEY'));
                 $response = $imageshack->upload($imageLink);
                 if ($response && isset($response->status) && $response->status == 1) {
                     $uploadedImage = $response->links->image_link;
                 }
             }
         }
         $postsToInsert[] = ["chan_id" => $postID, "thread_id" => $existingThread->id, "original_image_name" => $originalImageName, "image_size" => $imageSize, "image_width" => $imageWidth, "image_height" => $imageHeight, "thumb_width" => $thumbWidth, "thumb_height" => $thumbHeight, "image_url" => $uploadedImage, "imgur_hash" => $deleteHash, "subject" => $subject, "name" => $name, "tripcode" => $tripcode, "capcode" => $capcode, "post_timestamp" => DB::raw('FROM_UNIXTIME(' . $postTimestamp . ')'), "body" => $postBody, "updated_at" => DB::raw('NOW()'), "created_at" => DB::raw('NOW()')];
     }
     Post::insert($postsToInsert);
     // Mass insert posts
     $existingThread->busy = 0;
     $existingThread->save();
     if (Cache::has('thread_' . $board . '_' . $thread_id)) {
         Cache::forget('thread_' . $board . '_' . $thread_id);
     }
     return response()->json(['success' => true]);
 }