package cmd import ( "encoding/json" "fmt" "git.db.org.ai/dborg/internal/client" "git.db.org.ai/dborg/internal/config" "git.db.org.ai/dborg/internal/utils" "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 { cfg := config.New() c, err := client.New(cfg) if err != nil { return err } response, err := c.SearchTwitterHistory(args[0]) if err != nil { return err } if response.Error != "" { return fmt.Errorf("API error: %s", response.Error) } if len(response.PreviousUsernames) > 0 { return utils.PrintJSON(response.PreviousUsernames) } else if response.Response != "" { fmt.Println(response.Response) } else if response.Data != nil { return utils.PrintJSON(response.Data) } else { fmt.Println("No username history found") } return nil } func runXTweetsSearch(cmd *cobra.Command, args []string) error { cfg := config.New() c, err := client.NewUnauthenticated(cfg) if err != nil { return err } err = c.FetchTweetsStream(args[0], func(result json.RawMessage) error { fmt.Println(string(result)) return nil }) if err != nil { return err } return nil } func runXFirstFollowers(cmd *cobra.Command, args []string) error { cfg := config.New() c, err := client.New(cfg) if err != nil { return err } response, err := c.GetFirstFollowers(args[0]) if err != nil { return err } return utils.PrintJSON(response) } func runXNotableFollowers(cmd *cobra.Command, args []string) error { cfg := config.New() c, err := client.New(cfg) if err != nil { return err } response, err := c.GetNotableFollowers(args[0]) if err != nil { return err } return utils.PrintJSON(response) } func runXReplies(cmd *cobra.Command, args []string) error { limit, _ := cmd.Flags().GetInt("limit") cfg := config.New() c, err := client.New(cfg) if err != nil { return err } err = c.FetchRepliesStream(args[0], limit, func(result json.RawMessage) error { fmt.Println(string(result)) return nil }) if err != nil { return err } return nil } func runXSearch(cmd *cobra.Command, args []string) error { limit, _ := cmd.Flags().GetInt("limit") cfg := config.New() c, err := client.New(cfg) if err != nil { return err } err = c.SearchTweetsStream(args[0], limit, func(result json.RawMessage) error { fmt.Println(string(result)) return nil }) if err != nil { return err } return nil }