mirror of
https://github.com/la5nta/pat
synced 2026-08-07 22:32:06 -04:00
176 lines
4.5 KiB
Go
176 lines
4.5 KiB
Go
package cli
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/la5nta/pat/app"
|
|
"github.com/la5nta/pat/internal/cmsapi"
|
|
)
|
|
|
|
const (
|
|
MPSUsage = `subcommand [options]
|
|
|
|
subcommands:
|
|
list [--all] List message pickup stations for your callsign, or all MPS with --all
|
|
clear Delete all message pickup stations for your callsign
|
|
add [CALLSIGN] Add a message pickup station`
|
|
|
|
MPSExample = `
|
|
list List your message pickup stations
|
|
list --all List all message pickup stations
|
|
clear Delete all your message pickup stations
|
|
add W1AW Add W1AW as a message pickup station`
|
|
)
|
|
|
|
func MPSHandle(ctx context.Context, a *app.App, args []string) {
|
|
mycall := a.Options().MyCall
|
|
if mycall == "" {
|
|
fmt.Println("ERROR: MyCall not configured")
|
|
os.Exit(1)
|
|
}
|
|
|
|
switch cmd, args := shiftArgs(args); cmd {
|
|
case "list":
|
|
option, _ := shiftArgs(args)
|
|
if option == "--all" {
|
|
err := mpsListAllHandle(ctx, mycall)
|
|
|
|
if err != nil {
|
|
fmt.Println("ERROR:", err)
|
|
os.Exit(1)
|
|
}
|
|
} else if err := mpsListMineHandle(ctx, mycall); err != nil {
|
|
fmt.Println("ERROR:", err)
|
|
os.Exit(1)
|
|
}
|
|
case "clear":
|
|
if err := mpsClearHandle(ctx, a, mycall); err != nil {
|
|
fmt.Println("ERROR:", err)
|
|
os.Exit(1)
|
|
}
|
|
case "add":
|
|
addCall, _ := shiftArgs(args)
|
|
if err := mpsAddHandle(ctx, a, mycall, addCall); err != nil {
|
|
fmt.Println("ERROR:", err)
|
|
os.Exit(1)
|
|
}
|
|
default:
|
|
fmt.Println("Missing argument, try 'mps help'.")
|
|
}
|
|
}
|
|
|
|
func mpsListAllHandle(ctx context.Context, mycall string) error {
|
|
mpsList, err := cmsapi.HybridStationList(ctx)
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("failed to retrieve MPS list: %w", err)
|
|
}
|
|
|
|
if len(mpsList) == 0 {
|
|
fmt.Println("No message pickup stations found.")
|
|
return nil
|
|
}
|
|
|
|
fmtStr := "%-12s %-16s\n"
|
|
|
|
// Print header
|
|
fmt.Printf(fmtStr, "mps callsign", "forwarding type")
|
|
|
|
// Print MPS records
|
|
for _, station := range mpsList {
|
|
fwdType := "unknown"
|
|
if station.AutomaticForwarding {
|
|
fwdType = "automatic"
|
|
} else if station.ManualForwarding {
|
|
fwdType = "manual"
|
|
}
|
|
|
|
fmt.Printf(fmtStr, station.Callsign, fwdType)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func mpsListMineHandle(ctx context.Context, mycall string) error {
|
|
mpsList, err := cmsapi.MPSGet(ctx, mycall, mycall)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to retrieve your MPS records: %w", err)
|
|
}
|
|
|
|
if len(mpsList) == 0 {
|
|
fmt.Println("No message pickup stations configured for your callsign.")
|
|
return nil
|
|
}
|
|
|
|
fmtStr := "%-12.12s %s\n"
|
|
|
|
// Print header
|
|
fmt.Printf(fmtStr, "mps callsign", "timestamp")
|
|
|
|
// Print MPS records
|
|
for _, mps := range mpsList {
|
|
fmt.Printf(fmtStr, mps.MpsCallsign, mps.Timestamp.Format("2006-01-02 15:04:05"))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func mpsClearHandle(ctx context.Context, a *app.App, mycall string) error {
|
|
password := getPasswordForCallsign(ctx, a, mycall)
|
|
if password == "" {
|
|
return fmt.Errorf("password required for clear operation")
|
|
}
|
|
|
|
mpsList, err := cmsapi.MPSGet(ctx, mycall, mycall)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to retrieve your MPS records for display before clear: %w", err)
|
|
}
|
|
|
|
if err := cmsapi.MPSDelete(ctx, mycall, mycall, password); err != nil {
|
|
return fmt.Errorf("failed to clear MPS records: %w", err)
|
|
}
|
|
|
|
fmt.Println("All message pickup stations deleted successfully.")
|
|
fmt.Println("Previous message pickup stations:")
|
|
for _, station := range mpsList {
|
|
fmt.Println(station.MpsCallsign)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func mpsAddHandle(ctx context.Context, a *app.App, mycall, mpsCallsign string) error {
|
|
// Validate callsign format
|
|
mpsCallsign = strings.ToUpper(strings.TrimSpace(mpsCallsign))
|
|
if mpsCallsign == "" {
|
|
return fmt.Errorf("MPS callsign cannot be empty")
|
|
}
|
|
|
|
password := getPasswordForCallsign(ctx, a, mycall)
|
|
if password == "" {
|
|
return fmt.Errorf("password required for add operation")
|
|
}
|
|
|
|
// get list to ensure that we don't allow more than
|
|
// 3 stations total, with 2 suggested
|
|
mpsList, err := cmsapi.MPSGet(ctx, mycall, mycall)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to retrieve your MPS records to check if addition is allowed: %w", err)
|
|
}
|
|
|
|
numMPS := len(mpsList)
|
|
if numMPS >= 3 {
|
|
return fmt.Errorf("configuring more than 3 message pickup stations is not allowed")
|
|
} else if numMPS == 2 {
|
|
fmt.Println("Warning: You already have 2 message pickup stations configured, more is not recommended. The maximum allowed is 3 stations")
|
|
}
|
|
|
|
if err := cmsapi.MPSAdd(ctx, mycall, mycall, password, mpsCallsign); err != nil {
|
|
return fmt.Errorf("failed to add MPS station: %w", err)
|
|
}
|
|
|
|
fmt.Printf("Message pickup station %s added successfully.\n", mpsCallsign)
|
|
return nil
|
|
}
|