From 880511a79a9b0fb35a99131f909f7d4b98e4bb8b Mon Sep 17 00:00:00 2001 From: vilmibm Date: Sat, 21 Oct 2023 04:58:30 +0000 Subject: [PATCH] add color and email prompt --- cmd/help/main.go | 98 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 13 deletions(-) diff --git a/cmd/help/main.go b/cmd/help/main.go index 1dab141..dd47e24 100644 --- a/cmd/help/main.go +++ b/cmd/help/main.go @@ -5,19 +5,59 @@ import ( "os" "strconv" + "github.com/charmbracelet/lipgloss" "github.com/mattn/go-tty" ) -func numberPrompt(tty *tty.TTY, prompt string, opts []string) (int, error) { +// TODO consider local-only help command for renaming and adding emails to account + +type colorScheme struct { + Header func(string) string + Subtitle func(string) string + Prompt func(string) string + Email func(string) string + Option func(string) string +} + +func newColorScheme() colorScheme { + s2r := func(s lipgloss.Style) func(string) string { + return s.Render + } + c := func(s string) lipgloss.Color { + return lipgloss.Color(s) + } + s := lipgloss.NewStyle + return colorScheme{ + Header: s2r(s().Bold(true).Foreground(c("#E0B0FF"))), + Subtitle: s2r(s().Italic(true).Foreground(c("gray"))), + Email: s2r(s().Bold(true).Underline(true)), + Prompt: s2r(s().Bold(true).Foreground(c("#00752d"))), + Option: s2r(s().Bold(true).Foreground(c("#38747a"))), + } +} + +func stringPrompt(cs colorScheme, tty *tty.TTY, prompt string) (string, error) { + fmt.Println("") + fmt.Println(cs.Prompt(prompt)) + fmt.Println(cs.Subtitle("(type your answer below and press enter to submit)")) + s, err := tty.ReadString() + if err != nil { + return "", fmt.Errorf("couldn't collect input: %w", err) + } + + return s, nil +} + +func numberPrompt(cs colorScheme, tty *tty.TTY, prompt string, opts []string) (int, error) { fmt.Println() - fmt.Println(prompt) - fmt.Println("(pick an option using the corresponding number)") + fmt.Println(cs.Prompt(prompt)) + fmt.Println(cs.Subtitle("(pick an option using the corresponding number)")) chosen := -1 for chosen < 0 { fmt.Println() for ix, o := range opts { - fmt.Printf("%d: %s\n", ix+1, o) + fmt.Printf("%s: %s\n", cs.Option(fmt.Sprintf("%d", ix+1)), o) } r, err := tty.ReadRune() if err != nil { @@ -37,13 +77,17 @@ func numberPrompt(tty *tty.TTY, prompt string, opts []string) (int, error) { chosen = c - 1 } + fmt.Println("") + return chosen, nil } func _main() error { - fmt.Println("Hi, you have reached the tilde town help desk.") + cs := newColorScheme() + fmt.Println(cs.Header("Hi, you have reached the tilde town help desk.")) fmt.Println() - fmt.Println("Please check out the options below. If none of them apply to you, you can send an e-mail to root@tilde.town .") + fmt.Println("Please check out the options below.") + fmt.Printf("If none of them apply to your case, you can email %s. \n", cs.Email("root@tilde.town")) tty, err := tty.Open() if err != nil { return fmt.Errorf("could not open tty: %w", err) @@ -51,20 +95,48 @@ func _main() error { defer tty.Close() options := []string{ - "I lost access to my tilde.town account and want to upload a new SSH key", - "I have a code from my e-mail to redeem", - "I just want outta here", + "I need to request that a new SSH key be added to my account.", + "I have a code from my e-mail to redeem for a new SSH key", + "I just want out of here", } - c, err := numberPrompt(tty, "What do you need help with?", options) + c, err := numberPrompt(cs, tty, "What do you need help with?", options) - if c == 2 { + switch c { + case 0: + return collectEmail(cs, tty) + case 1: + return redeemCode(tty) + case 2: fmt.Println() - fmt.Println("bye~") + fmt.Println(cs.Header("bye~")) return nil } - // TODO collect email + return nil +} +func collectEmail(cs colorScheme, tty *tty.TTY) error { + fmt.Println(cs.Header("We can send a reset code to an email associated with your town account.")) + email, err := stringPrompt(cs, tty, "email to send reset code to?") + if err != nil { + return err + } + + fmt.Println(email) + // TODO confirm email + // TODO generate reset code + // TODO send email + // TODO report success + return nil +} + +func redeemCode(tty *tty.TTY) error { + // TODO deserialize + // TODO verify code + // TODO accept key + // TODO verify key + // TODO add key to .authorized_keys2 + // TODO mark used return nil }