Nyx-Tools/nyx/bash/nyx-info.sh
2025-08-13 11:40:03 +02:00

180 lines
4.5 KiB
Bash

#!/usr/bin/env bash
nyx-info() {
############################################
# CONFIG (injected by Nix)
############################################
local info_dir="@LOG_DIR@/info"
local topic_name="Homemanager-Support"
local msg_file="${info_dir}/${topic_name}-message.txt"
local inform_enable=false
local sleeptimer=3
# ⚠ IMPORTANT PROJECT UPDATE ⚠
local information="
⚠ IMPORTANT PROJECT UPDATE ⚠
Please note that I will soon switch Nyx from a Home Manager module to a NixOS module.
You can still use the Home Manager module, but I will only continue developing it for Nyx at a specific legacy commit/revision.
Please consider pinning Nyx to that commit:
[https://github.com/Peritia-System/Nyx-Tools/blob/main/Documentation/How-to-Homemanager.md](https://github.com/Peritia-System/Nyx-Tools/blob/main/Documentation/How-to-Homemanager.md)
If you use this, you can keep the current version indefinitely but wont receive updates.
If you dont pin to that commit, I wont take any responsibility for breakage.
(Note: I dont take any responsibility regardless — this is a hobby project.)
If you want to ensure it works, help me develop it.
Thank you for your understanding <3
This is not supposed to discourage you from using Nyx!!! I am so, so glad you use Nyx :)
But it is very early in development so things move quick and big changes will be common.
Plus as I said, it is a hobby project and at the moment I develop alone.
"
############################################
# Helpers
############################################
usage() {
cat <<'EOF'
Usage: nyx-info [--acknowledge] [--print-force] [--help]
--acknowledge Record acknowledgment for the current notice and print it.
--print-force Print the current notice without reading/writing state.
--help Show this help.
Notes:
- You'll be prompted again if the notice text changes.
- State is stored under @LOG_DIR@/info per topic, in this format:
-----Acknowledged-----
$ack
-----BEGIN INFO-----
$information
-----END INFO-----
-----BEGIN SHA-----
$sha
-----END SHA-----
EOF
}
ensure_storage() {
mkdir -p "${info_dir}"
}
hash_text() {
if command -v sha256sum >/dev/null 2>&1; then
sha256sum | awk '{print $1}'
elif command -v shasum >/dev/null 2>&1; then
shasum -a 256 | awk '{print $1}'
else
echo "ERROR: Need sha256sum or shasum on PATH." >&2
exit 1
fi
}
current_sha() {
printf '%s' "${information}" | hash_text
}
save_state() {
# $1 = ack (true/false), $2 = sha
{
echo "-----Acknowledged-----"
echo "$1"
echo "-----BEGIN INFO-----"
printf '%s\n' "${information}"
echo "-----END INFO-----"
echo "-----BEGIN SHA-----"
echo "$2"
echo "-----END SHA-----"
} > "${msg_file}"
}
load_state() {
# Sets globals: stored_ack, stored_sha, stored_info (empty if no file).
stored_ack=""
stored_sha=""
stored_info=""
[[ -f "${msg_file}" ]] || return 0
stored_ack="$(awk '/^-----Acknowledged-----$/{getline; print; exit}' "${msg_file}" || true)"
stored_info="$(awk '
BEGIN{p=0}
/^-----BEGIN INFO-----$/ {p=1; next}
/^-----END INFO-----$/ {p=0}
p==1 {print}
' "${msg_file}" || true)"
stored_sha="$(awk '
BEGIN{p=0}
/^-----BEGIN SHA-----$/ {p=1; next}
/^-----END SHA-----$/ {p=0}
p==1 {print}
' "${msg_file}" || true)"
}
print_notice() {
cat <<EOF
-----BEGIN NYX INFO NOTICE-----
${information}
-----END NYX INFO NOTICE-----
To acknowledge this message run: nyx-info --acknowledge
EOF
}
should_skip_notice() {
local now_sha="$1"
[[ -n "${stored_sha:-}" && "${stored_sha}" == "${now_sha}" && "${stored_ack:-}" == "true" ]]
}
############################################
# Main
############################################
local acknowledge=false print_force=false
while [[ $# -gt 0 ]]; do
case "$1" in
--acknowledge) acknowledge=true ;;
--print-force) print_force=true ;;
--help|-h) usage; exit 0 ;;
*) echo "Unknown option: $1" >&2; usage; exit 2 ;;
esac
shift
done
[[ "${inform_enable}" == true ]] || exit 0
ensure_storage
local now_sha
now_sha="$(current_sha)"
if [[ "${print_force}" == true ]]; then
print_notice
exit 0
fi
load_state
if [[ "${acknowledge}" == true ]]; then
save_state "true" "${now_sha}"
print_notice
exit 0
fi
if should_skip_notice "${now_sha}"; then
echo "Notice already acknowledged. To reread: ${info_dir} -> ${msg_file}"
exit 0
fi
save_state "false" "${now_sha}"
print_notice
}
nyx-info "$@"