/**
  * Display a listing of the resource.
  * Display every conversation/topics with the first Thread related
  * @return Response
  */
 public function index(Request $request)
 {
     $Threads = array();
     $Result = array();
     $count = 0;
     $admin = Role::select('id')->where('description', '=', 'admin')->firstorFail();
     // if we are admin we want to see everything
     if (\Auth::id() == $admin->id) {
         $Conversations = User::select('*')->join('conversations', 'conversations.user_id', '=', 'users.id')->get();
     } else {
         // we are not admin but we want to see published messages and the status of our posted messages
         if (\Auth::guest()) {
             $Conversations = User::select('*')->join('conversations', 'conversations.user_id', '=', 'users.id')->where('conversations.Pending', '=', 0)->get();
         } else {
             $Conversations = User::select('*')->join('conversations', 'conversations.user_id', '=', 'users.id')->where('conversations.Pending', '=', 0)->orwhere('conversations.user_id', '=', \Auth::id())->get();
         }
     }
     // we recover the first Thread according to the conversations which passed the previous tests
     foreach ($Conversations as $Conversation) {
         $Threads[$count] = Thread::where('conversation_id', '=', $Conversation->id)->firstOrFail();
         $Result[$count] = array($Conversation, $Threads[$count]);
         $count++;
     }
     return view('dashboard')->with(['dashboard' => $Result, 'adminID' => $admin]);
 }
Beispiel #2
0
 /**
  * スレッド名取得メソッド
  * @param unknown $threadName: スレッドID
  */
 public static function getThreadName($threadName)
 {
     //スレッド名を検索
     $thread_name = Thread::where('id', '=', $threadName)->get();
     //有れば名前を、なければfalse
     return $thread_name[0]['thread'];
 }
Beispiel #3
0
 public function view($board, $thread_id)
 {
     // Does the thread exist?
     $thread = Thread::where("board", "=", $board)->where("thread_id", "=", $thread_id)->first();
     // Has this thread been takendown? But does this user know the secret key?
     if ($thread->deleted_at != null && Request::input('sv') != $thread->secret) {
         return view('thread.takendown', ['reason' => $thread->takedown_reason ? $thread->takedown_reason : "No reason given."]);
     }
     // Fetch cache first.
     if (Cache::has('thread_' . $board . '_' . $thread_id)) {
         return Cache::get('thread_' . $board . '_' . $thread_id);
     }
     // No cache? Okay, let's fetch all the posts.
     $posts = $thread->posts()->get();
     // Has this user already viewed this thread in the past 12 hours?
     $viewCache = ViewCache::where('user_ip', '=', Request::ip())->first();
     if (!$viewCache) {
         // They haven't viewed this thread in the past 12 hours. Add to cache
         $viewCache = new ViewCache();
         $viewCache->thread_id = $thread->id;
         $viewCache->user_ip = Request::ip();
         $viewCache->save();
     }
     $op = $posts[0];
     unset($posts[0]);
     // remove OP. only leave replies.
     $response = view('thread.view', ['thread' => $thread, 'replies' => $posts, 'op' => $op])->render();
     Cache::put('thread_' . $board . '_' . $thread_id, $response, 60);
     return $response;
 }
Beispiel #4
0
 /**
  * Displays threads belonging to the given forum.
  *
  * @param $id The forum to find threads for
  * @return Response
  */
 public function listThreadsForForum($id)
 {
     // We only care about the ID before the first hyphen
     $id = strtok($id, '-');
     $forum = Forum::where('id', $id)->first();
     $threads = Thread::where('forum', $id)->join('users', 'users.id', '=', 'threads.author')->join('categories', 'categories.id', '=', 'threads.forum')->select('threads.*', 'users.username')->paginate(20);
     return view('forum', compact('threads', 'forum'));
 }
