mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-27 13:34:28 +00:00
moar and less stuff
This commit is contained in:
parent
8a7e6d34fd
commit
901cb874a8
7 changed files with 165 additions and 182 deletions
119
db.py
119
db.py
|
@ -1,7 +1,7 @@
|
||||||
import time
|
import time
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
from sqlalchemy.orm import sessionmaker, relationship
|
from sqlalchemy.orm import sessionmaker, relationship
|
||||||
from sqlalchemy import Column, BigInteger, Integer, String, Numeric, DateTime, ForeignKey, Float, Enum, create_engine
|
from sqlalchemy import Column, BigInteger, Integer, String, Numeric, DateTime, ForeignKey, Float, Enum, create_engine, UniqueConstraint
|
||||||
import requests
|
import requests
|
||||||
from errors import RequestError, NotFoundError
|
from errors import RequestError, NotFoundError
|
||||||
import re
|
import re
|
||||||
|
@ -27,6 +27,13 @@ class Royal(Base):
|
||||||
id = Column(Integer, primary_key=True)
|
id = Column(Integer, primary_key=True)
|
||||||
username = Column(String, unique=True, nullable=False)
|
username = Column(String, unique=True, nullable=False)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_or_create(username):
|
||||||
|
r = session.query(Royal).filter_by(username=username).first()
|
||||||
|
if r is not None:
|
||||||
|
return r
|
||||||
|
return Royal(username=username)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<Royal {self.username}>"
|
return f"<Royal {self.username}>"
|
||||||
|
|
||||||
|
@ -61,8 +68,8 @@ class Steam(Base):
|
||||||
royal = relationship("Royal")
|
royal = relationship("Royal")
|
||||||
|
|
||||||
steam_id = Column(String, primary_key=True)
|
steam_id = Column(String, primary_key=True)
|
||||||
persona_name = Column(String)
|
persona_name = Column(String, nullable=False)
|
||||||
avatar_hex = Column(String)
|
avatar_hex = Column(String, nullable=False)
|
||||||
trade_token = Column(String)
|
trade_token = Column(String)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
@ -88,12 +95,12 @@ class Steam(Base):
|
||||||
s = Steam(royal_id=royal_id,
|
s = Steam(royal_id=royal_id,
|
||||||
steam_id=steam_id,
|
steam_id=steam_id,
|
||||||
persona_name=j["response"]["players"][0]["personaname"],
|
persona_name=j["response"]["players"][0]["personaname"],
|
||||||
avatar_hex=re.search("https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/../(.+).jpg", j["response"]["players"][0]["avatar"]).group(1))
|
avatar_hex=re.search(r"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/../(.+).jpg", j["response"]["players"][0]["avatar"]).group(1))
|
||||||
return s
|
return s
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def find_trade_token(trade_url):
|
def find_trade_token(trade_url):
|
||||||
return re.search("https://steamcommunity\.com/tradeoffer/new/\?partner=[0-9]+&token=(.{8})", trade_url).group(1)
|
return re.search(r"https://steamcommunity\.com/tradeoffer/new/\?partner=[0-9]+&token=(.{8})", trade_url).group(1)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def to_steam_id_2(steam_id):
|
def to_steam_id_2(steam_id):
|
||||||
|
@ -116,7 +123,7 @@ class Steam(Base):
|
||||||
raise RequestError(f"Steam returned {r.status_code}")
|
raise RequestError(f"Steam returned {r.status_code}")
|
||||||
j = r.json()
|
j = r.json()
|
||||||
self.persona_name = j["response"]["players"][0]["personaname"]
|
self.persona_name = j["response"]["players"][0]["personaname"]
|
||||||
self.avatar_hex = re.search("https://steamcdn-a\.akamaihd\.net/steamcommunity/public/images/avatars/../(.+).jpg", j["response"]["players"][0]["avatar"]).group(1)
|
self.avatar_hex = re.search(r"https://steamcdn-a\.akamaihd\.net/steamcommunity/public/images/avatars/../(.+).jpg", j["response"]["players"][0]["avatar"]).group(1)
|
||||||
|
|
||||||
|
|
||||||
class RocketLeague(Base):
|
class RocketLeague(Base):
|
||||||
|
@ -227,8 +234,8 @@ class Dota(Base):
|
||||||
solo_mmr = Column(Integer)
|
solo_mmr = Column(Integer)
|
||||||
party_mmr = Column(Integer)
|
party_mmr = Column(Integer)
|
||||||
|
|
||||||
wins = Column(Integer)
|
wins = Column(Integer, nullable=False)
|
||||||
losses = Column(Integer)
|
losses = Column(Integer, nullable=False)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_or_create(steam_id):
|
def get_or_create(steam_id):
|
||||||
|
@ -292,7 +299,7 @@ class LeagueOfLegends(Base):
|
||||||
royal = relationship("Royal")
|
royal = relationship("Royal")
|
||||||
|
|
||||||
summoner_id = Column(BigInteger, primary_key=True)
|
summoner_id = Column(BigInteger, primary_key=True)
|
||||||
summoner_name = Column(String)
|
summoner_name = Column(String, nullable=False)
|
||||||
|
|
||||||
level = Column(Integer, nullable=False)
|
level = Column(Integer, nullable=False)
|
||||||
solo_division = Column(Enum(LeagueOfLegendsRanks))
|
solo_division = Column(Enum(LeagueOfLegendsRanks))
|
||||||
|
@ -372,11 +379,11 @@ class LeagueOfLegends(Base):
|
||||||
class Osu(Base):
|
class Osu(Base):
|
||||||
__tablename__ = "osu"
|
__tablename__ = "osu"
|
||||||
|
|
||||||
royal_id = Column(Integer, ForeignKey("royals.id"))
|
royal_id = Column(Integer, ForeignKey("royals.id"), nullable=False)
|
||||||
royal = relationship("Royal")
|
royal = relationship("Royal")
|
||||||
|
|
||||||
osu_id = Column(Integer, primary_key=True)
|
osu_id = Column(Integer, primary_key=True)
|
||||||
osu_name = Column(String)
|
osu_name = Column(String, nullable=False)
|
||||||
|
|
||||||
std_pp = Column(Float)
|
std_pp = Column(Float)
|
||||||
taiko_pp = Column(Float)
|
taiko_pp = Column(Float)
|
||||||
|
@ -385,7 +392,7 @@ class Osu(Base):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_or_create(royal_id, osu_name):
|
def get_or_create(royal_id, osu_name):
|
||||||
o = session.query(Osu).filter(Osu.royal_id == royal_id).first()
|
o = session.query(Osu).filter(Osu.osu_name == osu_name).first()
|
||||||
if o is not None:
|
if o is not None:
|
||||||
return o
|
return o
|
||||||
r0 = requests.get(f"https://osu.ppy.sh/api/get_user?k={config['Osu!']['ppy_api_key']}&u={osu_name}&m=0")
|
r0 = requests.get(f"https://osu.ppy.sh/api/get_user?k={config['Osu!']['ppy_api_key']}&u={osu_name}&m=0")
|
||||||
|
@ -426,6 +433,92 @@ class Osu(Base):
|
||||||
self.mania_pp = j3["pp_raw"]
|
self.mania_pp = j3["pp_raw"]
|
||||||
|
|
||||||
|
|
||||||
|
class Discord(Base):
|
||||||
|
__tablename__ = "discord"
|
||||||
|
__table_args__ = tuple(UniqueConstraint("name", "discriminator"))
|
||||||
|
|
||||||
|
royal_id = Column(Integer, ForeignKey("royals.id"), nullable=False)
|
||||||
|
royal = relationship("Royal")
|
||||||
|
|
||||||
|
discord_id = Column(BigInteger, primary_key=True)
|
||||||
|
name = Column(String, nullable=False)
|
||||||
|
discriminator = Column(Integer, nullable=False)
|
||||||
|
avatar_hex = Column(String)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.username}#{self.discriminator}"
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"<Discord user {self.id}>"
|
||||||
|
|
||||||
|
def mention(self):
|
||||||
|
return f"<@{self.id}>"
|
||||||
|
|
||||||
|
def avatar_url(self, size=256):
|
||||||
|
if self.avatar_hex is None:
|
||||||
|
return "https://discordapp.com/assets/6debd47ed13483642cf09e832ed0bc1b.png"
|
||||||
|
return f"https://cdn.discordapp.com/avatars/{self.id}/{self.avatar}.png?size={size}"
|
||||||
|
|
||||||
|
|
||||||
|
class Overwatch(Base):
|
||||||
|
__tablename__ = "overwatch"
|
||||||
|
|
||||||
|
royal_id = Column(Integer, ForeignKey("royals.id"), nullable=False)
|
||||||
|
royal = relationship("Royal")
|
||||||
|
|
||||||
|
battletag = Column(String, primary_key=True)
|
||||||
|
discriminator = Column(Integer, primary_key=True)
|
||||||
|
icon = Column(String, nullable=False)
|
||||||
|
|
||||||
|
level = Column(Integer, nullable=False)
|
||||||
|
rank = Column(Integer)
|
||||||
|
|
||||||
|
def __str__(self, separator="#"):
|
||||||
|
return f"{self.battletag}{separator}{self.discriminator}"
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"<Overwatch {self}>"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_or_create(royal_id, battletag, discriminator=None):
|
||||||
|
if discriminator is None:
|
||||||
|
battletag, discriminator = battletag.split("#", 1)
|
||||||
|
o = session.query(Overwatch).filter_by(battletag=battletag, discriminator=discriminator).first()
|
||||||
|
if o is not None:
|
||||||
|
return o
|
||||||
|
r = requests.get(f"https://owapi.net/api/v3/u/{battletag}-{discriminator}/stats", headers={
|
||||||
|
"User-Agent": "Royal-Bot/4.0",
|
||||||
|
"From": "ste.pigozzi@gmail.com"
|
||||||
|
})
|
||||||
|
if r.status_code != 200:
|
||||||
|
raise RequestError(f"OWAPI.net returned {r.status_code}")
|
||||||
|
try:
|
||||||
|
j = r.json()["eu"]["stats"]["quickplay"]["overall_stats"]
|
||||||
|
except TypeError:
|
||||||
|
raise RequestError("Something went wrong when retrieving the stats.")
|
||||||
|
o = Overwatch(royal_id=royal_id,
|
||||||
|
battletag=battletag,
|
||||||
|
discriminator=discriminator,
|
||||||
|
icon=re.search(r"https://.+\.cloudfront\.net/game/unlocks/(0x[0-9A-F]+)\.png", j["avatar"]).group(1),
|
||||||
|
level=j["prestige"] * 100 + j["level"],
|
||||||
|
rank=j["comprank"])
|
||||||
|
return o
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
r = requests.get(f"https://owapi.net/api/v3/u/{self.battletag}-{self.discriminator}/stats", headers={
|
||||||
|
"User-Agent": "Royal-Bot/4.0",
|
||||||
|
"From": "ste.pigozzi@gmail.com"
|
||||||
|
})
|
||||||
|
if r.status_code != 200:
|
||||||
|
raise RequestError(f"OWAPI.net returned {r.status_code}")
|
||||||
|
try:
|
||||||
|
j = r.json()["eu"]["stats"]["quickplay"]["overall_stats"]
|
||||||
|
except TypeError:
|
||||||
|
raise RequestError("Something went wrong when retrieving the stats.")
|
||||||
|
self.icon = re.search(r"https://.+\.cloudfront\.net/game/unlocks/(0x[0-9A-F]+)\.png", j["avatar"]).group(1)
|
||||||
|
self.level = j["prestige"] * 100 + j["level"]
|
||||||
|
self.rank = j["comprank"]
|
||||||
|
|
||||||
# If run as script, create all the tables in the db
|
# If run as script, create all the tables in the db
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
Base.metadata.create_all(bind=engine)
|
Base.metadata.create_all(bind=engine)
|
|
@ -1,23 +0,0 @@
|
||||||
import db
|
|
||||||
from flask import Flask, render_template
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
|
||||||
|
|
||||||
@app.route("/ladder")
|
|
||||||
def page_dota_ladder():
|
|
||||||
session = db.Session()
|
|
||||||
dota = session.execute("SELECT royals.username, dota.solo_mmr, dota.party_mmr, dota.wins FROM royals JOIN steam ON royals.id = steam.royal_id JOIN dota ON steam.steam_id = dota.steam_id ORDER BY dota.solo_mmr DESC;")
|
|
||||||
rl = session.execute("SELECT royals.username, "
|
|
||||||
"rocketleague.single_rank, rocketleague.single_div, rocketleague.single_mmr, "
|
|
||||||
"rocketleague.doubles_rank, rocketleague.doubles_div, rocketleague.doubles_mmr, "
|
|
||||||
"rocketleague.standard_rank, rocketleague.standard_div, rocketleague.standard_mmr, "
|
|
||||||
"rocketleague.solo_std_rank, rocketleague.solo_std_div, rocketleague.solo_std_mmr "
|
|
||||||
"FROM royals JOIN steam ON royals.id = steam.royal_id "
|
|
||||||
"JOIN rocketleague ON steam.steam_id = rocketleague.steam_id "
|
|
||||||
"ORDER BY rocketleague.doubles_rank DESC;")
|
|
||||||
osu = session.execute("SELECT royals.username, osu.std_pp, osu.taiko_pp, osu.catch_pp, osu.mania_pp FROM royals JOIN osu ON royals.id = osu.royal_id ORDER BY osu.std_pp DESC;")
|
|
||||||
return render_template("main.htm", dota=dota, rl=rl, osu=osu)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app.run(host="0.0.0.0", port=1234)
|
|
45
newuser.py
Normal file
45
newuser.py
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
import db
|
||||||
|
|
||||||
|
session = db.Session()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
user = db.Royal.get_or_create(input("Nome account: "))
|
||||||
|
session.add(user)
|
||||||
|
session.commit()
|
||||||
|
try:
|
||||||
|
steam = db.Steam.get_or_create(user.id, input("Steam ID 1: "))
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
session.add(steam)
|
||||||
|
try:
|
||||||
|
dota = db.Dota.get_or_create(steam.steam_id)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
session.add(dota)
|
||||||
|
try:
|
||||||
|
rl = db.RocketLeague.get_or_create(steam.steam_id)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
session.add(rl)
|
||||||
|
try:
|
||||||
|
osu = db.Osu.get_or_create(user.id, input("Osu! username: "))
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
session.add(osu)
|
||||||
|
try:
|
||||||
|
overwatch = db.Overwatch.get_or_create(user.id, input("Battle.net battletag: "))
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
session.add(overwatch)
|
||||||
|
try:
|
||||||
|
lol = db.LeagueOfLegends.get_or_create(user.id, input("League summoner name: "))
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
session.add(lol)
|
||||||
|
session.commit()
|
|
@ -1,51 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
||||||
<title>Ladders</title>
|
|
||||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css"
|
|
||||||
integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
background-color: black;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table * * {
|
|
||||||
border-color: #333333 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rl-rank {
|
|
||||||
height: 48px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rl-name {
|
|
||||||
height: 48px;
|
|
||||||
line-height: 48px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="containter-fluid">
|
|
||||||
<h1>
|
|
||||||
Dota 2
|
|
||||||
</h1>
|
|
||||||
{% with query=dota %}
|
|
||||||
{% include 'table.htm' %}
|
|
||||||
{% endwith %}
|
|
||||||
<h1>
|
|
||||||
Rocket League
|
|
||||||
</h1>
|
|
||||||
{% with query=rl %}
|
|
||||||
{% include 'rl_table.htm' %}
|
|
||||||
{% endwith %}
|
|
||||||
<h1>
|
|
||||||
Osu!
|
|
||||||
</h1>
|
|
||||||
{% with query=osu %}
|
|
||||||
{% include 'table.htm' %}
|
|
||||||
{% endwith %}
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,70 +0,0 @@
|
||||||
<table class="table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
Username
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
Singolo <small>1v1</small>
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
Doppio <small>2v2</small>
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
Standard <small>3v3</small>
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
Solo Standard <small>Solo 3v3</small>
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for record in query %}
|
|
||||||
<tr>
|
|
||||||
<td class="rl-name">
|
|
||||||
{{ record[0] }}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{% if record[1] %}
|
|
||||||
<img class="rl-rank" src="https://rocketleaguestats.com/assets/img/rocket_league/ranked/season_four/{{ record[1] }}.png">
|
|
||||||
<span class="rl-mmr">
|
|
||||||
{{ record[3] }}
|
|
||||||
</span>
|
|
||||||
{% else %}
|
|
||||||
<img class="rl-rank" src="https://rocketleaguestats.com/assets/img/rocket_league/ranked/season_four/0.png">
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{% if record[4] %}
|
|
||||||
<img class="rl-rank" src="https://rocketleaguestats.com/assets/img/rocket_league/ranked/season_four/{{ record[4] }}.png">
|
|
||||||
<span class="rl-mmr">
|
|
||||||
{{ record[6] }}
|
|
||||||
</span>
|
|
||||||
{% else %}
|
|
||||||
<img class="rl-rank" src="https://rocketleaguestats.com/assets/img/rocket_league/ranked/season_four/0.png">
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{% if record[7] %}
|
|
||||||
<img class="rl-rank" src="https://rocketleaguestats.com/assets/img/rocket_league/ranked/season_four/{{ record[7] }}.png">
|
|
||||||
<span class="rl-mmr">
|
|
||||||
{{ record[9] }}
|
|
||||||
</span>
|
|
||||||
{% else %}
|
|
||||||
<img class="rl-rank" src="https://rocketleaguestats.com/assets/img/rocket_league/ranked/season_four/0.png">
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{% if record[10] %}
|
|
||||||
<img class="rl-rank" src="https://rocketleaguestats.com/assets/img/rocket_league/ranked/season_four/{{ record[10] }}.png">
|
|
||||||
<span class="rl-mmr">
|
|
||||||
{{ record[12] }}
|
|
||||||
</span>
|
|
||||||
{% else %}
|
|
||||||
<img class="rl-rank" src="https://rocketleaguestats.com/assets/img/rocket_league/ranked/season_four/0.png">
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
|
@ -1,24 +0,0 @@
|
||||||
<table class="table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
{% for column in query.keys() %}
|
|
||||||
<th>
|
|
||||||
{{ column }}
|
|
||||||
</th>
|
|
||||||
{% endfor %}
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for record in query %}
|
|
||||||
<tr>
|
|
||||||
{% for column in record %}
|
|
||||||
<td>
|
|
||||||
{% if column %}
|
|
||||||
{{ column }}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
{% endfor %}
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
15
update.py
15
update.py
|
@ -77,7 +77,20 @@ try:
|
||||||
print("OK")
|
print("OK")
|
||||||
finally:
|
finally:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
# Update Overwatch
|
||||||
|
print("OVERWATCH")
|
||||||
|
for user in session.query(db.Overwatch).all():
|
||||||
|
print(f"Updating {user.royal.username}", end="\t\t", flush=True)
|
||||||
|
try:
|
||||||
|
user.update()
|
||||||
|
except errors.RequestError:
|
||||||
|
print("Request Error")
|
||||||
|
except errors.NotFoundError:
|
||||||
|
print("Not Found Error (?)")
|
||||||
|
else:
|
||||||
|
print("OK")
|
||||||
|
finally:
|
||||||
|
time.sleep(1)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
pass
|
||||||
finally:
|
finally:
|
||||||
|
|
Loading…
Reference in a new issue