1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-27 13:34:28 +00:00

leagueoflegends

This commit is contained in:
Steffo 2019-10-28 13:43:01 +01:00
parent d8b0041a4c
commit a01f6868dd
7 changed files with 476 additions and 1 deletions

View 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}!")

View file

@ -12,6 +12,7 @@ from .reminders import Reminder
from .triviascores import TriviaScore
from .mmevents import MMEvent
from .mmresponse import MMResponse
from .leagueoflegends import LeagueOfLegends
# Enter the tables of your Pack here!
available_tables = [
@ -27,6 +28,7 @@ available_tables = [
TriviaScore,
MMEvent,
MMResponse,
LeagueOfLegends
]
# Don't change this, it should automatically generate __all__

View 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]"

View file

@ -1,4 +1,7 @@
from .mmchoice import MMChoice
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"]

View 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"],
)

View 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}"

View 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}"