mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-27 13:34:28 +00:00
106 lines
5.2 KiB
Python
106 lines
5.2 KiB
Python
from typing import *
|
||
import steam.steamid
|
||
import steam.webapi
|
||
import datetime
|
||
import royalnet.commands as rc
|
||
import royalnet.utils as ru
|
||
|
||
from ..tables import Steam, FiorygiTransaction
|
||
|
||
|
||
class SteampoweredCommand(rc.Command):
|
||
name: str = "steampowered"
|
||
|
||
description: str = "Connetti il tuo account di Steam!"
|
||
|
||
syntax: str = "{profile_url}"
|
||
|
||
def __init__(self, interface: rc.CommandInterface):
|
||
super().__init__(interface)
|
||
if "Steam" not in self.config or "web_api_key" not in self.config["Steam"]:
|
||
raise rc.ConfigurationError("[c]Steam.web_api_key[/c] config option is missing!")
|
||
self._api = steam.webapi.WebAPI(self.config["Steam"]["web_api_key"])
|
||
|
||
@staticmethod
|
||
def _display(account: Steam):
|
||
string = f"ℹ️ [url={account.profile_url}]{account.persona_name}[/url]\n" \
|
||
f"[b]Level {account.account_level}[/b]\n" \
|
||
f"\n" \
|
||
f"Owned games: [b]{account.owned_games_count}[/b]\n" \
|
||
f"Most played 2 weeks: [url=https://store.steampowered.com/app/{account.most_played_game_2weeks}]{account.most_played_game_2weeks}[/url]\n" \
|
||
f"Most played forever: [url=https://store.steampowered.com/app/{account.most_played_game_forever}]{account.most_played_game_forever}[/url]\n" \
|
||
f"\n" \
|
||
f"SteamID: [c]{account.steamid.as_32}[/c]\n" \
|
||
f"SteamID2: [c]{account.steamid.as_steam2}[/c]\n" \
|
||
f"SteamID3: [c]{account.steamid.as_steam3}[/c]\n" \
|
||
f"SteamID64: [c]{account.steamid.as_64}[/c]\n" \
|
||
f"\n" \
|
||
f"Created on: [b]{account.account_creation_date}[/b]\n"
|
||
return string
|
||
|
||
async def _call(self, method, *args, **kwargs):
|
||
try:
|
||
return await ru.asyncify(method, *args, **kwargs)
|
||
except Exception as e:
|
||
raise rc.ExternalError("\n".join(e.args).replace(self.config["Steam"]["web_api_key"], "HIDDEN"))
|
||
|
||
async def _update(self, account: Steam):
|
||
# noinspection PyProtectedMember
|
||
response = await self._call(self._api.ISteamUser.GetPlayerSummaries_v2, steamids=account._steamid)
|
||
r = response["response"]["players"][0]
|
||
account.persona_name = r["personaname"]
|
||
account.profile_url = r["profileurl"]
|
||
account.avatar = r["avatar"]
|
||
account.primary_clan_id = r["primaryclanid"]
|
||
account.account_creation_date = datetime.datetime.fromtimestamp(r["timecreated"])
|
||
|
||
# noinspection PyProtectedMember
|
||
response = await self._call(self._api.IPlayerService.GetSteamLevel_v1, steamid=account._steamid)
|
||
account.account_level = response["response"]["player_level"]
|
||
|
||
# noinspection PyProtectedMember
|
||
response = await self._call(self._api.IPlayerService.GetOwnedGames_v1,
|
||
steamid=account._steamid,
|
||
include_appinfo=False,
|
||
include_played_free_games=True,
|
||
include_free_sub=False,
|
||
appids_filter=None)
|
||
account.owned_games_count = response["response"]["game_count"]
|
||
if response["response"]["game_count"] >= 0:
|
||
account.most_played_game_2weeks = sorted(response["response"]["games"], key=lambda g: -g.get("playtime_2weeks", 0))[0]["appid"]
|
||
account.most_played_game_forever = sorted(response["response"]["games"], key=lambda g: -g.get("playtime_forever", 0))[0]["appid"]
|
||
|
||
async def run(self, args: rc.CommandArgs, data: rc.CommandData) -> None:
|
||
author = await data.get_author()
|
||
if len(args) > 0:
|
||
url = args.joined()
|
||
steamid64 = await self._call(steam.steamid.steam64_from_url, url)
|
||
if steamid64 is None:
|
||
raise rc.InvalidInputError("Quel link non è associato ad alcun account Steam.")
|
||
response = await self._call(self._api.ISteamUser.GetPlayerSummaries_v2, steamids=steamid64)
|
||
r = response["response"]["players"][0]
|
||
steam_account = self.alchemy.get(Steam)(
|
||
user=author,
|
||
_steamid=int(steamid64),
|
||
persona_name=r["personaname"],
|
||
profile_url=r["profileurl"],
|
||
avatar=r["avatarfull"],
|
||
primary_clan_id=r["primaryclanid"],
|
||
account_creation_date=datetime.datetime.fromtimestamp(r["timecreated"])
|
||
)
|
||
data.session.add(steam_account)
|
||
await data.session_commit()
|
||
await data.reply(f"↔️ Account {steam_account} connesso a {author}!")
|
||
await FiorygiTransaction.spawn_fiorygi(data, author, 1,
|
||
"aver connesso il proprio account di Steam a Royalnet")
|
||
else:
|
||
# Update and display the Steam info for the current account
|
||
if len(author.steam) == 0:
|
||
raise rc.UserError("Nessun account di Steam trovato.")
|
||
message = ""
|
||
for account in author.steam:
|
||
await self._update(account)
|
||
message += self._display(account)
|
||
message += "\n"
|
||
await data.session_commit()
|
||
await data.reply(message)
|