picquiz/picquiz/app/Http/Controllers/GameController.php
2022-11-19 10:40:04 +01:00

131 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Game;
use App\Models\Puzzle;
use App\Models\GamePuzzle;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Collection;
class GameController extends Controller
{
public function _new(){
$max_puzzles = (get_object_vars(DB::select('select count(*) c from puzzles')[0]))["c"];
return view('game/newGame', ['max' => $max_puzzles]);
}
public function generate(Request $request)
{
$glen = (int)$request->post('game_len');
if(get_object_vars(DB::select('select count(*) c from puzzles')[0])["c"] < $glen){
return abort(419);
}
if(Auth::User() == NULL){
$uid = 1;
}else{
$uid = Auth::User()->id;
}
$game = Game::factory()->create(['player' => $uid]);
$max_puzzles = (get_object_vars(DB::select('select count(*) c from puzzles')[0]))["c"];
$arr = range(1, $max_puzzles);
shuffle($arr);
$arr = array_slice($arr, -($glen));
foreach($arr as $i){
GamePuzzle::factory()->create(['game_id' => $game->id, 'puzzle_id' => $i]);
}
return redirect('/play/' .
$game->id . '/' .
1
);
}
public function play($id, $puzzle){
$puzzle = (int)$puzzle;
if($puzzle == 0){
abort(404);
}
$p = DB::table('game_puzzles')->join('puzzles', 'puzzle_id', '=', 'puzzles.id')->get()->where('game_id', $id)->values()->get($puzzle-1);
if($p == NULL){
return abort(404);
}
return view('game/game',
['puzzle' => $p,
'nth' => $puzzle,
'per' => DB::table('game_puzzles')->where('game_id', $id)->count(),
'hits' => DB::table('game_puzzles')->where('game_id', $id)->where('hit', 1)->count(),
]
);
}
private function to_answer_format($str){
$str = str_replace(['_', ':', ',', '.', '?', '!'], [' '], strtolower($str));
return $str;
}
public function do_validate(Request $request, $id, $puzzle){ // this function cannot be called just "validate" cause that conflicts with Laravel definitions
$p = DB::table('game_puzzles')->join('puzzles', 'puzzle_id', '=', 'puzzles.id')->get()->where('game_id', $id)->values()->get($puzzle-1);
if($this->to_answer_format($request->tipp) == $this->to_answer_format($p->answer)){
$i = DB::table('game_puzzles')->get()->where('game_id', $id)->values()->get($puzzle-1)->id;
DB::table('game_puzzles')->where('id', $i)->update(['hit' => 1]);
}
if($puzzle < DB::table('game_puzzles')->where('game_id', $id)->count()){
return redirect("/play/" . $id . '/' . ($puzzle+1));
}else{
return redirect("/results/" . $id);
}
}
public function summarize($id){
$puzzles = DB::table('game_puzzles')
->join('puzzles', 'puzzle_id', '=', 'puzzles.id')
->join('games', 'game_id', '=', 'games.id')
->join('users', 'player', '=', 'users.id')
->where('game_id', $id)->get();
$c = count(DB::table('game_puzzles')->where('game_id', $id)->where('hit', '!=', 0)->get());
return view('game/results', ['puzzles' => $puzzles, 'hits' => $c ]);
}
public function list() {
$listOfPuzzles = Puzzle::select('puzzles.id',
'puzzles.created_at',
'puzzles.updated_at',
'puzzles.picture',
'puzzles.answer',
'puzzles.numberOfHits',
'puzzles.numberOfGames',
'users.username')
->join('users', 'users.id', '=', 'puzzles.user_added')
->paginate(6);
return view('game.puzzleList', ['Puzzles' => $listOfPuzzles]);
}
public function create() {
return view('game.newPuzzle');
}
public function store(Request $req) {
$formdata = $req->validate([
'picture' => ['required'],
'answer' => ['required', 'min:3']
]);
$formdata['picture'] = $req->file('picture')->store('images/uploads/uploaded_puzzles', 'public');
$formdata['answer'] = GameController::to_answer_format($formdata['answer']);
$formdata['user_added'] = Auth::User()->id;
$game = Puzzle::create($formdata);
return redirect('/games/new')->with('message', 'Feladvány sikeresen létrehozva!');
}
}
?>