Beispiel #5
0
 /**
  * Displays a given thread.
  *
  * @param $id int The thread to display
  * @return Response
  */
 public function displayThread($id)
 {
     // We only care about the ID before the first hyphen
     $id = strtok($id, '-');
     // Retrieve the first post of the thread
     $thread = Thread::where('threads.id', $id)->join('users', 'users.id', '=', 'threads.author')->select('threads.*', 'users.username')->first();
     $replies = Reply::where('replies.thread', $id)->join('users', 'users.id', '=', 'replies.author')->select('replies.*', 'users.username')->paginate(20);
     return view('thread', compact('thread', 'replies'));
 }
 /**
  * Get thread page
  * @param integer $tid Thread ID
  * @return \Illuminate\View\View
  */
 public function getThread($tid)
 {
     $thread = Thread::where('id', $tid)->firstOrFail();
     if ($thread->hidden) {
         // Thread hidden, abort request
         abort(403);
     }
     return view('clearboard.pages.thread', ['thread' => $thread]);
 }
 public function delete()
 {
     $usr_id = Auth::user()->id;
     if (User::destroy($usr_id)) {
         Thread::where('user_id', '=', $usr_id)->delete();
         Relation::where('user_id', '=', $usr_id)->delete();
         Comment::where('user_id', '=', $usr_id)->delete();
     }
 }
 /**
  * Display a listing of the resource.
  *
  * @return \Illuminate\Http\Response
  */
 public function index(Request $request)
 {
     // get category in select field for filtering
     $category = $request->get('category');
     // filter by catergoy
     if ($category && $category != 'All') {
         $threads = Thread::where('category', $category)->orderBy('created_at', 'desc')->get();
     } else {
         $threads = Thread::orderBy('created_at', 'desc')->get();
     }
     // Flash old input to repopulate on search
     $request->flash();
     return view('threads.index', ['threads' => $threads]);
 }
 /**
  * Display the specified resource.
  *
  * @param  int  $id
  * @return \Illuminate\Http\Response
  */
 public function show($id)
 {
     try {
         App\Thread::findOrFail($id);
     } catch (ModelNotFoundException $e) {
         return redirect('/');
     }
     $this->data['posts'] = App\Thread::findOrFail($id)->posts()->select('posts.*', 'threads.forum_id')->join('threads', 'threads.id', '=', 'posts.thread_id')->paginate(10);
     foreach ($this->data['posts'] as $post) {
         $post->user = App\Post::findOrFail($post->id)->author;
         $post->user->post_count = App\User::findOrFail($post->user->id)->posts()->count();
     }
     $this->data['forum'] = App\Forum::where('id', $this->data['posts'][0]->forum_id)->first();
     $this->data['thread'] = App\Thread::where('id', $id)->first();
     return view('forum.threads.show', $this->data);
 }
 /**
  * Display the specified resource.
  *
  * @param  int  $id
  * @return \Illuminate\Http\Response
  */
 public function show($id)
 {
     try {
         App\Forum::findOrFail($id);
     } catch (ModelNotFoundException $e) {
         return redirect('/');
     }
     $this->data['threads'] = App\Thread::where('threads.forum_id', '=', $id)->join('users', 'users.id', '=', 'threads.user_id')->select('users.username', 'threads.*')->orderBy('threads.updated_at', 'desc')->paginate(15);
     foreach ($this->data['threads'] as $thread) {
         $thread->latest = App\Post::where('posts.thread_id', '=', $thread->id)->orderBy('posts.id', 'desc')->join('users', 'users.id', '=', 'posts.user_id')->first();
         foreach ($this->data['threads'] as $thread) {
             $thread->post_count = App\Post::where('posts.thread_id', '=', $thread->id)->count();
         }
     }
     $this->data['forum'] = App\Forum::findOrFail($id);
     return view('forum.show', $this->data);
 }
 public function delete()
 {
     if (Input::has('id')) {
         $thread_id = Input::get('id');
         //アップロードされている画像のパスを取得
         $paths = Comment::select('file')->where('thread_id', '=', $thread_id)->get();
         //画像ファイルの削除
         foreach ($paths as $path) {
             if (!$path == null) {
                 continue;
             }
             unlink($path['file']);
         }
         //スレッドの削除
         Thread::where('id', '=', $thread_id)->delete();
     }
     return redirect('/dashboard');
 }
