package org.openrs2.protocol import com.google.inject.AbstractModule import com.google.inject.PrivateModule import com.google.inject.TypeLiteral import com.google.inject.multibindings.Multibinder import org.openrs2.buffer.BufferModule import org.openrs2.crypto.CryptoModule import org.openrs2.protocol.create.downstream.CannotCreateAtThisTimeCodec import org.openrs2.protocol.create.downstream.CountryInvalidCodec import org.openrs2.protocol.create.downstream.CreateClientOutOfDateCodec import org.openrs2.protocol.create.downstream.CreateDownstream import org.openrs2.protocol.create.downstream.CreateIpLimitCodec import org.openrs2.protocol.create.downstream.CreateOkCodec import org.openrs2.protocol.create.downstream.CreateServerFullCodec import org.openrs2.protocol.create.downstream.CreateServerOfflineCodec import org.openrs2.protocol.create.downstream.DateOfBirthFutureCodec import org.openrs2.protocol.create.downstream.DateOfBirthInvalidCodec import org.openrs2.protocol.create.downstream.DateOfBirthLastYearCodec import org.openrs2.protocol.create.downstream.DateOfBirthThisYearCodec import org.openrs2.protocol.create.downstream.EmailInvalid1Codec import org.openrs2.protocol.create.downstream.EmailInvalid2Codec import org.openrs2.protocol.create.downstream.EmailInvalidCodec import org.openrs2.protocol.create.downstream.NameInvalidCodec import org.openrs2.protocol.create.downstream.NameSuggestionsCodec import org.openrs2.protocol.create.downstream.NameUnavailableCodec import org.openrs2.protocol.create.downstream.PasswordGuessable1Codec import org.openrs2.protocol.create.downstream.PasswordGuessableCodec import org.openrs2.protocol.create.downstream.PasswordInvalidCharsCodec import org.openrs2.protocol.create.downstream.PasswordInvalidLengthCodec import org.openrs2.protocol.create.downstream.PasswordSimilarToName1Codec import org.openrs2.protocol.create.downstream.PasswordSimilarToName2Codec import org.openrs2.protocol.create.downstream.PasswordSimilarToNameCodec import org.openrs2.protocol.js5.downstream.Js5ClientOutOfDateCodec import org.openrs2.protocol.js5.downstream.Js5IpLimitCodec import org.openrs2.protocol.js5.downstream.Js5OkCodec import org.openrs2.protocol.js5.downstream.Js5RemoteDownstream import org.openrs2.protocol.js5.downstream.Js5ServerFullCodec import org.openrs2.protocol.login.downstream.BadSessionIdCodec import org.openrs2.protocol.login.downstream.BannedCodec import org.openrs2.protocol.login.downstream.ClientMembersOnlyCodec import org.openrs2.protocol.login.downstream.ClientOutOfDateCodec import org.openrs2.protocol.login.downstream.DisallowedByScriptCodec import org.openrs2.protocol.login.downstream.DuplicateCodec import org.openrs2.protocol.login.downstream.ExchangeSessionKeyCodec import org.openrs2.protocol.login.downstream.ForcePasswordChangeCodec import org.openrs2.protocol.login.downstream.FullscreenMembersOnlyCodec import org.openrs2.protocol.login.downstream.HopBlockedCodec import org.openrs2.protocol.login.downstream.InvalidLoginPacketCodec import org.openrs2.protocol.login.downstream.InvalidLoginServerCodec import org.openrs2.protocol.login.downstream.InvalidSaveCodec import org.openrs2.protocol.login.downstream.InvalidUsernameOrPasswordCodec import org.openrs2.protocol.login.downstream.IpBlockedCodec import org.openrs2.protocol.login.downstream.IpLimitCodec import org.openrs2.protocol.login.downstream.LockedCodec import org.openrs2.protocol.login.downstream.LoginDownstream import org.openrs2.protocol.login.downstream.LoginServerLoadErrorCodec import org.openrs2.protocol.login.downstream.LoginServerOfflineCodec import org.openrs2.protocol.login.downstream.MapMembersOnlyCodec import org.openrs2.protocol.login.downstream.NeedMembersAccountCodec import org.openrs2.protocol.login.downstream.NoReplyFromLoginServerCodec import org.openrs2.protocol.login.downstream.ReconnectOkCodec import org.openrs2.protocol.login.downstream.ServerFullCodec import org.openrs2.protocol.login.downstream.ServiceUnavailableCodec import org.openrs2.protocol.login.downstream.ShowVideoAdCodec import org.openrs2.protocol.login.downstream.SwitchWorldCodec import org.openrs2.protocol.login.downstream.TooManyAttemptsCodec import org.openrs2.protocol.login.downstream.UnknownReplyFromLoginServerCodec import org.openrs2.protocol.login.downstream.UpdateInProgressCodec import org.openrs2.protocol.login.upstream.CheckWorldSuitabilityCodec import org.openrs2.protocol.login.upstream.CreateAccountCodec import org.openrs2.protocol.login.upstream.CreateCheckDateOfBirthCountryCodec import org.openrs2.protocol.login.upstream.CreateCheckNameCodec import org.openrs2.protocol.login.upstream.GameLoginCodec import org.openrs2.protocol.login.upstream.GameReconnectCodec import org.openrs2.protocol.login.upstream.InitCrossDomainConnectionCodec import org.openrs2.protocol.login.upstream.InitGameConnectionCodec import org.openrs2.protocol.login.upstream.InitJaggrabConnectionCodec import org.openrs2.protocol.login.upstream.InitJs5RemoteConnectionCodec import org.openrs2.protocol.login.upstream.LoginUpstream import org.openrs2.protocol.login.upstream.RequestWorldListCodec import org.openrs2.protocol.world.downstream.WorldListDownstream import org.openrs2.protocol.world.downstream.WorldListResponseCodec public object ProtocolModule : AbstractModule() { public override fun configure() { install(BufferModule) install(CryptoModule) bindProtocol( CreateDownstream::class.java, CreateOkCodec::class.java, CreateServerOfflineCodec::class.java, CreateServerFullCodec::class.java, CreateIpLimitCodec::class.java, DateOfBirthInvalidCodec::class.java, DateOfBirthFutureCodec::class.java, DateOfBirthThisYearCodec::class.java, DateOfBirthLastYearCodec::class.java, CountryInvalidCodec::class.java, NameUnavailableCodec::class.java, NameSuggestionsCodec::class.java, NameInvalidCodec::class.java, PasswordInvalidLengthCodec::class.java, PasswordInvalidCharsCodec::class.java, PasswordGuessableCodec::class.java, PasswordGuessable1Codec::class.java, PasswordSimilarToNameCodec::class.java, PasswordSimilarToName1Codec::class.java, PasswordSimilarToName2Codec::class.java, CreateClientOutOfDateCodec::class.java, CannotCreateAtThisTimeCodec::class.java, EmailInvalidCodec::class.java, EmailInvalid1Codec::class.java, EmailInvalid2Codec::class.java ) bindProtocol( Js5RemoteDownstream::class.java, Js5OkCodec::class.java, Js5ClientOutOfDateCodec::class.java, Js5ServerFullCodec::class.java, Js5IpLimitCodec::class.java ) bindProtocol( LoginUpstream::class.java, InitGameConnectionCodec::class.java, InitJs5RemoteConnectionCodec::class.java, GameLoginCodec::class.java, InitJaggrabConnectionCodec::class.java, GameReconnectCodec::class.java, CreateCheckDateOfBirthCountryCodec::class.java, CreateCheckNameCodec::class.java, CreateAccountCodec::class.java, RequestWorldListCodec::class.java, CheckWorldSuitabilityCodec::class.java, InitCrossDomainConnectionCodec::class.java ) bindProtocol( LoginDownstream::class.java, ExchangeSessionKeyCodec::class.java, ShowVideoAdCodec::class.java, InvalidUsernameOrPasswordCodec::class.java, BannedCodec::class.java, DuplicateCodec::class.java, ClientOutOfDateCodec::class.java, ServerFullCodec::class.java, LoginServerOfflineCodec::class.java, IpLimitCodec::class.java, BadSessionIdCodec::class.java, ForcePasswordChangeCodec::class.java, NeedMembersAccountCodec::class.java, InvalidSaveCodec::class.java, UpdateInProgressCodec::class.java, ReconnectOkCodec::class.java, TooManyAttemptsCodec::class.java, MapMembersOnlyCodec::class.java, LockedCodec::class.java, FullscreenMembersOnlyCodec::class.java, InvalidLoginServerCodec::class.java, HopBlockedCodec::class.java, InvalidLoginPacketCodec::class.java, NoReplyFromLoginServerCodec::class.java, LoginServerLoadErrorCodec::class.java, UnknownReplyFromLoginServerCodec::class.java, IpBlockedCodec::class.java, ServiceUnavailableCodec::class.java, DisallowedByScriptCodec::class.java, ClientMembersOnlyCodec::class.java, SwitchWorldCodec::class.java ) bindProtocol( WorldListDownstream::class.java, WorldListResponseCodec::class.java ) } private fun bindProtocol( annotation: Class, vararg codecs: Class> ) { install(object : PrivateModule() { override fun configure() { val binder = Multibinder.newSetBinder(binder(), PACKET_CODEC_TYPE_LITERAL) for (codec in codecs) { binder.addBinding().to(codec) } bind(Protocol::class.java) .annotatedWith(annotation) .to(Protocol::class.java) expose(Protocol::class.java) .annotatedWith(annotation) } }) } private val PACKET_CODEC_TYPE_LITERAL = object : TypeLiteral>() {} }