package Ġcom . mr kir by 1 5 3 . tg abot . listener Ċ Ċ import Ġcom . google . common . cache . Cache Builder Ċ import Ġcom . mr kir by 1 5 3 . b fs . model . Model Ċ import Ġcom . mr kir by 1 5 3 . tg abot . Bot Ċ import Ġcom . mr kir by 1 5 3 . tg abot . db . models . Poll Category Ċ import Ġcom . mr kir by 1 5 3 . tg abot . db . models . Poll Option Ċ import Ġcom . mr kir by 1 5 3 . tg abot . pol ls . Poll Manager Ċ import Ġnet . dv 8 tion . j da . core . entities . Message Ċ import Ġnet . dv 8 tion . j da . core . events . message . guild . react . Guild Message Reaction Add Event Ċ import Ġnet . dv 8 tion . j da . core . hooks . Listener Adapter Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠPoll Listener Ġ: ĠListener Adapter () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreaction Manager Ġ= ĠRe action Manager () ĊĊĠĠĠĠĠĠĠ Ġval Ġmsg Cache Ġ= ĠCache Builder . newBuilder (). expire After Write ( 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MIN UTES ). build < String , ĠMessage >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Guild Message Reaction Add ( event : ĠGuild Message Reaction Add Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBot . executor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . member . user . id Ġ== Ġevent . guild . self Member . user . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ submit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠModel . where ( Poll Option :: class . java , Ġ" message _ id ", Ġevent . message Id ). get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption Ġ= Ġoptions . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( event . reaction Em ote . is Em ote ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . custom Ġ&& Ġit . reaction Ġ== Ġevent . reaction Em ote . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . reaction Ġ== Ġevent . reaction Em ote . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( option Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBot . logger . info (" No Ġsuitable Ġpoll Ġoption Ġfound Ġfor Ġ${ event . reaction Em ote } Ġin Ġ${ event . channel }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ submit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcategory Ġ= ĠModel . where ( Poll Category :: class . java , Ġ" id ", Ġoption . category ). first () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠPoll Manager . register Vote ( event . user , Ġcategory , Ġoption ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBot . logger . debug (" Registered Ġvote Ġwith Ġid Ġ${ r . id }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Msg Ġ= Ġmsg Cache . get If Present ( event . message Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġcached Msg Ġ?: Ġevent . channel . getMessage ById ( event . message Id ). complete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . reaction Em ote . is Em ote ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaction Manager . remove Reaction ( msg , Ġevent . user , Ġevent . reaction Em ote . em ote ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaction Manager . remove Reaction ( msg , Ġevent . user , Ġevent . reaction Em ote . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Ġ= Ġreaction Manager . pending Re actions ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBot . logger . info (" Remaining Ġon Ġ${ msg . id }: Ġ$ pending ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Ġ>= ĠRe action Manager . threshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBot . logger . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Hit Ġthreshold Ġfor Ġmessage Ġ${ msg . id } Ġclearing Ġand Ġre - adding Ġre actions ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreaction Manager . removeAll Re actions ( msg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoll Manager . add Option Re actions ( category ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }