pat/cli/mps.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
}