Пример #1
0
function check_contest($data, $keydata = null)
{
    if (isset($data['shortname']) && !preg_match(ID_REGEX, $data['shortname'])) {
        ch_error("Contest shortname may only contain characters " . IDENTIFIER_CHARS . ".");
    }
    // are these dates valid?
    foreach (array('starttime', 'endtime', 'freezetime', 'unfreezetime', 'activatetime', 'deactivatetime') as $f) {
        // The true input date/time strings are preserved in the
        // *_string variables, since these may be relative times
        // that need to be kept as is.
        $data[$f] = $data[$f . '_string'];
        $data[$f] = check_relative_time($data[$f], $data['starttime'], $f);
    }
    // are required times specified?
    foreach (array('activatetime', 'starttime', 'endtime') as $f) {
        if (empty($data[$f])) {
            ch_error("Contest {$f} is empty");
            return $data;
        }
    }
    // the ordering of times is:
    // activatetime <= starttime <= freezetime < endtime <= unfreezetime <= deactivatetime
    // are contest start/end times in order?
    if (difftime($data['endtime'], $data['starttime']) <= 0) {
        ch_error('Contest ends before it even starts');
    }
    if (!empty($data['freezetime'])) {
        if (difftime($data['freezetime'], $data['endtime']) > 0 || difftime($data['freezetime'], $data['starttime']) < 0) {
            ch_error('Freezetime is out of start/endtime range');
        }
    }
    if (difftime($data['activatetime'], $data['starttime']) > 0) {
        ch_error('Activate time is later than starttime');
    }
    if (!empty($data['unfreezetime'])) {
        if (empty($data['freezetime'])) {
            ch_error('Unfreezetime set but no freeze time. That makes no sense.');
        }
        if (difftime($data['unfreezetime'], $data['endtime']) < 0) {
            ch_error('Unfreezetime must be larger than endtime.');
        }
        if (difftime($data['deactivatetime'], $data['unfreezetime']) < 0) {
            ch_error('Deactivatetime must be larger than unfreezetime.');
        }
    } else {
        if (!empty($data['deactivatetime']) && difftime($data['deactivatetime'], $data['endtime']) < 0) {
            ch_error('Deactivatetime must be larger than endtime.');
        }
    }
    return $data;
}
Пример #2
0
    requireAdmin();
    $docid = $_POST['cid'];
    $time = key($_POST['donow']);
    if (!in_array($time, $times)) {
        error("Unknown value for timetype");
    }
    $now = floor($now);
    $nowstring = strftime('%Y-%m-%d %H:%M:%S', $now);
    auditlog('contest', $docid, $time . ' now', $nowstring);
    // starttime is special because other, relative times depend on it.
    if ($time == 'start') {
        $docdata = $cdatas[$docid];
        $docdata['starttime'] = $now;
        $docdata['starttime_string'] = $nowstring;
        foreach (array('endtime', 'freezetime', 'unfreezetime', 'activatetime', 'deactivatetime') as $f) {
            $docdata[$f] = check_relative_time($docdata[$f . '_string'], $docdata['starttime'], $f);
        }
        $DB->q('UPDATE contest SET starttime = %s, starttime_string = %s,
		        endtime = %s, freezetime = %s, unfreezetime = %s,
		        activatetime = %s, deactivatetime = %s
		        WHERE cid = %i', $docdata['starttime'], $docdata['starttime_string'], $docdata['endtime'], $docdata['freezetime'], $docdata['unfreezetime'], $docdata['activatetime'], $docdata['deactivatetime'], $docid);
        header("Location: ./contests.php?edited=1");
    } else {
        $DB->q('UPDATE contest SET ' . $time . 'time = %s, ' . $time . 'time_string = %s
		        WHERE cid = %i', $now, $nowstring, $docid);
        header("Location: ./contests.php");
    }
    exit;
}
$title = 'Contests';
require LIBWWWDIR . '/header.php';