package cmd import ( "encoding/json" "git.db.org.ai/dborg/internal/formatter" "git.db.org.ai/dborg/internal/models" "github.com/spf13/cobra" ) var xCmd = &cobra.Command{ Use: "x", Short: "Twitter/X tools and searches", Long: `Tools for searching Twitter/X username history and scraping tweets`, } var xHistoryCmd = &cobra.Command{ Use: "history [username]", Short: "Search Twitter/X username history", Long: `Search for Twitter/X username history and previous usernames`, Args: cobra.ExactArgs(1), RunE: runXHistorySearch, } var xTweetsCmd = &cobra.Command{ Use: "tweets [username]", Short: "Scrape tweets by username (Free OSINT)", Long: `Discovers tweet IDs from Internet Archive and fetches tweet content. Free and unauthenticated endpoint.`, Args: cobra.ExactArgs(1), RunE: runXTweetsSearch, } var xFirstCmd = &cobra.Command{ Use: "first [username]", Short: "Get first 20 followers of a Twitter/X account", Long: `Retrieves the first 20 followers of a Twitter/X account`, Args: cobra.ExactArgs(1), RunE: runXFirstFollowers, } var xNFLCmd = &cobra.Command{ Use: "nfl [username]", Short: "Get notable followers of a Twitter/X account", Long: `Retrieves the notable followers (influential accounts) following a Twitter/X account`, Args: cobra.ExactArgs(1), RunE: runXNotableFollowers, } var xRepliesCmd = &cobra.Command{ Use: "replies [tweet_id]", Short: "Fetch all replies for a tweet", Long: `Fetches all replies for a given tweet ID and streams results as NDJSON`, Args: cobra.ExactArgs(1), RunE: runXReplies, } var xSearchCmd = &cobra.Command{ Use: "search [query]", Short: "Search for tweets matching a term", Long: `Searches Twitter/X for tweets matching the given search term and streams results as NDJSON`, Args: cobra.ExactArgs(1), RunE: runXSearch, } func init() { rootCmd.AddCommand(xCmd) xCmd.AddCommand(xHistoryCmd) xCmd.AddCommand(xTweetsCmd) xCmd.AddCommand(xFirstCmd) xCmd.AddCommand(xNFLCmd) xCmd.AddCommand(xRepliesCmd) xCmd.AddCommand(xSearchCmd) xRepliesCmd.Flags().Int("limit", 100, "Maximum number of replies to fetch") xSearchCmd.Flags().Int("limit", 100, "Maximum number of tweets to fetch") } func runXHistorySearch(cmd *cobra.Command, args []string) error { c, err := newClient() if err != nil { return err } response, err := c.SearchTwitterHistory(args[0]) if err != nil { return err } if err := checkError(response.Error); err != nil { return err } output, err := formatter.FormatXHistory(response, IsJSONOutput()) if err != nil { return err } printOutput(output) return nil } func runXTweetsSearch(cmd *cobra.Command, args []string) error { c, err := newUnauthenticatedClient() if err != nil { return err } err = c.FetchTweetsStream(args[0], func(result json.RawMessage) error { var streamResp models.TweetsStreamResponse if err := json.Unmarshal(result, &streamResp); err != nil { return err } output, err := formatter.FormatXTweets(&streamResp, IsJSONOutput()) if err != nil { return err } printOutput(output) return nil }) if err != nil { return err } return nil } func runXFirstFollowers(cmd *cobra.Command, args []string) error { c, err := newClient() if err != nil { return err } response, err := c.GetFirstFollowers(args[0]) if err != nil { return err } output, err := formatter.FormatXFirstFollowers(response, IsJSONOutput()) if err != nil { return err } printOutput(output) return nil } func runXNotableFollowers(cmd *cobra.Command, args []string) error { c, err := newClient() if err != nil { return err } response, err := c.GetNotableFollowers(args[0]) if err != nil { return err } output, err := formatter.FormatXNotableFollowers(response, IsJSONOutput()) if err != nil { return err } printOutput(output) return nil } func runXReplies(cmd *cobra.Command, args []string) error { limit, _ := cmd.Flags().GetInt("limit") c, err := newClient() if err != nil { return err } err = c.FetchRepliesStream(args[0], limit, func(result json.RawMessage) error { var streamResp models.TweetsStreamResponse if err := json.Unmarshal(result, &streamResp); err != nil { return err } output, err := formatter.FormatXReplies(&streamResp, IsJSONOutput()) if err != nil { return err } printOutput(output) return nil }) if err != nil { return err } return nil } func runXSearch(cmd *cobra.Command, args []string) error { limit, _ := cmd.Flags().GetInt("limit") c, err := newClient() if err != nil { return err } err = c.SearchTweetsStream(args[0], limit, func(result json.RawMessage) error { var streamResp models.TweetsStreamResponse if err := json.Unmarshal(result, &streamResp); err != nil { return err } output, err := formatter.FormatXSearch(&streamResp, IsJSONOutput()) if err != nil { return err } printOutput(output) return nil }) if err != nil { return err } return nil }