2021-11-12 13:41:29 +13:00
|
|
|
package io.heckel.ntfy.work
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import androidx.work.CoroutineWorker
|
|
|
|
import androidx.work.WorkerParameters
|
|
|
|
import io.heckel.ntfy.BuildConfig
|
2022-01-19 08:28:48 +13:00
|
|
|
import io.heckel.ntfy.db.Repository
|
2021-11-12 13:41:29 +13:00
|
|
|
import io.heckel.ntfy.msg.ApiService
|
2021-12-30 09:36:47 +13:00
|
|
|
import io.heckel.ntfy.msg.NotificationDispatcher
|
2022-08-19 13:11:29 +12:00
|
|
|
import io.heckel.ntfy.util.Encryption
|
2022-02-10 10:20:24 +13:00
|
|
|
import io.heckel.ntfy.util.Log
|
2021-11-12 13:41:29 +13:00
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
import kotlinx.coroutines.withContext
|
2021-11-16 10:24:31 +13:00
|
|
|
import kotlin.random.Random
|
2021-11-12 13:41:29 +13:00
|
|
|
|
|
|
|
class PollWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {
|
2022-02-10 10:20:24 +13:00
|
|
|
// IMPORTANT:
|
2021-11-23 09:45:43 +13:00
|
|
|
// Every time the worker is changed, the periodic work has to be REPLACEd.
|
|
|
|
// This is facilitated in the MainActivity using the VERSION below.
|
2021-11-12 13:41:29 +13:00
|
|
|
|
2022-01-17 18:19:05 +13:00
|
|
|
init {
|
|
|
|
Log.init(ctx) // Init in all entrypoints
|
|
|
|
}
|
|
|
|
|
2021-11-12 13:41:29 +13:00
|
|
|
override suspend fun doWork(): Result {
|
|
|
|
return withContext(Dispatchers.IO) {
|
|
|
|
Log.d(TAG, "Polling for new notifications")
|
2022-02-10 10:20:24 +13:00
|
|
|
val repository = Repository.getInstance(applicationContext)
|
2021-12-30 09:36:47 +13:00
|
|
|
val dispatcher = NotificationDispatcher(applicationContext, repository)
|
2021-11-12 13:41:29 +13:00
|
|
|
val api = ApiService()
|
|
|
|
|
2022-02-02 05:57:48 +13:00
|
|
|
val baseUrl = inputData.getString(INPUT_DATA_BASE_URL)
|
|
|
|
val topic = inputData.getString(INPUT_DATA_TOPIC)
|
|
|
|
val subscriptions = if (baseUrl != null && topic != null) {
|
|
|
|
val subscription = repository.getSubscription(baseUrl, topic) ?: return@withContext Result.success()
|
|
|
|
listOf(subscription)
|
|
|
|
} else {
|
|
|
|
repository.getSubscriptions()
|
|
|
|
}
|
|
|
|
|
|
|
|
subscriptions.forEach{ subscription ->
|
2021-12-12 13:40:32 +13:00
|
|
|
try {
|
2022-02-02 05:57:48 +13:00
|
|
|
val user = repository.getUser(subscription.baseUrl)
|
2022-08-19 13:11:29 +12:00
|
|
|
val notifications = api
|
|
|
|
.poll(
|
|
|
|
subscriptionId = subscription.id,
|
|
|
|
baseUrl = subscription.baseUrl,
|
|
|
|
topic = subscription.topic,
|
|
|
|
user = user,
|
|
|
|
since = subscription.lastNotificationId
|
|
|
|
)
|
|
|
|
.map { n -> Encryption.maybeDecrypt(subscription, n) }
|
2021-11-16 10:24:31 +13:00
|
|
|
val newNotifications = repository
|
|
|
|
.onlyNewNotifications(subscription.id, notifications)
|
|
|
|
.map { it.copy(notificationId = Random.nextInt()) }
|
2021-11-12 13:41:29 +13:00
|
|
|
newNotifications.forEach { notification ->
|
2021-12-30 09:36:47 +13:00
|
|
|
if (repository.addNotification(notification)) {
|
|
|
|
dispatcher.dispatch(subscription, notification)
|
2021-12-12 09:09:07 +13:00
|
|
|
}
|
2021-11-12 13:41:29 +13:00
|
|
|
}
|
2021-12-12 13:40:32 +13:00
|
|
|
} catch (e: Exception) {
|
|
|
|
Log.e(TAG, "Failed checking messages: ${e.message}", e)
|
2021-11-12 13:41:29 +13:00
|
|
|
}
|
|
|
|
}
|
2021-12-12 13:40:32 +13:00
|
|
|
Log.d(TAG, "Finished polling for new notifications")
|
|
|
|
return@withContext Result.success()
|
2021-11-12 13:41:29 +13:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object {
|
2021-12-12 13:40:32 +13:00
|
|
|
const val VERSION = BuildConfig.VERSION_CODE
|
2021-11-12 13:41:29 +13:00
|
|
|
const val TAG = "NtfyPollWorker"
|
2022-02-02 05:57:48 +13:00
|
|
|
const val WORK_NAME_PERIODIC_ALL = "NtfyPollWorkerPeriodic" // Do not change
|
|
|
|
const val WORK_NAME_ONCE_SINGE_PREFIX = "NtfyPollWorkerSingle" // e.g. NtfyPollWorkerSingle_https://ntfy.sh_mytopic
|
|
|
|
const val INPUT_DATA_BASE_URL = "baseUrl"
|
|
|
|
const val INPUT_DATA_TOPIC = "topic"
|
2021-11-12 13:41:29 +13:00
|
|
|
}
|
|
|
|
}
|