package cmd import ( "context" "errors" "fmt" "os" "time" "git.handmade.network/hmn/hmn/src/db" "git.handmade.network/hmn/hmn/src/discord" "git.handmade.network/hmn/hmn/src/logging" "git.handmade.network/hmn/hmn/src/website" "github.com/spf13/cobra" ) func init() { rootCommand := &cobra.Command{ Use: "discord", Short: "Commands for interacting with Discord", } website.WebsiteCommand.AddCommand(rootCommand) scrapeCommand := &cobra.Command{ Use: "scrapechannel [...]", Short: "Scrape the entire history of Discord channels", Long: "Scrape the entire history of Discord channels, saving message content (but not creating snippets)", Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() conn := db.NewConnPool() defer conn.Close() for _, channelID := range args { discord.Scrape(ctx, conn, channelID, time.Time{}, false) } }, } rootCommand.AddCommand(scrapeCommand) makeSnippetCommand := &cobra.Command{ Use: "makesnippet [...]", Short: "Make snippets from Discord messages", Long: "Creates snippets from the specified messages in the specified channel. Will create a snippet as long as the poster of the message linked their account regardless of user settings.", Run: func(cmd *cobra.Command, args []string) { if len(args) < 2 { cmd.Usage() os.Exit(1) } ctx := context.Background() conn := db.NewConn() defer conn.Close(ctx) chanID := args[0] count := 0 for _, msgID := range args[1:] { message, err := discord.GetChannelMessage(ctx, chanID, msgID) if errors.Is(err, discord.NotFound) { logging.Warn().Msg(fmt.Sprintf("no message found on discord for id %s", msgID)) continue } else if err != nil { logging.Error().Msg(fmt.Sprintf("failed to fetch discord message id %s", msgID)) continue } err = discord.InternMessage(ctx, conn, message) if err != nil { logging.Error().Msg(fmt.Sprintf("failed to intern discord message id %s", msgID)) continue } err = discord.HandleInternedMessage(ctx, conn, message, false, true) if err != nil { logging.Error().Msg(fmt.Sprintf("failed to handle interned message id %s", msgID)) continue } count += 1 } logging.Info().Msg(fmt.Sprintf("Handled %d messages", count)) }, } rootCommand.AddCommand(makeSnippetCommand) }