Add extensions for GCCGO, GOLANG, HASKELL
[gruntmaster-page.git] / lib / Gruntmaster / Page / Submit.pm
1 package Gruntmaster::Page::Submit;
2
3 use Gruntmaster::Page::Base;
4
5 use constant FORMAT_EXTENSION => {
6 C => 'c',
7 CPP => 'cpp',
8 GCCGO => 'go',
9 GOLANG => 'go',
10 HASKELL => 'hs',
11 MONO => 'cs',
12 JAVA => 'java',
13 PASCAL => 'pas',
14 PERL => 'pl',
15 PYTHON => 'py',
16 };
17
18 sub generate{
19 my ($self, $frm, $env) = @_;
20 my $r = Plack::Request->new($env);
21 my ($problem, $format, $contest, $private, $prog) = map {scalar $r->param($_)} 'problem', 'prog_format', 'contest', 'private', 'source_code';
22 $problem //= $env->{'gruntmaster.problem'};
23 $contest //= $env->{'gruntmaster.contest'};
24 my $upload = $r->upload('prog');
25 if (defined $upload) {
26 my $temp = read_file $upload->path;
27 $prog = $temp if $temp
28 }
29 die if defined $contest && $contest !~ /^\w+$/ ;
30 die if defined $contest && (time > db($env)->contest($contest)->stop);
31 return reply 'A required parameter was not supplied' if grep { !defined } $problem, $format, $prog;
32 return reply 'Maximum source size is 10KB' if length $prog > 25 * 1024;
33 return reply 'You must wait 30 seconds between jobs' unless time > db($env)->user($r->user)->lastjob + 30;
34 db($env)->user($r->user)->update({lastjob => time});
35
36 db($env)->jobs->create({
37 defined $contest ? (contest => $contest) : (),
38 date => time,
39 extension => FORMAT_EXTENSION->{$format},
40 format => $format,
41 defined $private ? (private => $private) : (),
42 problem => $problem,
43 source => $prog,
44 owner => $r->user
45 });
46
47 $contest //= '';
48 #PUBLISH 'jobs', "$contest.$job";
49 [303, [Location => ($contest ? "/ct/$contest/log/" : '/log/')], ['']]
50 }
51
52 1
This page took 0.023049 seconds and 4 git commands to generate.