File: handler_ntfy.R

package info (click to toggle)
r-cran-progressr 0.15.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,132 kB
  • sloc: sh: 13; makefile: 7
file content (73 lines) | stat: -rw-r--r-- 2,654 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#' Progression Handler: Progress Reported via the Ntfy.sh Messaging Service
#'
#' A progression handler for [ntfy::ntfy_send()] of the \pkg{ntfy} package,
#' which sends notifications via the <https://ntfy.sh> framework.
#'
#' @inheritParams make_progression_handler
#' @inheritParams ntfy::ntfy_send
#'
#' @param \ldots Additional arguments passed to [make_progression_handler()].
#'
#' @example incl/handler_ntfy.R
#'
#' @section Requirements:
#' This progression handler requires the \pkg{ntfy} package.
#'
#' @export
handler_ntfy <- function(intrusiveness = getOption("progressr.intrusiveness.ntfy", 5), target = "gui", ..., title = "Progress update from R") {
  ## Used for package testing purposes only when we want to perform
  ## everything except the last part where the backend is called
  ntfy_send <- function(...) NULL
  if (!is_fake("handler_ntfy")) {
    pkg <- "ntfy"
    if (!requireNamespace(pkg, quietly = TRUE)) {
      stop("Package 'ntfy' is not available. See ?progressr::handler_ntfy() for installation instructions")
    }
    ntfy_send <- get("ntfy_send", mode = "function", envir = getNamespace(pkg))
  }

  notifier <- function(title, message) {
    args <- list(
      message = message,
      title   = title
    )

    do.call(ntfy_send, args = args)
  }

  reporter <- local({
    finished <- FALSE
    
    list(
      reset = function(...) {
        finished <<- FALSE
      },
      
      initiate = function(config, state, progression, ...) {
        if (!state$enabled || config$times == 1L) return()
        progress_notify(title = title, step = state$step, max_steps = config$max_steps, message = state$message, notifier = notifier)
      },
        
      interrupt = function(config, state, progression, ...) {
        msg <- conditionMessage(progression)
        progress_notify(title = title, step = state$step, max_steps = config$max_steps, message = msg, notifier = notifier)
      },

      update = function(config, state, progression, ...) {
        if (!state$enabled || progression$amount == 0 || config$times <= 2L) return()
        progress_notify(title = title, step = state$step, max_steps = config$max_steps, message = state$message, notifier = notifier)
      },
        
      finish = function(config, state, progression, ...) {
        if (finished) return()
        if (!state$enabled) return()
        if (state$delta > 0) progress_notify(title = title, step = state$step, max_steps = config$max_steps, message = state$message, notifier = notifier)
	finished <<- TRUE
      }
    )
  })
  
  make_progression_handler("ntfy", reporter, intrusiveness = intrusiveness, target = target, ...)
}