Annotation of chik/chik.cgi, revision 1.2
1.1 boris 1: #!/usr/bin/perl
2:
3: =head1 NAME
4:
5: chik.cgi - a robot for competitions with separate starts
6:
7: =head1 DESCRIPTION
8:
9: The robot is a Web CGI interface. It must authentificate
10: the team. If the regnumber and password are corrrect, it sends
11: a message to the team's email and demonstrates the questions on
12: the web. Also, it updates the field "StartTime" and sends message
13: to the secretary "Team NN started at I<Date>"
14:
15: =head1 USES
16:
17: MySQL table Chik with the fields:
1.2 ! boris 18: CREATE TABLE Chik (RegNum Int NOT NULL,
! 19: Name TINYTEXT,
! 20: Password TINYTEXT,
! 21: Email TINYTEXT,
! 22: Started ENUM('Y','N') DEFAULT 'N',
! 23: StartDate TIMESTAMP(14), Unique(RegNum));
! 24:
! 25: It expects to find the file F<../../cfg/chik/questions.cfg>, with
! 26: the questions, <F<../../cfg/chik/h.cfg> with the headers and
! 27: F<../../cfg/chik/f.cfg> with the footers.
1.1 boris 28:
29:
30: =head1 AUTHOR
31:
32: Boris Veytsman
33:
34: =head1 DATE
35:
1.2 ! boris 36: $Date: 2000/10/31 21:30:30 $
1.1 boris 37:
38: =head1 VERSION
39:
1.2 ! boris 40: $Revision: 1.1 $
1.1 boris 41:
42: =cut
43:
44: use strict;
1.2 ! boris 45: use CGI qw/:standard/;
! 46: use DBI;
! 47:
! 48: my $secretary="elir\@immisrael.com";
! 49: my $SENDMAIL = "/usr/sbin/sendmail";
! 50: my $questions = "../../cfg/chik/q.txt";
! 51: my $header = "../../cfg/chik/h.html";
! 52: my $footer = "../../cfg/f.html";
1.1 boris 53:
54: my $query=new CGI;
55:
56: print $query->header;
1.2 ! boris 57: print $query->start_html(-title=>'Robot turnira CHIK',-bgcolor=>'#fff0e0');
1.1 boris 58: print Include_virtual("../dimrub/db/reklama.html");
1.2 ! boris 59: print $query->h1({'-align'=>'center'},'Робот турнира ЧИК');
! 60:
! 61: open(HEADER,$header);
! 62: print <HEADER>;
! 63: close HEADER;
! 64:
! 65: print "<p> Сейчас на куличках ", `date`," </p>\n";
! 66:
! 67: if ($query->param('Look')) {
! 68: print_list($query);
! 69: $query->delete('Look');
! 70: } elsif ($query->param('Start')) {
! 71: $query->delete('Start');
! 72: print_questions($query);
! 73: }
1.1 boris 74:
75: print_query($query);
76:
1.2 ! boris 77: open(FOOTER,$footer);
! 78: print <FOOTER>;
! 79: close FOOTER;
! 80:
! 81:
1.1 boris 82: print $query->end_html;
83:
1.2 ! boris 84:
1.1 boris 85: exit 0;
86:
87:
88: sub Include_virtual {
89: my ($fn, $output) = (@_, '');
90:
91: open F , $fn
92: or return; #die "Can't open the file $fn: $!\n";
93:
94: while (<F>) {
95: if (/<!--#include/o) {
96: s/<!--#include virtual="\/(.*)" -->/&Include_virtual($1)/e;
97: }
98: if (/<!--#exec/o) {
99: s/<!--#exec.*cmd\s*=\s*"([^"]*)".*-->/`$1`/e;
100: }
101: $output .= $_;
102: }
103: return $output;
104: }
105:
106:
107:
108: sub print_query {
109: my $query = shift;
110: print $query->start_form;
1.2 ! boris 111: print $query->h2("Начать игру");
! 112: print "<p>\n";
! 113: print "Рег. номер: ",
! 114: $query->textfield('regnum'), " ",
! 115: "Пароль: ",$query->password_field('password'), "</p>";
! 116: print "<p>", $query->submit("Start","Start"), " ";
! 117: print $query->defaults('Reset'),"</p>\n";
! 118: print $query->h2("Посмотреть, кто играет");
! 119: print "<p>", $query->submit("Look","Look"), "</p>";
1.1 boris 120: print $query->end_form;
1.2 ! boris 121: }
! 122:
! 123:
! 124:
! 125: sub print_list {
! 126: my $query = shift;
! 127:
! 128: my $dbh = DBI->connect("DBI:mysql:chgk", "piataev", "")
! 129: or do {
! 130: print h1("Временные проблемы") . "Робот временно не
! 131: работает. Заходите попозже.";
! 132: return 0;
! 133: };
! 134: my $sth=$dbh->prepare("SELECT RegNum, Name, StartDate FROM
! 135: Chik WHERE Started='Y' Order by StartDate");
! 136: $sth->execute;
! 137: print h3("Начали игру:");
! 138: print "<table>\n";
! 139: print "<tr><th>Номер</th><th>Команда</th><th>Начало игры</th></tr>\n";
! 140: while (my @line=$sth->fetchrow) {
! 141: my $date=pop @line;
! 142: $date=convert_date($date);
! 143: push @line,$date;
! 144: print_line(@line);
! 145: }
! 146: print "</table>\n";
! 147: $sth=$dbh->prepare("SELECT RegNum, Name FROM
! 148: Chik WHERE Started='N' Order by RegNum");
! 149: $sth->execute;
! 150: print h3("Не начали игру:");
! 151: print "<table>\n";
! 152: print "<tr><th>Номер</th><th>Команда</th></tr>\n";
! 153: while (my @line=$sth->fetchrow) {
! 154: print_line(@line);
! 155: }
! 156: print "</table>\n";
! 157:
! 158: $dbh->disconnect;
! 159: return 0;
! 160:
! 161: }
! 162:
! 163:
! 164: sub print_line {
! 165: print "<tr><td>",join("</td><td>",@_),"</td></tr>\n";
! 166: }
! 167:
! 168:
! 169: sub print_questions {
! 170: my $query = shift;
! 171: my $regnum=$query->param('regnum');
! 172: my $password=$query->param('password');
! 173: my $dbh = DBI->connect("DBI:mysql:chgk", "piataev", "")
! 174: or do {
! 175: print h1("Временные проблемы") . "Робот временно не
! 176: работает. Заходите попозже.";
! 177: return 1;
! 178: };
! 179: $regnum=$dbh->quote($regnum);
! 180: $password=$dbh->quote($password);
! 181: my $sth=$dbh->prepare("SELECT Name, Email, Started, StartDate FROM
! 182: Chik WHERE RegNum=$regnum
! 183: AND Password=$password");
! 184: $sth->execute;
! 185:
! 186: my @result=$sth->fetchrow;
! 187: if (!scalar @result) {
! 188: print "<p><strong>Пароль неверен. Попробуйте еще раз.</p>\n";
! 189: return 1;
! 190: }
! 191: my ($name,$email,$started,$startdate)=@result;
! 192: $startdate=convert_date($startdate);
! 193: if ($started eq 'Y') {
! 194: print "<p>Ваша команда уже начала играть в $startdate</p>\n";
! 195: } else {
! 196: $sth=$dbh->prepare("UPDATE Chik SET Started='Y'
! 197: WHERE RegNum=$regnum");
! 198: $sth->execute;
! 199: open(F, "| $SENDMAIL -t -n" );
! 200: print F <<"EOT";
! 201: To: $secretary
! 202: From: boris\@plmsc.psu.edu
! 203: Subject: Chik: komanda nachala igrat
! 204: MIME-Version: 1.0
! 205: Content-type: text/plain; charset="koi8-r"
! 206:
! 207: EOT
! 208: print F "Команда $name, регистрационный номер $regnum ",
! 209: "начала играть в $startdate\n";
! 210: print F "\n\n--\nРобот\n";
! 211: close F;
! 212: open(F, "| $SENDMAIL -t -n" );
! 213: print F <<"EOT";
! 214: To: $email
! 215: From: boris\@plmsc.psu.edu
! 216: Subject: Voprosy CHIK
! 217: MIME-Version: 1.0
! 218: Content-type: text/plain; charset="koi8-r"
! 219:
! 220: -------------------------------------------------------------
! 221: EOT
! 222:
! 223: open(QUEST,$questions);
! 224:
! 225: print F <QUEST>;
! 226: print F <<"EOT";
! 227:
! 228: -------------------------------------------------------------
! 229: EOT
! 230: print F "\n\n--\nРобот\n";
! 231: close F;
! 232: close (QUEST);
! 233: }
! 234: open(QUEST,$questions);
! 235: print "<hr>\n<pre>\n";
! 236: print <QUEST>;
! 237: print "</pre>\n<hr>\n";
! 238: return 0;
! 239: }
! 240:
! 241: sub convert_date {
! 242: my $date=shift;
! 243: my $year=substr($date,0,4);
! 244: my $month=substr($date,4,2);
! 245: my $day=substr($date,6,2);
! 246: my $hour=substr($date,8,2);
! 247: my $min=substr($date,10,2);
! 248: my $sec=substr($date,12,2);
! 249: return "$year-$month-$day $hour:$min:$sec";
1.1 boris 250: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>