From 0650a352c85b1ca8ee4d54b8e1c02e2e386fabb8 Mon Sep 17 00:00:00 2001 From: Chris Sexton Date: Tue, 26 Mar 2019 17:51:28 -0400 Subject: [PATCH] tldr: limit to 24h and limit rapid checks Also refactor a little bit. --- go.mod | 10 +- go.sum | 32 +- plugins/tldr/badwords.go | 2188 +++++++++++++++++++++++++++++++++++++ plugins/tldr/tldr.go | 99 +- plugins/tldr/tldr_test.go | 19 + 5 files changed, 2308 insertions(+), 40 deletions(-) create mode 100644 plugins/tldr/badwords.go diff --git a/go.mod b/go.mod index a696823..6d3988c 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,14 @@ module github.com/velour/catbase require ( github.com/PuerkitoBio/goquery v1.5.0 // indirect + github.com/armon/go-radix v1.0.0 // indirect github.com/chrissexton/leftpad v0.0.0-20181207133115-1e93189d2fff github.com/go-sql-driver/mysql v1.4.1 // indirect + github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 // indirect + github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 // indirect github.com/gorilla/websocket v1.4.0 // indirect + github.com/james-bowman/nlp v0.0.0-20190301165020-c5645f996605 + github.com/james-bowman/sparse v0.0.0-20190309194602-7d83420cfcbe // indirect github.com/jmoiron/sqlx v1.2.0 github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5 // indirect github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6 // indirect @@ -15,11 +20,14 @@ require ( github.com/olebedev/when v0.0.0-20190131080308-164b69386514 github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d // indirect github.com/rs/zerolog v1.12.0 + github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/stretchr/objx v0.1.1 // indirect github.com/stretchr/testify v1.3.0 github.com/velour/chat v0.0.0-20180713122344-fd1d1606cb89 github.com/velour/velour v0.0.0-20160303155839-8e090e68d158 - golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3 // indirect + golang.org/x/exp v0.0.0-20190321205749-f0864edee7f3 // indirect + golang.org/x/net v0.0.0-20190326090315-15845e8f865b // indirect + gonum.org/v1/gonum v0.0.0-20190325211145-e42c1265cdd5 // indirect google.golang.org/appengine v1.4.0 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect ) diff --git a/go.sum b/go.sum index f531cc7..a5f9830 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,12 @@ github.com/AlekSi/pointer v1.0.0 h1:KWCWzsvFxNLcmM5XmiqHsGTTsuwZMsLFwWF9Y+//bNE= github.com/AlekSi/pointer v1.0.0/go.mod h1:1kjywbfcPFCmncIxtk6fIEub6LKrfMz3gc5QKVOSOA8= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk= github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/chrissexton/leftpad v0.0.0-20181207133115-1e93189d2fff h1:+TEqaP0eO1unI7XHHFeMDhsxhLDIb0x8KYuZbqbAmxA= github.com/chrissexton/leftpad v0.0.0-20181207133115-1e93189d2fff/go.mod h1:QCRjR0b4qiJiNjuP7RFM89bh4UExGJalcWmYeSvlnRc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -13,8 +16,16 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 h1:EvokxLQsaaQjcWVWSV38221VAK7qc2zhaO17bKys/18= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 h1:8jtTdc+Nfj9AR+0soOeia9UZSvYBvETVHZrugUowJ7M= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/james-bowman/nlp v0.0.0-20190301165020-c5645f996605 h1:MjLvsJmW4uoTjleqqiL0wKRTjxUakKUhDNoSsSlS2hk= +github.com/james-bowman/nlp v0.0.0-20190301165020-c5645f996605/go.mod h1:kixuaexEqWB+mHZNysgnb6mqgGIT25WvD1/tFRRt0J0= +github.com/james-bowman/sparse v0.0.0-20190309194602-7d83420cfcbe h1:UFAsFuH6cu/0Lx+qBWfxiO69jrPkvdbG3qwSWI/7yF0= +github.com/james-bowman/sparse v0.0.0-20190309194602-7d83420cfcbe/go.mod h1:G6EcQnwZKsWtItoaQHd+FHPPk6bDeYVJSeeSP9Sge+I= github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= @@ -42,6 +53,8 @@ github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d h1:1VUlQbCfkoSGv github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= github.com/rs/zerolog v1.12.0 h1:aqZ1XRadoS8IBknR5IDFvGzbHly1X9ApIqOroooQF/c= github.com/rs/zerolog v1.12.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -51,13 +64,28 @@ github.com/velour/chat v0.0.0-20180713122344-fd1d1606cb89 h1:3D3M900hEBJJAqyKl70 github.com/velour/chat v0.0.0-20180713122344-fd1d1606cb89/go.mod h1:ejwOYCjnDMyO5LXFXRARQJGBZ6xQJZ3rgAHE5drSuMM= github.com/velour/velour v0.0.0-20160303155839-8e090e68d158 h1:p3rTUXxzuKsBOsHlkly7+rj9wagFBKeIsCDKkDII9sw= github.com/velour/velour v0.0.0-20160303155839-8e090e68d158/go.mod h1:Ojy3BTOiOTwpHpw7/HNi+TVTFppao191PQs+Qc3sqpE= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190321205749-f0864edee7f3 h1:Ep4L2ibjtJcW6IP73KbcJAU0cpNKsLNSSP2jE1xlCys= +golang.org/x/exp v0.0.0-20190321205749-f0864edee7f3/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3 h1:ulvT7fqt0yHWzpJwI57MezWnYDVpCAYBVuYst/L+fAY= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190326090315-15845e8f865b h1:LlDMQZ0I/u8J45sbt31TecpsFNErRGwDgS4WvT9hKzE= +golang.org/x/net v0.0.0-20190326090315-15845e8f865b/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +gonum.org/v1/gonum v0.0.0-20190325211145-e42c1265cdd5 h1:tyvqqvbB9Sn6UPjokEzsK6cCE9k4Tx/AHGGaJiLIk7g= +gonum.org/v1/gonum v0.0.0-20190325211145-e42c1265cdd5/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= diff --git a/plugins/tldr/badwords.go b/plugins/tldr/badwords.go new file mode 100644 index 0000000..0199c53 --- /dev/null +++ b/plugins/tldr/badwords.go @@ -0,0 +1,2188 @@ +package tldr + +var THESE_ARE_NOT_THE_WORDS_YOU_ARE_LOOKING_FOR = []string{ + "p", + "z", + "i", + "c", + "e", + "s", + "x", + "n", + "b", + "t", + "d", + "m", + "r", + "a", + "f", + "l", + "w", + "o", + "g", + "h", + "v", + "k", + "y", + "j", + "u", + "q", + "th", + "wu", + "qt", + "so", + "ru", + "pm", + "in", + "is", + "am", + "me", + "on", + "by", + "kw", + "hu", + "bg", + "ob", + "re", + "wx", + "go", + "hl", + "vc", + "bl", + "rg", + "wr", + "cw", + "pj", + "tf", + "nr", + "aw", + "qc", + "it", + "cj", + "or", + "ty", + "hk", + "be", + "wc", + "de", + "lf", + "mj", + "bw", + "at", + "as", + "gd", + "ww", + "ko", + "og", + "gg", + "cz", + "an", + "mh", + "we", + "rb", + "mv", + "uk", + "wt", + "us", + "hq", + "if", + "mu", + "pn", + "js", + "my", + "ol", + "ul", + "io", + "lm", + "do", + "cd", + "fo", + "no", + "vg", + "lu", + "dg", + "zu", + "sv", + "wn", + "fu", + "dk", + "tv", + "la", + "sn", + "wb", + "pc", + "he", + "pk", + "ii", + "wm", + "up", + "bo", + "ca", + "fd", + "uh", + "hh", + "al", + "id", + "bd", + "uw", + "co", + "pf", + "ez", + "df", + "ro", + "et", + "dh", + "ui", + "gl", + "st", + "rl", + "ev", + "jj", + "fp", + "hc", + "en", + "eh", + "rp", + "ka", + "rj", + "bm", + "oh", + "tb", + "ix", + "ad", + "cg", + "ny", + "rn", + "cn", + "dc", + "vp", + "jm", + "tp", + "om", + "ok", + "ms", + "wp", + "hi", + "aj", + "oc", + "sq", + "hp", + "yu", + "sk", + "dx", + "eg", + "ip", + "bk", + "hz", + "pa", + "fg", + "rh", + "tx", + "ve", + "za", + "ht", + "ie", + "el", + "ma", + "xi", + "ou", + "dp", + "nu", + "mw", + "mf", + "md", + "fl", + "mb", + "mr", + "ld", + "uc", + "il", + "ln", + "mm", + "ur", + "ed", + "pd", + "le", + "jc", + "az", + "un", + "mi", + "dm", + "wy", + "jd", + "oe", + "to", + "pb", + "dr", + "kb", + "pp", + "na", + "rx", + "os", + "nb", + "yn", + "ci", + "gc", + "ex", + "dt", + "au", + "fi", + "np", + "nc", + "po", + "va", + "rd", + "sc", + "ws", + "cu", + "se", + "di", + "km", + "ga", + "ac", + "ft", + "lc", + "fa", + "im", + "vs", + "ar", + "mo", + "sa", + "sg", + "uv", + "xp", + "je", + "eq", + "lt", + "eu", + "cc", + "wa", + "dj", + "ls", + "cm", + "wi", + "dl", + "ct", + "fx", + "yo", + "da", + "vb", + "of", + "nj", + "hr", + "em", + "iv", + "nn", + "rw", + "fs", + "ye", + "um", + "ni", + "ne", + "du", + "oo", + "bp", + "gs", + "fw", + "nt", + "es", + "fc", + "ti", + "cb", + "cv", + "gb", + "bc", + "pr", + "fr", + "aa", + "mt", + "ir", + "gp", + "oz", + "mg", + "tc", + "hb", + "sl", + "af", + "bt", + "ch", + "sd", + "jp", + "lb", + "rs", + "ep", + "ef", + "rr", + "fy", + "tu", + "dv", + "xl", + "ss", + "tt", + "ap", + "nm", + "mn", + "nd", + "pe", + "op", + "ng", + "tn", + "ge", + "ts", + "gr", + "ce", + "mx", + "ab", + "ic", + "yr", + "ot", + "ai", + "pi", + "rv", + "hs", + "ae", + "tm", + "sp", + "sh", + "gt", + "nh", + "ho", + "cl", + "ll", + "fm", + "gi", + "ta", + "db", + "ph", + "ia", + "pt", + "bi", + "ha", + "ds", + "ea", + "lg", + "bs", + "ja", + "ns", + "wv", + "nw", + "sm", + "ff", + "ah", + "sb", + "td", + "fe", + "ak", + "rf", + "ps", + "ky", + "pl", + "br", + "lo", + "ml", + "dd", + "cp", + "cs", + "rt", + "ri", + "gm", + "sf", + "kg", + "ut", + "si", + "mc", + "vt", + "lp", + "cf", + "rm", + "ag", + "vi", + "ec", + "ba", + "rc", + "cr", + "pg", + "ee", + "ra", + "ks", + "sw", + "av", + "te", + "hd", + "nz", + "bb", + "er", + "jr", + "tr", + "nv", + "ya", + "nl", + "li", + "su", + "mp", + "sr", + "ted", + "bid", + "can", + "the", + "nat", + "car", + "wan", + "dig", + "neo", + "enb", + "pvc", + "dod", + "fri", + "dvd", + "cia", + "tex", + "wed", + "une", + "how", + "inn", + "lid", + "mia", + "ltd", + "los", + "are", + "yen", + "cho", + "dui", + "inc", + "win", + "col", + "upc", + "bed", + "dsc", + "ste", + "aye", + "nhs", + "dow", + "tue", + "cio", + "ooo", + "cas", + "thu", + "sea", + "cut", + "mpg", + "rrp", + "tel", + "its", + "ips", + "pts", + "own", + "kit", + "mug", + "has", + "sku", + "nbc", + "dip", + "acm", + "boy", + "end", + "ids", + "him", + "est", + "son", + "ict", + "mac", + "iii", + "gmt", + "max", + "per", + "xml", + "big", + "bin", + "law", + "sap", + "ala", + "art", + "cir", + "lip", + "bat", + "top", + "eco", + "sol", + "van", + "had", + "buf", + "rip", + "ads", + "usa", + "wma", + "seq", + "pop", + "int", + "rid", + "rna", + "sim", + "abs", + "hit", + "but", + "wal", + "ati", + "doe", + "eye", + "geo", + "old", + "arg", + "usb", + "uni", + "php", + "etc", + "diy", + "leo", + "tgp", + "mud", + "msn", + "fee", + "rpg", + "las", + "ide", + "sic", + "min", + "aid", + "avi", + "ons", + "non", + "mel", + "div", + "ppc", + "day", + "fat", + "saw", + "cet", + "cow", + "mls", + "pst", + "why", + "phi", + "bra", + "mae", + "tom", + "fin", + "sub", + "irc", + "gpl", + "led", + "fan", + "low", + "ten", + "gif", + "ate", + "man", + "cat", + "die", + "ton", + "tmp", + "rec", + "two", + "ddr", + "our", + "gsm", + "pet", + "guy", + "dev", + "cup", + "vol", + "one", + "you", + "mag", + "dee", + "pit", + "mba", + "lee", + "job", + "boc", + "pmc", + "cfr", + "bee", + "vii", + "llp", + "too", + "tap", + "for", + "bob", + "fit", + "men", + "met", + "mem", + "por", + "www", + "cgi", + "soa", + "jvc", + "tft", + "ccd", + "liz", + "ice", + "dat", + "ali", + "box", + "llc", + "sec", + "bus", + "ash", + "bag", + "gay", + "all", + "tub", + "sox", + "ibm", + "sas", + "gig", + "qui", + "pty", + "dns", + "air", + "nor", + "bug", + "mid", + "pas", + "icq", + "sys", + "das", + "lil", + "cnn", + "jim", + "buy", + "yes", + "dam", + "del", + "hot", + "qld", + "new", + "say", + "ist", + "joe", + "may", + "cab", + "cds", + "nav", + "ind", + "pct", + "pos", + "dec", + "pod", + "vic", + "psi", + "san", + "cms", + "gem", + "tax", + "uri", + "got", + "atm", + "vcr", + "lab", + "cvs", + "hon", + "let", + "bow", + "des", + "cbs", + "eos", + "lcd", + "inf", + "ave", + "act", + "red", + "pie", + "apt", + "her", + "alt", + "ant", + "key", + "ppm", + "tan", + "few", + "sip", + "out", + "kde", + "pic", + "gym", + "age", + "mat", + "add", + "use", + "asn", + "pgp", + "lou", + "jan", + "oct", + "pay", + "tag", + "mix", + "any", + "vhs", + "fix", + "pal", + "tri", + "thy", + "war", + "nov", + "ray", + "leu", + "fda", + "see", + "vid", + "std", + "gmc", + "dry", + "spa", + "aaa", + "con", + "ups", + "fax", + "yet", + "gel", + "sao", + "lap", + "sun", + "rss", + "nhl", + "gen", + "mtv", + "mil", + "cod", + "not", + "run", + "net", + "msg", + "eau", + "plc", + "was", + "var", + "dos", + "put", + "rat", + "his", + "won", + "oem", + "tin", + "doc", + "try", + "mom", + "rap", + "mlb", + "row", + "she", + "flu", + "opt", + "usd", + "abu", + "ssl", + "ana", + "jpg", + "eat", + "cdt", + "ins", + "aim", + "isp", + "seo", + "les", + "bye", + "ann", + "tip", + "rfc", + "log", + "ski", + "irs", + "faq", + "dan", + "chi", + "nut", + "wax", + "fly", + "dts", + "fun", + "gbp", + "sen", + "hey", + "sue", + "bbc", + "ace", + "tea", + "avg", + "sky", + "feb", + "rom", + "eng", + "toy", + "sep", + "src", + "hip", + "hub", + "ghz", + "eds", + "lot", + "val", + "dot", + "hiv", + "pda", + "dir", + "ask", + "dsl", + "zum", + "dna", + "tcp", + "cad", + "fcc", + "tee", + "aka", + "tim", + "sql", + "zoo", + "don", + "due", + "mai", + "cry", + "vpn", + "who", + "dim", + "mar", + "cop", + "gps", + "erp", + "acc", + "pro", + "cap", + "ink", + "phd", + "pam", + "url", + "aug", + "pin", + "raw", + "gnu", + "amy", + "ben", + "ext", + "web", + "aol", + "ago", + "pac", + "odd", + "ent", + "hat", + "zus", + "lib", + "ban", + "cos", + "utc", + "der", + "fed", + "apr", + "ion", + "roy", + "cam", + "app", + "wet", + "ram", + "nil", + "fox", + "mrs", + "arc", + "arm", + "via", + "jar", + "obj", + "dom", + "kai", + "rio", + "jam", + "nyc", + "len", + "pub", + "bad", + "mas", + "set", + "hop", + "bon", + "gst", + "gun", + "ata", + "rca", + "ira", + "eva", + "rev", + "sur", + "sie", + "lat", + "sam", + "pdt", + "mhz", + "egg", + "tvs", + "pee", + "rpm", + "img", + "ref", + "pot", + "far", + "kid", + "map", + "pan", + "tba", + "cal", + "now", + "and", + "sad", + "jul", + "psp", + "fbi", + "jun", + "hrs", + "ham", + "und", + "rod", + "wav", + "dem", + "way", + "pad", + "nfl", + "eve", + "rug", + "soc", + "amd", + "usc", + "mic", + "tar", + "fur", + "yea", + "iso", + "sum", + "vip", + "amp", + "str", + "oak", + "vat", + "fog", + "duo", + "sig", + "get", + "sir", + "crm", + "kim", + "lie", + "gba", + "oil", + "spy", + "bit", + "aud", + "foo", + "den", + "yrs", + "pix", + "res", + "sit", + "wow", + "isa", + "ada", + "una", + "que", + "lit", + "pig", + "fig", + "gdp", + "bbs", + "nec", + "nam", + "sms", + "tab", + "bay", + "css", + "gtk", + "lan", + "urw", + "qty", + "hwy", + "aus", + "fwd", + "bio", + "api", + "toe", + "sri", + "pcs", + "bar", + "mit", + "von", + "dog", + "rep", + "ser", + "wit", + "ceo", + "sci", + "edt", + "cst", + "sin", + "bmw", + "hay", + "eur", + "kay", + "pdf", + "mod", + "dis", + "zen", + "ian", + "ing", + "rim", + "tie", + "pci", + "ear", + "nsw", + "ftp", + "med", + "reg", + "wto", + "ver", + "gui", + "leg", + "pat", + "off", + "dad", + "abc", + "org", + "usr", + "jay", + "gap", + "ron", + "til", + "mon", + "com", + "biz", + "rob", + "era", + "gcc", + "asp", + "did", + "epa", + "jet", + "par", + "nba", + "loc", + "gas", + "mad", + "six", + "gis", + "def", + "ken", + "pre", + "exp", + "bet", + "pen", + "mph", + "dpi", + "joy", + "cpu", + "ran", + "lol", + "sat", + "jon", + "lay", + "lbs", + "zip", + "ill", + "rows", + "pipe", + "seal", + "deck", + "sand", + "thin", + "shoe", + "sick", + "dose", + "till", + "cafe", + "lets", + "andy", + "semi", + "cats", + "cake", + "gang", + "greg", + "dial", + "luck", + "belt", + "tube", + "rail", + "folk", + "tiny", + "okay", + "hist", + "lift", + "lisa", + "mall", + "wing", + "neck", + "fell", + "yard", + "busy", + "tone", + "sean", + "pour", + "gate", + "tion", + "dust", + "wiki", + "kent", + "adds", + "bugs", + "bone", + "bang", + "alex", + "ward", + "meat", + "roof", + "kiss", + "peer", + "seed", + "para", + "cute", + "rush", + "mpeg", + "yoga", + "lamp", + "rico", + "phil", + "pmid", + "http", + "bulk", + "glad", + "wins", + "rack", + "aged", + "scan", + "bold", + "boss", + "ross", + "anna", + "solo", + "tall", + "grey", + "pdas", + "beds", + "ryan", + "nova", + "exam", + "anne", + "pump", + "wake", + "plot", + "nick", + "nasa", + "drum", + "pull", + "foto", + "ease", + "tabs", + "voip", + "grid", + "pine", + "tend", + "gulf", + "echo", + "rick", + "char", + "hunt", + "thai", + "fred", + "chip", + "mill", + "suit", + "bits", + "dont", + "burn", + "labs", + "twin", + "earn", + "jane", + "jose", + "beer", + "dear", + "alan", + "misc", + "push", + "sole", + "boot", + "laid", + "clay", + "weak", + "milk", + "blvd", + "arab", + "wise", + "rome", + "odds", + "vary", + "gary", + "marc", + "sons", + "leaf", + "loop", + "rice", + "hate", + "demo", + "cuba", + "gray", + "silk", + "kate", + "slot", + "adam", + "wolf", + "dish", + "fits", + "kick", + "meal", + "navy", + "hurt", + "tank", + "bowl", + "slip", + "mens", + "cuts", + "mile", + "mars", + "lock", + "node", + "rear", + "caps", + "pill", + "legs", + "meta", + "mint", + "crew", + "spin", + "babe", + "wash", + "warm", + "draw", + "aims", + "lens", + "ieee", + "pure", + "corp", + "visa", + "jean", + "soap", + "bond", + "unix", + "poll", + "axis", + "guns", + "dean", + "mesh", + "hero", + "acts", + "punk", + "holy", + "duke", + "wave", + "pace", + "wage", + "keys", + "iran", + "dawn", + "carl", + "coat", + "exit", + "rica", + "matt", + "soil", + "kits", + "tony", + "doll", + "seek", + "peru", + "nike", + "lose", + "reed", + "mice", + "bike", + "temp", + "perl", + "vast", + "cook", + "plug", + "wrap", + "mood", + "quiz", + "ages", + "kill", + "lane", + "beam", + "tops", + "jeff", + "bell", + "shut", + "salt", + "ncaa", + "thou", + "peak", + "mask", + "euro", + "evil", + "coal", + "yeah", + "runs", + "pair", + "ride", + "pets", + "lion", + "goto", + "hole", + "neil", + "beef", + "bass", + "hats", + "diff", + "surf", + "onto", + "rain", + "hook", + "cord", + "grow", + "crop", + "spot", + "eric", + "lite", + "nine", + "faqs", + "slow", + "hide", + "utah", + "arms", + "sing", + "tons", + "beat", + "kept", + "hang", + "wars", + "fear", + "hood", + "moon", + "dogs", + "math", + "fame", + "whom", + "mine", + "cape", + "toll", + "bids", + "seat", + "eggs", + "dell", + "fans", + "lady", + "ruby", + "mins", + "bird", + "stem", + "rise", + "drew", + "dual", + "bars", + "rare", + "tune", + "corn", + "wear", + "puts", + "grew", + "bags", + "trek", + "jazz", + "fail", + "ties", + "beta", + "brad", + "jury", + "font", + "tail", + "lawn", + "soup", + "byte", + "nose", + "oclc", + "bath", + "juan", + "roll", + "zero", + "thru", + "jews", + "trim", + "null", + "cent", + "acid", + "espn", + "spam", + "quit", + "lung", + "tape", + "wire", + "clip", + "todd", + "blow", + "doug", + "sees", + "zoom", + "knew", + "bull", + "cole", + "mart", + "tale", + "lynn", + "iowa", + "lack", + "docs", + "gain", + "bear", + "coin", + "fake", + "duty", + "cure", + "arch", + "vice", + "hdtv", + "asin", + "bomb", + "harm", + "hong", + "deer", + "dave", + "desk", + "disk", + "void", + "iron", + "atom", + "flag", + "oven", + "aids", + "noon", + "soul", + "felt", + "cast", + "cams", + "joel", + "ends", + "proc", + "icon", + "boat", + "mate", + "disc", + "chef", + "isle", + "slim", + "luke", + "comp", + "gene", + "fort", + "gone", + "fill", + "pete", + "spec", + "camp", + "penn", + "midi", + "tied", + "snow", + "dale", + "oils", + "sept", + "unto", + "inch", + "died", + "kong", + "pays", + "rank", + "lang", + "stud", + "fold", + "ones", + "gave", + "hire", + "seem", + "ipod", + "phys", + "pole", + "mega", + "bend", + "moms", + "glen", + "rich", + "drop", + "guys", + "tags", + "lips", + "pond", + "load", + "pick", + "rose", + "wait", + "walk", + "tire", + "chad", + "fuel", + "josh", + "drag", + "soft", + "ripe", + "rely", + "scsi", + "task", + "miss", + "wild", + "heat", + "nuts", + "nail", + "span", + "mass", + "joke", + "univ", + "foot", + "pads", + "inns", + "cups", + "cold", + "shot", + "pink", + "foam", + "root", + "edge", + "poem", + "ford", + "oral", + "asks", + "bean", + "bias", + "xbox", + "pain", + "palm", + "wind", + "sold", + "swim", + "nano", + "goal", + "ball", + "dvds", + "loud", + "rats", + "jump", + "stat", + "cruz", + "bios", + "firm", + "thee", + "lots", + "ruth", + "pray", + "pope", + "jeep", + "bare", + "hung", + "gear", + "army", + "mono", + "tile", + "diet", + "apps", + "skip", + "laws", + "path", + "flow", + "ciao", + "knee", + "prep", + "flat", + "chem", + "jack", + "zone", + "hits", + "pros", + "cant", + "wife", + "goes", + "hear", + "lord", + "farm", + "sara", + "eyes", + "joan", + "duck", + "poor", + "trip", + "mike", + "dive", + "dead", + "fiji", + "audi", + "raid", + "gets", + "volt", + "ohio", + "dirt", + "fair", + "acer", + "dist", + "isbn", + "geek", + "sink", + "grip", + "host", + "watt", + "pins", + "reno", + "dark", + "polo", + "rent", + "horn", + "wood", + "prot", + "frog", + "logs", + "sets", + "core", + "debt", + "snap", + "race", + "born", + "pack", + "fish", + "jpeg", + "mini", + "pool", + "swap", + "rest", + "flip", + "deep", + "boys", + "buzz", + "nuke", + "iraq", + "boom", + "calm", + "fork", + "troy", + "ring", + "mary", + "prev", + "zope", + "gmbh", + "skin", + "fees", + "sims", + "tray", + "pass", + "sage", + "java", + "uses", + "asia", + "cool", + "suse", + "door", + "cave", + "wool", + "feet", + "told", + "rule", + "ways", + "eyed", + "vote", + "grab", + "oops", + "wine", + "wall", + "thus", + "tree", + "trap", + "fool", + "hair", + "karl", + "dies", + "paid", + "ship", + "anti", + "hall", + "jail", + "feed", + "safe", + "ipaq", + "hold", + "comm", + "deal", + "maps", + "lace", + "hill", + "ugly", + "hart", + "ment", + "tool", + "idea", + "fall", + "biol", + "late", + "lies", + "cnet", + "song", + "took", + "treo", + "gods", + "male", + "fund", + "mode", + "poly", + "ears", + "went", + "lead", + "fist", + "band", + "mere", + "cons", + "sent", + "taxi", + "nice", + "logo", + "move", + "kind", + "huge", + "bush", + "hour", + "worn", + "shaw", + "fine", + "expo", + "came", + "deny", + "bali", + "judy", + "trio", + "cube", + "rugs", + "fate", + "role", + "gras", + "wish", + "hope", + "menu", + "tour", + "lost", + "mind", + "oval", + "held", + "soma", + "soon", + "href", + "benz", + "wifi", + "tier", + "stop", + "earl", + "port", + "seen", + "guam", + "cite", + "cash", + "pics", + "drug", + "copy", + "mess", + "king", + "mean", + "turn", + "stay", + "rope", + "dump", + "near", + "base", + "face", + "loss", + "hose", + "html", + "chat", + "fire", + "sony", + "pubs", + "lake", + "paul", + "mild", + "none", + "step", + "half", + "sort", + "clan", + "sync", + "mesa", + "wide", + "loan", + "hull", + "golf", + "toys", + "shed", + "memo", + "girl", + "tide", + "funk", + "town", + "reel", + "risk", + "bind", + "rand", + "buck", + "bank", + "feel", + "meet", + "usgs", + "acre", + "lows", + "aqua", + "chen", + "emma", + "tech", + "pest", + "unit", + "fact", + "fast", + "reef", + "edit", + "auto", + "plus", + "chan", + "tips", + "beth", + "rock", + "mark", + "else", + "jill", + "sofa", + "true", + "dans", + "viii", + "kids", + "talk", + "tent", + "dept", + "hack", + "dare", + "hawk", + "lamb", + "bill", + "word", + "ever", + "done", + "land", + "says", + "upon", + "five", + "past", + "arts", + "gold", + "able", + "junk", + "tell", + "lucy", + "hans", + "poet", + "epic", + "cars", + "sake", + "sans", + "sure", + "lean", + "once", + "away", + "self", + "dude", + "luis", + "cell", + "head", + "film", + "alto", + "term", + "baby", + "keep", + "gore", + "cult", + "dash", + "cage", + "divx", + "hugh", + "hand", + "jake", + "eval", + "ping", + "flux", + "star", + "muze", + "oman", + "easy", + "blue", + "rage", + "adsl", + "four", + "prix", + "hard", + "gift", + "avon", + "rays", + "road", + "walt", + "acne", + "libs", + "undo", + "club", + "east", + "dana", + "halo", + "body", + "sell", + "gays", + "give", + "exec", + "side", + "park", + "blog", + "less", + "play", + "maui", + "cart", + "come", + "test", + "vids", + "yale", + "july", + "cost", + "plan", + "june", + "doom", + "owen", + "bite", + "issn", + "myth", + "live", + "note", + "week", + "weed", + "oecd", + "dice", + "quad", + "dock", + "mods", + "hint", + "msie", + "team", + "left", + "look", + "west", + "buys", + "pork", + "join", + "barn", + "room", + "teen", + "fare", + "sale", + "asus", + "food", + "bald", + "fuji", + "leon", + "mold", + "dame", + "jobs", + "herb", + "card", + "alot", + "york", + "idle", + "save", + "call", + "main", + "john", + "love", + "form", + "rate", + "text", + "cove", + "casa", + "shop", + "eden", + "incl", + "size", + "down", + "care", + "game", + "reid", + "both", + "flex", + "rosa", + "hash", + "lazy", + "same", + "case", + "carb", + "open", + "link", + "file", + "sign", + "much", + "even", + "pens", + "show", + "code", + "worm", + "long", + "deaf", + "mats", + "want", + "blah", + "mime", + "feof", + "usda", + "keen", + "peas", + "urls", + "area", + "take", + "type", + "send", + "owns", + "line", + "made", + "must", + "ebay", + "item", + "zinc", + "guru", + "real", + "levy", + "grad", + "bras", + "part", + "days", + "kyle", + "know", + "life", + "pale", + "gaps", + "tear", + "full", + "mail", + "does", + "nest", + "said", + "nato", + "user", + "gale", + "many", + "stan", + "idol", + "need", + "read", + "book", + "very", + "moss", + "each", + "cork", + "high", + "mali", + "info", + "dome", + "well", + "heel", + "yang", + "good", + "then", + "best", + "such", + "city", + "post", + "them", + "make", + "data", + "dumb", + "most", + "last", + "work", + "used", + "next", + "into", + "year", + "feat", + "ntsc", + "over", + "usps", + "just", + "name", + "conf", + "glow", + "list", + "back", + "oaks", + "erik", + "date", + "find", + "than", + "paso", + "norm", + "like", + "some", + "ware", + "were", + "been", + "jade", + "foul", + "keno", + "view", + "seas", + "help", + "pose", + "mrna", + "goat", + "also", + "here", + "sail", + "when", + "only", + "sega", + "cdna", + "news", + "what", + "bolt", + "gage", + "site", + "they", + "time", + "urge", + "smtp", + "kurt", + "neon", + "ours", + "lone", + "cope", + "free", + "lime", + "kirk", + "bool", + "page", + "home", + "will", + "spas", + "more", + "jets", + "have", + "intl", + "your", + "yarn", + "knit", + "from", + "with", + "this", + "pike", + "that", + "hugo", + "gzip", + "ctrl", + "bent", + "laos", +} diff --git a/plugins/tldr/tldr.go b/plugins/tldr/tldr.go index 25c5c37..fc03454 100644 --- a/plugins/tldr/tldr.go +++ b/plugins/tldr/tldr.go @@ -3,6 +3,7 @@ package tldr import ( "fmt" "strings" + "time" "github.com/velour/catbase/bot" "github.com/velour/catbase/bot/msg" @@ -12,23 +13,25 @@ import ( "github.com/james-bowman/nlp" ) -var ( - THESE_ARE_NOT_THE_WORDS_YOU_ARE_LOOKING_FOR = []string{"p", "z", "i", "c", "e", "s", "x", "n", "b", "t", "d", "m", "r", "a", "f", "l", "w", "o", "g", "h", "v", "k", "y", "j", "u", "q", "th", "wu", "qt", "so", "ru", "pm", "in", "is", "am", "me", "on", "by", "kw", "hu", "bg", "ob", "re", "wx", "go", "hl", "vc", "bl", "rg", "wr", "cw", "pj", "tf", "nr", "aw", "qc", "it", "cj", "or", "ty", "hk", "be", "wc", "de", "lf", "mj", "bw", "at", "as", "gd", "ww", "ko", "og", "gg", "cz", "an", "mh", "we", "rb", "mv", "uk", "wt", "us", "hq", "if", "mu", "pn", "js", "my", "ol", "ul", "io", "lm", "do", "cd", "fo", "no", "vg", "lu", "dg", "zu", "sv", "wn", "fu", "dk", "tv", "la", "sn", "wb", "pc", "he", "pk", "ii", "wm", "up", "bo", "ca", "fd", "uh", "hh", "al", "id", "bd", "uw", "co", "pf", "ez", "df", "ro", "et", "dh", "ui", "gl", "st", "rl", "ev", "jj", "fp", "hc", "en", "eh", "rp", "ka", "rj", "bm", "oh", "tb", "ix", "ad", "cg", "ny", "rn", "cn", "dc", "vp", "jm", "tp", "om", "ok", "ms", "wp", "hi", "aj", "oc", "sq", "hp", "yu", "sk", "dx", "eg", "ip", "bk", "hz", "pa", "fg", "rh", "tx", "ve", "za", "ht", "ie", "el", "ma", "xi", "ou", "dp", "nu", "mw", "mf", "md", "fl", "mb", "mr", "ld", "uc", "il", "ln", "mm", "ur", "ed", "pd", "le", "jc", "az", "un", "mi", "dm", "wy", "jd", "oe", "to", "pb", "dr", "kb", "pp", "na", "rx", "os", "nb", "yn", "ci", "gc", "ex", "dt", "au", "fi", "np", "nc", "po", "va", "rd", "sc", "ws", "cu", "se", "di", "km", "ga", "ac", "ft", "lc", "fa", "im", "vs", "ar", "mo", "sa", "sg", "uv", "xp", "je", "eq", "lt", "eu", "cc", "wa", "dj", "ls", "cm", "wi", "dl", "ct", "fx", "yo", "da", "vb", "of", "nj", "hr", "em", "iv", "nn", "rw", "fs", "ye", "um", "ni", "ne", "du", "oo", "bp", "gs", "fw", "nt", "es", "fc", "ti", "cb", "cv", "gb", "bc", "pr", "fr", "aa", "mt", "ir", "gp", "oz", "mg", "tc", "hb", "sl", "af", "bt", "ch", "sd", "jp", "lb", "rs", "ep", "ef", "rr", "fy", "tu", "dv", "xl", "ss", "tt", "ap", "nm", "mn", "nd", "pe", "op", "ng", "tn", "ge", "ts", "gr", "ce", "mx", "ab", "ic", "yr", "ot", "ai", "pi", "rv", "hs", "ae", "tm", "sp", "sh", "gt", "nh", "ho", "cl", "ll", "fm", "gi", "ta", "db", "ph", "ia", "pt", "bi", "ha", "ds", "ea", "lg", "bs", "ja", "ns", "wv", "nw", "sm", "ff", "ah", "sb", "td", "fe", "ak", "rf", "ps", "ky", "pl", "br", "lo", "ml", "dd", "cp", "cs", "rt", "ri", "gm", "sf", "kg", "ut", "si", "mc", "vt", "lp", "cf", "rm", "ag", "vi", "ec", "ba", "rc", "cr", "pg", "ee", "ra", "ks", "sw", "av", "te", "hd", "nz", "bb", "er", "jr", "tr", "nv", "ya", "nl", "li", "su", "mp", "sr", "ted", "bid", "can", "the", "nat", "car", "wan", "dig", "neo", "enb", "pvc", "dod", "fri", "dvd", "cia", "tex", "wed", "une", "how", "inn", "lid", "mia", "ltd", "los", "are", "yen", "cho", "dui", "inc", "win", "col", "upc", "bed", "dsc", "ste", "aye", "nhs", "dow", "tue", "cio", "ooo", "cas", "thu", "sea", "cut", "mpg", "rrp", "tel", "its", "ips", "pts", "own", "kit", "mug", "has", "sku", "nbc", "dip", "acm", "boy", "end", "ids", "him", "est", "son", "ict", "mac", "iii", "gmt", "max", "per", "xml", "big", "bin", "law", "sap", "ala", "art", "cir", "lip", "bat", "top", "eco", "sol", "van", "had", "buf", "rip", "ads", "usa", "wma", "seq", "pop", "int", "rid", "rna", "sim", "abs", "hit", "but", "wal", "ati", "doe", "eye", "geo", "old", "arg", "usb", "uni", "php", "etc", "diy", "leo", "tgp", "mud", "msn", "fee", "rpg", "las", "ide", "sic", "min", "aid", "avi", "ons", "non", "mel", "div", "ppc", "day", "fat", "saw", "cet", "cow", "mls", "pst", "why", "phi", "bra", "mae", "tom", "fin", "sub", "irc", "gpl", "led", "fan", "low", "ten", "gif", "ate", "man", "cat", "die", "ton", "tmp", "rec", "two", "ddr", "our", "gsm", "pet", "guy", "dev", "cup", "vol", "one", "you", "mag", "dee", "pit", "mba", "lee", "job", "boc", "pmc", "cfr", "bee", "vii", "llp", "too", "tap", "for", "bob", "fit", "men", "met", "mem", "por", "www", "cgi", "soa", "jvc", "tft", "ccd", "liz", "ice", "dat", "ali", "box", "llc", "sec", "bus", "ash", "bag", "gay", "all", "tub", "sox", "ibm", "sas", "gig", "qui", "pty", "dns", "air", "nor", "bug", "mid", "pas", "icq", "sys", "das", "lil", "cnn", "jim", "buy", "yes", "dam", "del", "hot", "qld", "new", "say", "ist", "joe", "may", "cab", "cds", "nav", "ind", "pct", "pos", "dec", "pod", "vic", "psi", "san", "cms", "gem", "tax", "uri", "got", "atm", "vcr", "lab", "cvs", "hon", "let", "bow", "des", "cbs", "eos", "lcd", "inf", "ave", "act", "red", "pie", "apt", "her", "alt", "ant", "key", "ppm", "tan", "few", "sip", "out", "kde", "pic", "gym", "age", "mat", "add", "use", "asn", "pgp", "lou", "jan", "oct", "pay", "tag", "mix", "any", "vhs", "fix", "pal", "tri", "thy", "war", "nov", "ray", "leu", "fda", "see", "vid", "std", "gmc", "dry", "spa", "aaa", "con", "ups", "fax", "yet", "gel", "sao", "lap", "sun", "rss", "nhl", "gen", "mtv", "mil", "cod", "not", "run", "net", "msg", "eau", "plc", "was", "var", "dos", "put", "rat", "his", "won", "oem", "tin", "doc", "try", "mom", "rap", "mlb", "row", "she", "flu", "opt", "usd", "abu", "ssl", "ana", "jpg", "eat", "cdt", "ins", "aim", "isp", "seo", "les", "bye", "ann", "tip", "rfc", "log", "ski", "irs", "faq", "dan", "chi", "nut", "wax", "fly", "dts", "fun", "gbp", "sen", "hey", "sue", "bbc", "ace", "tea", "avg", "sky", "feb", "rom", "eng", "toy", "sep", "src", "hip", "hub", "ghz", "eds", "lot", "val", "dot", "hiv", "pda", "dir", "ask", "dsl", "zum", "dna", "tcp", "cad", "fcc", "tee", "aka", "tim", "sql", "zoo", "don", "due", "mai", "cry", "vpn", "who", "dim", "mar", "cop", "gps", "erp", "acc", "pro", "cap", "ink", "phd", "pam", "url", "aug", "pin", "raw", "gnu", "amy", "ben", "ext", "web", "aol", "ago", "pac", "odd", "ent", "hat", "zus", "lib", "ban", "cos", "utc", "der", "fed", "apr", "ion", "roy", "cam", "app", "wet", "ram", "nil", "fox", "mrs", "arc", "arm", "via", "jar", "obj", "dom", "kai", "rio", "jam", "nyc", "len", "pub", "bad", "mas", "set", "hop", "bon", "gst", "gun", "ata", "rca", "ira", "eva", "rev", "sur", "sie", "lat", "sam", "pdt", "mhz", "egg", "tvs", "pee", "rpm", "img", "ref", "pot", "far", "kid", "map", "pan", "tba", "cal", "now", "and", "sad", "jul", "psp", "fbi", "jun", "hrs", "ham", "und", "rod", "wav", "dem", "way", "pad", "nfl", "eve", "rug", "soc", "amd", "usc", "mic", "tar", "fur", "yea", "iso", "sum", "vip", "amp", "str", "oak", "vat", "fog", "duo", "sig", "get", "sir", "crm", "kim", "lie", "gba", "oil", "spy", "bit", "aud", "foo", "den", "yrs", "pix", "res", "sit", "wow", "isa", "ada", "una", "que", "lit", "pig", "fig", "gdp", "bbs", "nec", "nam", "sms", "tab", "bay", "css", "gtk", "lan", "urw", "qty", "hwy", "aus", "fwd", "bio", "api", "toe", "sri", "pcs", "bar", "mit", "von", "dog", "rep", "ser", "wit", "ceo", "sci", "edt", "cst", "sin", "bmw", "hay", "eur", "kay", "pdf", "mod", "dis", "zen", "ian", "ing", "rim", "tie", "pci", "ear", "nsw", "ftp", "med", "reg", "wto", "ver", "gui", "leg", "pat", "off", "dad", "abc", "org", "usr", "jay", "gap", "ron", "til", "mon", "com", "biz", "rob", "era", "gcc", "asp", "did", "epa", "jet", "par", "nba", "loc", "gas", "mad", "six", "gis", "def", "ken", "pre", "exp", "bet", "pen", "mph", "dpi", "joy", "cpu", "ran", "lol", "sat", "jon", "lay", "lbs", "zip", "ill", "rows", "pipe", "seal", "deck", "sand", "thin", "shoe", "sick", "dose", "till", "cafe", "lets", "andy", "semi", "cats", "cake", "gang", "greg", "dial", "luck", "belt", "tube", "rail", "folk", "tiny", "okay", "hist", "lift", "lisa", "mall", "wing", "neck", "fell", "yard", "busy", "tone", "sean", "pour", "gate", "tion", "dust", "wiki", "kent", "adds", "bugs", "bone", "bang", "alex", "ward", "meat", "roof", "kiss", "peer", "seed", "para", "cute", "rush", "mpeg", "yoga", "lamp", "rico", "phil", "pmid", "http", "bulk", "glad", "wins", "rack", "aged", "scan", "bold", "boss", "ross", "anna", "solo", "tall", "grey", "pdas", "beds", "ryan", "nova", "exam", "anne", "pump", "wake", "plot", "nick", "nasa", "drum", "pull", "foto", "ease", "tabs", "voip", "grid", "pine", "tend", "gulf", "echo", "rick", "char", "hunt", "thai", "fred", "chip", "mill", "suit", "bits", "dont", "burn", "labs", "twin", "earn", "jane", "jose", "beer", "dear", "alan", "misc", "push", "sole", "boot", "laid", "clay", "weak", "milk", "blvd", "arab", "wise", "rome", "odds", "vary", "gary", "marc", "sons", "leaf", "loop", "rice", "hate", "demo", "cuba", "gray", "silk", "kate", "slot", "adam", "wolf", "dish", "fits", "kick", "meal", "navy", "hurt", "tank", "bowl", "slip", "mens", "cuts", "mile", "mars", "lock", "node", "rear", "caps", "pill", "legs", "meta", "mint", "crew", "spin", "babe", "wash", "warm", "draw", "aims", "lens", "ieee", "pure", "corp", "visa", "jean", "soap", "bond", "unix", "poll", "axis", "guns", "dean", "mesh", "hero", "acts", "punk", "holy", "duke", "wave", "pace", "wage", "keys", "iran", "dawn", "carl", "coat", "exit", "rica", "matt", "soil", "kits", "tony", "doll", "seek", "peru", "nike", "lose", "reed", "mice", "bike", "temp", "perl", "vast", "cook", "plug", "wrap", "mood", "quiz", "ages", "kill", "lane", "beam", "tops", "jeff", "bell", "shut", "salt", "ncaa", "thou", "peak", "mask", "euro", "evil", "coal", "yeah", "runs", "pair", "ride", "pets", "lion", "goto", "hole", "neil", "beef", "bass", "hats", "diff", "surf", "onto", "rain", "hook", "cord", "grow", "crop", "spot", "eric", "lite", "nine", "faqs", "slow", "hide", "utah", "arms", "sing", "tons", "beat", "kept", "hang", "wars", "fear", "hood", "moon", "dogs", "math", "fame", "whom", "mine", "cape", "toll", "bids", "seat", "eggs", "dell", "fans", "lady", "ruby", "mins", "bird", "stem", "rise", "drew", "dual", "bars", "rare", "tune", "corn", "wear", "puts", "grew", "bags", "trek", "jazz", "fail", "ties", "beta", "brad", "jury", "font", "tail", "lawn", "soup", "byte", "nose", "oclc", "bath", "juan", "roll", "zero", "thru", "jews", "trim", "null", "cent", "acid", "espn", "spam", "quit", "lung", "tape", "wire", "clip", "todd", "blow", "doug", "sees", "zoom", "knew", "bull", "cole", "mart", "tale", "lynn", "iowa", "lack", "docs", "gain", "bear", "coin", "fake", "duty", "cure", "arch", "vice", "hdtv", "asin", "bomb", "harm", "hong", "deer", "dave", "desk", "disk", "void", "iron", "atom", "flag", "oven", "aids", "noon", "soul", "felt", "cast", "cams", "joel", "ends", "proc", "icon", "boat", "mate", "disc", "chef", "isle", "slim", "luke", "comp", "gene", "fort", "gone", "fill", "pete", "spec", "camp", "penn", "midi", "tied", "snow", "dale", "oils", "sept", "unto", "inch", "died", "kong", "pays", "rank", "lang", "stud", "fold", "ones", "gave", "hire", "seem", "ipod", "phys", "pole", "mega", "bend", "moms", "glen", "rich", "drop", "guys", "tags", "lips", "pond", "load", "pick", "rose", "wait", "walk", "tire", "chad", "fuel", "josh", "drag", "soft", "ripe", "rely", "scsi", "task", "miss", "wild", "heat", "nuts", "nail", "span", "mass", "joke", "univ", "foot", "pads", "inns", "cups", "cold", "shot", "pink", "foam", "root", "edge", "poem", "ford", "oral", "asks", "bean", "bias", "xbox", "pain", "palm", "wind", "sold", "swim", "nano", "goal", "ball", "dvds", "loud", "rats", "jump", "stat", "cruz", "bios", "firm", "thee", "lots", "ruth", "pray", "pope", "jeep", "bare", "hung", "gear", "army", "mono", "tile", "diet", "apps", "skip", "laws", "path", "flow", "ciao", "knee", "prep", "flat", "chem", "jack", "zone", "hits", "pros", "cant", "wife", "goes", "hear", "lord", "farm", "sara", "eyes", "joan", "duck", "poor", "trip", "mike", "dive", "dead", "fiji", "audi", "raid", "gets", "volt", "ohio", "dirt", "fair", "acer", "dist", "isbn", "geek", "sink", "grip", "host", "watt", "pins", "reno", "dark", "polo", "rent", "horn", "wood", "prot", "frog", "logs", "sets", "core", "debt", "snap", "race", "born", "pack", "fish", "jpeg", "mini", "pool", "swap", "rest", "flip", "deep", "boys", "buzz", "nuke", "iraq", "boom", "calm", "fork", "troy", "ring", "mary", "prev", "zope", "gmbh", "skin", "fees", "sims", "tray", "pass", "sage", "java", "uses", "asia", "cool", "suse", "door", "cave", "wool", "feet", "told", "rule", "ways", "eyed", "vote", "grab", "oops", "wine", "wall", "thus", "tree", "trap", "fool", "hair", "karl", "dies", "paid", "ship", "anti", "hall", "jail", "feed", "safe", "ipaq", "hold", "comm", "deal", "maps", "lace", "hill", "ugly", "hart", "ment", "tool", "idea", "fall", "biol", "late", "lies", "cnet", "song", "took", "treo", "gods", "male", "fund", "mode", "poly", "ears", "went", "lead", "fist", "band", "mere", "cons", "sent", "taxi", "nice", "logo", "move", "kind", "huge", "bush", "hour", "worn", "shaw", "fine", "expo", "came", "deny", "bali", "judy", "trio", "cube", "rugs", "fate", "role", "gras", "wish", "hope", "menu", "tour", "lost", "mind", "oval", "held", "soma", "soon", "href", "benz", "wifi", "tier", "stop", "earl", "port", "seen", "guam", "cite", "cash", "pics", "drug", "copy", "mess", "king", "mean", "turn", "stay", "rope", "dump", "near", "base", "face", "loss", "hose", "html", "chat", "fire", "sony", "pubs", "lake", "paul", "mild", "none", "step", "half", "sort", "clan", "sync", "mesa", "wide", "loan", "hull", "golf", "toys", "shed", "memo", "girl", "tide", "funk", "town", "reel", "risk", "bind", "rand", "buck", "bank", "feel", "meet", "usgs", "acre", "lows", "aqua", "chen", "emma", "tech", "pest", "unit", "fact", "fast", "reef", "edit", "auto", "plus", "chan", "tips", "beth", "rock", "mark", "else", "jill", "sofa", "true", "dans", "viii", "kids", "talk", "tent", "dept", "hack", "dare", "hawk", "lamb", "bill", "word", "ever", "done", "land", "says", "upon", "five", "past", "arts", "gold", "able", "junk", "tell", "lucy", "hans", "poet", "epic", "cars", "sake", "sans", "sure", "lean", "once", "away", "self", "dude", "luis", "cell", "head", "film", "alto", "term", "baby", "keep", "gore", "cult", "dash", "cage", "divx", "hugh", "hand", "jake", "eval", "ping", "flux", "star", "muze", "oman", "easy", "blue", "rage", "adsl", "four", "prix", "hard", "gift", "avon", "rays", "road", "walt", "acne", "libs", "undo", "club", "east", "dana", "halo", "body", "sell", "gays", "give", "exec", "side", "park", "blog", "less", "play", "maui", "cart", "come", "test", "vids", "yale", "july", "cost", "plan", "june", "doom", "owen", "bite", "issn", "myth", "live", "note", "week", "weed", "oecd", "dice", "quad", "dock", "mods", "hint", "msie", "team", "left", "look", "west", "buys", "pork", "join", "barn", "room", "teen", "fare", "sale", "asus", "food", "bald", "fuji", "leon", "mold", "dame", "jobs", "herb", "card", "alot", "york", "idle", "save", "call", "main", "john", "love", "form", "rate", "text", "cove", "casa", "shop", "eden", "incl", "size", "down", "care", "game", "reid", "both", "flex", "rosa", "hash", "lazy", "same", "case", "carb", "open", "link", "file", "sign", "much", "even", "pens", "show", "code", "worm", "long", "deaf", "mats", "want", "blah", "mime", "feof", "usda", "keen", "peas", "urls", "area", "take", "type", "send", "owns", "line", "made", "must", "ebay", "item", "zinc", "guru", "real", "levy", "grad", "bras", "part", "days", "kyle", "know", "life", "pale", "gaps", "tear", "full", "mail", "does", "nest", "said", "nato", "user", "gale", "many", "stan", "idol", "need", "read", "book", "very", "moss", "each", "cork", "high", "mali", "info", "dome", "well", "heel", "yang", "good", "then", "best", "such", "city", "post", "them", "make", "data", "dumb", "most", "last", "work", "used", "next", "into", "year", "feat", "ntsc", "over", "usps", "just", "name", "conf", "glow", "list", "back", "oaks", "erik", "date", "find", "than", "paso", "norm", "like", "some", "ware", "were", "been", "jade", "foul", "keno", "view", "seas", "help", "pose", "mrna", "goat", "also", "here", "sail", "when", "only", "sega", "cdna", "news", "what", "bolt", "gage", "site", "they", "time", "urge", "smtp", "kurt", "neon", "ours", "lone", "cope", "free", "lime", "kirk", "bool", "page", "home", "will", "spas", "more", "jets", "have", "intl", "your", "yarn", "knit", "from", "with", "this", "pike", "that", "hugo", "gzip", "ctrl", "bent", "laos"} -) - type TLDRPlugin struct { - Bot bot.Bot - History []string - Users []string - Index int + bot bot.Bot + history []history + index int + lastRequest time.Time +} + +type history struct { + timestamp time.Time + user string + body string } func New(b bot.Bot) *TLDRPlugin { plugin := &TLDRPlugin{ - Bot: b, - History: []string{}, - Users: []string{}, - Index: 0, + bot: b, + history: []history{}, + index: 0, + lastRequest: time.Now().Add(-24 * time.Hour), } b.Register(plugin, bot.Message, plugin.message) b.Register(plugin, bot.Help, plugin.help) @@ -36,14 +39,19 @@ func New(b bot.Bot) *TLDRPlugin { } func (p *TLDRPlugin) message(kind bot.Kind, message msg.Message, args ...interface{}) bool { + timeLimit := time.Duration(p.bot.Config().GetInt("TLDR.HourLimit", 1)) lowercaseMessage := strings.ToLower(message.Body) - if lowercaseMessage == "tl;dr" { - nTopics := p.Bot.Config().GetInt("TLDR.Topics", 5) + if lowercaseMessage == "tl;dr" && p.lastRequest.After(time.Now().Add(-timeLimit*time.Hour)) { + p.bot.Send(bot.Message, message.Channel, "Slow down, cowboy. Read that tiny backlog.") + return true + } else if lowercaseMessage == "tl;dr" { + p.lastRequest = time.Now() + nTopics := p.bot.Config().GetInt("TLDR.Topics", 5) vectoriser := nlp.NewCountVectoriser(THESE_ARE_NOT_THE_WORDS_YOU_ARE_LOOKING_FOR...) lda := nlp.NewLatentDirichletAllocation(nTopics) pipeline := nlp.NewPipeline(vectoriser, lda) - docsOverTopics, err := pipeline.FitTransform(p.History...) + docsOverTopics, err := pipeline.FitTransform(p.getTopics()...) if err != nil { log.Error().Err(err) @@ -51,14 +59,12 @@ func (p *TLDRPlugin) message(kind bot.Kind, message msg.Message, args ...interfa } bestScores := make([][]float64, nTopics) - bestDocs := make([][]string, nTopics) - bestUsers := make([][]string, nTopics) + bestDocs := make([][]history, nTopics) - supportingDocs := p.Bot.Config().GetInt("TLDR.Support", 3) + supportingDocs := p.bot.Config().GetInt("TLDR.Support", 3) for i := 0; i < nTopics; i++ { bestScores[i] = make([]float64, supportingDocs) - bestDocs[i] = make([]string, supportingDocs) - bestUsers[i] = make([]string, supportingDocs) + bestDocs[i] = make([]history, supportingDocs) } dr, dc := docsOverTopics.Dims() @@ -69,8 +75,7 @@ func (p *TLDRPlugin) message(kind bot.Kind, message msg.Message, args ...interfa score := docsOverTopics.At(topic, doc) if score > minScore { bestScores[topic][minIndex] = score - bestDocs[topic][minIndex] = p.History[doc] - bestUsers[topic][minIndex] = p.Users[doc] + bestDocs[topic][minIndex] = p.history[doc] minScore, minIndex = min(bestScores[topic]) } } @@ -98,45 +103,65 @@ func (p *TLDRPlugin) message(kind bot.Kind, message msg.Message, args ...interfa } response += fmt.Sprintf("Topic #%d : %s\n", topic, bestTopic) for i := range bestDocs[topic] { - if bestUsers[topic][i] != "" { - response += fmt.Sprintf("\t<%s>%s [%f]\n", bestUsers[topic][i], bestDocs[topic][i], bestScores[topic][i]) - } + response += fmt.Sprintf("\t<%s>%s [%f]\n", bestDocs[topic][i].user, bestDocs[topic][i].body, bestScores[topic][i]) } } - p.Bot.Send(bot.Message, message.Channel, response) + p.bot.Send(bot.Message, message.Channel, response) return true } if shouldKeepMessage(lowercaseMessage) { - currentHistorySize := len(p.History) - maxHistorySize := p.Bot.Config().GetInt("TLDR.HistorySize", 1000) + currentHistorySize := len(p.history) + maxHistorySize := p.bot.Config().GetInt("TLDR.HistorySize", 1000) + hist := history{ + body: lowercaseMessage, + user: message.User.Name, + timestamp: time.Now(), + } if currentHistorySize < maxHistorySize { - p.History = append(p.History, lowercaseMessage) - p.Users = append(p.Users, message.User.Name) - p.Index = 0 + p.history = append(p.history, hist) + p.index = 0 } else { if currentHistorySize > maxHistorySize { // We could resize this but we want to prune the oldest stuff, and // I don't care to do this correctly so might as well not do it at all } - if p.Index >= currentHistorySize { - p.Index = 0 + if p.index >= currentHistorySize { + p.index = 0 } - p.History[p.Index] = lowercaseMessage - p.Users[p.Index] = message.User.Name - p.Index++ + p.history[p.index] = hist + p.index++ } } return false } +func (p *TLDRPlugin) getTopics() []string { + hist := []string{} + for _, h := range p.history { + hist = append(hist, h.body) + } + return hist +} + +func (p *TLDRPlugin) pruneHistory() { + out := []history{} + yesterday := time.Now().Add(-24 * time.Hour) + for _, h := range p.history { + if yesterday.Before(h.timestamp) { + out = append(out, h) + } + } + p.history = out +} + // Help responds to help requests. Every plugin must implement a help function. func (p *TLDRPlugin) help(kind bot.Kind, message msg.Message, args ...interface{}) bool { - p.Bot.Send(bot.Message, message.Channel, "tl;dr") + p.bot.Send(bot.Message, message.Channel, "tl;dr") return true } diff --git a/plugins/tldr/tldr_test.go b/plugins/tldr/tldr_test.go index 9d42cde..1b809b5 100644 --- a/plugins/tldr/tldr_test.go +++ b/plugins/tldr/tldr_test.go @@ -1,15 +1,22 @@ package tldr import ( + "os" "strings" "testing" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" "github.com/stretchr/testify/assert" "github.com/velour/catbase/bot" "github.com/velour/catbase/bot/msg" "github.com/velour/catbase/bot/user" ) +func init() { + log.Logger = log.Logger.Output(zerolog.ConsoleWriter{Out: os.Stderr}) +} + func makeMessageBy(payload, by string) (bot.Kind, msg.Message) { isCmd := strings.HasPrefix(payload, "!") if isCmd { @@ -42,3 +49,15 @@ func Test(t *testing.T) { assert.True(t, res) assert.Len(t, mb.Messages, 1) } + +func TestDoubleUp(t *testing.T) { + c, mb := setup(t) + res := c.message(makeMessage("The quick brown fox jumped over the lazy dog")) + res = c.message(makeMessage("The cow jumped over the moon")) + res = c.message(makeMessage("The little dog laughed to see such fun")) + res = c.message(makeMessage("tl;dr")) + res = c.message(makeMessage("tl;dr")) + assert.True(t, res) + assert.Len(t, mb.Messages, 2) + assert.Contains(t, mb.Messages[1], "Slow down, cowboy.") +}