mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-23 19:44:20 +00:00
leagueoflegends
This commit is contained in:
parent
d8b0041a4c
commit
a01f6868dd
7 changed files with 476 additions and 1 deletions
88
royalnet/packs/royal/commands/leagueoflegends.py
Normal file
88
royalnet/packs/royal/commands/leagueoflegends.py
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
import typing
|
||||||
|
import riotwatcher
|
||||||
|
from royalnet.commands import *
|
||||||
|
from royalnet.utils import *
|
||||||
|
from ..tables import LeagueOfLegends
|
||||||
|
from ..utils import LeagueLeague
|
||||||
|
|
||||||
|
|
||||||
|
class LeagueoflegendsCommand(Command):
|
||||||
|
name: str = "leagueoflegends"
|
||||||
|
|
||||||
|
aliases = ["lol", "league"]
|
||||||
|
|
||||||
|
description: str = "Connetti un account di League of Legends a un account Royalnet, e visualizzane le statistiche."
|
||||||
|
|
||||||
|
syntax = "[regione] [nomeevocatore] OPPURE [nomeevocatore]"
|
||||||
|
|
||||||
|
tables = {LeagueOfLegends}
|
||||||
|
|
||||||
|
def __init__(self, interface: CommandInterface):
|
||||||
|
super().__init__(interface)
|
||||||
|
self._riotwatcher = riotwatcher.RiotWatcher(self.interface.bot.get_secret("riotgames"))
|
||||||
|
|
||||||
|
async def run(self, args: CommandArgs, data: CommandData) -> None:
|
||||||
|
author = await data.get_author(error_if_none=True)
|
||||||
|
name = args.optional(1)
|
||||||
|
|
||||||
|
if not name:
|
||||||
|
# Update and display the League of Legends stats for the current account
|
||||||
|
if len(author.leagueoflegends) == 0:
|
||||||
|
raise CommandError("Nessun account di League of Legends trovato.")
|
||||||
|
elif len(author.leagueoflegends) > 1:
|
||||||
|
name = args.optional(0)
|
||||||
|
if name is None:
|
||||||
|
raise CommandError("Più account di League of Legends sono registrati a questo account.\n"
|
||||||
|
"Specifica di quale account vuoi vedere le statistiche.\n"
|
||||||
|
f"Sintassi: [c]{self.interface.prefix}{self.name} [nomeevocatore][/c]")
|
||||||
|
for account in author.leagueoflegends:
|
||||||
|
if account.summoner_name == name:
|
||||||
|
leagueoflegends = account
|
||||||
|
else:
|
||||||
|
raise CommandError("Nessun account con il nome specificato trovato.")
|
||||||
|
else:
|
||||||
|
leagueoflegends = author.leagueoflegends[0]
|
||||||
|
else:
|
||||||
|
region = args[0]
|
||||||
|
# Connect a new League of Legends account to Royalnet
|
||||||
|
summoner = self._riotwatcher.summoner.by_name(region=region, summoner_name=name)
|
||||||
|
# Ensure the account isn't already connected to something else
|
||||||
|
leagueoflegends = await asyncify(data.session.query(self.alchemy.LeagueOfLegends).filter_by(summoner_id=summoner["id"]).one_or_none())
|
||||||
|
if leagueoflegends:
|
||||||
|
raise CommandError(f"L'account {leagueoflegends} è già registrato su Royalnet.")
|
||||||
|
# Get rank information
|
||||||
|
leagues = self._riotwatcher.league.by_summoner(region=region, encrypted_summoner_id=summoner["id"])
|
||||||
|
soloq = None
|
||||||
|
flexq = None
|
||||||
|
twtrq = None
|
||||||
|
tftq = None
|
||||||
|
for league in leagues:
|
||||||
|
if league["queueType"] == "RANKED_SOLO_5x5":
|
||||||
|
soloq = league
|
||||||
|
if league["queueType"] == "RANKED_FLEX_SR":
|
||||||
|
flexq = league
|
||||||
|
if league["queueType"] == "RANKED_FLEX_TT":
|
||||||
|
twtrq = league
|
||||||
|
if league["queueType"] == "RANKED_TFT":
|
||||||
|
tftq = league
|
||||||
|
# Get mastery score
|
||||||
|
mastery = self._riotwatcher.champion_mastery.by_summoner(region=region, encrypted_summoner_id=summoner["id"])
|
||||||
|
# Create database row
|
||||||
|
leagueoflegends = self.alchemy.LeagueOfLegends(
|
||||||
|
region=region,
|
||||||
|
user=author,
|
||||||
|
profile_icon_id=summoner["profileIconId"],
|
||||||
|
summoner_name=summoner["name"],
|
||||||
|
puuid=summoner["puuid"],
|
||||||
|
summoner_level=summoner["summonerLevel"],
|
||||||
|
summoner_id=summoner["id"],
|
||||||
|
account_id=summoner["accountId"],
|
||||||
|
rank_soloq=soloq,
|
||||||
|
rank_flexq=flexq,
|
||||||
|
rank_twtrq=twtrq,
|
||||||
|
rank_tftq=tftq,
|
||||||
|
mastery_score=mastery
|
||||||
|
)
|
||||||
|
data.session.add(leagueoflegends)
|
||||||
|
await data.session_commit()
|
||||||
|
await data.reply(f"↔️ Account {leagueoflegends} connesso a {author}!")
|
|
@ -12,6 +12,7 @@ from .reminders import Reminder
|
||||||
from .triviascores import TriviaScore
|
from .triviascores import TriviaScore
|
||||||
from .mmevents import MMEvent
|
from .mmevents import MMEvent
|
||||||
from .mmresponse import MMResponse
|
from .mmresponse import MMResponse
|
||||||
|
from .leagueoflegends import LeagueOfLegends
|
||||||
|
|
||||||
# Enter the tables of your Pack here!
|
# Enter the tables of your Pack here!
|
||||||
available_tables = [
|
available_tables = [
|
||||||
|
@ -27,6 +28,7 @@ available_tables = [
|
||||||
TriviaScore,
|
TriviaScore,
|
||||||
MMEvent,
|
MMEvent,
|
||||||
MMResponse,
|
MMResponse,
|
||||||
|
LeagueOfLegends
|
||||||
]
|
]
|
||||||
|
|
||||||
# Don't change this, it should automatically generate __all__
|
# Don't change this, it should automatically generate __all__
|
||||||
|
|
258
royalnet/packs/royal/tables/leagueoflegends.py
Normal file
258
royalnet/packs/royal/tables/leagueoflegends.py
Normal file
|
@ -0,0 +1,258 @@
|
||||||
|
from sqlalchemy import *
|
||||||
|
from sqlalchemy.orm import relationship, composite
|
||||||
|
from sqlalchemy.ext.declarative import declared_attr
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
|
from .users import User
|
||||||
|
from ..utils import LeagueRank, LeagueTier, LeagueLeague
|
||||||
|
|
||||||
|
|
||||||
|
class LeagueOfLegends:
|
||||||
|
__tablename__ = "leagueoflegends"
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def region(self):
|
||||||
|
return Column(String, nullable=False)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def user_id(self):
|
||||||
|
return Column(Integer, ForeignKey("users.uid"))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def user(self):
|
||||||
|
return relationship("User", backref="leagueoflegends")
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def profile_icon_id(self):
|
||||||
|
# 3777
|
||||||
|
return Column(Integer, nullable=False)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def summoner_name(self):
|
||||||
|
# SteffoRYG
|
||||||
|
return Column(String, nullable=False)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def puuid(self):
|
||||||
|
# iNW0i7w_cC2kxgNB13UhyGPeyxZChmRqKylZ--bzbZAhFM6EXAImUqeRWmGtK6iKiYbz3bkCV8fMQQ
|
||||||
|
return Column(String, nullable=False)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def summoner_level(self):
|
||||||
|
# 68
|
||||||
|
return Column(Integer, nullable=False)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def summoner_id(self):
|
||||||
|
# aEsHyfXA2q8bK-g7GlT4kFK_0uLL3w-jBPyfMAy8kOXTJXo
|
||||||
|
return Column(String, nullable=False)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def account_id(self):
|
||||||
|
# -2Ex-VpkkNBN4ceQev8oJsamxY5iGb2liRUqkES5TU_7vtI
|
||||||
|
return Column(String, nullable=False)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_tier(self):
|
||||||
|
return Column(Enum(LeagueTier))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_rank(self):
|
||||||
|
return Column(Enum(LeagueRank))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_points(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_wins(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_losses(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_inactive(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_hot_streak(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_fresh_blood(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq_veteran(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_soloq(self):
|
||||||
|
return composite(LeagueLeague,
|
||||||
|
self.rank_soloq_tier,
|
||||||
|
self.rank_soloq_rank,
|
||||||
|
self.rank_soloq_points,
|
||||||
|
self.rank_soloq_wins,
|
||||||
|
self.rank_soloq_losses,
|
||||||
|
self.rank_soloq_inactive,
|
||||||
|
self.rank_soloq_hot_streak,
|
||||||
|
self.rank_soloq_fresh_blood,
|
||||||
|
self.rank_soloq_veteran)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_tier(self):
|
||||||
|
return Column(Enum(LeagueTier))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_rank(self):
|
||||||
|
return Column(Enum(LeagueRank))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_points(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_wins(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_losses(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_inactive(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_hot_streak(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_fresh_blood(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq_veteran(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_flexq(self):
|
||||||
|
return composite(LeagueLeague,
|
||||||
|
self.rank_flexq_tier,
|
||||||
|
self.rank_flexq_rank,
|
||||||
|
self.rank_flexq_points,
|
||||||
|
self.rank_flexq_wins,
|
||||||
|
self.rank_flexq_losses,
|
||||||
|
self.rank_flexq_inactive,
|
||||||
|
self.rank_flexq_hot_streak,
|
||||||
|
self.rank_flexq_fresh_blood,
|
||||||
|
self.rank_flexq_veteran)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_tier(self):
|
||||||
|
return Column(Enum(LeagueTier))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_rank(self):
|
||||||
|
return Column(Enum(LeagueRank))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_points(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_wins(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_losses(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_inactive(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_hot_streak(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_fresh_blood(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq_veteran(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_twtrq(self):
|
||||||
|
return composite(LeagueLeague,
|
||||||
|
self.rank_twtrq_tier,
|
||||||
|
self.rank_twtrq_rank,
|
||||||
|
self.rank_twtrq_points,
|
||||||
|
self.rank_twtrq_wins,
|
||||||
|
self.rank_twtrq_losses,
|
||||||
|
self.rank_twtrq_inactive,
|
||||||
|
self.rank_twtrq_hot_streak,
|
||||||
|
self.rank_twtrq_fresh_blood,
|
||||||
|
self.rank_twtrq_veteran)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_tier(self):
|
||||||
|
return Column(Enum(LeagueTier))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_rank(self):
|
||||||
|
return Column(Enum(LeagueRank))
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_points(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_wins(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_losses(self):
|
||||||
|
return Column(Integer)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_inactive(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_hot_streak(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_fresh_blood(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq_veteran(self):
|
||||||
|
return Column(Boolean)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def rank_tftq(self):
|
||||||
|
return composite(LeagueLeague,
|
||||||
|
self.rank_tftq_tier,
|
||||||
|
self.rank_tftq_rank,
|
||||||
|
self.rank_tftq_points,
|
||||||
|
self.rank_tftq_wins,
|
||||||
|
self.rank_tftq_losses,
|
||||||
|
self.rank_tftq_inactive,
|
||||||
|
self.rank_tftq_hot_streak,
|
||||||
|
self.rank_tftq_fresh_blood,
|
||||||
|
self.rank_tftq_veteran)
|
||||||
|
|
||||||
|
@declared_attr
|
||||||
|
def mastery_score(self):
|
||||||
|
return Column(Integer, nullable=False, default=0)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"<{self.__class__.__qualname__} {str(self)}>"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"[c]{self.__tablename__}:{self.summoner_name}[/c]"
|
|
@ -1,4 +1,7 @@
|
||||||
from .mmchoice import MMChoice
|
from .mmchoice import MMChoice
|
||||||
from .mminterfacedata import MMInterfaceData, MMInterfaceDataTelegram
|
from .mminterfacedata import MMInterfaceData, MMInterfaceDataTelegram
|
||||||
|
from .leaguetier import LeagueTier
|
||||||
|
from .leaguerank import LeagueRank
|
||||||
|
from .leagueleague import LeagueLeague
|
||||||
|
|
||||||
__all__ = ["MMChoice", "MMInterfaceData", "MMInterfaceDataTelegram"]
|
__all__ = ["MMChoice", "MMInterfaceData", "MMInterfaceDataTelegram", "LeagueTier", "LeagueRank", "LeagueLeague"]
|
||||||
|
|
91
royalnet/packs/royal/utils/leagueleague.py
Normal file
91
royalnet/packs/royal/utils/leagueleague.py
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
from .leaguetier import LeagueTier
|
||||||
|
from .leaguerank import LeagueRank
|
||||||
|
|
||||||
|
|
||||||
|
class LeagueLeague:
|
||||||
|
def __init__(self,
|
||||||
|
tier: LeagueTier = None,
|
||||||
|
rank: LeagueRank = None,
|
||||||
|
points: int = None,
|
||||||
|
wins: int = None,
|
||||||
|
losses: int = None,
|
||||||
|
inactive: bool = None,
|
||||||
|
hot_streak: bool = None,
|
||||||
|
fresh_blood: bool = None,
|
||||||
|
veteran: bool = None):
|
||||||
|
self.tier: LeagueTier = tier # IRON
|
||||||
|
self.rank: LeagueRank = rank # I
|
||||||
|
self.points: int = points # 40 LP
|
||||||
|
self.wins: int = wins
|
||||||
|
self.losses: int = losses
|
||||||
|
self.inactive: bool = inactive
|
||||||
|
self.hot_streak: bool = hot_streak
|
||||||
|
self.fresh_blood: bool = fresh_blood
|
||||||
|
self.veteran: bool = veteran
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.tier} {self.rank} ({self.points} LP)"
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"<{self.__class__.__qualname__} {self}>"
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
if isinstance(other, LeagueLeague):
|
||||||
|
equal = True
|
||||||
|
if other.veteran:
|
||||||
|
equal &= self.veteran == other.veteran
|
||||||
|
if other.fresh_blood:
|
||||||
|
equal &= self.fresh_blood == other.fresh_blood
|
||||||
|
if other.hot_streak:
|
||||||
|
equal &= self.hot_streak == other.hot_streak
|
||||||
|
if other.inactive:
|
||||||
|
equal &= self.inactive == other.inactive
|
||||||
|
if other.losses:
|
||||||
|
equal &= self.losses == other.losses
|
||||||
|
if other.wins:
|
||||||
|
equal &= self.wins == other.wins
|
||||||
|
if other.points:
|
||||||
|
equal &= self.points == other.points
|
||||||
|
if other.rank:
|
||||||
|
equal &= self.rank == other.rank
|
||||||
|
if other.tier:
|
||||||
|
equal &= self.tier == other.tier
|
||||||
|
return equal
|
||||||
|
else:
|
||||||
|
raise TypeError(f"Can't compare {self.__class__.__qualname__} with {other.__class__.__qualname__}")
|
||||||
|
|
||||||
|
def __ne__(self, other):
|
||||||
|
return not self.__eq__(other)
|
||||||
|
|
||||||
|
def __composite_values__(self):
|
||||||
|
return self.tier, \
|
||||||
|
self.rank, \
|
||||||
|
self.points, \
|
||||||
|
self.wins, \
|
||||||
|
self.losses, \
|
||||||
|
self.inactive, \
|
||||||
|
self.hot_streak, \
|
||||||
|
self.fresh_blood, \
|
||||||
|
self.veteran
|
||||||
|
|
||||||
|
@property
|
||||||
|
def played(self):
|
||||||
|
return self.wins + self.losses
|
||||||
|
|
||||||
|
@property
|
||||||
|
def winrate(self):
|
||||||
|
return self.wins / self.played
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls, d: dict):
|
||||||
|
return cls(
|
||||||
|
tier=d["tier"],
|
||||||
|
rank=d["rank"],
|
||||||
|
points=d["leaguePoints"],
|
||||||
|
wins=d["wins"],
|
||||||
|
losses=d["losses"],
|
||||||
|
inactive=d["inactive"],
|
||||||
|
hot_streak=d["hotStreak"],
|
||||||
|
fresh_blood=d["freshBlood"],
|
||||||
|
veteran=d["veteran"],
|
||||||
|
)
|
14
royalnet/packs/royal/utils/leaguerank.py
Normal file
14
royalnet/packs/royal/utils/leaguerank.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import enum
|
||||||
|
|
||||||
|
|
||||||
|
class LeagueRank(enum.Enum):
|
||||||
|
I = 1
|
||||||
|
II = 2
|
||||||
|
III = 3
|
||||||
|
IV = 4
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"{self.__class__.__qualname__}.{self.name}"
|
19
royalnet/packs/royal/utils/leaguetier.py
Normal file
19
royalnet/packs/royal/utils/leaguetier.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import enum
|
||||||
|
|
||||||
|
|
||||||
|
class LeagueTier(enum.Enum):
|
||||||
|
IRON = 0
|
||||||
|
BRONZE = 1
|
||||||
|
SILVER = 2
|
||||||
|
GOLD = 3
|
||||||
|
PLATINUM = 4
|
||||||
|
DIAMOND = 5
|
||||||
|
MASTER = 6
|
||||||
|
GRANDMASTER = 7
|
||||||
|
CHALLENGER = 8
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"{self.__class__.__qualname__}.{self.name}"
|
Loading…
Reference in a new issue