aboutsummaryrefslogtreecommitdiff
path: root/cmd/x/mi.go
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2024-05-24 15:31:51 -0400
committerXe Iaso <me@xeiaso.net>2024-05-24 15:32:30 -0400
commitc3b8a7a5f9276b62cc3a93b1720f8c1c7d60c6eb (patch)
tree4a7fc94c5df7bd8545758144f1968c0192d78326 /cmd/x/mi.go
parent042eb1851d06597ca91a83a9cf93d4135efe1096 (diff)
downloadx-c3b8a7a5f9276b62cc3a93b1720f8c1c7d60c6eb.tar.xz
x-c3b8a7a5f9276b62cc3a93b1720f8c1c7d60c6eb.zip
cmd/mi: add event tracking
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd/x/mi.go')
-rw-r--r--cmd/x/mi.go158
1 files changed, 158 insertions, 0 deletions
diff --git a/cmd/x/mi.go b/cmd/x/mi.go
index 08b5d8c..46a8447 100644
--- a/cmd/x/mi.go
+++ b/cmd/x/mi.go
@@ -4,11 +4,15 @@ import (
"context"
"flag"
"fmt"
+ "log/slog"
"net/http"
+ "time"
+ "github.com/c-bata/go-prompt"
"github.com/google/subcommands"
"github.com/rodaine/table"
"google.golang.org/protobuf/types/known/emptypb"
+ "google.golang.org/protobuf/types/known/timestamppb"
"within.website/x/proto/mi"
)
@@ -109,3 +113,157 @@ func (ls *miListSwitches) Execute(ctx context.Context, f *flag.FlagSet, _ ...int
return subcommands.ExitSuccess
}
+
+type miListEvents struct{}
+
+func (*miListEvents) Name() string { return "list-events" }
+func (*miListEvents) Synopsis() string { return "List events to be attended." }
+func (*miListEvents) Usage() string {
+ return `list-events:
+List events to be attended.
+`
+}
+func (*miListEvents) SetFlags(f *flag.FlagSet) {}
+
+func (le *miListEvents) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
+ cli := mi.NewEventsProtobufClient(*miURL, http.DefaultClient)
+
+ resp, err := cli.Get(ctx, &emptypb.Empty{})
+ if err != nil {
+ fmt.Printf("error: %v\n", err)
+ return subcommands.ExitFailure
+ }
+
+ tbl := table.New("Name", "Start Date", "End Date", "Location")
+ for _, ev := range resp.Events {
+ tbl.AddRow(ev.Name, ev.StartDate.AsTime().Format("2006-01-02"), ev.EndDate.AsTime().Format("2006-01-02"), ev.Location)
+ }
+
+ tbl.Print()
+
+ return subcommands.ExitSuccess
+}
+
+type miAddEvent struct {
+ name string
+ url string
+ startDate string
+ endDate string
+ location string
+ description string
+}
+
+func (*miAddEvent) Name() string { return "add-event" }
+func (*miAddEvent) Synopsis() string { return "Add an event to be attended." }
+func (*miAddEvent) Usage() string {
+ return `add-event [--name] [--url] [--start-date] [--end-date] [--location] [--description]:
+Add an event to be attended.
+`
+}
+func (ae *miAddEvent) SetFlags(f *flag.FlagSet) {
+ f.StringVar(&ae.name, "name", "", "Name of the event.")
+ f.StringVar(&ae.url, "url", "", "URL of the event.")
+ f.StringVar(&ae.startDate, "start-date", "", "Start date of the event.")
+ f.StringVar(&ae.endDate, "end-date", "", "End date of the event.")
+ f.StringVar(&ae.location, "location", "", "Location of the event.")
+ f.StringVar(&ae.description, "description", "", "Description of the event.")
+}
+
+func (ae *miAddEvent) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
+ if ae.name == "" {
+ ae.name = prompt.Input("Event name: ", func(d prompt.Document) []prompt.Suggest {
+ return nil
+ })
+ }
+
+ if ae.url == "" {
+ ae.url = prompt.Input("Event URL: ", func(d prompt.Document) []prompt.Suggest {
+ return nil
+ })
+ }
+
+ if ae.startDate == "" {
+ for {
+ ae.startDate = prompt.Input("Event start date (YYYY-MM-DD): ", func(d prompt.Document) []prompt.Suggest {
+ return nil
+ })
+
+ _, err := time.Parse("2006-01-02", ae.startDate)
+ if err != nil {
+ fmt.Printf("error parsing date: %v\n", err)
+ continue
+ }
+
+ break
+ }
+ }
+
+ if ae.endDate == "" {
+ for {
+ ae.endDate = prompt.Input("Event end date (YYYY-MM-DD): ", func(d prompt.Document) []prompt.Suggest {
+ return nil
+ })
+
+ _, err := time.Parse("2006-01-02", ae.endDate)
+ if err != nil {
+ fmt.Printf("error parsing date: %v\n", err)
+ continue
+ }
+
+ break
+ }
+ }
+
+ if ae.location == "" {
+ ae.location = prompt.Input("Event location: ", func(d prompt.Document) []prompt.Suggest {
+ s := []prompt.Suggest{
+ {Text: "Remote", Description: "Remote event"},
+ {Text: "San Francisco", Description: "San Francisco, CA, USA"},
+ {Text: "New York", Description: "New York, NY, USA"},
+ {Text: "Ottawa", Description: "Ottawa, ON, Canada"},
+ {Text: "Montreal", Description: "Montreal, QC, Canada"},
+ {Text: "Toronto", Description: "Toronto, ON, Canada"},
+ }
+ return prompt.FilterHasPrefix(s, d.GetWordBeforeCursor(), true)
+ })
+ }
+
+ if ae.description == "" {
+ ae.description = prompt.Input("What will you be doing there? (first person): ", func(d prompt.Document) []prompt.Suggest {
+ return nil
+ })
+ }
+
+ cli := mi.NewEventsProtobufClient(*miURL, http.DefaultClient)
+
+ startDate, err := time.Parse("2006-01-02", ae.startDate)
+ if err != nil {
+ fmt.Printf("error parsing start date: %v\n", err)
+ return subcommands.ExitFailure
+ }
+
+ endDate, err := time.Parse("2006-01-02", ae.endDate)
+ if err != nil {
+ fmt.Printf("error parsing end date: %v\n", err)
+ return subcommands.ExitFailure
+ }
+
+ ev := &mi.Event{
+ Name: ae.name,
+ Url: ae.url,
+ StartDate: timestamppb.New(startDate),
+ EndDate: timestamppb.New(endDate),
+ Location: ae.location,
+ Description: ae.description,
+ }
+
+ slog.Info("adding event", "event", ev)
+
+ _, err = cli.Add(ctx, ev)
+ if err != nil {
+ fmt.Printf("error: %v\n", err)
+ return subcommands.ExitFailure
+ }
+
+ return subcommands.ExitSuccess
+}