diff options
| author | Christine Dodrill <me@christine.website> | 2018-11-26 17:53:37 -0800 |
|---|---|---|
| committer | Christine Dodrill <me@christine.website> | 2018-11-26 17:53:37 -0800 |
| commit | 60edbc1b67bb57a6351def2b6bf091f88e6e5af6 (patch) | |
| tree | 77117b15066ecb624e7a976008dc2822fb509743 | |
| parent | ded87ea20901aece9dbe2d70ebbb7092d622c87a (diff) | |
| download | x-60edbc1b67bb57a6351def2b6bf091f88e6e5af6.tar.xz x-60edbc1b67bb57a6351def2b6bf091f88e6e5af6.zip | |
remove irc stuff
| -rw-r--r-- | irc/bncadmin/.gitignore | 1 | ||||
| -rw-r--r-- | irc/bncadmin/box.rb | 13 | ||||
| -rw-r--r-- | irc/bncadmin/main.go | 191 | ||||
| -rw-r--r-- | irc/bncadmin/run.sh | 11 | ||||
| -rw-r--r-- | irc/clevelandbrown/.gitignore | 1 | ||||
| -rw-r--r-- | irc/clevelandbrown/main.go | 395 |
6 files changed, 0 insertions, 612 deletions
diff --git a/irc/bncadmin/.gitignore b/irc/bncadmin/.gitignore deleted file mode 100644 index 2eea525..0000000 --- a/irc/bncadmin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.env
\ No newline at end of file diff --git a/irc/bncadmin/box.rb b/irc/bncadmin/box.rb deleted file mode 100644 index ee751c6..0000000 --- a/irc/bncadmin/box.rb +++ /dev/null @@ -1,13 +0,0 @@ -from "xena/go" - -workdir "/" -copy "main.go", "/go/src/github.com/Xe/tools/irc/bncadmin/main.go" -copy "vendor", "/go/src/github.com/Xe/tools/irc/bncadmin/" -run "go install github.com/Xe/tools/irc/bncadmin && cp /go/bin/bncadmin /usr/bin/bncadmin" - -run "rm -rf /usr/local/go /go && apk del bash gcc musl-dev openssl go" -flatten - -cmd "/usr/bin/bncadmin" - -tag "xena/bncadmin" diff --git a/irc/bncadmin/main.go b/irc/bncadmin/main.go deleted file mode 100644 index f584a16..0000000 --- a/irc/bncadmin/main.go +++ /dev/null @@ -1,191 +0,0 @@ -package main - -import ( - "crypto/tls" - "fmt" - "log" - "os" - "strings" - "sync" - "time" - - "github.com/belak/irc" - _ "github.com/joho/godotenv/autoload" -) - -var ( - bncUsername = needEnv("BNC_USERNAME") - bncPassword = needEnv("BNC_PASSWORD") - bncServer = needEnv("BNC_SERVER") - serverSuffixExpected = needEnv("SERVER_SUFFIX") -) - -func needEnv(key string) string { - v := os.Getenv(key) - if v == "" { - log.Fatal("need value for " + key) - } - - return v -} - -func main() { - log.Println("Bot connecting to " + bncServer) - conn, err := tls.Dial("tcp", bncServer, &tls.Config{ - InsecureSkipVerify: true, - }) - if err != nil { - log.Fatal(err) - } - defer conn.Close() - - c := irc.NewClient(conn, irc.ClientConfig{ - Nick: "admin", - Pass: fmt.Sprintf("%s:%s", bncUsername, bncPassword), - User: "BNCbot", - Name: "BNC admin bot", - - Handler: NewBot(), - }) - - for _, cap := range []string{"userhost-in-names", "multi-prefix", "znc.in/server-time-iso"} { - c.Writef("CAP REQ %s", cap) - } - - err = c.Run() - if err != nil { - main() - } -} - -type Bot struct { - setupDaemon sync.Once - lookingForUserNetworks bool - - // i am sorry - launUsername string -} - -func NewBot() *Bot { - return &Bot{} -} - -func (b *Bot) Handle(c *irc.Client, m *irc.Message) { - b.setupDaemon.Do(func() { - go func() { - for { - b.lookingForUserNetworks = true - c.Writef("PRIVMSG *status ListAllUserNetworks") - time.Sleep(2 * time.Second) // always sleep 2 - b.lookingForUserNetworks = false - - time.Sleep(1 * time.Hour) - } - }() - }) - - // log.Printf("in >> %s", m) - - switch m.Command { - case "PRIVMSG": - if m.Prefix.Name == "*status" { - b.HandleStarStatus(c, m) - } - - if strings.HasPrefix(m.Prefix.Name, "?") { - b.HandlePartyLineCommand(c, m) - } - - if m.Params[0] == "#bnc" { - b.HandleCommand(c, m) - } - - case "NOTICE": - if m.Prefix.Name == "*status" { - f := strings.Fields(m.Trailing()) - if f[0] == "***" { - log.Println(m.Trailing()) - // look up geoip and log here - } - } - } -} - -func (b *Bot) HandleStarStatus(c *irc.Client, m *irc.Message) { - if b.lookingForUserNetworks { - if strings.HasPrefix(m.Trailing(), "| ") { - f := strings.Fields(m.Trailing()) - - switch len(f) { - case 11: // user name line - // 11: []string{"|", "AzureDiamond", "|", "N/A", "|", "0", "|", "|", "|", "|", "|"} - username := f[1] - b.launUsername = username - - case 15: // server and nick!user@host line - // 15: []string{"|", "`-", "|", "PonyChat", "|", "0", "|", "Yes", "|", "amethyststar.ponychat.net", "|", "test!test@lypbmzxixk.ponychat.net", "|", "1", "|"} - server := f[9] - network := f[3] - if !strings.HasSuffix(server, serverSuffixExpected) { - log.Printf("%s is using the BNC to connect to unknown server %s, removing permissions", b.launUsername, server) - b.RemoveNetwork(c, b.launUsername, network) - c.Writef("PRIVMSG ?%s :You have violated the terms of the BNC service and your account has been disabled. Please contact PonyChat staff to appeal this.", b.launUsername) - c.Writef("PRIVMSG *blockuser block %s", b.launUsername) - } - } - } - } -} - -func (b *Bot) HandlePartyLineCommand(c *irc.Client, m *irc.Message) { - split := strings.Fields(m.Trailing()) - username := m.Prefix.Name[1:] - - if len(split) == 0 { - return - } - - switch strings.ToLower(split[0]) { - case "help": - c.Writef("PRIVMSG ?%s :Commands available:", username) - c.Writef("PRIVMSG ?%s :- ChangeName <new desired \"real name\">", username) - c.Writef("PRIVMSG ?%s : Changes your IRC \"real name\" to a new value instead of the default", username) - c.Writef("PRIVMSG ?%s :- Reconnect", username) - c.Writef("PRIVMSG ?%s : Disconnects from PonyChat and connects to PonyChat again", username) - c.Writef("PRIVMSG ?%s :- Help", username) - c.Writef("PRIVMSG ?%s : Shows this Message", username) - case "changename": - if len(split) < 1 { - c.Writef("NOTICE %s :Usage: ChangeName <new desired \"real name\">") - return - } - - gecos := strings.Join(split[1:], " ") - c.Writef("PRIVMSG *controlpanel :Set RealName %s %s", username, gecos) - c.Writef("PRIVMSG ?%s :Please reply %q to confirm changing your \"real name\" to: %s", username, "Reconnect", gecos) - case "reconnect": - c.Writef("PRIVMSG ?%s :Reconnecting...", username) - c.Writef("PRIVMSG *controlpanel Reconnect %s PonyChat", username) - } -} - -func (b *Bot) HandleCommand(c *irc.Client, m *irc.Message) { - split := strings.Fields(m.Trailing()) - if split[0][0] == ';' { - switch strings.ToLower(split[0][1:]) { - case "request": - c.Write("PRIVMSG #bnc :In order to request a BNC account, please connect to the bouncer server (bnc.ponychat.net, ssl port 6697, allow untrusted certs) with your nickserv username and passsword in the server password field (example: AzureDiamond:hunter2)") - case "help": - c.Write("PRIVMSG #bnc :PonyChat bouncer help is available here: https://ponychat.net/help/bnc/") - case "rules": - c.Write("PRIVMSG #bnc :Terms of the BNC") - c.Write("PRIVMSG #bnc :- Do not use the BNC to evade channel bans") - c.Write("PRIVMSG #bnc :- Do not use the BNC to violate any network rules") - c.Write("PRIVMSG #bnc :- Do not use the BNC to connect to any other IRC network than PonyChat") - } - } -} - -func (b *Bot) RemoveNetwork(c *irc.Client, username, network string) { - c.Writef("PRIVMSG *controlpanel :DelNetwork %s %s", username, network) -} diff --git a/irc/bncadmin/run.sh b/irc/bncadmin/run.sh deleted file mode 100644 index 36e90b8..0000000 --- a/irc/bncadmin/run.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e -set -x - -box box.rb -docker push xena/bncadmin - -hyper rm -f bncadmin ||: -hyper pull xena/bncadmin -hyper run --name bncadmin --restart=always -dit --size s1 --env-file .env xena/bncadmin diff --git a/irc/clevelandbrown/.gitignore b/irc/clevelandbrown/.gitignore deleted file mode 100644 index 4c49bd7..0000000 --- a/irc/clevelandbrown/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.env diff --git a/irc/clevelandbrown/main.go b/irc/clevelandbrown/main.go deleted file mode 100644 index 8fa96c0..0000000 --- a/irc/clevelandbrown/main.go +++ /dev/null @@ -1,395 +0,0 @@ -package main - -import ( - "context" - "crypto/tls" - "log" - "os" - "strconv" - "strings" - "sync" - "time" - - "github.com/Xe/ln" - tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" - _ "github.com/joho/godotenv/autoload" - irc "gopkg.in/irc.v1" -) - -var ( - addr = os.Getenv("SERVER") - password = os.Getenv("PASSWORD") - tgToken = os.Getenv("TELEGRAM_TOKEN") - pokeIDStr = os.Getenv("POKE_ID") - - sclock sync.Mutex - scores map[string]float64 -) - -var ctx context.Context - -func main() { - scores = map[string]float64{} - - pokeID, err := strconv.Atoi(pokeIDStr) - if err != nil { - log.Fatal(err) - } - - ba, err := tgbotapi.NewBotAPI(tgToken) - if err != nil { - log.Fatal(err) - } - - conn, err := tls.Dial("tcp", addr, &tls.Config{ - InsecureSkipVerify: true, - }) - if err != nil { - log.Fatal(err) - } - - ctx = context.Background() - ctx = ln.WithF(ctx, ln.F{"app": "clevelandbrown"}) - - ln.Log(ctx, ln.F{ - "action": "connected", - "where": addr, - }) - - cli := irc.NewClient(conn, irc.ClientConfig{ - Handler: irc.HandlerFunc(scoreCleveland), - Nick: "Xena", - User: "xena", - Name: "cleveland brown termination bot", - Pass: password, - }) - - ff := ln.FilterFunc(func(ctx context.Context, e ln.Event) bool { - if val, ok := e.Data["svclog"]; ok && val.(bool) { - delete(e.Data, "svclog") - - line, err := ln.DefaultFormatter.Format(ctx, e) - if err != nil { - ln.FatalErr(ctx, err) - } - - err = cli.Writef("PRIVMSG #services :%s", string(line)) - if err != nil { - log.Fatal(err) - } - - msg := tgbotapi.NewMessage(int64(pokeID), string(line)) - - _, err = ba.Send(msg) - if err != nil { - log.Printf("can't send telegram message: %v", err) - return true - } - } - - return true - }) - - ln.DefaultLogger.Filters = append(ln.DefaultLogger.Filters, ff) - - go func() { - for { - time.Sleep(30 * time.Second) - - sclock.Lock() - defer sclock.Unlock() - - changed := 0 - ignored := 0 - - for key, sc := range scores { - if sc >= notifyThreshold { - ignored++ - continue - } - - scores[key] = sc / 100 - changed++ - } - - sclock.Unlock() - - ln.Log(ctx, ln.F{ - "action": "nerfed_scores", - "changed": changed, - "ignored": ignored, - }) - } - }() - - go func() { - for { - time.Sleep(5 * time.Minute) - - sclock.Lock() - defer sclock.Unlock() - - nsc := map[string]float64{} - - halved := 0 - rem := 0 - - for key, score := range scores { - if score > 0.01 { - if score > 3 { - score = score / 2 - halved++ - } - - nsc[key] = score - } else { - rem++ - } - } - - scores = nsc - - ln.Log(ctx, ln.F{ - "action": "reaped_scores", - "removed": rem, - "halved": halved, - }) - - sclock.Unlock() - } - }() - - ln.Log(ctx, ln.F{ - "action": "accepting_input", - "svclog": true, - }) - - cli.Run() -} - -const ( - notifyThreshold = 3 - autobanThreshold = 10 -) - -func scoreCleveland(c *irc.Client, m *irc.Message) { - if m.Trailing() == "!ohshitkillit" && m.Prefix.Host == "ponychat.net" { - ln.Fatal(ctx, ln.F{ - "action": "emergency_stop", - "user": m.Prefix.String(), - "channel": m.Params[0], - "svclog": true, - }) - } - - sclock.Lock() - defer sclock.Unlock() - - if m.Command != "PRIVMSG" { - return - } - - /* - if !strings.HasSuffix(m.Params[0], monitorChan) { - return - } - */ - - // channels to ignore - switch m.Params[0] { - case "#services", "#/dev/syslog": - return - } - - //opt-out list - switch m.Prefix.Name { - case "Taz", "cadance-syslog", "FromDiscord", "Sonata_Dusk", "CQ_Discord", "Onion": - return - case "Sparkler", "Aeyris", "Ryunosuke", "WaterStar", "Pegasique": - return - } - - sc, ok := scores[m.Prefix.Host] - if !ok { - sc = 0 - } - - for _, line := range lines { - if strings.Contains(strings.ToLower(m.Trailing()), line) { - sc += 1 - - ln.Log(ctx, ln.F{ - "action": "siren_compare", - "channel": m.Params[0], - "user": m.Prefix.String(), - "scoredelta": 1, - }) - } - } - - thisLine := strings.ToLower(m.Trailing()) - - for _, efnLine := range efknockr { - if strings.Contains(thisLine, strings.ToLower(efnLine)) { - const delta = 11 - sc += delta - ln.Log(ctx, ln.F{ - "action": "efknockr_detected", - "score": sc, - "user": m.Prefix.String(), - "channel": m.Params[0], - "delta": delta, - }) - } - } - - scores[m.Prefix.Host] = sc - - if sc >= notifyThreshold { - ln.Log(ctx, ln.F{ - "action": "warn", - "channel": m.Params[0], - "user": m.Prefix.String(), - "score": sc, - }) - } - - if sc > autobanThreshold { - c.Writef("PRIVMSG OperServ :AKILL ADD %s spamming | Cleveland show spammer", m.Prefix.Name) - - ln.Log(ctx, ln.F{ - "action": "kline_added", - "channel": m.Params[0], - "user": m.Prefix.String(), - "score": sc, - "svclog": true, - }) - - scores[m.Prefix.Host] = 0 - } -} - -const showLyrics = `my name is cleveland brown and I am proud to be -right back in my hometown with my new family. -there's old friends and new friends and even a bear. -through good times and bad times it's true love we share. -and so I found a place -where everyone will know -my happy mustache face -this is the cleveland show! haha!` - -var lines = []string{ - "my name is cleveland brown and I am proud to be", - "my name is cl3v3land brown and i am proud to be", - "right back in my hometown with my new family", - "right back in my hometown with my n3w family", - "there's old friends and new friends and even a bear", - "through good times and bad times it's true love we share.", - "and so I found a place", - "where everyone will know", - "my happy mustache face", - "this is the cleveland show! haha!", -} - -var efknockr = []string{ - "THIS NETWORK IS FUCKING BLOWJOBS LOL COME TO WORMSEC FOR SOME ICE COLD CHATS", - "0 DAY BANANA BOMBS \"OK\"", - "IRC.WORMSEC.US", - "THE HOTTEST MOST EXCLUSIVE SEC ON THE NET", - "THIS NETWORK IS BLOWJOBS! GET ON SUPERNETS FOR COLD HARD CHATS NOW", - "IRC.SUPERNETS.ORG | PORT 6667/6697 (SSL) | #SUPERBOWL | IPV6 READY", - "▓█▓▓▓▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▄░ ░▄▓▓▓▓▓▓▓▓▓█▓▓▓ IRC.WORMSEC.US | #SUPERBOWL", - "THIS NETWORK IS BLOWJOBS! GET ON SUPERNETS FOR COLD HARD CHATS NOW", - "▄", - "███▓▓▒▒▒▒▒▒▒░░░ ░░░░▒▒▒▓▓▓▓", - "▓█▓▓▓▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▄░ ░▄▓▓▓▓▓▓▓▓▓█▓▓▓", - "▒▓▓▓▓▒▒░░▒█▓▓▓▓▓▓▓▓▓▓█░▒░░▒▓▓▓▓▓▓▓▓▓▓▓█▓▓", - "░▒▓▓▒▒▒▒░░▒▒█▓▓▓▓▓▓▓▓▓█░▒░░░▒▓▓▓▓▓▓▓▓▓▓█▒▓░", - "▒▒▒▒▒▒▒▒▒▒▒░░▀▀▀▀▀▀▀ ░▒░░ ░▒▒▒▀▀▀▀▀▀▒▓▓▓▒", - "THE HOTTEST MOST EXCLUSIVE SEC ON THE NET", - "â–‘â–’â–“â–“â–’â–’â–’â–’â–‘â–‘â–’", - "Techman likes to fuck kids in the ass!!", - "https://discord.gg/3b86TH7", - "| |\\\\", - "/ \\ ||", - "( ,( )=m=D~~~ LOL DONGS", - "/ / | |", - "ARE YOU MAD THOSE PORCH *ONKEYS ARE ALWAYS BITCHING ABOUT RACISM??", - "DO YOU THINK THEY BELONG IN A ZOO WITH OBAMA EATING BANANA'S??", - "PLEASE JOIN #/JOIN ON irc.freenode.net OR MESSAGE VAP0R ON FREENODE", - "FOR INFORMATION ON A SOON MEETING OF SIMILARLY MINDED INVIDIDUALS", - "URGENT!! URGENT!! URGENT!! URGENT!! URGENT!!", - "THE DARKIES WHO LOOK LIKE GUERRILLAS WANT OUT OF THE ZOO!!", - "IF YOU WANT THEM TO STAY THERE IS A MEETING IN 30 MINS!!!", - "TRUMP TRUMP TRUMP TRUMP TRUMP TRUMP TRUMP TRUMP TRUMP TRUMP", - "ARE YOU TIRED OF PEOPLE WHO LOOK LIKE MONKEYS", - "TRYING TO TAKE MONUMENTS DOWN AND TAKING FREESPEECH AWAY??", - "HAVE YOU COME TO REALIZE THAT THEY HAVE A IQ OF 10 AND", - "CAN ONLY EAT BANANAS? IF SO PLEASE CHECK OUT", - "freedomeu4y6vlqu.onion/6667 (FREESPEECH IRC)", - "freedomeu4y6vlqu.onion", - "HAVE YOU EVER WANTED TO USE A TERMINAL IRC PROGRAM?", - "BUT DID NOT HAVE THE NECESSARY COMPUTER SKILLS?", - "WEECHAT IS NOW OFFERING TECH SUPPORT FOR ONLY", - "$10 DOLLARS A YEAR!! PLEASE VISIT #WEECHAT", - "IRC.FREENODE.NET FOR MORE INFORMATION!!", - "TECHPONIES IS NOW OFFERING TECH SUPPORT FOR ONLY", - "$10 DOLLARS A YEAR!! PLEASE VISIT #TECHPONIES", - "IRC.CANTERNET.ORG FOR MORE INFORMATION!!", - "ITS FUND-RAISER WEEK!!", - "DONATIONS ARE NEEDED FOR THIS GREAT WORK!!", - "PLEASE VISIT #WEECHAT", - "IRC.FREENODE.NET FOR MORE INFORMATION!!", - "type !donation in channel for donation info", - "DON'T YOU THINK ITS TIME FOR A HONEST CONVERSATION", - "ON HOW DUMB NIGGAS ARE?? PLEASE JOIN THE CONVO AT", - "dumniggaff3fjhrw.onion or with port 6667 (IRC)", - "LOOK AT ALL THE NIGGERS LOOTING IN FLORIDA ROFL!!", - "JOIN THE DISCUSSION torniggaiaoxhlcl.onion/6667", - "When disaster strikes...niggers go shopping", - "https://www.youtube.com/watch?v=uVee9A2IK0I", - "https://www.youtube.com/watch?v=AZkJzWFT6rA <== all niggers rofl", - "JOIN THE DISCUSSION dumniggaff3fjhrw.onion/6667", - "ARE YOU TIRED OF THOSE NIGGERS DISRESPECTING THE AMERICAN FLAG??", - "DO YOU AGREE WITH TRUMP THAT THOSE NIGGERS SHOULD BE FIRED", - "KEKISTAN IS HELPING ORGANIZING FREE SPEECH WEEK!!", - "HE CAN BE CONTACTED AT IRC.MADIRC.NET #1337", - "gv4z277ijqyn7uenr5pdvsovoawibwcjtlqgkxkfifdcs7csshpq.b32.i2p", - "(accessible with tunnel)", - "http://lvb6wabr3fuv7l2lmmaj33jwh7ntb7uuhmfmluc7hwtf6rm36k6q.b32.i2p/", - "(kiwi client on webpage)", - "PLEASE CALL L0DE RIGHT NOW!!!", - "415-349-5666", - "his live show @", - "https://www.youtube.com/watch?v=rXWx3lPlwgE", - "WE ARE TRYING TO INCREASE PARTICIPATION IN THIS SHOW", - "PLEASE CALL AND PARTICIPATE.", - "LOOK BITCHES CALL THE SHOW", - "LIVE DISCUSSION ON WHY NIGGERS ARE A CURSE FOR THE USA", - "or go to #lrh efnet irc for more information", - "THOSE STUPID MUSLIM SAND NIGGERS HAVE KILLED INNOCENT AMERICANS AGAIN", - "THE NAZI ORGANIZATION OF AMERICA IS PLANNING AN EMERGENCY MEETING", - "TODAY @ #/JOIN ON IRC.FREENODE.NET. DO NOT COMPLAIN IN #FREENODE", - "THIS MEETING IS INTENDED TO BE FOR MORE LIKEMINDED INDIVIDUALS", - "IF YOU HAVE QUESTIONS PLEASE DONT HESISTATE SENDING A MESSAGE TO", - "VAP0R ON IRC.FREENODE.NET.", - "The l0de Radio Hour is LIVE ! Call in now /join #LRH on irc.efnet.org !!! JOIN ! NOW !", - "https://www.youtube.com/watch?v=DIZqYgaOchY", - "JOIN #LRH EFNET TO JOIN THE DISCUSSION", - "ARE YOU INTERESTED IN THE WHITE NATIONALIST MOVEMENT?", - "DO YOU WONDER WHY WHITE PEOPLE ARE SMARTER THAN NIGGERS?", - "PLEASE JOIN #/JOIN ON FREENODE IRC NETWORK AND MESSAGE", - "VAP0R ON HOW TO JOIN THIS GROWING MOVEMENT!!", - "IRC.SUPERNETS.ORG #SUPERBOWL FEB 4. SUPERBOWL PARTY!!", - "ASK CHRONO FOR DETAILS!!", - "Hey, I thought you guys might be interested in this blog by freenode staff member Bryan 'kloeri' Ostergaard https://bryanostergaard.com/", - "or maybe this blog by freenode staff member Matthew 'mst' Trout https://MattSTrout.com", - "Read what IRC investigative journalists have uncovered on the freenode pedophilia scandal https://encyclopediadramatica.rs/Freenodegate", - "Voice your opinions at https://webchat.freenode.net/?channels=#freenode", - "This message was brought to you by Private Internet Access. Voice your opinions at https://webchat.freenode.net/?channels=%23freenode", - "<script type=\"text/javascript\" src=\"http://web.nba1001.net:8888/tj/tongji.js\"></script>", - "Interested in reasonably priced GLOBAL IRC ADVERTISING? Contact me on twitter https://twitter.com/nenolod or linkedin https://www.linkedin.com/in/nenolod", - "Want IRC ads? https://williampitcock.com/", - "With our IRC ad service you can reach a global audience of entrepreneurs and fentanyl addicts with extraordinary engagement rates! https://williampitcock.com/", - "Make sure to report this IP to any DNSBLs you might think of! That'll totally stop the flood. https://dronebl.org/ I also recommend installing https://github.com/kaniini/antissh", -} |
