package Ġtop . ease link . lc g . ui . main . source . remote Ċ Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Array Map Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġorg . js oup . HttpStatus Exception Ċ import Ġorg . js oup . nodes . Document Ċ import Ġorg . js oup . nodes . Element Ċ import Ġorg . js oup . select . Elements Ċ import Ġtim ber . log . Tim ber Ċ import Ġtop . ease link . lc g . config . AppConfig Ċ import Ġtop . ease link . lc g . network . J soup Client Ċ import Ġtop . ease link . lc g . ui . main . model . Block Exception Ċ import Ġtop . ease link . lc g . ui . main . model . Login Required Exception Ċ import Ġtop . ease link . lc g . ui . main . model . Network Exception Ċ import Ġtop . ease link . lc g . ui . main . source . Articles DataSource Ċ import Ġtop . ease link . lc g . ui . main . source . F avorites Remote DataSource Ċ import Ġtop . ease link . lc g . ui . main . source . model .* Ċ import Ġtop . ease link . lc g . utils . Website Constant . ADD _ TO _ FA V OR ITE _ QUERY Ċ import Ġtop . ease link . lc g . utils . Website Constant . FOR UM _ BASE _ QUERY Ċ import Ġjava . net . Socket TimeoutException Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġauthor Ġ: Ġj un zhang Ċ Ġ* Ġdate ĠĠ Ġ: Ġ 2 0 1 9 - 0 7 - 0 4 Ġ 1 6 : 2 2 Ċ Ġ* Ġdesc ĠĠ Ġ: Ċ Ġ*/ Ċ object ĠArticles Remote DataSource Ġ: ĠArticles DataSource , ĠF avorites Remote DataSource Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ NAME Ġ= Ġ" name " ĊĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ AV AT AR Ġ= Ġ" avatar " ĊĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ PROFILE _ URL Ġ= Ġ" profile _ url " ĊĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ EXTRA _ INFO Ġ= Ġ" extra _ info " ĊĠĠĠ Ġprivate Ġconst Ġval ĠFOL LOW _ URL Ġ= Ġ" follow _ url " ĊĠĠĠ Ġprivate Ġconst Ġval ĠFOL LOW _ TITLE Ġ= Ġ" follow _ title " ĊĊĠĠĠ Ġprivate Ġval Ġgson : ĠGson Ġ= ĠGson Builder (). exclude Fields Without Expose Annotation (). create () ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġ@ Throws ( Login Required Exception :: class , ĠSocket TimeoutException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġget Forum Articles ( query : ĠString , Ġprocess Thread List : ĠBoolean ): ĠFor um Page ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Forum Articles Document ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ soup Client . send GetRequest With Query ( query ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Thread List ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġoverride Ġfun Ġget HomePage Articles ( param : ĠString , Ġpage Num : ĠInt ): ĠList < Article > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Articles ("$ FOR UM _ BASE _ QUERY $ param & page =$ pageNum ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Block Exception :: class , ĠHttpStatus Exception :: class ) ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġoverride Ġfun Ġget Post Preview ( query : ĠString ): ĠPreview Post ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget First Post ( J soup Client . send GetRequest With Query ( query )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Exception , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttpStatus Exception Ġ-> Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Block Exception :: class , ĠNetwork Exception :: class ) ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġoverride Ġfun Ġget Article Detail ( query : ĠString ): ĠArticle Detail ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠJ soup Client . send GetRequest With Query ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarticle Abstract : ĠArticle Abstract Response ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . select First (" script ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġit . html (). trim (). replace ("\ u 0 0 a 0 ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ let Ġgson . fromJson ( json , ĠArticle Abstract Response :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġneed Ġto Ġhandle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġdoc . select First (" span # thread _ subject ") ?. text (). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġdoc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getElementById (" mess a get ext ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . nextElement Sibling () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBlock Exception ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Page Url Ġ= Ġdoc . select First (" a . nxt ") ?. attr (" href "). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Add Urls Ġ= Ġget Reply Add Url ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Infos Ġ= ĠgetUser Info ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontents Ġ= Ġget Contents ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Times Ġ= Ġget DateTime ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Urls Ġ= Ġget Reply Urls ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost List : ĠMutable List < Post > Ġ= ĠArrayList ( user Infos . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġuser Infos . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Add Url : ĠString ? Ġ= Ġif Ġ( i Ġ>= Ġreply Add Urls . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreply Add Urls [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Url : ĠString ? Ġ= Ġif Ġ( i Ġ>= Ġreply Urls . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreply Urls [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠPost ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġuser Infos [ i ][ USER _ NAME ]. toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Ġ= Ġuser Infos [ i ][ USER _ AV AT AR ]. toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġdate Times [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġcontents [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreply Url Ġ= Ġreply Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreply Add Url Ġ= Ġreply Add Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Url Ġ= Ġuser Infos [ i ][ USER _ PROFILE _ URL ]. toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Info Ġ= Ġuser Infos [ i ][ USER _ EXTRA _ INFO ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfollow Info Ġ= Ġuser Infos [ i ][ FOLLOW _ TITLE ]?. to ( user Infos [ i ][ FOLLOW _ URL ] Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost List . add ( post ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n pe : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġskip Ġa Ġloop Ġif Ġthere 's Ġany Ġn pe Ġoccurs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v ( n pe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Hash Ġ= Ġdoc . select First (" input [ name = form hash ]") ?. attr (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArticle Detail ( title , Ġpost List , Ġnext Page Url , Ġfrom Hash , Ġarticle Abstract ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmap Ġto ĠNet Work Exception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSocket TimeoutException Ġ-> Ġthrow ĠNetwork Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Exception Ġ-> Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠH OT _ PATTERN Ġ= Ġ" çĥŃåº¦ " ĊĠĠĠ Ġprivate Ġconst Ġval ĠRE COMM ENDED _ PATTERN Ġ= Ġ" è¯Ħ ä»· æĮĩ æķ° " ĊĠĠĠ Ġprivate Ġconst Ġval ĠH OT _ LIMIT Ġ= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠRE COMM ENDED _ LIMIT Ġ= Ġ 1 0 ĊĊĠĠĠ Ġprivate Ġfun Ġget Articles ( query : ĠString ): ĠList < Article > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlist : ĠList < Article > Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= ĠJ soup Client ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. send GetRequest With Query ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. select (" tbody [ id ^ = normal ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Ġ= Ġextract From ( e , Ġ" td . num ", Ġ" a . xi 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. if Blank Ġ{ Ġreturn @ map Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġextract From ( e , Ġ" td . num ", Ġ" em ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. if Blank Ġ{ Ġreturn @ map Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġe . select First (" th . common Ġ> Ġ. x st ") ?. text (). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthor Ġ= Ġextract From ( e , Ġ" td . by ", Ġ" a [ href *= uid ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġextract From ( e , Ġ" td . by ", Ġ" span ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġextract Attr From ( e , Ġ" href ", Ġ" th . common ", Ġ" a . x st ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġe . select First (" td . by Ġ> Ġa [ target ]") ?. text (). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhelp Info Ġ= Ġe . select (" th . common Ġ> Ġspan . xi 1 Ġ> Ġspan . xw 1 ") ?. text (). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhelp Coin Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( help Info . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . select First (" th . common ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . contains ("- Ġ[ å·² è§£åĨ³ ]") Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Coin Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Coin Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Info . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Recommended Ġ= Ġif Ġ( AppConfig . article Show Recommend Flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . select First (" th . common ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getElementsBy Tag (" img ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġit . attr (" title ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . any Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . contains ( HOT _ PATTERN ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . replace ( HOT _ PATTERN , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġit Ġ>= ĠH OT _ LIMIT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . contains ( RE COMM ENDED _ PATTERN ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . replace ( RE COMM ENDED _ PATTERN , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġit Ġ>= ĠRE COMM ENDED _ LIMIT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( title . isNotBlank () Ġ&& Ġauthor . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map ĠArticle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreply , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Coin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Recommended ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Login Required Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġprocess Forum Articles Document ( ĊĠĠĠĠĠĠĠ Ġdoc : ĠDocument , ĊĠĠĠĠĠĠĠ Ġprocess Thread List : ĠBoolean ĊĠĠĠ Ġ): ĠFor um Page ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġelements Ġ= Ġdoc . select (" tbody [ id ^ = normal ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġdoc . getElementById (" message login ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠLogin Required Exception () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarticle List : ĠList < Article > Ġ= Ġelements . map NotNull Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġarticle : ĠArticle ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Ġ= Ġextract From ( element , Ġ" td . num ", Ġ" a . xi 2 "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġextract From ( element , Ġ" td . num ", Ġ" em "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġextract From ( element , Ġ" th . new ", Ġ". x st "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract From ( element , Ġ" th . common ", Ġ". x st ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthor Ġ= Ġextract From ( element , Ġ" td . by ", Ġ" a [ href *= uid ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġextract From ( element , Ġ" td . by ", Ġ" span ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġextract Attr From ( element , Ġ" href ", Ġ" th . new ", Ġ" a . x st "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Attr From ( element , Ġ" href ", Ġ" th . common ", Ġ" a . x st ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġextract From ( element , Ġ" td . by ", Ġ" a [ target ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( title ) Ġ&& Ġ! TextUtils . isEmpty ( author )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Ġ= ĠArticle ( title , Ġauthor , Ġdate , Ġurl , Ġview , Ġreply , Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n be : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . v ( n be ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġthread Ġpart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġthread List : ĠList < Forum Thread >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( process Thread List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . getElementById (" thread _ types ") ?. let Ġ{ Ġthread Types Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread List Ġ= Ġthread Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getElementsBy Tag (" li ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġelement By Tag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġelement By Tag . getElementsBy Tag (" a "). first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelements Ġ= Ġelement . getElementsBy Tag (" span ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elements . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelements . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Url Ġ= Ġelement . attr (" href ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġelement . text (). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( name ) Ġ&& Ġ! TextUtils . isEmpty ( thread Url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull ĠFor um Thread ( name , Ġthread Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġ// Ġdon 't Ġcare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFor um Page ( article List , Ġthread List Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠLogin Required Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract From ( element : ĠElement , Ġvar arg Ġtags : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tags . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġe Ġ= ĠElements ( element ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( tag Ġin Ġtags ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . select ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġe . text () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Attr From ( element : ĠElement , Ġattr : ĠString , Ġvar arg Ġtags : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tags . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġe Ġ= ĠElements ( element ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( tag Ġin Ġtags ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . select ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġe . attr ( attr ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Reply Add Url ( document : ĠDocument ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠMutable List < String > Ġ= ĠArrayList ( 1 2 ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġdocument . getElementById (" recommend _ add ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( e . attr (" href ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġdocument . select (" a . reply add ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( element . attr (" href ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( n pe : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġneed Ġto Ġhandle ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġget Ġuid / avatar / name ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetUser Info ( document : ĠDocument ): ĠList < Map < String , ĠString >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠMutable List < Map < String , ĠString >> Ġ= ĠArrayList ( 1 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġdocument . select (" td [ row span ]") ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserInfo Map : ĠMutable Map < String , ĠString > Ġ= ĠArray Map ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . select (" div . avatar "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Map [ USER _ AV AT AR ] Ġ= Ġselect (" img "). attr (" src ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Map [ USER _ PROFILE _ URL ] Ġ= Ġselect (" a "). attr (" href ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . select First (" a [ id ^ = follow ]") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Map [ FOLLOW _ URL ] Ġ= Ġit . attr (" href ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Map [ FOLLOW _ TITLE ] Ġ= Ġit . attr (" title ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Map [ USER _ EXTRA _ INFO ] Ġ= Ġelement . getElementsBy Tag (" dl "). outer Html () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Map [ USER _ NAME ] Ġ= Ġelement . select (" a . xw 1 "). text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( userInfo Map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget DateTime ( document : ĠDocument ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdocument . select (" div . auth i "). select (" em "). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Block Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget First Post ( document : ĠDocument ): ĠPreview Post Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠdateTime Ġ= Ġdocument ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. select First (" div . auth i ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . select (" em ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġdocument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getElementById (" mess a get ext ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . nextElement Sibling () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBlock Exception ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġget First Content ( document ) ĊĠĠĠĠĠĠĠ Ġvar Ġavatar : ĠString ? ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString ? ĊĠĠĠĠĠĠĠ Ġdocument . select First (" td [ row span ]"). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Ġ= Ġselect First (" div . avatar "). select First (" img "). attr (" src ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġselect First (" a . xw 1 "). text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPreview Post ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Ġ= Ġavatar Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġname Ġ?: Ġ" Unknown ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= ĠdateTime , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġcontent ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget First Content ( doc : ĠDocument ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdoc . select First (" div . pcb ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . select First (" td . t _ f ") ?. let Ġ{ Ġtmp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Content Element ( tmp ). html () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġelement . select First (" div . locked "). html () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Contents ( doc : ĠDocument ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdoc . select (" div . pcb ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To ( ArrayList < String >(), Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . select First (" td . t _ f ") ?. let Ġ{ Ġtmp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Content Element ( tmp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . select (" div . save phot op Ġ> Ġimg ") ?. forEach Ġ{ Ġimg Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . appendChild ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Element . attr (" src ", Ġimg Element . attr (" file ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . html () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġit . select First (" div . locked "). html () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Reply Urls ( doc : ĠDocument ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdoc . getElementsBy Class (" fast re "). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . attr (" href ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Content Element ( element : ĠElement ): ĠElement Ġ{ Ġ// Ġremove Ġpicture Ġtips ĊĠĠĠĠĠĠĠ Ġelement . select (" div . tip "). remove () ĊĠĠĠĠĠĠĠ Ġ// Ġremove Ġuser Ġlevel Ġinfo Ġetc ĊĠĠĠĠĠĠĠ Ġelement . select (" script "). remove () ĊĠĠĠĠĠĠĠ Ġ// Ġconvert Ġall Ġcode ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġelement . getElementsBy Tag (" pre ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġe . html () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("\ r \ n ", Ġ"< br /> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("\ r ", Ġ"< br /> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("\ n ", Ġ"< br /> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" Ġ", Ġ"& nbsp ; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . html ( s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġmove Ġgif Ġfrom Ġfile Ġto Ġsrc ĊĠĠĠĠĠĠĠ Ġval Ġimg Elements Ġ= Ġelement . getElementsBy Tag (" img ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġimg Elements . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Element Ġ= Ġimg Elements [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġimg Element . attr (" src ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src . contains (" https :// static . 5 2 po j ie . cn / static /") Ġ&& Ġ! src . contains (" none ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Element . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattr Ġ= Ġimg Element . attr (" file ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( attr )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Element . attr (" src ", Ġattr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġelement ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġoverride Ġfun Ġadd F avorites ( thread Id : ĠString , Ġform Hash : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJ soup Client . send GetRequest With Query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠADD _ TO _ FA V OR ITE _ QUERY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġform Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSupport Ġuser 's Ġpost ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġpost Ġurl Ġwithout Ġbase _ server _ url ĊĠĠĠĠ Ġ* Ġ@ return Ġstatus Ġmessage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġfun Ġreply Add ( query : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠJ soup Client . send GetRequest With Query ( query ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġdoc . getElementsBy Class (" n fl "). first (). text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }