Competition time limits are enforced
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 17 Sep 2019 20:21:12 +0000 (15:21 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 17 Sep 2019 20:21:12 +0000 (15:21 -0500)
codebox/controllers/problem/problem.moon
codebox/controllers/problem/submit.moon
codebox/middleware/competition_started.moon [new file with mode: 0644]
codebox/middleware/during_competition.moon [new file with mode: 0644]
codebox/utils/string.moon [new file with mode: 0644]
codebox/utils/time.moon [new file with mode: 0644]

index edb6856db919ecea469fd32f1ed09bf3dc1eb818..a38f71a66b8386724dcdce29f553764f551ee797 100644 (file)
@@ -8,7 +8,7 @@ make_controller
        inject:
                queries: 'queries'
 
-       middleware: { 'logged_in' }
+       middleware: { 'logged_in', 'competition_started' }
        scripts: { "pie_chart" }
 
     get: capture_errors_json =>
index 6c2a10fcfbce6940fb9bc7075c9f23ff039b92da..a26efe936c289b1427b7a2b9497853ae0205e5c3 100644 (file)
@@ -9,7 +9,7 @@ make_controller
                queries: 'queries'
         executer: 'executer'
 
-       middleware: { 'logged_in' }
+       middleware: { 'logged_in', 'during_competition' }
     scripts: { 'vendor/ace/ace', 'problem_submit' }
 
     get: capture_errors_json =>
@@ -35,9 +35,8 @@ make_controller
             return json: { status: 'problem not found' }
         
         test_cases = problem\get_test_cases!
-        competition = Competitions\find active: true
 
-        id = @executer\request @params.lang, @params.code, @user.id, problem.id, competition.id, test_cases, problem.time_limit
+        id = @executer\request @params.lang, @params.code, @user.id, problem.id, @competition.id, test_cases, problem.time_limit
 
         json: id
 
diff --git a/codebox/middleware/competition_started.moon b/codebox/middleware/competition_started.moon
new file mode 100644 (file)
index 0000000..b04ed9d
--- /dev/null
@@ -0,0 +1,14 @@
+import Competitions from require 'models'
+
+{:time_to_number} = (require 'utils.time')!
+
+=>
+    @competition = Competitions\find active: true
+    unless @competition
+        @write json: 'No active competition'
+    
+    current_time = os.time()
+    start_time = time_to_number @competition.start
+
+    unless start_time <= current_time
+        @write '<h1>Competition has not begun</h1>'
\ No newline at end of file
diff --git a/codebox/middleware/during_competition.moon b/codebox/middleware/during_competition.moon
new file mode 100644 (file)
index 0000000..a5a2303
--- /dev/null
@@ -0,0 +1,17 @@
+import Competitions from require 'models'
+
+{:time_to_number} = (require 'utils.time')!
+
+=>
+    @competition = Competitions\find active: true
+    unless @competition
+        @write json: 'No active competition'
+    
+    current_time = os.time()
+    start_time = time_to_number @competition.start
+    end_time = time_to_number @competition.end
+
+    unless start_time <= current_time
+        @write '<h1>Competition has not begun</h1>'
+    unless current_time <= end_time
+        @write '<h1>Competition has ended</h1>'
\ No newline at end of file
diff --git a/codebox/utils/string.moon b/codebox/utils/string.moon
new file mode 100644 (file)
index 0000000..318d6f0
--- /dev/null
@@ -0,0 +1,5 @@
+string.split = (pattern) =>
+    t = {}
+    for s in string.gmatch @, "([^#{pattern}]+)"
+        table.insert t, s
+    t
\ No newline at end of file
diff --git a/codebox/utils/time.moon b/codebox/utils/time.moon
new file mode 100644 (file)
index 0000000..9d24f83
--- /dev/null
@@ -0,0 +1,19 @@
+require 'utils.string'
+
+-> {
+    -- Assumes time is formmated like:
+    --      YYYY-MM-DD HH:MM:SS
+    time_to_number: (timestamp) ->
+        {date, time} = string.split timestamp, " "
+
+        {year, month, day} = string.split date, "-"
+        {hour, minute, second} = string.split time, ":"
+
+        return os.time
+            year: tonumber(year)
+            month: tonumber(month)
+            day: tonumber(day)
+            hour: tonumber(hour)
+            minute: tonumber(minute)
+            second: tonumber(second)
+}
\ No newline at end of file