From de34a41ef4f26afb61492a2ca1f46c5140edc208 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 1 Feb 2021 18:04:09 +0100 Subject: [PATCH] Improve cron. Fixes #1380 --- .../android/habitica/api/ApiService.kt | 2 ++ .../android/habitica/data/ApiClient.kt | 1 + .../android/habitica/data/TaskRepository.kt | 2 ++ .../data/implementation/ApiClientImpl.kt | 4 +++ .../data/implementation/TaskRepositoryImpl.kt | 5 ++++ .../data/implementation/UserRepositoryImpl.kt | 8 +++++- .../models/responses/BulkTaskScoringData.kt | 28 +++++++++++++++++++ 7 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/BulkTaskScoringData.kt diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt index d299f51b3..60ae8026c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt @@ -103,6 +103,8 @@ interface ApiService { @POST("tasks/{id}/score/{direction}") fun postTaskDirection(@Path("id") id: String, @Path("direction") direction: String): Flowable> + @POST("tasks/bulk-score") + fun bulkScoreTasks(@Body data: List>): Flowable> @POST("tasks/{id}/move/to/{position}") fun postTaskNewPosition(@Path("id") id: String, @Path("position") position: Int): Flowable>> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt index b8de6d940..00acf848c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt @@ -80,6 +80,7 @@ interface ApiClient { fun getTask(id: String): Flowable fun postTaskDirection(id: String, direction: String): Flowable + fun bulkScoreTasks(data: List>): Flowable fun postTaskNewPosition(id: String, position: Int): Flowable> diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt index 6469f1885..fabe38ec6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/TaskRepository.kt @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.data import com.habitrpg.android.habitica.models.BaseObject +import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData import com.habitrpg.android.habitica.models.responses.TaskScoringResult import com.habitrpg.android.habitica.models.tasks.RemindersItem import com.habitrpg.android.habitica.models.tasks.Task @@ -62,4 +63,5 @@ interface TaskRepository : BaseRepository { fun syncErroredTasks(): Single> fun unlinkAllTasks(challengeID: String?, keepOption: String): Flowable fun getTasksForChallenge(challengeID: String?): Flowable> + fun bulkScoreTasks(data: List>): Flowable } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index a47d6c05e..bce8061e1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -421,6 +421,10 @@ class ApiClientImpl//private OnHabitsAPIResult mResultListener; return apiService.postTaskDirection(id, direction).compose(configureApiCallObserver()) } + override fun bulkScoreTasks(data: List>): Flowable { + return apiService.bulkScoreTasks(data).compose(configureApiCallObserver()) + } + override fun postTaskNewPosition(id: String, position: Int): Flowable> { return apiService.postTaskNewPosition(id, position).compose(configureApiCallObserver()) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt index b1939df49..8390ee120 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/TaskRepositoryImpl.kt @@ -7,6 +7,7 @@ import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.interactors.ScoreTaskLocallyInteractor import com.habitrpg.android.habitica.models.BaseObject +import com.habitrpg.android.habitica.models.responses.BulkTaskScoringData import com.habitrpg.android.habitica.models.responses.TaskDirection import com.habitrpg.android.habitica.models.responses.TaskDirectionData import com.habitrpg.android.habitica.models.responses.TaskScoringResult @@ -118,6 +119,10 @@ class TaskRepositoryImpl(localRepository: TaskLocalRepository, apiClient: ApiCli } } + override fun bulkScoreTasks(data: List>): Flowable { + return apiClient.bulkScoreTasks(listOf()) + } + private fun handleTaskResponse(user: User, res: TaskDirectionData, task: Task, up: Boolean, localDelta: Float) { this.localRepository.executeTransaction { val bgTask = localRepository.getLiveObject(task) ?: return@executeTransaction diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index 7b623d4ba..f84e644ee 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.models.TeamPlan import com.habitrpg.android.habitica.models.inventory.Customization import com.habitrpg.android.habitica.models.inventory.CustomizationSet import com.habitrpg.android.habitica.models.responses.SkillResponse +import com.habitrpg.android.habitica.models.responses.TaskDirection import com.habitrpg.android.habitica.models.responses.UnlockResponse import com.habitrpg.android.habitica.models.responses.VerifyUsernameResponse import com.habitrpg.android.habitica.models.social.Group @@ -287,9 +288,14 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli user } if (tasks.isNotEmpty()) { + val scoringList = mutableListOf>() for (task in tasks) { - observable = observable.flatMap { taskRepository.taskChecked(null, task, true, true, null).firstElement() } + val map = mutableMapOf() + map["id"] = task.id ?: "" + map["direction"] = TaskDirection.UP.text + scoringList.add(map) } + observable = observable.flatMap { taskRepository.bulkScoreTasks(scoringList).firstElement() } } observable.flatMap { apiClient.runCron().firstElement() } .flatMap { this.retrieveUser(withTasks = true, forced = true).firstElement() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/BulkTaskScoringData.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/BulkTaskScoringData.kt new file mode 100644 index 000000000..425b8dfcc --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/responses/BulkTaskScoringData.kt @@ -0,0 +1,28 @@ +package com.habitrpg.android.habitica.models.responses + +import com.google.gson.annotations.SerializedName +import com.habitrpg.android.habitica.models.user.Buffs +import com.habitrpg.android.habitica.models.user.Training + +class BulkTaskScoringData { + @SerializedName("con") + var constitution: Int? = null + @SerializedName("str") + var strength: Int? = null + @SerializedName("per") + var per: Int? = null + @SerializedName("int") + var intelligence: Int? = null + var training: Training? = null + var buffs: Buffs? = null + var points: Int? = null + var lvl: Int? = null + @SerializedName("class") + var habitClass: String? = null + var gp: Double? = null + var exp: Double? = null + var mp: Double? = null + var hp: Double? = null + + var tasks: List = listOf() +} \ No newline at end of file