import steam_web_api.steam_types
from telethon.types import Message
from telethon import TelegramClient
from .. import loader, utils
from steam_web_api import Steam
import steam_web_api
from datetime import datetime
import logging
from typing import Union
import asyncio
"""
███ ███ ██ ██ ██████ ██ ██ ██ ██████ ███████ ███████
████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ████ ██ ██ ██ ██████ ██ ██ ██ ██ ██ ███████ █████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██████ ██ ██ ██████ ███████ ██████ ███████ ███████
Module name
📜 Licensed under the GNU AGPLv3
"""
# meta banner: link
# meta desc: desc
# meta developer: @BruhHikkaModules
# requires: python-steam-api beautifulsoup4
logger = logging.getLogger(__name__)
@loader.tds
class SteamClient(loader.Module):
"""Module for manage steam"""
strings = {
"name": "SteamClient",
"profile_data": "🪪 Steam ID: {id}"
"\n👤 Username: {username}"
"\n🙂 Steam level: {level}"
"\n👤 Profile URL: {profileurl}"
"\n🚫 VAC-BAN INFO: {vacinfo}"
"\n📅 Registration date: {registration_date}",
"api_key_updated": "🔄 API key has been updated",
"vac_ban": (
"\n VACBanned: {vacbanned}"
"\n Number of VAC-BANs: {numberofvacbans}"
"\n Days since last VAC-BAN: {dayslastvac}"
"\n Number of game bans: {numberofgamebans}"
),
"vac_ban_title": "Information about bans of {}:",
"game_info_title": "Information about games of {}",
"game_info_template": (
"\n Name: {name}"
"\n Total playtime: {playtime_forever}minutes"
"\n Played in the last two weeks: {playtime_2weeks}minutes"
"\n Last launch: {lastplay}"
),
"widget": "{nickname} currently playing in {gamename}",
}
strings_ru = {
"profile_data": "🪪 Steam ID: {id}"
"\n👤 Юзернейм: {username}"
"\n🙂 Уроверь Steam: {level}"
"\n👤 Профиль: {profileurl}"
"\n🚫 VAC-BAN INFO: {vacinfo}"
"\n📅 Дата регистрации: {registration_date}",
"api_key_updated": "🔄 API ключ был обновлён",
"vac_ban": (
"\n VACBanned: {vacbanned}"
"\n Число VAC-BANов: {numberofvacbans}"
"\n Дни с последнего VAC-BANа: {dayslastvac}"
"\n Число игровых банов: {numberofgamebans}"
),
"vac_ban_title": "Информация о банах {}:",
"game_info_title": "Информация о играх {}",
"game_info_template": (
"\n Название: {name}"
"\n Наиграно всего: {playtime_forever}мин"
"\n Наиграно за последние 2 недели: {playtime_2weeks}мин"
"\n Последний запуск: {lastplay}"
),
}
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"apikey",
"aabbccddeeff1252345234",
lambda: (
"Here's your api key"
"About API key: https://steamcommunity.com/dev/apikey"
),
validator=loader.validators.Hidden(),
),
loader.ConfigValue(
"steamid",
0,
lambda: "Your steamid for widgets and other things",
validator=loader.validators.Integer(),
),
)
self._widget_info = {"msgid": 0, "groupid": 0}
self.debug = False
async def client_ready(self, db, client):
self.steam = Steam(self.config["apikey"])
self.msgid = self.get("msgid", 0)
self.groupid = self.get("groupid", 0)
def resolve_id(self, username):
data = self.steam.users.search_user(username)
return data["player"]["steamid"]
def get_user_data(
self,
username=Union[bool, str],
uid: Union[int, bool] = 0,
by_id: Union[bool, str] = None,
):
if by_id:
return self.steam.users.get_user_details(uid)["player"]
else:
return self.steam.users.search_user(username)["player"]
@loader.command(ru_doc=" [Юзернейм] Найти пользователя (--id поиск по id)")
async def searchuser(self, message: Message):
"""[Username] (--raw raw json answer) (--id search by id) - Search user"""
args = utils.get_args_raw(message).split()
user = args[0]
if not args:
return await utils.answer(message, "noargs")
userdata = None
try:
if "--id" in args:
userdata = self.get_user_data(by_id=True, uid=int(user))["player"]
level = self.steam.users.get_user_steam_level(int(user))["player_level"]
vacdata = self.steam.users.get_player_bans(int(user))["players"][0]
else:
userdata = self.get_user_data(user)
uid = self.resolve_id(user)
level = self.steam.users.get_user_steam_level(uid)["player_level"]
vacdata = self.steam.users.get_player_bans(uid)["players"][0]
except ValueError:
return await utils.answer(
message, "this user not exist / no search results"
)
vacinfo = self.strings["vac_ban"].format(
vacbanned=vacdata["VACBanned"],
numberofvacbans=vacdata["NumberOfVACBans"],
dayslastvac=vacdata["DaysSinceLastBan"],
numberofgamebans=vacdata["NumberOfGameBans"],
)
account_created_date = datetime.fromtimestamp(userdata["timecreated"])
account_created_formatted = account_created_date.strftime("%d.%m.%Y")
await utils.answer_file(
message,
userdata["avatarfull"],
caption=self.strings["profile_data"].format(
id=userdata["steamid"],
username=userdata["personaname"],
level=level,
profileurl=userdata["profileurl"],
vacinfo=vacinfo,
avatar=userdata["avatar"],
registration_date=account_created_formatted,
),
)
@loader.command(
ru_doc=" [Юзернейм] Информация о VAC-BANах пользователя (--id поиск по id)"
)
async def vacbaninfo(self, message: Message):
"""[Username] Informbation about user VAC-BANs (--id search by id)"""
args = utils.get_args_raw(message).split()
user = args[0]
if not args:
return await utils.answer(message, "noargs")
try:
if "--id" in args:
userdata = self.get_user_data(by_id=True, uid=int(user))["player"]
vacdata = self.steam.users.get_player_bans(int(user))["players"][0]
else:
userdata = self.get_user_data(user)
uid = self.resolve_id(user)
vacdata = self.steam.users.get_player_bans(uid)["players"][0]
except ValueError:
return await utils.answer(
message, "this user not exist / no search results"
)
vacinfo = self.strings["vac_ban"].format(
vacbanned=vacdata["VACBanned"],
numberofvacbans=vacdata["NumberOfVACBans"],
dayslastvac=vacdata["DaysSinceLastBan"],
numberofgamebans=vacdata["NumberOfGameBans"],
)
vactitle = self.strings["vac_ban_title"]
await utils.answer(
message, response=vactitle.format(userdata["personaname"]) + vacinfo
)
@loader.command(
ru_doc=" - [Юзернейм] Информация о играх пользователя (--id поиск по id)"
)
async def gameownedlist(self, message: Message):
"""- [Username] Informbation about user games (--id search by id)"""
args = utils.get_args_raw(message).split()
user = args[0]
if not args:
return await utils.answer(message, "noargs")
try:
if "--id" in args:
userdata = self.get_user_data(by_id=True, uid=int(user))["player"]
gamedata = self.steam.users.get_owned_games(user)["games"]
else:
userdata = self.get_user_data(user)
uid = self.resolve_id(user)
gamedata = self.steam.users.get_owned_games(uid)["games"]
except ValueError:
return await utils.answer(
message, "this user not exist / no search results"
)
gameinfo_templates = []
for info in gamedata:
gameinfo = self.strings["game_info_template"].format(
name=info["name"],
playtime_forever=info["playtime_forever"],
playtime_2weeks=info.get("playtime_2weeks") or 0,
lastplay=info["rtime_last_played"],
)
gameinfo_templates.append(gameinfo)
await utils.answer(
message,
response=self.strings["game_info_title"].format(userdata["personaname"])
+ "\n\n".join(gameinfo_templates),
)
@loader.loop(autostart=True, interval=10)
async def updatewidget(self):
if 0 not in [self.groupid, self.msgid]:
gameid = self.get_user_data(by_id=True, uid=self.config["steamid"]).get(
"gameid"
)
gamename = self.get_user_data(by_id=True, uid=self.config["steamid"]).get(
"gameextrainfo"
)
await self.client.edit_message(
self._widget_info["groupid"],
self._widget_info["msgid"],
self.strings["widget"].format(
nickname=self.get_user_data(by_id=True, uid=self.config["steamid"])[
"personaname"
],
gamename=(
f"{gamename}"
if gameid
else "nothing."
),
),
)
@loader.command()
async def setwidgetsteam(self, message: Message):
"""- Reply to message what need to be widget (--reset to remove widget)"""
args = utils.get_args_raw(message)
await utils.answer(
message, "wait pls..."
) # into self.strings (translate description) and wait in all modules
if self.config["steamid"] == 0:
return await utils.answer(message, "no steamid in cfg")
if not args:
reply = await message.get_reply_message()
msgid = reply.id
chid = reply.chat_id
self.set("msgid", msgid)
self.set("groupid", chid)
await utils.answer(
message,
"Info collected, message delete in 5 seconds, soon this message edit in widget",
)
await asyncio.sleep(5)
await message.delete()
gameid = self.get_user_data(by_id=True, uid=self.config["steamid"]).get(
"gameid"
)
gamename = self.get_user_data(by_id=True, uid=self.config["steamid"]).get(
"gameextrainfo"
)
await self.client.edit_message(
self.groupid,
self.msgid,
self.strings["widget"].format(
nickname=self.get_user_data(by_id=True, uid=self.config["steamid"])[
"personaname"
],
gamename=(
f"{gamename}"
if gameid
else "nothing."
),
),
)
else:
self.set("msgid", 0)
self.set("groupid", 0)
@loader.command()
async def execsteamcode(self, message: Message):
"""DO NOT USE THIS COMMAND! IT ONLY WORKS WHEN DEBUGGING IS ENABLED! THIS COMMAND IS FOR DEVELOPER"""
if not self.debug:
await utils.answer(
message,
"this command does nothing if debug-mode is not enabled."
"don't try to use it."
"even if you get into the code and enable debug-mode, all responsibility for actions with this command is yours.",
)
else:
environment = {
"client": self.steam,
"widget_info": self._widget_info
}
args = utils.get_args_raw(message)
await utils.answer(message, str(eval(args, environment)))
@loader.command(ru_doc=" - Обновить API ключ")
async def updateapikey(self, message: Message):
"""- Update API key"""
self.steam = Steam(self.config["apikey"])
await utils.answer(message, self.strings["api_key_updated"])