diff --git a/assets/assets.go b/assets/assets.go new file mode 100644 index 0000000..ef8edf9 --- /dev/null +++ b/assets/assets.go @@ -0,0 +1,9 @@ +package assets + +import _ "embed" + +//go:embed lobbySettingsData.json +var LobbySettingsJSON []byte + +//go:embed geoip.mmdb +var GeoIPDB []byte diff --git a/build_assets.bash b/build_assets.bash index 8301eea..116471a 100755 --- a/build_assets.bash +++ b/build_assets.bash @@ -18,16 +18,3 @@ function download_assets { if [ ! -f assets/geoip.mmdb ]; then download_assets fi - -if [ "$1" = "production" ]; then - echo "Compiling assets" - go-bindata -nomemcopy -ignore="bindata\.go" \ - -pkg assets \ - -o assets/bindata.go assets/{geoip.mmdb,lobbySettingsData.json} -else - echo "Compiling assets (debug)" - go-bindata -debug -ignore="bindata\.go" \ - -pkg assets \ - -o assets/bindata.go assets/{geoip.mmdb,lobbySettingsData.json} - -fi diff --git a/config/constants.go b/config/constants.go index c912d55..a258b30 100644 --- a/config/constants.go +++ b/config/constants.go @@ -9,9 +9,10 @@ import ( "os" "reflect" "text/template" + "time" - "github.com/sirupsen/logrus" "github.com/kelseyhightower/envconfig" + "github.com/sirupsen/logrus" ) var ( @@ -51,18 +52,19 @@ type constants struct { ProfilerAddr string `envconfig:"PROFILER_ADDR" doc:"Address to serve the web-based profiler over"` - SlackbotURL string `envconfig:"SLACK_URL" doc:"Slack webhook URL"` - SentryDSN string `envconfig:"SENTRY_DSN" doc:"Sentry DSN"` - DiscordToken string `envconfig:"DISCORD_TOKEN" doc:"Discord Token"` - DiscordGuildId string `envconfig:"DISCORD_GUILD_ID" doc:"Discord Guild ID"` - Environment string `envconfig:"DEPLOYED_ENV" default:"development" doc:"Deployment environment"` - TwitchClientID string `envconfig:"TWITCH_CLIENT_ID" doc:"Twitch API Client ID"` - TwitchClientSecret string `envconfig:"TWITCH_CLIENT_SECRET" doc:"Twitch API Client Secret"` - ServemeAPIKey string `envconfig:"SERVEME_API_KEY" doc:"serveme.tf API Key"` - HealthChecks bool `envconfig:"HEALTH_CHECKS" default:"false" doc:"Enable health checks"` - SecureCookies bool `envconfig:"SECURE_COOKIE" doc:"Enable 'secure' flag on cookies" default:"false"` - FilteredWords []string `envconfig:"FILTERED_WORDS"` - DemosFolder string `envconfig:"DEMOS_FOLDER" doc:"Folder to store STV demos in" default:"demos"` + SlackbotURL string `envconfig:"SLACK_URL" doc:"Slack webhook URL"` + SentryDSN string `envconfig:"SENTRY_DSN" doc:"Sentry DSN"` + DiscordToken string `envconfig:"DISCORD_TOKEN" doc:"Discord Token"` + DiscordGuildId string `envconfig:"DISCORD_GUILD_ID" doc:"Discord Guild ID"` + Environment string `envconfig:"DEPLOYED_ENV" default:"development" doc:"Deployment environment"` + TwitchClientID string `envconfig:"TWITCH_CLIENT_ID" doc:"Twitch API Client ID"` + TwitchClientSecret string `envconfig:"TWITCH_CLIENT_SECRET" doc:"Twitch API Client Secret"` + ServemeAPIKey string `envconfig:"SERVEME_API_KEY" doc:"serveme.tf API Key"` + HealthChecks bool `envconfig:"HEALTH_CHECKS" default:"false" doc:"Enable health checks"` + SecureCookies bool `envconfig:"SECURE_COOKIE" doc:"Enable 'secure' flag on cookies" default:"false"` + FilteredWords []string `envconfig:"FILTERED_WORDS"` + ChatRateLimit time.Duration `envconfig:"CHAT_RATE_LIMIT"` + DemosFolder string `envconfig:"DEMOS_FOLDER" doc:"Folder to store STV demos in" default:"demos"` } var Constants = constants{} diff --git a/glide.yaml b/glide.yaml deleted file mode 100644 index f33b35c..0000000 --- a/glide.yaml +++ /dev/null @@ -1,63 +0,0 @@ -package: github.com/TF2Stadium/Helen -import: -- package: github.com/sirupsen/logrus - version: 0.9.0 - -- package: github.com/evalphobia/logrus_sentry - version: 0.5.0 - -- package: github.com/TF2Stadium/PlayerStatsScraper -- package: github.com/TF2Stadium/servemetf - version: 2282b050105aaee51b120930308a544d064decbc - -- package: github.com/TF2Stadium/wsevent - -- package: github.com/bitly/go-simplejson - version: aabad6e819789e569bd6aabf444c935aa9ba1e44 - -- package: github.com/blang/semver - version: 3.1.0 - -- package: github.com/dgrijalva/jwt-go - version: 3.0.0 - -- package: github.com/facebookgo/stack - version: 751773369052141c013c6e827a71e8f35c07879c - -- package: github.com/gchaincl/dotsql - version: 0.1.0 -- package: github.com/gorilla/websocket - version: e2e3d8414d0fbae04004f151979f4e27c6747fe7 - -- package: github.com/jinzhu/gorm - version: 83002c4d5f060f4819bfd2115b76a0e1429a7f32 - subpackages: - - dialects/postgres - -- package: github.com/kelseyhightower/envconfig - version: dd8b03cb32326184ec2606104cd442e34bd272fd - -- package: github.com/lib/pq - version: 165a3529e799da61ab10faed1fabff3662d6193f - -- package: github.com/oschwald/geoip2-golang - version: ac55b72a85f5967224eb9d31d445a149e1508b16 - -- package: github.com/rs/cors - version: eabcc6af4bbe5ad3a949d36450326a2b0b9894b8 - -- package: github.com/streadway/amqp - version: 2e25825abdbd7752ff08b270d313b93519a0a232 - -- package: github.com/vibhavp/amqp-rpc -- package: github.com/yohcop/openid-go - version: f38c0087a377532505cb5b86418b1cc50d385f0d - -- package: golang.org/x/net - subpackages: - - /xsrftoken -- package: gopkg.in/tylerb/graceful.v1 -- package: github.com/stretchr/testify - -- package: github.com/bwmarrin/discordgo - version: 0.18.0 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..8e580e7 --- /dev/null +++ b/go.mod @@ -0,0 +1,52 @@ +module github.com/TF2Stadium/Helen + +go 1.19 + +require ( + github.com/TF2Stadium/PlayerStatsScraper v0.0.0-20160321044610-c2109c66ae06 + github.com/TF2Stadium/TF2RconWrapper v0.0.0-20160403121525-3f8ba97e297c + github.com/TF2Stadium/logstf v0.0.0-20160615154040-251bc96664fd + github.com/TF2Stadium/servemetf v0.0.0-20200331210202-2282b050105a + github.com/TF2Stadium/wsevent v0.0.0-20160322154148-1b422452cdad + github.com/bitly/go-simplejson v0.5.0 + github.com/blang/semver v3.1.0+incompatible + github.com/bwmarrin/discordgo v0.18.0 + github.com/dgrijalva/jwt-go v3.0.0+incompatible + github.com/evalphobia/logrus_sentry v0.5.0 + github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 + github.com/getsentry/raven-go v0.2.1-0.20190619092523-5c24d5110e0e + github.com/gorilla/websocket v0.0.0-20160313191446-e2e3d8414d0f + github.com/jinzhu/gorm v0.0.0-20160314000545-83002c4d5f06 + github.com/kelseyhightower/envconfig v1.1.1-0.20160312064728-dd8b03cb3232 + github.com/lib/pq v0.0.0-20160306064014-165a3529e799 + github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 + github.com/oschwald/geoip2-golang v0.1.1-0.20160221025127-ac55b72a85f5 + github.com/rs/cors v0.0.0-20170801073201-eabcc6af4bbe + github.com/sirupsen/logrus v0.9.0 + github.com/streadway/amqp v0.0.0-20160311215503-2e25825abdbd + github.com/stretchr/testify v1.8.2-0.20221220093916-9acc22213e5f + github.com/vibhavp/amqp-rpc v0.0.0-20160309123414-8433bc7f29b2 + github.com/yohcop/openid-go v0.0.0-20160304164425-f38c0087a377 + golang.org/x/net v0.4.1-0.20221213214114-ad92d3db360b + golang.org/x/text v0.5.0 +) + +require ( + github.com/TF2Stadium/rcon v0.0.0-20160403104014-1fcab576012d // indirect + github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect + github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denisenkom/go-mssqldb v0.12.3 // indirect + github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/jinzhu/inflection v1.0.1-0.20210111022912-b5281034e75e // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/oschwald/maxminddb-golang v1.10.1-0.20221216215600-09b10dd95df1 // indirect + github.com/pkg/errors v0.9.2-0.20201214064552-5dd12d0cfe7f // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/crypto v0.4.1-0.20221221171930-bc7d1d1eb54b // indirect + golang.org/x/sys v0.3.1-0.20221221033156-3b1fc93fc15c // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..780d801 --- /dev/null +++ b/go.sum @@ -0,0 +1,130 @@ +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8= +github.com/TF2Stadium/PlayerStatsScraper v0.0.0-20160321044610-c2109c66ae06 h1:wvBN4TcvGLAUWW1BQVmWs/C5Mi2Tg3av+wYpAJZafh4= +github.com/TF2Stadium/PlayerStatsScraper v0.0.0-20160321044610-c2109c66ae06/go.mod h1:2lr/kKy8ZYXcIhsSS1PPcWNW/+9vi+Pyli4fBcD53Wg= +github.com/TF2Stadium/TF2RconWrapper v0.0.0-20160403121525-3f8ba97e297c h1:eXXM3qUqecQGLOvJtcuvMbluocYsDazcPn52M0b9Msg= +github.com/TF2Stadium/TF2RconWrapper v0.0.0-20160403121525-3f8ba97e297c/go.mod h1:TNB0V7ZJ+JdPA+F10avMQn0FCWTWgcVtaV7GcvYZL8M= +github.com/TF2Stadium/logstf v0.0.0-20160615154040-251bc96664fd h1:NVdOjkkhYfC9O+F+6OKuQfS1C2sIU9pXZ9LxEEqLnF4= +github.com/TF2Stadium/logstf v0.0.0-20160615154040-251bc96664fd/go.mod h1:5RhJqpork5uaL6tJuxhBDVIyDOPTU7k3pnZ6aV2nLJA= +github.com/TF2Stadium/rcon v0.0.0-20160403104014-1fcab576012d h1:Hl5sI0Ma1pJX94RpEPkX0uqOacVQJCR85E01EakHY4A= +github.com/TF2Stadium/rcon v0.0.0-20160403104014-1fcab576012d/go.mod h1:vTb1ediPEdeB01WGX6huwJ1KZm0Ww2OXuVTKERj7EW4= +github.com/TF2Stadium/servemetf v0.0.0-20200331210202-2282b050105a h1:YJ393bqpLkk0kGOEXyyWnBv1DXKvgMQ4uHBxPM3o9sY= +github.com/TF2Stadium/servemetf v0.0.0-20200331210202-2282b050105a/go.mod h1:OyRbHHRAuu2iQ09ZtbipNDf76VuVaxoJBSLdi+m448M= +github.com/TF2Stadium/wsevent v0.0.0-20160322154148-1b422452cdad h1:mTdYrt16zCSV0huy3S3za+Xw4X2QDCeiV0+YD4KnhTY= +github.com/TF2Stadium/wsevent v0.0.0-20160322154148-1b422452cdad/go.mod h1:lWo2WmX3pFmpRYy9S79oe6gqmoC+7A8shYavkaEjxH0= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/blang/semver v3.1.0+incompatible h1:7hqmJYuaEK3qwVjWubYiht3j93YI0WQBuysxHIfUriU= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bwmarrin/discordgo v0.18.0 h1:XopVQXCIFy7Cr2eT7NcYcm4k0l2PYX+AP5RUbIWX2/8= +github.com/bwmarrin/discordgo v0.18.0/go.mod h1:5NIvFv5Z7HddYuXbuQegZ684DleQaCFqChP2iuBivJ8= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d h1:S2NE3iHSwP0XV47EEXL8mWmRdEfGscSJ+7EgePNgt0s= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw= +github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo= +github.com/dgrijalva/jwt-go v3.0.0+incompatible h1:nfVqwkkhaRUethVJaQf5TUFdFr3YUF4lJBTf/F2XwVI= +github.com/dgrijalva/jwt-go v3.0.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/evalphobia/logrus_sentry v0.5.0 h1:Vg73G2zDfh5BtFvXMZI9TXGtVQW/OFlzW4pIkNiYBvc= +github.com/evalphobia/logrus_sentry v0.5.0/go.mod h1:pKcp+vriitUqu9KiWj/VRFbRfFNUwz95/UkgG8a6MNc= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= +github.com/getsentry/raven-go v0.2.1-0.20190619092523-5c24d5110e0e h1:kpHZPjNRhYcj0G1Y4NryfaoeFF/BSSPd2OwiXbzEMPo= +github.com/getsentry/raven-go v0.2.1-0.20190619092523-5c24d5110e0e/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/gorilla/websocket v0.0.0-20160313191446-e2e3d8414d0f h1:vlm61YvKdIJV9o6Z8iRToZQexC20e/xZAYFm7/fIAV0= +github.com/gorilla/websocket v0.0.0-20160313191446-e2e3d8414d0f/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/jinzhu/gorm v0.0.0-20160314000545-83002c4d5f06 h1:npR2TSD6UTr0299qgdw6x2wMqn7e7yFH+bSBUZco/dY= +github.com/jinzhu/gorm v0.0.0-20160314000545-83002c4d5f06/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= +github.com/jinzhu/inflection v1.0.1-0.20210111022912-b5281034e75e h1:g/g1C8PyhbiTobJGCEyPzAmswdS1AczWrsWoS4GS1y4= +github.com/jinzhu/inflection v1.0.1-0.20210111022912-b5281034e75e/go.mod h1:lcrn0jrToZnZxiaoiYlmxfr1DnDQn86NkcbmyrP7m5w= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/kelseyhightower/envconfig v1.1.1-0.20160312064728-dd8b03cb3232 h1:g0jXFikNbApf/YtuVEEyQBjK2CfZW+GKflUvVTe4xow= +github.com/kelseyhightower/envconfig v1.1.1-0.20160312064728-dd8b03cb3232/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v0.0.0-20160306064014-165a3529e799 h1:3ASmCN7oPtN3DyBOT7EOZJp2Iq7cKTiYCT7nvKndigI= +github.com/lib/pq v0.0.0-20160306064014-165a3529e799/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/oschwald/geoip2-golang v0.1.1-0.20160221025127-ac55b72a85f5 h1:RwLoso3zR8M87Qlj9bKS218gwZz6c6mSSrU7+ZWQC1s= +github.com/oschwald/geoip2-golang v0.1.1-0.20160221025127-ac55b72a85f5/go.mod h1:0LTTzix/Ao1uMvOhAV4iLU0Lz7eCrP94qZWBTDKf0iE= +github.com/oschwald/maxminddb-golang v1.10.1-0.20221216215600-09b10dd95df1 h1:oQoFKcK9uh5i9isWyr1V9B/b8y0CEDq5FIjuzvzcd90= +github.com/oschwald/maxminddb-golang v1.10.1-0.20221216215600-09b10dd95df1/go.mod h1:rM9M/Lq++IO7O+kToGFKwK7Zs5EIGqMSa9TZfBnV83E= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.2-0.20201214064552-5dd12d0cfe7f h1:lJqhwddJVYAkyp72a4pwzMClI20xTwL7miDdm2W/KBM= +github.com/pkg/errors v0.9.2-0.20201214064552-5dd12d0cfe7f/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rs/cors v0.0.0-20170801073201-eabcc6af4bbe h1:fPLXIFSIvTs99QtPSCsRITbv01v7MsPN7wpuYtD8ebI= +github.com/rs/cors v0.0.0-20170801073201-eabcc6af4bbe/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/sirupsen/logrus v0.9.0 h1:2fe3/slw7N7RvFar+X03UWVv3XxpsOLGL00EAU2evoI= +github.com/sirupsen/logrus v0.9.0/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/streadway/amqp v0.0.0-20160311215503-2e25825abdbd h1:625/bJvSNfQrzzK5ttnUqMqnVe8M5MILmf5ZRGgeeDY= +github.com/streadway/amqp v0.0.0-20160311215503-2e25825abdbd/go.mod h1:1WNBiOZtZQLpVAyu0iTduoJL9hEsMloAK5XWrtW0xdY= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2-0.20221220093916-9acc22213e5f h1:RJV58Y/hqHtwU4ZCNHYOos5bFltjpYx+x7EDC7y2kj8= +github.com/stretchr/testify v1.8.2-0.20221220093916-9acc22213e5f/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/vibhavp/amqp-rpc v0.0.0-20160309123414-8433bc7f29b2 h1:ldpeJ8/cRI1Ox7iZaMb9/s3ctydPTiKeihxJxzXtX6c= +github.com/vibhavp/amqp-rpc v0.0.0-20160309123414-8433bc7f29b2/go.mod h1:Ur4wjW+YG3HNPXIern0r7qkDkQP+TMEKze07d3z3TTI= +github.com/yohcop/openid-go v0.0.0-20160304164425-f38c0087a377 h1:ZoJCXC1YYcRi75AHhziikNvxu0LbZU4qyRbmLY6Gjok= +github.com/yohcop/openid-go v0.0.0-20160304164425-f38c0087a377/go.mod h1:f6elajwZV+xceiaqgRL090YzLEDGSbqr3poGL3ZgXYo= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.1-0.20221221171930-bc7d1d1eb54b h1:MvD/QMJXzjOODJab0IZ45E3Gt0pUO3bfZB2jjkbesfg= +golang.org/x/crypto v0.4.1-0.20221221171930-bc7d1d1eb54b/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.4.1-0.20221213214114-ad92d3db360b h1:+c/T7aalyXROQ93+TKRv+x2cFPosyQRuwWR9JaSozr0= +golang.org/x/net v0.4.1-0.20221213214114-ad92d3db360b/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.1-0.20221221033156-3b1fc93fc15c h1:6uvmItvsoHnurXH61kev0pBKN2f1RVJSiEyMd+1vrvo= +golang.org/x/sys v0.3.1-0.20221221033156-3b1fc93fc15c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/helpers/geoip.go b/helpers/geoip.go index ff58729..99b8a1b 100644 --- a/helpers/geoip.go +++ b/helpers/geoip.go @@ -4,10 +4,10 @@ import ( "net" "strings" - "github.com/sirupsen/logrus" "github.com/TF2Stadium/Helen/assets" "github.com/TF2Stadium/Helen/config" "github.com/oschwald/geoip2-golang" + "github.com/sirupsen/logrus" ) var geodb *geoip2.Reader @@ -18,7 +18,7 @@ func InitGeoIPDB() { } var err error - geodb, err = geoip2.FromBytes(assets.MustAsset("assets/geoip.mmdb")) + geodb, err = geoip2.FromBytes(assets.GeoIPDB) if err != nil { logrus.Fatal(err.Error()) diff --git a/models/chat/chat.go b/models/chat/chat.go index 2dc23a5..d03c820 100644 --- a/models/chat/chat.go +++ b/models/chat/chat.go @@ -2,13 +2,14 @@ package chat import ( "fmt" - "strings" "time" "encoding/json" + "github.com/TF2Stadium/Helen/config" "github.com/TF2Stadium/Helen/controllers/broadcaster" db "github.com/TF2Stadium/Helen/database" + "github.com/TF2Stadium/Helen/models/chat/internal/filter" "github.com/TF2Stadium/Helen/models/player" ) @@ -33,6 +34,7 @@ func NewChatMessage(message string, room int, player *player.Player) *ChatMessag PlayerID: player.ID, Room: room, + Deleted: filter.FilteredMessage(message, config.Constants.FilteredWords), Message: message, } @@ -45,11 +47,26 @@ func NewInGameChatMessage(lobbyID uint, player *player.Player, message string) * Room: int(lobbyID), Message: message, + Deleted: filter.FilteredMessage(message, config.Constants.FilteredWords), InGame: true, } } -func (m *ChatMessage) Save() { db.DB.Save(m) } +func (m *ChatMessage) Save() { + if !m.Bot { + var count int + db.DB.Table("chat_messages"). + Where("player_id = ? AND timestamp >= ?", + m.PlayerID, + time.Now().Add(-1*config.Constants.ChatRateLimit)). + Count(&count) + if count > 0 { + return + } + + } + db.DB.Save(m) +} func (m *ChatMessage) Send() { broadcaster.SendMessageToRoom(fmt.Sprintf("%d_public", m.Room), "chatReceive", m) @@ -95,10 +112,6 @@ func (m *ChatMessage) MarshalJSON() ([]byte, error) { message["player"] = player } - for _, word := range config.Constants.FilteredWords { - message["message"] = strings.Replace(message["message"].(string), word, "", -1) - } - return json.Marshal(message) } diff --git a/models/chat/internal/filter/filter.go b/models/chat/internal/filter/filter.go new file mode 100644 index 0000000..7d11d23 --- /dev/null +++ b/models/chat/internal/filter/filter.go @@ -0,0 +1,36 @@ +package filter + +import ( + "regexp" + "strings" + + "golang.org/x/text/unicode/norm" +) + +var regexLeadCloseWhitepace = regexp.MustCompile(`^[\s\p{Zs}]+|[\s\p{Zs}]+$`) +var regexInsideWhitespace = regexp.MustCompile(`[\s\p{Zs}]{2,}`) + +func FilteredMessage(text string, filteredWords []string) bool { + if len(filteredWords) == 0 { + return false + } + + text = norm.NFC.String(strings.ToLower(text)) + text = strings.ReplaceAll(text, "\t", "") + text = strings.ReplaceAll(text, "\u200b", "") + text = regexLeadCloseWhitepace.ReplaceAllString(text, "") + text = regexInsideWhitespace.ReplaceAllString(text, "") + + textNoSpaces := strings.ReplaceAll(text, " ", "") + + for _, word := range filteredWords { + if strings.Contains(text, word) { + return true + } + + if strings.Contains(textNoSpaces, word) { + return true + } + } + return false +} diff --git a/models/chat/internal/filter/filter_fuzz.go b/models/chat/internal/filter/filter_fuzz.go new file mode 100644 index 0000000..7cec296 --- /dev/null +++ b/models/chat/internal/filter/filter_fuzz.go @@ -0,0 +1,7 @@ +package filter + +import "testing" + +func FuzzFoo(f *testing.F) { + f.Add("") +} diff --git a/models/chat/internal/filter/filter_test.go b/models/chat/internal/filter/filter_test.go new file mode 100644 index 0000000..46a31ab --- /dev/null +++ b/models/chat/internal/filter/filter_test.go @@ -0,0 +1,31 @@ +package filter + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestMessageFilter(t *testing.T) { + cases := []struct { + filteredWords []string + shouldFilter []string + shouldNotFilter []string + }{{[]string{"foo", "bar"}, + []string{"sentence with foo", "sentence_with_foo", + "spaces f o o", "bar foo", "f\to\to"}, + []string{"baz"}}} + + for _, tc := range cases { + for _, filtered := range tc.shouldFilter { + assert.Truef(t, + FilteredMessage(filtered, tc.filteredWords), + "%s should be filtered", filtered) + } + for _, filtered := range tc.shouldNotFilter { + assert.Falsef(t, + FilteredMessage(filtered, tc.filteredWords), + "%s should not be filtered", filtered) + } + } +} diff --git a/models/lobby_settings/lobbySettings.go b/models/lobby_settings/lobbySettings.go index 9682927..13819be 100644 --- a/models/lobby_settings/lobbySettings.go +++ b/models/lobby_settings/lobbySettings.go @@ -119,8 +119,7 @@ func GetLobbyWhitelist(whitelistId int) (*LobbyWhitelist, bool) { } func LoadLobbySettingsFromFile(fileName string) error { - data := assets.MustAsset(fileName) - return LoadLobbySettings(data) + return LoadLobbySettings(assets.LobbySettingsJSON) } func LoadLobbySettings(data []byte) error {