/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠMel ms ĠMedia ĠLLC Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġgg . octave . bot . listeners Ċ Ċ import Ġgg . octave . bot . Launcher Ċ import Ġgg . octave . bot . db . Options Registry Ċ import Ġnet . dv 8 tion . j da . api . Embed Builder Ċ import Ġnet . dv 8 tion . j da . api . J DA Ċ import Ġnet . dv 8 tion . j da . api . events .* Ċ import Ġnet . dv 8 tion . j da . api . events . guild . Guild Join Event Ċ import Ġnet . dv 8 tion . j da . api . events . guild . Guild Leave Event Ċ import Ġnet . dv 8 tion . j da . api . events . message . guild . Guild Message Received Event Ċ import Ġnet . dv 8 tion . j da . api . hooks . EventListener Ċ import Ġorg . json . JSONObject Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . awt . Color Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠBot Listener Ġ: ĠEvent Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Bot Listener :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Event ( event : ĠGeneric Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGuild Join Event Ġ-> Ġon Guild Join ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGuild Message Received Event Ġ-> Ġon Guild Message Received ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGuild Leave Event Ġ-> Ġon Guild Leave ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStatus ChangeEvent Ġ-> Ġon Status Change ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReady Event Ġ-> Ġon Ready ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRes umed Event Ġ-> Ġon Resume ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRe connected Event Ġ-> Ġon Re connect ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDis connect Event Ġ-> Ġon Disconnect ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠException Event Ġ-> Ġon Exception ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Guild Message Received ( event : ĠGuild Message Received Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . author . is Bot Ġ&& Ġevent . author Ġ=== Ġevent . j da . self User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġguild Options Ġ= ĠOptions Registry . of Guild ( event . guild ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( guild Options . command . is Auto Delete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelete Delay Ġ= Ġguild Options . command . auto Delete Delay . take If Ġ{ Ġit Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠTimeUnit . SECONDS . to Millis ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . message . delete (). queue After ( delete Delay , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Guild Join ( event : ĠGuild Join Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Don 't Ġfire Ġthis Ġif Ġthe ĠSelf Member Ġjoined Ġa Ġlong ish Ġtime Ġago . ĠThis Ġavoids Ġdiscord Ġf uck ups . ĊĠĠĠĠĠĠĠ Ġif Ġ( event . guild . self Member . time Joined . is Before ( Offset DateTime . now (). minus Seconds ( 3 0 ))) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// Find Ġthe Ġfirst Ġchannel Ġwe Ġcan Ġtalk Ġto . ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġevent . guild . text Channels . first OrNull Ġ{ Ġit . can Talk () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// G reet Ġmessage Ġstart . ĊĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= ĠLaunch er . configuration . prefix ĊĠĠĠĠĠĠĠ Ġval Ġembed Builder Ġ= ĠEmbed Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Thumbnail ( event . j da . self User . effective Avatar Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Color . BLUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setDescription (" Welcome Ġto ĠOct ave ! ĠThe Ġhighest Ġquality ĠDiscord Ġmusic Ġbot !\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Please Ġcheck Ġthe Ġlinks Ġbelow Ġto Ġget Ġhelp , Ġand Ġuse Ġ`${ prefix } help ` Ġto Ġget Ġstarted !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addField (" Important ĠLinks ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ Support ĠServer ]( https :// discord . gg / music bot )\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ Website ]( https :// octave . gg ) Ġ\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ Invite ĠLink ]( https :// invite . octave . gg )\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ Pat re on ]( https :// pat re on . com / octave )", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Footer (" Thanks Ġfor Ġusing ĠOct ave !") ĊĊĠĠĠĠĠĠĠ Ġchannel . sendMessage ( embed Builder . build ()). queue Ġ{ Ġit . delete (). queue After ( 1 , ĠTimeUnit . MIN UTES ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . gauge (" octave _ bot . guild s ", ĠLaunch er . shard Manager . guild Cache . size ()) ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . gauge (" octave _ bot . users ", ĠLaunch er . shard Manager . user Cache . size ()) ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . gauge (" octave _ bot . players ", ĠLaunch er . players . size (). to Long ()) ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . increment Counter (" octave _ bot . guild Join ") ĊĠĠĠĠĠĠĠ Ġpost Stats ( event . j da ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Guild Leave ( event : ĠGuild Leave Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLaunch er . players . destroy ( event . guild ) ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . gauge (" octave _ bot . guild s ", ĠLaunch er . shard Manager . guild Cache . size ()) ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . gauge (" octave _ bot . users ", ĠLaunch er . shard Manager . user Cache . size ()) ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . gauge (" octave _ bot . players ", ĠLaunch er . players . size (). to Long ()) ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . increment Counter (" octave _ bot . guild Leave ") ĊĠĠĠĠĠĠĠ Ġpost Stats ( event . j da ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Status Change ( event : ĠStatus ChangeEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . new Status . ordinal Ġ>= ĠJ DA . Status . LOADING _ SUB SYSTEMS . ordinal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Shard Ġ# {} ĠStatus : Ġ{} Ġ-> Ġ{}", Ġevent . j da . shard Info . shard Id , Ġevent . old Status , Ġevent . new Status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpost Stats ( event . j da ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Ready ( event : ĠReady Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . increment Counter (" octave _ bot . shard Ready ") ĊĠĠĠĠĠĠĠ Ġlog . info (" J DA Ġ${ event . j da . shard Info . shard Id } Ġis Ġready .") ĊĠĠĠĠĠĠĠ Ġpost Stats ( event . j da ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Resume ( event : ĠRes umed Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . increment Counter (" octave _ bot . shard Resume ") ĊĠĠĠĠĠĠĠ Ġlog . info (" J DA Ġ${ event . j da . shard Info . shard Id } Ġhas Ġres umed .") ĊĠĠĠĠĠĠĠ Ġpost Stats ( event . j da ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Re connect ( event : ĠRe connected Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . increment Counter (" octave _ bot . shard Re connect ") ĊĠĠĠĠĠĠĠ Ġlog . info (" J DA Ġ${ event . j da . shard Info . shard Id } Ġhas Ġre connected .") ĊĠĠĠĠĠĠĠ Ġpost Stats ( event . j da ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Disconnect ( event : ĠDis connect Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . increment Counter (" octave _ bot . shard Disconnect ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event . is Closed By Server ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" J DA Ġ{} Ġdisconnected Ġ( closed Ġby Ġserver ). ĠCode : Ġ{} Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . j da . shard Info . shard Id , Ġevent . service Close Frame ?. close Code Ġ?: Ġ- 1 , Ġevent . close Code ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" J DA Ġ{} Ġdisconnected . ĠCode : Ġ{} Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . j da . shard Info . shard Id , Ġevent . service Close Frame ?. close Code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- 1 , Ġevent . client Close Frame ?. close Reason Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Exception ( event : ĠException Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLaunch er . datadog . increment Counter (" octave _ bot . exception ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! event . is Logged ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Exception Ġin ĠJ DA Ġ{}", Ġevent . j da . shard Info . shard Id , Ġevent . cause ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Stats ( j da : ĠJ DA ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( j da . status Ġ== ĠJ DA . Status . INITIAL IZED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLaunch er . database . j edis Pool . resource . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . h set (" stats ", Ġj da . shard Info . shard Id . toString (), ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" guild _ count ", Ġj da . guild Cache . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" cached _ users ", Ġj da . user Cache . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" status ", Ġj da . status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put (" ping ", Ġj da . gateway Ping ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