123 lines
3.9 KiB
Nim
123 lines
3.9 KiB
Nim
import json, os, times, unicode, uri
|
|
import cligen, colorize
|
|
from bakalari as baka import newBakalari
|
|
|
|
type
|
|
Config = object
|
|
website: string
|
|
username: string
|
|
refreshToken: string
|
|
|
|
const
|
|
defaultConfigFile = getConfigDir() / "bk.json"
|
|
dayNames = [
|
|
1: "Mon",
|
|
2: "Tue",
|
|
3: "Wed",
|
|
4: "Thu",
|
|
5: "Fri",
|
|
6: "Sat",
|
|
7: "Sun",
|
|
]
|
|
|
|
proc loadConfig(configFile = defaultConfigFile): Config =
|
|
try:
|
|
defaultConfigFile.readFile.parseJson.to(Config)
|
|
except IOError:
|
|
stderr.writeLine "Error: Can't read the config file. Are you signed in?"
|
|
quit QuitFailure
|
|
except JsonParsingError, JsonKindError:
|
|
stderr.writeLine "Error: Invalid config file. Make sure it's in JSON format."
|
|
quit QuitFailure
|
|
except KeyError:
|
|
stderr.writeLine "Error: The config file doesn't contain all necessary fields."
|
|
quit QuitFailure
|
|
|
|
proc saveConfig(configFile = defaultConfigFile, config: Config) =
|
|
try:
|
|
configFile.writeFile((%*config).pretty)
|
|
except IOError:
|
|
stderr.writeLine "Error: Can't write the config file."
|
|
quit QuitFailure
|
|
|
|
proc signin(
|
|
website: string,
|
|
username: string,
|
|
password: string,
|
|
configFile = defaultConfigFile,
|
|
) =
|
|
## sign in to Bakaláři and save the credentials
|
|
let
|
|
bakalari = newBakalari(website.parseUri, username, password)
|
|
config = Config(
|
|
website: website,
|
|
username: username,
|
|
refreshToken: bakalari.refreshToken,
|
|
)
|
|
configFile.saveConfig(config)
|
|
|
|
proc homework(
|
|
configFile = defaultConfigFile,
|
|
) =
|
|
## display the list of homework
|
|
var config = configFile.loadConfig
|
|
let bakalari = newBakalari(config.website.parseUri, config.refreshToken)
|
|
config.refreshToken = bakalari.refreshToken
|
|
configFile.saveConfig(config)
|
|
for homework in baka.homework(bakalari):
|
|
stdout.writeLine "----------------------------------------------------------------".fgLightGray
|
|
stdout.writeLine (homework.startTime.format("yyyy-MM-dd") & " / " & homework.endTime.format("yyyy-MM-dd")).fgLightCyan
|
|
stdout.writeLine homework.subject.fgLightYellow
|
|
stdout.writeLine homework.teacher.fgLightMagenta
|
|
stdout.writeLine homework.content
|
|
|
|
proc timetable(
|
|
configFile = defaultConfigFile,
|
|
date = "",
|
|
oneDay = false,
|
|
permanent = false,
|
|
) =
|
|
## display the timetable (for the current week by default)
|
|
var config = configFile.loadConfig
|
|
let bakalari = newBakalari(config.website.parseUri, config.refreshToken)
|
|
config.refreshToken = bakalari.refreshToken
|
|
configFile.saveConfig(config)
|
|
let timetable = baka.timetable(bakalari, permanent)
|
|
for day in timetable.days:
|
|
stdout.writeLine dayNames[day.dayOfWeek] & " " & day.date.format("yyyy-MM-dd")
|
|
for lesson in day.lessons:
|
|
var line = ""
|
|
line &= lesson.hour.number
|
|
line &= ". "
|
|
line &= lesson.hour.beginTime.align(5, '0'.Rune).fgLightCyan
|
|
line &= "-".fgLightCyan
|
|
line &= lesson.hour.endTime.align(5, '0'.Rune).fgLightCyan
|
|
line &= " "
|
|
line &= lesson.subject.abbrev.align(4).fgLightYellow
|
|
line &= " "
|
|
line &= lesson.teacher.abbrev.align(4).fgLightMagenta
|
|
line &= " "
|
|
line &= lesson.room.abbrev.align(4).fgLightGreen
|
|
stdout.writeLine line
|
|
|
|
try:
|
|
dispatchMulti(
|
|
[signin, help = {
|
|
"website": "the URL for Bakaláři (e.g. https://bakalari.myschool.cz)",
|
|
"username": "your username",
|
|
"password": "your password (will not be stored anywhere)",
|
|
"config-file": "where to store the credentials",
|
|
}],
|
|
[homework, help = {
|
|
"config-file": "where the credentials are stored",
|
|
}],
|
|
[timetable, help = {
|
|
"config-file": "where the credentials are stored",
|
|
"date": "any date inside the week you want to display, in YYYYMMDD format (defaults to today)",
|
|
"one-day": "display only the specified day",
|
|
"permanent": "display the permanent timetable",
|
|
}],
|
|
)
|
|
except OSError:
|
|
stderr.writeLine "Error: Generic OS error. Check your internet connection."
|
|
quit QuitFailure
|