/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠK aid an ĠG ust ave Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ @ file : Suppress (" Member Visibility Can Be Private ", Ġ" unused ") Ċ package Ġme . kg ust ave . d kt . entities Ċ Ċ // Ċ // ĠI 'd Ġlike Ġto Ġwrite Ġsomething Ġas Ġa Ġfuture Ġnote Ġfor Ġpeople Ġlooking Ċ // Ġto Ġdevelop Ġkotlin - based ĠAPIs Ġwho Ġread Ġthis Ġsource Ġfor Ġideas . Ċ // Ċ // ĠI 'd Ġhighly Ġrecommend Ġyou Ġuse Ġ@ Published Api Ġfor Ġinternal Ġbuild ers Ġand Ċ // Ġprovide Ġbuild ers Ġas Ġparameters Ġfor Ġentities Ġin Ġthe Ġfollowing Ġstyle : Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ // Ġ-------------------------------- -------------- + ------------------------------------------------ -------------- Ċ // Ġbuilder Function Ġ--- + ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġinline Ġfun Ġbuild ( block : ĠEntity . Builder . () Ġ-> ĠUnit ): ĠEntity Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ<| Ġapply Ġto Ġbuilder ĠĠĠĠĠ Ġ| ĠĠĠĠ Ġval Ġbuilder Ġ= ĠEntity . Builder () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠ Ġbuilder . block () Ċ // ĠĠĠĠĠĠ ĠBuilder () Ġ--- + -------+ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠ Ġreturn ĠEntity ( builder ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ} Ċ // ĠBuild Entity ( Builder ) Ġ< -----+ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ċ import Ġme . kg ust ave . d kt . util . require NotBlank Ċ import Ġme . kg ust ave . d kt . util . require Not Long er Ċ import Ġme . kg ust ave . json . JS Object Ċ import Ġme . kg ust ave . json . empty JS Array Ċ import Ġme . kg ust ave . json . empty JS Object Ċ import Ġme . kg ust ave . json . jsonObject Ċ import Ġjava . awt . Color Ċ import Ġjava . time .* Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . time . temporal . Temporal Accessor Ċ Ċ /** Ċ Ġ* Ġ@ author ĠK aid an ĠG ust ave Ċ Ġ*/ Ċ data Ġclass ĠEmbed Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġtitle : ĠString ?, ĊĠĠĠ Ġval Ġurl : ĠString ?, ĊĠĠĠ Ġval Ġauthor : ĠEmbed . Author ?, ĊĠĠĠ Ġval Ġdescription : ĠString ?, ĊĠĠĠ Ġval Ġimage : ĠEmbed . Image ?, ĊĠĠĠ Ġval Ġthumbnail : ĠEmbed . Thumbnail ?, ĊĠĠĠ Ġval Ġfields : ĠList < Embed . Field >, ĊĠĠĠ Ġval Ġtimestamp : ĠOffset DateTime ?, ĊĠĠĠ Ġval Ġfooter : ĠEmbed . Footer ?, ĊĠĠĠ Ġval Ġcolor : ĠColor ?, ĊĊĠĠĠ Ġval Ġtype : ĠEmbed . Type Ġ= ĠType . RIC H , ĊĠĠĠ Ġval Ġvideo : ĠEmbed . Video ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġprovider : ĠEmbed . Provider ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠCurrently Ġwe Ġcentral ize Ġall Ġembed Ġrelated Ġentities Ġin Ġthis ĊĠĠĠ Ġ// Ġfile , Ġmost Ġof Ġwhich Ġare Ġunder Ġthis Ġclass Ġ( IE : ĠEmbed . Author ĊĠĠĠ Ġ// Ġis Ġan Ġinner Ġclass Ġof ĠEmbed ). ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠThis Ġis Ġdone Ġfor Ġa Ġcouple Ġreasons : ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// Ġ 1 ) ĠTo Ġavoid Ġconfusion Ġand Ġin cons ist encies Ġwhen Ġdevelopers ĊĠĠĠ Ġ// ĠĠĠ Ġwant Ġto Ġuse Ġembed s Ġand Ġother Ġembed Ġfunctionality . ĊĠĠĠ Ġ// Ġ 2 ) ĠTo Ġproperly Ġorgan ize Ġchecks Ġfor Ġembed Ġlimits . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠBecause Ġall Ġof Ġthe Ġlimits Ġon Ġtext Ġare Ġsubject Ġto Ġchange ĊĠĠĠ Ġ// Ġand Ġembed s Ġcome Ġin Ġso Ġmany Ġshapes Ġand Ġsizes Ġto Ġbegin Ġwith , ĊĠĠĠ Ġ// Ġit 's Ġpretty Ġmuch Ġa Ġno - br ainer Ġthat Ġwe Ġdon 't Ġbother Ġchecking ĊĠĠĠ Ġ// Ġthe Ġcontent Ġof Ġembed s Ġwe Ġreceive Ġfrom ĠDiscord . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠIf Ġyou Ġwant Ġto Ġknow Ġthe Ġspecific s Ġregarding Ġthese Ġlimits , ĠI Ġrecommend ĊĠĠĠ Ġ// Ġyou Ġread Ġmore Ġhere : ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// Ġhttps :// discord app . com / developers / docs / resources / channel # embed - limits ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġmax Ġcharacter Ġlength Ġa Ġ[ embed Ġtitle ][ Embed . Title . text ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġcan Ġcontain . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCurrently Ġthis Ġis Ġ 2 5 6 Ġcharacters . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ TITLE _ LENGTH Ġ= Ġ 2 5 6 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġmax Ġcharacter Ġlength Ġa Ġ[ embed Ġdescription ][ Embed . description ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġor Ġ[ embed Ġfooter ][ Embed . Footer . text ] Ġcan Ġcontain . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCurrently Ġthis Ġis Ġ 2 0 4 8 Ġcharacters . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ TEXT _ LENGTH Ġ= Ġ 2 0 4 8 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġmax Ġcharacter Ġlength Ġany ĠURL Ġin Ġan Ġ[ Embed ] Ġcan Ġbe . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCurrently Ġthis Ġis Ġ 2 0 0 0 Ġcharacters . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ URL _ LENGTH Ġ= Ġ 2 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġcumulative Ġmax Ġcharacter Ġlength Ġof Ġall Ġtext Ġareas Ġthat Ġan Ġ[ Embed ] Ġcan Ġcontain . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCurrently Ġthis Ġis Ġ 6 0 0 0 Ġcharacters . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ TOTAL _ LENGTH Ġ= Ġ 6 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġmax Ġcharacter Ġlength Ġthat Ġa Ġ[ embed Ġfield ][ Embed . Field . value ] Ġcan Ġcontain . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠCurrently Ġthis Ġis Ġ 1 0 2 4 Ġcharacters . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ FIELD _ VALUE _ LENGTH Ġ= Ġ 1 0 2 4 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ" Zero ĠWidth ĠSpace " Ġcharacter Ġthat Ġcan Ġmake Ġsome Ġembed ĊĠĠĠĠĠĠĠĠ Ġ* Ġtext Ġareas Ġappear Ġempty Ġin Ġthe Ġdiscord Ġinterface . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠZ W SP Ġ= Ġ"\ u 2 0 0 E " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠURL _ REGEX Ġ= ĠRegex ("\\ s *( https ?| attachment ) :// .+ \\ .. { 2 , }\\ s *", ĠRegex Option . IGNORE _ CASE ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRGB _ RANGE Ġget () Ġ= Ġ 0 .. 2 5 5 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠString . ass ure NotEmpty (): ĠString Ġ= Ġif ( isBlank ()) ĠZ W SP Ġelse Ġthis ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcheck Url ( url : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( url Ġ=== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Not Long er ( url , ĠMAX _ URL _ LENGTH , Ġ" URL ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( url Ġmatches ĠURL _ REGEX ) Ġ{ Ġ" URL Ġis Ġnot Ġa Ġvalid Ġembed d able ĠURL " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġconstructor ( builder : ĠEmbed . Builder ): Ġthis ( ĊĠĠĠĠĠĠĠ Ġbuilder . title ?. text , ĊĠĠĠĠĠĠĠ Ġbuilder . title ?. url , ĊĠĠĠĠĠĠĠ Ġbuilder . author , ĊĠĠĠĠĠĠĠ Ġbuilder . content . take If Ġ{ Ġit . isNotBlank () Ġ}, ĊĠĠĠĠĠĠĠ Ġbuilder . image , ĊĠĠĠĠĠĠĠ Ġbuilder . thumbnail , ĊĠĠĠĠĠĠĠ Ġbuilder . fields , ĊĠĠĠĠĠĠĠ Ġbuilder . timestamp , ĊĠĠĠĠĠĠĠ Ġbuilder . footer , ĊĠĠĠĠĠĠĠ Ġbuilder . color ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfields . isEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ=== Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġjson : ĠJS Object Ġby Ġlazy Ġ{ Ġ// ĠConstruct Ġl az ily Ġso Ġwe Ġdon 't Ġhave Ġto Ġreconstruct Ġit Ġfor Ġmultiple Ġcalls ĊĠĠĠĠĠĠĠ Ġval Ġembed Ġ= Ġempty JS Object () ĊĊĠĠĠĠĠĠĠ Ġtitle ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" title "] Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" url "] Ġ= Ġurl ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġauthor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" author "] Ġ= ĠjsonObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġauthor . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor . url ?. let Ġ{ Ġ" url " Ġto Ġauthor . url Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor . icon Url ?. let Ġ{ Ġ" icon _ url " Ġto Ġauthor . icon Url Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdescription ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" description "] Ġ= Ġdescription ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġimage ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" image "] Ġ= ĠjsonObject Ġ{ Ġ" url " Ġto Ġimage . url Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthumbnail ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" thumbnail "] Ġ= ĠjsonObject Ġ{ Ġ" url " Ġto Ġthumbnail . url Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvideo ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" video "] Ġ= ĠjsonObject Ġ{ Ġ" url " Ġto Ġvideo . url Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcolor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" color "] Ġ= Ġ( color . rgb Ġand Ġ 0 x FFFFFF ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtimestamp ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" timestamp "] Ġ= Ġtimestamp . format ( DateTime Formatter . RFC _ 1 1 2 3 _ DATE _ TIME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfooter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" footer "] Ġ= ĠjsonObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" text " Ġto Ġfooter . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter . icon Url ?. let Ġ{ Ġ" icon _ url " Ġto Ġfooter . icon Url Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprovider ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" provider "] Ġ= ĠjsonObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġprovider . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" url " Ġto Ġprovider . url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( fields . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfields Array Ġ= Ġempty JS Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields . forEach Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields Array Ġ+= ĠjsonObject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġfield . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" value " Ġto Ġfield . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" inline " Ġto Ġfield . inline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed [" fields "] Ġ= Ġfields Array ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġembed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Message Dsl ĊĠĠĠ Ġclass ĠBuilder Ġ@ Published Api Ġinternal Ġconstructor (): ĠMessage Dsl Component < Embed . Builder >() Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġfields Ġ= ĠArrayList < Embed . Field >() ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġtitle : ĠEmbed . Title ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġauthor : ĠEmbed . Author ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġimage : ĠEmbed . Image ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġthumbnail : ĠEmbed . Thumbnail ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġfooter : ĠEmbed . Footer ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġvar Ġcolor : ĠColor ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġvar Ġtimestamp : ĠOffset DateTime ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġval Ġlength : ĠInt Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġl Ġ= Ġcontent Builder . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl Ġ+= Ġfields . sum By Ġ{ Ġit . value . length Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ?. text ?. length ?. let Ġ{ Ġl Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthor ?. name ?. length ?. let Ġ{ Ġl Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfooter ?. text ?. length ?. let Ġ{ Ġl Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġl ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontent Builder . isBlank () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields . isEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Ġ=== Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ=== Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġtitle ( text : ĠString ?, Ġurl : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . title Ġ= Ġtext ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotBlank ( text , Ġ" Title ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmbed . Title ( text , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġauthor ( name : ĠString ?, Ġurl : ĠString ? Ġ= Ġnull , Ġicon Url : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Url ( icon Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . author Ġ= Ġname ?. let Ġ{ ĠEmbed . Author ( name , Ġurl , Ġicon Url ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġfield ( name : ĠString , Ġvalue : ĠString , Ġinline : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsanitized Name Ġ= Ġname . ass ure NotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsanitized Value Ġ= Ġvalue . ass ure NotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Not Long er ( sanit ized Name , ĠMAX _ TITLE _ LENGTH , Ġ" Field Ġname ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Not Long er ( sanit ized Value , ĠMAX _ FIELD _ VALUE _ LENGTH , Ġ" Field Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fields Ġ+= ĠEmbed . Field ( sanit ized Name , Ġsanitized Value , Ġinline ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġimage ( url : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . image Ġ= Ġurl ?. let Ġ{ ĠEmbed . Image ( url ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġthumbnail ( url : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . thumbnail Ġ= Ġurl ?. let Ġ{ ĠEmbed . Thumbnail ( url ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġfooter ( text : ĠString ?, Ġicon Url : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( text Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . footer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsanitized Text Ġ= Ġtext . ass ure NotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Not Long er ( sanit ized Text , ĠMAX _ TEXT _ LENGTH , Ġ" Footer Ġtext ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Url ( icon Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . footer Ġ= ĠEmbed . Footer ( sanit ized Text , Ġicon Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġtimestamp ( accessor : ĠTemp oral Accessor ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( accessor Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timestamp Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( accessor Ġis ĠOffset DateTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timestamp Ġ= Ġaccessor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset : ĠZone Offset Ġ= ĠZone Offset . UTC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĠZone Offset . from ( accessor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Ġ= ĠLocalDateTime . from ( accessor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timestamp Ġ= ĠOffset DateTime . of ( local , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠDateTime Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstant Ġ= ĠInstant . from ( accessor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timestamp Ġ= ĠOffset DateTime . of Instant ( instant , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠDateTime Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Unable Ġto Ġget Ġoffset Ġfrom Ġaccessor Ġtype : Ġ${ accessor :: class }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġcolor ( color : ĠColor ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġcolor ( rgb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( Color ( rgb )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġfun Ġcolor ( red : ĠInt , Ġblue : ĠInt , Ġgreen : ĠInt , Ġalpha : ĠInt Ġ= Ġ 2 5 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( red ĠĠ Ġin ĠRGB _ RANGE ) Ġ{ ĠĠ Ġ" Red Ġvalue Ġ$ red Ġoutside Ġof Ġrange Ġ 0 - 2 5 5 " ĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( blue Ġ Ġin ĠRGB _ RANGE ) Ġ{ Ġ Ġ" Blue Ġvalue Ġ$ blue Ġoutside Ġof Ġrange Ġ 0 - 2 5 5 " Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( green Ġin ĠRGB _ RANGE ) Ġ{ Ġ" Green Ġvalue Ġ$ green Ġoutside Ġof Ġrange Ġ 0 - 2 5 5 " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( alpha Ġin ĠRGB _ RANGE ) Ġ{ Ġ" Alpha Ġvalue Ġ$ alpha Ġoutside Ġof Ġrange Ġ 0 - 2 5 5 " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( Color ( red , Ġblue , Ġgreen , Ġalpha )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġtitle ( block : ĠTitle . Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= ĠTitle . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . block () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġrequire NotNull ( title . text ?. take If Ġ{ Ġit . isNotBlank () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġset Ġtitle Ġto Ġblank Ġor Ġnull " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( text , Ġtitle . url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġauthor ( name : ĠString , Ġblock : ĠAuthor . Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAuthor . Builder ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . block () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthor ( builder . name , Ġbuilder . url , Ġbuilder . imageUrl ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġfield ( name : ĠString , Ġinline : ĠBoolean Ġ= Ġtrue , Ġblock : ĠField . Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠField . Builder ( name , Ġinline ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . block () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ( builder . name , Ġbuilder . content , Ġbuilder . inline ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġimage ( block : Ġ() Ġ-> ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage ( block ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġthumbnail ( block : Ġ() Ġ-> ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail ( block ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġfooter ( block : ĠFooter . Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠFooter . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . block () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfooter ( builder . text , Ġbuilder . icon Url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġtimestamp ( block : Ġ() Ġ-> ĠTemp oral Accessor ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp ( block ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġcolor ( block : Ġ() Ġ-> ĠColor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( block ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġcolor RGB ( block : Ġ() Ġ-> ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor ( block ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠSh orthand Ġconverter Ġfor Ġa Ġmasked Ġlink .*/ ĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġoperator Ġfun ĠString . invoke ( link : ĠString ): ĠString Ġ= Ġ" [$ this ]( $ link )" ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck ( cs q : ĠCharSequence ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( length Ġ+ Ġc sq . length Ġ< ĠMAX _ TOTAL _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Embed Ġtotal Ġlength Ġcannot Ġbe Ġgreater Ġthan Ġ$ MAX _ TEXT _ LENGTH Ġcharacters " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( content Builder . length Ġ+ Ġc sq . length Ġ< ĠMAX _ TEXT _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Embed Ġdescription Ġcannot Ġbe Ġlonger Ġthan Ġ$ MAX _ TEXT _ LENGTH Ġcharacters " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠTitle Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġclass ĠBuilder Ġ@ Published Api Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar Ġtext : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar Ġurl : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġtext ( block : Ġ() Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . text Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġurl ( block : Ġ() Ġ-> ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . url Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠField Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġinline : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġclass ĠBuilder Ġ@ Published Api Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar Ġinline : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ): ĠMessage Dsl Component < Field . Builder >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġname ( block : Ġ() Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġinline ( block : Ġ() Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . inline Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠSh orthand Ġconverter Ġfor Ġa Ġmasked Ġlink . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Ġfun ĠString . invoke ( link : ĠString ): ĠString Ġ= Ġ" [$ this ]( $ link )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠAuthor Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠString ?, ĊĠĠĠĠĠĠĠ Ġval Ġicon Url : ĠString ?, ĊĠĠĠĠĠĠĠ Ġval Ġproxy Url : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġproxy Icon Url : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġclass ĠBuilder Ġ@ Published Api Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar Ġurl : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar ĠimageUrl : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġname ( block : Ġ() Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġurl ( block : Ġ() Ġ-> ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . url Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġicon Url ( block : Ġ() Ġ-> ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . imageUrl Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠFooter Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġicon Url : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġproxy Icon Url : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠ Ġclass ĠBuilder Ġ@ Published Api Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar Ġtext : ĠString Ġ= ĠZ W SP , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl Ġvar Ġicon Url : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġtext ( block : Ġ() Ġ-> ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . text Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Message Dsl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinline Ġfun Ġicon Url ( block : Ġ() Ġ-> ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . icon Url Ġ= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠAs Ġup setting Ġas Ġthis Ġis , Ġthere Ġis Ġno Ġguarantee Ġthat ĊĠĠĠ Ġ// Ġan ĠDiscord ĠEmbed ĠImage Ġwill Ġremain Ġthe Ġsame Ġstructure ĊĠĠĠ Ġ// Ġas Ġa ĠDiscord ĠEmbed ĠThumb nail . ĠFor Ġthe Ġsake Ġof Ġcompatibility ĊĠĠĠ Ġ// Ġif Ġone Ġever Ġchanges , ĠI Ġcreated Ġtwo Ġidentical Ġclasses .... ĊĠĠĠ Ġ// Ġ- _- ĊĊĠĠĠ Ġdata Ġclass ĠImage Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġproxy Url : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġheight : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġval Ġwidth : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠThumb nail Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġproxy Url : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġheight : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġval Ġwidth : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠVideo Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġheight : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġval Ġwidth : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠProvider Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠString ? ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġenum Ġclass ĠType ( type : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠIMAGE , ĊĠĠĠĠĠĠĠ ĠV IDE O , ĊĠĠĠĠĠĠĠ ĠLINK , ĊĠĠĠĠĠĠĠ ĠR ICH , ĊĠĠĠĠĠĠĠ ĠUNKNOWN (""); ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtype Ġ?: Ġname . toLowerCase () ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġof ( type : ĠString ): ĠEmbed . Type Ġ= Ġvalues (). first OrNull Ġ{ Ġit . type Ġ== Ġtype Ġ} Ġ?: ĠUNKNOWN ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Message Dsl Ċ inline Ġfun Ġembed ( build : ĠEmbed . Builder . () Ġ-> ĠUnit ): ĠEmbed Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠEmbed . Builder () ĊĠĠĠ Ġbuilder . build () ĊĠĠĠ Ġreturn ĠEmbed ( builder ) Ċ } Ċ