package main import ( "context" "fmt" "maunium.net/go/mautrix/event" ) var Chatcommands = []MatrixCommand{} // getSitesByString is a helper function for chat commands. // If text is "all" it will get all sites. If text is a specific site name it will get that site. // Returns a list of strings that are textual representations of errors. func getSitesByString(text string) ([]Site, []string) { errors := []string{} // errors holds any errors we encounter in this function sites := []Site{} // sites holds every site we need // Determine which sites to get if text == "all" { // If we need to get all sites, (!restart all) var err DeployError sites, err = getAllSites() // Get all sites if err.code != 0 { // Check for errors errors = append(errors, "Failed to get all sites!") } } else { // If we need to get a specific site, (!restart LapisDeploy-TestApp) site, found, err := getSite(text) // (Attempt to) get that site. // Check if something went wrong (site doesn't exist, error occured) if err != nil { // Error occured. errors = append(errors, "Failed to get site "+text+"!") } else if !found { // Site doesn't exist. errors = append(errors, "Invalid site.") } sites = append(sites, site) // Add this site to the list of sites needed } return sites, errors } func registerChatCommands() { Chatcommands = []MatrixCommand{ { cmd: "help", description: "Show the help dialouge", callback: func(ctx context.Context, evt *event.Event, args []string) string { text := "" for _, cmd := range Chatcommands { text = fmt.Sprintf("%s- %s\n %s\n", text, cmd.cmd, cmd.description) } return text }, }, { cmd: "sites", description: "Display all available sites", callback: func(ctx context.Context, evt *event.Event, args []string) string { text := Circles["white"] + "Getting sites...\n" sites, err := getAllSites() if err.code != 0 { return text + Circles["red"] + "Failed to get sites!" } for _, site := range sites { text = fmt.Sprintf("%s%s", text, site.getName()) if site.config.name != "" { // Only add technical name to sites with a configured name. text += " (" + site.name + ")" } text += "\n" } if len(sites) == 0 { text = text + "*No sites found*" } return text }, }, { cmd: "restart", description: "Restart either a specific site, or all sites.", callback: func(ctx context.Context, evt *event.Event, args []string) string { if len(args) < 2 { // If no arguments were given return Circles["red"] + "Invalid site." } sites, errors := getSitesByString(args[1]) text := "" // text contains the entire message that will be sent. for _, error := range errors { text += Circles["red"] + error + "\n" } for _, site := range sites { // For every site queued to be restarted, if err := site.Restart(); err.code != 0 { // Attempt to restart it text += fmt.Sprintf("%sRestarting '%s'... failed!\n", Circles["red"], site.getName()) text += err.ToString() } else { // Otherwise, success. text += fmt.Sprintf("%sRestarting '%s'... success", Circles["green"], site.getName()) } } return text // Return the message. }, }, { cmd: "start", description: "Start a site.", callback: func(ctx context.Context, evt *event.Event, args []string) string { if len(args) < 2 { return Circles["red"] + "Invalid site." } sites, errors := getSitesByString(args[1]) text := "" // text contains the entire message that will be sent. for _, error := range errors { text += Circles["red"] + error + "\n" } for _, site := range sites { if err := site.Start(); err.code != 0 { text += fmt.Sprintf("%sStarting '%s'... failed!\n", Circles["red"], site.getName()) text += err.ToString() } else { text += fmt.Sprintf("%sStarting '%s'... success!\n", Circles["green"], site.getName()) } } return text }, }, { cmd: "stop", description: "Stop a site.", callback: func(ctx context.Context, evt *event.Event, args []string) string { if len(args) < 2 { return Circles["red"] + "Invalid site." } sites, errors := getSitesByString(args[1]) text := "" // text contains the entire message that will be sent. for _, error := range errors { text += Circles["red"] + error + "\n" } for _, site := range sites { if err := site.Stop(); err.code != 0 { text += fmt.Sprintf("%sStopping '%s'... failed!", Circles["red"], site.getName()) text += err.ToString() } else { text += fmt.Sprintf("%sStopping '%s'... success", Circles["green"], site.getName()) } } return text }, }, } }