Add new features: DefaultBrowser, DynamicLock, SandwichReminder
- Implemented DefaultBrowser feature to notify users when the default browser does not match the configured app. - Added DynamicLock feature to disable Dynamic Lock while connected to a specific network and re-enable it after disconnecting. - Created SandwichReminder feature to prompt users to order a sandwich during work hours based on network and time settings. Introduced helper libraries for configuration, elevation, logging, network utilities, and toast notifications. - Config.ps1: Added functions for reading and writing configuration and state files. - Elevation.ps1: Added functions to check for administrator privileges and request elevation. - Logging.ps1: Implemented a shared logging utility for consistent logging across features. - NetworkUtils.ps1: Added a function to check for DNS suffix connectivity. - ToastHelper.ps1: Created a helper for displaying Windows toast notifications. Implemented runner.ps1 as the main entry point for executing features based on configuration.
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
# ── Feature metadata ──────────────────────────────────────────────────────────
|
||||
|
||||
$FeatureMeta = @{
|
||||
Name = 'SandwichReminder'
|
||||
Description = 'Ask if you want to order a sandwich when at work at the configured time'
|
||||
Settings = @(
|
||||
@{
|
||||
Key = 'network'
|
||||
Label = 'Work Network DNS Suffix'
|
||||
Type = 'string'
|
||||
Default = 'sioen.grp'
|
||||
Description = 'DNS suffix that identifies the work network'
|
||||
},
|
||||
@{
|
||||
Key = 'reminderTime'
|
||||
Label = 'Reminder Time (HH:mm)'
|
||||
Type = 'string'
|
||||
Default = '09:00'
|
||||
Description = 'Time to show the reminder in 24-hour format (e.g. 09:00)'
|
||||
},
|
||||
@{
|
||||
Key = 'windowMinutes'
|
||||
Label = 'Time Window (minutes)'
|
||||
Type = 'int'
|
||||
Default = 5
|
||||
Description = 'Show the reminder if the runner fires within this many minutes of the reminder time'
|
||||
},
|
||||
@{
|
||||
Key = 'url'
|
||||
Label = 'Order URL'
|
||||
Type = 'string'
|
||||
Default = 'https://ylos-kitchen.unipage.eu'
|
||||
Description = 'URL to open when clicking Yes'
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
# ── Feature implementation ────────────────────────────────────────────────────
|
||||
|
||||
function Invoke-Feature {
|
||||
param(
|
||||
[hashtable]$Config,
|
||||
[hashtable]$State
|
||||
)
|
||||
|
||||
if (-not $State) { $State = @{} }
|
||||
if (-not $State.ContainsKey('lastShownDate')) { $State['lastShownDate'] = $null }
|
||||
|
||||
$today = (Get-Date).ToString('yyyy-MM-dd')
|
||||
|
||||
# Only show once per day
|
||||
if ($State['lastShownDate'] -eq $today) {
|
||||
Write-Log -Level Info -Message 'Already shown today, skipping.' -Feature 'SandwichReminder'
|
||||
return $State
|
||||
}
|
||||
|
||||
# Parse reminder time
|
||||
try {
|
||||
$targetTime = [datetime]::ParseExact($Config['reminderTime'], 'HH:mm', $null)
|
||||
}
|
||||
catch {
|
||||
Write-Log -Level Error `
|
||||
-Message "Invalid reminderTime format '$($Config['reminderTime'])' — expected HH:mm: $_" `
|
||||
-Feature 'SandwichReminder'
|
||||
return $State
|
||||
}
|
||||
|
||||
# Check whether we are within the configured time window
|
||||
$now = Get-Date
|
||||
$todayTarget = Get-Date -Hour $targetTime.Hour -Minute $targetTime.Minute -Second 0
|
||||
$diffMinutes = [Math]::Abs(($now - $todayTarget).TotalMinutes)
|
||||
$window = [int]$Config['windowMinutes']
|
||||
|
||||
if ($diffMinutes -gt $window) {
|
||||
Write-Log -Level Info `
|
||||
-Message ("Outside time window (diff: {0:F1} min, window: ±{1} min), skipping." -f $diffMinutes, $window) `
|
||||
-Feature 'SandwichReminder'
|
||||
return $State
|
||||
}
|
||||
|
||||
# Check network
|
||||
if (-not (Test-DnsSuffixConnected -Suffix $Config['network'])) {
|
||||
Write-Log -Level Info `
|
||||
-Message "Not connected to work network ('$($Config['network'])'), skipping." `
|
||||
-Feature 'SandwichReminder'
|
||||
return $State
|
||||
}
|
||||
|
||||
Write-Log -Level Info -Message 'Showing sandwich reminder toast.' -Feature 'SandwichReminder'
|
||||
|
||||
Show-ToastNotification `
|
||||
-Title 'Sandwich Order' `
|
||||
-Body 'Do you want to order a sandwich today?' `
|
||||
-Buttons @(
|
||||
@{ Label = 'Yes, order now!'; Action = $Config['url'] },
|
||||
@{ Label = 'No thanks'; Action = 'dismiss' }
|
||||
)
|
||||
|
||||
$State['lastShownDate'] = $today
|
||||
return $State
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user