Beispiel #12
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.']);
     }
     $postPosition = 0;
     // Default value (start from beginning of thread
     // Has this thread been archived in the past?
     $threadCheck = Thread::where('board', '=', $board)->where('thread_id', '=', $thread_id)->get();
     $countOfThreads = $threadCheck->count();
     if ($countOfThreads > 0) {
         //  return response()->json(['error' => 'Thread already archived. Re-archving is currently disabled.']);
         $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()->get();
         $existingPostCount = $existingPosts->count();
         // No existing posts? Huh...
         if ($existingPostCount == 0) {
             return response()->json(['error' => 'Something weird happened... Please try again later.']);
         }
         $lastExistingPost = $existingPosts->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 response()->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->thread_id = $thread_id;
         $existingThread->board = $board;
         $existingThread->archive_date = DB::raw('NOW()');
         $existingThread->user_ips = Request::ip();
         $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 : "";
         $md5 = isset($livePost->md5) ? $livePost->md5 : "";
         // Set image default values
         $imageName = null;
         $imageSize = 271304;
         $thumbWidth = 0;
         $thumbHeight = 0;
         $imageWidth = 0;
         $imageHeight = 0;
         $imageUrl = null;
         $originalImageName = null;
         $imageDeleteHash = null;
         $chanImageName = null;
         $uploadedImage = null;
         $deleteHash = null;
         $imageDimensions = null;
         $thumbDimensions = null;
         if (isset($livePost->tim) && $livePost->ext == ".webm") {
             //use http://gfycat.com/api instead of imgur
             $uploadedImage = "/image/image-404.png";
             $imageDimensions = "486x500";
             $thumbDimensions = "195x200";
         }
         // Do we have an image with this post? "tim" is only set when there is an image (or a file?).
         if (isset($livePost->tim) && $livePost->tim > 0 && $livePost->ext != ".webm") {
             $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;
                       }
                   }*/
             set_time_limit(10800);
             //3 hours max execution time
             $client_id = env('IMGUR_KEY');
             $image = $imageLink;
             //  do {
             $ch = curl_init();
             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
             curl_setopt($ch, CURLOPT_URL, 'https://api.imgur.com/3/image.json');
             curl_setopt($ch, CURLOPT_TIMEOUT, 30);
             curl_setopt($ch, CURLOPT_POST, TRUE);
             curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
             curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id));
             curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => $image));
             $reply = curl_exec($ch);
             curl_close($ch);
             $reply = json_decode($reply);
             $status = $reply->status;
             // } while( $status != 200 ); //repeat  until we get no errors
             if ($status == 200) {
                 $newimgurl = $reply->data->link;
                 $deleteHashData = $reply->data->deletehash;
                 $uploadedImage = $newimgurl;
                 $deleteHash = $deleteHashData;
                 $imageDimensions = $imageWidth . "x" . $imageHeight;
                 $thumbDimensions = $thumbWidth . "x" . $thumbHeight;
             } else {
                 $uploadedImage = "/image/image-404.png";
             }
             /*
             //If you wish to download the image instead,
             
             file_put_contents( "L:\\data\\".$originalImageName, fopen($imageLink, 'r'));
             $filename = "L:\\data\\".$originalImageName;
             
             $client_id=env('IMGUR_KEY');
             $handle = fopen($filename, "r");
             $data = fread($handle, filesize($filename));
             $pvars   = array('image' => base64_encode($data));
             
             $curl = curl_init();
             curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
             curl_setopt($curl, CURLOPT_URL, 'https://api.imgur.com/3/image.json');
             curl_setopt($curl, CURLOPT_TIMEOUT, 30);
             curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id));
             curl_setopt($curl, CURLOPT_POST, 1);
             curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
             curl_setopt($curl, CURLOPT_POSTFIELDS, $pvars);
             $out = curl_exec($curl);
             
             curl_close ($curl);
             $pms = json_decode($out,true);
             $url=$pms['data']['link'];
             
             if($url!=""){
                 $uploadedImage  = $url;
             }else{
                 echo "<h2>There's a Problem</h2>";
                 echo $pms['data']['error'];  
             }
             */
         }
         $postsToInsert[] = ["chan_id" => $postID, "threads_id" => $existingThread->id, "image_size" => $imageSize, "image_dimensions" => $imageDimensions, "thumb_dimensions" => $thumbDimensions, "image_url" => $uploadedImage, "imgur_hash" => $deleteHash, "original_image_name" => $originalImageName, "subject" => $subject, "name" => $name, "tripcode" => $tripcode, "capcode" => $capcode, "chan_post_date" => DB::raw('FROM_UNIXTIME(' . $postTimestamp . ')'), "body" => $postBody, "md5" => $md5];
     }
     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]);
 }
 public function updateThreadById($id, Request $request)
 {
     $user = User::findOrFail(Auth::user()->id);
     $thread = Thread::where('id', '=', $id)->where('user_id', '=', $user->id)->update($request->all());
     return Response::json(['response' => $thread]);
 }
Beispiel #14
0
 public function hideThreads(Request $request, $slug)
 {
     $user = User::where('id', $request->user()->id)->first();
     $thread = Thread::where('slug', $slug)->first();
     if ($user && $thread) {
         $destroy = Participant::where('thread_id', $thread->id)->where('user_id', $request->user()->id)->first();
         $destroy->deleted_at = new Carbon();
         $destroy->save();
         return redirect()->route('messages')->withMessage('Переписка архивирована.');
     } else {
         return redirect()->route('messages')->withError('Ошибка, свяжитесь с администратором.');
     }
 }