opatry / ticktick-kt

TickTick REST API bindings for Kotlin

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Build Status

TickTick REST API Kotlin bindings

Kotlin binding for TickTick REST API using Ktor Http Client and Gson as Json marshaller.

Example

runBlocking {
    val permissions = TickTickServiceAuthenticator.Permission.entries
    val config = HttpTickTickServiceAuthenticator.ApplicationConfig(
        redirectUrl = "http://localhost:8888",
        clientId = System.getenv("TICKTICK_API_CLIENT_ID"),
        clientSecret = System.getenv("TICKTICK_API_CLIENT_SECRET"),
    )
    val authenticator: TickTickServiceAuthenticator = HttpTickTickServiceAuthenticator(config)

    val code = authenticator.authorize(permissions) { url ->
        withContext(Dispatchers.IO) {
            Desktop.getDesktop().browse(URI.create(url))
        }
    }

    val token = authenticator.getToken(code, permissions)

    val httpClient = HttpClient(CIO) {
        CurlUserAgent()
        install(ContentNegotiation) {
            gson()
        }
        install(Auth) {
            bearer {
                sendWithoutRequest { true }
                loadTokens {
                    BearerTokens(token.accessToken, "")
                }
            }
        }
        defaultRequest {
            url("https://api.ticktick.com")
        }
    }
    val tickTickService: TickTickService = HttpTickTickService(httpClient)

    val projects = tickTickService.getProjects()
    if (projects.isEmpty()) {
        println("No project found, creating one")
        val project = tickTickService.createProject(ProjectCreationRequest("My whole new project"))
        println("Project ${project.name} (#${project.id}) created")
    } else {
        projects.sortedBy(Project::sortOrder).forEach { project ->
            println("Tasks of project ${project.name} (#${project.id})")
            tickTickService.getProjectData(project.id).tasks
                .sortedWith(compareBy(Task::status, Task::sortOrder))
                .forEach { task ->
                    println("\t${task.status} Task: ${task.title} ${task.priority} (#${task.id})")
                    task.items
                        ?.sortedWith(compareBy(ChecklistItem::status, ChecklistItem::sortOrder))
                        ?.forEach { checklistItem ->
                            println("\t\t${checklistItem.status} ${checklistItem.title} (#${checklistItem.id})")
                        }
                }
        }
    }
}

About

TickTick REST API bindings for Kotlin

License:MIT License


Languages

Language:Kotlin 100.0%