w0bm.com v1.5z FULL.RETARD.BUILD.BUT.STILL.WORKS

This commit is contained in:
noxy
2019-08-26 16:58:26 +00:00
commit da71b95aa2
517 changed files with 143236 additions and 0 deletions

View File

@@ -0,0 +1,116 @@
<?php
namespace App\Http\Controllers;
use App\Models\Category;
use App\Models\Video;
use App\Models\Banner;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Relations\HasMany;
use App\Http\Requests;
class CategoryController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Response
*/
public function index()
{
return view('categories', ['categories' => Category::all()]);
}
/**
* Show the form for creating a new resource.
*
* @return \Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return \Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param string $shortname
* @param int $id
* @return \Response
*/
public function showVideo($shortname, $id = null)
{
$category = Category::whereShortname($shortname)->first();
if (is_null($category)) {
return redirect()->back()->with('error', 'Category not found');
}
if (is_null($id)) {
$video = Video::getRandom($category);
if ($video instanceof HasMany) {
$video = $video->first();
}
else {
return redirect()->back()->with('error', 'Category is empty.');
}
return redirect($shortname . '/' . $video->id);
} else {
// Don't filter on specific video.
// TODO: Add warning page
$video = $category->videos()->find($id);
}
if (is_null($video)) {
return redirect()->back()->with('error', 'Category is empty.');
}
return view('video', [
'video' => $video,
'related' => $category,
'banner' => Banner::getRandom($video->isSfw())]);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param int $id
* @return \Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Response
*/
public function destroy($id)
{
//
}
}

View File

