i3-battery-warning.scm 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/run/current-system/profile/bin/guile -s
  2. !#
  3. (define-module (i3-battery-warning)
  4. #:use-module (ice-9 rdelim)
  5. #:use-module (ice-9 regex)
  6. #:use-module (ice-9 popen)
  7. #:use-module (srfi srfi-1))
  8. ;; TODO!
  9. ;; Make config file to read values.
  10. ;; Package with guix
  11. ;; Add to mcron jobs as a simple program...
  12. (define BAT-WARN-LVL 30)
  13. (define BAT-ERR-LVL 20)
  14. (define (bat-percentage)
  15. (let* ((return #f)
  16. (pipe-bat
  17. (open-input-pipe
  18. (string-append "upower -i "
  19. "/org/freedesktop/UPower/devices/battery_BAT0")))
  20. (str-bat (read-line pipe-bat))
  21. (re-perc-line (make-regexp "percentage:"))
  22. (re-perc-num (make-regexp "[0-9][0-9]")))
  23. (while (not (eof-object? str-bat))
  24. (when (regexp-exec re-perc-line str-bat)
  25. (set! return (string->number
  26. (match:substring
  27. (regexp-exec re-perc-num str-bat)))))
  28. (set! str-bat (read-line pipe-bat)))
  29. (close-pipe pipe-bat)
  30. return))
  31. (define (pwr-connected?)
  32. (let* ((return #f)
  33. (pipe-pwr
  34. (open-input-pipe
  35. (string-append "upower -i"
  36. " /org/freedesktop/UPower/devices/line_power_ADP1")))
  37. (str-pwr (read-line pipe-pwr))
  38. (re-pat (make-regexp "online: yes" regexp/icase)))
  39. (while (not (eof-object? str-pwr))
  40. (when (regexp-exec re-pat str-pwr)
  41. (set! return #t))
  42. (set! str-pwr (read-line pipe-pwr)))
  43. (close-pipe pipe-pwr)
  44. return))
  45. (define (notify-usr percentage)
  46. (system (string-append "i3-nagbar"
  47. " -m \"Battery low! at " (number->string percentage) "%\""
  48. " -t "
  49. (if (< percentage BAT-ERR-LVL)
  50. "error"
  51. "warning"))))
  52. (define (check&react)
  53. (let ((pc (pwr-connected?))
  54. (bp (bat-percentage)))
  55. (unless pc
  56. (when (< bp BAT-WARN-LVL)
  57. (notify-usr bp)))))
  58. (check&react)