using System.ComponentModel.Design;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
Console.Title = "Khai schedule";
const int MF_BYCOMMAND = 0x00000000;
const int SC_MINIMIZE = 0xF020;
const int SC_MAXIMIZE = 0xF030;
const int SC_SIZE = 0xF000;
[DllImport("user32.dll")]
static extern int DeleteMenu(IntPtr hMenu, int nPosition, int wFlags);
[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("kernel32.dll", ExactSpelling = true)]
static extern IntPtr GetConsoleWindow();
Console.SetWindowSize(width, height);
DeleteMenu(GetSystemMenu(GetConsoleWindow(), false), SC_MINIMIZE, MF_BYCOMMAND);
DeleteMenu(GetSystemMenu(GetConsoleWindow(), false), SC_MAXIMIZE, MF_BYCOMMAND);
DeleteMenu(GetSystemMenu(GetConsoleWindow(), false), SC_SIZE, MF_BYCOMMAND);
const Int32 SW_MINIMIZE = 6;
[DllImport("User32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ShowWindow([In] IntPtr hWnd, [In] Int32 nCmdShow);
static void MinimizeConsoleWindow()
IntPtr hWndConsole = GetConsoleWindow();
ShowWindow(hWndConsole, SW_MINIMIZE);
ConsoleColor DefaultConsBackColor = Console.BackgroundColor;
ConsoleColor DefaultConsTextColor = Console.ForegroundColor;
ConsoleColor ConsBackColor = ConsoleColor.Black;
ConsoleColor ConsTextColor = ConsoleColor.Gray;
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Console.OutputEncoding = System.Text.Encoding.Unicode;
Console.InputEncoding = System.Text.Encoding.GetEncoding(1251);
using var client = new KhaiClient();
Console.BackgroundColor = ConsBackColor;
Console.ForegroundColor = ConsTextColor;
Console.Write("1. Поиск по группе <1>\n" +
"2. Поиск по имени <2>\n" +
"3. Считать расписание из файла <3>\n" +
keyInfo = Console.ReadKey(true);
Console.Write("Введите группу в формате 325, 525v (525в), 116i1, 430st (430ст), 555vm-2 (555вм/2)\n>>> ");
group = Console.ReadLine();
if (group == "exit") Environment.Exit(0);
if (group == "back") goto MenuCommand;
Schedule = await client.GetGroupWeekSheduleAsync(group);
catch (NullReferenceException e)
Console.Write("Некорректный ввод или группы не существует\n");
Console.Write("Очень некорректный ввод, группы не существует или плохое интернет соединение\n");
Console.BackgroundColor = ConsBackColor;
Console.ForegroundColor = ConsTextColor;
Console.WriteLine(new string(' ', (Console.WindowWidth - 8 - group.Length) / 2) + $"Группа: {group}");
await Task.Run(() => Output.Outputing(Schedule));
Console.Write("Введите имя в формате bondarenko-a-o, kuzmichov-i-i\n>>> ");
name = Console.ReadLine();
if (name == "exit") Environment.Exit(0);
if (name == "back") goto MenuCommand;
Schedule = await client.GetStudentWeekSheduleAsync(name);
catch (NullReferenceException e)
Console.Write("Некорректный ввод или студента не существует\n");
catch (System.Net.Http.HttpRequestException e)
Console.Write("Некорректный ввод или студента не существует\n");
Console.Write("Очень некорректный ввод, студента не существует или плохое интернет соединение\n");
Console.BackgroundColor = ConsBackColor;
Console.ForegroundColor = ConsTextColor;
Console.WriteLine(new string(' ', (Console.WindowWidth - 9 - name.Length) / 2) + $"Студент: {name}");
await Task.Run(() => Output.Outputing(Schedule));
Schedule = FileWork.ReadScheduleFromFile();
Console.BackgroundColor = ConsBackColor;
Console.ForegroundColor = ConsTextColor;
await Task.Run(() => Output.Outputing(Schedule));
catch (FileWasNotFoundException e)
Console.WriteLine("Не удалось прочитать файл.\n");
catch (ScheduleWasNotFoundException e)
Console.WriteLine("Нет сохранённого расписания.\n");
Console.WriteLine("Произошло что-то очень плохое\n");
Console.Write("1. Вернуться в главное меню <1>\n2. Выход <Esc>\n>>> ");
keyInfo = Console.ReadKey(true);
Console.Write("1. Сохранить расписание в текстовый файл <1>\n" +
"2. Вернуться в главное меню <2>\n" +
keyInfo = Console.ReadKey(true);
FileWork.SaveSchduleToFile(Schedule);
catch (DirectoryDoesNotExistException e)
Console.WriteLine("Путь для сохранения файла не найден");
Console.WriteLine("Путь для сохранения файла создан \"C://Khai/\"");
Console.WriteLine("Файл с расписанием создан");
FileWork.SaveSchduleToFile(Schedule);
catch (FileDoesNotExistException e)
Console.WriteLine("Файл для сохранения не найден");
Console.WriteLine("Файл с расписанием создан по пути \"C://Khai/\"");
FileWork.SaveSchduleToFile(Schedule);
Console.WriteLine("\nПроизошло что-то очень плохое");
Console.WriteLine("Расписание успешно сохранено\n");
Console.Write("1. Вернуться в главное меню <1>\n2. Выход <Esc>\n>>> ");
keyInfo = Console.ReadKey(true);
const int TABLEWIDTH = 110;
const int TIMEWIDTH = 23;
const int SUBJECTWIDTH = TABLEWIDTH - TIMEWIDTH - 3;
static string[] timeOfPairs = { "08:00 - 09:35", "09:50 - 11:25", "11:55 - 13:30", "13:45 - 15:20", "15:35 - 17:10" };
static string[] daysOfWeek = { "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця" };
public async static Task Outputing(WeekSchedule Schedule)
ConsoleColor CurrentBackColor = Console.BackgroundColor;
ConsoleColor CurrentTextColor = Console.ForegroundColor;
ConsoleColor TableBackColor = CurrentBackColor;
ConsoleColor TableTextColor = CurrentTextColor;
ConsoleColor NumBackColor = ConsoleColor.Black;
ConsoleColor NumTextColor = ConsoleColor.Gray;
ConsoleColor DenBackColor = ConsoleColor.DarkYellow;
ConsoleColor DenTextColor = ConsoleColor.Black;
ConsoleColor TimeBackColor = ConsoleColor.Black;
ConsoleColor TimeTextColor = ConsoleColor.Gray;
ConsoleColor DayOfWeekBackColor = ConsoleColor.Black;
ConsoleColor DayOfWeekTextColor = ConsoleColor.Gray;
foreach (var day in Schedule.AsDays())
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + new string('-', TABLEWIDTH));
Console.Write(new string(' ', (Console.WindowWidth -TABLEWIDTH)/2) + "|");
SetColor(DayOfWeekBackColor, DayOfWeekTextColor);
Console.Write(new string(' ', ((TABLEWIDTH - 2) - daysOfWeek[count].Length) / 2) + daysOfWeek[count] + new string(' ', (TABLEWIDTH - 2) - ((TABLEWIDTH - 2) - daysOfWeek[count].Length) / 2 - daysOfWeek[count].Length));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + new string('-', TABLEWIDTH));
for (int j = 0; j < 5; j++)
if (j >= day.Classes.Count) break;
if (day.Classes[j].Numerator == day.Classes[j].Denominator && day.Classes[j].Numerator != null)
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', (TIMEWIDTH - timeOfPairs[j].Length) /2) + timeOfPairs[j] + new string(' ', TIMEWIDTH - timeOfPairs[j].Length - ((TIMEWIDTH - timeOfPairs[j].Length) / 2)));
SetColor(TableBackColor, TableTextColor);
if (day.Classes[j].Numerator.RoomNumber != null)
output += day.Classes[j].Numerator.RoomNumber + ", ";
num += day.Classes[j].Numerator.RoomNumber.Length + 2;
if(day.Classes[j].Numerator.Name != null)
output += day.Classes[j].Numerator.Name;
num += day.Classes[j].Numerator.Name.Length;
if (day.Classes[j].Numerator.Type != null)
output += ", " + day.Classes[j].Numerator.Type;
num += day.Classes[j].Numerator.Type.Length + 2;
SetColor(NumBackColor, NumTextColor);
int temp = (num/SUBJECTWIDTH);
Console.Write(output.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(output.Substring(SUBJECTWIDTH*counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(output.Substring(SUBJECTWIDTH * counter) + new string(' ', SUBJECTWIDTH - output.Substring(SUBJECTWIDTH * counter).Length));
else if (num == SUBJECTWIDTH) Console.Write(output);
else Console.Write(new string(' ', (SUBJECTWIDTH - num) / 2) + output + new string(' ', SUBJECTWIDTH - num - ((SUBJECTWIDTH - num) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + new string('-', TABLEWIDTH));
else if (day.Classes[j].Numerator == day.Classes[j].Denominator && day.Classes[j].Numerator == null)
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', (TIMEWIDTH - timeOfPairs[j].Length) / 2) + timeOfPairs[j] + new string(' ', TIMEWIDTH - timeOfPairs[j].Length - ((TIMEWIDTH - timeOfPairs[j].Length) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (SUBJECTWIDTH - 19) / 2) + "*******************" + new string(' ', SUBJECTWIDTH - 19 - (SUBJECTWIDTH - 19) / 2));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + new string('-', TABLEWIDTH));
if (day.Classes[j].Numerator == null)
if (day.Classes[j].Denominator.RoomNumber != null)
output += day.Classes[j].Denominator.RoomNumber + ", ";
den += day.Classes[j].Denominator.RoomNumber.Length + 2;
if (day.Classes[j].Denominator.Name != null)
output += day.Classes[j].Denominator.Name;
den += day.Classes[j].Denominator.Name.Length;
if (day.Classes[j].Denominator.Type != null)
output += ", " + day.Classes[j].Denominator.Type;
den += day.Classes[j].Denominator.Type.Length + 2;
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (SUBJECTWIDTH - 19) / 2) + "*******************" + new string(' ', SUBJECTWIDTH - 19 - (SUBJECTWIDTH - 19) / 2));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', (TIMEWIDTH - timeOfPairs[j].Length) / 2) + timeOfPairs[j] + new string(' ', TIMEWIDTH - timeOfPairs[j].Length - ((TIMEWIDTH - timeOfPairs[j].Length) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string('-', SUBJECTWIDTH+1));
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(DenBackColor, DenTextColor);
int temp = (den / SUBJECTWIDTH);
Console.Write(output.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(output.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(output.Substring(SUBJECTWIDTH * counter) + new string(' ', SUBJECTWIDTH - output.Substring(SUBJECTWIDTH * counter).Length));
else if (den == SUBJECTWIDTH) Console.Write(output);
else Console.Write(new string(' ', (SUBJECTWIDTH - den) / 2) + output + new string(' ', SUBJECTWIDTH - den - ((SUBJECTWIDTH - den) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + new string('-', TABLEWIDTH));
else if (day.Classes[j].Denominator == null)
if (day.Classes[j].Numerator.RoomNumber != null)
output += day.Classes[j].Numerator.RoomNumber + ", ";
num += day.Classes[j].Numerator.RoomNumber.Length + 2;
if (day.Classes[j].Numerator.Name != null)
output += day.Classes[j].Numerator.Name;
num += day.Classes[j].Numerator.Name.Length;
if (day.Classes[j].Numerator.Type != null)
output += ", " + day.Classes[j].Numerator.Type;
num += day.Classes[j].Numerator.Type.Length + 2;
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
int temp = (num / SUBJECTWIDTH);
Console.Write(output.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(output.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(output.Substring(SUBJECTWIDTH * counter) + new string(' ', SUBJECTWIDTH - output.Substring(SUBJECTWIDTH * counter).Length));
else if (num == SUBJECTWIDTH) Console.Write(output);
else Console.Write(new string(' ', (SUBJECTWIDTH - num) / 2) + output + new string(' ', SUBJECTWIDTH - num - ((SUBJECTWIDTH - num) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', (TIMEWIDTH - timeOfPairs[j].Length) / 2) + timeOfPairs[j] + new string(' ', TIMEWIDTH - timeOfPairs[j].Length - ((TIMEWIDTH - timeOfPairs[j].Length) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string('-', SUBJECTWIDTH + 1));
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(DenBackColor, DenTextColor);
Console.Write(new string(' ', (SUBJECTWIDTH - 19) / 2) + "*******************" + new string(' ', SUBJECTWIDTH - 19 - (SUBJECTWIDTH - 19) / 2));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + new string('-', TABLEWIDTH));
string out_num = "", out_den = "";
if (day.Classes[j].Numerator.RoomNumber != null)
out_num += day.Classes[j].Numerator.RoomNumber + ", ";
num += day.Classes[j].Numerator.RoomNumber.Length + 2;
if (day.Classes[j].Numerator.Name != null)
out_num += day.Classes[j].Numerator.Name;
num += day.Classes[j].Numerator.Name.Length;
if (day.Classes[j].Numerator.Type != null)
out_num += ", " + day.Classes[j].Numerator.Type;
num += day.Classes[j].Numerator.Type.Length + 2;
if (day.Classes[j].Denominator.RoomNumber != null)
out_den += day.Classes[j].Denominator.RoomNumber + ", ";
den += day.Classes[j].Denominator.RoomNumber.Length + 2;
if (day.Classes[j].Denominator.Name != null)
out_den += day.Classes[j].Denominator.Name;
den += day.Classes[j].Denominator.Name.Length;
if (day.Classes[j].Denominator.Type != null)
out_den += ", " + day.Classes[j].Denominator.Type;
den += day.Classes[j].Denominator.Type.Length + 2;
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
int temp = (num / SUBJECTWIDTH);
Console.Write(out_num.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(out_num.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(out_num.Substring(SUBJECTWIDTH * counter) + new string(' ', SUBJECTWIDTH - out_num.Substring(SUBJECTWIDTH * counter).Length));
else if (num == SUBJECTWIDTH) Console.Write(out_num);
else Console.Write(new string(' ', (SUBJECTWIDTH - num) / 2) + out_num + new string(' ', SUBJECTWIDTH - num - ((SUBJECTWIDTH - num) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', (TIMEWIDTH - timeOfPairs[j].Length) / 2) + timeOfPairs[j] + new string(' ', TIMEWIDTH - timeOfPairs[j].Length - ((TIMEWIDTH - timeOfPairs[j].Length) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string('-', SUBJECTWIDTH+1));
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TimeBackColor, TimeTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(DenBackColor, DenTextColor);
int temp = (den / SUBJECTWIDTH);
Console.Write(out_den.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(out_den.Substring(SUBJECTWIDTH * counter, SUBJECTWIDTH));
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + "|");
SetColor(TableBackColor, TableTextColor);
Console.Write(new string(' ', TIMEWIDTH));
SetColor(TableBackColor, TableTextColor);
SetColor(NumBackColor, NumTextColor);
Console.Write(out_den.Substring(SUBJECTWIDTH * counter) + new string(' ', SUBJECTWIDTH - out_den.Substring(SUBJECTWIDTH * counter).Length));
else if (den == SUBJECTWIDTH) Console.Write(out_den);
else Console.Write(new string(' ', (SUBJECTWIDTH - den) / 2) + out_den + new string(' ', SUBJECTWIDTH - den - ((SUBJECTWIDTH - den) / 2)));
SetColor(TableBackColor, TableTextColor);
Console.WriteLine(new string(' ', (Console.WindowWidth - TABLEWIDTH) / 2) + new string('-', TABLEWIDTH));
public static void SetColor(ConsoleColor back, ConsoleColor front)
Console.BackgroundColor = back;
Console.ForegroundColor = front;
public static void PrintKhai()
Console.Write("\n\n" + new string(' ', (Console.WindowWidth-18)/2) +"|");
Console.Write(" Расписание ХАИ ");
public static void SetColorTheme(ref ConsoleColor[] colors)
Console.BackgroundColor = colors[0];
Console.ForegroundColor = colors[1];