@@ -0,0 +1,237 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Category;
use App\Models\Comment;
use App\Models\Message;
use App\Models\ModeratorLog;
use App\Models\Video;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class CommentController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
if(!$request->has('username')) return JsonResponse::create('Not found', '304');
$user = User::whereUsername(urldecode($request->get('username')))->first();
if(!$user) return JsonResponse::create('Not found', '304');
return $user->comments()->orderBy('id', 'desc')->paginate(10);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request, $id)
{
$user = auth()->check() ? auth()->user() : null;
$xhr = $request->ajax();
if(is_null($user)) return $xhr ? "Not logged in" : redirect()->back()->with('error', 'Not logged in');
if(!$request->has('comment')) return $xhr ? "You need to enter a comment" : redirect()->back()->with('error', 'You need to enter a comment');
if(mb_strlen(trim($request->get('comment'))) > 2000 ) return $xhr ? "Comment to long" : redirect()->back()->with('error', 'Comment to long');
$video = Video::findOrFail($id);
$com = new Comment();
$com->content = trim($request->get('comment'));
$com->user()->associate($user);
$com->video()->associate($video);
$com->save();
$sent = [];
foreach($com->getMentioned() as $mentioned) {
Message::send($user->id, $mentioned->id, $user->username . ' mentioned you in a comment', view('messages.commentmention', ['video' => $video, 'user' => $user, 'comment' => $com]));
$sent[] = $mentioned;
}
foreach($com->answered() as $answered) {
if(array_search($answered, $sent) !== false)
continue;
Message::send($user->id, $answered->id, $user->username . ' answered on your comment', view('messages.commentanswer', ['video' => $video, 'user' => $user, 'comment' => $com]));
$sent[] = $answered;
}
if($user->id != $video->user->id)
if(array_search($video->user, $sent) === false)
Message::send($user->id, $video->user->id, $user->username . ' commented on your video', view('messages.videocomment', ['video' => $video, 'user' => $user, 'comment' => $com]));
return $xhr ? view('partials.comment', ['comment' => $com, 'mod' => $user->can('delete_comment')]) : redirect()->back()->with('success', 'Comment successfully saved');
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$comment = Comment::whereId($id)->first();
if(!is_null($comment)) {
return JsonResponse::create(array(
'error' => 'null',
'comment' => Comment::whereId($id)->first()->content)
);
}
return JsonResponse::create(array(
'error' => 'comment_not_found'
));
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
if(!($request->has('comment')))
return JsonResponse::create(array('error' => 'invalid_request'));
$user = auth()->check() ? auth()->user() : null;
if(is_null($user))
return JsonResponse::create(array('error' => 'not_logged_in'));
if(!$user->can('edit_comment'))
return JsonResponse::create(array('error' => 'insufficient_permissions'));
if(is_null($comment = Comment::whereId($id)->first()))
return JsonResponse::create(array('error' => 'comment_not_found'));
$comment->content = trim($request->get('comment'));
$comment->save();
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'edit';
$log->target_type = 'comment';
$log->target_id = $id;
$log->save();
return JsonResponse::create(array(
'error' => 'null',
'rendered_comment' => Comment::simplemd($comment->content)
));
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Request $request, $id)
{
if(!$request->has('reason'))
return 'invalid_request';
$reason = trim($request->get('reason'));
if($reason == '')
return 'invalid_request';
$user = auth()->check() ? auth()->user() : null;
if(is_null($user))
return 'not_logged_in';
if(!$user->can('delete_comment'))
return 'insufficient_permissions';
$comment = Comment::whereId($id)->first();
if(is_null($comment))
return 'comment_not_found';
$receiver = $comment->user;
$video = $comment->video;
Comment::destroy($id);
if($user->id != $receiver->id)
Message::send(1, $receiver->id, 'A moderator deleted your comment', view('messages.moderation.commentdelete', ['video' => $video, 'comment' => $comment, 'reason' => $reason]));
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'delete';
$log->target_type = 'comment';
$log->target_id = $id;
$log->reason = $reason;
$log->save();
return 'success';
}
public function restore(Request $request, $id)
{
if(!$request->has('reason'))
return 'invalid_request';
$reason = trim($request->get('reason'));
if($reason == '')
return 'invalid_request';
$user = auth()->check() ? auth()->user() : null;
if(is_null($user))
return 'not_logged_in';
if(!$user->can('delete_comment'))
return 'insufficient_permissions';
$comment = Comment::withTrashed()->whereId($id)->first();
if(is_null($comment))
return 'comment_not_found';
if(!$comment->trashed())
return 'comment_not_deleted';
$receiver = $comment->user;
$video = $comment->video;
$comment->restore();
if($user->id != $receiver->id)
Message::send(1, $receiver->id, 'A moderator restored your comment', view('messages.moderation.commentrestore', ['video' => $video, 'comment' => $comment, 'reason' => $reason]));
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'restore';
$log->target_type = 'comment';
$log->target_id = $id;
$log->reason = $reason;
$log->save();
return 'success';
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
abstract class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

View File

@@ -0,0 +1,112 @@
<?php
namespace App\Http\Controllers;
use App\Models\Message;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Http\Requests;
use Illuminate\Http\Response;
class MessageController extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
if(!auth()->check()) return JsonResponse::create('Not found', '304');
return auth()->user()->messagesRecv()->orderBy('id', 'desc')->paginate(15);
}
public function page()
{
if(!auth()->check()) return redirect()->back()->with('warning', 'You are not logged in');
return view('messages');
}
public function read(Request $request)
{
if(!auth()->check()) return Response::create('Unauthorized', '401');
if($request->has('m_ids')) {
$ids = $request->get('m_ids');
Message::whereTo(auth()->user()->id)->whereIn('id', $ids)->update(['read' => \Carbon\Carbon::now()]);
return 1;
}
}
public function readall()
{
if(!auth()->check()) return Response::create('Unauthorized', '401');
Message::whereTo(auth()->user()->id)->unread()->update(['read' => \Carbon\Carbon::now()]);
return 1;
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
*/
public function destroy($id)
{
//
}
}

View File

