diff --git a/.travis.yml b/.travis.yml index d89556e..ced2e60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,14 +37,4 @@ cache: install: - ./gradlew test - - ./gradlew publishToMavenLocal - -after_success: - - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh - - chmod +x send.sh - - ./send.sh success $WEBHOOK_URL - -after_failure: - - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh - - chmod +x send.sh - - ./send.sh failure $WEBHOOK_URL \ No newline at end of file + - ./gradlew publishToMavenLocal \ No newline at end of file diff --git a/README.md b/README.md index da79325..d0c5917 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ allprojects { ```groovy dependencies { - implementation 'io.teamif:comcigan-lib:1.2.0' + implementation 'io.teamif:comcigan-lib:1.2.1' } ``` @@ -34,7 +34,7 @@ allprojects { ```kotlin dependencies { - implementation("io.teamif:comcigan-lib:1.2.0") + implementation("io.teamif:comcigan-lib:1.2.1") } ``` diff --git a/build.gradle.kts b/build.gradle.kts index ed391bf..a6d6831 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -34,7 +34,7 @@ plugins { } group = "io.teamif" -version = "1.2.0" +version = "1.2.1" repositories { maven("https://repo.maven.apache.org/maven2/") diff --git a/src/main/kotlin/io/teamif/patrick/comcigan/ComciganAPI.kt b/src/main/kotlin/io/teamif/patrick/comcigan/ComciganAPI.kt index 6cea8f6..2170650 100644 --- a/src/main/kotlin/io/teamif/patrick/comcigan/ComciganAPI.kt +++ b/src/main/kotlin/io/teamif/patrick/comcigan/ComciganAPI.kt @@ -64,7 +64,7 @@ object ComciganAPI { internal val SEARCH_URL: String init { - SCRIPT = SCRIPT_REGEX.search(("$ROOT_URL/st").open()) + SCRIPT = SCRIPT_REGEX.search(("$ROOT_URL/st").openURL()) ROUTE = ROUTE_REGEX.search(SCRIPT) PREFIX = PREFIX_REGEX.search(SCRIPT) ORIGINAL_ID = ORIGINAL_ID_REGEX.search(SCRIPT) @@ -75,7 +75,8 @@ object ComciganAPI { SEARCH_URL = "$BASE_URL${ROUTE.substring(8)}" } - internal fun String.open(charset: Charset = Charset.forName(CHARSET)): String = + @JvmStatic + internal fun String.openURL(charset: Charset = Charset.forName(CHARSET)): String = URL(this).readText(charset) /** @@ -102,6 +103,7 @@ object ComciganAPI { * @throws IllegalArgumentException when more than one results found * @see [ComciganSchool] */ + @JvmStatic @Throws(NoSuchElementException::class, IllegalArgumentException::class) fun newSchool(name: String): ComciganSchool = ComciganSchool(name) } \ No newline at end of file diff --git a/src/main/kotlin/io/teamif/patrick/comcigan/ComciganSchool.kt b/src/main/kotlin/io/teamif/patrick/comcigan/ComciganSchool.kt index f207c61..dc66609 100644 --- a/src/main/kotlin/io/teamif/patrick/comcigan/ComciganSchool.kt +++ b/src/main/kotlin/io/teamif/patrick/comcigan/ComciganSchool.kt @@ -20,10 +20,10 @@ package io.teamif.patrick.comcigan -import com.google.gson.JsonElement +import com.google.gson.JsonObject import com.google.gson.JsonParser import com.google.gson.stream.JsonReader -import io.teamif.patrick.comcigan.ComciganAPI.open +import io.teamif.patrick.comcigan.ComciganAPI.openURL import java.io.StringReader import java.net.URLEncoder import java.util.Base64 @@ -47,16 +47,16 @@ class ComciganSchool internal constructor(name: String) { init { val json = "${ComciganAPI.SEARCH_URL}${URLEncoder.encode(name, ComciganAPI.CHARSET)}" - .json.asJsonObject.getAsJsonArray("학교검색") + .jsonFromURL.getAsJsonArray("학교검색") when (json.count()) { 0 -> throw NoSuchElementException("No schools have been searched by the name passed.") 1 -> json.first().asJsonArray else -> throw IllegalArgumentException("More than one school is searched by the name passed.") - }.run { - schoolName = get(2).asString - schoolCode = get(3).asString - schoolUrls = listOf(0.schoolUrl, 1.schoolUrl) + }.let { array -> + schoolName = array[2].asString + schoolCode = array[3].asString + schoolUrls = listOf(schoolWeekURL(0), schoolWeekURL(1)) refresh() } @@ -66,61 +66,57 @@ class ComciganSchool internal constructor(name: String) { * Refreshes the data by parsing the Comcigan Website */ fun refresh() { - val weekArray = ArrayList() - - schoolUrls.map { url -> - url.json.asJsonObject.run { + schoolData = SchoolRawData(schoolUrls.map { url -> + url.jsonFromURL.asJsonObject.run { val shortSubjects = getAsJsonArray(ComciganAPI.SUBJECT_ID).mapNotNull { it.asString } val longSubjects = getAsJsonArray("긴${ComciganAPI.SUBJECT_ID}").mapNotNull { it.asString } val teachers = getAsJsonArray(ComciganAPI.TEACHER_ID).mapNotNull { it.asString } val grades = getAsJsonArray(ComciganAPI.DAILY_ID).mapNotNull { it.asJsonArray }.drop(1).filter { it.count() > 0 } - weekArray.add( - SchoolWeekData(grades.map { grade -> - val classrooms = grade.mapNotNull { it.asJsonArray }.drop(1) - - SchoolGradeData(classrooms.map { classroom -> - val days = classroom.mapNotNull { it.asJsonArray }.drop(1) - - SchoolClassroomData(days.map { day -> - val codes = day.mapNotNull { it.asString }.drop(1).dropLastWhile { it == "0" } - - SchoolDayData(codes.map { code -> - when (code) { - "0" -> SchoolPeriodData.NULL - else -> { - val subject = code.takeLast(2).toInt() - val teacher = code.dropLast(2).toInt() - - SchoolPeriodData( - shortSubjects[subject], - longSubjects[subject], - teachers[teacher] - ) - } - } - }) - }) + SchoolWeekData(grades.map { grade -> + val classrooms = grade.mapNotNull { it.asJsonArray }.drop(1) + + SchoolGradeData(classrooms.map { classroom -> + val days = classroom.mapNotNull { it.asJsonArray }.drop(1) + + SchoolClassroomData(days.map { day -> + val codes = day.mapNotNull { it.asString }.drop(1).dropLastWhile { it == "0" } + + SchoolDayData(codes.map { code -> + when (code) { + "0" -> SchoolPeriodData.NULL + else -> { + val subject = code.takeLast(2).toInt() + val teacher = code.dropLast(2).toInt() + + SchoolPeriodData( + shortSubjects[subject], + longSubjects[subject], + teachers[teacher] + ) + } + } }) }) - ) + }) + }) } - } - - schoolData = SchoolRawData(weekArray) + }) } - private val Int.schoolUrl: String - get() { - val byteArray = "${ComciganAPI.PREFIX}${schoolCode}_0_$this".toByteArray() + private fun schoolWeekURL(index: Int): String { + val byteArray = "${ComciganAPI.PREFIX}${schoolCode}_0_$index".toByteArray() - return "${ComciganAPI.BASE_URL}?${Base64.getUrlEncoder().encode(byteArray).decodeToString()}" - .run { replace("=", "") } + return "${ComciganAPI.BASE_URL}?${Base64.getUrlEncoder().encodeToString(byteArray)}".dropLastWhile { + it == '=' } + } - private val String.json: JsonElement - get() = requireNotNull(JsonParser.parseReader(JsonReader(StringReader(open(Charsets.UTF_8))).apply { - isLenient = true - })) + private val String.jsonFromURL: JsonObject + get() = requireNotNull( + JsonParser.parseReader(JsonReader(StringReader(openURL(Charsets.UTF_8))).apply { + isLenient = true + }) + ) as JsonObject } \ No newline at end of file