diff options
Diffstat (limited to 'app/controllers')
| -rw-r--r-- | app/controllers/application_controller.rb | 2 | ||||
| -rw-r--r-- | app/controllers/puzzles_controller.rb | 109 | ||||
| -rw-r--r-- | app/controllers/wittle/application_controller.rb | 4 | ||||
| -rw-r--r-- | app/controllers/wittle/puzzles_controller.rb | 120 |
4 files changed, 111 insertions, 124 deletions
| diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000..09705d1 --- /dev/null +++ b/app/controllers/application_controller.rb | |||
| @@ -0,0 +1,2 @@ | |||
| 1 | class ApplicationController < ActionController::Base | ||
| 2 | end | ||
| diff --git a/app/controllers/puzzles_controller.rb b/app/controllers/puzzles_controller.rb new file mode 100644 index 0000000..b996022 --- /dev/null +++ b/app/controllers/puzzles_controller.rb | |||
| @@ -0,0 +1,109 @@ | |||
| 1 | class PuzzlesController < ApplicationController | ||
| 2 | before_action :prepare_session | ||
| 3 | |||
| 4 | def about | ||
| 5 | @normal_puzzle = Puzzle.normal.order(created_at: :desc).first | ||
| 6 | if session[:puzzles]["normal"]["id"] == @normal_puzzle.id | ||
| 7 | @normal_started = session[:puzzles]["normal"]["started"] | ||
| 8 | @normal_solved = session[:puzzles]["normal"]["solved"] | ||
| 9 | else | ||
| 10 | @normal_started = false | ||
| 11 | @normal_solved = false | ||
| 12 | end | ||
| 13 | |||
| 14 | @hard_puzzle = Puzzle.hard.order(created_at: :desc).first | ||
| 15 | if session[:puzzles]["hard"]["id"] == @hard_puzzle.id | ||
| 16 | @hard_started = session[:puzzles]["hard"]["started"] | ||
| 17 | @hard_solved = session[:puzzles]["hard"]["solved"] | ||
| 18 | else | ||
| 19 | @hard_started = false | ||
| 20 | @hard_solved = false | ||
| 21 | end | ||
| 22 | |||
| 23 | @expert_puzzle = Puzzle.expert.order(created_at: :desc).first | ||
| 24 | if session[:puzzles]["expert"]["id"] == @expert_puzzle.id | ||
| 25 | @expert_started = session[:puzzles]["expert"]["started"] | ||
| 26 | @expert_solved = session[:puzzles]["expert"]["solved"] | ||
| 27 | else | ||
| 28 | @expert_started = false | ||
| 29 | @expert_solved = false | ||
| 30 | end | ||
| 31 | end | ||
| 32 | |||
| 33 | def index | ||
| 34 | @puzzles = Puzzle.select(:id, :created_at, :category).order(created_at: :asc).all.chunk { |puzzle| puzzle.created_at.localtime.to_date }.to_h.transform_values { |by_date| by_date.sort_by(&:category).chunk { |puzzle| puzzle.category }.to_h } | ||
| 35 | end | ||
| 36 | |||
| 37 | def show | ||
| 38 | @puzzle = Puzzle.find(params["id"]) | ||
| 39 | |||
| 40 | if @puzzle.latest? | ||
| 41 | if session[:puzzles][@puzzle.category]["id"] == @puzzle.id | ||
| 42 | @playable = !(session[:puzzles][@puzzle.category]["solved"]) | ||
| 43 | @already_started = session[:puzzles][@puzzle.category]["started"] | ||
| 44 | |||
| 45 | unless @playable | ||
| 46 | @solution = session[:puzzles][@puzzle.category]["path"] | ||
| 47 | end | ||
| 48 | else | ||
| 49 | @playable = true | ||
| 50 | @already_started = false | ||
| 51 | end | ||
| 52 | else | ||
| 53 | @playable = false | ||
| 54 | @already_started = false | ||
| 55 | @solution = @puzzle.solved_data | ||
| 56 | end | ||
| 57 | end | ||
| 58 | |||
| 59 | def start | ||
| 60 | @puzzle = Puzzle.find(params["id"]) | ||
| 61 | |||
| 62 | if session[:puzzles][@puzzle.category]["id"] != @puzzle.id | ||
| 63 | session[:puzzles][@puzzle.category] = { "id" => @puzzle.id } | ||
| 64 | end | ||
| 65 | |||
| 66 | session[:puzzles][@puzzle.category]["started"] = true | ||
| 67 | end | ||
| 68 | |||
| 69 | def solve | ||
| 70 | @puzzle = Puzzle.find(params["id"]) | ||
| 71 | |||
| 72 | raise ActiveRecord::RecordNotFound unless @puzzle.latest? | ||
| 73 | |||
| 74 | if @puzzle.solved_data.nil? | ||
| 75 | @puzzle.solved_data = params["solved"] | ||
| 76 | @puzzle.save! | ||
| 77 | end | ||
| 78 | |||
| 79 | @time = (params.include? :time) ? params[:time] : nil | ||
| 80 | |||
| 81 | if session[:puzzles][@puzzle.category]["id"] != @puzzle.id | ||
| 82 | session[:puzzles][@puzzle.category] = { "id" => @puzzle.id } | ||
| 83 | end | ||
| 84 | |||
| 85 | session[:puzzles][@puzzle.category]["solved"] = true | ||
| 86 | session[:puzzles][@puzzle.category]["path"] = params["solved"] | ||
| 87 | end | ||
| 88 | |||
| 89 | def submit | ||
| 90 | @puzzle = Puzzle.find(params["id"]) | ||
| 91 | |||
| 92 | raise ActiveRecord::RecordNotFound unless @puzzle.latest? | ||
| 93 | |||
| 94 | @puzzle.scores.create(name: params[:name], ip: request.ip, seconds_taken: (params.include? :time) ? params[:time] : nil) | ||
| 95 | |||
| 96 | redirect_to @puzzle | ||
| 97 | end | ||
| 98 | |||
| 99 | private | ||
| 100 | |||
| 101 | def prepare_session | ||
| 102 | session[:puzzles] ||= { | ||
| 103 | normal: { "id" => 0 }, | ||
| 104 | hard: { "id" => 0 }, | ||
| 105 | expert: { "id" => 0 }, | ||
| 106 | } | ||
| 107 | end | ||
| 108 | |||
| 109 | end | ||
| diff --git a/app/controllers/wittle/application_controller.rb b/app/controllers/wittle/application_controller.rb deleted file mode 100644 index 252a28e..0000000 --- a/app/controllers/wittle/application_controller.rb +++ /dev/null | |||
| @@ -1,4 +0,0 @@ | |||
| 1 | module Wittle | ||
| 2 | class ApplicationController < ActionController::Base | ||
| 3 | end | ||
| 4 | end | ||
| diff --git a/app/controllers/wittle/puzzles_controller.rb b/app/controllers/wittle/puzzles_controller.rb deleted file mode 100644 index a937aa1..0000000 --- a/app/controllers/wittle/puzzles_controller.rb +++ /dev/null | |||
| @@ -1,120 +0,0 @@ | |||
| 1 | module Wittle | ||
| 2 | class PuzzlesController < ApplicationController | ||
| 3 | before_action :prepare_session | ||
| 4 | after_action :commit_session | ||
| 5 | |||
| 6 | def about | ||
| 7 | @normal_puzzle = Puzzle.normal.order(created_at: :desc).first | ||
| 8 | if @session_puzzles["normal"]["id"] == @normal_puzzle.id | ||
| 9 | @normal_started = @session_puzzles["normal"]["started"] | ||
| 10 | @normal_solved = @session_puzzles["normal"]["solved"] | ||
| 11 | else | ||
| 12 | @normal_started = false | ||
| 13 | @normal_solved = false | ||
| 14 | end | ||
| 15 | |||
| 16 | @hard_puzzle = Puzzle.hard.order(created_at: :desc).first | ||
| 17 | if @session_puzzles["hard"]["id"] == @hard_puzzle.id | ||
| 18 | @hard_started = @session_puzzles["hard"]["started"] | ||
| 19 | @hard_solved = @session_puzzles["hard"]["solved"] | ||
| 20 | else | ||
| 21 | @hard_started = false | ||
| 22 | @hard_solved = false | ||
| 23 | end | ||
| 24 | |||
| 25 | @expert_puzzle = Puzzle.expert.order(created_at: :desc).first | ||
| 26 | if @session_puzzles["expert"]["id"] == @expert_puzzle.id | ||
| 27 | @expert_started = @session_puzzles["expert"]["started"] | ||
| 28 | @expert_solved = @session_puzzles["expert"]["solved"] | ||
| 29 | else | ||
| 30 | @expert_started = false | ||
| 31 | @expert_solved = false | ||
| 32 | end | ||
| 33 | end | ||
| 34 | |||
| 35 | def index | ||
| 36 | @puzzles = Puzzle.select(:id, :created_at, :category).order(created_at: :asc).all.chunk { |puzzle| puzzle.created_at.localtime.to_date }.to_h.transform_values { |by_date| by_date.sort_by(&:category).chunk { |puzzle| puzzle.category }.to_h } | ||
| 37 | end | ||
| 38 | |||
| 39 | def show | ||
| 40 | @puzzle = Puzzle.find(params[:id]) | ||
| 41 | |||
| 42 | if @puzzle.latest? | ||
| 43 | if @session_puzzles[@puzzle.category]["id"] == @puzzle.id | ||
| 44 | @playable = !(@session_puzzles[@puzzle.category]["solved"]) | ||
| 45 | @already_started = @session_puzzles[@puzzle.category]["started"] | ||
| 46 | |||
| 47 | unless @playable | ||
| 48 | @solution = @session_puzzles[@puzzle.category]["path"] | ||
| 49 | end | ||
| 50 | else | ||
| 51 | @playable = true | ||
| 52 | @already_started = false | ||
| 53 | end | ||
| 54 | else | ||
| 55 | @playable = false | ||
| 56 | @already_started = false | ||
| 57 | @solution = @puzzle.solved_data | ||
| 58 | end | ||
| 59 | end | ||
| 60 | |||
| 61 | def start | ||
| 62 | @puzzle = Puzzle.find(params[:id]) | ||
| 63 | |||
| 64 | if @session_puzzles[@puzzle.category]["id"] != @puzzle.id | ||
| 65 | @session_puzzles[@puzzle.category] = { "id" => @puzzle.id } | ||
| 66 | end | ||
| 67 | |||
| 68 | @session_puzzles[@puzzle.category]["started"] = true | ||
| 69 | end | ||
| 70 | |||
| 71 | def solve | ||
| 72 | @puzzle = Puzzle.find(params[:id]) | ||
| 73 | |||
| 74 | raise ActiveRecord::RecordNotFound unless @puzzle.latest? | ||
| 75 | |||
| 76 | if @puzzle.solved_data.nil? | ||
| 77 | @puzzle.solved_data = params[:solved] | ||
| 78 | @puzzle.save! | ||
| 79 | end | ||
| 80 | |||
| 81 | @time = (params.include? :time) ? params[:time] : nil | ||
| 82 | |||
| 83 | if @session_puzzles[@puzzle.category]["id"] != @puzzle.id | ||
| 84 | @session_puzzles[@puzzle.category] = { "id" => @puzzle.id } | ||
| 85 | end | ||
| 86 | |||
| 87 | @session_puzzles[@puzzle.category]["solved"] = true | ||
| 88 | @session_puzzles[@puzzle.category]["path"] = params[:solved] | ||
| 89 | end | ||
| 90 | |||
| 91 | def submit | ||
| 92 | @puzzle = Puzzle.find(params[:id]) | ||
| 93 | |||
| 94 | raise ActiveRecord::RecordNotFound unless @puzzle.latest? | ||
| 95 | |||
| 96 | @puzzle.scores.create(name: params[:name], ip: request.ip, seconds_taken: (params.include? :time) ? params[:time] : nil) | ||
| 97 | |||
| 98 | redirect_to @puzzle | ||
| 99 | end | ||
| 100 | |||
| 101 | private | ||
| 102 | |||
| 103 | def prepare_session | ||
| 104 | if cookies.encrypted[:puzzles].nil? | ||
| 105 | @session_puzzles = { "normal" => { id: nil }, "hard" => { id: nil }, "expert" => { id: nil } } | ||
| 106 | else | ||
| 107 | @session_puzzles = JSON.parse(cookies.encrypted[:puzzles]) | ||
| 108 | end | ||
| 109 | |||
| 110 | # Temporary hack | ||
| 111 | if session.has_key? :puzzle_solutions | ||
| 112 | session[:puzzle_solutions].clear() | ||
| 113 | end | ||
| 114 | end | ||
| 115 | |||
| 116 | def commit_session | ||
| 117 | cookies.encrypted[:puzzles] = JSON.generate(@session_puzzles) | ||
| 118 | end | ||
| 119 | end | ||
| 120 | end | ||