@@ -0,0 +1,306 @@
<?php
namespace App\Http\Controllers;
use App\Models\Report;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class ReportController extends Controller
{
private $fromMail = "otter@w0bm.com";
private $fromName = "w0bm";
private $toMail = "admin@w0bm.com";
private $toName = "w0bm";
private $subject = "webm reported";
private $baseURL = "http://w0bm.com/";
/**
* Made by klee
* Testing to make report crap
*
*/
public function report(Request $request)
{
if(is_array($request->input('reportReasons'))) {
$reportReasons = "<li>".implode("</li><li>", $request->input('reportReasons'));
} else {
$reportReasons = "<li>".$request->input('reportReasons')."</li>";
}
if($request->user()->username == "" || $request->user()->username == null) {
$username = "User is <b>anonymous</b> because he is not registered";
} else {
$username = $request->user()->username;
}
$data = array(
"videoURL" => $this->baseURL.$request->route('id'),
"reportReasons" => $reportReasons,
"reportText" => htmlspecialchars($request->input('reportText')),
"username" => $username,
"videoID" => $request->route('id'),
"message" => array(
"html" => 'html message',
"text" => 'text message',
"to" => array(
array("name" => 'admin@w0bm.com', "email" => 'admin@w0bm.com')
),
"from_email" => 'otter@w0bm.com',
"from_name" => 'from w0bm',
"subject" => 'the subject',
"track_opens" => true,
"track_clicks" => true
),
"async" => false,
"debugOutput" => print_r(get_class_methods($request), true).print_r($request->route()->parameters(), true)
);
//$postString = json_encode($data);
\Mail::send('emails.report', $data, function ($msg) {
$msg->from($this->fromMail, $this->fromName);
$msg->to($this->toMail, $this->toName);
$msg->subject($this->subject);
});
return redirect()->back()->with('success', 'Report successfully sent');;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
/*
if(!$request->has('username')) return JsonResponse::create('Not found', '304');
$user = User::whereUsername(urldecode($request->get('username')))->first();
if(!$user) return JsonResponse::create('Not found', '304');
return $user->comments()->orderBy('id', 'desc')->paginate(10);
*/
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request, $id)
{
/*
$user = auth()->check() ? auth()->user() : null;
$xhr = $request->ajax();
if(is_null($user)) return $xhr ? "Not logged in" : redirect()->back()->with('error', 'Not logged in');
if(!$request->has('comment')) return $xhr ? "You need to enter a comment" : redirect()->back()->with('error', 'You need to enter a comment');
if(mb_strlen(trim($request->get('comment'))) > 2000 ) return $xhr ? "Comment to long" : redirect()->back()->with('error', 'Comment to long');
$video = Video::findOrFail($id);
$com = new Comment();
$com->content = trim($request->get('comment'));
$com->user()->associate($user);
$com->video()->associate($video);
$com->save();
$sent = [];
foreach($com->getMentioned() as $mentioned) {
Message::send($user->id, $mentioned->id, $user->username . ' mentioned you in a comment', view('messages.commentmention', ['video' => $video, 'user' => $user, 'comment' => $com]));
$sent[] = $mentioned;
}
foreach($com->answered() as $answered) {
if(array_search($answered, $sent) !== false)
continue;
Message::send($user->id, $answered->id, $user->username . ' answered on your comment', view('messages.commentanswer', ['video' => $video, 'user' => $user, 'comment' => $com]));
$sent[] = $answered;
}
if($user->id != $video->user->id)
if(array_search($video->user, $sent) === false)
Message::send($user->id, $video->user->id, $user->username . ' commented on your video', view('messages.videocomment', ['video' => $video, 'user' => $user, 'comment' => $com]));
return $xhr ? view('partials.comment', ['comment' => $com, 'mod' => $user->can('delete_comment')]) : redirect()->back()->with('success', 'Comment successfully saved');
*/
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
/*
$comment = Comment::whereId($id)->first();
if(!is_null($comment)) {
return JsonResponse::create(array(
'error' => 'null',
'comment' => Comment::whereId($id)->first()->content)
);
}
return JsonResponse::create(array(
'error' => 'comment_not_found'
));
*/
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
/*
if(!($request->has('comment')))
return JsonResponse::create(array('error' => 'invalid_request'));
$user = auth()->check() ? auth()->user() : null;
if(is_null($user))
return JsonResponse::create(array('error' => 'not_logged_in'));
if(!$user->can('edit_comment'))
return JsonResponse::create(array('error' => 'insufficient_permissions'));
if(is_null($comment = Comment::whereId($id)->first()))
return JsonResponse::create(array('error' => 'comment_not_found'));
$comment->content = trim($request->get('comment'));
$comment->save();
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'edit';
$log->target_type = 'comment';
$log->target_id = $id;
$log->save();
*/
return JsonResponse::create(array(
'error' => 'null',
'rendered_comment' => "test rendered comment"//Comment::simplemd($comment->content)
));
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Request $request, $id)
{
/*
if(!$request->has('reason'))
return 'invalid_request';
$reason = trim($request->get('reason'));
if($reason == '')
return 'invalid_request';
$user = auth()->check() ? auth()->user() : null;
if(is_null($user))
return 'not_logged_in';
if(!$user->can('delete_comment'))
return 'insufficient_permissions';
$comment = Comment::whereId($id)->first();
if(is_null($comment))
return 'comment_not_found';
$receiver = $comment->user;
$video = $comment->video;
Comment::destroy($id);
if($user->id != $receiver->id)
Message::send(1, $receiver->id, 'A moderator deleted your comment', view('messages.moderation.commentdelete', ['video' => $video, 'comment' => $comment, 'reason' => $reason]));
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'delete';
$log->target_type = 'comment';
$log->target_id = $id;
$log->reason = $reason;
$log->save();
*/
return 'success';
}
public function restore(Request $request, $id)
{
/*
if(!$request->has('reason'))
return 'invalid_request';
$reason = trim($request->get('reason'));
if($reason == '')
return 'invalid_request';
$user = auth()->check() ? auth()->user() : null;
if(is_null($user))
return 'not_logged_in';
if(!$user->can('delete_comment'))
return 'insufficient_permissions';
$comment = Comment::withTrashed()->whereId($id)->first();
if(is_null($comment))
return 'comment_not_found';
if(!$comment->trashed())
return 'comment_not_deleted';
$receiver = $comment->user;
$video = $comment->video;
$comment->restore();
if($user->id != $receiver->id)
Message::send(1, $receiver->id, 'A moderator restored your comment', view('messages.moderation.commentrestore', ['video' => $video, 'comment' => $comment, 'reason' => $reason]));
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'restore';
$log->target_type = 'comment';
$log->target_id = $id;
$log->reason = $reason;
$log->save();
*/
return 'success';
}
}

