mirror of git://git.acid.vegas/tools.git
159 lines
3.9 KiB
Go
159 lines
3.9 KiB
Go
package main
|
|
|
|
// Original 5000 bot was written in Python. This is a Go port of it by acidvegas.
|
|
|
|
import (
|
|
"bufio"
|
|
"crypto/tls"
|
|
"fmt"
|
|
"log"
|
|
"math/rand"
|
|
"strings"
|
|
"time"
|
|
"unicode/utf16"
|
|
)
|
|
|
|
var sendChannel chan<- string
|
|
|
|
const (
|
|
nickname = "FUCKYOU"
|
|
username = "5000"
|
|
realname = "\x0304THROWN INTO THE FUCKING WALL\x0f"
|
|
)
|
|
|
|
func randomASCIIString(n int) string {
|
|
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
b := make([]byte, n)
|
|
for i := range b {
|
|
b[i] = charset[rand.Intn(len(charset))]
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func unicodeString() string {
|
|
msg := "\u202e\u0007\x03" + fmt.Sprintf("%d", rand.Intn(12)+2)
|
|
for i := 0; i < rand.Intn(101)+200; i++ {
|
|
r := rand.Intn(0x2001) + 0x1000
|
|
if r < 0x10000 {
|
|
msg += string(rune(r))
|
|
} else {
|
|
r -= 0x10000
|
|
msg += string(utf16.DecodeRune(rune(r>>10+0xD800), rune(r&0x3FF+0xDC00)))
|
|
}
|
|
}
|
|
return msg
|
|
}
|
|
|
|
func attack(target string) {
|
|
sendChannel <- fmt.Sprintf("PRIVMSG #superbowl :I am fucking the shit out of %s right now...", target)
|
|
for i := 0; i < 200; i++ {
|
|
var channels []string
|
|
for i := 0; i < 25; i++ {
|
|
channelName := "#" + randomASCIIString(5)
|
|
channels = append(channels, channelName)
|
|
}
|
|
result := strings.Join(channels, ",")
|
|
sendChannel <- fmt.Sprintf("SAJOIN %s #%s", target, result)
|
|
sendChannel <- fmt.Sprintf("PRIVMSG #5000 :%s oh god %s what is happening %s", unicodeString(), target, unicodeString())
|
|
sendChannel <- fmt.Sprintf("PRIVMSG %s :%s oh god %s what is happening %s", target, unicodeString(), target, unicodeString())
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
for {
|
|
conn, err := tls.Dial("tcp", "localhost:6697", &tls.Config{InsecureSkipVerify: true})
|
|
if err != nil {
|
|
log.Println("Failed to connect: %v", err)
|
|
time.Sleep(15 * time.Second)
|
|
continue
|
|
}
|
|
|
|
messageChannel := make(chan string, 100) // INCOMING
|
|
sendChannel := make(chan string, 100) // OUTGOING
|
|
quit := make(chan struct{})
|
|
|
|
timeoutDuration := 300 * time.Second
|
|
timeoutTimer := time.NewTimer(timeoutDuration)
|
|
|
|
go func() {
|
|
reader := bufio.NewReader(conn)
|
|
for {
|
|
line, err := reader.ReadString('\n')
|
|
if err != nil {
|
|
log.Println("Error reading from server:", err)
|
|
conn.Close()
|
|
close(quit)
|
|
return
|
|
}
|
|
select {
|
|
case messageChannel <- line:
|
|
timeoutTimer.Reset(timeoutDuration)
|
|
case <-quit:
|
|
return
|
|
case <-timeoutTimer.C:
|
|
log.Println("No data received for 300 seconds. Reconnecting...")
|
|
conn.Close()
|
|
close(quit)
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case message := <-sendChannel:
|
|
data := []byte(message)
|
|
if len(data) > 510 {
|
|
data = data[:510]
|
|
}
|
|
_, err := conn.Write(append(data, '\r', '\n'))
|
|
if err != nil {
|
|
log.Println("Error writing to server:", err)
|
|
conn.Close()
|
|
close(quit)
|
|
return
|
|
}
|
|
case <-quit:
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
sendChannel <- fmt.Sprintf("NICK FUCKYOU")
|
|
sendChannel <- fmt.Sprintf("USER 5000 0 * :THROW INTO THE FUCKING WALL")
|
|
|
|
for {
|
|
handleMessage(<-messageChannel, sendChannel)
|
|
}
|
|
|
|
conn.Close()
|
|
//close(quit)
|
|
time.Sleep(15 * time.Second)
|
|
}
|
|
}
|
|
|
|
func handleMessage(message string, sendChannel chan<- string) {
|
|
fmt.Println(message)
|
|
parts := strings.Split(message, " ")
|
|
if len(parts) > 1 && parts[0] == "PING" {
|
|
sendChannel <- fmt.Sprintf("PONG %s", parts[1])
|
|
} else if len(parts) > 2 && parts[1] == "001" {
|
|
time.Sleep(5 * time.Second)
|
|
sendChannel <- fmt.Sprintf("MODE FUCKYOU +BDd")
|
|
sendChannel <- fmt.Sprintf("PRIVMSG NickServ IDENTIFY FUCKYOU simps0nsfan420")
|
|
sendChannel <- fmt.Sprintf("PRIVMSG OPER FUCKYOU fartsimps0n420")
|
|
sendChannel <- fmt.Sprintf("JOIN #5000")
|
|
sendChannel <- fmt.Sprintf("JOIN #superbowl")
|
|
} else if len(parts) == 3 {
|
|
if parts[1] == "JOIN" && parts[2] == "#5000" {
|
|
nick := strings.Split(parts[0], "!")[0][1:]
|
|
if nick != "acidvegas" && nick != "ChanServ" && nick != "FUCKYOU" {
|
|
go attack(nick)
|
|
}
|
|
}
|
|
}
|
|
}
|