Improvements carried over from bk

This commit is contained in:
xigoi 2020-09-07 15:44:58 +02:00
parent 9d688f5303
commit e9f6803425
1 changed files with 74 additions and 5 deletions

View File

@ -1,4 +1,5 @@
import httpcore, httpclient, json, strformat, times, uri
import httpcore, httpclient, json, strformat, tables, times, uri
import elvis
type
Bakalari* = ref object
@ -17,10 +18,40 @@ type
sender*: string
text*: string
sentTime*: DateTime
Hour* = ref object
number*: string
beginTime*: string
endTime*: string
Room* = ref object
name*: string
abbrev*: string
Subject* = ref object
name*: string
abbrev*: string
Teacher* = ref object
name*: string
abbrev*: string
Lesson* = object
hour*: Hour
room*: Room
subject*: Subject
teacher*: Teacher
Day* = object
lessons*: seq[Lesson]
dayOfWeek*: int
date*: DateTime
Timetable* = object
days*: seq[Day]
const
iso8601 = initTimeFormat("yyyy-MM-dd'T'HH:mm:sszzz")
let
invalidHour = Hour(number: "-", beginTime: "--:--", endTime: "--:--")
invalidRoom = Room(name: "---", abbrev: "---")
invalidSubject = Subject(name: "---", abbrev: "---")
invalidTeacher = Teacher(name: "---", abbrev: "---")
proc newBakalari*(website: Uri, username: string, password: string): Bakalari =
new result
result.website = website
@ -28,8 +59,7 @@ proc newBakalari*(website: Uri, username: string, password: string): Bakalari =
api = website / "api/login"
client = newHttpClient()
response = client.post($api, body = &"client_id=ANDR&grant_type=password&username={username}&password={password}")
body = response.body
let root = body.parseJson
root = response.body.parseJson
result.accessToken = root{"access_token"}.getStr
result.refreshToken = root{"refresh_token"}.getStr
@ -40,8 +70,7 @@ proc newBakalari*(website: Uri, refreshToken: string): Bakalari =
api = website / "api/login"
client = newHttpClient()
response = client.post($api, body = &"client_id=ANDR&grant_type=refresh_token&refresh_token={refreshToken}")
body = response.body
root = body.parseJson
root = response.body.parseJson
result.accessToken = root{"access_token"}.getStr
result.refreshToken = root{"refresh_token"}.getStr
@ -104,3 +133,43 @@ iterator messages*(bakalari: Bakalari): Message =
text: node{"Text"}.getStr,
sentTime: node{"SentDate"}.getStr.parse(iso8601)
)
proc timetable*(bakalari: Bakalari, permanent: bool): Timetable =
let root = bakalari.getEndpoint(permanent ? "timetable/permanent" ! "timetable/actual")
var hours: Table[int, Hour]
for hourNode in root{"Hours"}:
hours[hourNode{"Id"}.getInt] = Hour(
number: hourNode{"Caption"}.getStr,
beginTime: hourNode{"BeginTime"}.getStr,
endTime: hourNode{"EndTime"}.getStr,
)
var rooms: Table[string, Room]
for roomNode in root{"Rooms"}:
rooms[roomNode{"Id"}.getStr] = Room(
name: roomNode{"Name"}.getStr,
abbrev: roomNode{"Abbrev"}.getStr,
)
var subjects: Table[string, Subject]
for subjectNode in root{"Subjects"}:
subjects[subjectNode{"Id"}.getStr] = Subject(
name: subjectNode{"Name"}.getStr,
abbrev: subjectNode{"Abbrev"}.getStr,
)
var teachers: Table[string, Teacher]
for teacherNode in root{"Teachers"}:
teachers[teacherNode{"Id"}.getStr] = Teacher(
name: teacherNode{"Name"}.getStr,
abbrev: teacherNode{"Abbrev"}.getStr,
)
for dayNode in root{"Days"}:
var day: Day
for lessonNode in dayNode{"Atoms"}:
var lesson: Lesson
lesson.hour = hours.getOrDefault(lessonNode{"HourId"}.getInt, invalidHour)
lesson.room = rooms.getOrDefault(lessonNode{"RoomId"}.getStr, invalidRoom)
lesson.subject = subjects.getOrDefault(lessonNode{"SubjectId"}.getStr, invalidSubject)
lesson.teacher = teachers.getOrDefault(lessonNode{"TeacherId"}.getStr, invalidTeacher)
day.lessons.add lesson
day.dayOfWeek = dayNode{"DayOfWeek"}.getInt
day.date = dayNode{"Date"}.getStr.parse(iso8601)
result.days.add day