package Ġcom . github . tham id _ gam er . loc at ere born . generator Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcom . github . tham id _ gam er . loc at ere born . generator . data . Course Ċ import Ġorg . js oup . Connection Ċ import Ġorg . js oup . J soup Ċ import Ġorg . js oup . nodes . Document Ċ import Ġorg . js oup . nodes . Element Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . io . PrintWriter Ċ import Ġkotlin . io . path . Path Ċ import Ġkotlin . io . path . buffered Writer Ċ import Ġkotlin . math . ceil Ċ Ċ /** Ċ Ġ* ĠGenerates ĠB CA ĠSch oo logy Ġcourse Ġinformation Ċ Ġ*/ Ċ fun Ġgenerate () Ġ{ ĊĠĠĠ ĠBufferedReader ( InputStream Reader ( System .` in ` )). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ ĠPrintWriter ( Path (" student data . csv "). buffered Writer ()). use Ġ{ Ġpw Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! query Data ( input , Ġpw )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Invalid Ġcredentials !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠQueries Ġa Ġusername Ġand Ġpassword Ġfrom Ġthe Ġuser Ġand Ġattempts Ġto Ġlog Ġin Ċ Ġ* Ċ Ġ* Ġ@ param Ġinput ĠInput Ġreader Ġof Ġstdin Ċ Ġ* Ġ@ param Ġoutput ĠOutputs Ġto Ġstudent data . csv Ċ Ġ* Ġ@ return ĠWhether Ġthe Ġquery Ġwas Ġsuccessful Ċ Ġ*/ Ċ private Ġfun Ġquery Data ( input : ĠBufferedReader , Ġoutput : ĠPrintWriter ): ĠBoolean Ġ{ ĊĠĠĠ Ġprintln (" Please Ġenter Ġyour Ġusername .") ĊĠĠĠ Ġval Ġusername Ġ= Ġinput . readLine () ĊĠĠĠ Ġprintln (" Please Ġenter Ġyour Ġpassword .") ĊĠĠĠ Ġval Ġpassword Ġ= Ġinput . readLine () ĊĊĠĠĠ Ġlogin ( username , Ġpassword )?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprint Course Data ( output , Ġit . cookies (), ĠlistOf ( 2 2 3 3 2 2 8 3 0 5 , Ġ 2 2 3 2 9 5 0 1 5 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ /** Ċ Ġ* ĠLogs Ġinto ĠSch oo logy Ċ Ġ* Ċ Ġ* Ġ@ param Ġusername ĠSelf - ex plan atory Ċ Ġ* Ġ@ param Ġpassword ĠSelf - ex plan atory Ċ Ġ* Ġ@ return ĠThe Ġresult Ġof Ġthe Ġlogin Ċ Ġ*/ Ċ private Ġfun Ġlogin ( username : ĠString , Ġpassword : ĠString ): ĠConnection . Response ? Ġ= ĠJ soup ĊĠĠĠĠĠĠĠ Ġ. connect (" https :// bca . sch oo logy . com / login / ldap ?& school = 1 1 8 9 7 2 3 9 ") ĊĠĠĠĠĠĠĠ Ġ. method ( Connection . Method . POST ) ĊĠĠĠĠĠĠĠ Ġ. data ( map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" mail " Ġto Ġusername , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pass " Ġto Ġpassword , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" school _ nid " Ġto Ġ" 1 1 8 9 7 2 3 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" form _ build _ id " Ġto Ġ" 4 8 9 d 8 5 4 - dj h 1 f sa 2 Dk rm c Vr so _ nz X 1 0 5 Ta BT c 4 ars SH b bo f 2 F ZI ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" form _ id " Ġto Ġ" s _ user _ login _ form " ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ. execute () Ċ Ċ /** Ċ Ġ* ĠPrints Ġout Ġall Ġrelevant Ġdata Ġto Ġstudent data . csv Ġand Ġcourse data . csv Ċ Ġ* Ċ Ġ* Ġ@ param Ġout ĠOutputs Ġto Ġstudent data . csv Ċ Ġ* Ġ@ param Ġcookies ĠCookies Ġassociated Ġwith Ġthe Ġcurrent Ġlogin Ċ Ġ* Ġ@ param Ġids ĠThe Ġids Ġof Ġthe Ġgroups Ġto Ġfetch Ġstudents Ġfrom Ċ Ġ* Ġ@ return ĠWhether Ġthe Ġquery Ġwas Ġsuccessful Ċ Ġ*/ Ċ private Ġfun Ġprint Course Data ( out : ĠPrintWriter , Ġcookies : ĠMap < String , ĠString >, Ġids : ĠCollection < Long >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġstudent Lists Ġ= Ġmutable ListOf < Element >() ĊĠĠĠ Ġval Ġcourse Student Map Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠ Ġval Ġused Students Ġ= Ġmutable Set Of < String >() ĊĊĠĠĠ Ġfor Ġ( id Ġin Ġids ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠJ soup . connect (" https :// bca . sch oo logy . com / group /$ id / members "). cookies ( cookies ). get () ĊĠĠĠĠĠĠĠ Ġval Ġpages Ġ= Ġdoc . getElementsBy Class (" total ") ĊĠĠĠĠĠĠĠ Ġif Ġ( pages . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 1 .. ceil ( pages [ 0 ]. text (). toDouble () Ġ/ Ġ 3 0 ). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Student List ( cookies , Ġid , Ġx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getElementsBy AttributeValue (" role ", Ġ" presentation ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . child ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstudent Lists . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( student List Ġin Ġstudent Lists ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprint Student Courses ( student List , Ġcookies , Ġout , Ġcourse Student Map , Ġused Students ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprint Course Members ( course Student Map ) ĊĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ /** Ċ Ġ* ĠBuilds Ġthe Ġcurrent Ġlist Ġof Ġstudents Ġon Ġa Ġpage Ċ Ġ* Ċ Ġ* Ġ@ param Ġcookies ĠCookies Ġassociated Ġwith Ġthe Ġcurrent Ġlogin Ċ Ġ* Ġ@ param Ġid ĠThe Ġid Ġof Ġthe Ġgroup Ġto Ġfetch Ġstudents Ġfrom Ċ Ġ* Ġ@ param Ġpage ĠThe Ġcurrent Ġpage Ġnumber Ċ Ġ* Ġ@ return ĠThe Ġlist Ġof Ġstudents Ċ Ġ*/ Ċ private Ġfun Ġbuild Student List ( cookies : ĠMap < String , ĠString >, Ġid : ĠLong , Ġpage : ĠInt ): ĠDocument ? Ġ{ ĊĠĠĠ Ġval Ġrequest Ġ= ĠJ soup ĊĠĠĠĠĠĠĠ Ġ. connect (" https :// bca . sch oo logy . com / enroll ments / edit / members / group /$ id / ajax ") ĊĠĠĠĠĠĠĠ Ġ. method ( Connection . Method . GET ) ĊĠĠĠĠĠĠĠ Ġ. cookies ( cookies ) ĊĠĠĠĠĠĠĠ Ġ. ignore Http Errors ( true ) ĊĠĠĠĠĠĠĠ Ġ. data ( map Of (" ss " Ġto Ġ"", Ġ" p " Ġto Ġpage . toString ())) ĊĊĠĠĠ Ġval Ġresponse Ġ= Ġrequest . execute () ĊĊĠĠĠ Ġreturn Ġwhen Ġ( response . statusCode ()) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 0 0 Ġ-> Ġresponse . parse () ĊĠĠĠĠĠĠĠĠ 4 2 9 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimeout Ġ= Ġresponse . header (" Retry - After "). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( timeout Ġ+ Ġ 2 5 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . get () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠOutputs Ġa Ġpage Ġof Ġstudents ' Ġcourses Ġto Ġstudent data . csv Ċ Ġ* Ċ Ġ* Ġ@ param Ġstudent List ĠThe Ġlist Ġof Ġstudents Ġto Ġiterate Ġover Ċ Ġ* Ġ@ param Ġcookies ĠCookies Ġassociated Ġwith Ġthe Ġcurrent Ġlogin Ċ Ġ* Ġ@ param Ġout ĠOutputs Ġto Ġstudent data . csv Ċ Ġ* Ġ@ param Ġcourse Student Map ĠA Ġmap Ġof Ġcourses Ġand Ġa Ġcomma Ġseparated Ġlist Ġof Ġits Ġstudents Ċ Ġ*/ Ċ private Ġfun Ġprint Student Courses ( ĊĠĠĠ Ġstudent List : ĠElement , ĊĠĠĠ Ġcookies : ĠMap < String , ĠString >, ĊĠĠĠ Ġout : ĠPrintWriter , ĊĠĠĠ Ġcourse Student Map : ĠMutable Map < String , ĠString >, ĊĠĠĠ Ġused Students : ĠMutable Set < String > Ċ ) Ġ{ ĊĠĠĠ Ġfor Ġ( student Ġin Ġstudent List . children ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcourse Link Ġ= Ġstudent . child ( 1 ). child ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcourse Link . attr (" href "). substring ( 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcourse Link . text () ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ! in Ġused Students ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Course Info ( id , Ġcookies )?. getElementsBy Class (" my - courses - item - list ") ?. first ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . println ("$ id ,$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . println (" Period , ĠMonday , ĠT uesday , ĠWed nesday , ĠTh ursday , ĠF riday ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcourses Ġ= Ġmutable ListOf < Course >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Course Info ( id , Ġit , Ġcourse Student Map , Ġcourses ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Periods ( out , Ġcourses ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . println () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġused Students . add ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAdds Ġcourse Ġinfo Ġto Ġa Ġstudent 's Ġcourses Ċ Ġ* Ċ Ġ* Ġ@ param Ġid ĠThe Ġstudent 's ĠID Ċ Ġ* Ġ@ param Ġcourse List ĠA Ġlist Ġof Ġtheir Ġcourses Ġas Ġa ĠDOM Ġelement Ċ Ġ* Ġ@ param Ġcourse Student Map ĠA Ġmap Ġof Ġcourses Ġand Ġa Ġcomma Ġseparated Ġlist Ġof Ġits Ġstudents Ċ Ġ* Ġ@ param Ġcourses ĠA Ġlist Ġof Ġthe Ġstudent 's Ġcourses Ċ Ġ*/ Ċ private Ġfun Ġadd Course Info ( ĊĠĠĠ Ġid : ĠString , ĊĠĠĠ Ġcourse List : ĠElement , ĊĠĠĠ Ġcourse Student Map : ĠMutable Map < String , ĠString >, ĊĠĠĠ Ġcourses : ĠMutable Collection < Course > Ċ ) Ġ{ ĊĠĠĠ Ġfor Ġ( course Ġin Ġcourse List . children ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcourse Ref Ġ= Ġcourse . child ( 0 ). child ( 1 ). child ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġcourse Id Ġ= Ġcourse Ref . attr (" href "). substring ( 8 ) ĊĠĠĠĠĠĠĠ Ġval Ġcourse Name Ġ= Ġcourse Ref . own Text () ĊĊĠĠĠĠĠĠĠ Ġval Ġcomponents Ġ= Ġcourse Name . split (": "). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcomponents [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġperiods : ĠArray < Int > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdays : ĠArray < Boolean > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcourse Schedule Data Ġ= Ġcomponents [ 1 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperiod Data Ġ= Ġcourse Schedule Data . substring Before (" (" ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Data Ġ= Ġcourse Schedule Data . substring After (" (" ). substring Before (" )") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiods Ġ= Ġparse Periods ( period Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdays Ġ= Ġparse Days ( day Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponents [ 1 ] Ġ= Ġcomponents [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring After (" )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring After (",", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcourses . add ( Course ( course Id , Ġname , Ġperiods , Ġdays )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( course Student Map [ course Id ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcourse Student Map [ course Id ] Ġ= Ġ", \" $ course Name \", $ id " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcourse Student Map [ course Id ] Ġ+= Ġ", $ id " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠParses Ġa Ġlist Ġof Ġmod Ġboundaries Ċ Ġ* Ċ Ġ* Ġ@ param Ġperiod Data ĠData Ġpert aining Ġto Ġthe Ġperiod Ċ Ġ* Ġ@ return ĠAn Ġarray Ġof Ġmods Ġduring Ġwhich Ġthe Ġcourse Ġtakes Ġplace Ċ Ġ*/ Ċ private Ġfun Ġparse Periods ( period Data : ĠString ): ĠArray < Int > Ġ{ ĊĠĠĠ Ġreturn ĠarrayOf ( period Data . toInt ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠParses Ġa Ġlist Ġof Ġday Ġboundaries Ċ Ġ* Ċ Ġ* Ġ@ param Ġday Data ĠData Ġpert aining Ġto Ġthe Ġdays Ċ Ġ* Ġ@ return ĠAn Ġarray Ġof Ġb ooleans Ġindicating Ġon Ġwhich Ġdays Ġthe Ġcourse Ġis Ġheld Ċ Ġ*/ Ċ private Ġfun Ġparse Days ( day Data : ĠString ): ĠArray < Boolean > Ġ{ ĊĠĠĠ Ġval Ġdate String Ġ= Ġ" ABC DE " ĊĠĠĠ Ġval Ġdays Ġ= ĠarrayOf ( false , Ġfalse , Ġfalse , Ġfalse , Ġfalse ) ĊĊĠĠĠ Ġfor Ġ( day Ġin Ġday Data . split ("," )) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( day . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdays [ date String . indexOf ( day )] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġday Interval Ġ= Ġday . split ("- ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġdate String . indexOf ( day Interval [ 0 ]) .. date String . indexOf ( day Interval [ 1 ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdays [ x ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġdays Ċ } Ċ Ċ /** Ċ Ġ* ĠPrints Ġout Ġa Ġstudent 's Ġschedule Ġto Ġstudent data . csv Ċ Ġ* Ċ Ġ* Ġ@ param Ġout ĠOutputs Ġto Ġstudent data . csv Ċ Ġ* Ġ@ param Ġcourses ĠThe Ġstudent 's Ġcourses Ċ Ġ*/ Ċ private Ġfun Ġprint Periods ( out : ĠPrintWriter , Ġcourses : ĠCollection < Course >) Ġ{ ĊĠĠĠ Ġfor Ġ( x Ġin Ġ 1 .. 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . print ("$ x , ") ĊĊĠĠĠĠĠĠĠ Ġval Ġappend Courses Ġ= ĠarrayOf ("", Ġ"", Ġ"", Ġ"", Ġ"") ĊĠĠĠĠĠĠĠ Ġfor Ġ( course Ġin Ġcourses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( course . periods . contains ( x )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 .. 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( course . days [ y ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Courses [ y ] Ġ= Ġcourse . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġout . println ( append Courses . join ToString ("," )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġa Ġcourse 's Ġinfo Ċ Ġ* Ċ Ġ* Ġ@ param Ġid ĠThe Ġstudent 's ĠID Ċ Ġ* Ġ@ param Ġcookies ĠCookies Ġassociated Ġwith Ġthe Ġcurrent Ġlogin Ċ Ġ* Ġ@ return ĠThe Ġcourse 's Ġinformation Ċ Ġ*/ Ċ private Ġfun Ġget Course Info ( id : ĠString , Ġcookies : ĠMap < String , ĠString >): ĠDocument ? Ġ{ ĊĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĊĠĠĠ Ġwhile Ġ( count Ġ< Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠJ soup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect (" https :// bca . sch oo logy . com / user /$ id / courses / list ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. method ( Connection . Method . GET ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cookies ( cookies ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Http Errors ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. data (" destination ", Ġ"${ id . substring ( 1 ) }/ info ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" X - Dr upal - Render - Mode ", Ġ" json / pop ups ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrequest . execute () ĊĠĠĠĠĠĠĠ Ġif Ġ( response . statusCode () Ġ== Ġ 2 0 0 Ġ|| Ġresponse . statusCode () Ġ== Ġ 4 2 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġparse Course Info Response ( request , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parsed Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparsed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ("${ ++ count } Ġfailed Ġattempts ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠParses Ġthe Ġresult Ġof Ġa Ġcourse Ġinfo Ġrequest Ġregarding Ġa Ġ 2 0 0 Ġor Ġ 4 2 9 ĠHTML Ġresponse Ċ Ġ* Ċ Ġ* Ġ@ param Ġrequest ĠThe Ġconnection Ġon Ġwhich Ġthe Ġrequest Ġwas Ġmade Ċ Ġ* Ġ@ param Ġresponse ĠThe Ġresponse Ġof Ġthe Ġoriginal Ġrequest Ċ Ġ* Ġ@ return ĠA Ġparsed Ġdocument Ġcontaining Ġcourse Ġinfo Ċ Ġ*/ Ċ private Ġfun Ġparse Course Info Response ( request : ĠConnection , Ġresponse : ĠConnection . Response ): ĠDocument ? Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJ soup . parse ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGson (). fromJson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response . statusCode ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 0 Ġ-> Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 2 9 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 2 5 0 Ġ+ Ġresponse . header (" Retry - After "). to Long ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . execute (). body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠJsonObject :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). get (" content "). asString ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( response . body ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠPrints Ġout Ġa Ġlist Ġof Ġcourses Ġand Ġtheir Ġstudents Ġto Ġcourse data . csv Ċ Ġ* Ċ Ġ* Ġ@ param Ġcourse Student Map ĠA Ġmap Ġof Ġcourses Ġand Ġa Ġcomma Ġseparated Ġlist Ġof Ġits Ġstudents Ċ Ġ*/ Ċ private Ġfun Ġprint Course Members ( course Student Map : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠ ĠPrintWriter ( Path (" course data . csv "). buffered Writer ()). use Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( course Ġin Ġcourse Student Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . println ("${ course . key }${ course . value }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