본문 바로가기
Develop/Android

[Telegram] 안드로이드 텔레그램 API 사용하기(TDLib) - 3 (인증상태 확인)

by 알려 2022. 3. 6.
728x90
반응형

2022.03.05 - [Develop/Android] - [Telegram] 안드로이드 텔레그램 API 사용하기 - 1

2022.03.05 - [Develop/Android] - [Telegram] 안드로이드 텔레그램 API 사용하기 - 2

※Telegram API가 아닌 TDLib(Telegram Database Library) 를 이용한 포스팅입니다. 
혼선을 드린점 양해 부탁드립니다.

이제 API를 이용하여 실제 연동을 시작해보자 

이번에도 하기 링크를 참고하여 작성해 보았다.

https://github.com/indritbashkimi/TelegramExample

 

Telegram을 사용하려면 로그인이 필수이기 때문에 현재 로그인 상태를 가져오고 로그인이 되어 있지 않는다면 전화번호를 전달하여 본인의 Telegram으로 로그인 코드를 전달받는 부분까지 진행해 보고자 한다.

 

Telegram 연동을 관리하는 별도의 클래스를 만들어 작성하였다.

class TelegramManager constructor(private val context: Context) : Client.ResultHandler {
    private val TAG = TelegramManager::class.java.simpleName

    //연동 인터페이스 Client 모든 호출은 Client를 통해서 함
    //update된 상태를 확인하기 위해 첫번째 매개변수는 핸들러를 꼭 셋팅해 주었으면한다.
    private val client = Client.create(this, null, null)
    
    //호출한 API에 대한 결과를 callback 받는 Listener
    override fun onResult(result: TdApi.Object?) {
        result?.let {
            
        }
    }
    
}

기본적인 코드를 작성하였다면 현재 인증 상태를 확인하는 API를 호출해보자.

API 호출은 send라는 메서드로 할 수 있고

호출은 하기와 같이 두 가지 형태로 호출할 수 있는데 사실 특별한 건 없고 1번째 형태는 호출시마다 callback handler를 생성하여 각각 전달받는 형태와 현재 클래스에서 resultHandler를 상속받아 override 된 메서드에서 전달받아 처리할 거냐의 대한 선택일 뿐이다. 본인의 코드에 맞게 잘 사용하면 될 거 같다.

fun GetAuthorizationState() {
    client.send(TdApi.GetAuthorizationState()) {

    }
}
fun GetAuthorizationState() {
    client.send(TdApi.GetAuthorizationState(), this) 
}

GetAuthorizationState()의 결과로는 하기와 같이 여러 가지 결과된다. 

TdApi.AuthorizationStateWaitRegistration, 
TdApi.AuthorizationStateWaitTdlibParameters
TdApi.AuthorizationStateClosed, TdApi.AuthorizationStateClosing, TdApi.AuthorizationStateLoggingOut, TdApi.AuthorizationStateReady, TdApi.AuthorizationStateWaitCode, TdApi.AuthorizationStateWaitEncryptionKey, TdApi.AuthorizationStateWaitOtherDeviceConfirmation, TdApi.AuthorizationStateWaitPassword, TdApi.AuthorizationStateWaitPhoneNumber,

최초 실행 때는 AuthorizationStateWaitTdlibParameters 가 호출되는데 Tdlib라이브러리 내 포함되어 있는 문서에는 하기와 같이 쓰여있고 구글 번역을 돌리면 tdlibParmeters가 필요하다고 한다.

 

TDLib needs TdlibParameters for initialization.
TDLib는 초기화를 위해 TdlibParameters가 필요합니다.

 

tdlibParmeters Setting을 하기 위해 parameter를 만들어 Setting 하여 준다.

private fun makeTdLibParameters() = TdApi.TdlibParameters().apply {
    // Obtain application identifier hash for Telegram API access at https://my.telegram.org
    apiId = myapp apiId
    apiHash = myapp apiHash
    useMessageDatabase = true
    useSecretChats = true
    systemLanguageCode = Locale.getDefault().language
    databaseDirectory = context.filesDir.absolutePath
    deviceModel = Build.MODEL
    systemVersion = Build.VERSION.RELEASE
    applicationVersion = "0.1"
    enableStorageOptimizer = true
}

fun GetAuthorizationState() {
    client.send(TdApi.GetAuthorizationState()) { result ->
        result?.let {
            if (it.constructor == TdApi.AuthorizationStateWaitTdlibParameters.CONSTRUCTOR) {
                SetTdlibParmeters()
            }
        }
    }
}
private fun SetTdlibParmeters() {
    client.send(TdApi.SetTdlibParameters(makeTdLibParameters())) {
        Log.d(TAG, "$it")
    }
}

파라미터를 세팅하게 되면 다시 AuthorizationState가 전달되게 되고 그 State는 AuthorizationStateWaitEncryptionKey이다.

이 부분은 공식 홈페이지에는 하기와 같이 설명되어 있는데 왜 하는지는 아직 이해가 다 안 되었다 시키는 데로 일단 한다.

The second received authorization state is always authorizationStateWaitEncryptionKey. When it is received, the database encryption key must be provided through a call to checkDatabaseEncryptionKey. For most mobile apps, you can provide an empty database encryption key here (more info)
private fun onAuthorizationStateUpdated(result: TdApi.Object) {
    val state = (result as TdApi.UpdateAuthorizationState).authorizationState
    val stateConstructor = state.constructor
    if (stateConstructor == TdApi.AuthorizationStateWaitEncryptionKey.CONSTRUCTOR) {
        client.send(TdApi.CheckDatabaseEncryptionKey()) {
            when (it.constructor) {
                TdApi.Ok.CONSTRUCTOR -> {

                }
                TdApi.Error.CONSTRUCTOR -> {

                }
            }
        }
    }
}

상태를 받고  작성된 코드대로 실행하게 되면 또다시 AuthorizationState가 전달되고 여러 가지 상태중 authorizationStateWaitPhoneNumber가 전달되었다. 전화번호 인증하여야 한다는 것이다.

전화번호 인증 방법은 다음 포스팅에서 진행해 보겠다.

728x90
반응형

댓글