// Helpers for ~/.config/notify/notify.json and profile files.
function normalizeServer(s) {
var url = String(s && (s.url || s.server || s.host || s.endpoint || s.notify_url) || "").trim().replace(/\/+$/, "")
var pin = String(s && (s.pin || s.token || s.apiKey || s.api_key || s.password) || "")
var key = String(s && (s.api_key || s.apiKey || s.token || s.pin) || pin)
return {
name: String(s && s.name || ""),
url: url,
api_key: key,
pin: pin
}
}
function validServer(s) {
var url = String(s && (s.url || s.server || s.host || s.endpoint || s.notify_url) || "").trim()
return url.length > 0
}
function parseProfile(name, content) {
var parsed
try {
parsed = JSON.parse(String(content || "{}"))
} catch (e) {
return { name: name, servers: [] }
}
var list = []
var profileName = String(name || "").replace(/\.json$/, "")
if (Array.isArray(parsed)) {
list = parsed
} else if (parsed && typeof parsed === "object") {
if (parsed.name && typeof parsed.name === "string" && parsed.name.trim().length > 0) {
profileName = parsed.name.trim()
}
if (Array.isArray(parsed.servers)) {
list = parsed.servers
} else {
list = [parsed]
}
}
return {
name: profileName,
servers: list.filter(validServer).map(normalizeServer)
}
}
// The scanner emits @@CONFIG, main config JSON, then @@FILE <name>, JSON.
function parseDump(text) {
var profiles = []
var active = ""
var lines = String(text || "").split("\n")
var currentName = ""
var current = []
function finish() {
if (currentName !== "") {
var prof = parseProfile(currentName, current.join("\n"))
if (prof.servers.length > 0)
profiles.push(prof)
}
currentName = ""
current = []
}
for (var i = 0; i < lines.length; i++) {
var line = lines[i]
if (line === "@@CONFIG") {
finish()
var configText = []
i++
while (i < lines.length && lines[i].indexOf("@@FILE ") !== 0) {
configText.push(lines[i])
i++
}
try {
var rawConfig = configText.join("\n")
var config = JSON.parse(rawConfig)
active = String(config && config.active || "")
var mainProfile = parseProfile("notify", rawConfig)
if (mainProfile.servers.length > 0) {
profiles.push(mainProfile)
if (!active) active = mainProfile.name
}
} catch (e) {}
if (i >= lines.length) break
line = lines[i]
}
if (line.indexOf("@@FILE ") === 0) {
finish()
currentName = line.slice(7).trim()
} else if (currentName !== "") {
current.push(line)
}
}
finish()
return { profiles: profiles, active: active }
}
function byName(profiles, name) {
var key = String(name || "")
for (var i = 0; i < profiles.length; i++)
if (profiles[i].name === key) return profiles[i]
return null
}
function shellQuote(value) {
return "'" + String(value).replace(/'/g, "'\\''") + "'"
}