@ file : Suppress (" unused ", Ġ" UNUSED _ PARAMETER ", Ġ" UN CHECK ED _ CAST ") Ċ Ċ package Ġconvergence Ċ Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . util .* Ċ import Ġkotlin . reflect . K Class Ċ Ċ abstract Ġclass ĠProtocol ( val Ġname : ĠString ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠProtocol ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġother . name ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġname . hashCode () Ċ } Ċ Ċ // Int ention ally Ġempty , Ġbecause Ġit Ġmight Ġbe Ġrepresented Ġas Ġan Ġint Ġor Ġa Ġstring Ġor Ġwhatever . Ċ abstract Ġclass ĠUser ( val Ġchat : ĠChat ): ĠJsonConvert ible Ċ Ċ abstract Ġclass ĠChat ( val Ġprotocol : ĠProtocol , Ġval Ġname : ĠString ): ĠJsonConvert ible Ċ Ċ object ĠUniversal User : ĠUser ( Universal Chat ), ĠJsonConvert ible Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoJson () Ġ= Ġ""" {" type ":" Universal User "} """ Ċ } Ċ Ċ object ĠUniversal Protocol : ĠProtocol (" Universal "), ĠJsonConvert ible Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoJson () Ġ= Ġ""" {" type ":" Universal Protocol "} """ Ċ } Ċ Ċ // ĠUsed Ġto Ġrepresent Ġthe Ġuniversal Ġchat . Ċ object ĠUniversal Chat : ĠChat ( Universal Protocol , Ġ" Universal "), ĠJsonConvert ible Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoJson () Ġ= Ġ""" {" type ":" Universal Chat "} """ Ċ } Ċ Ċ object ĠFake Base Interface : ĠBase Interface Ġ{ ĊĠĠĠ Ġoverride Ġval Ġprotocols : ĠList < Protocol > Ġ= ĠlistOf ( Universal Protocol ) ĊĊĠĠĠ Ġoverride Ġfun ĠsendMessage ( chat : ĠChat , Ġmessage : ĠString ): ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġfun Ġget Bot ( chat : ĠChat ): ĠUser Ġ= ĠUniversal User ĊĠĠĠ Ġoverride Ġfun ĠgetName ( chat : ĠChat , Ġuser : ĠUser ): ĠString Ġ= Ġ"" ĊĠĠĠ Ġoverride Ġfun Ġget Ch ats (): ĠList < Chat > Ġ= ĠlistOf ( Universal Chat ) ĊĠĠĠ Ġoverride Ġfun Ġget Users ( chat : ĠChat ): ĠList < User > Ġ= ĠlistOf ( Universal User ) ĊĠĠĠ Ġoverride Ġfun Ġget Chat Name ( chat : ĠChat ): ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġval Ġname : ĠString Ġ= Ġ" Fake Base Interface " Ċ } Ċ Ċ sealed Ġclass ĠCommand Like ( open Ġval Ġchat : ĠChat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Transient Ġopen Ġval Ġhelp Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Transient Ġopen Ġval Ġsyntax Text : ĠString ): ĠJsonConvert ible , ĠComparable < Command Like > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠCommand Like ) Ġ= Ġ"$ chat .$ name ". compareTo ("${ other . chat }.${ other . name }") ĊĊĠĠĠ Ġdata Ġclass ĠCommand ( override Ġval Ġchat : ĠChat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Transient Ġval Ġfunction : Ġ( List < String >, ĠUser ) Ġ-> ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Transient Ġoverride Ġval Ġhelp Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Transient Ġoverride Ġval Ġsyntax Text : ĠString ): ĠCommand Like ( chat , Ġname , Ġhelp Text , Ġsyntax Text ) ĊĊĠĠĠ Ġdata Ġclass ĠAlias ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġchat : ĠChat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand : ĠCommand , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġhelp Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġsyntax Text : ĠString ): ĠCommand Like ( chat , Ġname , Ġhelp Text , Ġsyntax Text ) Ċ } Ċ type alias ĠCommand Ġ= ĠCommand Like . Command Ċ type alias ĠAlias Ġ= ĠCommand Like . Alias ĊĊ Ċ interface ĠJsonConvert ible Ġ{ ĊĠĠĠ Ġfun ĠtoJson (): ĠString Ġ= Ġm oshi . toJson ( this ) Ċ } Ċ Ċ fun ĠMap < String , ĠAny >. json (): ĠString Ġ= Ġm oshi . toJson ( this ) Ċ Ċ interface ĠBase Interface : ĠJsonConvert ible Ġ{ ĊĠĠĠ Ġval Ġname : ĠString ĊĠĠĠ Ġval Ġprotocols : ĠList < Protocol > ĊĠĠĠ Ġfun Ġreceived Message ( chat : ĠChat , Ġmessage : ĠString , Ġsender : ĠUser ) Ġ= Ġrun Command ( message , Ġsender ) ĊĠĠĠ Ġfun ĠsendMessage ( chat : ĠChat , Ġmessage : ĠString ): ĠBoolean ĊĠĠĠ Ġfun Ġget Bot ( chat : ĠChat ): ĠUser ĊĠĠĠ Ġfun ĠgetName ( chat : ĠChat , Ġuser : ĠUser ): ĠString ĊĠĠĠ Ġfun Ġget Ch ats (): ĠList < Chat > ĊĠĠĠ Ġfun Ġget Users ( chat : ĠChat ): ĠList < User > ĊĠĠĠ Ġfun Ġget Chat Name ( chat : ĠChat ): ĠString ĊĠĠĠ Ġoverride Ġfun ĠtoJson () Ġ= Ġmap Of (" type " Ġto Ġname ). json () Ċ } Ċ Ċ private Ġval Ġcallbacks Ġ= ĠHashMap < K Class < out ĠChat Event >, ĠArrayList < Chat Event >>() Ċ Ċ fun Ġregister Callback ( f ct : ĠChat Event ) Ġ{ ĊĠĠĠ Ġcallbacks . put If Absent ( f ct :: class , ĠArrayList ()) ĊĠĠĠ Ġcallbacks [ f ct :: class ]?. add ( f ct ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Tri ed Ġto Ġregister Ġcallback Ġfor Ġun registered Ġclass Ġ${ f ct :: class . simple Name }. ") Ċ } Ċ Ċ fun Ġrun Callbacks ( callback Class : ĠK Class < out ĠChat Event >, Ġvar arg Ġargs : ĠAny ) Ġ= ĊĠĠĠĠĠĠĠ Ġcallbacks [ callback Class ]?. any Ġ{ Ġcallback Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( args ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse Ċ Ċ inline Ġfun Ġ< re ified ĠT : ĠChat Event > Ġrun Callbacks ( var arg Ġargs : ĠAny ) Ġ= Ġrun Callbacks ( T :: class , Ġ* args ) Ċ Ċ /** Ċ Ġ* ĠC uts Ġdown Ġon Ġtype Ġcast s / checks Ġbecause Ġ[ Chat Event . invoke ] Ġtakes Ġvar args Ġof Ġ[ Any ]. Ċ Ġ*/ Ċ fun Ġ< T 1 , ĠT 2 , ĠT 3 , ĠT 4 > Ġinvoke Typed ( f ct : Ġ( T 1 , ĠT 2 , ĠT 3 , ĠT 4 ) Ġ-> ĠBoolean , Ġargs : ĠArray < out ĠAny >, Ġdefault 1 : ĠT 1 ? Ġ= Ġnull , Ġdefault 2 : ĠT 2 ? Ġ= Ġnull , Ġdefault 3 : ĠT 3 ? Ġ= Ġnull , Ġdefault 4 : ĠT 4 ? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhen Ġ( args . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 4 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ 0 , Ġ 1 , Ġ 2 , Ġ 3 Ġ-> Ġthrow ĠIllegalArgumentException (" invoke Typed Ġcalled Ġwith Ġ${ args . size } Ġparameters , Ġbut Ġ 4 Ġexpected ") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlog (" invoke Typed Ġcalled Ġwith Ġ${ args . size } Ġparameters , Ġbut Ġ 4 Ġexpected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġarg 1 Ġ= Ġargs . get OrNull ( 0 ) Ġ?: Ġdefault 1 ĊĠĠĠ Ġval Ġarg 2 Ġ= Ġargs . get OrNull ( 1 ) Ġ?: Ġdefault 2 ĊĠĠĠ Ġval Ġarg 3 Ġ= Ġargs . get OrNull ( 2 ) Ġ?: Ġdefault 3 ĊĠĠĠ Ġval Ġarg 4 Ġ= Ġargs . get OrNull ( 3 ) Ġ?: Ġdefault 4 ĊĊĠĠĠ Ġreturn Ġf ct ( arg 1 Ġas ĠT 1 , Ġarg 2 Ġas ĠT 2 , Ġarg 3 Ġas ĠT 3 , Ġarg 4 Ġas ĠT 4 ) Ċ } Ċ Ċ fun Ġ< T 1 , ĠT 2 , ĠT 3 > Ġinvoke Typed ( f ct : Ġ( T 1 , ĠT 2 , ĠT 3 ) Ġ-> ĠBoolean , Ġargs : ĠArray < out ĠAny >, Ġdefault 1 : ĠT 1 ? Ġ= Ġnull , Ġdefault 2 : ĠT 2 ? Ġ= Ġnull , Ġdefault 3 : ĠT 3 ? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhen Ġ( args . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ 0 , Ġ 1 , Ġ 2 Ġ-> Ġthrow ĠIllegalArgumentException (" invoke Typed Ġcalled Ġwith Ġ${ args . size } Ġparameters , Ġbut Ġ 3 Ġexpected ") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlog (" invoke Typed Ġcalled Ġwith Ġ${ args . size } Ġparameters , Ġbut Ġ 3 Ġexpected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġarg 1 Ġ= Ġargs . get OrNull ( 0 ) Ġ?: Ġdefault 1 ĊĠĠĠ Ġval Ġarg 2 Ġ= Ġargs . get OrNull ( 1 ) Ġ?: Ġdefault 2 ĊĠĠĠ Ġval Ġarg 3 Ġ= Ġargs . get OrNull ( 2 ) Ġ?: Ġdefault 3 ĊĊĠĠĠ Ġreturn Ġf ct ( arg 1 Ġas ĠT 1 , Ġarg 2 Ġas ĠT 2 , Ġarg 3 Ġas ĠT 3 ) Ċ } Ċ Ċ fun Ġ< T 1 , ĠT 2 > Ġinvoke Typed ( f ct : Ġ( T 1 , ĠT 2 ) Ġ-> ĠBoolean , Ġargs : ĠArray < out ĠAny >, Ġdefault 1 : ĠT 1 ? Ġ= Ġnull , Ġdefault 2 : ĠT 2 ? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhen Ġ( args . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ 0 , Ġ 1 Ġ-> Ġthrow ĠIllegalArgumentException (" invoke Typed Ġcalled Ġwith Ġ${ args . size } Ġparameters , Ġbut Ġ 2 Ġexpected ") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlog (" invoke Typed Ġcalled Ġwith Ġ${ args . size } Ġparameters , Ġbut Ġ 2 Ġexpected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġarg 1 Ġ= Ġargs . get OrNull ( 0 ) Ġ?: Ġdefault 1 ĊĠĠĠ Ġval Ġarg 2 Ġ= Ġargs . get OrNull ( 1 ) Ġ?: Ġdefault 2 ĊĊĠĠĠ Ġreturn Ġf ct ( arg 1 Ġas ĠT 1 , Ġarg 2 Ġas ĠT 2 ) Ċ } Ċ Ċ fun Ġ< T 1 > Ġinvoke Typed ( f ct : Ġ( T 1 ) Ġ-> ĠBoolean , Ġargs : ĠArray < out ĠAny >, Ġdefault 1 : ĠT 1 ? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhen Ġ( args . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġthrow ĠIllegalArgumentException (" invoke Typed Ġcalled Ġwith Ġ${ args . size } Ġparameters , Ġbut Ġ 1 Ġexpected ") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlog (" invoke Typed Ġcalled Ġwith Ġ${ args . size } Ġparameters , Ġbut Ġ 1 Ġexpected ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġarg 1 Ġ= Ġargs . get OrNull ( 0 ) Ġ?: Ġdefault 1 ĊĊĠĠĠ Ġreturn Ġf ct ( arg 1 Ġas ĠT 1 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġset Ġof Ġclasses Ġthat Ġprotocols Ġcan Ġimplement Ġfor Ġadditional Ġfunctionality . Ċ Ġ* ĠEach Ġinterface Ġalso Ġmay Ġcontain Ġclasses Ġwhich Ġextend Ġthis Ġin Ġorder Ġto Ġact Ġas Ġcallbacks . Ċ Ġ*/ Ċ interface ĠChat Event Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCallback Ġfunctionality ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( var arg Ġargs : ĠAny ): ĠBoolean Ċ } Ċ Ċ class ĠChanged Nick name ( val Ġf ct : Ġ( chat : ĠChat , Ġuser : ĠUser , Ġold Name : ĠString ) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ) Ġ= Ġinvoke Typed ( f ct , Ġargs ) ĊĠĠĠ Ġfun Ġinvoke ( chat : ĠChat , Ġuser : ĠUser , Ġold Name : ĠString ) Ġ= Ġf ct ( chat , Ġuser , Ġold Name ) Ċ } Ċ Ċ interface ĠHas Nick names Ġ{ ĊĠĠĠ Ġfun ĠgetUser Nick name ( chat : ĠChat , Ġuser : ĠUser ): ĠString ? ĊĠĠĠ Ġfun Ġget Bot Nick name ( chat : ĠChat ): ĠString ? ĊĊĠĠĠ Ġfun Ġchanged Nick name ( chat : ĠChat , Ġuser : ĠUser , Ġold Name : ĠString ) Ġ= Ġrun Callbacks < Changed Nick name >( chat , Ġuser , Ġold Name ) Ċ } Ċ Ċ open Ġclass ĠImage Ċ class ĠReceived Image ( val Ġf ct : Ġ( chat : ĠChat , Ġimage : ĠImage , Ġsender : ĠUser , Ġmessage : ĠString ?) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ): ĠBoolean Ġ= Ġinvoke Typed ( f ct , Ġargs , Ġdefault 4 Ġ= Ġ"") ĊĠĠĠ Ġfun Ġinvoke ( chat : ĠChat , Ġimage : ĠImage , Ġsender : ĠUser , Ġmessage : ĠString ?): ĠBoolean Ġ= Ġf ct ( chat , Ġimage , Ġsender , Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"") Ċ } Ċ Ċ interface ĠHas Images Ġ{ ĊĠĠĠ Ġfun Ġsend Image ( chat : ĠChat , Ġimage : ĠImage , Ġsender : ĠUser , Ġmessage : ĠString ) ĊĠĠĠ Ġfun Ġreceived Image ( chat : ĠChat , Ġimage : ĠImage , Ġsender : ĠUser , Ġmessage : ĠString ) Ġ= Ġrun Callbacks < Received Image >( chat , Ġimage , Ġsender , Ġmessage ) Ċ } Ċ Ċ class ĠEdit Message ( val Ġf ct : Ġ( old Message : ĠString , Ġsender : ĠUser , Ġnew Message : ĠString ) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ): ĠBoolean Ġ= Ġinvoke Typed ( f ct , Ġargs ) ĊĠĠĠ Ġfun Ġinvoke ( old Message : ĠString , Ġsender : ĠUser , Ġnew Message : ĠString ): ĠBoolean Ġ= Ġf ct ( old Message , Ġsender , Ġnew Message ) Ċ } Ċ Ċ interface ĠCan Edit Other Messages Ġ{ ĊĠĠĠ Ġfun Ġedit Message ( message : ĠMessage History , Ġold Message : ĠString , Ġsender : ĠUser , Ġnew Message : ĠString ) ĊĊĊĠĠĠ Ġfun Ġedited Message ( old Message : ĠString , Ġsender : ĠUser , Ġnew Message : ĠString ) Ġ= Ġrun Callbacks < Edit Message >( old Message , Ġsender , Ġnew Message ) Ċ } Ċ Ċ abstract Ġclass ĠMessage History ( var Ġmessage : ĠString , Ġval Ġtimestamp : ĠOffset DateTime , Ġval Ġsender : ĠUser ): ĠJsonConvert ible Ċ interface ĠHas Message History Ġ{ ĊĠĠĠ Ġfun Ġget Messages ( chat : ĠChat , Ġsince : ĠOffset DateTime ? Ġ= Ġnull , Ġuntil : ĠOffset DateTime ? Ġ= Ġnull ): ĠList < Message History > ĊĠĠĠ Ġfun ĠgetUser Messages ( chat : ĠChat , Ġuser : ĠUser , Ġsince : ĠOffset DateTime ? Ġ= Ġnull , Ġuntil : ĠOffset DateTime ? Ġ= Ġnull ): ĠList < Message History > Ċ } Ċ Ċ abstract Ġclass ĠM ention ed User ( val Ġf ct : Ġ( chat : ĠChat , Ġmessage : ĠString , Ġusers : ĠSet < User >) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ) Ġ= Ġinvoke Typed ( f ct , Ġargs ) ĊĠĠĠ Ġfun Ġinvoke ( chat : ĠChat , Ġmessage : ĠString , Ġusers : ĠSet < User >) Ġ= Ġf ct ( chat , Ġmessage , Ġusers ) Ċ } Ċ Ċ interface ĠCan Mention Users Ġ{ ĊĠĠĠ Ġfun Ġmention ( chat : ĠChat , Ġuser : ĠUser , Ġmessage : ĠString ?) ĊĠĠĠ Ġfun Ġmention ( chat : ĠChat , Ġuser : ĠUser ) Ġ= Ġmention ( chat , Ġuser , Ġnull ) ĊĠĠĠ Ġfun Ġmentioned Users ( chat : ĠChat , Ġmessage : ĠString , Ġusers : ĠSet < User >) Ġ= Ġrun Callbacks < Mention ed User >( chat , Ġmessage , Ġusers ) Ċ } Ċ Ċ class ĠStarted Typing ( val Ġf ct : Ġ( chat : ĠChat , Ġuser : ĠUser ) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ): ĠBoolean Ġ= Ġinvoke Typed ( f ct , Ġargs ) ĊĠĠĠ Ġfun Ġinvoke ( chat : ĠChat , Ġuser : ĠUser ): ĠBoolean Ġ= Ġf ct ( chat , Ġuser ) Ċ } Ċ Ċ class ĠSto pped Typing ( val Ġf ct : Ġ( chat : ĠChat , Ġuser : ĠUser ) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ): ĠBoolean Ġ= Ġinvoke Typed ( f ct , Ġargs ) ĊĠĠĠ Ġfun Ġinvoke ( chat : ĠChat , Ġuser : ĠUser ): ĠBoolean Ġ= Ġf ct ( chat , Ġuser ) Ċ } Ċ Ċ interface ĠHas Typing Status Ġ{ ĊĠĠĠ Ġfun Ġset Bot Typing Status ( chat : ĠChat , Ġstatus : ĠBoolean ) ĊĠĠĠ Ġfun Ġstarted Typing ( chat : ĠChat , Ġuser : ĠUser ) Ġ= Ġrun Callbacks < Started Typing >( chat , Ġuser ) ĊĠĠĠ Ġfun Ġstopped Typing ( chat : ĠChat , Ġuser : ĠUser ) Ġ= Ġrun Callbacks < Stopped Typing >( chat , Ġuser ) Ċ } Ċ Ċ open Ġclass ĠSt icker ( val Ġname : ĠString , Ġval ĠURL : ĠString ?) Ċ class ĠReceived St icker ( val Ġf ct : Ġ( chat : ĠChat , Ġst icker : ĠSt icker , Ġuser : ĠUser ) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ): ĠBoolean Ġ= Ġinvoke Typed ( f ct , Ġargs ) ĊĠĠĠ Ġfun Ġinvoke ( chat : ĠChat , Ġst icker : ĠSt icker , Ġuser : ĠUser ): ĠBoolean Ġ= Ġf ct ( chat , Ġst icker , Ġuser ) Ċ } Ċ Ċ interface ĠHas Stick ers Ġ{ ĊĠĠĠ Ġfun Ġsend St icker ( chat : ĠChat , Ġst icker : ĠSt icker ) ĊĠĠĠ Ġfun Ġreceived St icker ( chat : ĠChat , Ġst icker : ĠSt icker , Ġsender : ĠUser ) Ġ= Ġrun Callbacks < Received St icker >( chat , Ġst icker , Ġsender ) Ċ } Ċ Ċ interface ĠHas User Status Ġ{ Ġ// ĠLike Ġyour Ġstatus Ġon ĠSk ype . ĊĠĠĠ Ġfun Ġset Bot Status ( chat : ĠChat , Ġstatus : ĠString ) ĊĠĠĠ Ġfun ĠgetUser Status ( chat : ĠChat , Ġuser : ĠUser ): ĠString Ċ } Ċ Ċ open Ġclass ĠAvailability ( val Ġdescription : ĠString ) Ċ class ĠChanged Availability ( val Ġf ct : Ġ( chat : ĠChat , Ġuser : ĠUser , Ġavailability : ĠAvailability ) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ): ĠBoolean Ġ= Ġinvoke Typed ( f ct , Ġargs ) ĊĠĠĠ Ġfun Ġinvoke ( chat : ĠChat , Ġuser : ĠUser , Ġavailability : ĠAvailability ): ĠBoolean Ġ= Ġf ct ( chat , Ġuser , Ġavailability ) Ċ } Ċ Ċ interface ĠHas User Availability Ġ{ ĊĠĠĠ Ġfun Ġset Bot Availability ( chat : ĠChat , Ġavailability : ĠAvailability ) ĊĠĠĠ Ġfun ĠgetUser Availability ( chat : ĠChat , Ġuser : ĠUser ): ĠAvailability ĊĠĠĠ Ġfun Ġchanged Availability ( chat : ĠChat , Ġuser : ĠUser , Ġavailability : ĠAvailability ) Ġ= Ġrun Callbacks < Changed Availability >( chat , Ġuser , Ġavailability ) Ċ } Ċ Ċ class ĠRead ByUser ( val Ġf ct : Ġ( chat : ĠChat , Ġmessage : ĠMessage History , Ġuser : ĠUser ) Ġ-> ĠBoolean ): ĠChat Event Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( var arg Ġargs : ĠAny ): ĠBoolean Ġ= Ġinvoke Typed ( f ct , Ġargs ) ĊĠĠĠ Ġfun Ġinvoke ( chat : ĠChat , Ġmessage : ĠMessage History , Ġuser : ĠUser ): ĠBoolean Ġ= Ġf ct ( chat , Ġmessage , Ġuser ) Ċ } Ċ Ċ interface ĠHas Read Status Ġ{ ĊĠĠĠ Ġfun Ġget Read Status ( chat : ĠChat , Ġmessage : ĠMessage History ): ĠSet < User > ĊĠĠĠ Ġfun Ġset Read ( chat : ĠChat , Ġmessage : ĠMessage History , Ġuser : ĠUser ) ĊĠĠĠ Ġfun Ġread ByUser ( chat : ĠChat , Ġmessage : ĠMessage History , Ġuser : ĠUser ) Ġ= Ġrun Callbacks < Read ByUser >( chat , Ġmessage , Ġuser ) Ċ } Ċ Ċ // ĠIf Ġpossible , Ġthe Ġname Ġwould Ġbe Ġan Ġenum Ġinstead , Ġbut ĠI Ġwant Ġthe Ġability Ġfor Ġprotocols Ġto Ġadd Ġextra Ġformats Ċ // Ġbeyond Ġthe Ġdefaults Ġin Ġthe Ġcompanion Ġobject , Ġso Ġit 's Ġan Ġopen Ġclass . Ċ open Ġclass ĠFormat ( name : ĠString ): ĠJsonConvert ible Ġ{ ĊĠĠĠ Ġval Ġname : ĠString Ġ= Ġname . uppercase ( Locale . getDefault ()) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbold Ġ= ĠFormat (" BOLD ") ĊĠĠĠĠĠĠĠ Ġval Ġit al ics Ġ= ĠFormat (" ITAL ICS ") ĊĠĠĠĠĠĠĠ Ġval Ġunderline Ġ= ĠFormat (" UNDER LINE ") ĊĠĠĠĠĠĠĠ Ġval Ġmonospace Ġ= ĠFormat (" MON O SPACE ") ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= ĠFormat (" CODE ") ĊĠĠĠĠĠĠĠ Ġval Ġstrike through Ġ= ĠFormat (" STR IK ETH ROUGH ") ĊĠĠĠĠĠĠĠ Ġval Ġspo iler Ġ= ĠFormat (" S PO IL ER ") ĊĠĠĠĠĠĠĠ Ġval Ġgre ent ext Ġ= ĠFormat (" GRE ENT EXT ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoJson () Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" type " Ġto Ġ" Format ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" name " Ġto Ġname ĊĠĠĠ Ġ). json () Ċ } Ċ Ċ interface ĠCan Format Messages Ġ{ ĊĊĠĠĠ Ġval Ġsupported Formats : ĠSet < Format > ĊĊĠĠĠ Ġfun Ġget Delimit ers ( format : ĠFormat ): ĠPair < String , ĠString >? ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefault Formats Ġ= Ġmutable Set Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . bold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . ital ics , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . underline , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . mono space , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . strikethrough , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . spo iler , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . gre ent ext ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠCustom Emoji ( open Ġval Ġname : ĠString , Ġval ĠURL : ĠString ?): ĠJsonConvert ible Ċ interface ĠHas Custom Emoji Ġ{ ĊĠĠĠ Ġfun Ġget E moj is ( chat : ĠChat ): ĠList < Custom Emoji > Ċ } Ċ