/** * 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]); }
/** * スレッド名取得メソッド * @param unknown $threadName: スレッドID */ public static function getThreadName($threadName) { //スレッド名を検索 $thread_name = Thread::where('id', '=', $threadName)->get(); //有れば名前を、なければfalse return $thread_name[0]['thread']; }
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; }
/** * 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')); }
/** * 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'); }
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]); }
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('Ошибка, свяжитесь с администратором.'); } }