From cff5e845c75e9e2751a2c1f01f8ae3fbf24f0e7d Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 21 Nov 2024 18:12:07 +0300 Subject: feat/backend: gdrive to backblaze migration, improve create record (#237) --- backend/.env.example | 7 ++- backend/database/init.sql | 1 - backend/go.mod | 21 +------ backend/go.sum | 115 +------------------------------------ backend/handlers/record.go | 140 +++++++++++++++------------------------------ backend/parser/parser.go | 10 +--- 6 files changed, 55 insertions(+), 239 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index 774f2a2..90ca8b4 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -7,6 +7,7 @@ DB_PORT= DB_USER= DB_PASS= DB_NAME= -GOOGLE_CLIENT_EMAIL= -GOOGLE_PRIVATE_KEY_BASE64= -GOOGLE_FOLDER_ID= \ No newline at end of file +B2_BUCKET_NAME= +B2_KEY_ID= +B2_API_KEY= +B2_DOWNLOAD_URL= diff --git a/backend/database/init.sql b/backend/database/init.sql index e238eae..d49e519 100644 --- a/backend/database/init.sql +++ b/backend/database/init.sql @@ -137,7 +137,6 @@ CREATE TABLE map_discussions_upvotes ( CREATE TABLE demos ( id UUID, - location_id TEXT NOT NULL, PRIMARY KEY (id) ); diff --git a/backend/go.mod b/backend/go.mod index 17308f3..e6f87c4 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -8,6 +8,7 @@ require ( ) require ( + github.com/Backblaze/blazer v0.7.1 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/google/uuid v1.6.0 github.com/pektezol/steam_go v1.1.2 @@ -18,40 +19,22 @@ require ( ) require ( - cloud.google.com/go/auth v0.9.3 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect - cloud.google.com/go/compute/metadata v0.5.0 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/bytedance/sonic v1.12.2 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect github.com/gabriel-vasile/mimetype v1.4.5 // indirect - github.com/go-logr/logr v1.4.2 // indirect - github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/s2a-go v0.1.8 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.13.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect - go.opentelemetry.io/otel v1.29.0 // indirect - go.opentelemetry.io/otel/metric v1.29.0 // indirect - go.opentelemetry.io/otel/trace v1.29.0 // indirect golang.org/x/arch v0.10.0 // indirect golang.org/x/tools v0.25.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/grpc v1.66.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -72,9 +55,7 @@ require ( github.com/ugorji/go/codec v1.2.12 // indirect golang.org/x/crypto v0.27.0 // indirect golang.org/x/net v0.29.0 // indirect - golang.org/x/oauth2 v0.23.0 golang.org/x/sys v0.25.0 // indirect golang.org/x/text v0.18.0 // indirect - google.golang.org/api v0.196.0 google.golang.org/protobuf v1.34.2 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index 647f6f9..59301ae 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,11 +1,5 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go/auth v0.9.3 h1:VOEUIAADkkLtyfr3BLa3R8Ed/j6w1jTBmARx+wb5w5U= -cloud.google.com/go/auth v0.9.3/go.mod h1:7z6VY+7h3KUdRov5F1i8NDP5ZzWKYmEPO842BgCsmTk= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= -cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Backblaze/blazer v0.7.1 h1:J43PbFj6hXLg1jvCNr+rQoAsxzKK0IP7ftl1ReCwpcQ= +github.com/Backblaze/blazer v0.7.1/go.mod h1:MhntL1nMpIuoqrPP6TnZu/xTydMgOAe/Xm6KongbjKs= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/bytedance/sonic v1.12.2 h1:oaMFuRTpMHYLpCntGca65YWt5ny+wAceDERTkT2L9lg= @@ -13,22 +7,13 @@ github.com/bytedance/sonic v1.12.2/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKz github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= @@ -37,11 +22,6 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= @@ -62,38 +42,11 @@ github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= -github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -129,7 +82,6 @@ github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNH github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -153,55 +105,26 @@ github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2 github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= -go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= -go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= -go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= -go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= -go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= -go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= golang.org/x/arch v0.10.0 h1:S3huipmSclq3PJMNe76NGwkBR504WFkQ5dhzWzP8ZW8= golang.org/x/arch v0.10.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -222,43 +145,11 @@ golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.196.0 h1:k/RafYqebaIJBO3+SMnfEGtFVlvp5vSgqTUF54UN/zg= -google.golang.org/api v0.196.0/go.mod h1:g9IL21uGkYgvQ5BZg6BAtoGJQIm8r6EgaAbpNey5wBE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= -google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= -google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -267,6 +158,4 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/backend/handlers/record.go b/backend/handlers/record.go index bedde57..91e74b9 100644 --- a/backend/handlers/record.go +++ b/backend/handlers/record.go @@ -2,10 +2,8 @@ package handlers import ( "context" - "encoding/base64" "fmt" "io" - "log" "mime/multipart" "net/http" "os" @@ -16,11 +14,9 @@ import ( "lphub/models" "lphub/parser" + "github.com/Backblaze/blazer/b2" "github.com/gin-gonic/gin" "github.com/google/uuid" - "golang.org/x/oauth2/google" - "golang.org/x/oauth2/jwt" - "google.golang.org/api/drive/v3" ) type RecordRequest struct { @@ -79,19 +75,14 @@ func CreateRecordWithDemo(c *gin.Context) { return } // Demo files - demoFiles := []*multipart.FileHeader{record.HostDemo} + demoFileHeaders := []*multipart.FileHeader{record.HostDemo} if isCoop { - demoFiles = append(demoFiles, record.PartnerDemo) + demoFileHeaders = append(demoFileHeaders, record.PartnerDemo) } - var hostDemoUUID, hostDemoFileID, partnerDemoUUID, partnerDemoFileID string + var hostDemoUUID, partnerDemoUUID string var hostDemoScoreCount, hostDemoScoreTime int var hostSteamID, partnerSteamID string var hostDemoServerNumber, partnerDemoServerNumber int - srv, err := drive.New(serviceAccount()) - if err != nil { - c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) - return - } // Create database transaction for inserts tx, err := database.DB.Begin() if err != nil { @@ -100,22 +91,16 @@ func CreateRecordWithDemo(c *gin.Context) { } // Defer to a rollback in case anything fails defer tx.Rollback() - for i, header := range demoFiles { + for i, header := range demoFileHeaders { uuid := uuid.New().String() // Upload & insert into demos - err = c.SaveUploadedFile(header, "parser/"+uuid+".dem") - if err != nil { - c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) - return - } - defer os.Remove("parser/" + uuid + ".dem") - f, err := os.Open("parser/" + uuid + ".dem") + f, err := header.Open() if err != nil { c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) return } defer f.Close() - parserResult, err := parser.ProcessDemo("parser/" + uuid + ".dem") + parserResult, err := parser.ProcessDemo(f) if err != nil { c.JSON(http.StatusOK, models.ErrorResponse("Error while processing demo: "+err.Error())) return @@ -148,23 +133,15 @@ func CreateRecordWithDemo(c *gin.Context) { return } } - file, err := createFile(srv, uuid+".dem", "application/octet-stream", f, os.Getenv("GOOGLE_FOLDER_ID")) - if err != nil { - c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) - return - } if i == 0 { - hostDemoFileID = file.Id hostDemoUUID = uuid hostDemoServerNumber = parserResult.ServerNumber } else if i == 1 { - partnerDemoFileID = file.Id partnerDemoUUID = uuid partnerDemoServerNumber = parserResult.ServerNumber } - _, err = tx.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id) + _, err = tx.Exec(`INSERT INTO demos (id) VALUES ($1)`, uuid) if err != nil { - deleteFile(srv, file.Id) c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) return } @@ -172,8 +149,6 @@ func CreateRecordWithDemo(c *gin.Context) { // Insert into records if isCoop { if hostDemoServerNumber != partnerDemoServerNumber { - deleteFile(srv, hostDemoFileID) - deleteFile(srv, partnerDemoFileID) c.JSON(http.StatusOK, models.ErrorResponse(fmt.Sprintf("Host and partner demo server numbers (%d & %d) does not match!", hostDemoServerNumber, partnerDemoServerNumber))) return } @@ -192,8 +167,6 @@ func CreateRecordWithDemo(c *gin.Context) { // return // } if convertedHostSteamID != user.(models.User).SteamID && convertedPartnerSteamID != user.(models.User).SteamID { - deleteFile(srv, hostDemoFileID) - deleteFile(srv, partnerDemoFileID) c.JSON(http.StatusOK, models.ErrorResponse("You are permitted to only upload your own runs!")) return } @@ -205,8 +178,6 @@ func CreateRecordWithDemo(c *gin.Context) { } database.DB.QueryRow("SELECT steam_id FROM users WHERE steam_id = $1", checkPartnerSteamID).Scan(&verifyPartnerSteamID) if verifyPartnerSteamID != checkPartnerSteamID { - deleteFile(srv, hostDemoFileID) - deleteFile(srv, partnerDemoFileID) c.JSON(http.StatusOK, models.ErrorResponse("Partner SteamID does not match an account on LPHUB.")) return } @@ -214,8 +185,6 @@ func CreateRecordWithDemo(c *gin.Context) { VALUES($1, $2, $3, $4, $5, $6, $7)` _, err := tx.Exec(sql, mapID, hostDemoScoreCount, hostDemoScoreTime, convertedHostSteamID, convertedPartnerSteamID, hostDemoUUID, partnerDemoUUID) if err != nil { - deleteFile(srv, hostDemoFileID) - deleteFile(srv, partnerDemoFileID) c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) return } @@ -224,7 +193,39 @@ func CreateRecordWithDemo(c *gin.Context) { VALUES($1, $2, $3, $4, $5)` _, err := tx.Exec(sql, mapID, hostDemoScoreCount, hostDemoScoreTime, user.(models.User).SteamID, hostDemoUUID) if err != nil { - deleteFile(srv, hostDemoFileID) + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + } + // Everything is good, upload the demo files. + client, err := b2.NewClient(context.Background(), os.Getenv("B2_KEY_ID"), os.Getenv("B2_API_KEY")) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + bucket, err := client.Bucket(context.Background(), os.Getenv("B2_BUCKET_NAME")) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + for i, header := range demoFileHeaders { + f, err := header.Open() + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + defer f.Close() + var objectName string + if i == 0 { + objectName = hostDemoUUID + ".dem" + } else if i == 1 { + objectName = partnerDemoUUID + ".dem" + } + obj := bucket.Object(objectName) + writer := obj.NewWriter(context.Background()) + defer writer.Close() + _, err = io.Copy(writer, f) + if err != nil { c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) return } @@ -339,29 +340,15 @@ func DownloadDemoWithID(c *gin.Context) { c.JSON(http.StatusOK, models.ErrorResponse("Invalid id given.")) return } - srv, err := drive.New(serviceAccount()) + var checkedUUID string + err := database.DB.QueryRow("SELECT d.id FROM demos d WHERE d.id = $1", uuid).Scan(&checkedUUID) if err != nil { - c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) - return - } - - // Query drive instead of finding location id from db because SOMEONE reuploaded the demos. - // Tbf I had to reupload and will have to do time after time. Fuck you Google. - // I guess there's no need to store location id of demos anymore? - // ALSO ALSO, Google keeps track of old deleted files so sort by createdTime to get the latest demo. - fileList, err := srv.Files.List().Q(fmt.Sprintf("name = '%s.dem'", uuid)). - Fields("files(id, name, createdTime)").OrderBy("createdTime desc").PageSize(1).Do() - if err != nil { - c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) - return - } - if len(fileList.Files) == 0 { - c.JSON(http.StatusOK, models.ErrorResponse("Demo not found.")) + c.JSON(http.StatusOK, models.ErrorResponse("Given id does not match a demo.")) return } - url := "https://drive.google.com/uc?export=download&id=" + fileList.Files[0].Id fileName := uuid + ".dem" + url := os.Getenv("B2_DOWNLOAD_URL") + fileName output, err := os.Create(fileName) if err != nil { c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) @@ -389,43 +376,6 @@ func DownloadDemoWithID(c *gin.Context) { // c.FileAttachment() } -// Use Service account -func serviceAccount() *http.Client { - privateKey, _ := base64.StdEncoding.DecodeString(os.Getenv("GOOGLE_PRIVATE_KEY_BASE64")) - config := &jwt.Config{ - Email: os.Getenv("GOOGLE_CLIENT_EMAIL"), - PrivateKey: []byte(privateKey), - Scopes: []string{ - drive.DriveScope, - }, - TokenURL: google.JWTTokenURL, - } - client := config.Client(context.Background()) - return client -} - -// Create Gdrive file -func createFile(service *drive.Service, name string, mimeType string, content io.Reader, parentId string) (*drive.File, error) { - f := &drive.File{ - MimeType: mimeType, - Name: name, - Parents: []string{parentId}, - } - file, err := service.Files.Create(f).Media(content).Do() - - if err != nil { - log.Println("Could not create file: " + err.Error()) - return nil, err - } - - return file, nil -} - -// Delete Gdrive file -func deleteFile(service *drive.Service, fileId string) { - service.Files.Delete(fileId) -} - // Convert from SteamID64 to Legacy SteamID bits func convertSteamID(steamID64 int64) int64 { return (steamID64 >> 1) & 0x7FFFFFF diff --git a/backend/parser/parser.go b/backend/parser/parser.go index 19cd677..e39616c 100644 --- a/backend/parser/parser.go +++ b/backend/parser/parser.go @@ -2,8 +2,8 @@ package parser import ( "errors" + "io" "math" - "os" "regexp" "strconv" "strings" @@ -22,13 +22,9 @@ type Result struct { } // Don't try to understand it, feel it. -func ProcessDemo(filePath string) (Result, error) { +func ProcessDemo(demoFile io.Reader) (Result, error) { var result Result - file, err := os.Open(filePath) - if err != nil { - return Result{}, err - } - reader := bitreader.NewReader(file, true) + reader := bitreader.NewReader(demoFile, true) demoFileStamp := reader.TryReadString() demoProtocol := reader.TryReadSInt32() networkProtocol := reader.TryReadSInt32() -- cgit v1.2.3 From 53337bad0623a5f32c87d760bc03efb3cfe4eab6 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 21 Nov 2024 20:06:15 +0300 Subject: feat/frontend: remove map select from upload run dialog (#239) --- frontend/src/App.tsx | 6 -- frontend/src/api/Api.ts | 2 +- frontend/src/api/Maps.ts | 10 +-- frontend/src/components/UploadRunDialog.tsx | 113 ++++++++++++------------- frontend/src/types/Content.ts | 1 - frontend/src/types/MapNames.ts | 127 ++++++++++++++++++++++++++++ 6 files changed, 185 insertions(+), 74 deletions(-) create mode 100644 frontend/src/types/MapNames.ts diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e4bde75..a02779b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -66,12 +66,6 @@ const App: React.FC = () => { _fetch_games(); }, []); - if (!games) { - return ( - <> - ) - }; - return ( <> { diff --git a/frontend/src/api/Api.ts b/frontend/src/api/Api.ts index 2e55ab4..4a3f907 100644 --- a/frontend/src/api/Api.ts +++ b/frontend/src/api/Api.ts @@ -35,7 +35,7 @@ export const API = { post_map_discussion: (token: string, map_id: string, content: MapDiscussionContent) => post_map_discussion(token, map_id, content), post_map_discussion_comment: (token: string, map_id: string, discussion_id: number, comment: string) => post_map_discussion_comment(token, map_id, discussion_id, comment), - post_record: (token: string, run: UploadRunContent) => post_record(token, run), + post_record: (token: string, run: UploadRunContent, map_id: number) => post_record(token, run, map_id), delete_map_discussion: (token: string, map_id: string, discussion_id: number) => delete_map_discussion(token, map_id, discussion_id), diff --git a/frontend/src/api/Maps.ts b/frontend/src/api/Maps.ts index 89657b5..3832a2e 100644 --- a/frontend/src/api/Maps.ts +++ b/frontend/src/api/Maps.ts @@ -73,9 +73,9 @@ export const delete_map_discussion = async (token: string, map_id: string, discu return response.data.success; }; -export const post_record = async (token: string, run: UploadRunContent): Promise<[boolean, string]> => { +export const post_record = async (token: string, run: UploadRunContent, map_id: number): Promise<[boolean, string]> => { if (run.partner_demo) { - const response = await axios.postForm(url(`maps/${run.map_id}/record`), { + const response = await axios.postForm(url(`maps/${map_id}/record`), { "host_demo": run.host_demo, "partner_demo": run.partner_demo, }, { @@ -83,16 +83,16 @@ export const post_record = async (token: string, run: UploadRunContent): Promise "Authorization": token, } }); - return [ response.data.success, response.data.message ]; + return [response.data.success, response.data.message]; } else { - const response = await axios.postForm(url(`maps/${run.map_id}/record`), { + const response = await axios.postForm(url(`maps/${map_id}/record`), { "host_demo": run.host_demo, }, { headers: { "Authorization": token, } }); - return [ response.data.success, response.data.message ]; + return [response.data.success, response.data.message]; } } diff --git a/frontend/src/components/UploadRunDialog.tsx b/frontend/src/components/UploadRunDialog.tsx index 118b589..c02fdb8 100644 --- a/frontend/src/components/UploadRunDialog.tsx +++ b/frontend/src/components/UploadRunDialog.tsx @@ -4,12 +4,12 @@ import { ScoreboardTempUpdate, SourceDemoParser, NetMessages } from '@nekz/sdp'; import '@css/UploadRunDialog.css'; import { Game } from '@customTypes/Game'; -import { Map } from '@customTypes/Map'; import { API } from '@api/Api'; import { useNavigate } from 'react-router-dom'; import useMessage from '@hooks/UseMessage'; import useConfirm from '@hooks/UseConfirm'; import useMessageLoad from "@hooks/UseMessageLoad"; +import { MapNames } from '@customTypes/MapNames'; interface UploadRunDialogProps { token?: string; @@ -27,19 +27,11 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, const navigate = useNavigate(); const [uploadRunContent, setUploadRunContent] = React.useState({ - map_id: 0, host_demo: null, partner_demo: null, }); - const [currentMap, setCurrentMap] = React.useState(""); - - const _set_current_map = (game_name: string) => { - setCurrentMap(game_name); - } - const [selectedGameID, setSelectedGameID] = React.useState(0); - const [selectedGameMaps, setSelectedGameMaps] = React.useState([]); const [selectedGameName, setSelectedGameName] = React.useState(""); // dropdowns @@ -50,6 +42,7 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, const [dragHightlight, setDragHighlight] = React.useState(false); const [dragHightlightPartner, setDragHighlightPartner] = React.useState(false); + const fileInputRef = React.useRef(null); const fileInputRefPartner = React.useRef(null); @@ -102,14 +95,6 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, const _handle_game_select = async (game_id: string, game_name: string) => { setLoading(true); - const gameMaps = await API.get_game_maps(game_id); - setSelectedGameMaps(gameMaps); - setUploadRunContent({ - map_id: gameMaps.find((map) => !map.is_disabled)!.id, //gameMaps[0].id, - host_demo: null, - partner_demo: null, - }); - _set_current_map(gameMaps.find((map) => !map.is_disabled)!.name); setSelectedGameID(parseInt(game_id) - 1); setSelectedGameName(game_name); setLoading(false); @@ -158,6 +143,20 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, await message("Error", "Error while processing demo: Unable to get scoreboard result. Either there is a demo that is corrupt or haven't been recorded in challenge mode.") return } + + if (!demo.mapName || !MapNames[demo.mapName]) { + await message("Error", "Error while processing demo: Invalid map name.") + return + } + + if (selectedGameID === 0 && MapNames[demo.mapName] > 60) { + await message("Error", "Error while processing demo: Invalid cooperative demo in singleplayer submission.") + return + } else if (selectedGameID === 1 && MapNames[demo.mapName] <= 60) { + await message("Error", "Error while processing demo: Invalid singleplayer demo in cooperative submission.") + return + } + const { portalScore, timeScore } = scoreboard.userMessage?.as() ?? {}; const userConfirmed = await confirm("Upload Record", `Map Name: ${demo.mapName}\nPortal Count: ${portalScore}\nTicks: ${timeScore}\n\nAre you sure you want to upload this demo?`); @@ -167,10 +166,14 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, } messageLoad("Uploading..."); - const [success, response] = await API.post_record(token, uploadRunContent); + const [success, response] = await API.post_record(token, uploadRunContent, MapNames[demo.mapName]); messageLoadClose(); await message("Upload Record", response); if (success) { + setUploadRunContent({ + host_demo: null, + partner_demo: null, + }); onClose(success); navigate("/profile"); } @@ -179,7 +182,6 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, React.useEffect(() => { if (open) { - setDragHighlightPartner(false); setDragHighlight(false); _handle_game_select("1", "Portal 2 - Singleplayer"); // a different approach?. @@ -203,37 +205,20 @@ const UploadRunDialog: React.FC = ({ token, open, onClose,
{selectedGameName}
-
+
{games.map((game) => (
{ _handle_game_select(game.id.toString(), game.name); _handle_dropdowns(1) }} key={game.id}>{game.name}
))}
- {!loading && ( - <> -
-

Select Map

-
_handle_dropdowns(2)} style={{ display: "flex", alignItems: "center", cursor: "pointer", justifyContent: "space-between", margin: "10px 0px" }}> - {currentMap} - -
-
- - - - )} -
+ { !loading && ( <> - -
-

Host Demo

+ +
+

Host Demo

{ _handle_file_click(true) }} onDragOver={(e) => { _handle_drag_over(e, true) }} onDrop={(e) => { _handle_drop(e, true) }} onDragLeave={(e) => { _handle_drag_leave(e, true) }} className={`upload-run-drag-area ${dragHightlight ? "upload-run-drag-area-highlight" : ""} ${uploadRunContent.host_demo ? "upload-run-drag-area-hidden" : ""}`}> _handle_file_change(e.target.files, true)} /> {!uploadRunContent.host_demo ? @@ -252,38 +237,44 @@ const UploadRunDialog: React.FC = ({ token, open, onClose, games[selectedGameID].is_coop && ( <> -
-

Partner Demo

-
{ _handle_file_click(false) }} onDragOver={(e) => { _handle_drag_over(e, false) }} onDrop={(e) => { _handle_drop(e, false) }} onDragLeave={(e) => { _handle_drag_leave(e, false) }} className={`upload-run-drag-area ${dragHightlightPartner ? "upload-run-drag-area-highlight-partner" : ""} ${uploadRunContent.partner_demo ? "upload-run-drag-area-hidden" : ""}`}> - _handle_file_change(e.target.files, false)} /> {!uploadRunContent.partner_demo ? -
- Drag and drop +
+

Partner Demo

+
{ _handle_file_click(false) }} onDragOver={(e) => { _handle_drag_over(e, false) }} onDrop={(e) => { _handle_drop(e, false) }} onDragLeave={(e) => { _handle_drag_leave(e, false) }} className={`upload-run-drag-area ${dragHightlightPartner ? "upload-run-drag-area-highlight-partner" : ""} ${uploadRunContent.partner_demo ? "upload-run-drag-area-hidden" : ""}`}> + _handle_file_change(e.target.files, false)} /> {!uploadRunContent.partner_demo ?
- Or click here
- + Drag and drop +
+ Or click here
+ +
-
- : null} + : null} - {uploadRunContent.partner_demo?.name} + {uploadRunContent.partner_demo?.name} +
-
) } -
-
+
+
+ +
-
- ) }
-
- - -
+
+ + +
diff --git a/frontend/src/types/Content.ts b/frontend/src/types/Content.ts index 42a6917..775fab4 100644 --- a/frontend/src/types/Content.ts +++ b/frontend/src/types/Content.ts @@ -18,7 +18,6 @@ export interface MapDiscussionCommentContent { }; export interface UploadRunContent { - map_id: number; host_demo: File | null; partner_demo: File | null; }; diff --git a/frontend/src/types/MapNames.ts b/frontend/src/types/MapNames.ts new file mode 100644 index 0000000..b6313e7 --- /dev/null +++ b/frontend/src/types/MapNames.ts @@ -0,0 +1,127 @@ +export const MapNames: { [key: string]: number } = { + "sp_a1_intro1": 1, + "sp_a1_intro2": 2, + "sp_a1_intro3": 3, + "sp_a1_intro4": 4, + "sp_a1_intro5": 5, + "sp_a1_intro6": 6, + "sp_a1_intro7": 7, + "sp_a1_wakeup": 8, + "sp_a2_intro": 9, + + "sp_a2_laser_intro": 10, + "sp_a2_laser_stairs": 11, + "sp_a2_dual_lasers": 12, + "sp_a2_laser_over_goo": 13, + "sp_a2_catapult_intro": 14, + "sp_a2_trust_fling": 15, + "sp_a2_pit_flings": 16, + "sp_a2_fizzler_intro": 17, + + "sp_a2_sphere_peek": 18, + "sp_a2_ricochet": 19, + "sp_a2_bridge_intro": 20, + "sp_a2_bridge_the_gap": 21, + "sp_a2_turret_intro": 22, + "sp_a2_laser_relays": 23, + "sp_a2_turret_blocker": 24, + "sp_a2_laser_vs_turret": 25, + "sp_a2_pull_the_rug": 26, + + "sp_a2_column_blocker": 27, + "sp_a2_laser_chaining": 28, + "sp_a2_triple_laser": 29, + "sp_a2_bts1": 30, + "sp_a2_bts2": 31, + + "sp_a2_bts3": 32, + "sp_a2_bts4": 33, + "sp_a2_bts5": 34, + "sp_a2_core": 35, + + "sp_a3_01": 36, + "sp_a3_03": 37, + "sp_a3_jump_intro": 38, + "sp_a3_bomb_flings": 39, + "sp_a3_crazy_box": 40, + "sp_a3_transition01": 41, + + "sp_a3_speed_ramp": 42, + "sp_a3_speed_flings": 43, + "sp_a3_portal_intro": 44, + "sp_a3_end": 45, + + "sp_a4_intro": 46, + "sp_a4_tb_intro": 47, + "sp_a4_tb_trust_drop": 48, + "sp_a4_tb_wall_button": 49, + "sp_a4_tb_polarity": 50, + "sp_a4_tb_catch": 51, + "sp_a4_stop_the_box": 52, + "sp_a4_laser_catapult": 53, + "sp_a4_laser_platform": 54, + "sp_a4_speed_tb_catch": 55, + "sp_a4_jump_polarity": 56, + + "sp_a4_finale1": 57, + "sp_a4_finale2": 58, + "sp_a4_finale3": 59, + "sp_a4_finale4": 60, + + "mp_coop_start": 61, + "mp_coop_lobby_3": 62, + + "mp_coop_doors": 63, + "mp_coop_race_2": 64, + "mp_coop_laser_2": 65, + "mp_coop_rat_maze": 66, + "mp_coop_laser_crusher": 67, + "mp_coop_teambts": 68, + + "mp_coop_fling_3": 69, + "mp_coop_infinifling_train": 70, + "mp_coop_come_along": 71, + "mp_coop_fling_1": 72, + "mp_coop_catapult_1": 73, + "mp_coop_multifling_1": 74, + "mp_coop_fling_crushers": 75, + "mp_coop_fan": 76, + + "mp_coop_wall_intro": 77, + "mp_coop_wall_2": 78, + "mp_coop_catapult_wall_intro": 79, + "mp_coop_wall_block": 80, + "mp_coop_catapult_2": 81, + "mp_coop_turret_walls": 82, + "mp_coop_turret_ball": 83, + "mp_coop_wall_5": 84, + + "mp_coop_tbeam_redirect": 85, + "mp_coop_tbeam_drill": 86, + "mp_coop_tbeam_catch_grind_1": 87, + "mp_coop_tbeam_laser_1": 88, + "mp_coop_tbeam_polarity": 89, + "mp_coop_tbeam_polarity2": 90, + "mp_coop_tbeam_polarity3": 91, + "mp_coop_tbeam_maze": 92, + "mp_coop_tbeam_end": 93, + + "mp_coop_paint_come_along": 94, + "mp_coop_paint_redirect": 95, + "mp_coop_paint_bridge": 96, + "mp_coop_paint_walljumps": 97, + "mp_coop_paint_speed_fling": 98, + "mp_coop_paint_red_racer": 99, + "mp_coop_paint_speed_catch": 100, + "mp_coop_paint_longjump_intro": 101, + + "mp_coop_separation_1": 102, + "mp_coop_tripleaxis": 103, + "mp_coop_catapult_catch": 104, + "mp_coop_2paints_1bridge": 105, + "mp_coop_paint_conversion": 106, + "mp_coop_bridge_catch": 107, + "mp_coop_laser_tbeam": 108, + "mp_coop_paint_rat_maze": 109, + "mp_coop_paint_crazy_box": 110, +}; -- cgit v1.2.3 From 00711cab5bb8f3cdd1b86d062ef067587e3fc18a Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Fri, 22 Nov 2024 13:11:50 +0300 Subject: feat/backend: local demos path for testing (#243) Co-authored-by: NeKz --- backend/.env.example | 27 +++++++------- backend/handlers/record.go | 92 ++++++++++++++++++++++++++++++++++++---------- 2 files changed, 86 insertions(+), 33 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index 90ca8b4..b0a7101 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,13 +1,14 @@ -PORT= -SECRET_KEY= -API_KEY= -ENV= -DB_HOST= -DB_PORT= -DB_USER= -DB_PASS= -DB_NAME= -B2_BUCKET_NAME= -B2_KEY_ID= -B2_API_KEY= -B2_DOWNLOAD_URL= +PORT=4000 +SECRET_KEY=123456789ABCDEF +API_KEY=123456789ABCDEF +ENV=DEV +DB_HOST=localhost +DB_PORT=5432 +DB_USER=postgres +DB_PASS=postgres +DB_NAME=postgres +B2_BUCKET_NAME=lphub +B2_KEY_ID=123456789ABCDEF +B2_API_KEY=123456789ABCDEF +B2_DOWNLOAD_URL=https://lphub.s3.eu-central-001.backblazeb2.com/ +LOCAL_DEMOS_PATH=/path/to/demos/ diff --git a/backend/handlers/record.go b/backend/handlers/record.go index 91e74b9..25a6c6d 100644 --- a/backend/handlers/record.go +++ b/backend/handlers/record.go @@ -22,7 +22,6 @@ import ( type RecordRequest struct { HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required" swaggerignore:"true"` PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo" swaggerignore:"true"` - PartnerID string `json:"partner_id" form:"partner_id"` } type RecordResponse struct { @@ -197,6 +196,45 @@ func CreateRecordWithDemo(c *gin.Context) { return } } + if os.Getenv("ENV") == "DEV" { + if localPath := os.Getenv("LOCAL_DEMOS_PATH"); localPath != "" { + for i, header := range demoFileHeaders { + f, err := header.Open() + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + defer f.Close() + var objectName string + if i == 0 { + objectName = hostDemoUUID + ".dem" + } else if i == 1 { + objectName = partnerDemoUUID + ".dem" + } + demo, err := os.Create(localPath + objectName) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + defer demo.Close() + _, err = io.Copy(demo, f) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + } + if err = tx.Commit(); err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + c.JSON(http.StatusOK, models.Response{ + Success: true, + Message: "Successfully created record.", + Data: RecordResponse{ScoreCount: hostDemoScoreCount, ScoreTime: hostDemoScoreTime}, + }) + return + } + } // Everything is good, upload the demo files. client, err := b2.NewClient(context.Background(), os.Getenv("B2_KEY_ID"), os.Getenv("B2_API_KEY")) if err != nil { @@ -347,32 +385,46 @@ func DownloadDemoWithID(c *gin.Context) { return } - fileName := uuid + ".dem" - url := os.Getenv("B2_DOWNLOAD_URL") + fileName - output, err := os.Create(fileName) - if err != nil { - c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) - return - } - defer os.Remove(fileName) - defer output.Close() - response, err := http.Get(url) - if err != nil { - c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) - return + localPath := "" + if os.Getenv("ENV") == "DEV" { + localPath = os.Getenv("LOCAL_DEMOS_PATH") } - defer response.Body.Close() - _, err = io.Copy(output, response.Body) - if err != nil { - c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) - return + + fileName := uuid + ".dem" + if localPath == "" { + url := os.Getenv("B2_DOWNLOAD_URL") + fileName + output, err := os.Create(fileName) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + defer os.Remove(fileName) + defer output.Close() + response, err := http.Get(url) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + defer response.Body.Close() + _, err = io.Copy(output, response.Body) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } } + // Downloaded file c.Header("Content-Description", "File Transfer") c.Header("Content-Transfer-Encoding", "binary") c.Header("Content-Disposition", "attachment; filename="+fileName) c.Header("Content-Type", "application/octet-stream") - c.File(fileName) + + if localPath == "" { + c.File(fileName) + } else { + c.File(localPath + fileName) + } + // c.FileAttachment() } -- cgit v1.2.3 From 6756230cfa038b681415a2a1839e55d21c1824f6 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:09:32 +0300 Subject: docs/lphub: seperate contributors into a new file (#244) --- CONTRIBUTORS.md | 30 ++++++++++++++++++++++++++++++ README.md | 28 +++++----------------------- 2 files changed, 35 insertions(+), 23 deletions(-) create mode 100644 CONTRIBUTORS.md diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000..817aead --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,30 @@ +# LPHUB Contributors + +## Project Team + +* [@pektezol](https://github.com/pektezol) - Project Lead +* [@Krzyhau](https://github.com/Krzyhau) - Visual Design +* [@Nidboj132](https://github.com/Nidboj132) - Subject Expert & Frontend +* [@Oryn](https://github.com/Oryn-Goia) - Subject Expert +* [@Wolfboy248](https://github.com/Wolfboy248) - Frontend +* [@FifthWit](https://github.com/FifthWit) - Frontend +* [@NeKz](https://github.com/NeKzor) - Backend & Operations + +## Content Contributors + +* Black_Semka +* Feliser +* Jaio +* Jess3n +* Robotwars1 +* SuperAiderton +* Thearus + +## Special Thanks + +* [@NeKz](https://github.com/NeKzor) - For being the inspiration of this project and the developer of the former least portals site found [here](https://github.com/NeKzor/lp). Also for creating the [@nekz/sdp](https://github.com/NeKzor/sdp) package for demo parsing in client-side for quick information. +* [@UncraftedName](https://github.com/UncraftedName) - For being a guide to parsing demo files and helping with how to retrieve total portal count and elapsed time from the CM counter with their parser found [here](https://github.com/UncraftedName/UntitledParser). + +## Last Update + +2024-11-25 diff --git a/README.md b/README.md index ad5bf3d..1831813 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Least Portals Hub (LPHUB) +# LPHUB - Least Portals Hub ## About LPHUB @@ -10,27 +10,9 @@ In addition, we host a leaderboard section for each map where users can compare There's also discussion tabs for each map to act like forum pages in order to talk about possible new routes, alternatives, and overall comments. -## Project Team +## Contributors -* [@pektezol](https://github.com/pektezol) - Project Lead -* [@Krzyhau](https://github.com/Krzyhau) - Visual Design -* [@Nidboj132](https://github.com/Nidboj132) - Subject Expert & Frontend -* [@Oryn](https://github.com/Oryn-Goia) - Subject Expert -* [@Wolfboy248](https://github.com/Wolfboy248) - Frontend - -## Content Contributors - -* Black_Semka -* Feliser -* Jaio -* Jess3n -* Robotwars1 -* Thearus - -## Special Thanks - -* [@NeKz](https://github.com/NeKzor) - For being the inspiration of this project and the developer of the former least portals site found [here](https://github.com/NeKzor/lp). Also for creating the [@nekz/sdp](https://github.com/NeKzor/sdp) package for demo parsing in client-side for quick information. -* [@UncraftedName](https://github.com/UncraftedName) - For being a guide to parsing demo files and helping with how to retrieve total portal count and elapsed time from the CM counter with their parser found [here](https://github.com/UncraftedName/UntitledParser). +Full list of contributors can be found in the [CONTRIBUTORS](https://github.com/pektezol/lphub/blob/main/CONTRIBUTORS.md) file. ## Documentation @@ -53,7 +35,7 @@ If you want to support the creator, you can do it via using GitHub sponsorships * We store a JWT (JSON Web Token) on your device as a cookie to facilitate authentication to LPHUB. * We collect and store your publicly available id, username, avatar link, and country code from Steam during your first login to LPHUB. The exact date and time of your LPHUB account creation is also stored. * In a case of profile update, newly changed values replaces the old data, and the update time is also stored. -* All of the demo proof submitted by users are stored in a publicly accessible Google Drive folder. By submitting demo as a proof, you agree that your demo proof becomes available to the public. +* All of the demo proof submitted by users are stored in a publicly accessible Backblaze B2 bucket. By submitting demo as a proof, you agree that your demo proof becomes available to the public. * Any information, ideas, or solutions shared on LPHUB are intended to be openly accessible and available for collaborative purposes. Users should understand that the content they contribute might be viewed and used by others for the purpose of generating insights and solutions. * At any time, Privacy Policy may get updated to reflect changes in LPHUB. The effective date at the bottom of the README indicates when the most recent changes were made. @@ -73,4 +55,4 @@ By using LPHUB, you acknowledge that you have read and understood this disclaime ## Last Update -2024-10-31 \ No newline at end of file +2024-11-25 \ No newline at end of file -- cgit v1.2.3 From 9c3e5686f36bc4ba76d510f27adc89f378a3a658 Mon Sep 17 00:00:00 2001 From: Wolfboy248 <121288977+Wolfboy248@users.noreply.github.com> Date: Tue, 10 Dec 2024 07:16:37 +0100 Subject: fix/frontend: map pagination fix (#246) --- frontend/src/api/Api.ts | 2 +- frontend/src/api/Maps.ts | 4 ++-- frontend/src/components/Leaderboards.tsx | 21 +++++++++++++++++---- frontend/src/pages/Maps.tsx | 4 ++-- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/frontend/src/api/Api.ts b/frontend/src/api/Api.ts index 4a3f907..862e688 100644 --- a/frontend/src/api/Api.ts +++ b/frontend/src/api/Api.ts @@ -29,7 +29,7 @@ export const API = { get_unofficial_rankings: () => get_unofficial_rankings(), // Maps get_map_summary: (map_id: string) => get_map_summary(map_id), - get_map_leaderboard: (map_id: string) => get_map_leaderboard(map_id), + get_map_leaderboard: (map_id: string, page: string) => get_map_leaderboard(map_id, page), get_map_discussions: (map_id: string) => get_map_discussions(map_id), get_map_discussion: (map_id: string, discussion_id: number) => get_map_discussion(map_id, discussion_id), diff --git a/frontend/src/api/Maps.ts b/frontend/src/api/Maps.ts index 3832a2e..aa967ce 100644 --- a/frontend/src/api/Maps.ts +++ b/frontend/src/api/Maps.ts @@ -8,8 +8,8 @@ export const get_map_summary = async (map_id: string): Promise => { return response.data.data; }; -export const get_map_leaderboard = async (map_id: string): Promise => { - const response = await axios.get(url(`maps/${map_id}/leaderboards`)); +export const get_map_leaderboard = async (map_id: string, page: string): Promise => { + const response = await axios.get(url(`maps/${map_id}/leaderboards?page=${page}`)); if (!response.data.success) { return undefined; } diff --git a/frontend/src/components/Leaderboards.tsx b/frontend/src/components/Leaderboards.tsx index 4a8b463..fb614fa 100644 --- a/frontend/src/components/Leaderboards.tsx +++ b/frontend/src/components/Leaderboards.tsx @@ -1,20 +1,33 @@ import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link, useNavigate } from 'react-router-dom'; import { DownloadIcon, ThreedotIcon } from '@images/Images'; import { MapLeaderboard } from '@customTypes/Map'; import { ticks_to_time, time_ago } from '@utils/Time'; +import { API } from "@api/Api"; import useMessage from "@hooks/UseMessage"; import "@css/Maps.css" interface LeaderboardsProps { - data?: MapLeaderboard; + mapID: string; } -const Leaderboards: React.FC = ({ data }) => { +const Leaderboards: React.FC = ({ mapID }) => { + const navigate = useNavigate(); + const [data, setData] = React.useState(undefined); + const [pageNumber, setPageNumber] = React.useState(1); + + const _fetch_map_leaderboards = async () => { + const mapLeaderboards = await API.get_map_leaderboard(mapID, pageNumber.toString()); + setData(mapLeaderboards); + }; const { message, MessageDialogComponent } = useMessage(); - const [pageNumber, setPageNumber] = React.useState(1); + + React.useEffect(() => { + _fetch_map_leaderboards(); + console.log(data); + }, [pageNumber, navigate]) if (!data) { return ( diff --git a/frontend/src/pages/Maps.tsx b/frontend/src/pages/Maps.tsx index f1daa36..f73e8d2 100644 --- a/frontend/src/pages/Maps.tsx +++ b/frontend/src/pages/Maps.tsx @@ -35,7 +35,7 @@ const Maps: React.FC = ({ token, isModerator }) => { }; const _fetch_map_leaderboards = async () => { - const mapLeaderboards = await API.get_map_leaderboard(mapID); + const mapLeaderboards = await API.get_map_leaderboard(mapID, "1"); setMapLeaderboardData(mapLeaderboards); }; @@ -94,7 +94,7 @@ const Maps: React.FC = ({ token, isModerator }) => { {navState === 0 && } - {navState === 1 && } + {navState === 1 && } {navState === 2 && _fetch_map_discussions()} />} -- cgit v1.2.3 From cde64e47961823613a69e7d0185f5c36eac2e896 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 21 Dec 2024 16:32:05 +0300 Subject: fix/rankings: sort overall placements for lphub (#250) --- backend/handlers/home.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/backend/handlers/home.go b/backend/handlers/home.go index 714610a..5b4e246 100644 --- a/backend/handlers/home.go +++ b/backend/handlers/home.go @@ -6,6 +6,7 @@ import ( "log" "net/http" "os" + "sort" "strings" "lphub/database" @@ -106,6 +107,15 @@ func RankingsLPHUB(c *gin.Context) { } } } + // Sort the overall rankings + sort.Slice(response.Overall, func(i, j int) bool { + a := response.Overall[i] + b := response.Overall[j] + if a.TotalScore == b.TotalScore { + return a.User.SteamID < b.User.SteamID + } + return a.TotalScore < b.TotalScore + }) placement := 1 ties := 0 -- cgit v1.2.3 From 75c0117ba7c58e6fbcc17648276e8d6951e7ad0d Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sun, 22 Dec 2024 10:57:40 +0300 Subject: fix/profile: overall completion count wrong (#252) --- backend/handlers/user.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/backend/handlers/user.go b/backend/handlers/user.go index 53f0d06..ea31065 100644 --- a/backend/handlers/user.go +++ b/backend/handlers/user.go @@ -4,6 +4,7 @@ import ( "net/http" "os" "regexp" + "sort" "time" "lphub/database" @@ -183,6 +184,15 @@ func Profile(c *gin.Context) { } } } + // Sort the overall rankings + sort.Slice(rankingsList.Overall, func(i, j int) bool { + a := rankingsList.Overall[i] + b := rankingsList.Overall[j] + if a.TotalScore == b.TotalScore { + return a.User.SteamID < b.User.SteamID + } + return a.TotalScore < b.TotalScore + }) placement := 1 ties := 0 @@ -507,6 +517,15 @@ func FetchUser(c *gin.Context) { } } } + // Sort the overall rankings + sort.Slice(rankingsList.Overall, func(i, j int) bool { + a := rankingsList.Overall[i] + b := rankingsList.Overall[j] + if a.TotalScore == b.TotalScore { + return a.User.SteamID < b.User.SteamID + } + return a.TotalScore < b.TotalScore + }) placement := 1 ties := 0 -- cgit v1.2.3 From 21980e68693a6941bed352a46212ccb72b8b7d88 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:09:56 +0300 Subject: fix/backend: turret assassin map name typo (#254) --- backend/database/insert/maps.sql | 2 +- backend/handlers/home.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/database/insert/maps.sql b/backend/database/insert/maps.sql index f0235fa..e896ba9 100644 --- a/backend/database/insert/maps.sql +++ b/backend/database/insert/maps.sql @@ -96,7 +96,7 @@ INSERT INTO maps(game_id, chapter_id, name, is_disabled, image) VALUES (2,13,'Catapult Block',false,''), (2,13,'Bridge Fling',false,''), (2,13,'Turret Walls',false,''), -(2,13,'Turret Assasin',false,''), +(2,13,'Turret Assassin',false,''), (2,13,'Bridge Testing',false,''), -- 4 (2,14,'Cooperative Funnels',false,''), diff --git a/backend/handlers/home.go b/backend/handlers/home.go index 5b4e246..095b666 100644 --- a/backend/handlers/home.go +++ b/backend/handlers/home.go @@ -327,7 +327,7 @@ func SearchWithQuery(c *gin.Context) { {ID: 80, Game: "Portal 2 - Cooperative", Chapter: "Course 3 - Hard-Light Surfaces", Map: "Catapult Block"}, {ID: 81, Game: "Portal 2 - Cooperative", Chapter: "Course 3 - Hard-Light Surfaces", Map: "Bridge Fling"}, {ID: 82, Game: "Portal 2 - Cooperative", Chapter: "Course 3 - Hard-Light Surfaces", Map: "Turret Walls"}, - {ID: 83, Game: "Portal 2 - Cooperative", Chapter: "Course 3 - Hard-Light Surfaces", Map: "Turret Assasin"}, + {ID: 83, Game: "Portal 2 - Cooperative", Chapter: "Course 3 - Hard-Light Surfaces", Map: "Turret Assassin"}, {ID: 84, Game: "Portal 2 - Cooperative", Chapter: "Course 3 - Hard-Light Surfaces", Map: "Bridge Testing"}, {ID: 85, Game: "Portal 2 - Cooperative", Chapter: "Course 4 - Excursion Funnels", Map: "Cooperative Funnels"}, {ID: 86, Game: "Portal 2 - Cooperative", Chapter: "Course 4 - Excursion Funnels", Map: "Funnel Drill"}, -- cgit v1.2.3 From 8fa61a8eb28f3b0f62b5ce68a97c3fb4f4e6c54d Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sun, 19 Jan 2025 20:01:01 +0300 Subject: feat/frontend: show 0 wr delta as dash (#256) --- frontend/src/pages/Profile.tsx | 4 ++-- frontend/src/pages/User.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/pages/Profile.tsx b/frontend/src/pages/Profile.tsx index f7134a7..63b3c13 100644 --- a/frontend/src/pages/Profile.tsx +++ b/frontend/src/pages/Profile.tsx @@ -267,7 +267,7 @@ const Profile: React.FC = ({ profile, token, gameData, onDeleteRec {e.score_count} - {e.score_count - r.map_wr_count > 0 ? `+${e.score_count - r.map_wr_count}` : e.score_count - r.map_wr_count} + {e.score_count - r.map_wr_count > 0 ? `+${e.score_count - r.map_wr_count}` : `-`} {ticks_to_time(e.score_time)} {i === 0 ? #{r.placement} : } @@ -313,7 +313,7 @@ const Profile: React.FC = ({ profile, token, gameData, onDeleteRec {i !== 0 ?
: ""} {r.name} {record!.scores[i].score_count} - {record!.scores[i].score_count - record!.map_wr_count > 0 ? `+${record!.scores[i].score_count - record!.map_wr_count}` : record!.scores[i].score_count - record!.map_wr_count} + {record!.scores[i].score_count - record!.map_wr_count > 0 ? `+${record!.scores[i].score_count - record!.map_wr_count}` : `-`} {ticks_to_time(record!.scores[i].score_time)} {i === 0 ? #{record!.placement} : } diff --git a/frontend/src/pages/User.tsx b/frontend/src/pages/User.tsx index f90d1aa..938dbd5 100644 --- a/frontend/src/pages/User.tsx +++ b/frontend/src/pages/User.tsx @@ -236,7 +236,7 @@ const User: React.FC = ({ token, profile, gameData }) => { {e.score_count} - {e.score_count - r.map_wr_count > 0 ? `+${e.score_count - r.map_wr_count}` : e.score_count - r.map_wr_count} + {e.score_count - r.map_wr_count > 0 ? `+${e.score_count - r.map_wr_count}` : `-`} {ticks_to_time(e.score_time)} {i === 0 ? #{r.placement} : } @@ -281,7 +281,7 @@ const User: React.FC = ({ token, profile, gameData }) => { {i !== 0 ?
: ""} {r.name} {record!.scores[i].score_count} - {record!.scores[i].score_count - record!.map_wr_count > 0 ? `+${record!.scores[i].score_count - record!.map_wr_count}` : record!.scores[i].score_count - record!.map_wr_count} + {record!.scores[i].score_count - record!.map_wr_count > 0 ? `+${record!.scores[i].score_count - record!.map_wr_count}` : `-`} {ticks_to_time(record!.scores[i].score_time)} {i === 0 ? #{record!.placement} : } -- cgit v1.2.3 From 1685d6e13b8a09b0fb4f2ae94fb2e66a437f9155 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 25 Jan 2025 00:38:49 +0300 Subject: wr: finale 2 - 0 portals (#258) --- backend/database/insert/history.sql | 1 + rankings/input/records.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/database/insert/history.sql b/backend/database/insert/history.sql index 34fddcb..6b4922a 100644 --- a/backend/database/insert/history.sql +++ b/backend/database/insert/history.sql @@ -547,6 +547,7 @@ INSERT INTO map_history(map_id,category_id,user_name,score_count,record_date) VA (57,1,'Krank',5,'2012-07-29'), (57,1,'Krzyhau',0,'2017-10-29'), (58,1,'Stimich',2,'2011-10-11'), +(58,1,'Isenstige',0,'2025-01-24'), (59,1,'Isimmo',7,'2011-11-04'), (59,1,'sicklebrick',6,'2013-03-20'), (60,1,'CalmlyFrenetic',7,'2011-10-19'), diff --git a/rankings/input/records.json b/rankings/input/records.json index 884fd49..d960004 100644 --- a/rankings/input/records.json +++ b/rankings/input/records.json @@ -298,7 +298,7 @@ "id": 47822, "name": "Finale 2", "mode": 1, - "wr": 2 + "wr": 0 }, { "id": 47823, -- cgit v1.2.3 From 681f7d3ba097cd8d204ff3ac4dae01432d323e5b Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:43:17 +0300 Subject: feat/frontend: dynamic title and meta descriptions (#261) --- frontend/package-lock.json | 38 + frontend/package.json | 2 + frontend/public/index.html | 41 +- frontend/public/response.json | 4984 --------------------------------------- frontend/src/App.tsx | 5 + frontend/src/pages/About.tsx | 4 + frontend/src/pages/Games.tsx | 12 +- frontend/src/pages/Homepage.tsx | 6 +- frontend/src/pages/Maplist.tsx | 48 +- frontend/src/pages/Maps.tsx | 37 +- frontend/src/pages/Profile.tsx | 5 + frontend/src/pages/Rankings.tsx | 30 +- frontend/src/pages/Rules.tsx | 4 + frontend/src/pages/User.tsx | 5 + 14 files changed, 161 insertions(+), 5060 deletions(-) delete mode 100644 frontend/public/response.json diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b342a9c..9ee52eb 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -19,6 +19,7 @@ "axios": "^1.7.4", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-helmet": "^6.1.0", "react-markdown": "^9.0.1", "react-router-dom": "^6.26.1", "react-scripts": "5.0.1", @@ -27,6 +28,7 @@ }, "devDependencies": { "@craco/craco": "^7.1.0", + "@types/react-helmet": "^6.1.11", "craco-alias": "^3.0.1" } }, @@ -4302,6 +4304,15 @@ "@types/react": "*" } }, + "node_modules/@types/react-helmet": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz", + "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -15772,6 +15783,25 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -15912,6 +15942,14 @@ } } }, + "node_modules/react-side-effect": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", + "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index c317b98..1ee6441 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,6 +14,7 @@ "axios": "^1.7.4", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-helmet": "^6.1.0", "react-markdown": "^9.0.1", "react-router-dom": "^6.26.1", "react-scripts": "5.0.1", @@ -46,6 +47,7 @@ }, "devDependencies": { "@craco/craco": "^7.1.0", + "@types/react-helmet": "^6.1.11", "craco-alias": "^3.0.1" } } diff --git a/frontend/public/index.html b/frontend/public/index.html index 46a123a..37e27b7 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -1,21 +1,18 @@ - - - - - - - - - - - Least Portals Hub - - - -
- - - + + + \ No newline at end of file diff --git a/frontend/public/response.json b/frontend/public/response.json deleted file mode 100644 index a2f3190..0000000 --- a/frontend/public/response.json +++ /dev/null @@ -1,4984 +0,0 @@ -{ - "success": true, - "message": "Successfully retrieved rankings.", - "data": { - "rankings_singleplayer": [ - { - "user_name": "SuperAiderton", - "avatar_link": "https://avatars.steamstatic.com/a19aca196dbb75b51b83fe7d06b0b7fce0f894b2_full.jpg", - "steam_id": "76561199069631083", - "sp_score": 65, - "mp_score": 48, - "overall_score": 113, - "sp_rank": 1, - "mp_rank": 7, - "overall_rank": 1 - }, - { - "user_name": "GLaBOSS", - "avatar_link": "https://avatars.steamstatic.com/9adb9839e82a9d8506e80d6436f9af08f4202ba4_full.jpg", - "steam_id": "76561198069545076", - "sp_score": 72, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 2, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "zombotany2", - "avatar_link": "https://avatars.steamstatic.com/1a23caeff548e3683db8880bf48882bd9cc0e348_full.jpg", - "steam_id": "76561198084336096", - "sp_score": 72, - "mp_score": 2, - "overall_score": 0, - "sp_rank": 2, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "mOtYl", - "avatar_link": "https://avatars.steamstatic.com/8065f6018757dc0ee927d2279ccf7e8ab7827109_full.jpg", - "steam_id": "76561197994700458", - "sp_score": 74, - "mp_score": 49, - "overall_score": 123, - "sp_rank": 3, - "mp_rank": 8, - "overall_rank": 3 - }, - { - "user_name": "Nidboj132", - "avatar_link": "https://avatars.steamstatic.com/07bc99e768c9f640979e2a393f28306a32fa796e_full.jpg", - "steam_id": "76561198337970645", - "sp_score": 76, - "mp_score": 41, - "overall_score": 117, - "sp_rank": 4, - "mp_rank": 1, - "overall_rank": 2 - }, - { - "user_name": "Thearus", - "avatar_link": "https://avatars.steamstatic.com/06175d3938f1203e80bcbf5898d7ca803e7555eb_full.jpg", - "steam_id": "76561198846409182", - "sp_score": 79, - "mp_score": 50, - "overall_score": 0, - "sp_rank": 5, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "?", - "avatar_link": "https://avatars.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg", - "steam_id": "76561198838630481", - "sp_score": 80, - "mp_score": 46, - "overall_score": 126, - "sp_rank": 6, - "mp_rank": 5, - "overall_rank": 4 - }, - { - "user_name": "slamix", - "avatar_link": "https://avatars.steamstatic.com/730aee7d3904a0f38506858ba83ebc014260ccc3_full.jpg", - "steam_id": "76561198403952785", - "sp_score": 81, - "mp_score": 47, - "overall_score": 128, - "sp_rank": 7, - "mp_rank": 6, - "overall_rank": 6 - }, - { - "user_name": "xeonic", - "avatar_link": "https://avatars.steamstatic.com/7c3e67f433c90512fe6cac7278d6cb8b59d10c96_full.jpg", - "steam_id": "76561198973478625", - "sp_score": 82, - "mp_score": 45, - "overall_score": 127, - "sp_rank": 8, - "mp_rank": 4, - "overall_rank": 5 - }, - { - "user_name": "PerOculos", - "avatar_link": "https://avatars.steamstatic.com/7b00906ac356806bc7bdb3815ea7c1c5b13b65a8_full.jpg", - "steam_id": "76561198003223063", - "sp_score": 84, - "mp_score": 50, - "overall_score": 134, - "sp_rank": 9, - "mp_rank": 9, - "overall_rank": 8 - }, - { - "user_name": "Black_Semka", - "avatar_link": "https://avatars.steamstatic.com/3a6acf4e40097d9db7af432684a08b6267d2af5c_full.jpg", - "steam_id": "76561198997027314", - "sp_score": 85, - "mp_score": 41, - "overall_score": 126, - "sp_rank": 10, - "mp_rank": 1, - "overall_rank": 4 - }, - { - "user_name": "LittleRoi", - "avatar_link": "https://avatars.steamstatic.com/c9180f93ac892fa7d078f5946239d049e987e3b6_full.jpg", - "steam_id": "76561198112477703", - "sp_score": 85, - "mp_score": 50, - "overall_score": 135, - "sp_rank": 10, - "mp_rank": 9, - "overall_rank": 9 - }, - { - "user_name": "Robotwars1", - "avatar_link": "https://avatars.steamstatic.com/ac4bc6cc73ef75f11690205b123685fd5e3a7823_full.jpg", - "steam_id": "76561198129010912", - "sp_score": 86, - "mp_score": 49, - "overall_score": 135, - "sp_rank": 11, - "mp_rank": 8, - "overall_rank": 9 - }, - { - "user_name": "MrCatMcFly", - "avatar_link": "https://avatars.steamstatic.com/6f89591012f8f0f34cef1ecdb1c10793b0ea4bd1_full.jpg", - "steam_id": "76561198168920589", - "sp_score": 87, - "mp_score": 66, - "overall_score": 153, - "sp_rank": 12, - "mp_rank": 25, - "overall_rank": 20 - }, - { - "user_name": "BiSaXa", - "avatar_link": "https://avatars.steamstatic.com/fa7f64c79b247c8a80cafbd6dd8033b98cc1153c_full.jpg", - "steam_id": "76561198131629989", - "sp_score": 87, - "mp_score": 47, - "overall_score": 134, - "sp_rank": 12, - "mp_rank": 6, - "overall_rank": 8 - }, - { - "user_name": "shred", - "avatar_link": "https://avatars.steamstatic.com/0216ce300d00ec193414773679db7dcd77d1cd29_full.jpg", - "steam_id": "76561198025486280", - "sp_score": 88, - "mp_score": 59, - "overall_score": 147, - "sp_rank": 13, - "mp_rank": 18, - "overall_rank": 15 - }, - { - "user_name": "Krzyhau", - "avatar_link": "https://avatars.steamstatic.com/f29de7f41db29526848b52c8942f727b7c70b0db_full.jpg", - "steam_id": "76561198096446735", - "sp_score": 89, - "mp_score": 52, - "overall_score": 141, - "sp_rank": 14, - "mp_rank": 11, - "overall_rank": 12 - }, - { - "user_name": "SrRageALot", - "avatar_link": "https://avatars.steamstatic.com/db9c6b6761d63c640456043d864f98f58f62d750_full.jpg", - "steam_id": "76561199156418931", - "sp_score": 89, - "mp_score": 57, - "overall_score": 146, - "sp_rank": 14, - "mp_rank": 16, - "overall_rank": 14 - }, - { - "user_name": "Feirune~", - "avatar_link": "https://avatars.steamstatic.com/fece8c2b7c57f3eecf75897ad86609adefb7ec1a_full.jpg", - "steam_id": "76561198134041367", - "sp_score": 90, - "mp_score": 41, - "overall_score": 131, - "sp_rank": 15, - "mp_rank": 1, - "overall_rank": 7 - }, - { - "user_name": "TeePeeWee", - "avatar_link": "https://avatars.steamstatic.com/4392a52e384f22c9f77b539eb4b1aa2914880cdf_full.jpg", - "steam_id": "76561199239427541", - "sp_score": 90, - "mp_score": 48, - "overall_score": 138, - "sp_rank": 15, - "mp_rank": 7, - "overall_rank": 10 - }, - { - "user_name": "(MGN)-ZGP-NIKITA", - "avatar_link": "https://avatars.steamstatic.com/8a72e1ed5a29e56c24926ccb33879a544bc67b36_full.jpg", - "steam_id": "76561198076017585", - "sp_score": 91, - "mp_score": 49, - "overall_score": 140, - "sp_rank": 16, - "mp_rank": 8, - "overall_rank": 11 - }, - { - "user_name": "Confusion_18", - "avatar_link": "https://avatars.steamstatic.com/360236e555049f204b12d3a8685a3b9b9764ebfe_full.jpg", - "steam_id": "76561198386577258", - "sp_score": 91, - "mp_score": 51, - "overall_score": 142, - "sp_rank": 16, - "mp_rank": 10, - "overall_rank": 13 - }, - { - "user_name": "Linus", - "avatar_link": "https://avatars.steamstatic.com/cfaf6917f47ca6122396f46e485a79a090f29fa0_full.jpg", - "steam_id": "76561198162078579", - "sp_score": 92, - "mp_score": 49, - "overall_score": 141, - "sp_rank": 17, - "mp_rank": 8, - "overall_rank": 12 - }, - { - "user_name": "Zadadaz", - "avatar_link": "https://avatars.steamstatic.com/8c7bed09ce10417502477b6ca29f8257c840cab3_full.jpg", - "steam_id": "76561198451680661", - "sp_score": 92, - "mp_score": 43, - "overall_score": 135, - "sp_rank": 17, - "mp_rank": 2, - "overall_rank": 9 - }, - { - "user_name": "マジックサラダ", - "avatar_link": "https://avatars.steamstatic.com/8772186a3ab48712b6eb955a46d269b52ebda706_full.jpg", - "steam_id": "76561198092289827", - "sp_score": 93, - "mp_score": 55, - "overall_score": 148, - "sp_rank": 18, - "mp_rank": 14, - "overall_rank": 16 - }, - { - "user_name": "cubone", - "avatar_link": "https://avatars.steamstatic.com/e285359230318e5cfb27ed688903c5350cd21075_full.jpg", - "steam_id": "76561198096862334", - "sp_score": 93, - "mp_score": 59, - "overall_score": 152, - "sp_rank": 18, - "mp_rank": 18, - "overall_rank": 19 - }, - { - "user_name": "KnightedNave", - "avatar_link": "https://avatars.steamstatic.com/7f03558f490c8418c7864da9eb9eac8579485758_full.jpg", - "steam_id": "76561199164989405", - "sp_score": 94, - "mp_score": 190, - "overall_score": 0, - "sp_rank": 19, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "unity", - "avatar_link": "https://avatars.steamstatic.com/1fcc7701ff71dce31965e10408d79aeb79bdf051_full.jpg", - "steam_id": "76561198081168311", - "sp_score": 96, - "mp_score": 53, - "overall_score": 149, - "sp_rank": 20, - "mp_rank": 12, - "overall_rank": 17 - }, - { - "user_name": "niceeggtryingtime", - "avatar_link": "https://avatars.steamstatic.com/4120dc145e5b5b4dcb37a47bd2f4cb04b56e6481_full.jpg", - "steam_id": "76561199139116725", - "sp_score": 97, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 21, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Suola", - "avatar_link": "https://avatars.steamstatic.com/f86dcc2d065a87a603427bb382d26e96c1d61060_full.jpg", - "steam_id": "76561198917972968", - "sp_score": 98, - "mp_score": 50, - "overall_score": 148, - "sp_rank": 22, - "mp_rank": 9, - "overall_rank": 16 - }, - { - "user_name": "Pr0tal", - "avatar_link": "https://avatars.steamstatic.com/ce72799aa2cf4b591df09b3afc715b2259963af7_full.jpg", - "steam_id": "76561198292863694", - "sp_score": 98, - "mp_score": 68, - "overall_score": 166, - "sp_rank": 22, - "mp_rank": 27, - "overall_rank": 26 - }, - { - "user_name": "Herneerius", - "avatar_link": "https://avatars.steamstatic.com/4879fa1c72770b2c0eaef341dc6546db13897bb5_full.jpg", - "steam_id": "76561198084978888", - "sp_score": 98, - "mp_score": 61, - "overall_score": 159, - "sp_rank": 22, - "mp_rank": 20, - "overall_rank": 22 - }, - { - "user_name": "Burger40", - "avatar_link": "https://avatars.steamstatic.com/00db94cf7b185c69936738b5a827c63d033c6479_full.jpg", - "steam_id": "76561198083196477", - "sp_score": 98, - "mp_score": 66, - "overall_score": 164, - "sp_rank": 22, - "mp_rank": 25, - "overall_rank": 25 - }, - { - "user_name": "Extension", - "avatar_link": "https://avatars.steamstatic.com/dbaf3958fffebf266ce5c04316da744987e9b1fb_full.jpg", - "steam_id": "76561199221334063", - "sp_score": 99, - "mp_score": 61, - "overall_score": 160, - "sp_rank": 23, - "mp_rank": 20, - "overall_rank": 23 - }, - { - "user_name": "nnsega", - "avatar_link": "https://avatars.steamstatic.com/3443fd796fa8fd5169990b919238c663662e9fa8_full.jpg", - "steam_id": "76561198979969586", - "sp_score": 99, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 23, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Pizza2002com", - "avatar_link": "https://avatars.steamstatic.com/ed56a1d461c7a9e9ad5343c352020bc420bcc412_full.jpg", - "steam_id": "76561198198438581", - "sp_score": 100, - "mp_score": 9, - "overall_score": 0, - "sp_rank": 24, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Imagine a cool name", - "avatar_link": "https://avatars.steamstatic.com/ed6186b9c575f4df60c138785c9c004ad9bd4fae_full.jpg", - "steam_id": "76561198869299905", - "sp_score": 101, - "mp_score": 71, - "overall_score": 172, - "sp_rank": 25, - "mp_rank": 30, - "overall_rank": 30 - }, - { - "user_name": "BLAZEICN", - "avatar_link": "https://avatars.steamstatic.com/fc6db63846adac48e89c2a22148d8eb8cf3fdc50_full.jpg", - "steam_id": "76561198410217177", - "sp_score": 102, - "mp_score": 59, - "overall_score": 0, - "sp_rank": 26, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Toast", - "avatar_link": "https://avatars.steamstatic.com/c66f54f744f4a0dd0b09fbf8a587959a99025d7e_full.jpg", - "steam_id": "76561198064751325", - "sp_score": 104, - "mp_score": 71, - "overall_score": 0, - "sp_rank": 27, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Smily Dog", - "avatar_link": "https://avatars.steamstatic.com/721fc92c86478824e0f9768320ce65324d44bd64_full.jpg", - "steam_id": "76561199069689933", - "sp_score": 105, - "mp_score": 196, - "overall_score": 0, - "sp_rank": 28, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Zypeh", - "avatar_link": "https://avatars.steamstatic.com/bfd2b759e7e6300fc709857b9e6db802084544d1_full.jpg", - "steam_id": "76561198039230536", - "sp_score": 106, - "mp_score": 55, - "overall_score": 161, - "sp_rank": 29, - "mp_rank": 14, - "overall_rank": 24 - }, - { - "user_name": "AngerySnek", - "avatar_link": "https://avatars.steamstatic.com/36f5af69d7f5763b4fbede1c3a067f97505e77ce_full.jpg", - "steam_id": "76561198149112443", - "sp_score": 106, - "mp_score": 107, - "overall_score": 0, - "sp_rank": 29, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Iniquitty", - "avatar_link": "https://avatars.steamstatic.com/5c6c4e6b58ebd8a57db8305465398d33f017d125_full.jpg", - "steam_id": "76561198048252922", - "sp_score": 106, - "mp_score": 181, - "overall_score": 0, - "sp_rank": 29, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "NeKz", - "avatar_link": "https://avatars.steamstatic.com/9a86e6554aee395b3ac37d96a808335363eb79ff_full.jpg", - "steam_id": "76561198049848090", - "sp_score": 107, - "mp_score": 57, - "overall_score": 164, - "sp_rank": 30, - "mp_rank": 16, - "overall_rank": 25 - }, - { - "user_name": "Jarool", - "avatar_link": "https://avatars.steamstatic.com/61bb4ee9a8dd6cef5427f2170bb75d3162f3c8e8_full.jpg", - "steam_id": "76561198021055079", - "sp_score": 107, - "mp_score": 59, - "overall_score": 166, - "sp_rank": 30, - "mp_rank": 18, - "overall_rank": 26 - }, - { - "user_name": "bob26798", - "avatar_link": "https://avatars.steamstatic.com/cb940cd751f980d8d1374a66118a43f19985a1fa_full.jpg", - "steam_id": "76561198278905764", - "sp_score": 107, - "mp_score": 51, - "overall_score": 158, - "sp_rank": 30, - "mp_rank": 10, - "overall_rank": 21 - }, - { - "user_name": "Extension", - "avatar_link": "https://avatars.steamstatic.com/a647685b273a238928180573feb8135944d2795c_full.jpg", - "steam_id": "76561198174735211", - "sp_score": 108, - "mp_score": 51, - "overall_score": 159, - "sp_rank": 31, - "mp_rank": 10, - "overall_rank": 22 - }, - { - "user_name": "felkelorebel", - "avatar_link": "https://avatars.steamstatic.com/b3745dd64d516fb7ce7072aaad09c93fd99c48f5_full.jpg", - "steam_id": "76561198015394804", - "sp_score": 108, - "mp_score": 43, - "overall_score": 151, - "sp_rank": 31, - "mp_rank": 2, - "overall_rank": 18 - }, - { - "user_name": "fullheart2", - "avatar_link": "https://avatars.steamstatic.com/1daea993c3be4435d49bc50f7b011d639a08f3c9_full.jpg", - "steam_id": "76561197997838862", - "sp_score": 108, - "mp_score": 53, - "overall_score": 161, - "sp_rank": 31, - "mp_rank": 12, - "overall_rank": 24 - }, - { - "user_name": "Daddy Sparky420", - "avatar_link": "https://avatars.steamstatic.com/14bd5c9bee517058bed74638465e5f68f8ce1d68_full.jpg", - "steam_id": "76561198044110926", - "sp_score": 108, - "mp_score": 52, - "overall_score": 160, - "sp_rank": 31, - "mp_rank": 11, - "overall_rank": 23 - }, - { - "user_name": "HighOfSolipsism", - "avatar_link": "https://avatars.steamstatic.com/fb4b381574521f30828684ba8fbf328d5d179909_full.jpg", - "steam_id": "76561198968889092", - "sp_score": 109, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 32, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Lowengeist", - "avatar_link": "https://avatars.steamstatic.com/4f9a9168c48434a27dfe32d5831ce9fdcfb3ed96_full.jpg", - "steam_id": "76561198122276362", - "sp_score": 110, - "mp_score": 51, - "overall_score": 161, - "sp_rank": 33, - "mp_rank": 10, - "overall_rank": 24 - }, - { - "user_name": "Leve", - "avatar_link": "https://avatars.steamstatic.com/7a56621890546d1a54d4b583198b4d30411950b2_full.jpg", - "steam_id": "76561198902321340", - "sp_score": 111, - "mp_score": 60, - "overall_score": 171, - "sp_rank": 34, - "mp_rank": 19, - "overall_rank": 29 - }, - { - "user_name": "Jess3n", - "avatar_link": "https://avatars.steamstatic.com/1ee47a4ad1a50a4307cde6a9c543b3207942596c_full.jpg", - "steam_id": "76561198870020820", - "sp_score": 112, - "mp_score": 58, - "overall_score": 170, - "sp_rank": 35, - "mp_rank": 17, - "overall_rank": 28 - }, - { - "user_name": "UrMomPlebLol", - "avatar_link": "https://avatars.steamstatic.com/5b5b9357badc3d9e9ba53d52cf851a85df4a910c_full.jpg", - "steam_id": "76561198371482646", - "sp_score": 112, - "mp_score": 73, - "overall_score": 185, - "sp_rank": 35, - "mp_rank": 32, - "overall_rank": 38 - }, - { - "user_name": "stip", - "avatar_link": "https://avatars.steamstatic.com/19be8fd7d791a14920566ce35cc2798ecda8a9e4_full.jpg", - "steam_id": "76561198238515424", - "sp_score": 113, - "mp_score": 63, - "overall_score": 176, - "sp_rank": 36, - "mp_rank": 22, - "overall_rank": 32 - }, - { - "user_name": "False", - "avatar_link": "https://avatars.steamstatic.com/37269283113d026dc07f892792d5d2e413632047_full.jpg", - "steam_id": "76561198880435416", - "sp_score": 114, - "mp_score": 104, - "overall_score": 0, - "sp_rank": 37, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Fridge", - "avatar_link": "https://avatars.steamstatic.com/ba9584900b25936d72bd8b7fb028eea0b0d0fa56_full.jpg", - "steam_id": "76561198367132611", - "sp_score": 115, - "mp_score": 51, - "overall_score": 166, - "sp_rank": 38, - "mp_rank": 10, - "overall_rank": 26 - }, - { - "user_name": "Throw", - "avatar_link": "https://avatars.steamstatic.com/2c01a87d1b0789f7bdd1f3e693ef9987e49abe01_full.jpg", - "steam_id": "76561198952505877", - "sp_score": 115, - "mp_score": 78, - "overall_score": 193, - "sp_rank": 38, - "mp_rank": 36, - "overall_rank": 42 - }, - { - "user_name": "MarvelousBilly", - "avatar_link": "https://avatars.steamstatic.com/199a06d3111cec6ae8fa5fa118b4569ea4ed35d0_full.jpg", - "steam_id": "76561198207042355", - "sp_score": 115, - "mp_score": 64, - "overall_score": 0, - "sp_rank": 38, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "timurkazz", - "avatar_link": "https://avatars.steamstatic.com/13f6adfa0189055299b1ed69418eec8dd3b5d9eb_full.jpg", - "steam_id": "76561199106449775", - "sp_score": 115, - "mp_score": 53, - "overall_score": 168, - "sp_rank": 38, - "mp_rank": 12, - "overall_rank": 27 - }, - { - "user_name": "Morality", - "avatar_link": "https://avatars.steamstatic.com/2ea3e5885aa789acfc3640788905a414c408edc9_full.jpg", - "steam_id": "76561198799058701", - "sp_score": 115, - "mp_score": 53, - "overall_score": 168, - "sp_rank": 38, - "mp_rank": 12, - "overall_rank": 27 - }, - { - "user_name": "Yugge", - "avatar_link": "https://avatars.steamstatic.com/dc7c081330432a22b2d44cca2c02285c3ad04813_full.jpg", - "steam_id": "76561198405615224", - "sp_score": 117, - "mp_score": 63, - "overall_score": 180, - "sp_rank": 39, - "mp_rank": 22, - "overall_rank": 36 - }, - { - "user_name": "LsDK_", - "avatar_link": "https://avatars.steamstatic.com/4bf97c27bd5824296c0dedd11f5da1b2f0cdb7a5_full.jpg", - "steam_id": "76561198103821970", - "sp_score": 117, - "mp_score": 47, - "overall_score": 164, - "sp_rank": 39, - "mp_rank": 6, - "overall_rank": 25 - }, - { - "user_name": "j_p_smith", - "avatar_link": "https://avatars.steamstatic.com/1522b5cd27f52fde1326a5dc68980ae8a7a68f77_full.jpg", - "steam_id": "76561198845788732", - "sp_score": 117, - "mp_score": 9, - "overall_score": 0, - "sp_rank": 39, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "ThatGoatWhoIsEpic", - "avatar_link": "https://avatars.steamstatic.com/5049e37e3b511134a4a1b8359a8103348c09ff17_full.jpg", - "steam_id": "76561198074525881", - "sp_score": 117, - "mp_score": 72, - "overall_score": 189, - "sp_rank": 39, - "mp_rank": 31, - "overall_rank": 40 - }, - { - "user_name": "nintendude", - "avatar_link": "https://avatars.steamstatic.com/79d3fe5839617eb83a9661071ed021dd56ac8a5b_full.jpg", - "steam_id": "76561198307085542", - "sp_score": 118, - "mp_score": 54, - "overall_score": 172, - "sp_rank": 40, - "mp_rank": 13, - "overall_rank": 30 - }, - { - "user_name": "bubblebuddy", - "avatar_link": "https://avatars.steamstatic.com/087e1fd15b96879183296125bdd3976ac715c746_full.jpg", - "steam_id": "76561198076502234", - "sp_score": 118, - "mp_score": 91, - "overall_score": 0, - "sp_rank": 40, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Shiro", - "avatar_link": "https://avatars.steamstatic.com/7160e03d7c638627813e5fb993bf921c828b02c2_full.jpg", - "steam_id": "76561198118924124", - "sp_score": 119, - "mp_score": 55, - "overall_score": 174, - "sp_rank": 41, - "mp_rank": 14, - "overall_rank": 31 - }, - { - "user_name": "ุ", - "avatar_link": "https://avatars.steamstatic.com/b698f81978cd408b5e210f5b5c09d308ae75165b_full.jpg", - "steam_id": "76561198200883819", - "sp_score": 121, - "mp_score": 64, - "overall_score": 185, - "sp_rank": 42, - "mp_rank": 23, - "overall_rank": 38 - }, - { - "user_name": "Chevalix", - "avatar_link": "https://avatars.steamstatic.com/db8a0073f499823d0fb4ba89ee8716971a321a4e_full.jpg", - "steam_id": "76561198302681368", - "sp_score": 121, - "mp_score": 58, - "overall_score": 179, - "sp_rank": 42, - "mp_rank": 17, - "overall_rank": 35 - }, - { - "user_name": "Snow", - "avatar_link": "https://avatars.steamstatic.com/64b513f2c1f8a490670aa3d004d71b95207035b8_full.jpg", - "steam_id": "76561198842803939", - "sp_score": 121, - "mp_score": 56, - "overall_score": 177, - "sp_rank": 42, - "mp_rank": 15, - "overall_rank": 33 - }, - { - "user_name": "AMJ", - "avatar_link": "https://avatars.steamstatic.com/43480cfa66f1b35c2098016221a4dc19ed4fab55_full.jpg", - "steam_id": "76561198067936604", - "sp_score": 121, - "mp_score": 57, - "overall_score": 178, - "sp_rank": 42, - "mp_rank": 16, - "overall_rank": 34 - }, - { - "user_name": "turkey", - "avatar_link": "https://avatars.steamstatic.com/82d4da8f4ebd2022d32520c48554f05847e278d2_full.jpg", - "steam_id": "76561199175950732", - "sp_score": 123, - "mp_score": 112, - "overall_score": 0, - "sp_rank": 43, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "100kitaizzev", - "avatar_link": "https://avatars.steamstatic.com/93c7cb31e2b51e636e308788c7264b70e9756c9d_full.jpg", - "steam_id": "76561198006939388", - "sp_score": 123, - "mp_score": 65, - "overall_score": 188, - "sp_rank": 43, - "mp_rank": 24, - "overall_rank": 39 - }, - { - "user_name": "h@iku", - "avatar_link": "https://avatars.steamstatic.com/bfb0f0be647a28135ba306cd2e40c6ece3ca11b2_full.jpg", - "steam_id": "76561198343098423", - "sp_score": 123, - "mp_score": 55, - "overall_score": 178, - "sp_rank": 43, - "mp_rank": 14, - "overall_rank": 34 - }, - { - "user_name": "SPLOTH", - "avatar_link": "https://avatars.steamstatic.com/186537343f416a3562aefc53ec6a31e064da5f3b_full.jpg", - "steam_id": "76561199551856036", - "sp_score": 124, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 44, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Flaming Bag of Shit", - "avatar_link": "https://avatars.steamstatic.com/1aa57ae65716c4e6110f625d070a7d8e9d96953f_full.jpg", - "steam_id": "76561198118049581", - "sp_score": 124, - "mp_score": 58, - "overall_score": 0, - "sp_rank": 44, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Jerms", - "avatar_link": "https://avatars.steamstatic.com/6c6f26b05c96e83ee326033e5a60837c38230c82_full.jpg", - "steam_id": "76561198185044258", - "sp_score": 125, - "mp_score": 127, - "overall_score": 0, - "sp_rank": 45, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Moon", - "avatar_link": "https://avatars.steamstatic.com/8dfe278c7493b6984540e57ecd57b791df13841e_full.jpg", - "steam_id": "76561198202772881", - "sp_score": 126, - "mp_score": 91, - "overall_score": 0, - "sp_rank": 46, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "JonVis", - "avatar_link": "https://avatars.steamstatic.com/67cda3d7d1764089ddf51dc3413846b0042cc04f_full.jpg", - "steam_id": "76561198331042729", - "sp_score": 127, - "mp_score": 219, - "overall_score": 0, - "sp_rank": 47, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "matchafluff", - "avatar_link": "https://avatars.steamstatic.com/ccef93cdccb9555781530303010a1bba551066a5_full.jpg", - "steam_id": "76561198274451918", - "sp_score": 128, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 48, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Waygric", - "avatar_link": "https://avatars.steamstatic.com/99a1312a700f85059c38d40235c98498accd7e12_full.jpg", - "steam_id": "76561198295161335", - "sp_score": 129, - "mp_score": 152, - "overall_score": 0, - "sp_rank": 49, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "edcr", - "avatar_link": "https://avatars.steamstatic.com/f77b7721e8bab560dfc04164001771654265d48f_full.jpg", - "steam_id": "76561198254824137", - "sp_score": 130, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 50, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "lampishboi", - "avatar_link": "https://avatars.steamstatic.com/22bc948278437707cf69cc70a153f8363c95bccf_full.jpg", - "steam_id": "76561198994808916", - "sp_score": 131, - "mp_score": 199, - "overall_score": 330, - "sp_rank": 51, - "mp_rank": 81, - "overall_rank": 61 - }, - { - "user_name": "jarmge", - "avatar_link": "https://avatars.steamstatic.com/600e01f106f252ed8ca1dabfcab6fbb1b036bfc6_full.jpg", - "steam_id": "76561198169932919", - "sp_score": 132, - "mp_score": 64, - "overall_score": 0, - "sp_rank": 52, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Spyrunite", - "avatar_link": "https://avatars.steamstatic.com/184e99f06e36b81346214c37f6b448f4d71fcb8b_full.jpg", - "steam_id": "76561198026851335", - "sp_score": 132, - "mp_score": 98, - "overall_score": 230, - "sp_rank": 52, - "mp_rank": 50, - "overall_rank": 52 - }, - { - "user_name": "danybanana", - "avatar_link": "https://avatars.steamstatic.com/0c2c9ee032d40f217feba46a7d592dd6e69a1cc1_full.jpg", - "steam_id": "76561198111286521", - "sp_score": 133, - "mp_score": 233, - "overall_score": 0, - "sp_rank": 53, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Rubiks37", - "avatar_link": "https://avatars.steamstatic.com/fc56ec380897e968373ada65084d8c1527b9d408_full.jpg", - "steam_id": "76561198246124618", - "sp_score": 133, - "mp_score": 98, - "overall_score": 0, - "sp_rank": 53, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Palmer", - "avatar_link": "https://avatars.steamstatic.com/cb2cb750f2601cd3d44941babe87638e49d5f0f5_full.jpg", - "steam_id": "76561198047887079", - "sp_score": 133, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 53, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "XTLmaker", - "avatar_link": "https://avatars.steamstatic.com/b3c041f3eb316e0edf16e6ba36f426b433e16cee_full.jpg", - "steam_id": "76561199032030834", - "sp_score": 134, - "mp_score": 97, - "overall_score": 231, - "sp_rank": 54, - "mp_rank": 49, - "overall_rank": 53 - }, - { - "user_name": "real", - "avatar_link": "https://avatars.steamstatic.com/be7eec8a60d692720284391b078383d970e3e4c1_full.jpg", - "steam_id": "76561198810570115", - "sp_score": 135, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 55, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "FifthWit", - "avatar_link": "https://avatars.steamstatic.com/e5e291a0cd9af9e3dd86b1a1610cca9381714f6b_full.jpg", - "steam_id": "76561197992325624", - "sp_score": 135, - "mp_score": 218, - "overall_score": 0, - "sp_rank": 55, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Paurel009", - "avatar_link": "https://avatars.steamstatic.com/332bc892f89dd38c8a4821057ef6c79d9217a00f_full.jpg", - "steam_id": "76561198879028282", - "sp_score": 135, - "mp_score": 56, - "overall_score": 0, - "sp_rank": 55, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "badger", - "avatar_link": "https://avatars.steamstatic.com/cbea4cfe87dab41ed9d2b53be876110b98e4111a_full.jpg", - "steam_id": "76561198861024091", - "sp_score": 135, - "mp_score": 89, - "overall_score": 224, - "sp_rank": 55, - "mp_rank": 43, - "overall_rank": 50 - }, - { - "user_name": "Soulfur", - "avatar_link": "https://avatars.steamstatic.com/af59571446fe62756d619b9e42a82c432390ccf0_full.jpg", - "steam_id": "76561198181126266", - "sp_score": 135, - "mp_score": 56, - "overall_score": 191, - "sp_rank": 55, - "mp_rank": 15, - "overall_rank": 41 - }, - { - "user_name": "Kitsune", - "avatar_link": "https://avatars.steamstatic.com/20bd0d2ff33f74c95500c5d11d4b550aa04fe505_full.jpg", - "steam_id": "76561198136477838", - "sp_score": 136, - "mp_score": 48, - "overall_score": 184, - "sp_rank": 56, - "mp_rank": 7, - "overall_rank": 37 - }, - { - "user_name": "SmileyCraft", - "avatar_link": "https://avatars.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg", - "steam_id": "76561198040989295", - "sp_score": 136, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 56, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "1 Portal SWAG", - "avatar_link": "https://avatars.steamstatic.com/8766c163ce9fd7a584c5347dab0a6a49766102e8_full.jpg", - "steam_id": "76561198253811824", - "sp_score": 137, - "mp_score": 82, - "overall_score": 219, - "sp_rank": 57, - "mp_rank": 39, - "overall_rank": 49 - }, - { - "user_name": "William", - "avatar_link": "https://avatars.steamstatic.com/72789abfbdf55ae8e229c9782c871d8a90bb783b_full.jpg", - "steam_id": "76561198255055970", - "sp_score": 137, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 57, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "MegaWaTT", - "avatar_link": "https://avatars.steamstatic.com/ed56d8fc9c49a77d3f8c8bd6cc3efa72e714b54d_full.jpg", - "steam_id": "76561198363863187", - "sp_score": 137, - "mp_score": 92, - "overall_score": 229, - "sp_rank": 57, - "mp_rank": 45, - "overall_rank": 51 - }, - { - "user_name": "LinuxCat", - "avatar_link": "https://avatars.steamstatic.com/8232b8f0813332e141ebd63cadc5223f3f4571e8_full.jpg", - "steam_id": "76561198430886429", - "sp_score": 138, - "mp_score": 166, - "overall_score": 0, - "sp_rank": 58, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Domitar1", - "avatar_link": "https://avatars.steamstatic.com/24566e2b3ee69e45d4fa23e783d7b655893ee36e_full.jpg", - "steam_id": "76561198036153876", - "sp_score": 139, - "mp_score": 67, - "overall_score": 0, - "sp_rank": 59, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Scanner Man", - "avatar_link": "https://avatars.steamstatic.com/17a6dfe85895df9afaf653b937bc7594e43c310a_full.jpg", - "steam_id": "76561198453234651", - "sp_score": 139, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 59, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "austamate17", - "avatar_link": "https://avatars.steamstatic.com/545cb42d2650240f0c4dec95a4132cb7cc1593f9_full.jpg", - "steam_id": "76561199134645248", - "sp_score": 139, - "mp_score": 174, - "overall_score": 0, - "sp_rank": 59, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "indexsensei", - "avatar_link": "https://avatars.steamstatic.com/d27a4396b3b9c98a1a349d9e9fc3b08a1c70e0ab_full.jpg", - "steam_id": "76561199505740367", - "sp_score": 140, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 60, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "KranK", - "avatar_link": "https://avatars.steamstatic.com/4adacf733ceac099fd425172813d7162723746aa_full.jpg", - "steam_id": "76561198044394357", - "sp_score": 140, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 60, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Mayor of Kenja", - "avatar_link": "https://avatars.steamstatic.com/e15d3d3912851067482704cf50d3e692b21fe252_full.jpg", - "steam_id": "76561198041107150", - "sp_score": 141, - "mp_score": 101, - "overall_score": 0, - "sp_rank": 61, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Myhr", - "avatar_link": "https://avatars.steamstatic.com/deec440da6c13c8fa72f003d8396c15d6238c89e_full.jpg", - "steam_id": "76561198054566481", - "sp_score": 141, - "mp_score": 52, - "overall_score": 193, - "sp_rank": 61, - "mp_rank": 11, - "overall_rank": 42 - }, - { - "user_name": "Fyrestorm", - "avatar_link": "https://avatars.steamstatic.com/c0c82fa70c986348caaaea71f3ccac1b13c0c4eb_full.jpg", - "steam_id": "76561198035761863", - "sp_score": 142, - "mp_score": 55, - "overall_score": 197, - "sp_rank": 62, - "mp_rank": 14, - "overall_rank": 43 - }, - { - "user_name": "Turmoil", - "avatar_link": "https://avatars.steamstatic.com/ceeb79bfd441b1928af34195dfde660b44f002dd_full.jpg", - "steam_id": "76561197997770103", - "sp_score": 142, - "mp_score": 57, - "overall_score": 199, - "sp_rank": 62, - "mp_rank": 16, - "overall_rank": 44 - }, - { - "user_name": "SilentiumGradas", - "avatar_link": "https://avatars.steamstatic.com/b26b46bc2dd6efece8b6cbcff8ba263801b5b6dc_full.jpg", - "steam_id": "76561199006050430", - "sp_score": 142, - "mp_score": 101, - "overall_score": 243, - "sp_rank": 62, - "mp_rank": 51, - "overall_rank": 55 - }, - { - "user_name": "elvirus21", - "avatar_link": "https://avatars.steamstatic.com/f91787b7fb6d4a2cb8dee079ab457839b33a8845_full.jpg", - "steam_id": "76561198073106572", - "sp_score": 142, - "mp_score": 7, - "overall_score": 0, - "sp_rank": 62, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Piguy922", - "avatar_link": "https://avatars.steamstatic.com/d4fbe6b8c96fd091c5ffb154486e68517bdfa0a9_full.jpg", - "steam_id": "76561198286556924", - "sp_score": 142, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 62, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Rubix", - "avatar_link": "https://avatars.steamstatic.com/968068f38b0b1cbfa81003eb0b30616ccaf22074_full.jpg", - "steam_id": "76561199038050237", - "sp_score": 143, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 63, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Stitch", - "avatar_link": "https://avatars.steamstatic.com/1db7a665ec08caf5924fa3f85a94f563308186ba_full.jpg", - "steam_id": "76561198210115312", - "sp_score": 144, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 64, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Blenderiste09", - "avatar_link": "https://avatars.steamstatic.com/79d3fe5839617eb83a9661071ed021dd56ac8a5b_full.jpg", - "steam_id": "76561198251755710", - "sp_score": 145, - "mp_score": 56, - "overall_score": 201, - "sp_rank": 65, - "mp_rank": 15, - "overall_rank": 45 - }, - { - "user_name": "Schwi", - "avatar_link": "https://avatars.steamstatic.com/a5ab762db09205fc49a6fa8fd1d09daafc3ac6e4_full.jpg", - "steam_id": "76561198384377251", - "sp_score": 147, - "mp_score": 69, - "overall_score": 216, - "sp_rank": 66, - "mp_rank": 28, - "overall_rank": 48 - }, - { - "user_name": "Simmo", - "avatar_link": "https://avatars.steamstatic.com/e12f942704510e129880a683efe61a38f771d5b3_full.jpg", - "steam_id": "76561198018586508", - "sp_score": 147, - "mp_score": 198, - "overall_score": 0, - "sp_rank": 66, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "laredeshot", - "avatar_link": "https://avatars.steamstatic.com/8ffb58e0cddad5293c48250deb458f428b9f6736_full.jpg", - "steam_id": "76561198261656551", - "sp_score": 149, - "mp_score": 56, - "overall_score": 205, - "sp_rank": 67, - "mp_rank": 15, - "overall_rank": 46 - }, - { - "user_name": "Jenga World Champion", - "avatar_link": "https://avatars.steamstatic.com/fcf3c636e29e074a5d58ceb1929f12e8f35f7b20_full.jpg", - "steam_id": "76561197995200743", - "sp_score": 151, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 68, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Tenacite the MAD Milshake", - "avatar_link": "https://avatars.steamstatic.com/dc22cc282f8bd43f3efde936b7263130f09358b8_full.jpg", - "steam_id": "76561198389681125", - "sp_score": 152, - "mp_score": 49, - "overall_score": 201, - "sp_rank": 69, - "mp_rank": 8, - "overall_rank": 45 - }, - { - "user_name": "Betsruner", - "avatar_link": "https://avatars.steamstatic.com/6e5b5f43361149652d556073c34a4c3bd5c56df2_full.jpg", - "steam_id": "76561198048179892", - "sp_score": 153, - "mp_score": 113, - "overall_score": 266, - "sp_rank": 70, - "mp_rank": 57, - "overall_rank": 58 - }, - { - "user_name": "Vyolet", - "avatar_link": "https://avatars.steamstatic.com/c70dfe3d294d9967f0fe623495939fda03afecd1_full.jpg", - "steam_id": "76561198865544248", - "sp_score": 154, - "mp_score": 257, - "overall_score": 0, - "sp_rank": 71, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "fatman", - "avatar_link": "https://avatars.steamstatic.com/eb327dec91a694f5fc4f789857bc92ac2e881867_full.jpg", - "steam_id": "76561198148419890", - "sp_score": 155, - "mp_score": 162, - "overall_score": 0, - "sp_rank": 72, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Saxton Hale", - "avatar_link": "https://avatars.steamstatic.com/2f335962fbb8431ea3f5606fe3e1881dce47e63a_full.jpg", - "steam_id": "76561197998253566", - "sp_score": 155, - "mp_score": 75, - "overall_score": 230, - "sp_rank": 72, - "mp_rank": 34, - "overall_rank": 52 - }, - { - "user_name": "Orange", - "avatar_link": "https://avatars.steamstatic.com/af229251379e11527a25aed1a896c83730c7c216_full.jpg", - "steam_id": "76561198240558232", - "sp_score": 156, - "mp_score": 107, - "overall_score": 0, - "sp_rank": 73, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "savvydruid", - "avatar_link": "https://avatars.steamstatic.com/687d290c9238b42a790216892cc21f718741bd83_full.jpg", - "steam_id": "76561199013726692", - "sp_score": 157, - "mp_score": 53, - "overall_score": 210, - "sp_rank": 74, - "mp_rank": 12, - "overall_rank": 47 - }, - { - "user_name": "『 Jonese1234 』", - "avatar_link": "https://avatars.steamstatic.com/9f6de098624a8f81ba6d2318e1923bdda1c710d6_full.jpg", - "steam_id": "76561198045074889", - "sp_score": 157, - "mp_score": 206, - "overall_score": 363, - "sp_rank": 74, - "mp_rank": 85, - "overall_rank": 62 - }, - { - "user_name": "ki4rakaM [RUS]", - "avatar_link": "https://avatars.steamstatic.com/cae7d5a1e4b04f70dc0c1599d932edb423e65870_full.jpg", - "steam_id": "76561198227911092", - "sp_score": 157, - "mp_score": 89, - "overall_score": 246, - "sp_rank": 74, - "mp_rank": 43, - "overall_rank": 56 - }, - { - "user_name": "Jythonscript", - "avatar_link": "https://avatars.steamstatic.com/a158a5eeb8fbb49c8ba626fb99dc2bdf44052dc0_full.jpg", - "steam_id": "76561198165015808", - "sp_score": 159, - "mp_score": 16, - "overall_score": 0, - "sp_rank": 75, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "meatslab", - "avatar_link": "https://avatars.steamstatic.com/c3b05a2f6c9e7c51c2314d984bf03ac5ddec8c96_full.jpg", - "steam_id": "76561197993087239", - "sp_score": 159, - "mp_score": 201, - "overall_score": 0, - "sp_rank": 75, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "berlinkijalapinio", - "avatar_link": "https://avatars.steamstatic.com/31bca616d9bad59e446995159f3198bc131be2af_full.jpg", - "steam_id": "76561199026933461", - "sp_score": 159, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 75, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Wrath", - "avatar_link": "https://avatars.steamstatic.com/da6a4f2a804e8fd4bce38efc5b7f256f964a3fb7_full.jpg", - "steam_id": "76561197983206857", - "sp_score": 161, - "mp_score": 47, - "overall_score": 0, - "sp_rank": 76, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Schlepian", - "avatar_link": "https://avatars.steamstatic.com/f7be9949784d7864c619a72e0bec1138a14933ff_full.jpg", - "steam_id": "76561198021734854", - "sp_score": 161, - "mp_score": 105, - "overall_score": 266, - "sp_rank": 76, - "mp_rank": 52, - "overall_rank": 58 - }, - { - "user_name": "Pongu", - "avatar_link": "https://avatars.steamstatic.com/c65e60109bc9e6fc7143de48fddb7aac812f4b54_full.jpg", - "steam_id": "76561199092053226", - "sp_score": 163, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 77, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "gate", - "avatar_link": "https://avatars.steamstatic.com/26458ac0a9e4a290b2edc09801b09e92ab74a747_full.jpg", - "steam_id": "76561199070019903", - "sp_score": 164, - "mp_score": 156, - "overall_score": 0, - "sp_rank": 78, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Lathil", - "avatar_link": "https://avatars.steamstatic.com/6636331f0f7d69a2ef6557a124ae4a3389466047_full.jpg", - "steam_id": "76561198404861950", - "sp_score": 165, - "mp_score": 59, - "overall_score": 224, - "sp_rank": 79, - "mp_rank": 18, - "overall_rank": 50 - }, - { - "user_name": "ZeroKage69", - "avatar_link": "https://avatars.steamstatic.com/46d3dc44a52ce13feeb11f9174a3df192e281d79_full.jpg", - "steam_id": "76561198000282331", - "sp_score": 168, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 80, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "TacoCat1717", - "avatar_link": "https://avatars.steamstatic.com/3a80d39cbb425d5a1847578f2cfef504e51df744_full.jpg", - "steam_id": "76561198353761498", - "sp_score": 169, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 81, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Imanex", - "avatar_link": "https://avatars.steamstatic.com/82d1ac52aeddb7f08eb0f85d4f7d96160af30bb9_full.jpg", - "steam_id": "76561197974616889", - "sp_score": 169, - "mp_score": 82, - "overall_score": 251, - "sp_rank": 81, - "mp_rank": 39, - "overall_rank": 57 - }, - { - "user_name": "Schlay", - "avatar_link": "https://avatars.steamstatic.com/1c81f34080417cab9a836c003e5c319229e528f9_full.jpg", - "steam_id": "76561198042995537", - "sp_score": 170, - "mp_score": 108, - "overall_score": 278, - "sp_rank": 82, - "mp_rank": 53, - "overall_rank": 59 - }, - { - "user_name": "¯\\_(ツ)_/¯", - "avatar_link": "https://avatars.steamstatic.com/fb9c36c36e54b8ca5f2e1cbd89c06574d1348af0_full.jpg", - "steam_id": "76561198001523094", - "sp_score": 175, - "mp_score": 127, - "overall_score": 302, - "sp_rank": 83, - "mp_rank": 64, - "overall_rank": 60 - }, - { - "user_name": "wol", - "avatar_link": "https://avatars.steamstatic.com/689a4b1be66db3f28a1567c7b1bb7e8e2d1e1d90_full.jpg", - "steam_id": "76561199007976762", - "sp_score": 177, - "mp_score": 57, - "overall_score": 234, - "sp_rank": 84, - "mp_rank": 16, - "overall_rank": 54 - }, - { - "user_name": "omni-", - "avatar_link": "https://avatars.steamstatic.com/080a99bb24dd24c3e0d898e844e5579ac3d11467_full.jpg", - "steam_id": "76561198188030349", - "sp_score": 181, - "mp_score": 52, - "overall_score": 0, - "sp_rank": 85, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Ragnar", - "avatar_link": "https://avatars.steamstatic.com/cb0b6e7874c36bd65143bfce9c1f77723d0128bb_full.jpg", - "steam_id": "76561198018384094", - "sp_score": 184, - "mp_score": 92, - "overall_score": 0, - "sp_rank": 86, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Iijil", - "avatar_link": "https://avatars.steamstatic.com/2bdb2025ffcf3f0a12a716260c7308a9f7a15c3c_full.jpg", - "steam_id": "76561197970963482", - "sp_score": 194, - "mp_score": 0, - "overall_score": 0, - "sp_rank": 87, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "HuskyManiac", - "avatar_link": "https://avatars.steamstatic.com/d63d68bc5ae49161d044a3ea8f93d78d5a0be840_full.jpg", - "steam_id": "76561199137138817", - "sp_score": 203, - "mp_score": 162, - "overall_score": 0, - "sp_rank": 88, - "mp_rank": 0, - "overall_rank": 0 - }, - { - "user_name": "Potatoes", - "avatar_link": "https://avatars.steamstatic.com/94821c98d19e5eda6ec315289aa28b191084f301_full.jpg", - "steam_id": "76561197974561284", - "sp_score": 248, - "mp_score": 209, - "overall_score": 457, - "sp_rank": 89, - "mp_rank": 88, - "overall_rank": 63 - } - ], - "rankings_multiplayer": [ - { - "user_name": "Nidboj132", - "avatar_link": "https://avatars.steamstatic.com/07bc99e768c9f640979e2a393f28306a32fa796e_full.jpg", - "steam_id": "76561198337970645", - "sp_score": 76, - "mp_score": 41, - "overall_score": 117, - "sp_rank": 4, - "mp_rank": 1, - "overall_rank": 2 - }, - { - "user_name": "Black_Semka", - "avatar_link": "https://avatars.steamstatic.com/3a6acf4e40097d9db7af432684a08b6267d2af5c_full.jpg", - "steam_id": "76561198997027314", - "sp_score": 85, - "mp_score": 41, - "overall_score": 126, - "sp_rank": 10, - "mp_rank": 1, - "overall_rank": 4 - }, - { - "user_name": "Feirune~", - "avatar_link": "https://avatars.steamstatic.com/fece8c2b7c57f3eecf75897ad86609adefb7ec1a_full.jpg", - "steam_id": "76561198134041367", - "sp_score": 90, - "mp_score": 41, - "overall_score": 131, - "sp_rank": 15, - "mp_rank": 1, - "overall_rank": 7 - }, - { - "user_name": "felkelorebel", - "avatar_link": "https://avatars.steamstatic.com/b3745dd64d516fb7ce7072aaad09c93fd99c48f5_full.jpg", - "steam_id": "76561198015394804", - "sp_score": 108, - "mp_score": 43, - "overall_score": 151, - "sp_rank": 31, - "mp_rank": 2, - "overall_rank": 18 - }, - { - "user_name": "Zadadaz", - "avatar_link": "https://avatars.steamstatic.com/8c7bed09ce10417502477b6ca29f8257c840cab3_full.jpg", - "steam_id": "76561198451680661", - "sp_score": 92, - "mp_score": 43, - "overall_score": 135, - "sp_rank": 17, - "mp_rank": 2, - "overall_rank": 9 - }, - { - "user_name": "RealCreative", - "avatar_link": "https://avatars.steamstatic.com/ace8efdb0d060e2bbc8d9d210429fbfea6d247e5_full.jpg", - "steam_id": "76561198823602829", - "sp_score": 140, - "mp_score": 44, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 3, - "overall_rank": 0 - }, - { - "user_name": "xeonic", - "avatar_link": "https://avatars.steamstatic.com/7c3e67f433c90512fe6cac7278d6cb8b59d10c96_full.jpg", - "steam_id": "76561198973478625", - "sp_score": 82, - "mp_score": 45, - "overall_score": 127, - "sp_rank": 8, - "mp_rank": 4, - "overall_rank": 5 - }, - { - "user_name": "?", - "avatar_link": "https://avatars.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg", - "steam_id": "76561198838630481", - "sp_score": 80, - "mp_score": 46, - "overall_score": 126, - "sp_rank": 6, - "mp_rank": 5, - "overall_rank": 4 - }, - { - "user_name": "No Name", - "avatar_link": "https://avatars.steamstatic.com/2d070642c13b83f2218ada99aed9be26af3653e4_full.jpg", - "steam_id": "76561198278611000", - "sp_score": 1, - "mp_score": 46, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 5, - "overall_rank": 0 - }, - { - "user_name": "3e0r", - "avatar_link": "https://avatars.steamstatic.com/c8405cf90fdbfccf8f7b22f09cb0444737ddec5f_full.jpg", - "steam_id": "76561199067727348", - "sp_score": 109, - "mp_score": 47, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 6, - "overall_rank": 0 - }, - { - "user_name": "LsDK_", - "avatar_link": "https://avatars.steamstatic.com/4bf97c27bd5824296c0dedd11f5da1b2f0cdb7a5_full.jpg", - "steam_id": "76561198103821970", - "sp_score": 117, - "mp_score": 47, - "overall_score": 164, - "sp_rank": 39, - "mp_rank": 6, - "overall_rank": 25 - }, - { - "user_name": "slamix", - "avatar_link": "https://avatars.steamstatic.com/730aee7d3904a0f38506858ba83ebc014260ccc3_full.jpg", - "steam_id": "76561198403952785", - "sp_score": 81, - "mp_score": 47, - "overall_score": 128, - "sp_rank": 7, - "mp_rank": 6, - "overall_rank": 6 - }, - { - "user_name": "BiSaXa", - "avatar_link": "https://avatars.steamstatic.com/fa7f64c79b247c8a80cafbd6dd8033b98cc1153c_full.jpg", - "steam_id": "76561198131629989", - "sp_score": 87, - "mp_score": 47, - "overall_score": 134, - "sp_rank": 12, - "mp_rank": 6, - "overall_rank": 8 - }, - { - "user_name": "SuperAiderton", - "avatar_link": "https://avatars.steamstatic.com/a19aca196dbb75b51b83fe7d06b0b7fce0f894b2_full.jpg", - "steam_id": "76561199069631083", - "sp_score": 65, - "mp_score": 48, - "overall_score": 113, - "sp_rank": 1, - "mp_rank": 7, - "overall_rank": 1 - }, - { - "user_name": "Kitsune", - "avatar_link": "https://avatars.steamstatic.com/20bd0d2ff33f74c95500c5d11d4b550aa04fe505_full.jpg", - "steam_id": "76561198136477838", - "sp_score": 136, - "mp_score": 48, - "overall_score": 184, - "sp_rank": 56, - "mp_rank": 7, - "overall_rank": 37 - }, - { - "user_name": "TeePeeWee", - "avatar_link": "https://avatars.steamstatic.com/4392a52e384f22c9f77b539eb4b1aa2914880cdf_full.jpg", - "steam_id": "76561199239427541", - "sp_score": 90, - "mp_score": 48, - "overall_score": 138, - "sp_rank": 15, - "mp_rank": 7, - "overall_rank": 10 - }, - { - "user_name": "Tenacite the MAD Milshake", - "avatar_link": "https://avatars.steamstatic.com/dc22cc282f8bd43f3efde936b7263130f09358b8_full.jpg", - "steam_id": "76561198389681125", - "sp_score": 152, - "mp_score": 49, - "overall_score": 201, - "sp_rank": 69, - "mp_rank": 8, - "overall_rank": 45 - }, - { - "user_name": "DM_", - "avatar_link": "https://avatars.steamstatic.com/417410dd471a369af956619daa7579263045bbba_full.jpg", - "steam_id": "76561198003598363", - "sp_score": 57, - "mp_score": 49, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 8, - "overall_rank": 0 - }, - { - "user_name": "mOtYl", - "avatar_link": "https://avatars.steamstatic.com/8065f6018757dc0ee927d2279ccf7e8ab7827109_full.jpg", - "steam_id": "76561197994700458", - "sp_score": 74, - "mp_score": 49, - "overall_score": 123, - "sp_rank": 3, - "mp_rank": 8, - "overall_rank": 3 - }, - { - "user_name": "marKappa", - "avatar_link": "https://avatars.steamstatic.com/e558017b19d0bbed38beb40f96211dccbb18ef3d_full.jpg", - "steam_id": "76561198073902504", - "sp_score": 101, - "mp_score": 49, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 8, - "overall_rank": 0 - }, - { - "user_name": "Linus", - "avatar_link": "https://avatars.steamstatic.com/cfaf6917f47ca6122396f46e485a79a090f29fa0_full.jpg", - "steam_id": "76561198162078579", - "sp_score": 92, - "mp_score": 49, - "overall_score": 141, - "sp_rank": 17, - "mp_rank": 8, - "overall_rank": 12 - }, - { - "user_name": "Robotwars1", - "avatar_link": "https://avatars.steamstatic.com/ac4bc6cc73ef75f11690205b123685fd5e3a7823_full.jpg", - "steam_id": "76561198129010912", - "sp_score": 86, - "mp_score": 49, - "overall_score": 135, - "sp_rank": 11, - "mp_rank": 8, - "overall_rank": 9 - }, - { - "user_name": "(MGN)-ZGP-NIKITA", - "avatar_link": "https://avatars.steamstatic.com/8a72e1ed5a29e56c24926ccb33879a544bc67b36_full.jpg", - "steam_id": "76561198076017585", - "sp_score": 91, - "mp_score": 49, - "overall_score": 140, - "sp_rank": 16, - "mp_rank": 8, - "overall_rank": 11 - }, - { - "user_name": "LittleRoi", - "avatar_link": "https://avatars.steamstatic.com/c9180f93ac892fa7d078f5946239d049e987e3b6_full.jpg", - "steam_id": "76561198112477703", - "sp_score": 85, - "mp_score": 50, - "overall_score": 135, - "sp_rank": 10, - "mp_rank": 9, - "overall_rank": 9 - }, - { - "user_name": "skz", - "avatar_link": "https://avatars.steamstatic.com/7438cfa261a33ecdf2903e1a61b96173b6c5744a_full.jpg", - "steam_id": "76561198323090545", - "sp_score": 93, - "mp_score": 50, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 9, - "overall_rank": 0 - }, - { - "user_name": "KiloOnline", - "avatar_link": "https://avatars.steamstatic.com/4ff11c7fe266f71b02c078e8dcc1374c3413b6f4_full.jpg", - "steam_id": "76561198411125245", - "sp_score": 170, - "mp_score": 50, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 9, - "overall_rank": 0 - }, - { - "user_name": "PerOculos", - "avatar_link": "https://avatars.steamstatic.com/7b00906ac356806bc7bdb3815ea7c1c5b13b65a8_full.jpg", - "steam_id": "76561198003223063", - "sp_score": 84, - "mp_score": 50, - "overall_score": 134, - "sp_rank": 9, - "mp_rank": 9, - "overall_rank": 8 - }, - { - "user_name": "Suola", - "avatar_link": "https://avatars.steamstatic.com/f86dcc2d065a87a603427bb382d26e96c1d61060_full.jpg", - "steam_id": "76561198917972968", - "sp_score": 98, - "mp_score": 50, - "overall_score": 148, - "sp_rank": 22, - "mp_rank": 9, - "overall_rank": 16 - }, - { - "user_name": "bob26798", - "avatar_link": "https://avatars.steamstatic.com/cb940cd751f980d8d1374a66118a43f19985a1fa_full.jpg", - "steam_id": "76561198278905764", - "sp_score": 107, - "mp_score": 51, - "overall_score": 158, - "sp_rank": 30, - "mp_rank": 10, - "overall_rank": 21 - }, - { - "user_name": "Façade", - "avatar_link": "https://avatars.steamstatic.com/f22455f600a546fd6200325e64cae2673ea89087_full.jpg", - "steam_id": "76561198355852293", - "sp_score": 88, - "mp_score": 51, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 10, - "overall_rank": 0 - }, - { - "user_name": "Lowengeist", - "avatar_link": "https://avatars.steamstatic.com/4f9a9168c48434a27dfe32d5831ce9fdcfb3ed96_full.jpg", - "steam_id": "76561198122276362", - "sp_score": 110, - "mp_score": 51, - "overall_score": 161, - "sp_rank": 33, - "mp_rank": 10, - "overall_rank": 24 - }, - { - "user_name": "Evandar", - "avatar_link": "https://avatars.steamstatic.com/22cf9a2e336958503ef008e6e0e4fb4b30106e67_full.jpg", - "steam_id": "76561198204823324", - "sp_score": 31, - "mp_score": 51, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 10, - "overall_rank": 0 - }, - { - "user_name": "((♡Murka♡))", - "avatar_link": "https://avatars.steamstatic.com/8bb6a4d7223c09446bc0abb6570e5912d7f8b275_full.jpg", - "steam_id": "76561198289477061", - "sp_score": 71, - "mp_score": 51, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 10, - "overall_rank": 0 - }, - { - "user_name": "Fridge", - "avatar_link": "https://avatars.steamstatic.com/ba9584900b25936d72bd8b7fb028eea0b0d0fa56_full.jpg", - "steam_id": "76561198367132611", - "sp_score": 115, - "mp_score": 51, - "overall_score": 166, - "sp_rank": 38, - "mp_rank": 10, - "overall_rank": 26 - }, - { - "user_name": "Extension", - "avatar_link": "https://avatars.steamstatic.com/a647685b273a238928180573feb8135944d2795c_full.jpg", - "steam_id": "76561198174735211", - "sp_score": 108, - "mp_score": 51, - "overall_score": 159, - "sp_rank": 31, - "mp_rank": 10, - "overall_rank": 22 - }, - { - "user_name": "fin", - "avatar_link": "https://avatars.steamstatic.com/c2e1bc09d5ab84143baa3c42d7131406beecdeba_full.jpg", - "steam_id": "76561198150619409", - "sp_score": 135, - "mp_score": 51, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 10, - "overall_rank": 0 - }, - { - "user_name": "็", - "avatar_link": "https://avatars.steamstatic.com/66c216c1af7785f91dc1ac8b750a00295d7789aa_full.jpg", - "steam_id": "76561198077911518", - "sp_score": 13, - "mp_score": 51, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 10, - "overall_rank": 0 - }, - { - "user_name": "Confusion_18", - "avatar_link": "https://avatars.steamstatic.com/360236e555049f204b12d3a8685a3b9b9764ebfe_full.jpg", - "steam_id": "76561198386577258", - "sp_score": 91, - "mp_score": 51, - "overall_score": 142, - "sp_rank": 16, - "mp_rank": 10, - "overall_rank": 13 - }, - { - "user_name": "Anigol", - "avatar_link": "https://avatars.steamstatic.com/9ab1bec88da45ea89e5cd6a544e1d52bbbfcbd22_full.jpg", - "steam_id": "76561198032217509", - "sp_score": 57, - "mp_score": 52, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 11, - "overall_rank": 0 - }, - { - "user_name": "sear", - "avatar_link": "https://avatars.steamstatic.com/a2759af9b274633d86b28dfd1b9e70675f41d44e_full.jpg", - "steam_id": "76561198202719682", - "sp_score": 98, - "mp_score": 52, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 11, - "overall_rank": 0 - }, - { - "user_name": "Myhr", - "avatar_link": "https://avatars.steamstatic.com/deec440da6c13c8fa72f003d8396c15d6238c89e_full.jpg", - "steam_id": "76561198054566481", - "sp_score": 141, - "mp_score": 52, - "overall_score": 193, - "sp_rank": 61, - "mp_rank": 11, - "overall_rank": 42 - }, - { - "user_name": "Krzyhau", - "avatar_link": "https://avatars.steamstatic.com/f29de7f41db29526848b52c8942f727b7c70b0db_full.jpg", - "steam_id": "76561198096446735", - "sp_score": 89, - "mp_score": 52, - "overall_score": 141, - "sp_rank": 14, - "mp_rank": 11, - "overall_rank": 12 - }, - { - "user_name": "Daddy Sparky420", - "avatar_link": "https://avatars.steamstatic.com/14bd5c9bee517058bed74638465e5f68f8ce1d68_full.jpg", - "steam_id": "76561198044110926", - "sp_score": 108, - "mp_score": 52, - "overall_score": 160, - "sp_rank": 31, - "mp_rank": 11, - "overall_rank": 23 - }, - { - "user_name": "TheLucky", - "avatar_link": "https://avatars.steamstatic.com/0e96fd1da4c91017a7c1de980d6361b139e6831d_full.jpg", - "steam_id": "76561199116383198", - "sp_score": 0, - "mp_score": 53, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 12, - "overall_rank": 0 - }, - { - "user_name": "Morality", - "avatar_link": "https://avatars.steamstatic.com/2ea3e5885aa789acfc3640788905a414c408edc9_full.jpg", - "steam_id": "76561198799058701", - "sp_score": 115, - "mp_score": 53, - "overall_score": 168, - "sp_rank": 38, - "mp_rank": 12, - "overall_rank": 27 - }, - { - "user_name": "unity", - "avatar_link": "https://avatars.steamstatic.com/1fcc7701ff71dce31965e10408d79aeb79bdf051_full.jpg", - "steam_id": "76561198081168311", - "sp_score": 96, - "mp_score": 53, - "overall_score": 149, - "sp_rank": 20, - "mp_rank": 12, - "overall_rank": 17 - }, - { - "user_name": "savvydruid", - "avatar_link": "https://avatars.steamstatic.com/687d290c9238b42a790216892cc21f718741bd83_full.jpg", - "steam_id": "76561199013726692", - "sp_score": 157, - "mp_score": 53, - "overall_score": 210, - "sp_rank": 74, - "mp_rank": 12, - "overall_rank": 47 - }, - { - "user_name": "fullheart2", - "avatar_link": "https://avatars.steamstatic.com/1daea993c3be4435d49bc50f7b011d639a08f3c9_full.jpg", - "steam_id": "76561197997838862", - "sp_score": 108, - "mp_score": 53, - "overall_score": 161, - "sp_rank": 31, - "mp_rank": 12, - "overall_rank": 24 - }, - { - "user_name": "timurkazz", - "avatar_link": "https://avatars.steamstatic.com/13f6adfa0189055299b1ed69418eec8dd3b5d9eb_full.jpg", - "steam_id": "76561199106449775", - "sp_score": 115, - "mp_score": 53, - "overall_score": 168, - "sp_rank": 38, - "mp_rank": 12, - "overall_rank": 27 - }, - { - "user_name": "Travence", - "avatar_link": "https://avatars.steamstatic.com/30247f75ad7b7e688654a28daa6ad4b035646281_full.jpg", - "steam_id": "76561198071063948", - "sp_score": 15, - "mp_score": 53, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 12, - "overall_rank": 0 - }, - { - "user_name": "SparKy", - "avatar_link": "https://avatars.steamstatic.com/9f65ea65a977d44044bcf2130590793604435461_full.jpg", - "steam_id": "76561198145522438", - "sp_score": 96, - "mp_score": 53, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 12, - "overall_rank": 0 - }, - { - "user_name": "RubiksImplosion", - "avatar_link": "https://avatars.steamstatic.com/2ff1c8d37a2b6b2f370e9a7f204c1c2f64278e51_full.jpg", - "steam_id": "76561198140834873", - "sp_score": 121, - "mp_score": 53, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 12, - "overall_rank": 0 - }, - { - "user_name": "S h i r o \u003c3", - "avatar_link": "https://avatars.steamstatic.com/f1df5185c33b7b75206e6e7da8d45bb6ae298c2c_full.jpg", - "steam_id": "76561198134829983", - "sp_score": 19, - "mp_score": 54, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 13, - "overall_rank": 0 - }, - { - "user_name": "do be chillin", - "avatar_link": "https://avatars.steamstatic.com/c81b318ef886d99a73b6f94ad90b7701ea488b44_full.jpg", - "steam_id": "76561197999637837", - "sp_score": 10, - "mp_score": 54, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 13, - "overall_rank": 0 - }, - { - "user_name": "⭕⃤-Koolusel", - "avatar_link": "https://avatars.steamstatic.com/910a151974aa1880b218e0baeafb0cca8597a554_full.jpg", - "steam_id": "76561198054179479", - "sp_score": 110, - "mp_score": 54, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 13, - "overall_rank": 0 - }, - { - "user_name": "CeyHun", - "avatar_link": "https://avatars.steamstatic.com/c810b0d7bc7755cf71da650329fced17b5afc1ed_full.jpg", - "steam_id": "76561198809051111", - "sp_score": 127, - "mp_score": 54, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 13, - "overall_rank": 0 - }, - { - "user_name": "nintendude", - "avatar_link": "https://avatars.steamstatic.com/79d3fe5839617eb83a9661071ed021dd56ac8a5b_full.jpg", - "steam_id": "76561198307085542", - "sp_score": 118, - "mp_score": 54, - "overall_score": 172, - "sp_rank": 40, - "mp_rank": 13, - "overall_rank": 30 - }, - { - "user_name": "Syho", - "avatar_link": "https://avatars.steamstatic.com/b682ace9a42eedb29ef840079f630da7520a9d35_full.jpg", - "steam_id": "76561198043570840", - "sp_score": 0, - "mp_score": 54, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 13, - "overall_rank": 0 - }, - { - "user_name": "Number1S0n", - "avatar_link": "https://avatars.steamstatic.com/3de2434127aaa6f8b507f4ba37fda2de66b28d02_full.jpg", - "steam_id": "76561198261284319", - "sp_score": 81, - "mp_score": 55, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 14, - "overall_rank": 0 - }, - { - "user_name": "grapefruit", - "avatar_link": "https://avatars.steamstatic.com/ae7603dbeb28ea6b1870547f8dc5017ab5240fb9_full.jpg", - "steam_id": "76561198084554697", - "sp_score": 155, - "mp_score": 55, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 14, - "overall_rank": 0 - }, - { - "user_name": "Fyrestorm", - "avatar_link": "https://avatars.steamstatic.com/c0c82fa70c986348caaaea71f3ccac1b13c0c4eb_full.jpg", - "steam_id": "76561198035761863", - "sp_score": 142, - "mp_score": 55, - "overall_score": 197, - "sp_rank": 62, - "mp_rank": 14, - "overall_rank": 43 - }, - { - "user_name": "マジックサラダ", - "avatar_link": "https://avatars.steamstatic.com/8772186a3ab48712b6eb955a46d269b52ebda706_full.jpg", - "steam_id": "76561198092289827", - "sp_score": 93, - "mp_score": 55, - "overall_score": 148, - "sp_rank": 18, - "mp_rank": 14, - "overall_rank": 16 - }, - { - "user_name": "h@iku", - "avatar_link": "https://avatars.steamstatic.com/bfb0f0be647a28135ba306cd2e40c6ece3ca11b2_full.jpg", - "steam_id": "76561198343098423", - "sp_score": 123, - "mp_score": 55, - "overall_score": 178, - "sp_rank": 43, - "mp_rank": 14, - "overall_rank": 34 - }, - { - "user_name": "Shiro", - "avatar_link": "https://avatars.steamstatic.com/7160e03d7c638627813e5fb993bf921c828b02c2_full.jpg", - "steam_id": "76561198118924124", - "sp_score": 119, - "mp_score": 55, - "overall_score": 174, - "sp_rank": 41, - "mp_rank": 14, - "overall_rank": 31 - }, - { - "user_name": "Zypeh", - "avatar_link": "https://avatars.steamstatic.com/bfd2b759e7e6300fc709857b9e6db802084544d1_full.jpg", - "steam_id": "76561198039230536", - "sp_score": 106, - "mp_score": 55, - "overall_score": 161, - "sp_rank": 29, - "mp_rank": 14, - "overall_rank": 24 - }, - { - "user_name": "Kiby", - "avatar_link": "https://avatars.steamstatic.com/d6c1a2ce06f27072faea47f5b66e619966e0e74a_full.jpg", - "steam_id": "76561198244043338", - "sp_score": 160, - "mp_score": 55, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 14, - "overall_rank": 0 - }, - { - "user_name": "76561199087561281", - "avatar_link": "https://avatars.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg", - "steam_id": "76561199087561281", - "sp_score": 0, - "mp_score": 55, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 14, - "overall_rank": 0 - }, - { - "user_name": "Hyper", - "avatar_link": "https://avatars.steamstatic.com/13a8255802e0794e1fc8c97994559e08761c9100_full.jpg", - "steam_id": "76561198072650129", - "sp_score": 159, - "mp_score": 55, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 14, - "overall_rank": 0 - }, - { - "user_name": "Elixterr", - "avatar_link": "https://avatars.steamstatic.com/655c5f07b60dbe45071fe9eb3f442762009a4022_full.jpg", - "steam_id": "76561198025166178", - "sp_score": 121, - "mp_score": 56, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 15, - "overall_rank": 0 - }, - { - "user_name": "Snow", - "avatar_link": "https://avatars.steamstatic.com/64b513f2c1f8a490670aa3d004d71b95207035b8_full.jpg", - "steam_id": "76561198842803939", - "sp_score": 121, - "mp_score": 56, - "overall_score": 177, - "sp_rank": 42, - "mp_rank": 15, - "overall_rank": 33 - }, - { - "user_name": "Soulfur", - "avatar_link": "https://avatars.steamstatic.com/af59571446fe62756d619b9e42a82c432390ccf0_full.jpg", - "steam_id": "76561198181126266", - "sp_score": 135, - "mp_score": 56, - "overall_score": 191, - "sp_rank": 55, - "mp_rank": 15, - "overall_rank": 41 - }, - { - "user_name": "Blenderiste09", - "avatar_link": "https://avatars.steamstatic.com/79d3fe5839617eb83a9661071ed021dd56ac8a5b_full.jpg", - "steam_id": "76561198251755710", - "sp_score": 145, - "mp_score": 56, - "overall_score": 201, - "sp_rank": 65, - "mp_rank": 15, - "overall_rank": 45 - }, - { - "user_name": "laredeshot", - "avatar_link": "https://avatars.steamstatic.com/8ffb58e0cddad5293c48250deb458f428b9f6736_full.jpg", - "steam_id": "76561198261656551", - "sp_score": 149, - "mp_score": 56, - "overall_score": 205, - "sp_rank": 67, - "mp_rank": 15, - "overall_rank": 46 - }, - { - "user_name": "Auraxed", - "avatar_link": "https://avatars.steamstatic.com/e1be233d73cc82d0c1a3dcfea0d321d3a9c5d432_full.jpg", - "steam_id": "76561197995148325", - "sp_score": 171, - "mp_score": 57, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 16, - "overall_rank": 0 - }, - { - "user_name": "NeKz", - "avatar_link": "https://avatars.steamstatic.com/9a86e6554aee395b3ac37d96a808335363eb79ff_full.jpg", - "steam_id": "76561198049848090", - "sp_score": 107, - "mp_score": 57, - "overall_score": 164, - "sp_rank": 30, - "mp_rank": 16, - "overall_rank": 25 - }, - { - "user_name": "AMJ", - "avatar_link": "https://avatars.steamstatic.com/43480cfa66f1b35c2098016221a4dc19ed4fab55_full.jpg", - "steam_id": "76561198067936604", - "sp_score": 121, - "mp_score": 57, - "overall_score": 178, - "sp_rank": 42, - "mp_rank": 16, - "overall_rank": 34 - }, - { - "user_name": "Turmoil", - "avatar_link": "https://avatars.steamstatic.com/ceeb79bfd441b1928af34195dfde660b44f002dd_full.jpg", - "steam_id": "76561197997770103", - "sp_score": 142, - "mp_score": 57, - "overall_score": 199, - "sp_rank": 62, - "mp_rank": 16, - "overall_rank": 44 - }, - { - "user_name": "wol", - "avatar_link": "https://avatars.steamstatic.com/689a4b1be66db3f28a1567c7b1bb7e8e2d1e1d90_full.jpg", - "steam_id": "76561199007976762", - "sp_score": 177, - "mp_score": 57, - "overall_score": 234, - "sp_rank": 84, - "mp_rank": 16, - "overall_rank": 54 - }, - { - "user_name": "SrRageALot", - "avatar_link": "https://avatars.steamstatic.com/db9c6b6761d63c640456043d864f98f58f62d750_full.jpg", - "steam_id": "76561199156418931", - "sp_score": 89, - "mp_score": 57, - "overall_score": 146, - "sp_rank": 14, - "mp_rank": 16, - "overall_rank": 14 - }, - { - "user_name": "Dreadnox", - "avatar_link": "https://avatars.steamstatic.com/5a01939cd01c969e34417a75116c1167ed74cda5_full.jpg", - "steam_id": "76561198346371604", - "sp_score": 151, - "mp_score": 57, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 16, - "overall_rank": 0 - }, - { - "user_name": "Jess3n", - "avatar_link": "https://avatars.steamstatic.com/1ee47a4ad1a50a4307cde6a9c543b3207942596c_full.jpg", - "steam_id": "76561198870020820", - "sp_score": 112, - "mp_score": 58, - "overall_score": 170, - "sp_rank": 35, - "mp_rank": 17, - "overall_rank": 28 - }, - { - "user_name": "Chevalix", - "avatar_link": "https://avatars.steamstatic.com/db8a0073f499823d0fb4ba89ee8716971a321a4e_full.jpg", - "steam_id": "76561198302681368", - "sp_score": 121, - "mp_score": 58, - "overall_score": 179, - "sp_rank": 42, - "mp_rank": 17, - "overall_rank": 35 - }, - { - "user_name": "Jarool", - "avatar_link": "https://avatars.steamstatic.com/61bb4ee9a8dd6cef5427f2170bb75d3162f3c8e8_full.jpg", - "steam_id": "76561198021055079", - "sp_score": 107, - "mp_score": 59, - "overall_score": 166, - "sp_rank": 30, - "mp_rank": 18, - "overall_rank": 26 - }, - { - "user_name": "Lathil", - "avatar_link": "https://avatars.steamstatic.com/6636331f0f7d69a2ef6557a124ae4a3389466047_full.jpg", - "steam_id": "76561198404861950", - "sp_score": 165, - "mp_score": 59, - "overall_score": 224, - "sp_rank": 79, - "mp_rank": 18, - "overall_rank": 50 - }, - { - "user_name": "c", - "avatar_link": "https://avatars.steamstatic.com/e1be34a0f74d128594230f4518b20c3070e33f9f_full.jpg", - "steam_id": "76561199002783681", - "sp_score": 22, - "mp_score": 59, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 18, - "overall_rank": 0 - }, - { - "user_name": "cubone", - "avatar_link": "https://avatars.steamstatic.com/e285359230318e5cfb27ed688903c5350cd21075_full.jpg", - "steam_id": "76561198096862334", - "sp_score": 93, - "mp_score": 59, - "overall_score": 152, - "sp_rank": 18, - "mp_rank": 18, - "overall_rank": 19 - }, - { - "user_name": "shred", - "avatar_link": "https://avatars.steamstatic.com/0216ce300d00ec193414773679db7dcd77d1cd29_full.jpg", - "steam_id": "76561198025486280", - "sp_score": 88, - "mp_score": 59, - "overall_score": 147, - "sp_rank": 13, - "mp_rank": 18, - "overall_rank": 15 - }, - { - "user_name": "plaasdfds", - "avatar_link": "https://avatars.steamstatic.com/a8cce5c848ed9f27b7252b2490a43c3880ac35b4_full.jpg", - "steam_id": "76561198970030910", - "sp_score": 54, - "mp_score": 59, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 18, - "overall_rank": 0 - }, - { - "user_name": "/7e4eHbKa", - "avatar_link": "https://avatars.steamstatic.com/4925eeeb2c413b3937d99a5a5c2f112668b1dcbd_full.jpg", - "steam_id": "76561198148745518", - "sp_score": 0, - "mp_score": 59, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 18, - "overall_rank": 0 - }, - { - "user_name": "Nana", - "avatar_link": "https://avatars.steamstatic.com/82f49763c2329f3fdc32c1319b8b0f884b1a8c27_full.jpg", - "steam_id": "76561198356541694", - "sp_score": 39, - "mp_score": 60, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 19, - "overall_rank": 0 - }, - { - "user_name": "Leve", - "avatar_link": "https://avatars.steamstatic.com/7a56621890546d1a54d4b583198b4d30411950b2_full.jpg", - "steam_id": "76561198902321340", - "sp_score": 111, - "mp_score": 60, - "overall_score": 171, - "sp_rank": 34, - "mp_rank": 19, - "overall_rank": 29 - }, - { - "user_name": "Extension", - "avatar_link": "https://avatars.steamstatic.com/dbaf3958fffebf266ce5c04316da744987e9b1fb_full.jpg", - "steam_id": "76561199221334063", - "sp_score": 99, - "mp_score": 61, - "overall_score": 160, - "sp_rank": 23, - "mp_rank": 20, - "overall_rank": 23 - }, - { - "user_name": "Herneerius", - "avatar_link": "https://avatars.steamstatic.com/4879fa1c72770b2c0eaef341dc6546db13897bb5_full.jpg", - "steam_id": "76561198084978888", - "sp_score": 98, - "mp_score": 61, - "overall_score": 159, - "sp_rank": 22, - "mp_rank": 20, - "overall_rank": 22 - }, - { - "user_name": "Nate", - "avatar_link": "https://avatars.steamstatic.com/b92b7b2b2828e19865b8a86c40d7eed999cae008_full.jpg", - "steam_id": "76561198172465698", - "sp_score": 146, - "mp_score": 62, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 21, - "overall_rank": 0 - }, - { - "user_name": "stip", - "avatar_link": "https://avatars.steamstatic.com/19be8fd7d791a14920566ce35cc2798ecda8a9e4_full.jpg", - "steam_id": "76561198238515424", - "sp_score": 113, - "mp_score": 63, - "overall_score": 176, - "sp_rank": 36, - "mp_rank": 22, - "overall_rank": 32 - }, - { - "user_name": "なぜ", - "avatar_link": "https://avatars.steamstatic.com/910b3cd2736125678ec6c2744807d0eed052282a_full.jpg", - "steam_id": "76561198220025727", - "sp_score": 176, - "mp_score": 63, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 22, - "overall_rank": 0 - }, - { - "user_name": "korA", - "avatar_link": "https://avatars.steamstatic.com/f6b4b06701dac46a964c320bef20485d468ae35d_full.jpg", - "steam_id": "76561198073626473", - "sp_score": 82, - "mp_score": 63, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 22, - "overall_rank": 0 - }, - { - "user_name": "\u003eLIX", - "avatar_link": "https://avatars.steamstatic.com/fde1a844f9705846e470cb24fc8bd37261b52267_full.jpg", - "steam_id": "76561198134742054", - "sp_score": 121, - "mp_score": 63, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 22, - "overall_rank": 0 - }, - { - "user_name": "Yugge", - "avatar_link": "https://avatars.steamstatic.com/dc7c081330432a22b2d44cca2c02285c3ad04813_full.jpg", - "steam_id": "76561198405615224", - "sp_score": 117, - "mp_score": 63, - "overall_score": 180, - "sp_rank": 39, - "mp_rank": 22, - "overall_rank": 36 - }, - { - "user_name": "Klooger", - "avatar_link": "https://avatars.steamstatic.com/5e3a2e97e84c3a6c12cf63ed5c5d22edee6ecec5_full.jpg", - "steam_id": "76561198015678746", - "sp_score": 160, - "mp_score": 64, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 23, - "overall_rank": 0 - }, - { - "user_name": "ุ", - "avatar_link": "https://avatars.steamstatic.com/b698f81978cd408b5e210f5b5c09d308ae75165b_full.jpg", - "steam_id": "76561198200883819", - "sp_score": 121, - "mp_score": 64, - "overall_score": 185, - "sp_rank": 42, - "mp_rank": 23, - "overall_rank": 38 - }, - { - "user_name": "Bexc", - "avatar_link": "https://avatars.steamstatic.com/67244cfd34ce0dfe36db3e1b8c1b81fe685bfc68_full.jpg", - "steam_id": "76561198295368421", - "sp_score": 129, - "mp_score": 65, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 24, - "overall_rank": 0 - }, - { - "user_name": "100kitaizzev", - "avatar_link": "https://avatars.steamstatic.com/93c7cb31e2b51e636e308788c7264b70e9756c9d_full.jpg", - "steam_id": "76561198006939388", - "sp_score": 123, - "mp_score": 65, - "overall_score": 188, - "sp_rank": 43, - "mp_rank": 24, - "overall_rank": 39 - }, - { - "user_name": "ADGOD", - "avatar_link": "https://avatars.steamstatic.com/a2729f28a4579f519645a10fa3a0e93e66bfa9ed_full.jpg", - "steam_id": "76561198054640750", - "sp_score": 168, - "mp_score": 65, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 24, - "overall_rank": 0 - }, - { - "user_name": "Mr_ParK3r2", - "avatar_link": "https://avatars.steamstatic.com/b00c1c9f1d241b6f4b15fc92541964f29d7bf686_full.jpg", - "steam_id": "76561198032249973", - "sp_score": 178, - "mp_score": 66, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 25, - "overall_rank": 0 - }, - { - "user_name": "JustJack", - "avatar_link": "https://avatars.steamstatic.com/a55267091e385756240f1a11b241981d784293a3_full.jpg", - "steam_id": "76561198892691044", - "sp_score": 172, - "mp_score": 66, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 25, - "overall_rank": 0 - }, - { - "user_name": "Burger40", - "avatar_link": "https://avatars.steamstatic.com/00db94cf7b185c69936738b5a827c63d033c6479_full.jpg", - "steam_id": "76561198083196477", - "sp_score": 98, - "mp_score": 66, - "overall_score": 164, - "sp_rank": 22, - "mp_rank": 25, - "overall_rank": 25 - }, - { - "user_name": "MrCatMcFly", - "avatar_link": "https://avatars.steamstatic.com/6f89591012f8f0f34cef1ecdb1c10793b0ea4bd1_full.jpg", - "steam_id": "76561198168920589", - "sp_score": 87, - "mp_score": 66, - "overall_score": 153, - "sp_rank": 12, - "mp_rank": 25, - "overall_rank": 20 - }, - { - "user_name": "DeSore", - "avatar_link": "https://avatars.steamstatic.com/96d0fbbbfe33a04913c0078cdc7fdd67330f6597_full.jpg", - "steam_id": "76561198833180630", - "sp_score": 24, - "mp_score": 67, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 26, - "overall_rank": 0 - }, - { - "user_name": "Yarby", - "avatar_link": "https://avatars.steamstatic.com/e4b15b25a74d72bb7d93dac7ddcae58984f99b86_full.jpg", - "steam_id": "76561198043899549", - "sp_score": 108, - "mp_score": 68, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 27, - "overall_rank": 0 - }, - { - "user_name": "Victim", - "avatar_link": "https://avatars.steamstatic.com/b3d2986cfe9340530e69934dae7a316423f106d9_full.jpg", - "steam_id": "76561198999589923", - "sp_score": 0, - "mp_score": 68, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 27, - "overall_rank": 0 - }, - { - "user_name": "Pr0tal", - "avatar_link": "https://avatars.steamstatic.com/ce72799aa2cf4b591df09b3afc715b2259963af7_full.jpg", - "steam_id": "76561198292863694", - "sp_score": 98, - "mp_score": 68, - "overall_score": 166, - "sp_rank": 22, - "mp_rank": 27, - "overall_rank": 26 - }, - { - "user_name": "X3kuba3X", - "avatar_link": "https://avatars.steamstatic.com/244a92aebee196a0456bb89d287ffff19834eec0_full.jpg", - "steam_id": "76561198134292189", - "sp_score": 9, - "mp_score": 69, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 28, - "overall_rank": 0 - }, - { - "user_name": "Schwi", - "avatar_link": "https://avatars.steamstatic.com/a5ab762db09205fc49a6fa8fd1d09daafc3ac6e4_full.jpg", - "steam_id": "76561198384377251", - "sp_score": 147, - "mp_score": 69, - "overall_score": 216, - "sp_rank": 66, - "mp_rank": 28, - "overall_rank": 48 - }, - { - "user_name": "DenisikPlayer", - "avatar_link": "https://avatars.steamstatic.com/79d3fe5839617eb83a9661071ed021dd56ac8a5b_full.jpg", - "steam_id": "76561198337440587", - "sp_score": 0, - "mp_score": 70, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 29, - "overall_rank": 0 - }, - { - "user_name": "rudko", - "avatar_link": "https://avatars.steamstatic.com/b932115fe2e18117925e28499fa0cea637caf7bd_full.jpg", - "steam_id": "76561198128079782", - "sp_score": 143, - "mp_score": 70, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 29, - "overall_rank": 0 - }, - { - "user_name": "Imagine a cool name", - "avatar_link": "https://avatars.steamstatic.com/ed6186b9c575f4df60c138785c9c004ad9bd4fae_full.jpg", - "steam_id": "76561198869299905", - "sp_score": 101, - "mp_score": 71, - "overall_score": 172, - "sp_rank": 25, - "mp_rank": 30, - "overall_rank": 30 - }, - { - "user_name": "ThatGoatWhoIsEpic", - "avatar_link": "https://avatars.steamstatic.com/5049e37e3b511134a4a1b8359a8103348c09ff17_full.jpg", - "steam_id": "76561198074525881", - "sp_score": 117, - "mp_score": 72, - "overall_score": 189, - "sp_rank": 39, - "mp_rank": 31, - "overall_rank": 40 - }, - { - "user_name": "KurChuck", - "avatar_link": "https://avatars.steamstatic.com/9506cc7cd5450190a64b45bab4eb2164054d9622_full.jpg", - "steam_id": "76561198014816567", - "sp_score": 41, - "mp_score": 72, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 31, - "overall_rank": 0 - }, - { - "user_name": "m a c k", - "avatar_link": "https://avatars.steamstatic.com/1f8b38c318002f583a40874ff61cbf23621f1087_full.jpg", - "steam_id": "76561198286321440", - "sp_score": 13, - "mp_score": 72, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 31, - "overall_rank": 0 - }, - { - "user_name": "UrMomPlebLol", - "avatar_link": "https://avatars.steamstatic.com/5b5b9357badc3d9e9ba53d52cf851a85df4a910c_full.jpg", - "steam_id": "76561198371482646", - "sp_score": 112, - "mp_score": 73, - "overall_score": 185, - "sp_rank": 35, - "mp_rank": 32, - "overall_rank": 38 - }, - { - "user_name": "follon", - "avatar_link": "https://avatars.steamstatic.com/34f5aed96997089fcd0782d756c637a431666965_full.jpg", - "steam_id": "76561198024055942", - "sp_score": 118, - "mp_score": 74, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 33, - "overall_rank": 0 - }, - { - "user_name": "Saxton Hale", - "avatar_link": "https://avatars.steamstatic.com/2f335962fbb8431ea3f5606fe3e1881dce47e63a_full.jpg", - "steam_id": "76561197998253566", - "sp_score": 155, - "mp_score": 75, - "overall_score": 230, - "sp_rank": 72, - "mp_rank": 34, - "overall_rank": 52 - }, - { - "user_name": "Amtyi", - "avatar_link": "https://avatars.steamstatic.com/c320800aa0ee29bf778d5580afc191b5745be7f3_full.jpg", - "steam_id": "76561198241550078", - "sp_score": 74, - "mp_score": 77, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 35, - "overall_rank": 0 - }, - { - "user_name": "Throw", - "avatar_link": "https://avatars.steamstatic.com/2c01a87d1b0789f7bdd1f3e693ef9987e49abe01_full.jpg", - "steam_id": "76561198952505877", - "sp_score": 115, - "mp_score": 78, - "overall_score": 193, - "sp_rank": 38, - "mp_rank": 36, - "overall_rank": 42 - }, - { - "user_name": "Clantis", - "avatar_link": "https://avatars.steamstatic.com/5395f253dd2f4f26a76d8c12605d474ad6fb8dca_full.jpg", - "steam_id": "76561198296352733", - "sp_score": 142, - "mp_score": 80, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 37, - "overall_rank": 0 - }, - { - "user_name": "Xinera", - "avatar_link": "https://avatars.steamstatic.com/9b8af4605d41bdd61ba3c27bd7ba8e8468a9a544_full.jpg", - "steam_id": "76561198054297641", - "sp_score": 140, - "mp_score": 81, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 38, - "overall_rank": 0 - }, - { - "user_name": "AaRCaT", - "avatar_link": "https://avatars.steamstatic.com/ed6bd613d0ac4560683e59c03f824bf64972a5bd_full.jpg", - "steam_id": "76561198158015341", - "sp_score": 11, - "mp_score": 82, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 39, - "overall_rank": 0 - }, - { - "user_name": "Imanex", - "avatar_link": "https://avatars.steamstatic.com/82d1ac52aeddb7f08eb0f85d4f7d96160af30bb9_full.jpg", - "steam_id": "76561197974616889", - "sp_score": 169, - "mp_score": 82, - "overall_score": 251, - "sp_rank": 81, - "mp_rank": 39, - "overall_rank": 57 - }, - { - "user_name": "Reau", - "avatar_link": "https://avatars.steamstatic.com/6037ba76b789065685c47291eee8254b4934ad9c_full.jpg", - "steam_id": "76561198272340873", - "sp_score": 154, - "mp_score": 82, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 39, - "overall_rank": 0 - }, - { - "user_name": "1 Portal SWAG", - "avatar_link": "https://avatars.steamstatic.com/8766c163ce9fd7a584c5347dab0a6a49766102e8_full.jpg", - "steam_id": "76561198253811824", - "sp_score": 137, - "mp_score": 82, - "overall_score": 219, - "sp_rank": 57, - "mp_rank": 39, - "overall_rank": 49 - }, - { - "user_name": "elle", - "avatar_link": "https://avatars.steamstatic.com/2b6dd3fc173a2406a08cf4c02d3a67464e8fef44_full.jpg", - "steam_id": "76561198821417994", - "sp_score": 57, - "mp_score": 85, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 40, - "overall_rank": 0 - }, - { - "user_name": "Limehawk", - "avatar_link": "https://avatars.steamstatic.com/9b88f694818c3fd387684686ba5b2cf739c9d1f2_full.jpg", - "steam_id": "76561198068315512", - "sp_score": 147, - "mp_score": 86, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 41, - "overall_rank": 0 - }, - { - "user_name": "zhendiac", - "avatar_link": "https://avatars.steamstatic.com/d7d350ad47edbfa3acfe74761fe196b1d89f4e17_full.jpg", - "steam_id": "76561198036324314", - "sp_score": 173, - "mp_score": 87, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 42, - "overall_rank": 0 - }, - { - "user_name": "Barbikoru", - "avatar_link": "https://avatars.steamstatic.com/7c0c327673e0f09011c96999c738652cf548e5b1_full.jpg", - "steam_id": "76561198324155905", - "sp_score": 67, - "mp_score": 89, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 43, - "overall_rank": 0 - }, - { - "user_name": "ki4rakaM [RUS]", - "avatar_link": "https://avatars.steamstatic.com/cae7d5a1e4b04f70dc0c1599d932edb423e65870_full.jpg", - "steam_id": "76561198227911092", - "sp_score": 157, - "mp_score": 89, - "overall_score": 246, - "sp_rank": 74, - "mp_rank": 43, - "overall_rank": 56 - }, - { - "user_name": "Mister Man", - "avatar_link": "https://avatars.steamstatic.com/695d7049640bded587ed3f5a83c26f1a1ad9c879_full.jpg", - "steam_id": "76561197980620221", - "sp_score": 72, - "mp_score": 89, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 43, - "overall_rank": 0 - }, - { - "user_name": "badger", - "avatar_link": "https://avatars.steamstatic.com/cbea4cfe87dab41ed9d2b53be876110b98e4111a_full.jpg", - "steam_id": "76561198861024091", - "sp_score": 135, - "mp_score": 89, - "overall_score": 224, - "sp_rank": 55, - "mp_rank": 43, - "overall_rank": 50 - }, - { - "user_name": "Hacked Exhale", - "avatar_link": "https://avatars.steamstatic.com/3d5a750f0fb2ac21ff46ceea973ef8b2eee2bff8_full.jpg", - "steam_id": "76561197978601137", - "sp_score": 55, - "mp_score": 90, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 44, - "overall_rank": 0 - }, - { - "user_name": "Kendal", - "avatar_link": "https://avatars.steamstatic.com/5fa6ab9276be48f30e371baa45dee39c66811f37_full.jpg", - "steam_id": "76561198068358920", - "sp_score": 161, - "mp_score": 92, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 45, - "overall_rank": 0 - }, - { - "user_name": "MegaWaTT", - "avatar_link": "https://avatars.steamstatic.com/ed56d8fc9c49a77d3f8c8bd6cc3efa72e714b54d_full.jpg", - "steam_id": "76561198363863187", - "sp_score": 137, - "mp_score": 92, - "overall_score": 229, - "sp_rank": 57, - "mp_rank": 45, - "overall_rank": 51 - }, - { - "user_name": "Lemmons", - "avatar_link": "https://avatars.steamstatic.com/251093b6b46199072eef6a2bb8f95c1f3ec8770d_full.jpg", - "steam_id": "76561198182774873", - "sp_score": 2, - "mp_score": 94, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 46, - "overall_rank": 0 - }, - { - "user_name": "iVerb", - "avatar_link": "https://avatars.steamstatic.com/1acc820cbf4e724190db676db26202ec2049098e_full.jpg", - "steam_id": "76561198047900528", - "sp_score": 158, - "mp_score": 95, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 47, - "overall_rank": 0 - }, - { - "user_name": "expo", - "avatar_link": "https://avatars.steamstatic.com/a17401681c8249a538d41142bca7e745bf47480a_full.jpg", - "steam_id": "76561198075953991", - "sp_score": 127, - "mp_score": 96, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 48, - "overall_rank": 0 - }, - { - "user_name": "XTLmaker", - "avatar_link": "https://avatars.steamstatic.com/b3c041f3eb316e0edf16e6ba36f426b433e16cee_full.jpg", - "steam_id": "76561199032030834", - "sp_score": 134, - "mp_score": 97, - "overall_score": 231, - "sp_rank": 54, - "mp_rank": 49, - "overall_rank": 53 - }, - { - "user_name": "Spyrunite", - "avatar_link": "https://avatars.steamstatic.com/184e99f06e36b81346214c37f6b448f4d71fcb8b_full.jpg", - "steam_id": "76561198026851335", - "sp_score": 132, - "mp_score": 98, - "overall_score": 230, - "sp_rank": 52, - "mp_rank": 50, - "overall_rank": 52 - }, - { - "user_name": "SilentiumGradas", - "avatar_link": "https://avatars.steamstatic.com/b26b46bc2dd6efece8b6cbcff8ba263801b5b6dc_full.jpg", - "steam_id": "76561199006050430", - "sp_score": 142, - "mp_score": 101, - "overall_score": 243, - "sp_rank": 62, - "mp_rank": 51, - "overall_rank": 55 - }, - { - "user_name": "hazza", - "avatar_link": "https://avatars.steamstatic.com/5a9e8d6229e67c253695136f2fee087f04b5ec05_full.jpg", - "steam_id": "76561198039912258", - "sp_score": 133, - "mp_score": 101, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 51, - "overall_rank": 0 - }, - { - "user_name": "Schlepian", - "avatar_link": "https://avatars.steamstatic.com/f7be9949784d7864c619a72e0bec1138a14933ff_full.jpg", - "steam_id": "76561198021734854", - "sp_score": 161, - "mp_score": 105, - "overall_score": 266, - "sp_rank": 76, - "mp_rank": 52, - "overall_rank": 58 - }, - { - "user_name": "Schlay", - "avatar_link": "https://avatars.steamstatic.com/1c81f34080417cab9a836c003e5c319229e528f9_full.jpg", - "steam_id": "76561198042995537", - "sp_score": 170, - "mp_score": 108, - "overall_score": 278, - "sp_rank": 82, - "mp_rank": 53, - "overall_rank": 59 - }, - { - "user_name": "Bubblegum Cuddly Dragoness", - "avatar_link": "https://avatars.steamstatic.com/52aaae46baa3eb09ad16a15756c0c0e707792979_full.jpg", - "steam_id": "76561198171146837", - "sp_score": 2, - "mp_score": 108, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 53, - "overall_rank": 0 - }, - { - "user_name": "LamboLord24", - "avatar_link": "https://avatars.steamstatic.com/17b9acd5b3f12ad9ccc1b13185b6dec6e127422d_full.jpg", - "steam_id": "76561198263749501", - "sp_score": 163, - "mp_score": 109, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 54, - "overall_rank": 0 - }, - { - "user_name": "«✮ঔৣ Akumaঔৣ✮»", - "avatar_link": "https://avatars.steamstatic.com/466713b1c71a6f4bb173801ce86aa7a09085744e_full.jpg", - "steam_id": "76561198809780104", - "sp_score": 54, - "mp_score": 110, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 55, - "overall_rank": 0 - }, - { - "user_name": "Bdiggles", - "avatar_link": "https://avatars.steamstatic.com/fb16ca8a8afa49b290cbe0825411052e8fa19f86_full.jpg", - "steam_id": "76561198072337331", - "sp_score": 85, - "mp_score": 111, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 56, - "overall_rank": 0 - }, - { - "user_name": "juan", - "avatar_link": "https://avatars.steamstatic.com/92b4051d048561796489cf256bb5eafa7302a85f_full.jpg", - "steam_id": "76561198170811613", - "sp_score": 2, - "mp_score": 111, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 56, - "overall_rank": 0 - }, - { - "user_name": "Betsruner", - "avatar_link": "https://avatars.steamstatic.com/6e5b5f43361149652d556073c34a4c3bd5c56df2_full.jpg", - "steam_id": "76561198048179892", - "sp_score": 153, - "mp_score": 113, - "overall_score": 266, - "sp_rank": 70, - "mp_rank": 57, - "overall_rank": 58 - }, - { - "user_name": "Led_Astray", - "avatar_link": "https://avatars.steamstatic.com/26458ac0a9e4a290b2edc09801b09e92ab74a747_full.jpg", - "steam_id": "76561198125215858", - "sp_score": 154, - "mp_score": 113, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 57, - "overall_rank": 0 - }, - { - "user_name": "Phantom", - "avatar_link": "https://avatars.steamstatic.com/06a00384bc8140f425cf81ac6637222620ef9307_full.jpg", - "steam_id": "76561198058087062", - "sp_score": 169, - "mp_score": 115, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 58, - "overall_rank": 0 - }, - { - "user_name": "svo", - "avatar_link": "https://avatars.steamstatic.com/b10f98132d4c19cf862ed0630e73112f7bf272f7_full.jpg", - "steam_id": "76561198025422567", - "sp_score": 55, - "mp_score": 117, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 59, - "overall_rank": 0 - }, - { - "user_name": "Below average player", - "avatar_link": "https://avatars.steamstatic.com/0e1e69fb2542d5a971b6e8a98a6c045df537764e_full.jpg", - "steam_id": "76561198119082730", - "sp_score": 33, - "mp_score": 120, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 60, - "overall_rank": 0 - }, - { - "user_name": "Can't Even", - "avatar_link": "https://avatars.steamstatic.com/4afaebb9ddc55f39e0b8b8e4a25a21d7eac6c574_full.jpg", - "steam_id": "76561198093441459", - "sp_score": 135, - "mp_score": 121, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 61, - "overall_rank": 0 - }, - { - "user_name": "spidda", - "avatar_link": "https://avatars.steamstatic.com/31f788519863b79f24b1604e090596ba6961a3ab_full.jpg", - "steam_id": "76561198057436685", - "sp_score": 148, - "mp_score": 121, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 61, - "overall_rank": 0 - }, - { - "user_name": "kerzenkaktus", - "avatar_link": "https://avatars.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg", - "steam_id": "76561198255545050", - "sp_score": 139, - "mp_score": 122, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 62, - "overall_rank": 0 - }, - { - "user_name": "RaspeRuben", - "avatar_link": "https://avatars.steamstatic.com/ff8cce6ed65259baf9e43ccb0a19f4eb23ba5151_full.jpg", - "steam_id": "76561198045034733", - "sp_score": 137, - "mp_score": 124, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 63, - "overall_rank": 0 - }, - { - "user_name": "¯\\_(ツ)_/¯", - "avatar_link": "https://avatars.steamstatic.com/fb9c36c36e54b8ca5f2e1cbd89c06574d1348af0_full.jpg", - "steam_id": "76561198001523094", - "sp_score": 175, - "mp_score": 127, - "overall_score": 302, - "sp_rank": 83, - "mp_rank": 64, - "overall_rank": 60 - }, - { - "user_name": "daver12345", - "avatar_link": "https://avatars.steamstatic.com/544a1f05dff94e62346a7c05af4fd7073389fd78_full.jpg", - "steam_id": "76561198101504119", - "sp_score": 159, - "mp_score": 128, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 65, - "overall_rank": 0 - }, - { - "user_name": "Impossibear", - "avatar_link": "https://avatars.steamstatic.com/4be16de2b923be8ced14e4235bcac95d873aa492_full.jpg", - "steam_id": "76561198050446845", - "sp_score": 155, - "mp_score": 129, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 66, - "overall_rank": 0 - }, - { - "user_name": "hero", - "avatar_link": "https://avatars.steamstatic.com/b5a35d5b26f9124593201b185c00ebd0efac775d_full.jpg", - "steam_id": "76561198254956991", - "sp_score": 142, - "mp_score": 129, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 66, - "overall_rank": 0 - }, - { - "user_name": "neeeklaus", - "avatar_link": "https://avatars.steamstatic.com/1b5a627d003062ba15236ca9b306ae56067ea310_full.jpg", - "steam_id": "76561198098168066", - "sp_score": 51, - "mp_score": 129, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 66, - "overall_rank": 0 - }, - { - "user_name": "GhOsTLySwArM", - "avatar_link": "https://avatars.steamstatic.com/4ab3db0761bdfb0b02c32de00e0924e1270cf81a_full.jpg", - "steam_id": "76561198871800785", - "sp_score": 4, - "mp_score": 144, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 67, - "overall_rank": 0 - }, - { - "user_name": "пивной дезертир", - "avatar_link": "https://avatars.steamstatic.com/670eb37891a5cfaca8b99be2150e78b1acdd3aae_full.jpg", - "steam_id": "76561198415120970", - "sp_score": 159, - "mp_score": 147, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 68, - "overall_rank": 0 - }, - { - "user_name": "Dodecahedrony", - "avatar_link": "https://avatars.steamstatic.com/7183bb63deabd70d15a5ee7b33faf317df8763c2_full.jpg", - "steam_id": "76561198316957058", - "sp_score": 156, - "mp_score": 149, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 69, - "overall_rank": 0 - }, - { - "user_name": "Ninja Driedel", - "avatar_link": "https://avatars.steamstatic.com/ea548dd7c2dad0cf98d538611e7bba0ff5bfa936_full.jpg", - "steam_id": "76561199087474545", - "sp_score": 77, - "mp_score": 149, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 69, - "overall_rank": 0 - }, - { - "user_name": "Virken", - "avatar_link": "https://avatars.steamstatic.com/71217cc54fc8da62a8c843c0f527ab60405fc06b_full.jpg", - "steam_id": "76561198130509300", - "sp_score": 160, - "mp_score": 151, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 70, - "overall_rank": 0 - }, - { - "user_name": "Rex", - "avatar_link": "https://avatars.steamstatic.com/3b161f8a37d8e69c3244b7c23d7b461433e14c0c_full.jpg", - "steam_id": "76561198095730281", - "sp_score": 142, - "mp_score": 151, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 70, - "overall_rank": 0 - }, - { - "user_name": "mitya", - "avatar_link": "https://avatars.steamstatic.com/c774fcb7516d344037f0b6abc8a26f9619202081_full.jpg", - "steam_id": "76561198377664123", - "sp_score": 139, - "mp_score": 154, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 71, - "overall_rank": 0 - }, - { - "user_name": "Swiftrax", - "avatar_link": "https://avatars.steamstatic.com/938f2ed6557cb0637293a2e24b86870b8a648406_full.jpg", - "steam_id": "76561198041962842", - "sp_score": 159, - "mp_score": 159, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 72, - "overall_rank": 0 - }, - { - "user_name": "Flower_H0rse", - "avatar_link": "https://avatars.steamstatic.com/a6ba3b4fff2fc30a596f227fa7f31000fd8efb97_full.jpg", - "steam_id": "76561199227965499", - "sp_score": 127, - "mp_score": 161, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 73, - "overall_rank": 0 - }, - { - "user_name": "Dane", - "avatar_link": "https://avatars.steamstatic.com/88575483645036637ac0f8568d8a7ffbbb658dd6_full.jpg", - "steam_id": "76561198057501496", - "sp_score": 153, - "mp_score": 161, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 73, - "overall_rank": 0 - }, - { - "user_name": "しの", - "avatar_link": "https://avatars.steamstatic.com/cca88f25df7d64ff52c26b95d9454a0af274957c_full.jpg", - "steam_id": "76561198814954135", - "sp_score": 6, - "mp_score": 163, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 74, - "overall_rank": 0 - }, - { - "user_name": "eszter", - "avatar_link": "https://avatars.steamstatic.com/9e382a566d3fc7425cb39e4f97535cda2251e219_full.jpg", - "steam_id": "76561198044618353", - "sp_score": 212, - "mp_score": 163, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 74, - "overall_rank": 0 - }, - { - "user_name": "skittle chan", - "avatar_link": "https://avatars.steamstatic.com/1cde41417aa40729a6228de08240153e5b36b244_full.jpg", - "steam_id": "76561199426450565", - "sp_score": 167, - "mp_score": 165, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 75, - "overall_rank": 0 - }, - { - "user_name": "EDDY SPAGHETTI DANK MEMES", - "avatar_link": "https://avatars.steamstatic.com/8e491e9416f9170433517b5dba0223c98c4b65d7_full.jpg", - "steam_id": "76561198064465940", - "sp_score": 156, - "mp_score": 167, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 76, - "overall_rank": 0 - }, - { - "user_name": "AJ", - "avatar_link": "https://avatars.steamstatic.com/7de1994882e6532f9226de20b3d31bfe8ff12095_full.jpg", - "steam_id": "76561198035130516", - "sp_score": 147, - "mp_score": 168, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 77, - "overall_rank": 0 - }, - { - "user_name": "kyツ", - "avatar_link": "https://avatars.steamstatic.com/a4b039ebd4ea911f9e6715f3c7949148b3ce1812_full.jpg", - "steam_id": "76561198041349990", - "sp_score": 170, - "mp_score": 178, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 78, - "overall_rank": 0 - }, - { - "user_name": "Faithless", - "avatar_link": "https://avatars.steamstatic.com/aebacfe8919403fe0ecc0c4e50b3f67d97c6d620_full.jpg", - "steam_id": "76561197980492609", - "sp_score": 0, - "mp_score": 184, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 79, - "overall_rank": 0 - }, - { - "user_name": "Keyser", - "avatar_link": "https://avatars.steamstatic.com/14c7c4d9634a94cfa8f8b1141e3187adbfa4774a_full.jpg", - "steam_id": "76561197969927537", - "sp_score": 61, - "mp_score": 184, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 79, - "overall_rank": 0 - }, - { - "user_name": "|lDgAl|HeXeRMaN", - "avatar_link": "https://avatars.steamstatic.com/0361f4990419a90fcc53a228541b2b8749bfceda_full.jpg", - "steam_id": "76561197980522591", - "sp_score": 183, - "mp_score": 184, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 79, - "overall_rank": 0 - }, - { - "user_name": "Gigo", - "avatar_link": "https://avatars.steamstatic.com/f4bc4f53d66559f5889cddfd4c4af00c0f22e714_full.jpg", - "steam_id": "76561198004871206", - "sp_score": 131, - "mp_score": 193, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 80, - "overall_rank": 0 - }, - { - "user_name": "lampishboi", - "avatar_link": "https://avatars.steamstatic.com/22bc948278437707cf69cc70a153f8363c95bccf_full.jpg", - "steam_id": "76561198994808916", - "sp_score": 131, - "mp_score": 199, - "overall_score": 330, - "sp_rank": 51, - "mp_rank": 81, - "overall_rank": 61 - }, - { - "user_name": "mr.deagle", - "avatar_link": "https://avatars.steamstatic.com/ca9843d4e194905f7b8106dc4cdc046587b67303_full.jpg", - "steam_id": "76561197970314683", - "sp_score": 85, - "mp_score": 199, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 81, - "overall_rank": 0 - }, - { - "user_name": "Chris", - "avatar_link": "https://avatars.steamstatic.com/83cbe3c40465ebda03b53b9ada61bb87e374a08d_full.jpg", - "steam_id": "76561198036794680", - "sp_score": 61, - "mp_score": 201, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 82, - "overall_rank": 0 - }, - { - "user_name": "Jimmy", - "avatar_link": "https://avatars.steamstatic.com/26c52b8af4195235c8b791097fb34e64c8b631bb_full.jpg", - "steam_id": "76561198046543307", - "sp_score": 4, - "mp_score": 201, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 82, - "overall_rank": 0 - }, - { - "user_name": "Glost999", - "avatar_link": "https://avatars.steamstatic.com/f95c03592d1c4250a6ce3816dd1105da18ed3eaf_full.jpg", - "steam_id": "76561198042671991", - "sp_score": 134, - "mp_score": 202, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 83, - "overall_rank": 0 - }, - { - "user_name": "Tharsic", - "avatar_link": "https://avatars.steamstatic.com/119b34225d2abf2e1ca84d0122197a2f013329b5_full.jpg", - "steam_id": "76561197976665233", - "sp_score": 253, - "mp_score": 203, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 84, - "overall_rank": 0 - }, - { - "user_name": "rugcer", - "avatar_link": "https://avatars.steamstatic.com/85a853daef3a8766f4b3767f2146dbd043daa1fa_full.jpg", - "steam_id": "76561198063407806", - "sp_score": 34, - "mp_score": 203, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 84, - "overall_rank": 0 - }, - { - "user_name": "Msushi", - "avatar_link": "https://avatars.steamstatic.com/ac135680e1efc673882dd74081e11c1810be9b40_full.jpg", - "steam_id": "76561198048636382", - "sp_score": 148, - "mp_score": 203, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 84, - "overall_rank": 0 - }, - { - "user_name": "『 Jonese1234 』", - "avatar_link": "https://avatars.steamstatic.com/9f6de098624a8f81ba6d2318e1923bdda1c710d6_full.jpg", - "steam_id": "76561198045074889", - "sp_score": 157, - "mp_score": 206, - "overall_score": 363, - "sp_rank": 74, - "mp_rank": 85, - "overall_rank": 62 - }, - { - "user_name": "Markel", - "avatar_link": "https://avatars.steamstatic.com/ce4ddba52f445c0eb71ddca800bfd5bf6ed332f3_full.jpg", - "steam_id": "76561198043196429", - "sp_score": 178, - "mp_score": 207, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 86, - "overall_rank": 0 - }, - { - "user_name": "Retep", - "avatar_link": "https://avatars.steamstatic.com/5f6efd223eef4b1801a8ef0b817e20126d9615d2_full.jpg", - "steam_id": "76561198052457191", - "sp_score": 185, - "mp_score": 208, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 87, - "overall_rank": 0 - }, - { - "user_name": "Potatoes", - "avatar_link": "https://avatars.steamstatic.com/94821c98d19e5eda6ec315289aa28b191084f301_full.jpg", - "steam_id": "76561197974561284", - "sp_score": 248, - "mp_score": 209, - "overall_score": 457, - "sp_rank": 89, - "mp_rank": 88, - "overall_rank": 63 - }, - { - "user_name": "LotsOfS", - "avatar_link": "https://avatars.steamstatic.com/4bf4213eda8c7862b9c58a0a02ea3ddbcc52a321_full.jpg", - "steam_id": "76561197972803163", - "sp_score": 231, - "mp_score": 211, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 89, - "overall_rank": 0 - }, - { - "user_name": "SIMOON ✈", - "avatar_link": "https://avatars.steamstatic.com/1c0b5c37a442a2d39f32902ec42f2e26ba6a142e_full.jpg", - "steam_id": "76561197976463017", - "sp_score": 268, - "mp_score": 212, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 90, - "overall_rank": 0 - }, - { - "user_name": "Drast くコ:彡", - "avatar_link": "https://avatars.steamstatic.com/18e2cf5be81bed1ced5dd4ea9c71ff7e15fa492f_full.jpg", - "steam_id": "76561198039154239", - "sp_score": 7, - "mp_score": 218, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 91, - "overall_rank": 0 - }, - { - "user_name": "董美龄", - "avatar_link": "https://avatars.steamstatic.com/783100335395646d0cfc75cba6d84ae5013f6dff_full.jpg", - "steam_id": "76561198067468981", - "sp_score": 161, - "mp_score": 218, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 91, - "overall_rank": 0 - }, - { - "user_name": "Trox", - "avatar_link": "https://avatars.steamstatic.com/dc2f96da104aef42ae74161a29d2e0f08f0a35fd_full.jpg", - "steam_id": "76561197976665231", - "sp_score": 104, - "mp_score": 220, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 92, - "overall_rank": 0 - }, - { - "user_name": "Viviatron", - "avatar_link": "https://avatars.steamstatic.com/8c16194bab99c6977289de5e7100a2aeb3aa889b_full.jpg", - "steam_id": "76561198257444100", - "sp_score": 162, - "mp_score": 222, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 93, - "overall_rank": 0 - }, - { - "user_name": "I am lost", - "avatar_link": "https://avatars.steamstatic.com/8feb46d792dde9d9d27000c153f15516e5ff6f92_full.jpg", - "steam_id": "76561198208183016", - "sp_score": 121, - "mp_score": 223, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 94, - "overall_rank": 0 - }, - { - "user_name": "Pog", - "avatar_link": "https://avatars.steamstatic.com/f805f0859795fa061f2a8d2649ce16f12021de45_full.jpg", - "steam_id": "76561199051251085", - "sp_score": 11, - "mp_score": 228, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 95, - "overall_rank": 0 - }, - { - "user_name": "pain", - "avatar_link": "https://avatars.steamstatic.com/343dab39597de5d25d02eab2b2fe48d8dde6ae0e_full.jpg", - "steam_id": "76561198025894860", - "sp_score": 225, - "mp_score": 229, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 96, - "overall_rank": 0 - }, - { - "user_name": "PiorkoSky", - "avatar_link": "https://avatars.steamstatic.com/97caee00eb9e2fd9f78eaf034b7f9f4d2fd9210d_full.jpg", - "steam_id": "76561198040941119", - "sp_score": 178, - "mp_score": 229, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 96, - "overall_rank": 0 - }, - { - "user_name": "Setharu", - "avatar_link": "https://avatars.steamstatic.com/bc7182674746a2a26f20c4be3fc1b529ae68aa91_full.jpg", - "steam_id": "76561198019599030", - "sp_score": 92, - "mp_score": 238, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 97, - "overall_rank": 0 - }, - { - "user_name": "dawn", - "avatar_link": "https://avatars.steamstatic.com/190751663ac28b9dac167347337bceea34a0c59f_full.jpg", - "steam_id": "76561197960285145", - "sp_score": 88, - "mp_score": 259, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 98, - "overall_rank": 0 - }, - { - "user_name": "Petieken", - "avatar_link": "https://avatars.steamstatic.com/0d0f89bd4df398d7ff7b4e253625d120949d1049_full.jpg", - "steam_id": "76561197965344508", - "sp_score": 0, - "mp_score": 272, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 99, - "overall_rank": 0 - }, - { - "user_name": "S", - "avatar_link": "https://avatars.steamstatic.com/9aec167e64de72c34ede2e4196e3eef912e92f43_full.jpg", - "steam_id": "76561197973861204", - "sp_score": 34, - "mp_score": 282, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 100, - "overall_rank": 0 - }, - { - "user_name": "nairolF", - "avatar_link": "https://avatars.steamstatic.com/3f6e63089b13c395372cb0fd45be258332024e33_full.jpg", - "steam_id": "76561197964814707", - "sp_score": 34, - "mp_score": 366, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 101, - "overall_rank": 0 - }, - { - "user_name": "unNamed", - "avatar_link": "https://avatars.steamstatic.com/d956bc4013e234d687e01e910297bd80cde68345_full.jpg", - "steam_id": "76561197964995786", - "sp_score": 9, - "mp_score": 390, - "overall_score": 0, - "sp_rank": 0, - "mp_rank": 102, - "overall_rank": 0 - } - ], - "rankings_overall": [ - { - "user_name": "SuperAiderton", - "avatar_link": "https://avatars.steamstatic.com/a19aca196dbb75b51b83fe7d06b0b7fce0f894b2_full.jpg", - "steam_id": "76561199069631083", - "sp_score": 65, - "mp_score": 48, - "overall_score": 113, - "sp_rank": 1, - "mp_rank": 7, - "overall_rank": 1 - }, - { - "user_name": "Nidboj132", - "avatar_link": "https://avatars.steamstatic.com/07bc99e768c9f640979e2a393f28306a32fa796e_full.jpg", - "steam_id": "76561198337970645", - "sp_score": 76, - "mp_score": 41, - "overall_score": 117, - "sp_rank": 4, - "mp_rank": 1, - "overall_rank": 2 - }, - { - "user_name": "mOtYl", - "avatar_link": "https://avatars.steamstatic.com/8065f6018757dc0ee927d2279ccf7e8ab7827109_full.jpg", - "steam_id": "76561197994700458", - "sp_score": 74, - "mp_score": 49, - "overall_score": 123, - "sp_rank": 3, - "mp_rank": 8, - "overall_rank": 3 - }, - { - "user_name": "?", - "avatar_link": "https://avatars.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_full.jpg", - "steam_id": "76561198838630481", - "sp_score": 80, - "mp_score": 46, - "overall_score": 126, - "sp_rank": 6, - "mp_rank": 5, - "overall_rank": 4 - }, - { - "user_name": "Black_Semka", - "avatar_link": "https://avatars.steamstatic.com/3a6acf4e40097d9db7af432684a08b6267d2af5c_full.jpg", - "steam_id": "76561198997027314", - "sp_score": 85, - "mp_score": 41, - "overall_score": 126, - "sp_rank": 10, - "mp_rank": 1, - "overall_rank": 4 - }, - { - "user_name": "xeonic", - "avatar_link": "https://avatars.steamstatic.com/7c3e67f433c90512fe6cac7278d6cb8b59d10c96_full.jpg", - "steam_id": "76561198973478625", - "sp_score": 82, - "mp_score": 45, - "overall_score": 127, - "sp_rank": 8, - "mp_rank": 4, - "overall_rank": 5 - }, - { - "user_name": "slamix", - "avatar_link": "https://avatars.steamstatic.com/730aee7d3904a0f38506858ba83ebc014260ccc3_full.jpg", - "steam_id": "76561198403952785", - "sp_score": 81, - "mp_score": 47, - "overall_score": 128, - "sp_rank": 7, - "mp_rank": 6, - "overall_rank": 6 - }, - { - "user_name": "Feirune~", - "avatar_link": "https://avatars.steamstatic.com/fece8c2b7c57f3eecf75897ad86609adefb7ec1a_full.jpg", - "steam_id": "76561198134041367", - "sp_score": 90, - "mp_score": 41, - "overall_score": 131, - "sp_rank": 15, - "mp_rank": 1, - "overall_rank": 7 - }, - { - "user_name": "BiSaXa", - "avatar_link": "https://avatars.steamstatic.com/fa7f64c79b247c8a80cafbd6dd8033b98cc1153c_full.jpg", - "steam_id": "76561198131629989", - "sp_score": 87, - "mp_score": 47, - "overall_score": 134, - "sp_rank": 12, - "mp_rank": 6, - "overall_rank": 8 - }, - { - "user_name": "PerOculos", - "avatar_link": "https://avatars.steamstatic.com/7b00906ac356806bc7bdb3815ea7c1c5b13b65a8_full.jpg", - "steam_id": "76561198003223063", - "sp_score": 84, - "mp_score": 50, - "overall_score": 134, - "sp_rank": 9, - "mp_rank": 9, - "overall_rank": 8 - }, - { - "user_name": "Robotwars1", - "avatar_link": "https://avatars.steamstatic.com/ac4bc6cc73ef75f11690205b123685fd5e3a7823_full.jpg", - "steam_id": "76561198129010912", - "sp_score": 86, - "mp_score": 49, - "overall_score": 135, - "sp_rank": 11, - "mp_rank": 8, - "overall_rank": 9 - }, - { - "user_name": "Zadadaz", - "avatar_link": "https://avatars.steamstatic.com/8c7bed09ce10417502477b6ca29f8257c840cab3_full.jpg", - "steam_id": "76561198451680661", - "sp_score": 92, - "mp_score": 43, - "overall_score": 135, - "sp_rank": 17, - "mp_rank": 2, - "overall_rank": 9 - }, - { - "user_name": "LittleRoi", - "avatar_link": "https://avatars.steamstatic.com/c9180f93ac892fa7d078f5946239d049e987e3b6_full.jpg", - "steam_id": "76561198112477703", - "sp_score": 85, - "mp_score": 50, - "overall_score": 135, - "sp_rank": 10, - "mp_rank": 9, - "overall_rank": 9 - }, - { - "user_name": "TeePeeWee", - "avatar_link": "https://avatars.steamstatic.com/4392a52e384f22c9f77b539eb4b1aa2914880cdf_full.jpg", - "steam_id": "76561199239427541", - "sp_score": 90, - "mp_score": 48, - "overall_score": 138, - "sp_rank": 15, - "mp_rank": 7, - "overall_rank": 10 - }, - { - "user_name": "(MGN)-ZGP-NIKITA", - "avatar_link": "https://avatars.steamstatic.com/8a72e1ed5a29e56c24926ccb33879a544bc67b36_full.jpg", - "steam_id": "76561198076017585", - "sp_score": 91, - "mp_score": 49, - "overall_score": 140, - "sp_rank": 16, - "mp_rank": 8, - "overall_rank": 11 - }, - { - "user_name": "Krzyhau", - "avatar_link": "https://avatars.steamstatic.com/f29de7f41db29526848b52c8942f727b7c70b0db_full.jpg", - "steam_id": "76561198096446735", - "sp_score": 89, - "mp_score": 52, - "overall_score": 141, - "sp_rank": 14, - "mp_rank": 11, - "overall_rank": 12 - }, - { - "user_name": "Linus", - "avatar_link": "https://avatars.steamstatic.com/cfaf6917f47ca6122396f46e485a79a090f29fa0_full.jpg", - "steam_id": "76561198162078579", - "sp_score": 92, - "mp_score": 49, - "overall_score": 141, - "sp_rank": 17, - "mp_rank": 8, - "overall_rank": 12 - }, - { - "user_name": "Confusion_18", - "avatar_link": "https://avatars.steamstatic.com/360236e555049f204b12d3a8685a3b9b9764ebfe_full.jpg", - "steam_id": "76561198386577258", - "sp_score": 91, - "mp_score": 51, - "overall_score": 142, - "sp_rank": 16, - "mp_rank": 10, - "overall_rank": 13 - }, - { - "user_name": "SrRageALot", - "avatar_link": "https://avatars.steamstatic.com/db9c6b6761d63c640456043d864f98f58f62d750_full.jpg", - "steam_id": "76561199156418931", - "sp_score": 89, - "mp_score": 57, - "overall_score": 146, - "sp_rank": 14, - "mp_rank": 16, - "overall_rank": 14 - }, - { - "user_name": "shred", - "avatar_link": "https://avatars.steamstatic.com/0216ce300d00ec193414773679db7dcd77d1cd29_full.jpg", - "steam_id": "76561198025486280", - "sp_score": 88, - "mp_score": 59, - "overall_score": 147, - "sp_rank": 13, - "mp_rank": 18, - "overall_rank": 15 - }, - { - "user_name": "Suola", - "avatar_link": "https://avatars.steamstatic.com/f86dcc2d065a87a603427bb382d26e96c1d61060_full.jpg", - "steam_id": "76561198917972968", - "sp_score": 98, - "mp_score": 50, - "overall_score": 148, - "sp_rank": 22, - "mp_rank": 9, - "overall_rank": 16 - }, - { - "user_name": "マジックサラダ", - "avatar_link": "https://avatars.steamstatic.com/8772186a3ab48712b6eb955a46d269b52ebda706_full.jpg", - "steam_id": "76561198092289827", - "sp_score": 93, - "mp_score": 55, - "overall_score": 148, - "sp_rank": 18, - "mp_rank": 14, - "overall_rank": 16 - }, - { - "user_name": "unity", - "avatar_link": "https://avatars.steamstatic.com/1fcc7701ff71dce31965e10408d79aeb79bdf051_full.jpg", - "steam_id": "76561198081168311", - "sp_score": 96, - "mp_score": 53, - "overall_score": 149, - "sp_rank": 20, - "mp_rank": 12, - "overall_rank": 17 - }, - { - "user_name": "felkelorebel", - "avatar_link": "https://avatars.steamstatic.com/b3745dd64d516fb7ce7072aaad09c93fd99c48f5_full.jpg", - "steam_id": "76561198015394804", - "sp_score": 108, - "mp_score": 43, - "overall_score": 151, - "sp_rank": 31, - "mp_rank": 2, - "overall_rank": 18 - }, - { - "user_name": "cubone", - "avatar_link": "https://avatars.steamstatic.com/e285359230318e5cfb27ed688903c5350cd21075_full.jpg", - "steam_id": "76561198096862334", - "sp_score": 93, - "mp_score": 59, - "overall_score": 152, - "sp_rank": 18, - "mp_rank": 18, - "overall_rank": 19 - }, - { - "user_name": "MrCatMcFly", - "avatar_link": "https://avatars.steamstatic.com/6f89591012f8f0f34cef1ecdb1c10793b0ea4bd1_full.jpg", - "steam_id": "76561198168920589", - "sp_score": 87, - "mp_score": 66, - "overall_score": 153, - "sp_rank": 12, - "mp_rank": 25, - "overall_rank": 20 - }, - { - "user_name": "bob26798", - "avatar_link": "https://avatars.steamstatic.com/cb940cd751f980d8d1374a66118a43f19985a1fa_full.jpg", - "steam_id": "76561198278905764", - "sp_score": 107, - "mp_score": 51, - "overall_score": 158, - "sp_rank": 30, - "mp_rank": 10, - "overall_rank": 21 - }, - { - "user_name": "Extension", - "avatar_link": "https://avatars.steamstatic.com/a647685b273a238928180573feb8135944d2795c_full.jpg", - "steam_id": "76561198174735211", - "sp_score": 108, - "mp_score": 51, - "overall_score": 159, - "sp_rank": 31, - "mp_rank": 10, - "overall_rank": 22 - }, - { - "user_name": "Herneerius", - "avatar_link": "https://avatars.steamstatic.com/4879fa1c72770b2c0eaef341dc6546db13897bb5_full.jpg", - "steam_id": "76561198084978888", - "sp_score": 98, - "mp_score": 61, - "overall_score": 159, - "sp_rank": 22, - "mp_rank": 20, - "overall_rank": 22 - }, - { - "user_name": "Extension", - "avatar_link": "https://avatars.steamstatic.com/dbaf3958fffebf266ce5c04316da744987e9b1fb_full.jpg", - "steam_id": "76561199221334063", - "sp_score": 99, - "mp_score": 61, - "overall_score": 160, - "sp_rank": 23, - "mp_rank": 20, - "overall_rank": 23 - }, - { - "user_name": "Daddy Sparky420", - "avatar_link": "https://avatars.steamstatic.com/14bd5c9bee517058bed74638465e5f68f8ce1d68_full.jpg", - "steam_id": "76561198044110926", - "sp_score": 108, - "mp_score": 52, - "overall_score": 160, - "sp_rank": 31, - "mp_rank": 11, - "overall_rank": 23 - }, - { - "user_name": "Lowengeist", - "avatar_link": "https://avatars.steamstatic.com/4f9a9168c48434a27dfe32d5831ce9fdcfb3ed96_full.jpg", - "steam_id": "76561198122276362", - "sp_score": 110, - "mp_score": 51, - "overall_score": 161, - "sp_rank": 33, - "mp_rank": 10, - "overall_rank": 24 - }, - { - "user_name": "fullheart2", - "avatar_link": "https://avatars.steamstatic.com/1daea993c3be4435d49bc50f7b011d639a08f3c9_full.jpg", - "steam_id": "76561197997838862", - "sp_score": 108, - "mp_score": 53, - "overall_score": 161, - "sp_rank": 31, - "mp_rank": 12, - "overall_rank": 24 - }, - { - "user_name": "Zypeh", - "avatar_link": "https://avatars.steamstatic.com/bfd2b759e7e6300fc709857b9e6db802084544d1_full.jpg", - "steam_id": "76561198039230536", - "sp_score": 106, - "mp_score": 55, - "overall_score": 161, - "sp_rank": 29, - "mp_rank": 14, - "overall_rank": 24 - }, - { - "user_name": "LsDK_", - "avatar_link": "https://avatars.steamstatic.com/4bf97c27bd5824296c0dedd11f5da1b2f0cdb7a5_full.jpg", - "steam_id": "76561198103821970", - "sp_score": 117, - "mp_score": 47, - "overall_score": 164, - "sp_rank": 39, - "mp_rank": 6, - "overall_rank": 25 - }, - { - "user_name": "NeKz", - "avatar_link": "https://avatars.steamstatic.com/9a86e6554aee395b3ac37d96a808335363eb79ff_full.jpg", - "steam_id": "76561198049848090", - "sp_score": 107, - "mp_score": 57, - "overall_score": 164, - "sp_rank": 30, - "mp_rank": 16, - "overall_rank": 25 - }, - { - "user_name": "Burger40", - "avatar_link": "https://avatars.steamstatic.com/00db94cf7b185c69936738b5a827c63d033c6479_full.jpg", - "steam_id": "76561198083196477", - "sp_score": 98, - "mp_score": 66, - "overall_score": 164, - "sp_rank": 22, - "mp_rank": 25, - "overall_rank": 25 - }, - { - "user_name": "Fridge", - "avatar_link": "https://avatars.steamstatic.com/ba9584900b25936d72bd8b7fb028eea0b0d0fa56_full.jpg", - "steam_id": "76561198367132611", - "sp_score": 115, - "mp_score": 51, - "overall_score": 166, - "sp_rank": 38, - "mp_rank": 10, - "overall_rank": 26 - }, - { - "user_name": "Jarool", - "avatar_link": "https://avatars.steamstatic.com/61bb4ee9a8dd6cef5427f2170bb75d3162f3c8e8_full.jpg", - "steam_id": "76561198021055079", - "sp_score": 107, - "mp_score": 59, - "overall_score": 166, - "sp_rank": 30, - "mp_rank": 18, - "overall_rank": 26 - }, - { - "user_name": "Pr0tal", - "avatar_link": "https://avatars.steamstatic.com/ce72799aa2cf4b591df09b3afc715b2259963af7_full.jpg", - "steam_id": "76561198292863694", - "sp_score": 98, - "mp_score": 68, - "overall_score": 166, - "sp_rank": 22, - "mp_rank": 27, - "overall_rank": 26 - }, - { - "user_name": "timurkazz", - "avatar_link": "https://avatars.steamstatic.com/13f6adfa0189055299b1ed69418eec8dd3b5d9eb_full.jpg", - "steam_id": "76561199106449775", - "sp_score": 115, - "mp_score": 53, - "overall_score": 168, - "sp_rank": 38, - "mp_rank": 12, - "overall_rank": 27 - }, - { - "user_name": "Morality", - "avatar_link": "https://avatars.steamstatic.com/2ea3e5885aa789acfc3640788905a414c408edc9_full.jpg", - "steam_id": "76561198799058701", - "sp_score": 115, - "mp_score": 53, - "overall_score": 168, - "sp_rank": 38, - "mp_rank": 12, - "overall_rank": 27 - }, - { - "user_name": "Jess3n", - "avatar_link": "https://avatars.steamstatic.com/1ee47a4ad1a50a4307cde6a9c543b3207942596c_full.jpg", - "steam_id": "76561198870020820", - "sp_score": 112, - "mp_score": 58, - "overall_score": 170, - "sp_rank": 35, - "mp_rank": 17, - "overall_rank": 28 - }, - { - "user_name": "Leve", - "avatar_link": "https://avatars.steamstatic.com/7a56621890546d1a54d4b583198b4d30411950b2_full.jpg", - "steam_id": "76561198902321340", - "sp_score": 111, - "mp_score": 60, - "overall_score": 171, - "sp_rank": 34, - "mp_rank": 19, - "overall_rank": 29 - }, - { - "user_name": "Imagine a cool name", - "avatar_link": "https://avatars.steamstatic.com/ed6186b9c575f4df60c138785c9c004ad9bd4fae_full.jpg", - "steam_id": "76561198869299905", - "sp_score": 101, - "mp_score": 71, - "overall_score": 172, - "sp_rank": 25, - "mp_rank": 30, - "overall_rank": 30 - }, - { - "user_name": "nintendude", - "avatar_link": "https://avatars.steamstatic.com/79d3fe5839617eb83a9661071ed021dd56ac8a5b_full.jpg", - "steam_id": "76561198307085542", - "sp_score": 118, - "mp_score": 54, - "overall_score": 172, - "sp_rank": 40, - "mp_rank": 13, - "overall_rank": 30 - }, - { - "user_name": "Shiro", - "avatar_link": "https://avatars.steamstatic.com/7160e03d7c638627813e5fb993bf921c828b02c2_full.jpg", - "steam_id": "76561198118924124", - "sp_score": 119, - "mp_score": 55, - "overall_score": 174, - "sp_rank": 41, - "mp_rank": 14, - "overall_rank": 31 - }, - { - "user_name": "stip", - "avatar_link": "https://avatars.steamstatic.com/19be8fd7d791a14920566ce35cc2798ecda8a9e4_full.jpg", - "steam_id": "76561198238515424", - "sp_score": 113, - "mp_score": 63, - "overall_score": 176, - "sp_rank": 36, - "mp_rank": 22, - "overall_rank": 32 - }, - { - "user_name": "Snow", - "avatar_link": "https://avatars.steamstatic.com/64b513f2c1f8a490670aa3d004d71b95207035b8_full.jpg", - "steam_id": "76561198842803939", - "sp_score": 121, - "mp_score": 56, - "overall_score": 177, - "sp_rank": 42, - "mp_rank": 15, - "overall_rank": 33 - }, - { - "user_name": "h@iku", - "avatar_link": "https://avatars.steamstatic.com/bfb0f0be647a28135ba306cd2e40c6ece3ca11b2_full.jpg", - "steam_id": "76561198343098423", - "sp_score": 123, - "mp_score": 55, - "overall_score": 178, - "sp_rank": 43, - "mp_rank": 14, - "overall_rank": 34 - }, - { - "user_name": "AMJ", - "avatar_link": "https://avatars.steamstatic.com/43480cfa66f1b35c2098016221a4dc19ed4fab55_full.jpg", - "steam_id": "76561198067936604", - "sp_score": 121, - "mp_score": 57, - "overall_score": 178, - "sp_rank": 42, - "mp_rank": 16, - "overall_rank": 34 - }, - { - "user_name": "Chevalix", - "avatar_link": "https://avatars.steamstatic.com/db8a0073f499823d0fb4ba89ee8716971a321a4e_full.jpg", - "steam_id": "76561198302681368", - "sp_score": 121, - "mp_score": 58, - "overall_score": 179, - "sp_rank": 42, - "mp_rank": 17, - "overall_rank": 35 - }, - { - "user_name": "Yugge", - "avatar_link": "https://avatars.steamstatic.com/dc7c081330432a22b2d44cca2c02285c3ad04813_full.jpg", - "steam_id": "76561198405615224", - "sp_score": 117, - "mp_score": 63, - "overall_score": 180, - "sp_rank": 39, - "mp_rank": 22, - "overall_rank": 36 - }, - { - "user_name": "Kitsune", - "avatar_link": "https://avatars.steamstatic.com/20bd0d2ff33f74c95500c5d11d4b550aa04fe505_full.jpg", - "steam_id": "76561198136477838", - "sp_score": 136, - "mp_score": 48, - "overall_score": 184, - "sp_rank": 56, - "mp_rank": 7, - "overall_rank": 37 - }, - { - "user_name": "ุ", - "avatar_link": "https://avatars.steamstatic.com/b698f81978cd408b5e210f5b5c09d308ae75165b_full.jpg", - "steam_id": "76561198200883819", - "sp_score": 121, - "mp_score": 64, - "overall_score": 185, - "sp_rank": 42, - "mp_rank": 23, - "overall_rank": 38 - }, - { - "user_name": "UrMomPlebLol", - "avatar_link": "https://avatars.steamstatic.com/5b5b9357badc3d9e9ba53d52cf851a85df4a910c_full.jpg", - "steam_id": "76561198371482646", - "sp_score": 112, - "mp_score": 73, - "overall_score": 185, - "sp_rank": 35, - "mp_rank": 32, - "overall_rank": 38 - }, - { - "user_name": "100kitaizzev", - "avatar_link": "https://avatars.steamstatic.com/93c7cb31e2b51e636e308788c7264b70e9756c9d_full.jpg", - "steam_id": "76561198006939388", - "sp_score": 123, - "mp_score": 65, - "overall_score": 188, - "sp_rank": 43, - "mp_rank": 24, - "overall_rank": 39 - }, - { - "user_name": "ThatGoatWhoIsEpic", - "avatar_link": "https://avatars.steamstatic.com/5049e37e3b511134a4a1b8359a8103348c09ff17_full.jpg", - "steam_id": "76561198074525881", - "sp_score": 117, - "mp_score": 72, - "overall_score": 189, - "sp_rank": 39, - "mp_rank": 31, - "overall_rank": 40 - }, - { - "user_name": "Soulfur", - "avatar_link": "https://avatars.steamstatic.com/af59571446fe62756d619b9e42a82c432390ccf0_full.jpg", - "steam_id": "76561198181126266", - "sp_score": 135, - "mp_score": 56, - "overall_score": 191, - "sp_rank": 55, - "mp_rank": 15, - "overall_rank": 41 - }, - { - "user_name": "Throw", - "avatar_link": "https://avatars.steamstatic.com/2c01a87d1b0789f7bdd1f3e693ef9987e49abe01_full.jpg", - "steam_id": "76561198952505877", - "sp_score": 115, - "mp_score": 78, - "overall_score": 193, - "sp_rank": 38, - "mp_rank": 36, - "overall_rank": 42 - }, - { - "user_name": "Myhr", - "avatar_link": "https://avatars.steamstatic.com/deec440da6c13c8fa72f003d8396c15d6238c89e_full.jpg", - "steam_id": "76561198054566481", - "sp_score": 141, - "mp_score": 52, - "overall_score": 193, - "sp_rank": 61, - "mp_rank": 11, - "overall_rank": 42 - }, - { - "user_name": "Fyrestorm", - "avatar_link": "https://avatars.steamstatic.com/c0c82fa70c986348caaaea71f3ccac1b13c0c4eb_full.jpg", - "steam_id": "76561198035761863", - "sp_score": 142, - "mp_score": 55, - "overall_score": 197, - "sp_rank": 62, - "mp_rank": 14, - "overall_rank": 43 - }, - { - "user_name": "Turmoil", - "avatar_link": "https://avatars.steamstatic.com/ceeb79bfd441b1928af34195dfde660b44f002dd_full.jpg", - "steam_id": "76561197997770103", - "sp_score": 142, - "mp_score": 57, - "overall_score": 199, - "sp_rank": 62, - "mp_rank": 16, - "overall_rank": 44 - }, - { - "user_name": "Tenacite the MAD Milshake", - "avatar_link": "https://avatars.steamstatic.com/dc22cc282f8bd43f3efde936b7263130f09358b8_full.jpg", - "steam_id": "76561198389681125", - "sp_score": 152, - "mp_score": 49, - "overall_score": 201, - "sp_rank": 69, - "mp_rank": 8, - "overall_rank": 45 - }, - { - "user_name": "Blenderiste09", - "avatar_link": "https://avatars.steamstatic.com/79d3fe5839617eb83a9661071ed021dd56ac8a5b_full.jpg", - "steam_id": "76561198251755710", - "sp_score": 145, - "mp_score": 56, - "overall_score": 201, - "sp_rank": 65, - "mp_rank": 15, - "overall_rank": 45 - }, - { - "user_name": "laredeshot", - "avatar_link": "https://avatars.steamstatic.com/8ffb58e0cddad5293c48250deb458f428b9f6736_full.jpg", - "steam_id": "76561198261656551", - "sp_score": 149, - "mp_score": 56, - "overall_score": 205, - "sp_rank": 67, - "mp_rank": 15, - "overall_rank": 46 - }, - { - "user_name": "savvydruid", - "avatar_link": "https://avatars.steamstatic.com/687d290c9238b42a790216892cc21f718741bd83_full.jpg", - "steam_id": "76561199013726692", - "sp_score": 157, - "mp_score": 53, - "overall_score": 210, - "sp_rank": 74, - "mp_rank": 12, - "overall_rank": 47 - }, - { - "user_name": "Schwi", - "avatar_link": "https://avatars.steamstatic.com/a5ab762db09205fc49a6fa8fd1d09daafc3ac6e4_full.jpg", - "steam_id": "76561198384377251", - "sp_score": 147, - "mp_score": 69, - "overall_score": 216, - "sp_rank": 66, - "mp_rank": 28, - "overall_rank": 48 - }, - { - "user_name": "1 Portal SWAG", - "avatar_link": "https://avatars.steamstatic.com/8766c163ce9fd7a584c5347dab0a6a49766102e8_full.jpg", - "steam_id": "76561198253811824", - "sp_score": 137, - "mp_score": 82, - "overall_score": 219, - "sp_rank": 57, - "mp_rank": 39, - "overall_rank": 49 - }, - { - "user_name": "Lathil", - "avatar_link": "https://avatars.steamstatic.com/6636331f0f7d69a2ef6557a124ae4a3389466047_full.jpg", - "steam_id": "76561198404861950", - "sp_score": 165, - "mp_score": 59, - "overall_score": 224, - "sp_rank": 79, - "mp_rank": 18, - "overall_rank": 50 - }, - { - "user_name": "badger", - "avatar_link": "https://avatars.steamstatic.com/cbea4cfe87dab41ed9d2b53be876110b98e4111a_full.jpg", - "steam_id": "76561198861024091", - "sp_score": 135, - "mp_score": 89, - "overall_score": 224, - "sp_rank": 55, - "mp_rank": 43, - "overall_rank": 50 - }, - { - "user_name": "MegaWaTT", - "avatar_link": "https://avatars.steamstatic.com/ed56d8fc9c49a77d3f8c8bd6cc3efa72e714b54d_full.jpg", - "steam_id": "76561198363863187", - "sp_score": 137, - "mp_score": 92, - "overall_score": 229, - "sp_rank": 57, - "mp_rank": 45, - "overall_rank": 51 - }, - { - "user_name": "Spyrunite", - "avatar_link": "https://avatars.steamstatic.com/184e99f06e36b81346214c37f6b448f4d71fcb8b_full.jpg", - "steam_id": "76561198026851335", - "sp_score": 132, - "mp_score": 98, - "overall_score": 230, - "sp_rank": 52, - "mp_rank": 50, - "overall_rank": 52 - }, - { - "user_name": "Saxton Hale", - "avatar_link": "https://avatars.steamstatic.com/2f335962fbb8431ea3f5606fe3e1881dce47e63a_full.jpg", - "steam_id": "76561197998253566", - "sp_score": 155, - "mp_score": 75, - "overall_score": 230, - "sp_rank": 72, - "mp_rank": 34, - "overall_rank": 52 - }, - { - "user_name": "XTLmaker", - "avatar_link": "https://avatars.steamstatic.com/b3c041f3eb316e0edf16e6ba36f426b433e16cee_full.jpg", - "steam_id": "76561199032030834", - "sp_score": 134, - "mp_score": 97, - "overall_score": 231, - "sp_rank": 54, - "mp_rank": 49, - "overall_rank": 53 - }, - { - "user_name": "wol", - "avatar_link": "https://avatars.steamstatic.com/689a4b1be66db3f28a1567c7b1bb7e8e2d1e1d90_full.jpg", - "steam_id": "76561199007976762", - "sp_score": 177, - "mp_score": 57, - "overall_score": 234, - "sp_rank": 84, - "mp_rank": 16, - "overall_rank": 54 - }, - { - "user_name": "SilentiumGradas", - "avatar_link": "https://avatars.steamstatic.com/b26b46bc2dd6efece8b6cbcff8ba263801b5b6dc_full.jpg", - "steam_id": "76561199006050430", - "sp_score": 142, - "mp_score": 101, - "overall_score": 243, - "sp_rank": 62, - "mp_rank": 51, - "overall_rank": 55 - }, - { - "user_name": "ki4rakaM [RUS]", - "avatar_link": "https://avatars.steamstatic.com/cae7d5a1e4b04f70dc0c1599d932edb423e65870_full.jpg", - "steam_id": "76561198227911092", - "sp_score": 157, - "mp_score": 89, - "overall_score": 246, - "sp_rank": 74, - "mp_rank": 43, - "overall_rank": 56 - }, - { - "user_name": "Imanex", - "avatar_link": "https://avatars.steamstatic.com/82d1ac52aeddb7f08eb0f85d4f7d96160af30bb9_full.jpg", - "steam_id": "76561197974616889", - "sp_score": 169, - "mp_score": 82, - "overall_score": 251, - "sp_rank": 81, - "mp_rank": 39, - "overall_rank": 57 - }, - { - "user_name": "Betsruner", - "avatar_link": "https://avatars.steamstatic.com/6e5b5f43361149652d556073c34a4c3bd5c56df2_full.jpg", - "steam_id": "76561198048179892", - "sp_score": 153, - "mp_score": 113, - "overall_score": 266, - "sp_rank": 70, - "mp_rank": 57, - "overall_rank": 58 - }, - { - "user_name": "Schlepian", - "avatar_link": "https://avatars.steamstatic.com/f7be9949784d7864c619a72e0bec1138a14933ff_full.jpg", - "steam_id": "76561198021734854", - "sp_score": 161, - "mp_score": 105, - "overall_score": 266, - "sp_rank": 76, - "mp_rank": 52, - "overall_rank": 58 - }, - { - "user_name": "Schlay", - "avatar_link": "https://avatars.steamstatic.com/1c81f34080417cab9a836c003e5c319229e528f9_full.jpg", - "steam_id": "76561198042995537", - "sp_score": 170, - "mp_score": 108, - "overall_score": 278, - "sp_rank": 82, - "mp_rank": 53, - "overall_rank": 59 - }, - { - "user_name": "¯\\_(ツ)_/¯", - "avatar_link": "https://avatars.steamstatic.com/fb9c36c36e54b8ca5f2e1cbd89c06574d1348af0_full.jpg", - "steam_id": "76561198001523094", - "sp_score": 175, - "mp_score": 127, - "overall_score": 302, - "sp_rank": 83, - "mp_rank": 64, - "overall_rank": 60 - }, - { - "user_name": "lampishboi", - "avatar_link": "https://avatars.steamstatic.com/22bc948278437707cf69cc70a153f8363c95bccf_full.jpg", - "steam_id": "76561198994808916", - "sp_score": 131, - "mp_score": 199, - "overall_score": 330, - "sp_rank": 51, - "mp_rank": 81, - "overall_rank": 61 - }, - { - "user_name": "『 Jonese1234 』", - "avatar_link": "https://avatars.steamstatic.com/9f6de098624a8f81ba6d2318e1923bdda1c710d6_full.jpg", - "steam_id": "76561198045074889", - "sp_score": 157, - "mp_score": 206, - "overall_score": 363, - "sp_rank": 74, - "mp_rank": 85, - "overall_rank": 62 - }, - { - "user_name": "Potatoes", - "avatar_link": "https://avatars.steamstatic.com/94821c98d19e5eda6ec315289aa28b191084f301_full.jpg", - "steam_id": "76561197974561284", - "sp_score": 248, - "mp_score": 209, - "overall_score": 457, - "sp_rank": 89, - "mp_rank": 88, - "overall_rank": 63 - } - ] - } -} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a02779b..bdd3adc 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { Routes, Route } from "react-router-dom"; +import { Helmet } from "react-helmet"; import { UserProfile } from '@customTypes/Profile'; import Sidebar from './components/Sidebar'; @@ -68,6 +69,10 @@ const App: React.FC = () => { return ( <> + + LPHUB + + { setUploadRunDialog(false); if (updateProfile) { diff --git a/frontend/src/pages/About.tsx b/frontend/src/pages/About.tsx index ded3461..a8b7826 100644 --- a/frontend/src/pages/About.tsx +++ b/frontend/src/pages/About.tsx @@ -1,5 +1,6 @@ import React from 'react'; import ReactMarkdown from 'react-markdown'; +import { Helmet } from 'react-helmet'; import '@css/About.css'; @@ -28,6 +29,9 @@ const About: React.FC = () => { return (
+ + LPHUB | About + {aboutText}
); diff --git a/frontend/src/pages/Games.tsx b/frontend/src/pages/Games.tsx index 15105c9..15cc891 100644 --- a/frontend/src/pages/Games.tsx +++ b/frontend/src/pages/Games.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { Helmet } from 'react-helmet'; import GameEntry from '@components/GameEntry'; import { Game } from '@customTypes/Game'; @@ -11,10 +12,10 @@ interface GamesProps { const Games: React.FC = ({ games }) => { const _page_load = () => { - const loaders = document.querySelectorAll(".loader"); - loaders.forEach((loader) => { - (loader as HTMLElement).style.display = "none"; - }); + const loaders = document.querySelectorAll(".loader"); + loaders.forEach((loader) => { + (loader as HTMLElement).style.display = "none"; + }); } React.useEffect(() => { @@ -26,6 +27,9 @@ const Games: React.FC = ({ games }) => { return (
+ + LPHUB | Games +
diff --git a/frontend/src/pages/Homepage.tsx b/frontend/src/pages/Homepage.tsx index 68562b6..4f46af5 100644 --- a/frontend/src/pages/Homepage.tsx +++ b/frontend/src/pages/Homepage.tsx @@ -1,11 +1,15 @@ import React from 'react'; +import { Helmet } from 'react-helmet'; const Homepage: React.FC = () => { return (
+ + LPHUB | Homepage +
-

+

Welcome to Least Portals Hub!

At the moment, LPHUB is in beta state. This means that the site has only the core functionalities enabled for providing both collaborative information and competitive leaderboards.

The website should feel intuitive to navigate around. For any type of feedback, reach us at LPHUB Discord server.

diff --git a/frontend/src/pages/Maplist.tsx b/frontend/src/pages/Maplist.tsx index 8fc52b0..04938cf 100644 --- a/frontend/src/pages/Maplist.tsx +++ b/frontend/src/pages/Maplist.tsx @@ -1,5 +1,6 @@ import React, { useEffect } from "react"; import { Link, useLocation, useNavigate, useParams } from "react-router-dom"; +import { Helmet } from "react-helmet"; import "@css/Maplist.css"; import { API } from "@api/Api"; @@ -25,9 +26,9 @@ const Maplist: React.FC = () => { const navigate = useNavigate(); function _update_currently_selected(catNum2: number) { - setCurrentlySelected(catNum2); - navigate("/games/" + game?.id + "?cat=" + catNum2); - setHasClicked(true); + setCurrentlySelected(catNum2); + navigate("/games/" + game?.id + "?cat=" + catNum2); + setHasClicked(true); } const _fetch_chapters = async (chapter_id: string) => { @@ -52,12 +53,12 @@ const Maplist: React.FC = () => { // location query params const queryParams = new URLSearchParams(location.search); if (queryParams.get("chapter")) { - let cat = parseFloat(queryParams.get("chapter") || ""); - if (gameId == 2) { - cat += 10; - } - _fetch_chapters(cat.toString()); - } + let cat = parseFloat(queryParams.get("chapter") || ""); + if (gameId == 2) { + cat += 10; + } + _fetch_chapters(cat.toString()); + } const _fetch_game = async () => { const games = await API.get_games(); @@ -68,7 +69,7 @@ const Maplist: React.FC = () => { setLoad(false); } }; - + const _fetch_game_chapters = async () => { const games_chapters = await API.get_games_chapters(gameId.toString()); setGameChapters(games_chapters); @@ -81,7 +82,7 @@ const Maplist: React.FC = () => { }, []); useEffect(() => { - const queryParams = new URLSearchParams(location.search); + const queryParams = new URLSearchParams(location.search); if (gameChapters != undefined && !queryParams.get("chapter")) { _fetch_chapters(gameChapters!.chapters[0].id.toString()); } @@ -91,6 +92,9 @@ const Maplist: React.FC = () => { return (
+ + LPHUB | Maplist +
{game?.category_portals.map((cat, index) => ( - ))} @@ -132,26 +136,26 @@ const Maplist: React.FC = () => {
- {curChapter?.chapter.name.split(" - ")[0]} + {curChapter?.chapter.name.split(" - ")[0]}
{curChapter?.chapter.name.split(" - ")[1]}
-
+
{gameChapters?.chapters.map((chapter, i) => { - return
{_fetch_chapters(chapter.id.toString()); _handle_dropdown_click()}}>{chapter.name}
+ return
{ _fetch_chapters(chapter.id.toString()); _handle_dropdown_click() }}>{chapter.name}
}) }
- {curChapter?.maps.map((map, i) => { - return
- + {curChapter?.maps.map((map, i) => { + return
+ {map.name} -
+
{map.is_disabled ? map.category_portals[0].portal_count : map.category_portals.find( (obj) => obj.category.id === catNum + 1 @@ -169,9 +173,9 @@ const Maplist: React.FC = () => {
- -
- })} + +
+ })}
diff --git a/frontend/src/pages/Maps.tsx b/frontend/src/pages/Maps.tsx index f73e8d2..fb13563 100644 --- a/frontend/src/pages/Maps.tsx +++ b/frontend/src/pages/Maps.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { Link, useLocation } from 'react-router-dom'; +import { Helmet } from 'react-helmet'; import { PortalIcon, FlagIcon, ChatIcon } from '@images/Images'; import Summary from '@components/Summary'; @@ -53,26 +54,32 @@ const Maps: React.FC = ({ token, isModerator }) => { if (!mapSummaryData) { // loading placeholder return ( -
-
-
- -
-
- -
- - - -
- -
-
+ <> +
+
+
+ +
+
+ +
+ + + +
+ +
+
+ ); } return ( <> + + LPHUB | {mapSummaryData.map.map_name} + + {isModerator && }
diff --git a/frontend/src/pages/Profile.tsx b/frontend/src/pages/Profile.tsx index 63b3c13..48233bf 100644 --- a/frontend/src/pages/Profile.tsx +++ b/frontend/src/pages/Profile.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { Link, useNavigate } from 'react-router-dom'; +import { Helmet } from 'react-helmet'; import { SteamIcon, TwitchIcon, YouTubeIcon, PortalIcon, FlagIcon, StatisticsIcon, SortIcon, ThreedotIcon, DownloadIcon, HistoryIcon, DeleteIcon } from '@images/Images'; import { UserProfile } from '@customTypes/Profile'; @@ -109,6 +110,10 @@ const Profile: React.FC = ({ profile, token, gameData, onDeleteRec return (
+ + LPHUB | {profile.user_name} + + {MessageDialogComponent} {MessageDialogLoadComponent} {ConfirmDialogComponent} diff --git a/frontend/src/pages/Rankings.tsx b/frontend/src/pages/Rankings.tsx index cdb87a8..71aa427 100644 --- a/frontend/src/pages/Rankings.tsx +++ b/frontend/src/pages/Rankings.tsx @@ -1,4 +1,5 @@ import React, { useEffect } from "react"; +import { Helmet } from "react-helmet"; import RankingEntry from "@components/RankingEntry"; import { Ranking, SteamRanking, RankingType, SteamRankingType } from "@customTypes/Ranking"; @@ -13,9 +14,9 @@ const Rankings: React.FC = () => { official, unofficial } - const [currentRankingType, setCurrentRankingType] = React.useState(LeaderboardTypes.official); + const [currentRankingType, setCurrentRankingType] = React.useState(LeaderboardTypes.official); - const [leaderboardLoad, setLeaderboardLoad] = React.useState(false); + const [leaderboardLoad, setLeaderboardLoad] = React.useState(false); enum RankingCategories { rankings_overall, @@ -26,7 +27,7 @@ const Rankings: React.FC = () => { const [load, setLoad] = React.useState(false); const _fetch_rankings = async () => { - setLeaderboardLoad(false); + setLeaderboardLoad(false); const rankings = await API.get_official_rankings(); setLeaderboardData(rankings); if (currentLeaderboardType == RankingCategories.rankings_singleplayer) { @@ -37,12 +38,12 @@ const Rankings: React.FC = () => { setCurrentLeaderboard(rankings.rankings_overall) } setLoad(true); - setLeaderboardLoad(true); + setLeaderboardLoad(true); } const __dev_fetch_unofficial_rankings = async () => { try { - setLeaderboardLoad(false); + setLeaderboardLoad(false); const rankings = await API.get_unofficial_rankings(); setLeaderboardData(rankings); if (currentLeaderboardType == RankingCategories.rankings_singleplayer) { @@ -53,7 +54,7 @@ const Rankings: React.FC = () => { } else { setCurrentLeaderboard(rankings.rankings_overall) } - setLeaderboardLoad(true); + setLeaderboardLoad(true); } catch (e) { console.log(e) } @@ -88,12 +89,15 @@ const Rankings: React.FC = () => { return (
+ + LPHUB | Rankings +
- -
@@ -128,11 +132,11 @@ const Rankings: React.FC = () => { }) } - {leaderboardLoad ? null : -
- -
- } + {leaderboardLoad ? null : +
+ +
+ }
: null} diff --git a/frontend/src/pages/Rules.tsx b/frontend/src/pages/Rules.tsx index b5625ce..9f57b7e 100644 --- a/frontend/src/pages/Rules.tsx +++ b/frontend/src/pages/Rules.tsx @@ -1,5 +1,6 @@ import React from 'react'; import ReactMarkdown from 'react-markdown'; +import { Helmet } from 'react-helmet'; import '@css/Rules.css'; @@ -29,6 +30,9 @@ const Rules: React.FC = () => { return (
+ + LPHUB | Rules + {rulesText}
); diff --git a/frontend/src/pages/User.tsx b/frontend/src/pages/User.tsx index 938dbd5..d43c0c6 100644 --- a/frontend/src/pages/User.tsx +++ b/frontend/src/pages/User.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { Link, useLocation, useNavigate } from 'react-router-dom'; +import { Helmet } from 'react-helmet'; import { SteamIcon, TwitchIcon, YouTubeIcon, PortalIcon, FlagIcon, StatisticsIcon, SortIcon, ThreedotIcon, DownloadIcon, HistoryIcon } from '@images/Images'; import { UserProfile } from '@customTypes/Profile'; @@ -92,6 +93,10 @@ const User: React.FC = ({ token, profile, gameData }) => { return (
+ + LPHUB | {user.user_name} + + {MessageDialogComponent}
-- cgit v1.2.3 From e329da571b7cc5178ea210dd109f37b3ebf83ee2 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:02:21 +0000 Subject: feat/rankings: add catapults 3 wr, handle err (#265) --- rankings/fetch.go | 51 ++++++++++++++++++++++++++++++++------------- rankings/input/records.json | 2 +- rankings/main.go | 5 ++++- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/rankings/fetch.go b/rankings/fetch.go index 7e63427..76a3526 100644 --- a/rankings/fetch.go +++ b/rankings/fetch.go @@ -3,6 +3,7 @@ package main import ( "encoding/json" "encoding/xml" + "errors" "fmt" "io" "log" @@ -12,16 +13,25 @@ import ( "strings" ) -func fetchLeaderboard(records []Record, overrides map[SteamID]map[string]int, useCache bool) map[SteamID]*Player { +var ( + errLb error = errors.New("leaderboards error") + errPi error = errors.New("playerinfo error") +) + +func fetchLeaderboard(records []Record, overrides map[SteamID]map[string]int, useCache bool) (map[SteamID]*Player, error) { log.Println("fetching leaderboard") players := map[SteamID]*Player{} // first init players map with records from portal gun and doors + return nil, errLb fetchAnotherPage := true start := 0 end := 5000 for fetchAnotherPage { - portalGunEntries := fetchRecordsFromMap(47459, 0, 5000, useCache) + portalGunEntries, err := fetchRecordsFromMap(47459, 0, 5000, useCache) + if err != nil { + return nil, err + } fetchAnotherPage = portalGunEntries.needsAnotherPage(&records[0]) if fetchAnotherPage { start = end + 1 @@ -50,7 +60,10 @@ func fetchLeaderboard(records []Record, overrides map[SteamID]map[string]int, us end = 5000 for fetchAnotherPage { - doorsEntries := fetchRecordsFromMap(47740, start, end, useCache) + doorsEntries, err := fetchRecordsFromMap(47740, start, end, useCache) + if err != nil { + return nil, err + } fetchAnotherPage = doorsEntries.needsAnotherPage(&records[51]) if fetchAnotherPage { start = end + 1 @@ -94,7 +107,10 @@ func fetchLeaderboard(records []Record, overrides map[SteamID]map[string]int, us end := 5000 for fetchAnotherPage { - entries := fetchRecordsFromMap(record.MapID, start, end, useCache) + entries, err := fetchRecordsFromMap(record.MapID, start, end, useCache) + if err != nil { + return nil, err + } fetchAnotherPage = entries.needsAnotherPage(&record) if fetchAnotherPage { start = end + 1 @@ -137,10 +153,10 @@ func fetchLeaderboard(records []Record, overrides map[SteamID]map[string]int, us } } - return players + return players, nil } -func fetchRecordsFromMap(mapID int, start int, end int, useCache bool) *Leaderboard { +func fetchRecordsFromMap(mapID int, start int, end int, useCache bool) (*Leaderboard, error) { var filename string if useCache { filename := fmt.Sprintf("./cache/lb_%d_%d_%d.xml", mapID, start, end) @@ -152,25 +168,27 @@ func fetchRecordsFromMap(mapID int, start int, end int, useCache bool) *Leaderbo if err != nil { log.Fatalln("failed to unmarshal cache.", err.Error()) } - return &leaderboard + return &leaderboard, nil } } url := fmt.Sprintf("https://steamcommunity.com/stats/Portal2/leaderboards/%d?xml=1&start=%d&end=%d", mapID, start, end) resp, err := http.Get(url) - log.Println("fetched", url, ":", resp.StatusCode) if err != nil { - log.Fatalln("failed to fetch leaderboard.", err.Error()) + log.Println("failed to fetch leaderboard.", err.Error()) + return nil, errLb } respBytes, err := io.ReadAll(resp.Body) if err != nil { - log.Fatalln("failed to read leadeboard body.", err.Error()) + log.Println("failed to read leadeboard body.", err.Error()) + return nil, errLb } leaderboard := Leaderboard{} err = xml.Unmarshal(respBytes, &leaderboard) if err != nil { log.Println(string(respBytes)) - log.Fatalln("failed to unmarshal leaderboard.", err.Error()) + log.Println("failed to unmarshal leaderboard.", err.Error()) + return nil, errLb } if useCache { @@ -179,10 +197,10 @@ func fetchRecordsFromMap(mapID int, start int, end int, useCache bool) *Leaderbo } } - return &leaderboard + return &leaderboard, nil } -func fetchPlayerInfo(players []*Player) { +func fetchPlayerInfo(players []*Player) error { log.Println("fetching info for", len(players), "players") ids := make([]string, len(players)) @@ -193,11 +211,13 @@ func fetchPlayerInfo(players []*Player) { url := fmt.Sprintf("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v2/?key=%s&steamids=%s", os.Getenv("API_KEY"), strings.Join(ids, ",")) resp, err := http.Get(url) if err != nil { - log.Fatalln(err.Error()) + log.Println(err.Error()) + return errPi } body, err := io.ReadAll(resp.Body) if err != nil { - log.Fatalln(err.Error()) + log.Println(err.Error()) + return errPi } type PlayerSummary struct { SteamID SteamID `json:"steamid"` @@ -223,4 +243,5 @@ func fetchPlayerInfo(players []*Player) { } } } + return nil } diff --git a/rankings/input/records.json b/rankings/input/records.json index d960004..2b1fb21 100644 --- a/rankings/input/records.json +++ b/rankings/input/records.json @@ -377,7 +377,7 @@ "id": 47839, "name": "Catapults", "mode": 2, - "wr": 4 + "wr": 3 }, { "id": 47842, diff --git a/rankings/main.go b/rankings/main.go index 552f058..928d3be 100644 --- a/rankings/main.go +++ b/rankings/main.go @@ -58,7 +58,10 @@ func run() { overrides := readOverrides() log.Println("loaded", len(overrides), "player overrides") - players := fetchLeaderboard(records, overrides, useCache) + players, err := fetchLeaderboard(records, overrides, useCache) + if err != nil { + return + } spRankings := []*Player{} mpRankings := []*Player{} -- cgit v1.2.3 From 22547464f756f3620dd1d92bcd249cb7608ca04a Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:31:34 +0000 Subject: feat/backend: basic map difficulty ratings (#266) --- backend/handlers/map.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/handlers/map.go b/backend/handlers/map.go index b2a0b91..e1e6897 100644 --- a/backend/handlers/map.go +++ b/backend/handlers/map.go @@ -492,6 +492,7 @@ func FetchMaps(c *gin.Context) { m.id, m.name, m.is_disabled, + m.difficulty, m.image, cat.id, cat.name, @@ -529,7 +530,7 @@ func FetchMaps(c *gin.Context) { for rows.Next() { var mapShort models.MapSelect var categoryPortal models.CategoryPortal - if err := rows.Scan(&mapShort.ID, &mapShort.Name, &mapShort.IsDisabled, &mapShort.Image, &categoryPortal.Category.ID, &categoryPortal.Category.Name, &categoryPortal.PortalCount); err != nil { + if err := rows.Scan(&mapShort.ID, &mapShort.Name, &mapShort.IsDisabled, &mapShort.Difficulty, &mapShort.Image, &categoryPortal.Category.ID, &categoryPortal.Category.Name, &categoryPortal.PortalCount); err != nil { c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) return } @@ -571,6 +572,7 @@ func FetchChapterMaps(c *gin.Context) { m.name AS map_name, c.name AS chapter_name, m.is_disabled, + m.difficulty, m.image, cat.id, cat.name, @@ -610,7 +612,7 @@ func FetchChapterMaps(c *gin.Context) { for rows.Next() { var mapShort models.MapSelect var categoryPortal models.CategoryPortal - if err := rows.Scan(&mapShort.ID, &mapShort.Name, &chapterName, &mapShort.IsDisabled, &mapShort.Image, &categoryPortal.Category.ID, &categoryPortal.Category.Name, &categoryPortal.PortalCount); err != nil { + if err := rows.Scan(&mapShort.ID, &mapShort.Name, &chapterName, &mapShort.IsDisabled, &mapShort.Difficulty, &mapShort.Image, &categoryPortal.Category.ID, &categoryPortal.Category.Name, &categoryPortal.PortalCount); err != nil { c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) return } -- cgit v1.2.3 From 6a163167c81689f07e76e7ff9ab7449f88ca0ea4 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:38:58 +0000 Subject: feat/frontend: adjust difficulty to 1-10 scale (#268) --- frontend/src/components/Summary.tsx | 21 ++++++++++----------- frontend/src/pages/Maplist.tsx | 2 +- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/Summary.tsx b/frontend/src/components/Summary.tsx index 4bcaa6a..2fec182 100644 --- a/frontend/src/components/Summary.tsx +++ b/frontend/src/components/Summary.tsx @@ -140,18 +140,17 @@ const Summary: React.FC = ({ selectedRun, setSelectedRun, data })
Difficulty - {data.summary.routes[selectedRun].rating === 0 && (N/A)} - {data.summary.routes[selectedRun].rating === 1 && (Very easy)} - {data.summary.routes[selectedRun].rating === 2 && (Easy)} - {data.summary.routes[selectedRun].rating === 3 && (Medium)} - {data.summary.routes[selectedRun].rating === 4 && (Hard)} - {data.summary.routes[selectedRun].rating === 5 && (Very hard)} + {data.summary.routes[selectedRun].rating <= 2 && (Very easy)} + {data.summary.routes[selectedRun].rating <= 4 && (Easy)} + {data.summary.routes[selectedRun].rating <= 6 && (Medium)} + {data.summary.routes[selectedRun].rating <= 8 && (Hard)} + {data.summary.routes[selectedRun].rating <= 10 && (Very hard)}
- {data.summary.routes[selectedRun].rating === 1 ? (
) : (
)} - {data.summary.routes[selectedRun].rating === 2 ? (
) : (
)} - {data.summary.routes[selectedRun].rating === 3 ? (
) : (
)} - {data.summary.routes[selectedRun].rating === 4 ? (
) : (
)} - {data.summary.routes[selectedRun].rating === 5 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 2 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 4 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 6 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 8 ? (
) : (
)} + {data.summary.routes[selectedRun].rating <= 10 ? (
) : (
)}
diff --git a/frontend/src/pages/Maplist.tsx b/frontend/src/pages/Maplist.tsx index 04938cf..76f9a52 100644 --- a/frontend/src/pages/Maplist.tsx +++ b/frontend/src/pages/Maplist.tsx @@ -165,7 +165,7 @@ const Maplist: React.FC = () => {
{/* Difficulty: */} -
+
-- cgit v1.2.3 From 1dd2591557d255b4262867a0aa92b492ea65e336 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:49:14 +0000 Subject: fix/frontend: broken summary difficulty (#270) --- frontend/src/components/Summary.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/src/components/Summary.tsx b/frontend/src/components/Summary.tsx index 2fec182..1df6a78 100644 --- a/frontend/src/components/Summary.tsx +++ b/frontend/src/components/Summary.tsx @@ -141,16 +141,16 @@ const Summary: React.FC = ({ selectedRun, setSelectedRun, data })
Difficulty {data.summary.routes[selectedRun].rating <= 2 && (Very easy)} - {data.summary.routes[selectedRun].rating <= 4 && (Easy)} - {data.summary.routes[selectedRun].rating <= 6 && (Medium)} - {data.summary.routes[selectedRun].rating <= 8 && (Hard)} - {data.summary.routes[selectedRun].rating <= 10 && (Very hard)} + {data.summary.routes[selectedRun].rating > 2 && data.summary.routes[selectedRun].rating <= 4 && (Easy)} + {data.summary.routes[selectedRun].rating > 4 && data.summary.routes[selectedRun].rating <= 6 && (Medium)} + {data.summary.routes[selectedRun].rating > 6 && data.summary.routes[selectedRun].rating <= 8 && (Hard)} + {data.summary.routes[selectedRun].rating > 8 && data.summary.routes[selectedRun].rating <= 10 && (Very hard)}
{data.summary.routes[selectedRun].rating <= 2 ? (
) : (
)} - {data.summary.routes[selectedRun].rating <= 4 ? (
) : (
)} - {data.summary.routes[selectedRun].rating <= 6 ? (
) : (
)} - {data.summary.routes[selectedRun].rating <= 8 ? (
) : (
)} - {data.summary.routes[selectedRun].rating <= 10 ? (
) : (
)} + {data.summary.routes[selectedRun].rating > 2 && data.summary.routes[selectedRun].rating <= 4 ? (
) : (
)} + {data.summary.routes[selectedRun].rating > 4 && data.summary.routes[selectedRun].rating <= 6 ? (
) : (
)} + {data.summary.routes[selectedRun].rating > 6 && data.summary.routes[selectedRun].rating <= 8 ? (
) : (
)} + {data.summary.routes[selectedRun].rating > 8 && data.summary.routes[selectedRun].rating <= 10 ? (
) : (
)}
-- cgit v1.2.3 From d221c8a770fa0d01fc191e88b2fda8d7d0faa049 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:53:30 +0000 Subject: feat/backend: send map difficulty in summary (#271) --- backend/handlers/map.go | 4 ++-- backend/models/models.go | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/handlers/map.go b/backend/handlers/map.go index e1e6897..9cb0bcc 100644 --- a/backend/handlers/map.go +++ b/backend/handlers/map.go @@ -77,12 +77,12 @@ func FetchMapSummary(c *gin.Context) { } // Get map data response.Map.ID = intID - sql := `SELECT m.id, g.name, c.name, m.name, m.image, g.is_coop, m.is_disabled + sql := `SELECT m.id, g.name, c.name, m.name, m.image, g.is_coop, m.is_disabled, m.difficulty FROM maps m INNER JOIN games g ON m.game_id = g.id INNER JOIN chapters c ON m.chapter_id = c.id WHERE m.id = $1` - err = database.DB.QueryRow(sql, id).Scan(&response.Map.ID, &response.Map.GameName, &response.Map.ChapterName, &response.Map.MapName, &response.Map.Image, &response.Map.IsCoop, &response.Map.IsDisabled) + err = database.DB.QueryRow(sql, id).Scan(&response.Map.ID, &response.Map.GameName, &response.Map.ChapterName, &response.Map.MapName, &response.Map.Image, &response.Map.IsCoop, &response.Map.IsDisabled, &response.Map.Difficulty) if err != nil { c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) return diff --git a/backend/models/models.go b/backend/models/models.go index a114f2c..3c38131 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -47,6 +47,7 @@ type Map struct { Image string `json:"image"` IsCoop bool `json:"is_coop"` IsDisabled bool `json:"is_disabled"` + Difficulty int `json:"difficulty"` } type MapShort struct { -- cgit v1.2.3 From ae32e264b668a46e138a64a2d8a8d4c662e990ea Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:57:50 +0000 Subject: fix/frontend: broken summary difficulty v2 (#272) --- frontend/src/components/Summary.tsx | 17 ++++++++++++++++- frontend/src/types/Map.ts | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/Summary.tsx b/frontend/src/components/Summary.tsx index 1df6a78..7da2f1e 100644 --- a/frontend/src/components/Summary.tsx +++ b/frontend/src/components/Summary.tsx @@ -139,6 +139,21 @@ const Summary: React.FC = ({ selectedRun, setSelectedRun, data })
+ Difficulty + {data.map.difficulty <= 2 && (Very easy)} + {data.map.difficulty > 2 && data.map.difficulty <= 4 && (Easy)} + {data.map.difficulty > 4 && data.map.difficulty <= 6 && (Medium)} + {data.map.difficulty > 6 && data.map.difficulty <= 8 && (Hard)} + {data.map.difficulty > 8 && data.map.difficulty <= 10 && (Very hard)} +
+ {data.map.difficulty <= 2 ? (
) : (
)} + {data.map.difficulty > 2 && data.map.difficulty <= 4 ? (
) : (
)} + {data.map.difficulty > 4 && data.map.difficulty <= 6 ? (
) : (
)} + {data.map.difficulty > 6 && data.map.difficulty <= 8 ? (
) : (
)} + {data.map.difficulty > 8 && data.map.difficulty <= 10 ? (
) : (
)} +
+
+ {/*
Difficulty {data.summary.routes[selectedRun].rating <= 2 && (Very easy)} {data.summary.routes[selectedRun].rating > 2 && data.summary.routes[selectedRun].rating <= 4 && (Easy)} @@ -152,7 +167,7 @@ const Summary: React.FC = ({ selectedRun, setSelectedRun, data }) {data.summary.routes[selectedRun].rating > 6 && data.summary.routes[selectedRun].rating <= 8 ? (
) : (
)} {data.summary.routes[selectedRun].rating > 8 && data.summary.routes[selectedRun].rating <= 10 ? (
) : (
)}
-
+
*/}
Completion Count
{data.summary.routes[selectedRun].completion_count}
diff --git a/frontend/src/types/Map.ts b/frontend/src/types/Map.ts index 89c66d5..4f8eabf 100644 --- a/frontend/src/types/Map.ts +++ b/frontend/src/types/Map.ts @@ -79,6 +79,7 @@ interface MapSummaryMap { map_name: string; is_coop: boolean; is_disabled: boolean; + difficulty: number; }; interface MapSummaryDetails { -- cgit v1.2.3 From a970a15569d19f0c6a0366e990067c7b6ab80e0f Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:42:39 +0300 Subject: fix/rankings: remove debug return --- rankings/fetch.go | 1 - 1 file changed, 1 deletion(-) diff --git a/rankings/fetch.go b/rankings/fetch.go index 76a3526..7e9a449 100644 --- a/rankings/fetch.go +++ b/rankings/fetch.go @@ -22,7 +22,6 @@ func fetchLeaderboard(records []Record, overrides map[SteamID]map[string]int, us log.Println("fetching leaderboard") players := map[SteamID]*Player{} // first init players map with records from portal gun and doors - return nil, errLb fetchAnotherPage := true start := 0 end := 5000 -- cgit v1.2.3 From 7746337964fd50b2eac170333efa05e7a5676a1c Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 24 Jul 2025 14:09:11 +0300 Subject: feat/backend: add newrelic integration (#274) --- backend/.env.example | 1 + backend/go.mod | 4 ++++ backend/go.sum | 9 +++++++++ backend/main.go | 11 +++++++++++ 4 files changed, 25 insertions(+) diff --git a/backend/.env.example b/backend/.env.example index b0a7101..0318aa1 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -12,3 +12,4 @@ B2_KEY_ID=123456789ABCDEF B2_API_KEY=123456789ABCDEF B2_DOWNLOAD_URL=https://lphub.s3.eu-central-001.backblazeb2.com/ LOCAL_DEMOS_PATH=/path/to/demos/ +NEWRELIC_LICENSE_KEY=abcdef123456789 diff --git a/backend/go.mod b/backend/go.mod index e6f87c4..f9fe0db 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -32,9 +32,13 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/mailru/easyjson v0.7.7 // indirect + github.com/newrelic/go-agent/v3 v3.40.1 // indirect + github.com/newrelic/go-agent/v3/integrations/nrgin v1.4.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect golang.org/x/arch v0.10.0 // indirect golang.org/x/tools v0.25.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect + google.golang.org/grpc v1.65.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index 59301ae..f655023 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -74,6 +74,10 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/newrelic/go-agent/v3 v3.40.1 h1:8nb4R252Fpuc3oySvlHpDwqySqaPWL5nf7ZVEhqtUeA= +github.com/newrelic/go-agent/v3 v3.40.1/go.mod h1:X0TLXDo+ttefTIue1V96Y5seb8H6wqf6uUq4UpPsYj8= +github.com/newrelic/go-agent/v3/integrations/nrgin v1.4.1 h1:a1waTQToxDTKd31LpwpaFHKWPj8Dav/BrzZayBiiAq8= +github.com/newrelic/go-agent/v3/integrations/nrgin v1.4.1/go.mod h1:mEbfsZIxBYIPT7FzboYvE+ed2ft4SCFXoCvleI2v5JQ= github.com/pektezol/bitreader v1.4.3 h1:+WjsD6qOAaI6Q1jOOlEJcnaEso8vPMKRZnnaDnZhTSg= github.com/pektezol/bitreader v1.4.3/go.mod h1:xBQEsQpOf8B5yPrnOTkirZGyVUV6Bqp0ups2RIlTskk= github.com/pektezol/steam_go v1.1.2 h1:fta6SW+La8NfmCtR/Kn73bAmTBvCgUkkLCplsJGzx7g= @@ -150,6 +154,11 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/backend/main.go b/backend/main.go index a1a4a20..e422359 100644 --- a/backend/main.go +++ b/backend/main.go @@ -11,6 +11,8 @@ import ( "github.com/gin-gonic/gin" "github.com/joho/godotenv" + nrgin "github.com/newrelic/go-agent/v3/integrations/nrgin" + "github.com/newrelic/go-agent/v3/newrelic" ) // @title Least Portals Hub @@ -30,7 +32,16 @@ func main() { if os.Getenv("ENV") == "PROD" { gin.SetMode(gin.ReleaseMode) } + app, err := newrelic.NewApplication( + newrelic.ConfigAppName("lphub"), + newrelic.ConfigLicense(os.Getenv("NEWRELIC_LICENSE_KEY")), + newrelic.ConfigAppLogForwardingEnabled(true), + ) + if err != nil { + log.Fatal("Error instrumenting newrelic") + } router := gin.Default() + router.Use(nrgin.Middleware(app)) database.ConnectDB() api.InitRoutes(router) // for debugging -- cgit v1.2.3