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