Initial commit: IceGlass NHL game tracker
macOS menu bar app providing NHL game situational awareness with league-wide scoreboard, dynamic polling, notifications with team logos, and configurable display options.
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// AppTerminator.swift
|
||||
// IceGlass
|
||||
//
|
||||
// Copyright 2026 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import AppKit
|
||||
|
||||
final class AppTerminator {
|
||||
static func terminate(
|
||||
title: String = "Critical Error",
|
||||
message: String = "The application failed to initialize properly and must close."
|
||||
) {
|
||||
DispatchQueue.main.async {
|
||||
let logger = IceGlassLogger(
|
||||
subsystem: Bundle.main.bundleIdentifier ?? "dev.rzen.indie.IceGlass",
|
||||
category: "AppTerminator"
|
||||
)
|
||||
|
||||
logger.error("\(title): \(message)")
|
||||
|
||||
let alert = NSAlert()
|
||||
alert.messageText = title
|
||||
alert.informativeText = message
|
||||
alert.alertStyle = .critical
|
||||
alert.addButton(withTitle: "OK")
|
||||
alert.runModal()
|
||||
|
||||
NSApplication.shared.terminate(nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// IceGlassLogger.swift
|
||||
// IceGlass
|
||||
//
|
||||
// Copyright 2026 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
import OSLog
|
||||
|
||||
struct IceGlassLogger {
|
||||
private let logger: Logger
|
||||
private let subsystem: String
|
||||
private let category: String
|
||||
|
||||
init(subsystem: String, category: String) {
|
||||
self.subsystem = subsystem
|
||||
self.category = category
|
||||
self.logger = Logger(subsystem: subsystem, category: category)
|
||||
}
|
||||
|
||||
func timestamp() -> String {
|
||||
Date.now.formatDateET(format: "yyyy-MM-dd HH:mm:ss")
|
||||
}
|
||||
|
||||
func formattedMessage(_ message: String) -> String {
|
||||
"\(timestamp()) [\(subsystem):\(category)] \(message)"
|
||||
}
|
||||
|
||||
func debug(_ message: String) {
|
||||
logger.debug("\(formattedMessage(message))")
|
||||
}
|
||||
|
||||
func info(_ message: String) {
|
||||
logger.info("\(formattedMessage(message))")
|
||||
}
|
||||
|
||||
func warning(_ message: String) {
|
||||
logger.warning("\(formattedMessage(message))")
|
||||
}
|
||||
|
||||
func error(_ message: String) {
|
||||
logger.error("\(formattedMessage(message))")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user