@emiran/omu-ubys 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http/constants.ts","../src/auth/login.ts","../src/http/session.ts","../src/utils/base64.ts","../src/parsers/profile.ts","../src/parsers/advisor.ts","../src/parsers/cafeteria.ts","../src/utils/html.ts","../src/utils/parse.ts","../src/parsers/class-details.ts","../src/parsers/grades.ts","../src/parsers/messages.ts","../src/parsers/schedule.ts","../src/parsers/transcript.ts","../src/client.ts"],"names":["load","textOrUndefined","decodeText","normalizeText"],"mappings":"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","file":"index.js","sourcesContent":["export interface UBYSErrorOptions {\r\n cause?: unknown;\r\n code?: string;\r\n details?: Record<string, unknown>;\r\n}\r\n\r\nexport class UBYSError extends Error {\r\n public readonly code: string;\r\n public readonly details: Record<string, unknown> | undefined;\r\n\r\n public constructor(message: string, options: UBYSErrorOptions = {}) {\r\n super(message, { cause: options.cause });\r\n this.name = new.target.name;\r\n this.code = options.code ?? \"UBYS_ERROR\";\r\n this.details = options.details;\r\n }\r\n}\r\n\r\nexport class AuthenticationError extends UBYSError {\r\n public constructor(message = \"Authentication failed.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"AUTHENTICATION_ERROR\" });\r\n }\r\n}\r\n\r\nexport class LoginError extends AuthenticationError {\r\n public constructor(message = \"Login failed.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"LOGIN_ERROR\" });\r\n }\r\n}\r\n\r\nexport class SessionExpiredError extends AuthenticationError {\r\n public constructor(message = \"UBYS session expired.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"SESSION_EXPIRED\" });\r\n }\r\n}\r\n\r\nexport class NetworkError extends UBYSError {\r\n public constructor(message = \"Network request failed.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"NETWORK_ERROR\" });\r\n }\r\n}\r\n\r\nexport class HttpError extends UBYSError {\r\n public readonly statusCode: number;\r\n\r\n public constructor(statusCode: number, message = `Unexpected HTTP status: ${statusCode}`, options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"HTTP_ERROR\" });\r\n this.statusCode = statusCode;\r\n }\r\n}\r\n\r\nexport class ParseError extends UBYSError {\r\n public constructor(message = \"Failed to parse UBYS response.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"PARSE_ERROR\" });\r\n }\r\n}\r\n\r\nexport class NotImplementedUBYSError extends UBYSError {\r\n public constructor(message = \"This UBYS feature is planned but not implemented yet.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"NOT_IMPLEMENTED\" });\r\n }\r\n}\r\n\r\nexport class ClientClosedError extends UBYSError {\r\n public constructor(message = \"This UBYS client has been closed.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"CLIENT_CLOSED\" });\r\n }\r\n}\r\n","export const UBYS_BASE_URL = \"https://ubys.omu.edu.tr\";\r\nexport const OMU_CAFETERIA_URL = \"https://sks.omu.edu.tr/gunun-yemegi/\";\r\n\r\nexport const DEFAULT_HEADERS: Record<string, string> = {\r\n \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\r\n \"accept-language\": \"tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7\",\r\n \"accept-encoding\": \"gzip, deflate, br\",\r\n connection: \"keep-alive\",\r\n \"sec-ch-ua\": '\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"',\r\n \"sec-ch-ua-mobile\": \"?0\",\r\n \"sec-ch-ua-platform\": '\"Windows\"'\r\n};\r\n\r\nexport const AJAX_HEADERS: Record<string, string> = {\r\n \"x-requested-with\": \"XMLHttpRequest\"\r\n};\r\n","import { LoginError, ParseError } from \"../errors\";\r\nimport type { UBYSSession } from \"../http/session\";\r\nimport { AJAX_HEADERS } from \"../http/constants\";\r\n\r\nconst CSRF_TOKEN_PATTERN = /name=\"__RequestVerificationToken\".*?value=\"([^\"]+)\"/;\r\n\r\nexport interface LoginResult {\r\n longUsername?: string;\r\n direct?: string;\r\n errorType?: string | null;\r\n errorMessage?: string | null;\r\n}\r\n\r\nexport function extractCsrfToken(html: string): string {\r\n const match = html.match(CSRF_TOKEN_PATTERN);\r\n\r\n if (!match?.[1]) {\r\n throw new ParseError(\"CSRF token could not be extracted from the UBYS login page.\");\r\n }\r\n\r\n return match[1];\r\n}\r\n\r\nexport async function loginWithCredentials(session: UBYSSession, username: string, password: string): Promise<LoginResult> {\r\n const homepage = await session.get(\"/\");\r\n session.assertOk(homepage);\r\n\r\n const csrfToken = extractCsrfToken(homepage.body);\r\n\r\n const response = await session.post(\"Account/Login\", {\r\n form: {\r\n __RequestVerificationToken: csrfToken,\r\n username,\r\n password\r\n },\r\n headers: {\r\n ...AJAX_HEADERS,\r\n \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\r\n referer: `${session.baseUrl}/`\r\n }\r\n });\r\n\r\n let data: LoginResult;\r\n\r\n try {\r\n data = JSON.parse(response.body) as LoginResult;\r\n } catch (error) {\r\n throw new LoginError(\"UBYS returned an unexpected login response.\", { cause: error });\r\n }\r\n\r\n if (data.errorType === \"error\" || data.errorMessage) {\r\n throw new LoginError(data.errorMessage ?? \"Invalid username or password.\", {\r\n details: {\r\n statusCode: response.statusCode\r\n }\r\n });\r\n }\r\n\r\n return data;\r\n}\r\n","import got, { type ExtendOptions, type OptionsOfTextResponseBody, type Response } from \"got\";\r\nimport { CookieJar } from \"tough-cookie\";\r\n\r\nimport { ClientClosedError, HttpError, NetworkError, SessionExpiredError } from \"../errors\";\r\nimport { DEFAULT_HEADERS, UBYS_BASE_URL } from \"./constants\";\r\n\r\nexport interface UBYSSessionOptions {\r\n baseUrl?: string;\r\n timeoutMs?: number;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport class UBYSSession {\r\n public readonly baseUrl: string;\r\n public readonly cookieJar: CookieJar;\r\n\r\n private readonly client: ReturnType<typeof got.extend>;\r\n private closed = false;\r\n\r\n public constructor(options: UBYSSessionOptions = {}) {\r\n this.baseUrl = options.baseUrl ?? UBYS_BASE_URL;\r\n this.cookieJar = new CookieJar();\r\n\r\n const config: ExtendOptions = {\r\n prefixUrl: this.baseUrl,\r\n cookieJar: this.cookieJar,\r\n headers: {\r\n ...DEFAULT_HEADERS,\r\n ...options.headers\r\n },\r\n followRedirect: true,\r\n resolveBodyOnly: false,\r\n throwHttpErrors: false,\r\n timeout: {\r\n request: options.timeoutMs ?? 30_000\r\n },\r\n retry: {\r\n limit: 1,\r\n methods: [\"GET\", \"POST\"]\r\n },\r\n https: {\r\n rejectUnauthorized: true\r\n }\r\n };\r\n\r\n this.client = got.extend(config);\r\n }\r\n\r\n public async get(pathOrUrl: string, options: OptionsOfTextResponseBody = {}): Promise<Response<string>> {\r\n return this.request(pathOrUrl, { ...options, method: \"GET\" });\r\n }\r\n\r\n public async post(pathOrUrl: string, options: OptionsOfTextResponseBody = {}): Promise<Response<string>> {\r\n return this.request(pathOrUrl, { ...options, method: \"POST\" });\r\n }\r\n\r\n public get isClosed(): boolean {\r\n return this.closed;\r\n }\r\n\r\n public async close(): Promise<void> {\r\n if (this.closed) {\r\n return;\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n this.cookieJar.removeAllCookies((error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n\r\n this.closed = true;\r\n }\r\n\r\n public assertOk(response: Response<string>, allowedStatusCodes: number[] = [200]): void {\r\n if (!allowedStatusCodes.includes(response.statusCode)) {\r\n throw new HttpError(response.statusCode, `Unexpected HTTP status: ${response.statusCode}`, {\r\n details: {\r\n url: response.url\r\n }\r\n });\r\n }\r\n }\r\n\r\n public assertNotLoginRedirect(response: Response<string>): void {\r\n if (response.url.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n }\r\n\r\n private async request(pathOrUrl: string, options: OptionsOfTextResponseBody): Promise<Response<string>> {\r\n this.ensureOpen();\r\n\r\n try {\r\n if (/^https?:\\/\\//.test(pathOrUrl)) {\r\n return await this.client(pathOrUrl, options) as unknown as Response<string>;\r\n }\r\n\r\n const normalizedPath = pathOrUrl.replace(/^\\//, \"\");\r\n return await this.client(normalizedPath, options) as unknown as Response<string>;\r\n } catch (error) {\r\n throw new NetworkError(\"Failed to reach UBYS.\", { cause: error });\r\n }\r\n }\r\n\r\n private ensureOpen(): void {\r\n if (this.closed) {\r\n throw new ClientClosedError();\r\n }\r\n }\r\n}\r\n","import { ParseError } from \"../errors\";\r\n\r\nexport function decodeBase64Json<T>(value: string, context: string): T {\r\n try {\r\n const json = Buffer.from(value, \"base64\").toString(\"utf8\");\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n throw new ParseError(`Failed to decode ${context}.`, { cause: error });\r\n }\r\n}\r\n","import { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { StudentInfoPayload, UserProfile } from \"../models/types\";\r\nimport { decodeBase64Json } from \"../utils/base64\";\r\n\r\nconst STUDENT_INFO_PATTERN = /StudentInfo\\s*=\\s*JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)\\)/;\r\nconst SAP_ID_PATTERN = /selectAcademicProgram\\('([^']+)'\\)/;\r\n\r\nexport function extractStudentInfo(html: string): StudentInfoPayload {\r\n const match = html.match(STUDENT_INFO_PATTERN);\r\n\r\n if (!match?.[1]) {\r\n if (isLoginPage(html)) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n throw new ParseError(\"StudentInfo could not be found in dashboard HTML.\");\r\n }\r\n\r\n return decodeBase64Json<StudentInfoPayload>(match[1], \"StudentInfo payload\");\r\n}\r\n\r\nexport function extractSapId(html: string): string | undefined {\r\n const match = html.match(SAP_ID_PATTERN);\r\n return match?.[1];\r\n}\r\n\r\nexport function toUserProfile(studentNumber: string, studentInfo: StudentInfoPayload, sapId?: string, displayName?: string): UserProfile {\r\n const program = studentInfo.Programs?.[0];\r\n const person = studentInfo.Person?.Person;\r\n const fallbackName = [person?.Name, person?.Surname].filter(Boolean).join(\" \").trim();\r\n\r\n return {\r\n name: displayName ?? fallbackName,\r\n studentNumber,\r\n faculty: extractFaculty(program?.UnitName),\r\n department: program?.AcademicProgramName ?? \"\",\r\n ...(sapId ? { sapId } : {}),\r\n ...(program?.StudentId !== undefined ? { studentId: program.StudentId } : {}),\r\n ...(program?.RecordSemester !== undefined ? { semesterId: program.RecordSemester } : {}),\r\n ...(program?.RecordYear !== undefined ? { academicYear: program.RecordYear } : {}),\r\n ...(program?.GANO !== undefined ? { cumulativeGpa: program.GANO } : {})\r\n };\r\n}\r\n\r\nexport function isLoginPage(html: string): boolean {\r\n return html.includes(\"/Account/Login\") || html.toLowerCase().includes(\"login-form\");\r\n}\r\n\r\nfunction extractFaculty(unitName?: string): string {\r\n if (!unitName) {\r\n return \"\";\r\n }\r\n\r\n return unitName.split(\" - \")[0]?.trim() ?? unitName;\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nimport { SessionExpiredError } from \"../errors\";\r\nimport type { Advisor } from \"../models/types\";\r\nimport { isLoginPage } from \"./profile\";\r\n\r\nexport function parseAdvisor(html: string): Advisor | null {\r\n if (isLoginPage(html)) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n let name: string | undefined;\r\n let email: string | undefined;\r\n\r\n $(\"dt\").each((_, element) => {\r\n const label = $(element).text().trim();\r\n const value = $(element).next(\"dd\").text().trim();\r\n\r\n if (!value) {\r\n return;\r\n }\r\n\r\n if (!name && label.includes(\"Ad Soyad\")) {\r\n name = value;\r\n }\r\n\r\n if (!email && (label.includes(\"Mail\") || label.includes(\"E-Posta\"))) {\r\n email = value.replace(/^mailto:/i, \"\");\r\n }\r\n });\r\n\r\n if (!name) {\r\n return null;\r\n }\r\n\r\n return {\r\n name,\r\n ...(email ? { email } : {})\r\n };\r\n}\r\n\r\n","import { load } from \"cheerio\";\r\n\r\nimport type { CafeteriaMenu, MenuItem } from \"../models/types\";\r\n\r\nexport function parseCafeteriaMenu(html: string): CafeteriaMenu | null {\r\n const $ = load(html);\r\n const table = $(\"div.reading table.has-fixed-layout\").first();\r\n const items: MenuItem[] = [];\r\n let date = \"\";\r\n\r\n table.find(\"tbody tr\").each((_, element) => {\r\n const cells = $(element).find(\"td\");\r\n const label = cells.eq(0).text().trim();\r\n const value = cells.eq(1).text().trim();\r\n\r\n if (!label || !value) {\r\n return;\r\n }\r\n\r\n if (label.toLowerCase() === \"tarih\") {\r\n date = value;\r\n return;\r\n }\r\n\r\n items.push({\r\n name: value,\r\n category: label\r\n });\r\n });\r\n\r\n if (items.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n date: date || \"Bugun\",\r\n items\r\n };\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nexport function decodeHtmlEntities(value: string): string {\r\n return load(`<div>${value}</div>`)(\"div\").text();\r\n}\r\n","export function parseNumber(value: string): number | undefined {\n const normalized = value.trim().replace(/\\s+/g, \"\").replace(\",\", \".\");\n if (!normalized || normalized === \"-\") {\n return undefined;\n }\n\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n","import { load } from \"cheerio\";\r\n\r\nimport { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { ClassDetail, ClassDetailSurvey, Exam, Instructor, Student } from \"../models/types\";\r\nimport { decodeHtmlEntities } from \"../utils/html\";\r\nimport { parseNumber } from \"../utils/parse\";\r\n\r\nconst LETTER_GRADE_PATTERN = /\\b(AA|BA|BB|CB|CC|DC|DD|FD|FF)\\b/i;\r\n\r\nexport function parseClassDetail(html: string): ClassDetail {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n const exams = parseExamTable($);\r\n const instructor = parseInstructor($);\r\n const status = parseStatus($);\r\n const letterGradeMatch = status?.match(LETTER_GRADE_PATTERN);\r\n const letterGrade = letterGradeMatch?.[1]?.toUpperCase();\r\n const classAverage = parseClassAverage($);\r\n const survey = parseSurveyRequirement($);\r\n\r\n if (exams.length === 0 && !instructor && !status && classAverage === undefined && !survey) {\r\n throw new ParseError(\"No class detail content could be parsed from class detail page.\");\r\n }\r\n\r\n return {\r\n exams,\r\n students: [],\r\n ...(instructor ? { instructor } : {}),\r\n ...(classAverage !== undefined ? { classAverage } : {}),\r\n ...(status ? { status } : {}),\r\n ...(letterGrade ? { letterGrade } : {}),\r\n ...(survey ? { survey } : {})\r\n };\r\n}\r\n\r\nexport function parseSurveyPageStatus(html: string): Pick<ClassDetailSurvey, \"message\" | \"expired\"> | undefined {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n const alertText = textOrUndefined($(\"div.alert\").first().text());\r\n if (!alertText) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n message: alertText,\r\n expired: /suresi dolmustur|süresi dolmuştur/i.test(alertText)\r\n };\r\n}\r\n\r\nexport function parseStudentList(html: string): Student[] {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n const students: Student[] = [];\r\n\r\n $(\"table.table-hover tbody tr\").each((_, row) => {\r\n const cells = $(row).find(\"td\");\r\n if (cells.length < 3) {\r\n return;\r\n }\r\n\r\n const image = cells.eq(0).find(\"img\");\r\n const id = image.attr(\"data-user-id\")?.trim();\r\n if (!id) {\r\n return;\r\n }\r\n\r\n const imageUrl = textOrUndefined(image.attr(\"src\") ?? \"\");\r\n const name = decodeText(cells.eq(1).text());\r\n const surname = decodeText(cells.eq(2).text());\r\n\r\n if (!name || !surname) {\r\n return;\r\n }\r\n\r\n students.push({\r\n id,\r\n name,\r\n surname,\r\n ...(imageUrl ? { imageUrl } : {})\r\n });\r\n });\r\n\r\n return students;\r\n}\r\n\r\nfunction parseExamTable($: ReturnType<typeof load>): Exam[] {\r\n const tables = $(\"table\").toArray();\r\n const examTable = tables.find((table) => {\r\n const headerText = $(table).find(\"thead\").text();\r\n return headerText.includes(\"Sınav Tipi\") || headerText.includes(\"Sinav Tipi\") || headerText.includes(\"Sınav Notu\") || headerText.includes(\"Sinav Notu\");\r\n });\r\n\r\n if (!examTable) {\r\n return [];\r\n }\r\n\r\n const exams: Exam[] = [];\r\n\r\n $(examTable).find(\"tbody tr\").each((_, row) => {\r\n const cells = $(row).find(\"td\");\r\n if (cells.length < 4) {\r\n return;\r\n }\r\n\r\n const examType = decodeText(cells.eq(0).text());\r\n const name = decodeText(cells.eq(1).text()) || examType;\r\n const date = textOrUndefined(cells.eq(2).text());\r\n const score = parseNumber(cells.eq(3).text());\r\n const ranking = cells.length >= 6 ? textOrUndefined(cells.eq(5).text()) : undefined;\r\n const average = cells.length >= 7 ? parseNumber(cells.eq(6).text()) : undefined;\r\n\r\n if (!examType) {\r\n return;\r\n }\r\n\r\n exams.push({\r\n examType,\r\n name,\r\n ...(date ? { date } : {}),\r\n ...(score !== undefined ? { score } : {}),\r\n ...(average !== undefined ? { average } : {}),\r\n ...(ranking ? { ranking } : {})\r\n });\r\n });\r\n\r\n return exams;\r\n}\r\n\r\nfunction parseInstructor($: ReturnType<typeof load>): Instructor | undefined {\r\n const instructorElement = $(\"div.instructor\").first();\r\n if (instructorElement.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const name = textOrUndefined(instructorElement.find(\"div.name\").first().text()) ?? textOrUndefined(instructorElement.find(\"a\").first().text());\r\n if (!name) {\r\n return undefined;\r\n }\r\n\r\n const imageUrl = textOrUndefined(instructorElement.find(\"img\").first().attr(\"src\") ?? \"\");\r\n\r\n return {\r\n name,\r\n ...(imageUrl ? { imageUrl } : {})\r\n };\r\n}\r\n\r\nfunction parseStatus($: ReturnType<typeof load>): string | undefined {\r\n const statusElement = $(\"div.success-status\").first();\r\n if (statusElement.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const directText = normalizeWhitespace(\r\n statusElement\r\n .contents()\r\n .toArray()\r\n .filter((node) => node.type === \"text\")\r\n .map((node) => node.nodeValue)\r\n .join(\" \")\r\n );\r\n\r\n if (directText) {\r\n return directText;\r\n }\r\n\r\n const candidates = statusElement\r\n .find(\"span, strong, b, p, h1, h2, h3, h4, h5, h6\")\r\n .toArray()\r\n .map((node) => normalizeWhitespace($(node).text()))\r\n .filter(Boolean);\r\n\r\n return candidates[0];\r\n}\r\n\r\nfunction parseSurveyRequirement($: ReturnType<typeof load>): ClassDetailSurvey | undefined {\r\n const surveyLink = $(\"div.success-status a[href*='/MES/Application/Public/Participant']\").first();\r\n if (surveyLink.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const message = textOrUndefined(surveyLink.text()) ?? textOrUndefined($(\"div.success-status\").first().text()) ?? \"Survey completion is required before grades can be shown.\";\r\n const href = surveyLink.attr(\"href\")?.trim();\r\n\r\n return {\r\n required: true,\r\n message,\r\n ...(href ? { url: href } : {})\r\n };\r\n}\r\n\r\nfunction parseClassAverage($: ReturnType<typeof load>): number | undefined {\r\n const averageSources = [\r\n $(\"div.instructor div.avarage\").first(),\r\n $(\"div.instructor\").first(),\r\n $(\"body\")\r\n ];\r\n\r\n for (const source of averageSources) {\r\n if (source.length === 0) {\r\n continue;\r\n }\r\n\r\n const match = normalizeWhitespace(source.text()).match(/(?:Not\\s+)?Ortalamas[ıi]\\s*:?\\s*([\\d.,]+)/i);\r\n if (match?.[1]) {\r\n const parsed = parseNumber(match[1]);\r\n if (parsed !== undefined) {\r\n return parsed;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n\r\n\r\nfunction decodeText(value: string): string {\r\n return normalizeWhitespace(decodeHtmlEntities(value));\r\n}\r\n\r\nfunction textOrUndefined(value: string): string | undefined {\r\n const text = decodeText(value);\r\n return text && text !== \"-\" ? text : undefined;\r\n}\r\n\r\nfunction normalizeWhitespace(value: string): string {\r\n return value.replace(/\\s+/g, \" \").trim();\r\n}\r\n","import { type CheerioAPI, load } from \"cheerio\";\r\nimport type { AnyNode } from \"domhandler\";\r\n\r\nimport { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { Course, Exam, Semester } from \"../models/types\";\r\nimport { decodeHtmlEntities } from \"../utils/html\";\r\nimport { parseNumber } from \"../utils/parse\";\r\n\r\nconst CLASS_ID_PATTERN = /classId=([^&'\"\\s]+)/;\r\n\r\nexport function parseGrades(html: string): Semester[] {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n const semesters: Semester[] = [];\r\n\r\n $(\"div.panel-default\").each((_, panelElement) => {\r\n const panel = $(panelElement);\r\n const semesterName = panel.find(\"div.panel-heading\").first().text().trim();\r\n const rows = panel.find(\"tbody tr\").toArray();\r\n\r\n if (!semesterName || rows.length === 0) {\r\n return;\r\n }\r\n\r\n const courses: Course[] = [];\r\n\r\n for (let index = 0; index < rows.length; index += 1) {\r\n const row = rows[index];\r\n if (!row) {\r\n continue;\r\n }\r\n\r\n const cells = $(row).find(\"td\");\r\n\r\n if (cells.length === 0 || cells.eq(0).attr(\"rowspan\") !== \"2\") {\r\n continue;\r\n }\r\n\r\n const nextRow = rows[index + 1];\r\n const exams = nextRow ? parseExamRow($, nextRow) : [];\r\n courses.push(parseCourseRow($, row, exams));\r\n\r\n if (nextRow) {\r\n index += 1;\r\n }\r\n }\r\n\r\n if (courses.length > 0) {\r\n semesters.push({\r\n name: semesterName,\r\n courses\r\n });\r\n }\r\n });\r\n\r\n if (semesters.length === 0) {\r\n throw new ParseError(\"No semester grade panels could be parsed from grades page.\");\r\n }\r\n\r\n return semesters;\r\n}\r\n\r\nfunction parseCourseRow($: CheerioAPI, row: AnyNode, exams: Exam[]): Course {\r\n const cells = $(row).find(\"td\");\r\n const codeCell = cells.eq(0);\r\n const nameCell = cells.eq(1);\r\n const creditCell = cells.eq(2);\r\n const passingGradeCell = cells.eq(6);\r\n const letterGradeCell = cells.eq(7);\r\n const statusCell = cells.eq(8);\r\n\r\n const code = codeCell.text().trim();\r\n const linkHref = codeCell.find(\"a\").attr(\"href\");\r\n const classIdMatch = linkHref?.match(CLASS_ID_PATTERN);\r\n const classId = classIdMatch?.[1] ? decodeURIComponent(classIdMatch[1]) : undefined;\r\n const credit = parseNumber(creditCell.text());\r\n const passingGrade = parseNumber(passingGradeCell.text());\r\n const letterGrade = textOrUndefined(letterGradeCell.text());\r\n const status = textOrUndefined(statusCell.text());\r\n\r\n return {\r\n code,\r\n name: decodeText(nameCell.text()),\r\n ...(credit !== undefined ? { credit } : {}),\r\n ...(passingGrade !== undefined ? { passingGrade } : {}),\r\n ...(letterGrade ? { letterGrade } : {}),\r\n ...(status ? { status } : {}),\r\n ...(classId ? { classId } : {}),\r\n ...(exams.length > 0 ? { exams } : {})\r\n };\r\n}\r\n\r\nfunction parseExamRow($: CheerioAPI, row: AnyNode): Exam[] {\r\n const exams: Exam[] = [];\r\n\r\n $(row).find(\"td\").each((_, cell) => {\r\n const text = decodeText($(cell).text());\r\n\r\n if (!text) {\r\n return;\r\n }\r\n\r\n for (const examType of [\"Vize\", \"Final\", \"Butunleme\", \"Bütünleme\"]) {\r\n const pattern = new RegExp(`${examType}[:\\\\s]*(\\\\d+(?:[.,]\\\\d+)?)`, \"i\");\r\n const match = text.match(pattern);\r\n\r\n if (!match?.[1]) {\r\n continue;\r\n }\r\n\r\n const score = parseNumber(match[1]);\r\n if (score === undefined) {\r\n continue;\r\n }\r\n\r\n exams.push({\r\n examType,\r\n name: examType,\r\n score\r\n });\r\n break;\r\n }\r\n });\r\n\r\n return exams;\r\n}\r\n\r\n\r\n\r\nfunction decodeText(value: string): string {\r\n return decodeHtmlEntities(value).trim();\r\n}\r\n\r\nfunction textOrUndefined(value: string): string | undefined {\r\n const text = decodeText(value);\r\n return text || undefined;\r\n}\r\n","import { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type {\r\n Chat,\r\n ChatMessage,\r\n ChatMessageReceipt,\r\n ChatRecipient,\r\n ChatMessageSearchResult,\r\n ChatRecipientSearchResult,\r\n ChatSearchResult\r\n} from \"../models/types\";\r\nimport { decodeHtmlEntities } from \"../utils/html\";\r\n\r\ninterface RawChatSearchResult {\r\n PageNumber?: number;\r\n PageSize?: number;\r\n TotalNumberOfPages?: number;\r\n TotalNumberOfRecords?: number;\r\n NextPageUrl?: string | null;\r\n Items?: RawChat[];\r\n}\r\n\r\ninterface RawChat {\r\n Id?: string;\r\n Name?: string;\r\n IsGroup?: boolean;\r\n CreatedOn?: string;\r\n CreatedBy?: number;\r\n EncryptedCreatedBy?: string | null;\r\n ChatRecepientId?: string;\r\n LastMessageSendedOn?: string;\r\n LastMessageReadedOn?: string;\r\n ChatRecepients?: RawChatRecipient[];\r\n}\r\n\r\ninterface RawChatRecipient {\r\n Id?: string;\r\n ChatId?: string;\r\n UserEncryptId?: string;\r\n UserId?: number;\r\n PersonId?: number;\r\n PersonEncryptId?: string;\r\n CreatedOn?: string;\r\n CreatedBy?: number;\r\n EncryptedCreatedBy?: string | null;\r\n LastMessageId?: string;\r\n LastMessageSendedOn?: string;\r\n ChatMessages?: RawChatMessageReceipt[];\r\n RecepientName?: string;\r\n RecepientSurname?: string;\r\n}\r\n\r\ninterface RawChatMessageReceipt {\r\n Id?: string;\r\n ChatRecepientId?: string;\r\n MessageId?: string;\r\n ReadedOn?: string | null;\r\n CreatedOn?: string;\r\n CreatedBy?: number;\r\n EncryptedCreatedBy?: string | null;\r\n SenderSurname?: string;\r\n SenderName?: string;\r\n IsEveryBoydReaded?: boolean;\r\n Message?: RawChatMessage;\r\n}\r\n\r\ninterface RawChatMessage {\r\n Id?: string;\r\n ParentId?: string | null;\r\n Subject?: string;\r\n FileArchiveId?: string | null;\r\n CreatedOn?: string;\r\n CreatedBy?: number;\r\n EncryptedCreatedBy?: string | null;\r\n RecepientReadedOnList?: Record<string, string | null>;\r\n}\r\n\r\nexport function parseChatSearchResponse(responseBody: string): ChatSearchResult {\r\n const raw = parsePaginatedResponse<RawChatSearchResult>(responseBody, \"chat search\");\r\n\r\n return {\r\n pageNumber: raw.PageNumber ?? 0,\r\n pageSize: raw.PageSize ?? 0,\r\n totalNumberOfPages: raw.TotalNumberOfPages ?? 0,\r\n totalNumberOfRecords: raw.TotalNumberOfRecords ?? 0,\r\n nextPageUrl: raw.NextPageUrl ?? null,\r\n items: (raw.Items ?? []).map(mapChat)\r\n };\r\n}\r\n\r\nexport function parseChatRecipientSearchResponse(responseBody: string): ChatRecipientSearchResult {\r\n const raw = parsePaginatedResponse<RawChatSearchResult>(responseBody, \"chat recipient search\");\r\n\r\n return {\r\n pageNumber: raw.PageNumber ?? 0,\r\n pageSize: raw.PageSize ?? 0,\r\n totalNumberOfPages: raw.TotalNumberOfPages ?? 0,\r\n totalNumberOfRecords: raw.TotalNumberOfRecords ?? 0,\r\n nextPageUrl: raw.NextPageUrl ?? null,\r\n items: (raw.Items ?? []).map((item) => mapChatRecipient(item as RawChatRecipient))\r\n };\r\n}\r\n\r\nexport function parseChatMessageSearchResponse(responseBody: string): ChatMessageSearchResult {\r\n const raw = parsePaginatedResponse<RawChatSearchResult>(responseBody, \"chat message search\");\r\n\r\n return {\r\n pageNumber: raw.PageNumber ?? 0,\r\n pageSize: raw.PageSize ?? 0,\r\n totalNumberOfPages: raw.TotalNumberOfPages ?? 0,\r\n totalNumberOfRecords: raw.TotalNumberOfRecords ?? 0,\r\n nextPageUrl: raw.NextPageUrl ?? null,\r\n items: (raw.Items ?? []).map((item) => mapChatMessageReceipt(item as RawChatMessageReceipt))\r\n };\r\n}\r\n\r\nfunction parsePaginatedResponse<T>(responseBody: string, context: string): T {\r\n if (responseBody.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n try {\r\n return JSON.parse(responseBody) as T;\r\n } catch (error) {\r\n throw new ParseError(`Failed to parse ${context} response.`, { cause: error });\r\n }\r\n}\r\n\r\nfunction mapChat(raw: RawChat): Chat {\r\n return {\r\n id: raw.Id ?? \"\",\r\n name: decodeText(raw.Name),\r\n isGroup: raw.IsGroup ?? false,\r\n createdOn: raw.CreatedOn ?? \"\",\r\n createdBy: raw.CreatedBy ?? 0,\r\n ...(raw.EncryptedCreatedBy !== undefined ? { encryptedCreatedBy: raw.EncryptedCreatedBy } : {}),\r\n ...(raw.ChatRecepientId ? { chatRecepientId: raw.ChatRecepientId } : {}),\r\n ...(raw.LastMessageSendedOn ? { lastMessageSendedOn: raw.LastMessageSendedOn } : {}),\r\n ...(raw.LastMessageReadedOn ? { lastMessageReadedOn: raw.LastMessageReadedOn } : {}),\r\n recipients: (raw.ChatRecepients ?? []).map(mapChatRecipient)\r\n };\r\n}\r\n\r\nfunction mapChatRecipient(raw: RawChatRecipient): ChatRecipient {\r\n return {\r\n id: raw.Id ?? \"\",\r\n chatId: raw.ChatId ?? \"\",\r\n ...(raw.UserEncryptId ? { userEncryptId: raw.UserEncryptId } : {}),\r\n userId: raw.UserId ?? 0,\r\n personId: raw.PersonId ?? 0,\r\n ...(raw.PersonEncryptId ? { personEncryptId: raw.PersonEncryptId } : {}),\r\n createdOn: raw.CreatedOn ?? \"\",\r\n createdBy: raw.CreatedBy ?? 0,\r\n ...(raw.EncryptedCreatedBy !== undefined ? { encryptedCreatedBy: raw.EncryptedCreatedBy } : {}),\r\n ...(raw.LastMessageId ? { lastMessageId: raw.LastMessageId } : {}),\r\n ...(raw.LastMessageSendedOn ? { lastMessageSendedOn: raw.LastMessageSendedOn } : {}),\r\n ...(raw.RecepientName ? { recipientName: decodeText(raw.RecepientName) } : {}),\r\n ...(raw.RecepientSurname ? { recipientSurname: decodeText(raw.RecepientSurname) } : {}),\r\n chatMessages: (raw.ChatMessages ?? []).map(mapChatMessageReceipt)\r\n };\r\n}\r\n\r\nfunction mapChatMessageReceipt(raw: RawChatMessageReceipt): ChatMessageReceipt {\r\n return {\r\n id: raw.Id ?? \"\",\r\n chatRecepientId: raw.ChatRecepientId ?? \"\",\r\n messageId: raw.MessageId ?? \"\",\r\n ...(raw.ReadedOn !== undefined ? { readedOn: raw.ReadedOn } : {}),\r\n createdOn: raw.CreatedOn ?? \"\",\r\n createdBy: raw.CreatedBy ?? 0,\r\n ...(raw.EncryptedCreatedBy !== undefined ? { encryptedCreatedBy: raw.EncryptedCreatedBy } : {}),\r\n ...(raw.SenderName ? { senderName: decodeText(raw.SenderName) } : {}),\r\n ...(raw.SenderSurname ? { senderSurname: decodeText(raw.SenderSurname) } : {}),\r\n isEveryBodyReaded: raw.IsEveryBoydReaded ?? false,\r\n message: mapChatMessage(raw.Message)\r\n };\r\n}\r\n\r\nfunction mapChatMessage(raw: RawChatMessage | undefined): ChatMessage {\r\n return {\r\n id: raw?.Id ?? \"\",\r\n ...(raw?.ParentId !== undefined ? { parentId: raw.ParentId } : {}),\r\n subject: decodeText(raw?.Subject),\r\n ...(raw?.FileArchiveId !== undefined ? { fileArchiveId: raw.FileArchiveId } : {}),\r\n createdOn: raw?.CreatedOn ?? \"\",\r\n createdBy: raw?.CreatedBy ?? 0,\r\n ...(raw?.EncryptedCreatedBy !== undefined ? { encryptedCreatedBy: raw.EncryptedCreatedBy } : {}),\r\n recipientReadedOnList: raw?.RecepientReadedOnList ?? {}\r\n };\r\n}\r\n\r\nfunction decodeText(value: string | undefined): string {\r\n return value ? decodeHtmlEntities(value).trim() : \"\";\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nimport { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { ScheduleItem, StudentInfoPayload } from \"../models/types\";\r\nimport { decodeBase64Json } from \"../utils/base64\";\r\n\r\nconst WEEKLY_SCHEDULE_PATTERN = /_weeklySchedulle\\s*=\\s*JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)\\)/;\r\nconst GENERIC_BASE64_JSON_PATTERN = /JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)\\)/;\r\nconst YEAR_PATTERN = /wcsReportYear(?:\"|'|\\))?[^\\d]*(20\\d{2})/i;\r\nconst SEMESTER_PATTERN = /wcsReportSemester(?:\"|'|\\))?[^\\d]*(\\d{4,})/i;\r\n\r\nconst DAY_MAP: Record<number, string> = {\r\n 1: \"Pazartesi\",\r\n 2: \"Sali\",\r\n 3: \"Carsamba\",\r\n 4: \"Persembe\",\r\n 5: \"Cuma\",\r\n 6: \"Cumartesi\",\r\n 7: \"Pazar\"\r\n};\r\n\r\ninterface WeeklyScheduleRequestPayload {\r\n co: {\r\n InstructorId: null;\r\n SemesterId: string;\r\n StudentId: number;\r\n WeeklyScheduleType: number;\r\n WorkcenterId: null;\r\n Year: number;\r\n GetExamPlans: boolean;\r\n IsAnnual: boolean;\r\n };\r\n reportViewType: number;\r\n isPartial: boolean;\r\n}\r\n\r\nexport interface WeeklyScheduleConfig {\r\n semesterId: string;\r\n year: number;\r\n}\r\n\r\ninterface EventScheduleContainer {\r\n Events?: ScheduleEvent[];\r\n}\r\n\r\ninterface ScheduleEvent {\r\n DayOfWeek?: number;\r\n StartHour?: number;\r\n StartMinute?: number;\r\n FinishHour?: number;\r\n FinishMinute?: number;\r\n CourseName?: string;\r\n WorkCenterName?: string;\r\n InstructorName?: string;\r\n}\r\n\r\ninterface DayScheduleContainer {\r\n Days?: Array<{\r\n Slots?: ScheduleSlot[];\r\n slots?: ScheduleSlot[];\r\n }>;\r\n}\r\n\r\ninterface ScheduleSlot {\r\n StartTime?: string;\r\n EndTime?: string;\r\n CourseName?: string;\r\n CourseCode?: string;\r\n Classroom?: string;\r\n Instructor?: string;\r\n}\r\n\r\nexport function extractWeeklyScheduleConfig(html: string, now: Date = new Date()): WeeklyScheduleConfig {\r\n const $ = load(html);\r\n const semesterId = extractSemesterValue($, now) ?? extractInputValue($, \"#wcsReportSemester\") ?? html.match(SEMESTER_PATTERN)?.[1];\r\n const yearValue = extractSelectValue($, \"#wcsReportYear\") ?? extractInputValue($, \"#wcsReportYear\") ?? html.match(YEAR_PATTERN)?.[1];\r\n const year = yearValue ? Number(yearValue) : inferAcademicYear(now);\r\n\r\n if (!semesterId) {\r\n throw new ParseError(\"Weekly schedule semester id could not be found in dashboard HTML.\");\r\n }\r\n\r\n if (!Number.isFinite(year)) {\r\n throw new ParseError(\"Weekly schedule year could not be determined from dashboard HTML.\");\r\n }\r\n\r\n return {\r\n semesterId,\r\n year\r\n };\r\n}\r\n\r\nexport function buildWeeklyScheduleRequest(studentInfo: StudentInfoPayload, config: WeeklyScheduleConfig): WeeklyScheduleRequestPayload {\r\n const program = studentInfo.Programs?.[0];\r\n if (!program?.StudentId) {\r\n throw new ParseError(\"Student program data is incomplete for weekly schedule request.\");\r\n }\r\n\r\n return {\r\n co: {\r\n InstructorId: null,\r\n SemesterId: config.semesterId,\r\n StudentId: program.StudentId,\r\n WeeklyScheduleType: 1,\r\n WorkcenterId: null,\r\n Year: config.year,\r\n GetExamPlans: true,\r\n IsAnnual: false\r\n },\r\n reportViewType: 0,\r\n isPartial: true\r\n };\r\n}\r\n\r\nexport function parseWeeklySchedule(responseText: string): ScheduleItem[] {\r\n if (responseText.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const base64Value = responseText.match(WEEKLY_SCHEDULE_PATTERN)?.[1] ?? responseText.match(GENERIC_BASE64_JSON_PATTERN)?.[1];\r\n if (!base64Value) {\r\n throw new ParseError(\"Could not find weekly schedule data in response.\");\r\n }\r\n\r\n const data = decodeBase64Json<unknown>(base64Value, \"weekly schedule payload\");\r\n const items = parseScheduleData(data);\r\n\r\n if (items.length === 0) {\r\n throw new ParseError(\"No weekly schedule items could be parsed from response.\");\r\n }\r\n\r\n return items;\r\n}\r\n\r\nfunction parseScheduleData(data: unknown): ScheduleItem[] {\r\n if (Array.isArray(data)) {\r\n return dedupeAndSort(\r\n data.flatMap((entry) => {\r\n if (!entry || typeof entry !== \"object\") {\r\n return [];\r\n }\r\n\r\n return parseEventContainer(entry as EventScheduleContainer);\r\n })\r\n );\r\n }\r\n\r\n if (data && typeof data === \"object\" && \"Days\" in data) {\r\n return dedupeAndSort(parseDayContainer(data as DayScheduleContainer));\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction parseEventContainer(container: EventScheduleContainer): ScheduleItem[] {\r\n return (container.Events ?? [])\r\n .map((event) => {\r\n const courseName = normalizeText(event.CourseName ?? \"\");\r\n if (!courseName) {\r\n return null;\r\n }\r\n\r\n const dayIndex = event.DayOfWeek ?? 0;\r\n const courseCode = extractCourseCode(courseName);\r\n\r\n return {\r\n day: DAY_MAP[dayIndex] ?? `Gun ${dayIndex}`,\r\n startTime: formatTime(event.StartHour, event.StartMinute),\r\n endTime: formatTime(event.FinishHour, event.FinishMinute),\r\n courseName,\r\n ...(courseCode ? { courseCode } : {}),\r\n ...(normalizeText(event.WorkCenterName ?? \"\") ? { classroom: normalizeText(event.WorkCenterName ?? \"\") } : {}),\r\n ...(normalizeText(event.InstructorName ?? \"\") ? { instructor: normalizeText(event.InstructorName ?? \"\") } : {})\r\n } satisfies ScheduleItem;\r\n })\r\n .filter((item): item is ScheduleItem => item !== null);\r\n}\r\n\r\nfunction parseDayContainer(container: DayScheduleContainer): ScheduleItem[] {\r\n return (container.Days ?? []).flatMap((day, index) => {\r\n const dayName = DAY_MAP[index + 1] ?? `Gun ${index + 1}`;\r\n const slots = day.Slots ?? day.slots ?? [];\r\n\r\n return slots\r\n .map((slot) => {\r\n const courseName = normalizeText(slot.CourseName ?? \"\");\r\n if (!courseName) {\r\n return null;\r\n }\r\n\r\n return {\r\n day: dayName,\r\n startTime: normalizeText(slot.StartTime ?? \"\"),\r\n endTime: normalizeText(slot.EndTime ?? \"\"),\r\n courseName,\r\n ...(normalizeText(slot.CourseCode ?? \"\") ? { courseCode: normalizeText(slot.CourseCode ?? \"\") } : {}),\r\n ...(normalizeText(slot.Classroom ?? \"\") ? { classroom: normalizeText(slot.Classroom ?? \"\") } : {}),\r\n ...(normalizeText(slot.Instructor ?? \"\") ? { instructor: normalizeText(slot.Instructor ?? \"\") } : {})\r\n } satisfies ScheduleItem;\r\n })\r\n .filter((item): item is ScheduleItem => item !== null);\r\n });\r\n}\r\n\r\nfunction dedupeAndSort(items: ScheduleItem[]): ScheduleItem[] {\r\n const seen = new Set<string>();\r\n const uniqueItems: ScheduleItem[] = [];\r\n\r\n for (const item of items) {\r\n const key = [item.day, item.startTime, item.endTime, item.courseName].join(\"|\");\r\n if (seen.has(key)) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n uniqueItems.push(item);\r\n }\r\n\r\n return uniqueItems.sort((left, right) => {\r\n const leftDay = getDayOrder(left.day);\r\n const rightDay = getDayOrder(right.day);\r\n\r\n if (leftDay !== rightDay) {\r\n return leftDay - rightDay;\r\n }\r\n\r\n return left.startTime.localeCompare(right.startTime);\r\n });\r\n}\r\n\r\nfunction extractCourseCode(courseName: string): string | undefined {\r\n const firstPart = courseName.split(\" \")[0]?.trim();\r\n return firstPart && firstPart.length <= 10 ? firstPart : undefined;\r\n}\r\n\r\nfunction formatTime(hour?: number, minute?: number): string {\r\n const safeHour = typeof hour === \"number\" ? hour : 0;\r\n const safeMinute = typeof minute === \"number\" ? minute : 0;\r\n return `${String(safeHour).padStart(2, \"0\")}:${String(safeMinute).padStart(2, \"0\")}`;\r\n}\r\n\r\nfunction getDayOrder(day: string): number {\r\n const entry = Object.entries(DAY_MAP).find(([, label]) => label === day);\r\n return entry ? Number(entry[0]) : 99;\r\n}\r\n\r\nfunction normalizeText(value: string): string {\r\n return value.replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction extractSelectValue($: ReturnType<typeof load>, selector: string): string | undefined {\r\n const select = $(selector).first();\r\n if (select.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const selectedValue = select.find(\"option[selected]\").first().attr(\"value\")?.trim();\r\n if (selectedValue) {\r\n return selectedValue;\r\n }\r\n\r\n const firstValue = select.find(\"option\").first().attr(\"value\")?.trim();\r\n return firstValue || undefined;\r\n}\r\n\r\nfunction extractSemesterValue($: ReturnType<typeof load>, now: Date): string | undefined {\r\n const select = $(\"#wcsReportSemester\").first();\r\n if (select.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const selectedValue = select.find(\"option[selected]\").first().attr(\"value\")?.trim();\r\n if (selectedValue) {\r\n return selectedValue;\r\n }\r\n\r\n const options = select.find(\"option\").toArray().map((option) => ({\r\n value: $(option).attr(\"value\")?.trim(),\r\n label: normalizeText($(option).text()).toLowerCase()\r\n }));\r\n\r\n const inferredTerm = inferCurrentTerm(now);\r\n const matchingOption = options.find((option) => option.value && option.label.includes(inferredTerm));\r\n if (matchingOption?.value) {\r\n return matchingOption.value;\r\n }\r\n\r\n return options[0]?.value || undefined;\r\n}\r\n\r\nfunction extractInputValue($: ReturnType<typeof load>, selector: string): string | undefined {\r\n const value = $(selector).first().attr(\"value\")?.trim();\r\n return value || undefined;\r\n}\r\n\r\nfunction inferAcademicYear(now: Date): number {\r\n const year = now.getFullYear();\r\n const month = now.getMonth();\r\n return month >= 8 ? year : year - 1;\r\n}\r\n\r\nfunction inferCurrentTerm(now: Date): string {\r\n const month = now.getMonth();\r\n if (month >= 1 && month <= 6) {\r\n return \"bahar\";\r\n }\r\n\r\n if (month === 7) {\r\n return \"yaz\";\r\n }\r\n\r\n return \"guz\";\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nimport { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { Course, Semester } from \"../models/types\";\r\nimport { decodeBase64Json } from \"../utils/base64\";\r\nimport { decodeHtmlEntities } from \"../utils/html\";\r\nimport { parseNumber } from \"../utils/parse\";\r\n\r\nconst TRANSCRIPT_DATA_PATTERN = /_jsm\\s*=\\s*JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)\\)/;\r\n\r\ninterface TranscriptPayload {\r\n Transcripts?: Array<{\r\n Semesters?: TranscriptSemesterPayload[];\r\n }>;\r\n}\r\n\r\ninterface TranscriptSemesterPayload {\r\n SemesterName?: string;\r\n SemesterAverage?: number;\r\n Courses?: TranscriptCoursePayload[];\r\n}\r\n\r\ninterface TranscriptCoursePayload {\r\n CourseCode?: string;\r\n CourseName?: string;\r\n Credit?: number;\r\n Grade?: string;\r\n}\r\n\r\nexport function parseTranscript(html: string): Semester[] {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const scriptMatch = html.match(TRANSCRIPT_DATA_PATTERN);\r\n if (scriptMatch?.[1]) {\r\n const parsed = parseTranscriptScriptPayload(scriptMatch[1]);\r\n if (parsed.length > 0) {\r\n return parsed;\r\n }\r\n }\r\n\r\n const parsedFromTable = parseTranscriptTables(html);\r\n if (parsedFromTable.length > 0) {\r\n return parsedFromTable;\r\n }\r\n\r\n throw new ParseError(\"No transcript data could be parsed from transcript page.\");\r\n}\r\n\r\nfunction parseTranscriptScriptPayload(base64Value: string): Semester[] {\r\n const payload = decodeBase64Json<TranscriptPayload>(base64Value, \"transcript payload\");\r\n const transcript = payload.Transcripts?.[0];\r\n if (!transcript?.Semesters?.length) {\r\n return [];\r\n }\r\n\r\n return transcript.Semesters\r\n .map((semester) => ({\r\n name: normalizeText(semester.SemesterName ?? \"\"),\r\n ...(typeof semester.SemesterAverage === \"number\" ? { gpa: semester.SemesterAverage } : {}),\r\n courses: (semester.Courses ?? [])\r\n .map((course) => toTranscriptCourse(course))\r\n .filter((course): course is Course => course !== null)\r\n }))\r\n .filter((semester) => semester.name || semester.courses.length > 0);\r\n}\r\n\r\nfunction parseTranscriptTables(html: string): Semester[] {\r\n const $ = load(html);\r\n const tableElements = $(\"table#test, table\")\r\n .toArray()\r\n .filter((table) => $(table).find(\"caption\").length > 0);\r\n\r\n return tableElements\r\n .map((table) => {\r\n const captionText = normalizeText($(table).find(\"caption\").first().text());\r\n const rows = $(table).find(\"tbody tr\").toArray();\r\n const courses: Course[] = [];\r\n let gpa: number | undefined;\r\n\r\n for (const row of rows) {\r\n const cells = $(row).find(\"td\");\r\n if (cells.length < 2) {\r\n continue;\r\n }\r\n\r\n const rowText = normalizeText($(row).text()).toLowerCase();\r\n if (rowText.includes(\"ortalama\") || rowText.includes(\"gpa\")) {\r\n for (const cell of cells.toArray()) {\r\n const parsed = parseNumber($(cell).text());\r\n if (parsed !== undefined && parsed >= 0 && parsed <= 4) {\r\n gpa = parsed;\r\n break;\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n const code = normalizeText(cells.eq(0).text());\r\n const name = normalizeText(cells.eq(1).text());\r\n const credit = cells.length > 2 ? parseNumber(cells.eq(2).text()) : undefined;\r\n const letterGrade = cells.length > 3 ? textOrUndefined(cells.eq(3).text()) : undefined;\r\n\r\n if (!code && !name) {\r\n continue;\r\n }\r\n\r\n courses.push({\r\n code,\r\n name,\r\n ...(credit !== undefined ? { credit } : {}),\r\n ...(letterGrade ? { letterGrade } : {})\r\n });\r\n }\r\n\r\n if (!captionText && courses.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n name: captionText,\r\n ...(gpa !== undefined ? { gpa } : {}),\r\n courses\r\n };\r\n })\r\n .filter((semester): semester is Semester => semester !== null);\r\n}\r\n\r\nfunction toTranscriptCourse(course: TranscriptCoursePayload): Course | null {\r\n const code = normalizeText(course.CourseCode ?? \"\");\r\n const name = normalizeText(course.CourseName ?? \"\");\r\n const letterGrade = normalizeText(course.Grade ?? \"\");\r\n\r\n if (!code && !name) {\r\n return null;\r\n }\r\n\r\n return {\r\n code,\r\n name,\r\n ...(typeof course.Credit === \"number\" ? { credit: course.Credit } : {}),\r\n ...(letterGrade ? { letterGrade } : {})\r\n };\r\n}\r\n\r\n\r\n\r\nfunction textOrUndefined(value: string): string | undefined {\r\n const text = normalizeText(value);\r\n return text || undefined;\r\n}\r\n\r\nfunction normalizeText(value: string): string {\r\n return decodeHtmlEntities(value).replace(/\\s+/g, \" \").trim();\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nimport { loginWithCredentials, type LoginResult } from \"./auth/login\";\r\nimport { ClientClosedError, HttpError, NetworkError, NotImplementedUBYSError, ParseError, SessionExpiredError } from \"./errors\";\r\nimport { AJAX_HEADERS, OMU_CAFETERIA_URL } from \"./http/constants\";\r\nimport { UBYSSession, type UBYSSessionOptions } from \"./http/session\";\r\nimport type { Advisor, CafeteriaMenu, ChatMessageSearchOptions, ChatMessageSearchResult, ChatRecipientSearchOptions, ChatRecipientSearchResult, ChatSearchOptions, ChatSearchResult, ClassDetail, ScheduleItem, Semester, StudentInfoPayload, UserProfile } from \"./models/types\";\r\nimport { parseAdvisor } from \"./parsers/advisor\";\r\nimport { parseCafeteriaMenu } from \"./parsers/cafeteria\";\r\nimport { parseClassDetail, parseStudentList, parseSurveyPageStatus } from \"./parsers/class-details\";\r\nimport { parseGrades } from \"./parsers/grades\";\r\nimport { parseChatMessageSearchResponse, parseChatRecipientSearchResponse, parseChatSearchResponse } from \"./parsers/messages\";\r\nimport { extractSapId, extractStudentInfo, toUserProfile } from \"./parsers/profile\";\r\nimport { buildWeeklyScheduleRequest, extractWeeklyScheduleConfig, parseWeeklySchedule } from \"./parsers/schedule\";\r\nimport { parseTranscript } from \"./parsers/transcript\";\r\n\r\nexport interface UBYSClientOptions extends UBYSSessionOptions {\r\n username?: string;\r\n password?: string;\r\n}\r\n\r\ninterface ClientState {\r\n authenticated: boolean;\r\n studentNumber?: string;\r\n login?: LoginResult;\r\n dashboardHtml?: string;\r\n studentInfo?: StudentInfoPayload;\r\n sapId?: string;\r\n profile?: UserProfile;\r\n}\r\n\r\nexport class UBYSClient {\r\n private readonly session: UBYSSession;\r\n private readonly credentials: { username: string | undefined; password: string | undefined };\r\n private closed = false;\r\n private state: ClientState = {\r\n authenticated: false\r\n };\r\n\r\n public constructor(options: UBYSClientOptions = {}) {\r\n this.session = new UBYSSession(options);\r\n this.credentials = {\r\n username: options.username,\r\n password: options.password\r\n };\r\n }\r\n\r\n public get isLoggedIn(): boolean {\r\n return this.state.authenticated;\r\n }\r\n\r\n public get isClosed(): boolean {\r\n return this.closed;\r\n }\r\n\r\n public async login(username = this.credentials.username, password = this.credentials.password): Promise<void> {\r\n if (!username || !password) {\r\n throw new SessionExpiredError(\"Username and password are required for login.\", {\r\n code: \"MISSING_CREDENTIALS\"\r\n });\r\n }\r\n\r\n const login = await loginWithCredentials(this.session, username, password);\r\n const dashboardHtml = await this.fetchDashboardHtml();\r\n const studentInfo = extractStudentInfo(dashboardHtml);\r\n const sapId = extractSapId(dashboardHtml);\r\n const profile = toUserProfile(username, studentInfo, sapId, login.longUsername?.trim());\r\n\r\n this.credentials.username = username;\r\n this.credentials.password = password;\r\n this.state = {\r\n authenticated: true,\r\n studentNumber: username,\r\n login,\r\n dashboardHtml,\r\n studentInfo,\r\n profile,\r\n ...(sapId ? { sapId } : {})\r\n };\r\n }\r\n\r\n public async getProfile(): Promise<UserProfile> {\r\n this.ensureAuthenticated();\r\n\r\n if (this.state.profile) {\r\n return this.state.profile;\r\n }\r\n\r\n const dashboardHtml = await this.fetchDashboardHtml();\r\n const studentInfo = extractStudentInfo(dashboardHtml);\r\n const sapId = extractSapId(dashboardHtml);\r\n const profile = toUserProfile(this.state.studentNumber ?? \"\", studentInfo, sapId, this.state.login?.longUsername?.trim());\r\n\r\n this.state.dashboardHtml = dashboardHtml;\r\n this.state.studentInfo = studentInfo;\r\n if (sapId) {\r\n this.state.sapId = sapId;\r\n } else {\r\n delete this.state.sapId;\r\n }\r\n this.state.profile = profile;\r\n\r\n return profile;\r\n }\r\n\r\n public async getAdvisor(): Promise<Advisor | null> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.state.sapId) {\r\n await this.getProfile();\r\n }\r\n\r\n if (!this.state.sapId) {\r\n return null;\r\n }\r\n\r\n const response = await this.session.get(\"AIS/Student/Home/AdvisorInfo\", {\r\n searchParams: {\r\n sapId: this.state.sapId\r\n },\r\n headers: {\r\n ...AJAX_HEADERS\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseAdvisor(response.body);\r\n }\r\n\r\n public async getCafeteriaMenu(): Promise<CafeteriaMenu | null> {\r\n const response = await this.session.get(OMU_CAFETERIA_URL, {\r\n https: {\r\n rejectUnauthorized: false\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n return parseCafeteriaMenu(response.body);\r\n }\r\n\r\n public async getMessages(options: ChatSearchOptions = {}): Promise<ChatSearchResult> {\r\n this.ensureAuthenticated();\r\n\r\n const response = await this.session.post(\"Conversation/SearchChat\", {\r\n json: {\r\n Keyword: options.keyword ?? \"\",\r\n PageNumber: options.pageNumber ?? 0,\r\n PageSize: options.pageSize ?? 10\r\n },\r\n headers: {\r\n ...AJAX_HEADERS,\r\n origin: this.session.baseUrl,\r\n referer: `${this.session.baseUrl}/Conversation/Index`\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseChatSearchResponse(response.body);\r\n }\r\n\r\n public async getChatRecipients(options: ChatRecipientSearchOptions): Promise<ChatRecipientSearchResult> {\r\n this.ensureAuthenticated();\r\n\r\n const response = await this.session.post(\"Conversation/SearchChatRecepient\", {\r\n json: {\r\n ChatIds: options.chatIds,\r\n PageNumber: options.pageNumber ?? 0,\r\n PageSize: options.pageSize ?? 20\r\n },\r\n headers: {\r\n ...AJAX_HEADERS,\r\n origin: this.session.baseUrl,\r\n referer: `${this.session.baseUrl}/Conversation/Index`\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseChatRecipientSearchResponse(response.body);\r\n }\r\n\r\n public async getChatMessages(options: ChatMessageSearchOptions): Promise<ChatMessageSearchResult> {\r\n this.ensureAuthenticated();\r\n\r\n const response = await this.session.post(\"Conversation/SearchChatMessage\", {\r\n json: {\r\n ChatRecepientIds: options.chatRecepientIds,\r\n Keyword: options.keyword ?? \"\",\r\n PageNumber: options.pageNumber ?? 0,\r\n PageSize: options.pageSize ?? 50\r\n },\r\n headers: {\r\n ...AJAX_HEADERS,\r\n origin: this.session.baseUrl,\r\n referer: `${this.session.baseUrl}/Conversation/Index`\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseChatMessageSearchResponse(response.body);\r\n }\r\n\r\n public async getGrades(): Promise<Semester[]> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.state.sapId) {\r\n await this.getProfile();\r\n }\r\n\r\n const response = await this.session.get(\"AIS/Student/Class/Index\", {\r\n searchParams: {\r\n history: \"true\",\r\n ...(this.state.sapId ? { sapid: this.state.sapId } : {})\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseGrades(response.body);\r\n }\r\n\r\n public async getClassDetails(classId: string): Promise<ClassDetail> {\r\n this.ensureAuthenticated();\r\n\r\n const detailResponse = await this.session.get(\"AIS/Student/Class/ClassDetail\", {\r\n searchParams: {\r\n classId\r\n }\r\n });\r\n\r\n this.session.assertOk(detailResponse);\r\n this.session.assertNotLoginRedirect(detailResponse);\r\n\r\n const detail = parseClassDetail(detailResponse.body);\r\n\r\n if (detail.survey?.required && detail.survey.url) {\r\n try {\r\n const surveyResponse = await this.session.get(detail.survey.url.replace(/^\\//, \"\"));\r\n this.session.assertNotLoginRedirect(surveyResponse);\r\n\r\n if (surveyResponse.statusCode === 200) {\r\n const surveyStatus = parseSurveyPageStatus(surveyResponse.body);\r\n if (surveyStatus) {\r\n detail.survey = {\r\n ...detail.survey,\r\n ...surveyStatus\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n if (!isBestEffortClassDetailError(error)) {\r\n throw error;\r\n }\r\n\r\n // Keep the original survey requirement details when survey page lookup fails.\r\n }\r\n }\r\n\r\n try {\r\n const studentResponse = await this.session.get(\"AIS/Student/Class/CourseStudents\", {\r\n searchParams: {\r\n classId\r\n }\r\n });\r\n\r\n this.session.assertNotLoginRedirect(studentResponse);\r\n\r\n if (studentResponse.statusCode === 200) {\r\n const students = parseStudentList(studentResponse.body);\r\n if (students.length > 0) {\r\n return {\r\n ...detail,\r\n students\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n if (!isBestEffortClassDetailError(error)) {\r\n throw error;\r\n }\r\n\r\n return detail;\r\n }\r\n\r\n return detail;\r\n }\r\n\r\n public async getTranscript(): Promise<Semester[]> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.state.dashboardHtml) {\r\n this.state.dashboardHtml = await this.fetchDashboardHtml();\r\n }\r\n\r\n if (!this.state.sapId) {\r\n const sapId = extractSapId(this.state.dashboardHtml);\r\n if (sapId) {\r\n this.state.sapId = sapId;\r\n }\r\n }\r\n\r\n const transcriptPath = this.resolveTranscriptPath(this.state.dashboardHtml, this.state.sapId);\r\n const response = await this.session.get(transcriptPath);\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseTranscript(response.body);\r\n }\r\n\r\n public async getWeeklySchedule(): Promise<ScheduleItem[]> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.state.studentInfo) {\r\n await this.getProfile();\r\n }\r\n\r\n if (!this.state.studentInfo) {\r\n throw new NotImplementedUBYSError(\"Student info is not available for `getWeeklySchedule()`. Try logging in again.\");\r\n }\r\n\r\n if (!this.state.dashboardHtml) {\r\n this.state.dashboardHtml = await this.fetchDashboardHtml();\r\n }\r\n\r\n const scheduleConfig = extractWeeklyScheduleConfig(this.state.dashboardHtml);\r\n const payload = buildWeeklyScheduleRequest(this.state.studentInfo, scheduleConfig);\r\n const response = await this.session.post(\"AIS/Student/Home/GetWeeklySchedule\", {\r\n json: payload,\r\n headers: {\r\n ...AJAX_HEADERS\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseWeeklySchedule(response.body);\r\n }\r\n\r\n public clearSession(): void {\r\n this.ensureOpen();\r\n\r\n this.state = {\r\n authenticated: false\r\n };\r\n }\r\n\r\n public async close(): Promise<void> {\r\n if (this.closed) {\r\n return;\r\n }\r\n\r\n this.state = {\r\n authenticated: false\r\n };\r\n this.closed = true;\r\n await this.session.close();\r\n }\r\n\r\n private ensureAuthenticated(): void {\r\n this.ensureOpen();\r\n\r\n if (!this.state.authenticated) {\r\n throw new SessionExpiredError(\"Not logged in. Call `login()` first.\");\r\n }\r\n }\r\n\r\n private ensureOpen(): void {\r\n if (this.closed || this.session.isClosed) {\r\n throw new ClientClosedError();\r\n }\r\n }\r\n\r\n private async fetchDashboardHtml(): Promise<string> {\r\n const response = await this.session.get(\"AIS/Student/Home/Index\");\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n return response.body;\r\n }\r\n\r\n private resolveTranscriptPath(dashboardHtml: string | undefined, sapId?: string): string {\r\n if (dashboardHtml) {\r\n const $ = load(dashboardHtml);\r\n const href = $(\"a[href*='/AIS/Student/Transcript/Index']\").first().attr(\"href\");\r\n if (href) {\r\n return href.replace(/&amp;/g, \"&\").replace(/^\\//, \"\");\r\n }\r\n }\r\n\r\n return sapId ? `AIS/Student/Transcript/Index?sapId=${encodeURIComponent(sapId)}` : \"AIS/Student/Transcript/Index\";\r\n }\r\n}\r\n\r\nfunction isBestEffortClassDetailError(error: unknown): boolean {\r\n return error instanceof HttpError || error instanceof NetworkError || error instanceof ParseError;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http/constants.ts","../src/auth/login.ts","../src/http/session.ts","../src/utils/base64.ts","../src/parsers/profile.ts","../src/parsers/advisor.ts","../src/parsers/cafeteria.ts","../src/utils/html.ts","../src/utils/parse.ts","../src/parsers/class-details.ts","../src/parsers/grades.ts","../src/parsers/messages.ts","../src/parsers/schedule.ts","../src/parsers/transcript.ts","../src/parsers/survey.ts","../src/client.ts"],"names":["load","textOrUndefined","decodeText","normalizeText","_"],"mappings":"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","file":"index.js","sourcesContent":["export interface UBYSErrorOptions {\r\n cause?: unknown;\r\n code?: string;\r\n details?: Record<string, unknown>;\r\n}\r\n\r\nexport class UBYSError extends Error {\r\n public readonly code: string;\r\n public readonly details: Record<string, unknown> | undefined;\r\n\r\n public constructor(message: string, options: UBYSErrorOptions = {}) {\r\n super(message, { cause: options.cause });\r\n this.name = new.target.name;\r\n this.code = options.code ?? \"UBYS_ERROR\";\r\n this.details = options.details;\r\n }\r\n}\r\n\r\nexport class AuthenticationError extends UBYSError {\r\n public constructor(message = \"Authentication failed.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"AUTHENTICATION_ERROR\" });\r\n }\r\n}\r\n\r\nexport class LoginError extends AuthenticationError {\r\n public constructor(message = \"Login failed.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"LOGIN_ERROR\" });\r\n }\r\n}\r\n\r\nexport class SessionExpiredError extends AuthenticationError {\r\n public constructor(message = \"UBYS session expired.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"SESSION_EXPIRED\" });\r\n }\r\n}\r\n\r\nexport class NetworkError extends UBYSError {\r\n public constructor(message = \"Network request failed.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"NETWORK_ERROR\" });\r\n }\r\n}\r\n\r\nexport class HttpError extends UBYSError {\r\n public readonly statusCode: number;\r\n\r\n public constructor(statusCode: number, message = `Unexpected HTTP status: ${statusCode}`, options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"HTTP_ERROR\" });\r\n this.statusCode = statusCode;\r\n }\r\n}\r\n\r\nexport class ParseError extends UBYSError {\r\n public constructor(message = \"Failed to parse UBYS response.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"PARSE_ERROR\" });\r\n }\r\n}\r\n\r\nexport class NotImplementedUBYSError extends UBYSError {\r\n public constructor(message = \"This UBYS feature is planned but not implemented yet.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"NOT_IMPLEMENTED\" });\r\n }\r\n}\r\n\r\nexport class ClientClosedError extends UBYSError {\r\n public constructor(message = \"This UBYS client has been closed.\", options: UBYSErrorOptions = {}) {\r\n super(message, { ...options, code: options.code ?? \"CLIENT_CLOSED\" });\r\n }\r\n}\r\n","export const UBYS_BASE_URL = \"https://ubys.omu.edu.tr\";\r\nexport const OMU_CAFETERIA_URL = \"https://sks.omu.edu.tr/gunun-yemegi/\";\r\n\r\nexport const DEFAULT_HEADERS: Record<string, string> = {\r\n \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\r\n \"accept-language\": \"tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7\",\r\n \"accept-encoding\": \"gzip, deflate, br\",\r\n connection: \"keep-alive\",\r\n \"sec-ch-ua\": '\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"',\r\n \"sec-ch-ua-mobile\": \"?0\",\r\n \"sec-ch-ua-platform\": '\"Windows\"'\r\n};\r\n\r\nexport const AJAX_HEADERS: Record<string, string> = {\r\n \"x-requested-with\": \"XMLHttpRequest\"\r\n};\r\n","import { LoginError, ParseError } from \"../errors\";\r\nimport type { UBYSSession } from \"../http/session\";\r\nimport { AJAX_HEADERS } from \"../http/constants\";\r\n\r\nconst CSRF_TOKEN_PATTERN = /name=\"__RequestVerificationToken\".*?value=\"([^\"]+)\"/;\r\n\r\nexport interface LoginResult {\r\n longUsername?: string;\r\n direct?: string;\r\n errorType?: string | null;\r\n errorMessage?: string | null;\r\n}\r\n\r\nexport function extractCsrfToken(html: string): string {\r\n const match = html.match(CSRF_TOKEN_PATTERN);\r\n\r\n if (!match?.[1]) {\r\n throw new ParseError(\"CSRF token could not be extracted from the UBYS login page.\");\r\n }\r\n\r\n return match[1];\r\n}\r\n\r\nexport async function loginWithCredentials(session: UBYSSession, username: string, password: string): Promise<LoginResult> {\r\n const homepage = await session.get(\"/\");\r\n session.assertOk(homepage);\r\n\r\n const csrfToken = extractCsrfToken(homepage.body);\r\n\r\n const response = await session.post(\"Account/Login\", {\r\n form: {\r\n __RequestVerificationToken: csrfToken,\r\n username,\r\n password\r\n },\r\n headers: {\r\n ...AJAX_HEADERS,\r\n \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\r\n referer: `${session.baseUrl}/`\r\n }\r\n });\r\n\r\n let data: LoginResult;\r\n\r\n try {\r\n data = JSON.parse(response.body) as LoginResult;\r\n } catch (error) {\r\n throw new LoginError(\"UBYS returned an unexpected login response.\", { cause: error });\r\n }\r\n\r\n if (data.errorType === \"error\" || data.errorMessage) {\r\n throw new LoginError(data.errorMessage ?? \"Invalid username or password.\", {\r\n details: {\r\n statusCode: response.statusCode\r\n }\r\n });\r\n }\r\n\r\n return data;\r\n}\r\n","import got, { type ExtendOptions, type OptionsOfTextResponseBody, type Response } from \"got\";\r\nimport { CookieJar } from \"tough-cookie\";\r\n\r\nimport { ClientClosedError, HttpError, NetworkError, SessionExpiredError } from \"../errors\";\r\nimport { DEFAULT_HEADERS, UBYS_BASE_URL } from \"./constants\";\r\n\r\nexport interface UBYSSessionOptions {\r\n baseUrl?: string;\r\n timeoutMs?: number;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport class UBYSSession {\r\n public readonly baseUrl: string;\r\n public readonly cookieJar: CookieJar;\r\n\r\n private readonly client: ReturnType<typeof got.extend>;\r\n private closed = false;\r\n\r\n public constructor(options: UBYSSessionOptions = {}) {\r\n this.baseUrl = options.baseUrl ?? UBYS_BASE_URL;\r\n this.cookieJar = new CookieJar();\r\n\r\n const config: ExtendOptions = {\r\n prefixUrl: this.baseUrl,\r\n cookieJar: this.cookieJar,\r\n headers: {\r\n ...DEFAULT_HEADERS,\r\n ...options.headers\r\n },\r\n followRedirect: true,\r\n resolveBodyOnly: false,\r\n throwHttpErrors: false,\r\n timeout: {\r\n request: options.timeoutMs ?? 30_000\r\n },\r\n retry: {\r\n limit: 1,\r\n methods: [\"GET\", \"POST\"]\r\n },\r\n https: {\r\n rejectUnauthorized: true\r\n }\r\n };\r\n\r\n this.client = got.extend(config);\r\n }\r\n\r\n public async get(pathOrUrl: string, options: OptionsOfTextResponseBody = {}): Promise<Response<string>> {\r\n return this.request(pathOrUrl, { ...options, method: \"GET\" });\r\n }\r\n\r\n public async post(pathOrUrl: string, options: OptionsOfTextResponseBody = {}): Promise<Response<string>> {\r\n return this.request(pathOrUrl, { ...options, method: \"POST\" });\r\n }\r\n\r\n public get isClosed(): boolean {\r\n return this.closed;\r\n }\r\n\r\n public async close(): Promise<void> {\r\n if (this.closed) {\r\n return;\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n this.cookieJar.removeAllCookies((error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n\r\n this.closed = true;\r\n }\r\n\r\n public assertOk(response: Response<string>, allowedStatusCodes: number[] = [200]): void {\r\n if (!allowedStatusCodes.includes(response.statusCode)) {\r\n throw new HttpError(response.statusCode, `Unexpected HTTP status: ${response.statusCode}`, {\r\n details: {\r\n url: response.url\r\n }\r\n });\r\n }\r\n }\r\n\r\n public assertNotLoginRedirect(response: Response<string>): void {\r\n if (response.url.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n }\r\n\r\n private async request(pathOrUrl: string, options: OptionsOfTextResponseBody): Promise<Response<string>> {\r\n this.ensureOpen();\r\n\r\n try {\r\n if (/^https?:\\/\\//.test(pathOrUrl)) {\r\n return await this.client(pathOrUrl, options) as unknown as Response<string>;\r\n }\r\n\r\n const normalizedPath = pathOrUrl.replace(/^\\//, \"\");\r\n return await this.client(normalizedPath, options) as unknown as Response<string>;\r\n } catch (error) {\r\n throw new NetworkError(\"Failed to reach UBYS.\", { cause: error });\r\n }\r\n }\r\n\r\n private ensureOpen(): void {\r\n if (this.closed) {\r\n throw new ClientClosedError();\r\n }\r\n }\r\n}\r\n","import { ParseError } from \"../errors\";\r\n\r\nexport function decodeBase64Json<T>(value: string, context: string): T {\r\n try {\r\n const json = Buffer.from(value, \"base64\").toString(\"utf8\");\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n throw new ParseError(`Failed to decode ${context}.`, { cause: error });\r\n }\r\n}\r\n","import { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { StudentInfoPayload, UserProfile } from \"../models/types\";\r\nimport { decodeBase64Json } from \"../utils/base64\";\r\n\r\nconst STUDENT_INFO_PATTERN = /StudentInfo\\s*=\\s*JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)\\)/;\r\nconst SAP_ID_PATTERN = /selectAcademicProgram\\('([^']+)'\\)/;\r\n\r\nexport function extractStudentInfo(html: string): StudentInfoPayload {\r\n const match = html.match(STUDENT_INFO_PATTERN);\r\n\r\n if (!match?.[1]) {\r\n if (isLoginPage(html)) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n throw new ParseError(\"StudentInfo could not be found in dashboard HTML.\");\r\n }\r\n\r\n return decodeBase64Json<StudentInfoPayload>(match[1], \"StudentInfo payload\");\r\n}\r\n\r\nexport function extractSapId(html: string): string | undefined {\r\n const match = html.match(SAP_ID_PATTERN);\r\n return match?.[1];\r\n}\r\n\r\nexport function toUserProfile(studentNumber: string, studentInfo: StudentInfoPayload, sapId?: string, displayName?: string): UserProfile {\r\n const program = studentInfo.Programs?.[0];\r\n const person = studentInfo.Person?.Person;\r\n const fallbackName = [person?.Name, person?.Surname].filter(Boolean).join(\" \").trim();\r\n\r\n return {\r\n name: displayName ?? fallbackName,\r\n studentNumber,\r\n faculty: extractFaculty(program?.UnitName),\r\n department: program?.AcademicProgramName ?? \"\",\r\n ...(sapId ? { sapId } : {}),\r\n ...(program?.StudentId !== undefined ? { studentId: program.StudentId } : {}),\r\n ...(program?.RecordSemester !== undefined ? { semesterId: program.RecordSemester } : {}),\r\n ...(program?.RecordYear !== undefined ? { academicYear: program.RecordYear } : {}),\r\n ...(program?.GANO !== undefined ? { cumulativeGpa: program.GANO } : {})\r\n };\r\n}\r\n\r\nexport function isLoginPage(html: string): boolean {\r\n return html.includes(\"/Account/Login\") || html.toLowerCase().includes(\"login-form\");\r\n}\r\n\r\nfunction extractFaculty(unitName?: string): string {\r\n if (!unitName) {\r\n return \"\";\r\n }\r\n\r\n return unitName.split(\" - \")[0]?.trim() ?? unitName;\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nimport { SessionExpiredError } from \"../errors\";\r\nimport type { Advisor } from \"../models/types\";\r\nimport { isLoginPage } from \"./profile\";\r\n\r\nexport function parseAdvisor(html: string): Advisor | null {\r\n if (isLoginPage(html)) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n let name: string | undefined;\r\n let email: string | undefined;\r\n\r\n $(\"dt\").each((_, element) => {\r\n const label = $(element).text().trim();\r\n const value = $(element).next(\"dd\").text().trim();\r\n\r\n if (!value) {\r\n return;\r\n }\r\n\r\n if (!name && label.includes(\"Ad Soyad\")) {\r\n name = value;\r\n }\r\n\r\n if (!email && (label.includes(\"Mail\") || label.includes(\"E-Posta\"))) {\r\n email = value.replace(/^mailto:/i, \"\");\r\n }\r\n });\r\n\r\n if (!name) {\r\n return null;\r\n }\r\n\r\n return {\r\n name,\r\n ...(email ? { email } : {})\r\n };\r\n}\r\n\r\n","import { load } from \"cheerio\";\r\n\r\nimport type { CafeteriaMenu, MenuItem } from \"../models/types\";\r\n\r\nexport function parseCafeteriaMenu(html: string): CafeteriaMenu | null {\r\n const $ = load(html);\r\n const table = $(\"div.reading table.has-fixed-layout\").first();\r\n const items: MenuItem[] = [];\r\n let date = \"\";\r\n\r\n table.find(\"tbody tr\").each((_, element) => {\r\n const cells = $(element).find(\"td\");\r\n const label = cells.eq(0).text().trim();\r\n const value = cells.eq(1).text().trim();\r\n\r\n if (!label || !value) {\r\n return;\r\n }\r\n\r\n if (label.toLowerCase() === \"tarih\") {\r\n date = value;\r\n return;\r\n }\r\n\r\n items.push({\r\n name: value,\r\n category: label\r\n });\r\n });\r\n\r\n if (items.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n date: date || \"Bugun\",\r\n items\r\n };\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nexport function decodeHtmlEntities(value: string): string {\r\n return load(`<div>${value}</div>`)(\"div\").text();\r\n}\r\n","export function parseNumber(value: string): number | undefined {\n const normalized = value.trim().replace(/\\s+/g, \"\").replace(\",\", \".\");\n if (!normalized || normalized === \"-\") {\n return undefined;\n }\n\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n","import { load } from \"cheerio\";\r\n\r\nimport { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { ClassDetail, ClassDetailSurvey, Exam, Instructor, Student } from \"../models/types\";\r\nimport { decodeHtmlEntities } from \"../utils/html\";\r\nimport { parseNumber } from \"../utils/parse\";\r\n\r\nconst LETTER_GRADE_PATTERN = /\\b(AA|BA|BB|CB|CC|DC|DD|FD|FF)\\b/i;\r\n\r\nexport function parseClassDetail(html: string): ClassDetail {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n const exams = parseExamTable($);\r\n const instructor = parseInstructor($);\r\n const status = parseStatus($);\r\n const letterGradeMatch = status?.match(LETTER_GRADE_PATTERN);\r\n const letterGrade = letterGradeMatch?.[1]?.toUpperCase();\r\n const classAverage = parseClassAverage($);\r\n const survey = parseSurveyRequirement($);\r\n\r\n if (exams.length === 0 && !instructor && !status && classAverage === undefined && !survey) {\r\n throw new ParseError(\"No class detail content could be parsed from class detail page.\");\r\n }\r\n\r\n return {\r\n exams,\r\n students: [],\r\n ...(instructor ? { instructor } : {}),\r\n ...(classAverage !== undefined ? { classAverage } : {}),\r\n ...(status ? { status } : {}),\r\n ...(letterGrade ? { letterGrade } : {}),\r\n ...(survey ? { survey } : {})\r\n };\r\n}\r\n\r\nexport function parseSurveyPageStatus(html: string): Pick<ClassDetailSurvey, \"message\" | \"expired\"> | undefined {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n const alertText = textOrUndefined($(\"div.alert\").first().text());\r\n if (!alertText) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n message: alertText,\r\n expired: /suresi dolmustur|süresi dolmuştur/i.test(alertText)\r\n };\r\n}\r\n\r\nexport function parseStudentList(html: string): Student[] {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n const students: Student[] = [];\r\n\r\n $(\"table.table-hover tbody tr\").each((_, row) => {\r\n const cells = $(row).find(\"td\");\r\n if (cells.length < 3) {\r\n return;\r\n }\r\n\r\n const image = cells.eq(0).find(\"img\");\r\n const id = image.attr(\"data-user-id\")?.trim();\r\n if (!id) {\r\n return;\r\n }\r\n\r\n const imageUrl = textOrUndefined(image.attr(\"src\") ?? \"\");\r\n const name = decodeText(cells.eq(1).text());\r\n const surname = decodeText(cells.eq(2).text());\r\n\r\n if (!name || !surname) {\r\n return;\r\n }\r\n\r\n students.push({\r\n id,\r\n name,\r\n surname,\r\n ...(imageUrl ? { imageUrl } : {})\r\n });\r\n });\r\n\r\n return students;\r\n}\r\n\r\nfunction parseExamTable($: ReturnType<typeof load>): Exam[] {\r\n const tables = $(\"table\").toArray();\r\n const examTable = tables.find((table) => {\r\n const headerText = $(table).find(\"thead\").text();\r\n return headerText.includes(\"Sınav Tipi\") || headerText.includes(\"Sinav Tipi\") || headerText.includes(\"Sınav Notu\") || headerText.includes(\"Sinav Notu\");\r\n });\r\n\r\n if (!examTable) {\r\n return [];\r\n }\r\n\r\n const exams: Exam[] = [];\r\n\r\n $(examTable).find(\"tbody tr\").each((_, row) => {\r\n const cells = $(row).find(\"td\");\r\n if (cells.length < 4) {\r\n return;\r\n }\r\n\r\n const examType = decodeText(cells.eq(0).text());\r\n const name = decodeText(cells.eq(1).text()) || examType;\r\n const date = textOrUndefined(cells.eq(2).text());\r\n const score = parseNumber(cells.eq(3).text());\r\n const ranking = cells.length >= 6 ? textOrUndefined(cells.eq(5).text()) : undefined;\r\n const average = cells.length >= 7 ? parseNumber(cells.eq(6).text()) : undefined;\r\n\r\n if (!examType) {\r\n return;\r\n }\r\n\r\n exams.push({\r\n examType,\r\n name,\r\n ...(date ? { date } : {}),\r\n ...(score !== undefined ? { score } : {}),\r\n ...(average !== undefined ? { average } : {}),\r\n ...(ranking ? { ranking } : {})\r\n });\r\n });\r\n\r\n return exams;\r\n}\r\n\r\nfunction parseInstructor($: ReturnType<typeof load>): Instructor | undefined {\r\n const instructorElement = $(\"div.instructor\").first();\r\n if (instructorElement.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const name = textOrUndefined(instructorElement.find(\"div.name\").first().text()) ?? textOrUndefined(instructorElement.find(\"a\").first().text());\r\n if (!name) {\r\n return undefined;\r\n }\r\n\r\n const imageUrl = textOrUndefined(instructorElement.find(\"img\").first().attr(\"src\") ?? \"\");\r\n\r\n return {\r\n name,\r\n ...(imageUrl ? { imageUrl } : {})\r\n };\r\n}\r\n\r\nfunction parseStatus($: ReturnType<typeof load>): string | undefined {\r\n const statusElement = $(\"div.success-status\").first();\r\n if (statusElement.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const directText = normalizeWhitespace(\r\n statusElement\r\n .contents()\r\n .toArray()\r\n .filter((node) => node.type === \"text\")\r\n .map((node) => node.nodeValue)\r\n .join(\" \")\r\n );\r\n\r\n if (directText) {\r\n return directText;\r\n }\r\n\r\n const candidates = statusElement\r\n .find(\"span, strong, b, p, h1, h2, h3, h4, h5, h6\")\r\n .toArray()\r\n .map((node) => normalizeWhitespace($(node).text()))\r\n .filter(Boolean);\r\n\r\n return candidates[0];\r\n}\r\n\r\nfunction parseSurveyRequirement($: ReturnType<typeof load>): ClassDetailSurvey | undefined {\r\n const surveyLink = $(\"div.success-status a[href*='/MES/Application/Public/Participant']\").first();\r\n if (surveyLink.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const message = textOrUndefined(surveyLink.text()) ?? textOrUndefined($(\"div.success-status\").first().text()) ?? \"Survey completion is required before grades can be shown.\";\r\n const href = surveyLink.attr(\"href\")?.trim();\r\n\r\n return {\r\n required: true,\r\n message,\r\n ...(href ? { url: href } : {})\r\n };\r\n}\r\n\r\nfunction parseClassAverage($: ReturnType<typeof load>): number | undefined {\r\n const averageSources = [\r\n $(\"div.instructor div.avarage\").first(),\r\n $(\"div.instructor\").first(),\r\n $(\"body\")\r\n ];\r\n\r\n for (const source of averageSources) {\r\n if (source.length === 0) {\r\n continue;\r\n }\r\n\r\n const match = normalizeWhitespace(source.text()).match(/(?:Not\\s+)?Ortalamas[ıi]\\s*:?\\s*([\\d.,]+)/i);\r\n if (match?.[1]) {\r\n const parsed = parseNumber(match[1]);\r\n if (parsed !== undefined) {\r\n return parsed;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n\r\n\r\nfunction decodeText(value: string): string {\r\n return normalizeWhitespace(decodeHtmlEntities(value));\r\n}\r\n\r\nfunction textOrUndefined(value: string): string | undefined {\r\n const text = decodeText(value);\r\n return text && text !== \"-\" ? text : undefined;\r\n}\r\n\r\nfunction normalizeWhitespace(value: string): string {\r\n return value.replace(/\\s+/g, \" \").trim();\r\n}\r\n","import { type CheerioAPI, load } from \"cheerio\";\r\nimport type { AnyNode } from \"domhandler\";\r\n\r\nimport { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { Course, Exam, Semester } from \"../models/types\";\r\nimport { decodeHtmlEntities } from \"../utils/html\";\r\nimport { parseNumber } from \"../utils/parse\";\r\n\r\nconst CLASS_ID_PATTERN = /classId=([^&'\"\\s]+)/;\r\n\r\nexport function parseGrades(html: string): Semester[] {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const $ = load(html);\r\n const semesters: Semester[] = [];\r\n\r\n $(\"div.panel-default\").each((_, panelElement) => {\r\n const panel = $(panelElement);\r\n const semesterName = panel.find(\"div.panel-heading\").first().text().trim();\r\n const rows = panel.find(\"tbody tr\").toArray();\r\n\r\n if (!semesterName || rows.length === 0) {\r\n return;\r\n }\r\n\r\n const courses: Course[] = [];\r\n\r\n for (let index = 0; index < rows.length; index += 1) {\r\n const row = rows[index];\r\n if (!row) {\r\n continue;\r\n }\r\n\r\n const cells = $(row).find(\"td\");\r\n\r\n if (cells.length === 0 || cells.eq(0).attr(\"rowspan\") !== \"2\") {\r\n continue;\r\n }\r\n\r\n const nextRow = rows[index + 1];\r\n const exams = nextRow ? parseExamRow($, nextRow) : [];\r\n courses.push(parseCourseRow($, row, exams));\r\n\r\n if (nextRow) {\r\n index += 1;\r\n }\r\n }\r\n\r\n if (courses.length > 0) {\r\n semesters.push({\r\n name: semesterName,\r\n courses\r\n });\r\n }\r\n });\r\n\r\n if (semesters.length === 0) {\r\n throw new ParseError(\"No semester grade panels could be parsed from grades page.\");\r\n }\r\n\r\n return semesters;\r\n}\r\n\r\nfunction parseCourseRow($: CheerioAPI, row: AnyNode, exams: Exam[]): Course {\r\n const cells = $(row).find(\"td\");\r\n const codeCell = cells.eq(0);\r\n const nameCell = cells.eq(1);\r\n const creditCell = cells.eq(2);\r\n const passingGradeCell = cells.eq(6);\r\n const letterGradeCell = cells.eq(7);\r\n const statusCell = cells.eq(8);\r\n\r\n const code = codeCell.text().trim();\r\n const linkHref = codeCell.find(\"a\").attr(\"href\");\r\n const classIdMatch = linkHref?.match(CLASS_ID_PATTERN);\r\n const classId = classIdMatch?.[1] ? decodeURIComponent(classIdMatch[1]) : undefined;\r\n const credit = parseNumber(creditCell.text());\r\n const passingGrade = parseNumber(passingGradeCell.text());\r\n const letterGrade = textOrUndefined(letterGradeCell.text());\r\n const status = textOrUndefined(statusCell.text());\r\n\r\n return {\r\n code,\r\n name: decodeText(nameCell.text()),\r\n ...(credit !== undefined ? { credit } : {}),\r\n ...(passingGrade !== undefined ? { passingGrade } : {}),\r\n ...(letterGrade ? { letterGrade } : {}),\r\n ...(status ? { status } : {}),\r\n ...(classId ? { classId } : {}),\r\n ...(exams.length > 0 ? { exams } : {})\r\n };\r\n}\r\n\r\nfunction parseExamRow($: CheerioAPI, row: AnyNode): Exam[] {\r\n const exams: Exam[] = [];\r\n\r\n $(row).find(\"td\").each((_, cell) => {\r\n const text = decodeText($(cell).text());\r\n\r\n if (!text) {\r\n return;\r\n }\r\n\r\n for (const examType of [\"Vize\", \"Final\", \"Butunleme\", \"Bütünleme\"]) {\r\n const pattern = new RegExp(`${examType}[:\\\\s]*(\\\\d+(?:[.,]\\\\d+)?)`, \"i\");\r\n const match = text.match(pattern);\r\n\r\n if (!match?.[1]) {\r\n continue;\r\n }\r\n\r\n const score = parseNumber(match[1]);\r\n if (score === undefined) {\r\n continue;\r\n }\r\n\r\n exams.push({\r\n examType,\r\n name: examType,\r\n score\r\n });\r\n break;\r\n }\r\n });\r\n\r\n return exams;\r\n}\r\n\r\n\r\n\r\nfunction decodeText(value: string): string {\r\n return decodeHtmlEntities(value).trim();\r\n}\r\n\r\nfunction textOrUndefined(value: string): string | undefined {\r\n const text = decodeText(value);\r\n return text || undefined;\r\n}\r\n","import { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type {\r\n Chat,\r\n ChatMessage,\r\n ChatMessageReceipt,\r\n ChatRecipient,\r\n ChatMessageSearchResult,\r\n ChatRecipientSearchResult,\r\n ChatSearchResult\r\n} from \"../models/types\";\r\nimport { decodeHtmlEntities } from \"../utils/html\";\r\n\r\ninterface RawChatSearchResult {\r\n PageNumber?: number;\r\n PageSize?: number;\r\n TotalNumberOfPages?: number;\r\n TotalNumberOfRecords?: number;\r\n NextPageUrl?: string | null;\r\n Items?: RawChat[];\r\n}\r\n\r\ninterface RawChat {\r\n Id?: string;\r\n Name?: string;\r\n IsGroup?: boolean;\r\n CreatedOn?: string;\r\n CreatedBy?: number;\r\n EncryptedCreatedBy?: string | null;\r\n ChatRecepientId?: string;\r\n LastMessageSendedOn?: string;\r\n LastMessageReadedOn?: string;\r\n ChatRecepients?: RawChatRecipient[];\r\n}\r\n\r\ninterface RawChatRecipient {\r\n Id?: string;\r\n ChatId?: string;\r\n UserEncryptId?: string;\r\n UserId?: number;\r\n PersonId?: number;\r\n PersonEncryptId?: string;\r\n CreatedOn?: string;\r\n CreatedBy?: number;\r\n EncryptedCreatedBy?: string | null;\r\n LastMessageId?: string;\r\n LastMessageSendedOn?: string;\r\n ChatMessages?: RawChatMessageReceipt[];\r\n RecepientName?: string;\r\n RecepientSurname?: string;\r\n}\r\n\r\ninterface RawChatMessageReceipt {\r\n Id?: string;\r\n ChatRecepientId?: string;\r\n MessageId?: string;\r\n ReadedOn?: string | null;\r\n CreatedOn?: string;\r\n CreatedBy?: number;\r\n EncryptedCreatedBy?: string | null;\r\n SenderSurname?: string;\r\n SenderName?: string;\r\n IsEveryBoydReaded?: boolean;\r\n Message?: RawChatMessage;\r\n}\r\n\r\ninterface RawChatMessage {\r\n Id?: string;\r\n ParentId?: string | null;\r\n Subject?: string;\r\n FileArchiveId?: string | null;\r\n CreatedOn?: string;\r\n CreatedBy?: number;\r\n EncryptedCreatedBy?: string | null;\r\n RecepientReadedOnList?: Record<string, string | null>;\r\n}\r\n\r\nexport function parseChatSearchResponse(responseBody: string): ChatSearchResult {\r\n const raw = parsePaginatedResponse<RawChatSearchResult>(responseBody, \"chat search\");\r\n\r\n return {\r\n pageNumber: raw.PageNumber ?? 0,\r\n pageSize: raw.PageSize ?? 0,\r\n totalNumberOfPages: raw.TotalNumberOfPages ?? 0,\r\n totalNumberOfRecords: raw.TotalNumberOfRecords ?? 0,\r\n nextPageUrl: raw.NextPageUrl ?? null,\r\n items: (raw.Items ?? []).map(mapChat)\r\n };\r\n}\r\n\r\nexport function parseChatRecipientSearchResponse(responseBody: string): ChatRecipientSearchResult {\r\n const raw = parsePaginatedResponse<RawChatSearchResult>(responseBody, \"chat recipient search\");\r\n\r\n return {\r\n pageNumber: raw.PageNumber ?? 0,\r\n pageSize: raw.PageSize ?? 0,\r\n totalNumberOfPages: raw.TotalNumberOfPages ?? 0,\r\n totalNumberOfRecords: raw.TotalNumberOfRecords ?? 0,\r\n nextPageUrl: raw.NextPageUrl ?? null,\r\n items: (raw.Items ?? []).map((item) => mapChatRecipient(item as RawChatRecipient))\r\n };\r\n}\r\n\r\nexport function parseChatMessageSearchResponse(responseBody: string): ChatMessageSearchResult {\r\n const raw = parsePaginatedResponse<RawChatSearchResult>(responseBody, \"chat message search\");\r\n\r\n return {\r\n pageNumber: raw.PageNumber ?? 0,\r\n pageSize: raw.PageSize ?? 0,\r\n totalNumberOfPages: raw.TotalNumberOfPages ?? 0,\r\n totalNumberOfRecords: raw.TotalNumberOfRecords ?? 0,\r\n nextPageUrl: raw.NextPageUrl ?? null,\r\n items: (raw.Items ?? []).map((item) => mapChatMessageReceipt(item as RawChatMessageReceipt))\r\n };\r\n}\r\n\r\nfunction parsePaginatedResponse<T>(responseBody: string, context: string): T {\r\n if (responseBody.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n try {\r\n return JSON.parse(responseBody) as T;\r\n } catch (error) {\r\n throw new ParseError(`Failed to parse ${context} response.`, { cause: error });\r\n }\r\n}\r\n\r\nfunction mapChat(raw: RawChat): Chat {\r\n return {\r\n id: raw.Id ?? \"\",\r\n name: decodeText(raw.Name),\r\n isGroup: raw.IsGroup ?? false,\r\n createdOn: raw.CreatedOn ?? \"\",\r\n createdBy: raw.CreatedBy ?? 0,\r\n ...(raw.EncryptedCreatedBy !== undefined ? { encryptedCreatedBy: raw.EncryptedCreatedBy } : {}),\r\n ...(raw.ChatRecepientId ? { chatRecepientId: raw.ChatRecepientId } : {}),\r\n ...(raw.LastMessageSendedOn ? { lastMessageSendedOn: raw.LastMessageSendedOn } : {}),\r\n ...(raw.LastMessageReadedOn ? { lastMessageReadedOn: raw.LastMessageReadedOn } : {}),\r\n recipients: (raw.ChatRecepients ?? []).map(mapChatRecipient)\r\n };\r\n}\r\n\r\nfunction mapChatRecipient(raw: RawChatRecipient): ChatRecipient {\r\n return {\r\n id: raw.Id ?? \"\",\r\n chatId: raw.ChatId ?? \"\",\r\n ...(raw.UserEncryptId ? { userEncryptId: raw.UserEncryptId } : {}),\r\n userId: raw.UserId ?? 0,\r\n personId: raw.PersonId ?? 0,\r\n ...(raw.PersonEncryptId ? { personEncryptId: raw.PersonEncryptId } : {}),\r\n createdOn: raw.CreatedOn ?? \"\",\r\n createdBy: raw.CreatedBy ?? 0,\r\n ...(raw.EncryptedCreatedBy !== undefined ? { encryptedCreatedBy: raw.EncryptedCreatedBy } : {}),\r\n ...(raw.LastMessageId ? { lastMessageId: raw.LastMessageId } : {}),\r\n ...(raw.LastMessageSendedOn ? { lastMessageSendedOn: raw.LastMessageSendedOn } : {}),\r\n ...(raw.RecepientName ? { recipientName: decodeText(raw.RecepientName) } : {}),\r\n ...(raw.RecepientSurname ? { recipientSurname: decodeText(raw.RecepientSurname) } : {}),\r\n chatMessages: (raw.ChatMessages ?? []).map(mapChatMessageReceipt)\r\n };\r\n}\r\n\r\nfunction mapChatMessageReceipt(raw: RawChatMessageReceipt): ChatMessageReceipt {\r\n return {\r\n id: raw.Id ?? \"\",\r\n chatRecepientId: raw.ChatRecepientId ?? \"\",\r\n messageId: raw.MessageId ?? \"\",\r\n ...(raw.ReadedOn !== undefined ? { readedOn: raw.ReadedOn } : {}),\r\n createdOn: raw.CreatedOn ?? \"\",\r\n createdBy: raw.CreatedBy ?? 0,\r\n ...(raw.EncryptedCreatedBy !== undefined ? { encryptedCreatedBy: raw.EncryptedCreatedBy } : {}),\r\n ...(raw.SenderName ? { senderName: decodeText(raw.SenderName) } : {}),\r\n ...(raw.SenderSurname ? { senderSurname: decodeText(raw.SenderSurname) } : {}),\r\n isEveryBodyReaded: raw.IsEveryBoydReaded ?? false,\r\n message: mapChatMessage(raw.Message)\r\n };\r\n}\r\n\r\nfunction mapChatMessage(raw: RawChatMessage | undefined): ChatMessage {\r\n return {\r\n id: raw?.Id ?? \"\",\r\n ...(raw?.ParentId !== undefined ? { parentId: raw.ParentId } : {}),\r\n subject: decodeText(raw?.Subject),\r\n ...(raw?.FileArchiveId !== undefined ? { fileArchiveId: raw.FileArchiveId } : {}),\r\n createdOn: raw?.CreatedOn ?? \"\",\r\n createdBy: raw?.CreatedBy ?? 0,\r\n ...(raw?.EncryptedCreatedBy !== undefined ? { encryptedCreatedBy: raw.EncryptedCreatedBy } : {}),\r\n recipientReadedOnList: raw?.RecepientReadedOnList ?? {}\r\n };\r\n}\r\n\r\nfunction decodeText(value: string | undefined): string {\r\n return value ? decodeHtmlEntities(value).trim() : \"\";\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nimport { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { ScheduleItem, StudentInfoPayload } from \"../models/types\";\r\nimport { decodeBase64Json } from \"../utils/base64\";\r\n\r\nconst WEEKLY_SCHEDULE_PATTERN = /_weeklySchedulle\\s*=\\s*JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)\\)/;\r\nconst GENERIC_BASE64_JSON_PATTERN = /JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)\\)/;\r\nconst YEAR_PATTERN = /wcsReportYear(?:\"|'|\\))?[^\\d]*(20\\d{2})/i;\r\nconst SEMESTER_PATTERN = /wcsReportSemester(?:\"|'|\\))?[^\\d]*(\\d{4,})/i;\r\n\r\nconst DAY_MAP: Record<number, string> = {\r\n 1: \"Pazartesi\",\r\n 2: \"Sali\",\r\n 3: \"Carsamba\",\r\n 4: \"Persembe\",\r\n 5: \"Cuma\",\r\n 6: \"Cumartesi\",\r\n 7: \"Pazar\"\r\n};\r\n\r\ninterface WeeklyScheduleRequestPayload {\r\n co: {\r\n InstructorId: null;\r\n SemesterId: string;\r\n StudentId: number;\r\n WeeklyScheduleType: number;\r\n WorkcenterId: null;\r\n Year: number;\r\n GetExamPlans: boolean;\r\n IsAnnual: boolean;\r\n };\r\n reportViewType: number;\r\n isPartial: boolean;\r\n}\r\n\r\nexport interface WeeklyScheduleConfig {\r\n semesterId: string;\r\n year: number;\r\n}\r\n\r\ninterface EventScheduleContainer {\r\n Events?: ScheduleEvent[];\r\n}\r\n\r\ninterface ScheduleEvent {\r\n DayOfWeek?: number;\r\n StartHour?: number;\r\n StartMinute?: number;\r\n FinishHour?: number;\r\n FinishMinute?: number;\r\n CourseName?: string;\r\n WorkCenterName?: string;\r\n InstructorName?: string;\r\n}\r\n\r\ninterface DayScheduleContainer {\r\n Days?: Array<{\r\n Slots?: ScheduleSlot[];\r\n slots?: ScheduleSlot[];\r\n }>;\r\n}\r\n\r\ninterface ScheduleSlot {\r\n StartTime?: string;\r\n EndTime?: string;\r\n CourseName?: string;\r\n CourseCode?: string;\r\n Classroom?: string;\r\n Instructor?: string;\r\n}\r\n\r\nexport function extractWeeklyScheduleConfig(html: string, now: Date = new Date()): WeeklyScheduleConfig {\r\n const $ = load(html);\r\n const semesterId = extractSemesterValue($, now) ?? extractInputValue($, \"#wcsReportSemester\") ?? html.match(SEMESTER_PATTERN)?.[1];\r\n const yearValue = extractSelectValue($, \"#wcsReportYear\") ?? extractInputValue($, \"#wcsReportYear\") ?? html.match(YEAR_PATTERN)?.[1];\r\n const year = yearValue ? Number(yearValue) : inferAcademicYear(now);\r\n\r\n if (!semesterId) {\r\n throw new ParseError(\"Weekly schedule semester id could not be found in dashboard HTML.\");\r\n }\r\n\r\n if (!Number.isFinite(year)) {\r\n throw new ParseError(\"Weekly schedule year could not be determined from dashboard HTML.\");\r\n }\r\n\r\n return {\r\n semesterId,\r\n year\r\n };\r\n}\r\n\r\nexport function buildWeeklyScheduleRequest(studentInfo: StudentInfoPayload, config: WeeklyScheduleConfig): WeeklyScheduleRequestPayload {\r\n const program = studentInfo.Programs?.[0];\r\n if (!program?.StudentId) {\r\n throw new ParseError(\"Student program data is incomplete for weekly schedule request.\");\r\n }\r\n\r\n return {\r\n co: {\r\n InstructorId: null,\r\n SemesterId: config.semesterId,\r\n StudentId: program.StudentId,\r\n WeeklyScheduleType: 1,\r\n WorkcenterId: null,\r\n Year: config.year,\r\n GetExamPlans: true,\r\n IsAnnual: false\r\n },\r\n reportViewType: 0,\r\n isPartial: true\r\n };\r\n}\r\n\r\nexport function parseWeeklySchedule(responseText: string): ScheduleItem[] {\r\n if (responseText.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const base64Value = responseText.match(WEEKLY_SCHEDULE_PATTERN)?.[1] ?? responseText.match(GENERIC_BASE64_JSON_PATTERN)?.[1];\r\n if (!base64Value) {\r\n throw new ParseError(\"Could not find weekly schedule data in response.\");\r\n }\r\n\r\n const data = decodeBase64Json<unknown>(base64Value, \"weekly schedule payload\");\r\n const items = parseScheduleData(data);\r\n\r\n if (items.length === 0) {\r\n throw new ParseError(\"No weekly schedule items could be parsed from response.\");\r\n }\r\n\r\n return items;\r\n}\r\n\r\nfunction parseScheduleData(data: unknown): ScheduleItem[] {\r\n if (Array.isArray(data)) {\r\n return dedupeAndSort(\r\n data.flatMap((entry) => {\r\n if (!entry || typeof entry !== \"object\") {\r\n return [];\r\n }\r\n\r\n return parseEventContainer(entry as EventScheduleContainer);\r\n })\r\n );\r\n }\r\n\r\n if (data && typeof data === \"object\" && \"Days\" in data) {\r\n return dedupeAndSort(parseDayContainer(data as DayScheduleContainer));\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction parseEventContainer(container: EventScheduleContainer): ScheduleItem[] {\r\n return (container.Events ?? [])\r\n .map((event) => {\r\n const courseName = normalizeText(event.CourseName ?? \"\");\r\n if (!courseName) {\r\n return null;\r\n }\r\n\r\n const dayIndex = event.DayOfWeek ?? 0;\r\n const courseCode = extractCourseCode(courseName);\r\n\r\n return {\r\n day: DAY_MAP[dayIndex] ?? `Gun ${dayIndex}`,\r\n startTime: formatTime(event.StartHour, event.StartMinute),\r\n endTime: formatTime(event.FinishHour, event.FinishMinute),\r\n courseName,\r\n ...(courseCode ? { courseCode } : {}),\r\n ...(normalizeText(event.WorkCenterName ?? \"\") ? { classroom: normalizeText(event.WorkCenterName ?? \"\") } : {}),\r\n ...(normalizeText(event.InstructorName ?? \"\") ? { instructor: normalizeText(event.InstructorName ?? \"\") } : {})\r\n } satisfies ScheduleItem;\r\n })\r\n .filter((item): item is ScheduleItem => item !== null);\r\n}\r\n\r\nfunction parseDayContainer(container: DayScheduleContainer): ScheduleItem[] {\r\n return (container.Days ?? []).flatMap((day, index) => {\r\n const dayName = DAY_MAP[index + 1] ?? `Gun ${index + 1}`;\r\n const slots = day.Slots ?? day.slots ?? [];\r\n\r\n return slots\r\n .map((slot) => {\r\n const courseName = normalizeText(slot.CourseName ?? \"\");\r\n if (!courseName) {\r\n return null;\r\n }\r\n\r\n return {\r\n day: dayName,\r\n startTime: normalizeText(slot.StartTime ?? \"\"),\r\n endTime: normalizeText(slot.EndTime ?? \"\"),\r\n courseName,\r\n ...(normalizeText(slot.CourseCode ?? \"\") ? { courseCode: normalizeText(slot.CourseCode ?? \"\") } : {}),\r\n ...(normalizeText(slot.Classroom ?? \"\") ? { classroom: normalizeText(slot.Classroom ?? \"\") } : {}),\r\n ...(normalizeText(slot.Instructor ?? \"\") ? { instructor: normalizeText(slot.Instructor ?? \"\") } : {})\r\n } satisfies ScheduleItem;\r\n })\r\n .filter((item): item is ScheduleItem => item !== null);\r\n });\r\n}\r\n\r\nfunction dedupeAndSort(items: ScheduleItem[]): ScheduleItem[] {\r\n const seen = new Set<string>();\r\n const uniqueItems: ScheduleItem[] = [];\r\n\r\n for (const item of items) {\r\n const key = [item.day, item.startTime, item.endTime, item.courseName].join(\"|\");\r\n if (seen.has(key)) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n uniqueItems.push(item);\r\n }\r\n\r\n return uniqueItems.sort((left, right) => {\r\n const leftDay = getDayOrder(left.day);\r\n const rightDay = getDayOrder(right.day);\r\n\r\n if (leftDay !== rightDay) {\r\n return leftDay - rightDay;\r\n }\r\n\r\n return left.startTime.localeCompare(right.startTime);\r\n });\r\n}\r\n\r\nfunction extractCourseCode(courseName: string): string | undefined {\r\n const firstPart = courseName.split(\" \")[0]?.trim();\r\n return firstPart && firstPart.length <= 10 ? firstPart : undefined;\r\n}\r\n\r\nfunction formatTime(hour?: number, minute?: number): string {\r\n const safeHour = typeof hour === \"number\" ? hour : 0;\r\n const safeMinute = typeof minute === \"number\" ? minute : 0;\r\n return `${String(safeHour).padStart(2, \"0\")}:${String(safeMinute).padStart(2, \"0\")}`;\r\n}\r\n\r\nfunction getDayOrder(day: string): number {\r\n const entry = Object.entries(DAY_MAP).find(([, label]) => label === day);\r\n return entry ? Number(entry[0]) : 99;\r\n}\r\n\r\nfunction normalizeText(value: string): string {\r\n return value.replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction extractSelectValue($: ReturnType<typeof load>, selector: string): string | undefined {\r\n const select = $(selector).first();\r\n if (select.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const selectedValue = select.find(\"option[selected]\").first().attr(\"value\")?.trim();\r\n if (selectedValue) {\r\n return selectedValue;\r\n }\r\n\r\n const firstValue = select.find(\"option\").first().attr(\"value\")?.trim();\r\n return firstValue || undefined;\r\n}\r\n\r\nfunction extractSemesterValue($: ReturnType<typeof load>, now: Date): string | undefined {\r\n const select = $(\"#wcsReportSemester\").first();\r\n if (select.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const selectedValue = select.find(\"option[selected]\").first().attr(\"value\")?.trim();\r\n if (selectedValue) {\r\n return selectedValue;\r\n }\r\n\r\n const options = select.find(\"option\").toArray().map((option) => ({\r\n value: $(option).attr(\"value\")?.trim(),\r\n label: normalizeText($(option).text()).toLowerCase()\r\n }));\r\n\r\n const inferredTerm = inferCurrentTerm(now);\r\n const matchingOption = options.find((option) => option.value && option.label.includes(inferredTerm));\r\n if (matchingOption?.value) {\r\n return matchingOption.value;\r\n }\r\n\r\n return options[0]?.value || undefined;\r\n}\r\n\r\nfunction extractInputValue($: ReturnType<typeof load>, selector: string): string | undefined {\r\n const value = $(selector).first().attr(\"value\")?.trim();\r\n return value || undefined;\r\n}\r\n\r\nfunction inferAcademicYear(now: Date): number {\r\n const year = now.getFullYear();\r\n const month = now.getMonth();\r\n return month >= 8 ? year : year - 1;\r\n}\r\n\r\nfunction inferCurrentTerm(now: Date): string {\r\n const month = now.getMonth();\r\n if (month >= 1 && month <= 6) {\r\n return \"bahar\";\r\n }\r\n\r\n if (month === 7) {\r\n return \"yaz\";\r\n }\r\n\r\n return \"guz\";\r\n}\r\n","import { load } from \"cheerio\";\r\n\r\nimport { ParseError, SessionExpiredError } from \"../errors\";\r\nimport type { Course, Semester } from \"../models/types\";\r\nimport { decodeBase64Json } from \"../utils/base64\";\r\nimport { decodeHtmlEntities } from \"../utils/html\";\r\nimport { parseNumber } from \"../utils/parse\";\r\n\r\nconst TRANSCRIPT_DATA_PATTERN = /_jsm\\s*=\\s*JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)\\)/;\r\n\r\ninterface TranscriptPayload {\r\n Transcripts?: Array<{\r\n Semesters?: TranscriptSemesterPayload[];\r\n }>;\r\n}\r\n\r\ninterface TranscriptSemesterPayload {\r\n SemesterName?: string;\r\n SemesterAverage?: number;\r\n Courses?: TranscriptCoursePayload[];\r\n}\r\n\r\ninterface TranscriptCoursePayload {\r\n CourseCode?: string;\r\n CourseName?: string;\r\n Credit?: number;\r\n Grade?: string;\r\n}\r\n\r\nexport function parseTranscript(html: string): Semester[] {\r\n if (html.includes(\"/Account/Login\")) {\r\n throw new SessionExpiredError();\r\n }\r\n\r\n const scriptMatch = html.match(TRANSCRIPT_DATA_PATTERN);\r\n if (scriptMatch?.[1]) {\r\n const parsed = parseTranscriptScriptPayload(scriptMatch[1]);\r\n if (parsed.length > 0) {\r\n return parsed;\r\n }\r\n }\r\n\r\n const parsedFromTable = parseTranscriptTables(html);\r\n if (parsedFromTable.length > 0) {\r\n return parsedFromTable;\r\n }\r\n\r\n throw new ParseError(\"No transcript data could be parsed from transcript page.\");\r\n}\r\n\r\nfunction parseTranscriptScriptPayload(base64Value: string): Semester[] {\r\n const payload = decodeBase64Json<TranscriptPayload>(base64Value, \"transcript payload\");\r\n const transcript = payload.Transcripts?.[0];\r\n if (!transcript?.Semesters?.length) {\r\n return [];\r\n }\r\n\r\n return transcript.Semesters\r\n .map((semester) => ({\r\n name: normalizeText(semester.SemesterName ?? \"\"),\r\n ...(typeof semester.SemesterAverage === \"number\" ? { gpa: semester.SemesterAverage } : {}),\r\n courses: (semester.Courses ?? [])\r\n .map((course) => toTranscriptCourse(course))\r\n .filter((course): course is Course => course !== null)\r\n }))\r\n .filter((semester) => semester.name || semester.courses.length > 0);\r\n}\r\n\r\nfunction parseTranscriptTables(html: string): Semester[] {\r\n const $ = load(html);\r\n const tableElements = $(\"table#test, table\")\r\n .toArray()\r\n .filter((table) => $(table).find(\"caption\").length > 0);\r\n\r\n return tableElements\r\n .map((table) => {\r\n const captionText = normalizeText($(table).find(\"caption\").first().text());\r\n const rows = $(table).find(\"tbody tr\").toArray();\r\n const courses: Course[] = [];\r\n let gpa: number | undefined;\r\n\r\n for (const row of rows) {\r\n const cells = $(row).find(\"td\");\r\n if (cells.length < 2) {\r\n continue;\r\n }\r\n\r\n const rowText = normalizeText($(row).text()).toLowerCase();\r\n if (rowText.includes(\"ortalama\") || rowText.includes(\"gpa\")) {\r\n for (const cell of cells.toArray()) {\r\n const parsed = parseNumber($(cell).text());\r\n if (parsed !== undefined && parsed >= 0 && parsed <= 4) {\r\n gpa = parsed;\r\n break;\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n const code = normalizeText(cells.eq(0).text());\r\n const name = normalizeText(cells.eq(1).text());\r\n const credit = cells.length > 2 ? parseNumber(cells.eq(2).text()) : undefined;\r\n const letterGrade = cells.length > 3 ? textOrUndefined(cells.eq(3).text()) : undefined;\r\n\r\n if (!code && !name) {\r\n continue;\r\n }\r\n\r\n courses.push({\r\n code,\r\n name,\r\n ...(credit !== undefined ? { credit } : {}),\r\n ...(letterGrade ? { letterGrade } : {})\r\n });\r\n }\r\n\r\n if (!captionText && courses.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n name: captionText,\r\n ...(gpa !== undefined ? { gpa } : {}),\r\n courses\r\n };\r\n })\r\n .filter((semester): semester is Semester => semester !== null);\r\n}\r\n\r\nfunction toTranscriptCourse(course: TranscriptCoursePayload): Course | null {\r\n const code = normalizeText(course.CourseCode ?? \"\");\r\n const name = normalizeText(course.CourseName ?? \"\");\r\n const letterGrade = normalizeText(course.Grade ?? \"\");\r\n\r\n if (!code && !name) {\r\n return null;\r\n }\r\n\r\n return {\r\n code,\r\n name,\r\n ...(typeof course.Credit === \"number\" ? { credit: course.Credit } : {}),\r\n ...(letterGrade ? { letterGrade } : {})\r\n };\r\n}\r\n\r\n\r\n\r\nfunction textOrUndefined(value: string): string | undefined {\r\n const text = normalizeText(value);\r\n return text || undefined;\r\n}\r\n\r\nfunction normalizeText(value: string): string {\r\n return decodeHtmlEntities(value).replace(/\\s+/g, \" \").trim();\r\n}\r\n","import { load } from \"cheerio\";\n\nimport { ParseError, SessionExpiredError } from \"../errors\";\nimport type { SurveyData, SurveyPage, SurveyQuestion } from \"../models/types\";\n\n/**\n * Parse a MES survey participant page into a structured SurveyData object.\n * The survey URL is embedded as context so callers can later submit against it.\n */\nexport function parseSurveyPage(html: string, surveyUrl: string): SurveyData {\n if (html.includes(\"/Account/Login\")) {\n throw new SessionExpiredError();\n }\n\n const $ = load(html);\n\n const description = $(\".panel-body p\").first().text().trim();\n\n let surveyId = \"\";\n let surveyUserId = \"\";\n let redirectUrl = \"\";\n\n // The server embeds a Base64-encoded _jsm object in a <script> tag.\n $(\"script\").each((_, script) => {\n const content = $(script).html() ?? \"\";\n\n const base64Match = content.match(\n /var\\s+_jsm\\s*=\\s*null;\\s*\\(function\\(\\)\\s*\\{\\s*_jsm\\s*=\\s*JSON\\.parse\\(Base64\\.decode\\([\"']([^\"']+)[\"']\\)/\n );\n if (base64Match) {\n try {\n const encoded = base64Match[1];\n if (!encoded) return;\n const decoded = Buffer.from(encoded, \"base64\").toString(\"utf-8\");\n const jsmObj = JSON.parse(decoded) as Record<string, unknown>;\n\n if (typeof jsmObj[\"SurveyId\"] === \"number\" && !surveyId) {\n surveyId = String(jsmObj[\"SurveyId\"]);\n }\n const survey = jsmObj[\"Survey\"] as Record<string, unknown> | undefined;\n if (typeof survey?.[\"Id\"] === \"number\" && !surveyId) {\n surveyId = String(survey[\"Id\"]);\n }\n\n const surveyUser = jsmObj[\"SurveyUser\"] as Record<string, unknown> | undefined;\n if (typeof surveyUser?.[\"Id\"] === \"number\" && !surveyUserId) {\n surveyUserId = String(surveyUser[\"Id\"]);\n }\n\n if (typeof jsmObj[\"RedirectPageUrl\"] === \"string\" && !redirectUrl) {\n redirectUrl = jsmObj[\"RedirectPageUrl\"];\n }\n } catch {\n // Ignore parse errors — fall through to pattern-based fallbacks.\n }\n }\n\n // Fallback regex patterns for non-encoded variants.\n if (!surveyId) {\n const m = content.match(/Survey\\s*:\\s*\\{\\s*Id\\s*:\\s*(\\d+)/);\n if (m) surveyId = m[1] ?? \"\";\n }\n if (!surveyUserId) {\n const m = content.match(/SurveyUser\\s*:\\s*\\{\\s*Id\\s*:\\s*(\\d+)/);\n if (m) surveyUserId = m[1] ?? \"\";\n }\n if (!redirectUrl) {\n const m = content.match(/RedirectPageUrl\\s*:\\s*[\"']([^\"']+)[\"']/);\n if (m) redirectUrl = m[1] ?? \"\";\n }\n });\n\n // data-survey-id attribute fallback.\n if (!surveyId) {\n surveyId = $(\"#surveyParent\").attr(\"data-survey-id\") ?? \"\";\n }\n\n // URL Id param fallback for surveyUserId.\n if (!surveyUserId) {\n const m = surveyUrl.match(/[?&]Id=(\\d+)/i);\n if (m) surveyUserId = m[1] ?? \"\";\n }\n\n // RedirectPageUrl from query string fallback.\n if (!redirectUrl) {\n try {\n const urlObj = new URL(surveyUrl);\n redirectUrl = urlObj.searchParams.get(\"RedirectPageUrl\") ?? \"\";\n } catch {\n // ignore malformed URLs\n }\n }\n\n if (!surveyId && !surveyUserId) {\n throw new ParseError(\"Could not extract surveyId or surveyUserId from survey page.\", {\n details: { surveyUrl }\n });\n }\n\n const pages = parseSurveyPages($);\n\n return {\n url: surveyUrl,\n title: \"Ders Değerlendirme Anketi\",\n description,\n surveyId,\n surveyUserId,\n ...(redirectUrl ? { redirectUrl } : {}),\n pages\n };\n}\n\nfunction parseSurveyPages($: ReturnType<typeof load>): SurveyPage[] {\n const pages: SurveyPage[] = [];\n\n $(\".survey-page\").each((_, pageEl) => {\n const pageId = $(pageEl).attr(\"data-page-id\") ?? \"\";\n if (!pageId) return;\n\n const pageTitleText = $(pageEl).text().trim();\n const pageBody = $(pageEl).closest(\".panel\").find(\".panel-body\");\n const questions: SurveyQuestion[] = [];\n const choiceLabels: string[] = [];\n\n const table = pageBody.find(\"table\");\n if (table.length > 0) {\n table.find(\"thead th\").each((idx, th) => {\n const choiceText = $(th).text().trim();\n if (choiceText && idx > 0) {\n choiceLabels.push(choiceText);\n }\n });\n\n table.find(\"tbody tr[data-question-id]\").each((_, row) => {\n const questionId = $(row).attr(\"data-question-id\") ?? \"\";\n const questionText = $(row).find(\"td\").first().text().trim();\n const isRequired = $(row).hasClass(\"forRequired\");\n\n const questionChoices = [] as { id: string; text: string }[];\n $(row)\n .find(\"input[type=\\\"radio\\\"]\")\n .each((idx, input) => {\n const choiceId = $(input).attr(\"data-choise-id\") ?? \"\";\n if (choiceId) {\n questionChoices.push({\n id: choiceId,\n text: choiceLabels[idx] ?? `Option ${idx + 1}`\n });\n }\n });\n\n if (questionId && questionText) {\n questions.push({\n id: questionId,\n text: questionText,\n required: isRequired,\n choices: questionChoices\n });\n }\n });\n }\n\n pages.push({\n id: pageId,\n title: pageTitleText,\n questions,\n choiceLabels\n });\n });\n\n return pages;\n}\n\n/**\n * Build the request body for the MES FinishSurvey endpoint.\n *\n * @param surveyData - Parsed survey data from parseSurveyPage()\n * @param answers - Map of questionId → choiceId selected by the user\n */\nexport function buildSurveySubmitBody(\n surveyData: SurveyData,\n answers: Record<string, string>\n): unknown {\n const choises = Object.entries(answers).map(([questionId, choiceId]) => ({\n Id: 0,\n SelectedOrder: null,\n SurveyQuestionId: parseInt(questionId, 10),\n SurveyUserId: parseInt(surveyData.surveyUserId, 10),\n SurveyQuestionChoiseId: parseInt(choiceId, 10),\n Text: \"\",\n IsIrrevelant: false\n }));\n\n return {\n choises,\n RedirectPageUrl: surveyData.redirectUrl ?? \"\",\n surveyId: parseInt(surveyData.surveyId, 10)\n };\n}\n\n/**\n * Extract the CSRF token from a survey page.\n */\nexport function extractSurveyCsrfToken(html: string): string | undefined {\n const $ = load(html);\n const token = $(\"input[name=\\\"__RequestVerificationToken\\\"]\").val();\n return typeof token === \"string\" && token ? token : undefined;\n}\n\n/**\n * Parse the PortalSurveyManagement listing page and return all MES Participant URLs.\n */\nexport function parseSurveyLinks(html: string, baseUrl: string): string[] {\n const $ = load(html);\n const links: string[] = [];\n\n $(\"a[href*=\\\"MES/Application/Public/Participant\\\"]\").each((_, el) => {\n const href = $(el).attr(\"href\");\n if (!href) return;\n links.push(href.startsWith(\"http\") ? href : `${baseUrl}${href}`);\n });\n\n return links;\n}\n","import { load } from \"cheerio\";\r\n\r\nimport { loginWithCredentials, type LoginResult } from \"./auth/login\";\r\nimport { ClientClosedError, HttpError, NetworkError, NotImplementedUBYSError, ParseError, SessionExpiredError } from \"./errors\";\r\nimport { AJAX_HEADERS, OMU_CAFETERIA_URL } from \"./http/constants\";\r\nimport { UBYSSession, type UBYSSessionOptions } from \"./http/session\";\r\nimport type { Advisor, CafeteriaMenu, ChatMessageSearchOptions, ChatMessageSearchResult, ChatRecipientSearchOptions, ChatRecipientSearchResult, ChatSearchOptions, ChatSearchResult, ClassDetail, ScheduleItem, Semester, StudentInfoPayload, SurveyCheckResult, SurveyData, UserProfile } from \"./models/types\";\r\nimport { parseAdvisor } from \"./parsers/advisor\";\r\nimport { parseCafeteriaMenu } from \"./parsers/cafeteria\";\r\nimport { parseClassDetail, parseStudentList, parseSurveyPageStatus } from \"./parsers/class-details\";\r\nimport { parseGrades } from \"./parsers/grades\";\r\nimport { parseChatMessageSearchResponse, parseChatRecipientSearchResponse, parseChatSearchResponse } from \"./parsers/messages\";\r\nimport { extractSapId, extractStudentInfo, toUserProfile } from \"./parsers/profile\";\r\nimport { buildWeeklyScheduleRequest, extractWeeklyScheduleConfig, parseWeeklySchedule } from \"./parsers/schedule\";\r\nimport { parseTranscript } from \"./parsers/transcript\";\r\nimport { buildSurveySubmitBody, extractSurveyCsrfToken, parseSurveyLinks, parseSurveyPage } from \"./parsers/survey\";\r\n\r\nexport interface UBYSClientOptions extends UBYSSessionOptions {\r\n username?: string;\r\n password?: string;\r\n}\r\n\r\ninterface ClientState {\r\n authenticated: boolean;\r\n studentNumber?: string;\r\n login?: LoginResult;\r\n dashboardHtml?: string;\r\n studentInfo?: StudentInfoPayload;\r\n sapId?: string;\r\n profile?: UserProfile;\r\n}\r\n\r\nexport class UBYSClient {\r\n private readonly session: UBYSSession;\r\n private readonly credentials: { username: string | undefined; password: string | undefined };\r\n private closed = false;\r\n private state: ClientState = {\r\n authenticated: false\r\n };\r\n\r\n public constructor(options: UBYSClientOptions = {}) {\r\n this.session = new UBYSSession(options);\r\n this.credentials = {\r\n username: options.username,\r\n password: options.password\r\n };\r\n }\r\n\r\n public get isLoggedIn(): boolean {\r\n return this.state.authenticated;\r\n }\r\n\r\n public get isClosed(): boolean {\r\n return this.closed;\r\n }\r\n\r\n public async login(username = this.credentials.username, password = this.credentials.password): Promise<void> {\r\n if (!username || !password) {\r\n throw new SessionExpiredError(\"Username and password are required for login.\", {\r\n code: \"MISSING_CREDENTIALS\"\r\n });\r\n }\r\n\r\n const login = await loginWithCredentials(this.session, username, password);\r\n const dashboardHtml = await this.fetchDashboardHtml();\r\n const studentInfo = extractStudentInfo(dashboardHtml);\r\n const sapId = extractSapId(dashboardHtml);\r\n const profile = toUserProfile(username, studentInfo, sapId, login.longUsername?.trim());\r\n\r\n this.credentials.username = username;\r\n this.credentials.password = password;\r\n this.state = {\r\n authenticated: true,\r\n studentNumber: username,\r\n login,\r\n dashboardHtml,\r\n studentInfo,\r\n profile,\r\n ...(sapId ? { sapId } : {})\r\n };\r\n }\r\n\r\n public async getProfile(): Promise<UserProfile> {\r\n this.ensureAuthenticated();\r\n\r\n if (this.state.profile) {\r\n return this.state.profile;\r\n }\r\n\r\n const dashboardHtml = await this.fetchDashboardHtml();\r\n const studentInfo = extractStudentInfo(dashboardHtml);\r\n const sapId = extractSapId(dashboardHtml);\r\n const profile = toUserProfile(this.state.studentNumber ?? \"\", studentInfo, sapId, this.state.login?.longUsername?.trim());\r\n\r\n this.state.dashboardHtml = dashboardHtml;\r\n this.state.studentInfo = studentInfo;\r\n if (sapId) {\r\n this.state.sapId = sapId;\r\n } else {\r\n delete this.state.sapId;\r\n }\r\n this.state.profile = profile;\r\n\r\n return profile;\r\n }\r\n\r\n public async getAdvisor(): Promise<Advisor | null> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.state.sapId) {\r\n await this.getProfile();\r\n }\r\n\r\n if (!this.state.sapId) {\r\n return null;\r\n }\r\n\r\n const response = await this.session.get(\"AIS/Student/Home/AdvisorInfo\", {\r\n searchParams: {\r\n sapId: this.state.sapId\r\n },\r\n headers: {\r\n ...AJAX_HEADERS\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseAdvisor(response.body);\r\n }\r\n\r\n public async getCafeteriaMenu(): Promise<CafeteriaMenu | null> {\r\n const response = await this.session.get(OMU_CAFETERIA_URL, {\r\n https: {\r\n rejectUnauthorized: false\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n return parseCafeteriaMenu(response.body);\r\n }\r\n\r\n public async getMessages(options: ChatSearchOptions = {}): Promise<ChatSearchResult> {\r\n this.ensureAuthenticated();\r\n\r\n const response = await this.session.post(\"Conversation/SearchChat\", {\r\n json: {\r\n Keyword: options.keyword ?? \"\",\r\n PageNumber: options.pageNumber ?? 0,\r\n PageSize: options.pageSize ?? 10\r\n },\r\n headers: {\r\n ...AJAX_HEADERS,\r\n origin: this.session.baseUrl,\r\n referer: `${this.session.baseUrl}/Conversation/Index`\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseChatSearchResponse(response.body);\r\n }\r\n\r\n public async getChatRecipients(options: ChatRecipientSearchOptions): Promise<ChatRecipientSearchResult> {\r\n this.ensureAuthenticated();\r\n\r\n const response = await this.session.post(\"Conversation/SearchChatRecepient\", {\r\n json: {\r\n ChatIds: options.chatIds,\r\n PageNumber: options.pageNumber ?? 0,\r\n PageSize: options.pageSize ?? 20\r\n },\r\n headers: {\r\n ...AJAX_HEADERS,\r\n origin: this.session.baseUrl,\r\n referer: `${this.session.baseUrl}/Conversation/Index`\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseChatRecipientSearchResponse(response.body);\r\n }\r\n\r\n public async getChatMessages(options: ChatMessageSearchOptions): Promise<ChatMessageSearchResult> {\r\n this.ensureAuthenticated();\r\n\r\n const response = await this.session.post(\"Conversation/SearchChatMessage\", {\r\n json: {\r\n ChatRecepientIds: options.chatRecepientIds,\r\n Keyword: options.keyword ?? \"\",\r\n PageNumber: options.pageNumber ?? 0,\r\n PageSize: options.pageSize ?? 50\r\n },\r\n headers: {\r\n ...AJAX_HEADERS,\r\n origin: this.session.baseUrl,\r\n referer: `${this.session.baseUrl}/Conversation/Index`\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseChatMessageSearchResponse(response.body);\r\n }\r\n\r\n public async getGrades(): Promise<Semester[]> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.state.sapId) {\r\n await this.getProfile();\r\n }\r\n\r\n const response = await this.session.get(\"AIS/Student/Class/Index\", {\r\n searchParams: {\r\n history: \"true\",\r\n ...(this.state.sapId ? { sapid: this.state.sapId } : {})\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseGrades(response.body);\r\n }\r\n\r\n public async getClassDetails(classId: string): Promise<ClassDetail> {\r\n this.ensureAuthenticated();\r\n\r\n const detailResponse = await this.session.get(\"AIS/Student/Class/ClassDetail\", {\r\n searchParams: {\r\n classId\r\n }\r\n });\r\n\r\n this.session.assertOk(detailResponse);\r\n this.session.assertNotLoginRedirect(detailResponse);\r\n\r\n const detail = parseClassDetail(detailResponse.body);\r\n\r\n if (detail.survey?.required && detail.survey.url) {\r\n try {\r\n const surveyResponse = await this.session.get(detail.survey.url.replace(/^\\//, \"\"));\r\n this.session.assertNotLoginRedirect(surveyResponse);\r\n\r\n if (surveyResponse.statusCode === 200) {\r\n const surveyStatus = parseSurveyPageStatus(surveyResponse.body);\r\n if (surveyStatus) {\r\n detail.survey = {\r\n ...detail.survey,\r\n ...surveyStatus\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n if (!isBestEffortClassDetailError(error)) {\r\n throw error;\r\n }\r\n\r\n // Keep the original survey requirement details when survey page lookup fails.\r\n }\r\n }\r\n\r\n try {\r\n const studentResponse = await this.session.get(\"AIS/Student/Class/CourseStudents\", {\r\n searchParams: {\r\n classId\r\n }\r\n });\r\n\r\n this.session.assertNotLoginRedirect(studentResponse);\r\n\r\n if (studentResponse.statusCode === 200) {\r\n const students = parseStudentList(studentResponse.body);\r\n if (students.length > 0) {\r\n return {\r\n ...detail,\r\n students\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n if (!isBestEffortClassDetailError(error)) {\r\n throw error;\r\n }\r\n\r\n return detail;\r\n }\r\n\r\n return detail;\r\n }\r\n\r\n public async getTranscript(): Promise<Semester[]> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.state.dashboardHtml) {\r\n this.state.dashboardHtml = await this.fetchDashboardHtml();\r\n }\r\n\r\n if (!this.state.sapId) {\r\n const sapId = extractSapId(this.state.dashboardHtml);\r\n if (sapId) {\r\n this.state.sapId = sapId;\r\n }\r\n }\r\n\r\n const transcriptPath = this.resolveTranscriptPath(this.state.dashboardHtml, this.state.sapId);\r\n const response = await this.session.get(transcriptPath);\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseTranscript(response.body);\r\n }\r\n\r\n public async getWeeklySchedule(): Promise<ScheduleItem[]> {\r\n this.ensureAuthenticated();\r\n\r\n if (!this.state.studentInfo) {\r\n await this.getProfile();\r\n }\r\n\r\n if (!this.state.studentInfo) {\r\n throw new NotImplementedUBYSError(\"Student info is not available for `getWeeklySchedule()`. Try logging in again.\");\r\n }\r\n\r\n if (!this.state.dashboardHtml) {\r\n this.state.dashboardHtml = await this.fetchDashboardHtml();\r\n }\r\n\r\n const scheduleConfig = extractWeeklyScheduleConfig(this.state.dashboardHtml);\r\n const payload = buildWeeklyScheduleRequest(this.state.studentInfo, scheduleConfig);\r\n const response = await this.session.post(\"AIS/Student/Home/GetWeeklySchedule\", {\r\n json: payload,\r\n headers: {\r\n ...AJAX_HEADERS\r\n }\r\n });\r\n\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseWeeklySchedule(response.body);\r\n }\r\n\r\n /**\r\n * Check whether there are any mandatory portal-level surveys blocking access.\r\n * Navigates to the student home page and detects PortalSurveyManagement redirects.\r\n * If surveys are found they are fetched and returned.\r\n */\r\n public async getPendingSurveys(): Promise<SurveyCheckResult> {\r\n this.ensureAuthenticated();\r\n\r\n const homeResponse = await this.session.get(\"AIS/Student/Home/Index\");\r\n this.session.assertOk(homeResponse);\r\n\r\n const responseUrl = homeResponse.url;\r\n const html = homeResponse.body;\r\n\r\n const redirectedToSurvey = responseUrl.includes(\"PortalSurveyManagement\");\r\n const htmlMentionsSurvey = html.includes(\"Zorunlu olan anketi\");\r\n\r\n if (!redirectedToSurvey && !htmlMentionsSurvey) {\r\n return { hasPendingSurvey: false };\r\n }\r\n\r\n if (redirectedToSurvey) {\r\n // Confirm it is truly mandatory by re-visiting the home page URL.\r\n let requestedUrl: string | null = null;\r\n try {\r\n requestedUrl = new URL(responseUrl).searchParams.get(\"RequestedUrl\");\r\n } catch {\r\n // ignore malformed URL\r\n }\r\n\r\n if (requestedUrl) {\r\n const retryResponse = await this.session.get(requestedUrl);\r\n if (!retryResponse.url.includes(\"PortalSurveyManagement\")) {\r\n return { hasPendingSurvey: false };\r\n }\r\n }\r\n\r\n const surveyLinks = parseSurveyLinks(html, this.session.baseUrl);\r\n if (surveyLinks.length > 0) {\r\n const surveys: SurveyData[] = [];\r\n for (const link of surveyLinks) {\r\n try {\r\n const survey = await this.fetchSurvey(link);\r\n surveys.push(survey);\r\n } catch {\r\n // Skip surveys that cannot be parsed.\r\n }\r\n }\r\n return { hasPendingSurvey: true, ...(surveys.length > 0 ? { surveys } : {}) };\r\n }\r\n }\r\n\r\n return { hasPendingSurvey: true };\r\n }\r\n\r\n /**\r\n * Fetch and parse a single MES survey participant page.\r\n *\r\n * @param surveyUrl - Full URL (e.g. https://ubys.omu.edu.tr/MES/Application/Public/Participant?Id=…)\r\n */\r\n public async fetchSurvey(surveyUrl: string): Promise<SurveyData> {\r\n this.ensureAuthenticated();\r\n\r\n const response = await this.session.get(surveyUrl);\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n\r\n return parseSurveyPage(response.body, surveyUrl);\r\n }\r\n\r\n /**\r\n * Submit answers for a survey.\r\n *\r\n * @param surveyData - The SurveyData returned by `fetchSurvey()`\r\n * @param answers - Map of questionId → choiceId\r\n */\r\n public async submitSurvey(\r\n surveyData: SurveyData,\r\n answers: Record<string, string>\r\n ): Promise<void> {\r\n this.ensureAuthenticated();\r\n\r\n // Re-fetch the page to obtain a fresh CSRF token.\r\n const pageResponse = await this.session.get(surveyData.url);\r\n this.session.assertOk(pageResponse);\r\n this.session.assertNotLoginRedirect(pageResponse);\r\n\r\n const csrfToken = extractSurveyCsrfToken(pageResponse.body);\r\n if (!csrfToken) {\r\n throw new Error(\"CSRF token not found on survey page.\");\r\n }\r\n\r\n const body = buildSurveySubmitBody(surveyData, answers);\r\n const finishUrl = `${this.session.baseUrl}/MES/Application/Public/FinishSurvey`;\r\n\r\n const submitResponse = await this.session.post(finishUrl, {\r\n body: JSON.stringify(body),\r\n headers: {\r\n \"content-type\": \"application/json; charset=UTF-8\",\r\n \"x-requested-with\": \"XMLHttpRequest\",\r\n \"x-requestverificationtoken\": csrfToken,\r\n referer: surveyData.url\r\n }\r\n });\r\n\r\n this.session.assertOk(submitResponse);\r\n }\r\n\r\n public clearSession(): void {\r\n this.ensureOpen();\r\n\r\n this.state = {\r\n authenticated: false\r\n };\r\n }\r\n\r\n public async close(): Promise<void> {\r\n if (this.closed) {\r\n return;\r\n }\r\n\r\n this.state = {\r\n authenticated: false\r\n };\r\n this.closed = true;\r\n await this.session.close();\r\n }\r\n\r\n private ensureAuthenticated(): void {\r\n this.ensureOpen();\r\n\r\n if (!this.state.authenticated) {\r\n throw new SessionExpiredError(\"Not logged in. Call `login()` first.\");\r\n }\r\n }\r\n\r\n private ensureOpen(): void {\r\n if (this.closed || this.session.isClosed) {\r\n throw new ClientClosedError();\r\n }\r\n }\r\n\r\n private async fetchDashboardHtml(): Promise<string> {\r\n const response = await this.session.get(\"AIS/Student/Home/Index\");\r\n this.session.assertOk(response);\r\n this.session.assertNotLoginRedirect(response);\r\n return response.body;\r\n }\r\n\r\n private resolveTranscriptPath(dashboardHtml: string | undefined, sapId?: string): string {\r\n if (dashboardHtml) {\r\n const $ = load(dashboardHtml);\r\n const href = $(\"a[href*='/AIS/Student/Transcript/Index']\").first().attr(\"href\");\r\n if (href) {\r\n return href.replace(/&amp;/g, \"&\").replace(/^\\//, \"\");\r\n }\r\n }\r\n\r\n return sapId ? `AIS/Student/Transcript/Index?sapId=${encodeURIComponent(sapId)}` : \"AIS/Student/Transcript/Index\";\r\n }\r\n}\r\n\r\nfunction isBestEffortClassDetailError(error: unknown): boolean {\r\n return error instanceof HttpError || error instanceof NetworkError || error instanceof ParseError;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emiran/omu-ubys",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Unofficial TypeScript client for Ondokuz Mayis University UBYS.",
5
5
  "license": "MIT",
6
6
  "author": "Emirhan",