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.

119 lines
3.4 KiB

package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
"github.com/dghubble/go-twitter/twitter"
)
func isRT(tweet *twitter.Tweet) bool {
tweetWords := strings.Split(tweet.Text, " ")
for i := 0; i < len(tweetWords); i++ {
if tweetWords[i] == "RT" {
return true
}
}
return false
}
func isFromBot(flock Flock, tweet *twitter.Tweet) bool {
for i := 0; i < len(flock.ScreenNames); i++ {
if flock.ScreenNames[i] == tweet.User.ScreenName {
return true
}
}
return false
}
func generateMarkovResponse(states []State, word string) string {
generatedText := markov.generateText(states, word, 15)
return generatedText
}
func processTweet(states []State, flockUser *twitter.Client, botScreenName string, keywords []string, tweet *twitter.Tweet) {
c.Yellow("bot @" + botScreenName + " - New tweet detected:")
fmt.Println(tweet.Text)
tweetWords := strings.Split(tweet.Text, " ")
generatedText := "word no exist on the memory"
for i := 0; i < len(tweetWords) && generatedText == "word no exist on the memory"; i++ {
fmt.Println(strconv.Itoa(i) + " - " + tweetWords[i])
generatedText = generateMarkovResponse(states, tweetWords[i])
}
c.Yellow("bot @" + botScreenName + " posting response")
fmt.Println(tweet.ID)
replyTweet(flockUser, "@"+tweet.User.ScreenName+" "+generatedText, tweet.ID)
waitTime(1)
}
func startStreaming(states []State, flock Flock, flockUser *twitter.Client, botScreenName string, keywords []string) {
// Convenience Demux demultiplexed stream messages
demux := twitter.NewSwitchDemux()
demux.Tweet = func(tweet *twitter.Tweet) {
if isRT(tweet) == false && isFromBot(flock, tweet) == false {
processTweet(states, flockUser, botScreenName, keywords, tweet)
}
}
demux.DM = func(dm *twitter.DirectMessage) {
fmt.Println(dm.SenderID)
}
demux.Event = func(event *twitter.Event) {
fmt.Printf("%#v\n", event)
}
fmt.Println("Starting Stream...")
// FILTER
filterParams := &twitter.StreamFilterParams{
Track: keywords,
StallWarnings: twitter.Bool(true),
}
stream, err := flockUser.Streams.Filter(filterParams)
if err != nil {
log.Fatal(err)
}
// Receive messages until stopped or stream quits
demux.HandleChan(stream.Messages)
// Wait for SIGINT and SIGTERM (HIT CTRL-C)
/*ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
log.Println(<-ch)
fmt.Println("Stopping Stream...")
stream.Stop()*/
}
func optionMarkovFlockBotnet(flock Flock) {
c.Green("Starting Markov's Flock botnet")
fmt.Println("generating Markov chains")
inputText, _ := readTxt("text.txt")
states := markov.train(inputText)
//getting the keywords
c.Purple("entry words to stream tweets (separated by comma): ")
newcommand := bufio.NewReader(os.Stdin)
text, _ := newcommand.ReadString('\n')
text = strings.TrimSpace(text)
text = strings.Replace(text, " ", "", -1)
keywords := strings.Split(text, ",")
c.Purple("total keywords: " + strconv.Itoa(len(keywords)))
fmt.Print("keywords to follow: ")
fmt.Println(keywords)
c.Red("Are you sure? [y/n]")
newcommand = bufio.NewReader(os.Stdin)
answer, _ := newcommand.ReadString('\n')
answer = strings.TrimSpace(answer)
switch answer {
case "y":
fmt.Println("ok, you are sure")
for i := 0; i < len(flock.Clients); i++ {
go startStreaming(states, flock, flock.Clients[i], flock.ScreenNames[i], keywords)
waitSeconds(35)
}
break
default:
fmt.Println("Operation cancelled")
break
}
}