You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
3.1 KiB

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strconv"
  8. "strings"
  9. "github.com/dghubble/go-twitter/twitter"
  10. )
  11. func isRT(text string) bool {
  12. tweetWords := strings.Split(text, " ")
  13. for i := 0; i < len(tweetWords); i++ {
  14. if tweetWords[i] == "RT" {
  15. c.Red(text)
  16. return true
  17. }
  18. }
  19. return false
  20. }
  21. func generateMarkovResponse(states []State, word string) string {
  22. generatedText := markov.generateText(states, word, 15)
  23. return generatedText
  24. }
  25. func processTweet(states []State, flockUser *twitter.Client, botScreenName string, keywords []string, tweet *twitter.Tweet) {
  26. c.Yellow("bot @" + botScreenName + " - New tweet detected:")
  27. fmt.Println(tweet.Text)
  28. tweetWords := strings.Split(tweet.Text, " ")
  29. generatedText := "word no exist on the memory"
  30. for i := 0; i < len(tweetWords) && generatedText == "word no exist on the memory"; i++ {
  31. fmt.Println(strconv.Itoa(i) + " - " + tweetWords[i])
  32. generatedText = generateMarkovResponse(states, tweetWords[i])
  33. }
  34. c.Yellow("bot @" + botScreenName + " posting response")
  35. fmt.Println(tweet.ID)
  36. replyTweet(flockUser, "@"+tweet.User.ScreenName+" "+generatedText, tweet.ID)
  37. waitTime(1)
  38. }
  39. func startStreaming(states []State, flockUser *twitter.Client, botScreenName string, keywords []string) {
  40. // Convenience Demux demultiplexed stream messages
  41. demux := twitter.NewSwitchDemux()
  42. demux.Tweet = func(tweet *twitter.Tweet) {
  43. if isRT(tweet.Text) == false {
  44. processTweet(states, flockUser, botScreenName, keywords, tweet)
  45. }
  46. }
  47. demux.DM = func(dm *twitter.DirectMessage) {
  48. fmt.Println(dm.SenderID)
  49. }
  50. demux.Event = func(event *twitter.Event) {
  51. fmt.Printf("%#v\n", event)
  52. }
  53. fmt.Println("Starting Stream...")
  54. // FILTER
  55. filterParams := &twitter.StreamFilterParams{
  56. Track: keywords,
  57. StallWarnings: twitter.Bool(true),
  58. }
  59. stream, err := flockUser.Streams.Filter(filterParams)
  60. if err != nil {
  61. log.Fatal(err)
  62. }
  63. // Receive messages until stopped or stream quits
  64. demux.HandleChan(stream.Messages)
  65. // Wait for SIGINT and SIGTERM (HIT CTRL-C)
  66. /*ch := make(chan os.Signal)
  67. signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
  68. log.Println(<-ch)
  69. fmt.Println("Stopping Stream...")
  70. stream.Stop()*/
  71. }
  72. func optionMarkovFlockBotnet(flock Flock) {
  73. c.Green("Starting Markov's Flock botnet")
  74. fmt.Println("generating Markov chains")
  75. inputText, _ := readTxt("text.txt")
  76. states := markov.train(inputText)
  77. //getting the keywords
  78. c.Purple("entry words to stream tweets (separated by comma): ")
  79. newcommand := bufio.NewReader(os.Stdin)
  80. text, _ := newcommand.ReadString('\n')
  81. text = strings.TrimSpace(text)
  82. text = strings.Replace(text, " ", "", -1)
  83. keywords := strings.Split(text, ",")
  84. c.Purple("total keywords: " + strconv.Itoa(len(keywords)))
  85. fmt.Print("keywords to follow: ")
  86. fmt.Println(keywords)
  87. c.Red("Are you sure? [y/n]")
  88. newcommand = bufio.NewReader(os.Stdin)
  89. answer, _ := newcommand.ReadString('\n')
  90. answer = strings.TrimSpace(answer)
  91. switch answer {
  92. case "y":
  93. fmt.Println("ok, you are sure")
  94. for i := 0; i < len(flock.Clients); i++ {
  95. go startStreaming(states, flock.Clients[i], flock.ScreenNames[i], keywords)
  96. }
  97. break
  98. default:
  99. fmt.Println("Operation cancelled")
  100. break
  101. }
  102. }