View File

@@ -0,0 +1,401 @@
<?php
namespace App\Http\Controllers;
use App\Models\Category;
use App\Models\User;
use App\Models\UserFavorite;
use Illuminate\Http\Request;
use Carbon\Carbon;
use App\Models\ModeratorLog;
use App\Models\Banner;
use Symfony\Component\HttpFoundation\Response;
use Toddish\Verify\Helpers\Verify;
class UserController extends Controller
{
/**
* @param Request $request
* @return \Response
*/
public function login(Request $request)
{
if($request->has('identifier') && $request->has('password')) {
switch(\Auth::verify([
'identifier' => $request->get('identifier'),
'password' => $request->get('password')
], $request->has('remember')))
{
case Verify::SUCCESS:
#\Session::put('background', auth()->user()->background);
return redirect("/")->with('success', 'Login successful');
case Verify::INVALID_CREDENTIALS:
return redirect()->back()->with('error', 'Invalid credentials');
case Verify::DISABLED:
$user = User::whereUsername($request->get('identifier'))
->orWhere('email', $request->get('identifier'))
->first();
if($user->banend->eq(Carbon::createFromTimestampUTC(1))) {
return view('banned', ['user' => $user, 'perm' => true]);
}
// if ban expired unban and relogin.
if($user->banend->lt(Carbon::now())) {
$user->banend = null;
$user->disabled = 0;
$user->banreason = null;
$user->save();
return $this->login($request);
}
return view('banned', ['user' => $user, 'perm' => false]);
case Verify::UNVERIFIED:
return redirect()->back()->with('error', 'Please verify your account');
}
}
return redirect()->back()->with('error', 'Missing credentials');
}
public function logout()
{
if(!auth()->check()) return redirect()->back()->with('warning', 'You are not logged in');
auth()->logout();
return redirect('/')->with('success', 'Logout successful');
}
/**
* Display a listing of the resource.
*
* @return \Response
*/
public function index()
{
//
}
/**
* Add tags to filter
*
* @param Request $request
* @return Response
*/
public function filter(Request $request) {
//dd($request->get('categories'));
if(!auth()->check())
return Response::create("Not logged in", 401);
if(!$request->has('filter'))
$filter = [];
else
$filter = explode(',', $request->get('filter'));
auth()->user()->categories = $filter;
auth()->user()->save();
if(!$request->ajax())
return redirect()->back()->with('success', 'Filter settings saved');
return Response::create(json_encode($filter));
}
/**
* Show the form for creating a new resource.
*
* @return \Response
*/
public function create()
{
if(auth()->check()) {
\Session::reflash();
\Session::flash('info', 'Cannot register when logged in');
return redirect('/');
}
return view('register');
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return \Response
*/
public function store(Request $request)
{
if(auth()->check()) return redirect()->back()->with('info', 'Cannot register when logged in');
$validator = \Validator::make($request->all(), [
'username' => 'required|unique:users|min:3|max:25|alpha_num',
//'email' => 'required|email|unique:users|confirmed',
'password' => 'required|min:6|confirmed',
'g-recaptcha-response' => 'required|recaptcha'
]);
if($validator->fails()) {
return redirect()->back()->withErrors($validator->errors())
->withInput($request->except(['password', 'password_confirmation']));
}
//$activation_token = str_random(8) . md5($request->get('email')) . str_random(10);
$user = new User();
$user->username = $request->get('username');
$user->email = ""; //$request->get('email');
$user->password = $request->get('password');
$user->activation_token = ""; //$activation_token;
$user->disabled = 0;
$user->verified = 1;
$user->categories = [];
if($user->save()) {
/*$data = [
'username' => $user->username,
'activation_token' => $activation_token
];*/
// Send Mail
/*\Mail::queue('emails.activation', $data, function($message) use ($user) {
$message->to($user->email, $user->username)->subject('Welcome to w0bm. Activate your account');
});*/
return redirect('/')->with('info', 'Congratulations! You can now login!');
} else {
return redirect()->back()->with('error', 'Account could not be created')->withInput($request->except(['password', 'password_confirmation']));
}
}
public function activate($token)
{
$user = User::where('activation_token', '=', $token)->first();
if(!$user) {
return redirect('/')->with('error', 'Account already activate or no account found');
}
$user->verified = 1;
$user->activation_token = null;
$user->save();
auth()->login($user);
return redirect('/')->with('success', 'Successfully activate and logged in.');
}
/**
* Display the specified resource.
*
* @param string $username
* @return \Response
*/
public function show($username)
{
$user = User::where('username', '=', $username)->first();
if(!$user) {
return redirect()->back()->with('error', 'Unknown username');
}
$vids = $user->videos()->filtered()->paginate(50);
return view('profile', ['title' => 'Uploads', 'user' => $user, 'videos' => $vids]);
}
public function show_favs($username)
{
$user = UserFavorite::where('username', '=', $username)->first();
if (!$user) {
return redirect()->back()->with('error', 'Unknown username');
}
$vids = $user->favs()->filtered()->orderBy('favorites.created_at')->paginate(50);
return view('profile', ['title' => 'Favorites', 'user' => $user, 'videos' => $vids]);
}
public function show_comments($username)
{
$user = User::where('username', '=', $username)->first();
if(!$user) {
return redirect()->back()->with('error', 'Unknown username');
}
return view('comments', ['user' => $user]);
}
public function ban(Request $request, $username)
{
if(!($request->has('reason') && $request->has('duration')))
return redirect()->back()->with('error', 'Invalid Request');
if(trim($reason = $request->get('reason')) == '')
return redirect()->back()->with('error', 'You need to specify a ban reason');
$user = auth()->check() ? auth()->user() : null;
if(is_null($user))
return redirect()->back()->with('error', 'Not logged in');
if(!$user->can('edit_user'))
return redirect()->back()->with('error', 'Insufficient permissions');
$perm = false;
if(($duration = $request->get('duration')) == '-1') {
$duration = Carbon::createFromTimestampUTC(1);
$perm = true;
} else {
preg_match('/^(\d+[yYaA])?\s*(\d+M)?\s*(\d+[wW])?\s*(\d+[dD])?\s*(\d+[Hh])?\s*(\d+[m])?\s*(\d+[sS])?$/m', $duration, $duration);
array_shift($duration);
$duration = array_map(function($elem) {
return intval(mb_substr($elem, 0, -1));
}, $duration);
$duration = Carbon::now()
->addYears($duration[0] ?? 0)
->addMonths($duration[1] ?? 0)
->addWeeks($duration[2] ?? 0)
->addDays($duration[3] ?? 0)
->addHours($duration[4] ?? 0)
->addMinutes($duration[5] ?? 0)
->addSeconds($duration[6] ?? 0);
}
$userToBan = User::whereUsername($username)->first();
if(is_null($user))
return redirect()->back()->with('error', 'User not found');
$userToBan->disabled = 1;
$userToBan->banreason = $reason;
$userToBan->banend = $duration;
$userToBan->save();
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'ban';
$log->target_type = 'user';
$log->target_id = $userToBan->id;
$log->reason = $reason;
$log->save();
if($perm)
return redirect()->back()->with('success', 'User ' . $userToBan->username . ' has been permanently banned');
else
return redirect()->back()->with('success', 'User ' . $userToBan->username . ' has been banned until ' . $userToBan->banend->format('d.m.Y H:i:s') . ' UTC');
}
/**
* Show the form for editing the specified resource.
*
* @param string $username
* @return \Response
*/
public function edit($username)
{
//
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param int $id
* @return \Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Response
*/
public function destroy($id)
{
//
}
public function random($username) {
$user = User::where('username', '=', $username)->first();
if (!$user) {
return redirect()->back()->with('error', 'Unknown username');
}
$id = $user->videos()->filtered()->countScoped()->count() - 1;
if ($id < 0) {
return redirect()->back()->with('error', 'User has no uploads (Check your filter settings)');
}
$id = mt_rand(0, $id);
$vid = $user->videos()->filtered()->skip($id)->first()->id;
return redirect('/user/' . $username . '/uploads/' . $vid);
}
public function play($username, $id) {
$user = User::where('username', '=', $username)->first();
if (!$user) {
return redirect()->back()->with('error', 'Unknown username');
}
$vid = $user->videos()->filtered()->find($id);
if (!$vid) {
return redirect()->back()->with('error', 'Video not found on user');
}
return view('video', [
'video' => $vid,
'related' => $user,
'banner' => Banner::getRandom($vid->isSfw())
]);
}
// TODO: Cleanup. less Repetion between random and random_vav/play and play_fav
// Only difference are the redirect urls and the Base Model
public function random_fav($username) {
$user = UserFavorite::where('username', '=', $username)->first();
if (!$user) {
return redirect()->back()->with('error', 'Unknown username');
}
$id = $user->videos()->filtered()->countScoped()->count() - 1;
if ($id < 0) {
return redirect()->back()->with('error', 'No favorites (Check your filter settings)');
}
$id = mt_rand(0, $id);
$vid = $user->videos()->filtered()->skip($id)->first()->id;
return redirect('/user/' . $username . '/favs/' . $vid);
}
public function play_fav($username, $id) {
$user = UserFavorite::where('username', '=', $username)->first();
if (!$user) {
return redirect()->back()->with('error', 'Unknown username');
}
$vid = $user->videos()->filtered()->find($id);
if (!$vid) {
return redirect()->back()->with('error', 'Video not found on user');
}
return view('video', [
'video' => $vid,
'related' => $user,
'banner' => Banner::getRandom($vid->isSfw())
]);
}
public function setLayout(Request $request) {
if(!auth()->check())
return Response::create("unauthorized", 401);
if(!$request->has('layout'))
return Response::create("bad request", 400);
$layout = $request->get('layout');
if($layout !== strval(intval($layout)))
return Response::create("bad request", 400);
if(!in_array("layout" . $layout, array_map(function ($v) { return basename($v); }, glob("../resources/views/layout*"))))
return Response::create("bad request", 400);
auth()->user()->layout = $request->get('layout');
auth()->user()->save();
return Response::create("success", 200);
}
}

View File

@@ -0,0 +1,331 @@
<?php
namespace App\Http\Controllers;
use App\Models\Category;
use App\Models\Comment;
use App\Models\Message;
use App\Models\ModeratorLog;
use App\Models\Video;
use App\Models\Banner;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class VideoController extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index(Request $request) {
if($request->has('q')){
$needle = trim($request->input('q'));
return view('index', [
'videos' => Video::filtered()->withAnyTagsFuzzy($needle)
->orderBy('id', 'asc')
->paginate(20)->appends(['q' => $needle]),
'categories' => Category::all(),
'q' => $needle
]);
}
return view('index', [
'videos' => Video::filtered()->orderBy('id', 'ASC')->paginate(20),
'categories' => Category::all()
]);
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$user = auth()->check() ? auth()->user() : null;
return view('upload', ['user' => $user]);
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
/*var_dump($request->hasFile('file'));*/ if(!$request->hasFile('file') || !$request->has('category') || !$request->has('tags'))
return new JsonResponse(['error' => 'invalid_request']);
$tags = $request->get('tags');
if(mb_strpos($tags, 'sfw') === false && mb_strpos($tags, 'nsfw') === false)
return new JsonResponse(['error' => 'invalid_request']);
$user = auth()->check() ? auth()->user() : null;
if(is_null($user))
return new JsonResponse(['error' => 'not_logged_in']);
if(!$user->can('break_upload_limit') && $user->videos()->newlyups()->count() >= 10)
return new JsonResponse(['error' => 'uploadlimit_reached']);
$file = $request->file('file');
if(!$file->isValid()
|| mb_strtolower($file->getClientOriginalExtension()) !== 'webm'
|| mb_strtolower($file->getMimeType()) !== 'video/webm')
return new JsonResponse(['error' => 'invalid_file']);
if(!$user->can('break_max_filesize') && $file->getSize() > 41943040)
return new JsonResponse(['error' => 'file_too_big']);
if(($v = Video::withTrashed()->where('hash', '=', sha1_file($file->getRealPath()))->first()) !== null) {
if($v->trashed())
return new JsonResponse(['error' => 'already_exists']);
return new JsonResponse([
'error' => 'already_exists',
'video_id' => $v->id
]);
}
// meh time()
$file = $file->move(public_path() . '/b/', 'w0bm_' . time() . '.webm');
$hash = sha1_file($file->getRealPath());
$video = new Video();
$video->file = basename($file->getRealPath());
if(!$video->checkFileEncoding()) {
unlink($file->getRealPath());
// return before $video->save() so no need to clean up db
return new JsonResponse(['error' => 'erroneous_file_encoding']);
}
$video->videotitle = $request->get('videotitle', null);
$video->interpret = $request->get('interpret', null);
$video->songtitle = $request->get('songtitle', null);
$video->imgsource = $request->get('imgsource', null);
$video->user()->associate($user);
$video->category()->associate(Category::findOrFail($request->get('category')));
$video->hash = $hash;
$video->save();
$video->tag($tags);
$video->tag($video->videotitle);
$video->tag($video->interpret);
$video->tag($video->songtitle);
$video->tag($video->imgsource);
$video->tag($video->category->shortname);
$video->tag($video->category->name);
// TODO: outsource to different process (async)
$video->createThumbnail();
// Discord
if (config('discord.enabled') && config('discord.webhookurl')) {
$nsfw = in_array('nsfw', $video->getTagArrayNormalizedAttribute());
$nsfw = $nsfw ? ' :exclamation: **NSFW** :exclamation:' : '';
$message = config('discord.message');
$message = str_replace(
['<USER>', '<ID>', '<NSFW>'],
[$user->username, $video->id, $nsfw],
$message
);
$url = config('discord.webhookurl');
$payload = json_encode([
'content' => $message,
]);
// exec with & so it is async
exec("curl -H \"Content-Type: application/json; charset=UTF-8\" -X POST -d '$payload' '$url' > /dev/null &");
}
return new JsonResponse([
'error' => 'null',
'video_id' => $video->id
]);
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
*/
public function show($id) {
// TODO: filter on direct id link??
$video = Video::with('tags')->find($id);
if(is_null($video))
return view('deleted');
#->back();
#->with('error', 'No video with that ID found');
$sfw = $video->tags->contains(function($key, $tag) {
return $tag->normalized === 'sfw';
});
return view('video', [
'video' => $video,
'banner' => Banner::getRandom($sfw)
]);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id) {
if(!auth()->check())
return response('Not logged in', 403);
$user = auth()->user();
if(!$request->ajax())
return response('Invalid request', 400);
$v = Video::findOrFail($id);
if(!$user->can('edit_video') && $user->id != $v->user_id)
return response('Not enough permissions', 403);
if($request->has('interpret')) {
$v->interpret = $request->input('interpret');
$v->tag($request->input('interpret'));
}
if($request->has('songtitle')) {
$v->songtitle = $request->input('songtitle');
$v->tag($request->input('songtitle'));
}
if($request->has('imgsource')) {
$v->imgsource = $request->input('imgsource');
$v->tag($request->input('imgsource'));
}
if($request->has('videotitle')) {
$v->videotitle = $request->input('videotitle');
$v->tag($request->input('videotitle'));
}
if($request->has('category')) {
$cat = Category::findOrFail($request->input('category'));
$v->category()->associate($cat);
$v->tag($cat->name);
$v->tag($cat->shortname);
}
$v->save();
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'edit';
$log->target_type = 'video';
$log->target_id = $v->id;
$log->save();
return $v;
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Response
*/
public function destroy(Request $request, $id)
{
$user = auth()->check() ? auth()->user() : null;
if(is_null($user)) return new JsonResponse(['error' => 'not_logged_in']);
if(!$request->has('reason') || trim($request->get('reason')) == '') return new JsonResponse(['error' => 'invalid_request']);
$reason = trim($request->get('reason'));
if($user->can('delete_video')) {
$warnings = [];
$vid = Video::find($id);
if(!$vid)
return new JsonResponse(['error' => 'video_not_found']);
foreach($vid->comments as $comment) {
$comment->delete(); // delete associated comments
}
$vid->faved()->detach();
if(!\File::move(public_path() . '/b/' . $vid->file, storage_path() . '/deleted/' . $vid->file))
$warnings[] = 'Could not move file';
$vid->delete();
$receiver = $vid->user;
if($user->id != $receiver->id)
Message::send(1, $receiver->id, 'A moderator deleted your video', view('messages.moderation.videodelete', ['video' => $vid, 'reason' => $reason, 'videoinfo' => ['artist' => $vid->interpret, 'songtitle' => $vid->songtitle, 'video_source' => $vid->imgsource, 'category' => $vid->category->name]]));
$log = new ModeratorLog();
$log->user()->associate($user);
$log->type = 'delete';
$log->target_type = 'video';
$log->target_id = $id;
$log->reason = $reason;
$log->save();
return new JsonResponse(['error' => 'null', 'warnings' => $warnings]);
}
return new JsonResponse(['error' => 'insufficient_permissions']);
}
public function favorite($id) {
$user = auth()->check() ? auth()->user() : null;
$xhr = \Request::ajax();
if(is_null($user)) return $xhr ? "Not logged in" : redirect()->back()->with('error', 'Not logged in');
if($user->hasFaved($id)) {
$user->favs()->detach($id);
return $xhr ? "Video removed from favorites" : redirect()->back()->with('success', 'Video removed from favorites');
} else {
$user->favs()->attach($id);
return $xhr ? "Video added to favorites" : redirect()->back()->with('success', 'Video added to favorites');
}
}
/**
* @param Request $request
* @return Video | Bool
*/
public function tag(Request $request, $id) {
if(!$request->has('tags')) return new JsonResponse(["error" => "invalid_request"]);
$tags = $request->get('tags');
if(!count($tags)) return new JsonResponse(["error" => "no_tags_specified"]);
$v = Video::findOrFail($id);
if(is_null($v)) return new JsonResponse(["error" => "video_not_found"]);
$v->tag($tags);
$v['error'] = 'null';
$v['can_edit_video'] = auth()->check() ? auth()->user()->can('edit_video') : false;
return $v;
}
public function untag(Request $request, $id) {
if(!$request->has('tag') || trim($request->get('tag')) == "") return new JsonResponse(["error" => "invalid_request"]);
$user = auth()->check() ? auth()->user() : null;
if(is_null($user)) return new JsonResponse(["error" => "not_logged_in"]);
if(!$user->can('edit_video')) return new JsonResponse(["error" => "insufficient_permissions"]);
$tag = trim($request->get('tag'));
$v = Video::findOrFail($id);
if(is_null($v)) return new JsonResponse(["error" => "video_not_found"]);
$v = $v->untag($tag);
$v['error'] = 'null';
return $v;
}
}

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB