package handler import ( "context" "fmt" "github.com/bwmarrin/discordgo" ) func (h *router) CreateRepoHandler(repoNameMinLength int) route { const ( projectRepo = "project_repo" buildRepo = "build_repo" ) return route{ Command: discordgo.ApplicationCommand{ Name: "repo", Description: "Command for repository creation", Options: []*discordgo.ApplicationCommandOption{ { Type: discordgo.ApplicationCommandOptionString, Name: "repo_type", Description: "The type of repo", Required: true, Choices: []*discordgo.ApplicationCommandOptionChoice{ { Name: "Unity project repo", Value: projectRepo, }, { Name: "XCode build repo", Value: buildRepo, }, }, }, { Type: discordgo.ApplicationCommandOptionString, Name: "repo_name", Description: "Type the repository's name", Required: false, MinLength: &repoNameMinLength, }, }, }, Handler: func(s *discordgo.Session, i *discordgo.InteractionCreate) { var result string // Access options in the order provided by the user. options := i.ApplicationCommandData().Options // Or convert the slice into a map optionMap := make(map[string]*discordgo.ApplicationCommandInteractionDataOption, len(options)) for _, opt := range options { optionMap[opt.Name] = opt } var str string = "" project, err := h.controller.GetProjectByChannelID(context.TODO(), i.ChannelID) if err != nil { result = fmt.Sprintf("unable to retrieve project from db, error: %v", err) } else { var suffix string if option, ok := optionMap["repo_type"]; ok { switch option.Value { case projectRepo: suffix = "" case buildRepo: suffix = "-build" } } if project == nil { if option, ok := optionMap["repo_name"]; ok { str = option.StringValue() } else { str = "" } } else { str = project.ShortName } if str == "" { result = "Ты, либо в проекте репо создавай, либо имя напиши, блет!" } else { str = str + suffix // var g *domain.Git g, err := h.controller.IGit.CreateRepo(str) if err != nil { result = fmt.Sprintf("error while repo creation: %v", err) } else { result = "🚀 " + g.HtmlUrl + " was created" } } } resp := &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ Content: result, }, } s.InteractionRespond(i.Interaction, resp) }, } }