me(); printf( "Ключ работает. Преподаватель: %s. Классов можно до %d, учеников в классе до %d.\n\n", $who['teacher']['name'], $who['limits']['max_classes'], $who['limits']['max_students_per_class'] ); if (! $who['key']['can_write']) { exit("Ключ только на чтение: заводить учеников им нельзя.\n"); } $class = $cw->createClass('7Б информатика', 150, 95); printf("Класс создан: %s (id %d), свободных мест %d\n", $class['name'], $class['id'], $class['free_seats']); /* * Имена берём из своей системы. Здесь для примера - из файла, * по одному в строке. */ $names = file_exists(__DIR__ . '/names.txt') ? array_filter(array_map('trim', file(__DIR__ . '/names.txt'))) : ['Иванов Пётр', 'Петрова Анна', 'Сидоров Илья']; $result = $cw->addStudents($class['id'], $names); printf("\nЗаведено: %d\n", $result['meta']['created']); foreach ($result['data'] as $student) { printf(" %-24s %-16s %s\n", $student['name'], $student['login'], $student['password']); } /* * Пропущенных смотреть обязательно. «Создано 18 из 20» без причин - * это два ребёнка, которые придут на урок без пароля. */ foreach ($result['meta']['skipped'] as $skipped) { printf(" ПРОПУЩЕН %-20s %s\n", $skipped['name'], $skipped['reason']); } break; /* ----------------------------------------------- пароли для урока */ case 'passwords': foreach ($cw->classes() as $class) { if ($class['archived']) { continue; } printf("\n=== %s\n", $class['name']); foreach ($cw->allStudents($class['id']) as $student) { printf( " %-24s %-16s %s\n", $student['name'], $student['login'], // Пароля нет у тех, кто сменил его сам, и у пришедших // по ссылке-приглашению: их аккаунт принадлежит им $student['temp_password'] ?? '— сменил сам' ); } } break; /* ----------------------------------------------- выгрузка за неделю */ case 'stats': $from = date('Y-m-d', strtotime('-7 days')); $to = date('Y-m-d'); $file = fopen(__DIR__ . '/stats-' . $to . '.csv', 'w'); fprintf($file, "\xEF\xBB\xBF"); // BOM, иначе Excel испортит кириллицу $headerWritten = false; foreach ($cw->classes() as $class) { if ($class['archived']) { continue; } $table = $cw->export($class['id'], 'students', $from, $to); if (! $headerWritten) { fputcsv($file, array_merge(['Класс'], $table['header']), ';'); $headerWritten = true; } foreach ($table['rows'] as $row) { fputcsv($file, array_merge([$class['name']], $row), ';'); } } fclose($file); printf("Готово: stats-%s.csv\n", $to); break; default: echo "Команды: setup, passwords, stats\n"; } } catch (CodeWarApiException $e) { /* * Разбирать ошибку надо по коду, а не по тексту: текст мы можем * переписать, код - нет. */ switch ($e->errorCode) { case 'unauthorized': echo "Ключ не подошёл. Проверьте CODEWAR_KEY.\n"; break; case 'forbidden_scope': echo "Ключу не хватает прав на запись. Попросите их в кабинете.\n"; break; case 'not_found': echo "Не ваш класс или не ваш ученик.\n"; break; case 'validation_failed': echo "Не те параметры: " . json_encode($e->fields, JSON_UNESCAPED_UNICODE) . "\n"; break; default: echo 'Ошибка ' . $e->errorCode . ': ' . $e->getMessage() . ($e->requestId ? ' (запрос ' . $e->requestId . ')' : '') . "\n"; } exit(1); }