package Ġnet . server pe on . discord . internal . data . event Ċ Ċ import Ġcom . google . common . cache . Cache Builder Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġcom . google . common . collect . Immutable Map Ċ import Ġcom . google . common . event bus . EventBus Ċ import Ġnet . server pe on . discord . event . Event Ċ import Ġnet . server pe on . discord . internal . data . model . Discord Node Ċ import Ġnet . server pe on . discord . internal . data . model . Message Node Ċ import Ġnet . server pe on . discord . internal . json models . Message Model Ċ import Ġnet . server pe on . discord . internal . ws . client . Discord Websocket Ċ import Ġnet . server pe on . discord . internal . ws . client . Event Wrapper Ċ import Ġnet . server pe on . discord . internal . ws . data . inbound . Channels Ċ import Ġnet . server pe on . discord . internal . ws . data . inbound . Guild s Ċ import Ġnet . server pe on . discord . internal . ws . data . inbound . Messages Ċ import Ġnet . server pe on . discord . internal . ws . data . inbound . Misc Ċ import Ġnet . server pe on . discord . model . Channel Ċ import Ġnet . server pe on . discord . model . Discord Id Ċ import Ġnet . server pe on . discord . model . Posted Message Ċ import Ġrx . Observable Ċ import Ġrx . functions . Action 2 Ċ import Ġrx . schedul ers . Schedulers Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ internal Ġclass ĠEvent Publisher ( val Ġevent Bus : ĠEvent Bus ) Ġ: ĠAction 2 < Event Wrapper , ĠDiscord Node > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġscheduler Ġ= ĠS chedulers . computation () ĊĊĠĠĠ Ġprivate Ġval Ġtransformer Map Ġ= Ġbuild Transform ers Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Cache Ġ= ĠCache Builder . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. expire After Write ( 5 , ĠTimeUnit . SECONDS ) Ġ// ĠAllow Ġfor Ġ 5 Ġsecond Ġdelay Ġfor Ġembed Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build < Discord Id < Posted Message >, ĠPost ed Message >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Message And Cache ( msg : ĠMessage Model , Ġmodel : ĠDiscord Node ): ĠMessage Node Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMessage Node . create ( msg , Ġmodel ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Cache . put ( id , Ġthis ) Ġ// ĠCache Ġthe Ġmessage Ġfor Ġpotential ĠEmbed Ġupdates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠChannels ĊĠĠĠĠĠĠĠ Ġmap Simple < Channels . Create . Public > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel Create Public ( model . channel Map [ event . channel . id ] !! Ġas ĠChannel . Public ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Channels . Create . Private > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel Create Private ( model . channel Map [ event . channel . id ] !! Ġas ĠChannel . Private ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Channels . Update > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel Update ( model . channel Map [ event . channel . id ] !! Ġas ĠChannel . Public ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Channels . Delete . Public > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel Delete Public ( event . value !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Channels . Delete . Private > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChannel Delete Private ( event . value !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠB ans ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . B ans . Add > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB an Added ( model . guild Map [ event . guild _ id ] !! , Ġmodel . user Cache . retrieve ( event . user )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . B ans . Remove > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠB an Removed ( model . guild Map [ event . guild _ id ] !! , Ġmodel . user Cache . retrieve ( event . user )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGuild s ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . General . Create > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGuild Create ( model . guild Map [ event . guild . id ] !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . General . Delete > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGuild Delete ( event . value !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . General . Update > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGuild Update ( model . guild Map [ event . guild . id ] !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMembers ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . Members . Add > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMember Joined ( model . guild Map [ event . member . guild _ id ] !!. member Map [ event . member . user . id ] !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . Members . Update > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMember Update ( model . guild Map [ event . member . guild _ id ] !!. member Map [ event . member . user . id ] !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap < Guild s . Members . Remove > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMember Ġmight Ġnot Ġexist Ġin Ġmodel Ġ: | ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( Member Left ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠObservable . empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMessages ĊĠĠĠĠĠĠĠ Ġmap Simple < Messages . Create > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Created ( create Message And Cache ( event . msg , Ġmodel )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap < Messages . Update > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . msg . content Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRegular Ġupdate , Ġuser - triggered ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( Message Edited ( create Message And Cache ( event . msg . to Message Model (), Ġmodel ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise Ġautomated Ġembed Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ-> ĠRetrieve Ġthe Ġmessage Ġfrom Ġthe Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Cache . get If Present ( event . msg . id )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( Message Embed ( it , ĠImmutableList . of ( event . msg . embed s ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠObservable . empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Messages . Delete > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Deleted ( model . channel Map [ event . channel _ id ] !! Ġas ĠChannel . Text , Ġevent . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRoles ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . Roles . Create > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild Ġ= Ġmodel . guild Map [ event . guild _ id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRole Added ( guild . role Map [ event . role . id ] !! , Ġguild ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . Roles . Update > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild Ġ= Ġmodel . guild Map [ event . guild _ id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRole Edited ( guild . role Map [ event . role . id ] !! , Ġguild ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Guild s . Roles . Delete > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild Ġ= Ġmodel . guild Map [ event . guild _ id ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRole Deleted ( event . value !! , Ġguild ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmap Simple < Misc . Ready > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModel Ready ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Simple < Discord Websocket . Members Ready > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMembers Loaded ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcall ( event Holder : ĠEvent Wrapper , Ġmodel : ĠDiscord Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtransformer Map [ event Holder . event . java Class ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Event ( it ( event Holder , Ġmodel )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Event ( event Data : ĠObservable <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Data . subscribe On ( scheduler ). subscribe Ġ{ Ġevent Bus . post ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠDSL Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġbuilder Ġ= ĠImmutableMap . builder < Class <* >, Ġ( Event Wrapper , ĠDiscord Node ) Ġ-> ĠObservable < out ĠEvent >>() ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġmap ( no inline Ġcreator : Ġ( T , ĠDiscord Node ) Ġ-> ĠObservable < out ĠEvent >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . put ( T :: class . java , Ġ{ Ġwrapper , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreator ( wrapper . event Ġas ĠT , Ġmodel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > Ġmap Simple ( no inline Ġcreator : Ġ( T , ĠDiscord Node ) Ġ-> ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap < T > Ġ{ Ġevent , Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( creator ( event , Ġmodel )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbuild Transform ers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit : ĠDSL . () Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ): ĠMap < Class <* >, Ġ( Event Wrapper , ĠDiscord Node ) Ġ-> ĠObservable < out ĠEvent >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd sl Ġ= ĠDSL () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl . init () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġd sl . builder . build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }