Files
kspguti-schedule/old/old-schedule.txt
kilyabin 9df04745df Рефакторинг: улучшение системы аутентификации и UI компонентов
- Удалены устаревшие файлы (mock.js, old-schedule.txt, loading-overlay.tsx)
- Переработана система аутентификации (login, logout, check-auth)
- Добавлен компонент toast для уведомлений
- Улучшен контекст загрузки (loading-context)
- Обновлен парсер расписания (schedule.ts)
- Улучшена админ-панель
- Обновлена документация (README.md)
- Старые файлы перемещены в директорию old/
2025-11-28 00:29:46 +04:00

64 lines
2.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Day } from '@/shared/model/day'
import { parsePage } from '@/app/parser/schedule'
import contentTypeParser from 'content-type'
import { JSDOM } from 'jsdom'
// import { content as mockContent } from './mock'
import { reportParserError } from '@/app/logger'
// import { groups } from '@/shared/data/groups'
// const fetchingGroups: {
// [groupID: number]: boolean
// } = Object.fromEntries(Object.values(groups).map(([gId]) => [gId, false]))
// const callbacks: {
// [groupID: number]: Set<{ resolve: (days: Day[]) => void, reject: (e: unknown) => void }>
// } = Object.fromEntries(Object.values(groups).map(([gId]) => [gId, new Set()]))
export async function getSchedule(groupID: number, groupName: string): Promise<Day[]> {
// if (fetchingGroups[groupID]) {
// return new Promise((resolve, reject) => {
// callbacks[groupID].add({
// resolve: (days: Day[]) => resolve(days),
// reject
// })
// })
// } else {
// fetchingGroups[groupID] = true
// }
// try {
// const result = await parseSchedule(groupID, groupName)
// fetchingGroups[groupID] = false
// Array.from(callbacks[groupID].values()).forEach(({ resolve }) => resolve(result))
// callbacks[groupID].clear()
// return result
// } catch(e) {
// fetchingGroups[groupID] = false
// console.log(Array.from(callbacks[groupID].values()).length)
// Array.from(callbacks[groupID].values()).forEach(({ reject }) => reject(e))
// callbacks[groupID].clear()
// throw e
// }
}
export async function parseSchedule(groupID: number, groupName: string) {
const page = await fetch(`${process.env.PROXY_URL ?? 'https://lk.ks.psuti.ru'}/?mn=2&obj=${groupID}`)
// const page = { text: async () => mockContent, status: 200, headers: { get: (s: string) => s && 'text/html' } }
const content = await page.text()
const contentType = page.headers.get('content-type')
if (page.status === 200 && contentType && contentTypeParser.parse(contentType).type === 'text/html') {
try {
const root = new JSDOM(content).window.document
return parsePage(root, groupName)
} catch (e) {
console.error('Error while parsing lk.ks.psuti.ru')
reportParserError(new Date().toISOString(), 'Не удалось сделать парсинг для группы', groupName)
throw e
}
} else {
console.error(page.status, contentType)
console.error(content.length > 500 ? content.slice(0, 500 - 3) + '...' : content)
reportParserError(new Date().toISOString(), 'Не удалось получить страницу для группы', groupName)
throw new Error('Error while fetching lk.ks.psuti.ru')
}
}