package Ġcom . car son . commands Ċ Ċ import Ġcom . car son . core . Main Ċ import Ġcom . mongodb . client . model . Filters Ċ import Ġsx . blah . discord . handle . impl . events . guild . channel . message . Message Received Event Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠChain Stack { ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġsingleton Ġ= ĠChain Stack () ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpush ( Context . GLOBAL ,- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Fixed ThreadPool ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( singleton . run ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingleton . pop Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( singleton . run ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingleton . pop Chain () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġpush ( event Ġ: ĠMessage Received Event ) Ġ= Ġsingleton . push ( event ) ĊĠĠĠĠĠĠĠ Ġfun Ġpush ( context Ġ: ĠContext , Ġid Ġ: Long ) Ġ= Ġsingleton . push ( Pair ( context , id )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġrun Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġval Ġmessage Stack Ġ= ĠStack < Message Received Event >() ĊĠĠĠ Ġprivate Ġval Ġchain Stack Ġ= ĠStack < Pair < Context , ĠLong >>() ĊĊĠĠĠ Ġfun Ġpush ( event : ĠMessage Received Event ){ Ġmessage Stack . push ( event ) Ġ} ĊĠĠĠ Ġfun Ġpush ( chain Id Ġ: Pair < Context , Long > ){ Ġchain Stack . push ( chain Id ) Ġ} ĊĠĠĠ Ġfun Ġpop Event (){ ĊĠĠĠĠĠĠĠ Ġif ( message Stack . empty ()) return ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġmessage Stack . pop () ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġevent . message . content ĊĠĠĠĠĠĠĠ Ġ( Chain Cache Ġauthor Ġevent . message . author . long ID )?. feed ( content ) ĊĠĠĠĠĠĠĠ Ġ( Chain Cache Ġchannel Ġevent . channel . long ID )?. feed ( content ) ĊĠĠĠĠĠĠĠ Ġ( Chain Cache Ġguild Ġevent . guild . long ID )?. feed ( content ) ĊĠĠĠĠĠĠĠ Ġ( Chain Cache . global )?. feed ( content ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġpop Chain (){ ĊĠĠĠĠĠĠĠ Ġif ( chain Stack . empty ()) return ĊĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġchain Stack . pop () ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġpair . first ĊĠĠĠĠĠĠĠ Ġif ( context Ġ== ĠContext . UNKNOWN ) throw ĠUnsupportedOperationException (" Can Ġnot Ġpop Ġa Ġchain Ġwith Ġan Ġunknown Ġtype ") ĊĠĠĠĠĠĠĠ Ġif ( context Ġ== ĠContext . GLOBAL Ġ&& ĠChain Cache . global Ġ!= Ġnull ) throw ĠUnsupportedOperationException (" Can Ġnot Ġpop Ġglobal Ġchain Ġas Ġit Ġhas Ġalready Ġbeen Ġcreated ") ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġpair . second ĊĠĠĠĠĠĠĠ Ġval Ġfound Ġ= Ġwhen ( context ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . GLOBAL Ġ-> ĠgetMessage Collection (). find () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠgetMessage Collection (). find ( Filters . all ( context . database Name , Ġid )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchain Ġ= ĠChain () ĊĊĠĠĠĠĠĠĠ Ġfun ĠString . test ( r Ġ:( String ) Ġ-> ĠBoolean ) Ġ= Ġr ( this ) ĊĊĠĠĠĠĠĠĠ Ġfound . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it [" content "] Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! it . get (" content ", String :: class . java ). test Ġ{ Ġstr Ġ-> Ġstr . startsWith (" !") Ġ|| Ġstr . startsWith ( Main . PREFIX )}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain . feed ( it . get (" content ", String :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen ( context ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . GU ILD Ġ-> ĠChain Cache . guild ( id , Ġchain ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . USER Ġ-> ĠChain Cache . author ( id , Ġchain ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . CHANNEL Ġ-> ĠChain Cache . channel ( id , Ġchain ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . GLOBAL Ġ-> ĠChain Cache . global Ġ= Ġchain ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext . UNKNOWN Ġ-> Ġthrow Ġjava . lang . Unsupported OperationException (" Can Ġnot Ġpop Ġa Ġchain Ġwith Ġan Ġunknown Ġtype ") Ġ// can 't Ġcache ... ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Pop ped Ġchain :$ id Ġ$ context ") ĊĠĠĠ Ġ} Ċ }