import requests HEADERS = { "User-Agent": "neo1/1.0", "Accept": "application/json", } def search_player(name): try: url = "https://users.roblox.com/v1/usernames/users" resp = requests.post( url, json={"usernames": [name], "excludeBannedUsers": False}, headers=HEADERS, timeout=8, ) data = resp.json() users = data.get("data", []) if not users: return None user = users[0] user_id = user["id"] profile = get_profile(user_id) avatar = get_avatar(user_id) stats = get_stats(user_id) return { "id": user_id, "name": user.get("name"), "display_name": user.get("displayName"), "description": profile.get("description", ""), "created": profile.get("created", "Unknown"), "is_banned": profile.get("isBanned", False), "avatar": avatar, "friends": stats.get("friends", "N/A"), "followers": stats.get("followers", "N/A"), "following": stats.get("following", "N/A"), } except Exception as e: return {"error": str(e)} def get_profile(user_id): try: url = f"https://users.roblox.com/v1/users/{user_id}" resp = requests.get(url, headers=HEADERS, timeout=8) return resp.json() except Exception: return {} def get_avatar(user_id): try: url = ( f"https://thumbnails.roblox.com/v1/users/avatar-headshot" f"?userIds={user_id}&size=420x420&format=Png&isCircular=false" ) resp = requests.get(url, headers=HEADERS, timeout=8) data = resp.json() return data.get("data", [{}])[0].get("imageUrl", None) except Exception: return None def get_stats(user_id): result = {} try: r = requests.get( f"https://friends.roblox.com/v1/users/{user_id}/friends/count", headers=HEADERS, timeout=8, ) result["friends"] = r.json().get("count", "N/A") except Exception: result["friends"] = "N/A" try: r = requests.get( f"https://friends.roblox.com/v1/users/{user_id}/followers/count", headers=HEADERS, timeout=8, ) result["followers"] = r.json().get("count", "N/A") except Exception: result["followers"] = "N/A" try: r = requests.get( f"https://friends.roblox.com/v1/users/{user_id}/followings/count", headers=HEADERS, timeout=8, ) result["following"] = r.json().get("count", "N/A") except Exception: result["following"] = "N/A" return result def search_game(name): try: url = f"https://games.roblox.com/v1/games/list?keyword={name}&maxRows=5&startRows=0" resp = requests.get(url, headers=HEADERS, timeout=8) data = resp.json() games = data.get("games", []) if not games: return None universe_id = games[0].get("universeId") if not universe_id: return None return get_game_details(universe_id) except Exception as e: return {"error": str(e)} def get_game_details(universe_id): try: url = f"https://games.roblox.com/v1/games?universeIds={universe_id}" resp = requests.get(url, headers=HEADERS, timeout=8) data = resp.json() games = data.get("data", []) if not games: return None g = games[0] last_update = g.get("updated", "Unknown") if last_update and last_update != "Unknown": last_update = last_update[:10] return { "name": g.get("name"), "genre": g.get("genre", "Uncategorized"), "visits": g.get("visits", 0), "last_update": last_update, "description": g.get("description") or "No description.", "creator": g.get("creator", {}).get("name", "Unknown"), "playing": g.get("playing", 0), "id": universe_id, } except Exception as e: return {"error": str(e)} def format_player(data): if not data: return "I couldn't find that player on Roblox. Please check that the username is correct." if "error" in data: return f"An error occurred while searching for the player: {data['error']}" description = data.get("description") or "No description." created = data.get("created", "Unknown") if created != "Unknown": created = created[:10] banned = "Yes āš ļø" if data.get("is_banned") else "No āœ…" friends = data.get("friends", "N/A") followers = data.get("followers", "N/A") following = data.get("following", "N/A") lines = [ "Here's the public data for this Roblox player 😊", "", f"šŸ‘¤ **Username:** {data['name']}", f"āœļø **Display name:** {data['display_name']}", f"šŸ†” **ID:** {data['id']}", f"šŸ“ **Description:** {description}", f"šŸ“… **Account created:** {created}", f"🚫 **Banned?:** {banned}", "", "šŸ“Š **Stats:**", f"šŸ‘« **Friends:** {friends}", f"šŸ‘„ **Followers:** {followers}", f"āž”ļø **Following:** {following}", ] if data.get("avatar"): lines.append(f"\nšŸ–¼ļø **Avatar:** {data['avatar']}") return "\n".join(lines) def format_game(data): if not data: return "I couldn't find that game on Roblox. Try a different name." if "error" in data: return f"An error occurred while searching for the game: {data['error']}" visits = data.get("visits", 0) try: visits = f"{int(visits):,}" except Exception: visits = str(visits) playing = data.get("playing", 0) try: playing = f"{int(playing):,}" except Exception: playing = str(playing) lines = [ "Roblox game data šŸ˜Ž", "", f"šŸŽ® **Name:** {data.get('name', 'Unknown')}", f"šŸŽ­ **Genre:** {data.get('genre', 'Uncategorized')}", f"šŸ‘ļø **Visits:** {visits}", f"šŸ”„ **Last update:** {data.get('last_update', 'Unknown')}", f"šŸ“ **Description:** {data.get('description', 'No description.')}", "", f"šŸ‘¤ **Creator:** {data.get('creator', 'Unknown')}", f"šŸ‘„ **Currently playing:** {playing}", ] return "\n".join(lines)