mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-09-13 14:46:10 -05:00
first working version of the x rank script
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -20,4 +20,9 @@ xrank_data
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
yarn-error.log*
|
||||
|
||||
config.py
|
||||
test.py
|
||||
|
||||
__pycache__
|
||||
43
index.js
Normal file
43
index.js
Normal file
@@ -0,0 +1,43 @@
|
||||
const { ApolloServer, UserInputError, AuthenticationError, gql, PubSub } = require('apollo-server')
|
||||
const pubsub = new PubSub()
|
||||
const mongoose = require('mongoose')
|
||||
const Author = require('./models/author')
|
||||
const Book = require('./models/book')
|
||||
const User = require('./models/user')
|
||||
const jwt = require('jsonwebtoken')
|
||||
|
||||
mongoose.set('useFindAndModify', false)
|
||||
mongoose.set('useCreateIndex', true)
|
||||
|
||||
const JWT_SECRET = "moi"
|
||||
|
||||
const MONGODB_URI = "uri"
|
||||
|
||||
console.log('connecting to,', MONGODB_URI)
|
||||
|
||||
mongoose.connect(MONGODB_URI, { useNewUrlParser: true })
|
||||
.then(() => {
|
||||
console.log('connected to MongoDB')
|
||||
})
|
||||
.catch((error) => {
|
||||
console.log('error connection to MongoDB:', error.message)
|
||||
})
|
||||
|
||||
const server = new ApolloServer({
|
||||
typeDefs,
|
||||
resolvers,
|
||||
context: async ({ req }) => {
|
||||
const auth = req ? req.headers.authorization : null
|
||||
if (auth && auth.toLowerCase().startsWith('bearer ')) {
|
||||
const decodedToken = jwt.verify(
|
||||
auth.substring(7), JWT_SECRET
|
||||
)
|
||||
const currentUser = await User.findById(decodedToken.id)
|
||||
return { currentUser }
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
server.listen().then(({ url }) => {
|
||||
console.log(`Server ready at ${url}`)
|
||||
})
|
||||
@@ -2,7 +2,9 @@ const mongoose = require('mongoose')
|
||||
|
||||
const placementSchema = new mongoose.Schema({
|
||||
name: {type: String, required: true},
|
||||
weapon: {type: String, required: true},
|
||||
rank: {type: Number, min: 1, max: 500, required: true},
|
||||
mode: {type: Number, min: 1, max: 4, required: true},
|
||||
x_power: {type: Number, required: true},
|
||||
unique_id: {type: Number, required: true},
|
||||
month: {type: Number, min: 1, max: 12, required: true},
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
const mongoose = require('mongoose')
|
||||
|
||||
const playerSchema = new mongoose.Schema({
|
||||
name: {type: String, required: true, unique: true },
|
||||
name: {type: String, required: true },
|
||||
unique_id: { type: Number, unique: true },
|
||||
alias: String,
|
||||
twitter: String,
|
||||
weapons: [String],
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
const mongoose = require('mongoose')
|
||||
const Placement = require('../models/placement')
|
||||
const Player = require('../models/player')
|
||||
|
||||
183
scripts/xrank.py
Normal file
183
scripts/xrank.py
Normal file
@@ -0,0 +1,183 @@
|
||||
import glob
|
||||
import os
|
||||
import json
|
||||
import calendar
|
||||
import pymongo
|
||||
from config import uri
|
||||
|
||||
shooters = ["Sploosh-o-matic", "Neo Sploosh-o-matic", "Sploosh-o-matic 7",
|
||||
"Splattershot Jr.", "Custom Splattershot Jr.", "Kensa Splattershot Jr.",
|
||||
"Splash-o-matic", "Neo Splash-o-matic", "Aerospray MG", "Aerospray RG",
|
||||
"Aerospray PG", "Splattershot", "Tentatek Splattershot", "Kensa Splattershot",
|
||||
".52 Gal", ".52 Gal Deco", "Kensa .52 Gal", "N-ZAP '85", "N-ZAP '89",
|
||||
"N-ZAP '83", "Splattershot Pro", "Forge Splattershot Pro", "Kensa Splattershot Pro",
|
||||
".96 Gal", ".96 Gal Deco", "Jet Squelcher", "Custom Jet Squelcher",
|
||||
"L-3 Nozzlenose", "L-3 Nozzlenose D", "Kensa L-3 Nozzlenose",
|
||||
"H-3 Nozzlenose", "H-3 Nozzlenose D", "Cherry H-3 Nozzlenose", "Squeezer",
|
||||
"Foil Squeezer"]
|
||||
|
||||
blasters = ["Luna Blaster", "Luna Blaster Neo", "Kensa Luna Blaster",
|
||||
"Blaster", "Custom Blaster", "Range Blaster", "Custom Range Blaster",
|
||||
"Grim Range Blaster", "Rapid Blaster", "Rapid Blaster Deco", "Kensa Rapid Blaster",
|
||||
"Rapid Blaster Pro", "Rapid Blaster Pro Deco", "Clash Blaster", "Clash Blaster Neo"]
|
||||
|
||||
rollers = ["Carbon Roller", "Carbon Roller Deco", "Splat Roller", "Krak-On Splat Roller",
|
||||
"Kensa Splat Roller", "Dynamo Roller", "Gold Dynamo Roller", "Kensa Dynamo Roller",
|
||||
"Flingza Roller", "Foil Flingza Roller", "Inkbrush", "Inkbrush Nouveau",
|
||||
"Permanent Inkbrush", "Octobrush", "Octobrush Nouveau", "Kensa Octobrush"]
|
||||
|
||||
chargers = ["Classic Squiffer", "New Squiffer", "Fresh Squiffer", "Splat Charger",
|
||||
"Firefin Splat Charger", "Kensa Charger", "Splatterscope", "Firefin Splatterscope",
|
||||
"Kensa Splatterscope", "E-liter 4K", "Custom E-liter 4K", "E-liter 4K Scope",
|
||||
"Custom E-liter 4K Scope", "Bamboozler 14 Mk I", "Bamboozler 14 Mk II",
|
||||
"Bamboozler 14 Mk III", "Goo Tuber", "Custom Goo Tuber"]
|
||||
|
||||
sloshers = ["Slosher", "Slosher Deco", "Soda Slosher", "Tri-Slosher",
|
||||
"Tri-Slosher Nouveau", "Sloshing Machine", "Sloshing Machine Neo",
|
||||
"Kensa Sloshing Machine", "Bloblobber", "Bloblobber Deco", "Explosher",
|
||||
"Custom Explosher"]
|
||||
|
||||
splatlings = ["Mini Splatling", "Zink Mini Splatling", "Kensa Mini Splatling",
|
||||
"Heavy Splatling", "Heavy Splatling Deco", "Heavy Splatling Remix",
|
||||
"Hydra Splatling", "Custom Hydra Splatling", "Ballpoint Splatling",
|
||||
"Ballpoint Splatling Nouveau", "Nautilus 47", "Nautilus 79"]
|
||||
|
||||
dualies = ["Dapple Dualies", "Dapple Dualies Nouveau", "Clear Dapple Dualies",
|
||||
"Splat Dualies", "Enperry Splat Dualies", "Kensa Splat Dualies", "Glooga Dualies",
|
||||
"Glooga Dualies Deco", "Kensa Glooga Dualies", "Dualie Squelchers",
|
||||
"Custom Dualie Squelchers", "Dark Tetra Dualies", "Light Tetra Dualies"]
|
||||
|
||||
brellas = ["Splat Brella", "Sorella Brella", "Tenta Brella", "Tenta Sorella Brella",
|
||||
"Tenta Camo Brella", "Undercover Brella", "Undercover Sorella Brella", "Kensa Undercover Brella"]
|
||||
|
||||
client = pymongo.MongoClient("mongodb+srv://sendou:vcXO4h599w09wo97@main-1s8xj.mongodb.net/test?retryWrites=true")
|
||||
db = client.test
|
||||
|
||||
script_dir = os.path.dirname(__file__)
|
||||
rel_path = "xrank_data/*.json"
|
||||
abs_file_path = os.path.join(script_dir, rel_path)
|
||||
|
||||
year = 2018 # needs to be updated manually when we process data from different years
|
||||
|
||||
for filepath in glob.iglob(abs_file_path): # iterate through .json files in the xrank_data folder
|
||||
if filepath.endswith(".json"):
|
||||
path_without_folder = filepath.replace("xrank_data\\", "")
|
||||
file_parts = path_without_folder.split("_")
|
||||
print(file_parts)
|
||||
month = list(calendar.month_name).index(file_parts[0].capitalize())
|
||||
|
||||
if "splat" in file_parts[1]:
|
||||
mode = 1
|
||||
elif "tower" in file_parts[1]:
|
||||
mode = 2
|
||||
elif "rainmaker" in file_parts[1]:
|
||||
mode = 3
|
||||
else:
|
||||
mode = 4
|
||||
with open(filepath) as f:
|
||||
data = json.load(f)
|
||||
for placement in data:
|
||||
if placement["cheater"]:
|
||||
continue
|
||||
|
||||
rank = placement["rank"]
|
||||
if rank > 500:
|
||||
break
|
||||
|
||||
name = placement["name"]
|
||||
x_power = placement["x_power"]
|
||||
unique_id = placement["unique_id"]
|
||||
|
||||
weapon = placement["weapon"]["name"].strip()
|
||||
# If weapon is one of the reskins it gets converted to the regular version
|
||||
if weapon == "Hero Shot Replica":
|
||||
weapon = "Splattershot"
|
||||
elif weapon == "Octo Shot Replica":
|
||||
weapon = "Tentatek Splattershot"
|
||||
elif weapon == "Hero Blaster Replica":
|
||||
weapon = "Blaster"
|
||||
elif weapon == "Hero Roller Replica":
|
||||
weapon = "Splat Roller"
|
||||
elif weapon == "Herobrush Replica":
|
||||
weapon = "Octobrush"
|
||||
elif weapon == "Hero Charger Replica":
|
||||
weapon = "Splat Charger"
|
||||
elif weapon == "Hero Slosher Replica":
|
||||
weapon = "Slosher"
|
||||
elif weapon == "Hero Splatling Replica":
|
||||
weapon = "Heavy Splatling"
|
||||
elif weapon == "Hero Dualie Replicas":
|
||||
weapon = "Splat Dualies"
|
||||
elif weapon == "Hero Brella Replica":
|
||||
weapon = "Splat Brella"
|
||||
|
||||
print(f"{month} {year} - {mode} - {name} {unique_id} {rank} {x_power} {weapon}")
|
||||
|
||||
placement_document = {"name": name,
|
||||
"weapon": weapon,
|
||||
"rank": rank,
|
||||
"mode": mode,
|
||||
"x_power": x_power,
|
||||
"unique_id": unique_id,
|
||||
"month": month,
|
||||
"year": year}
|
||||
|
||||
result = db.placements.insert_one(placement_document)
|
||||
|
||||
player = db.players.find_one({ "unique_id": unique_id })
|
||||
|
||||
if player is None:
|
||||
player = {"name": name,
|
||||
"unique_id": unique_id,
|
||||
"weapons": [weapon]}
|
||||
else:
|
||||
player["name"] = name
|
||||
playerWeapons = player["weapons"]
|
||||
playerWeapons.append(weapon)
|
||||
player["weapons"] = list(dict.fromkeys(playerWeapons))
|
||||
|
||||
if "topTotal" not in player:
|
||||
player["topTotal"] = [result.inserted_id]
|
||||
else:
|
||||
if len(player["topTotal"]) <= 3:
|
||||
player["topTotal"].append(result.inserted_id)
|
||||
else:
|
||||
lowest_power = 10000
|
||||
lowest_power_index = -1
|
||||
for index, placement_id in enumerate(player["topTotal"]):
|
||||
high_placement = db.placements.find_one({ "_id": placement_id })
|
||||
if high_placement is None:
|
||||
raise ValueError(f'Placement id {placement_id} not found in the database.')
|
||||
if high_placement["x_power"] < x_power:
|
||||
if high_placement["x_power"] < lowest_power:
|
||||
lowest_power = high_placement["x_power"]
|
||||
lowest_power_index = index
|
||||
|
||||
if lowest_power_index != -1:
|
||||
player["topTotal"][lowest_power_index] = result.inserted_id
|
||||
|
||||
if weapon in shooters:
|
||||
pass
|
||||
elif weapon in blasters:
|
||||
pass
|
||||
elif weapon in rollers:
|
||||
pass
|
||||
elif weapon in chargers:
|
||||
pass
|
||||
elif weapon in sloshers:
|
||||
pass
|
||||
elif weapon in splatlings:
|
||||
pass
|
||||
elif weapon in dualies:
|
||||
pass
|
||||
elif weapon in brellas:
|
||||
pass
|
||||
else:
|
||||
raise ValueError(f'Weapon "{weapon}"doesn\'t belong in any category')
|
||||
|
||||
if len(player["topTotal"]) == 1: # if player was just added
|
||||
db.players.insert_one(player)
|
||||
else:
|
||||
db.players.find_one_and_replace({"unique_id": unique_id}, player)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user