Files
MissingStrangeItemsTF2/main.py
2025-06-24 19:05:03 -03:00

249 lines
7.3 KiB
Python

import requests
from env import *
# https://wiki.alliedmods.net/Team_fortress_2_item_definition_indexes
def query_schema(start):
url = f"http://api.steampowered.com/IEconItems_440/GetSchemaItems/v0001/?key={api_key}&start={start}&language={language}"
response = requests.get(url)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"Error fetching data: {response.status_code}")
def query_schema_items():
start = 0
all_items = []
while True:
data = query_schema(start)
if 'result' in data and 'items' in data['result']:
items = data['result']['items']
if not items:
break
all_items.extend(items)
if 'next' in data['result']:
start = data['result']['next']
else:
break
else:
break
return all_items
def fetch_my_items():
url = f"http://api.steampowered.com/IEconItems_440/GetPlayerItems/v0001/?key={api_key}&SteamID={steam_id}"
response = requests.get(url)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"Error fetching data: {response.status_code}")
def save_to_file(data, filename):
with open(filename, 'w') as file:
file.write(data)
import json
import os
# Save the response to this url as a file called "my_items.json"
# Fetch items if not saved
if not os.path.exists("my_items.json"):
# print("Fetching my items...")
my_items = fetch_my_items()
save_to_file(json.dumps(my_items, indent=4), "my_items.json")
else:
# print("My items already fetched.")
my_items = json.load(open("my_items.json"))
if not os.path.exists("schema_items.json"):
# print("Fetching schema items...")
# Save the schema items to a file called "schema_items.json"
schema_items = query_schema_items()
# Turn array into json object with "items" as key
schema_items_json = {"items": schema_items}
save_to_file(json.dumps(schema_items_json, indent=4), "schema_items.json")
else:
# print("Schema items already fetched.")
schema_items_json = json.load(open("schema_items.json"))
# Now filter both items to find only strange items
def is_strange_items(item):
return item.get('quality', 0) == 11 # Strange quality
def is_strange_schema(item):
return item.get('capabilities', {}).get('can_strangify', False)
# Filter to only weapons
def is_weapon(item):
return item.get('item_slot', '') in ['primary', 'secondary', 'melee', 'pda', 'pda2', 'building']
# Filter out war paints
def is_war_paint(item):
attributes = item.get('attributes', [])
for attr in attributes:
if attr.get('name', '') == 'set_item_texture_wear':
return True
return False
# Filter Slot Tokens
def is_slot_token(item):
return "Slot Token" in item.get('name', '')
# Filter Default items
def is_default(item):
return item.get('defindex') <= 30 or item.get('defindex') == 735 # Default items are not strange
# Filter Botkiller items
def is_botkiller(item):
return "Botkiller" in item.get('name', '')
# Filter festive items
def is_festive(item):
return "Festive" in item.get('name', '')
# Filter inelligible promo items
def is_promo(item):
name = item.get('name', '')
items = [
"Promo", # Generic promo items
"TTG", # Poker Night items (Telltale Games)
"Quackenbirdt",
"Black Rose",
"Three-Rune Blade",
"Fishcake",
"Iron Curtain",
"Sharpened Volcano Fragment",
"Sun-on-a-Stick",
"Nostromo Napalmer",
"Sharp Dresser",
"Maul",
"Fortified Compound",
"Robo-Sandvich",
"Freedom Staff",
"Ham Shank",
"Prinny Machete",
"Short Circuit",
"Ap-Sap",
]
for item in items:
if item in name:
return True
return False
def is_community(item):
name = item.get('name', '')
items = [
"Gunboats",
"Darwin's Danger Shield",
"Ali Baba's Wee Booties",
"Bootlegger",
"Jumper", # Both jumper items
"Horseless Headless Horseman's Headtaker",
"Nessie's Nine Iron",
"Scottish Handshake",
"Cozy Camper",
"Wanga Prick",
"Postal Pummeler",
"Unarmed Combat",
"Conscientious Objector",
"Bat Outta Hell",
"Buffalo Steak Sandvich",
"Eureka Effect",
"Vita-Saw",
"Tide Turner", # Why not valve?
"Dragon's Fury", # Why not valve?
"Thermal Thruster", # Why not valve?
"Gas Passer", # Why not valve?
"Hot Hand", # Why not valve?
"Second Banana", # Why not valve?
]
for item in items:
if item in name:
return True
return False
def is_bread_item(item):
name = item.get('name', '')
items = [
"Bread Bite",
"Self-Aware Beauty Mark",
"Mutated Milk",
"Snack Attack",
]
for item in items:
if item in name:
return True
return False
def is_reskin(item):
name = item.get('name', '')
items = [
"Shooting Star",
"C.A.P.P.E.R",
"Batsaber",
"Giger Counter",
]
for item in items:
if item in name:
return True
return False
def final_filter(item):
name = item.get('name', '')
items = [
"Memory Maker", # Unobtainable item (as of now)
"Saxxy", # Unobtainable item (as of now)
"Deflector", # MVM specific item
"Gloves of Running Urgently MvM", # MVM specific item
"Golden Wrench", # Extremely rare item, not obtainable
"Gold Frying Pan", # Extremely rare item, not obtainable
"Necro Smasher", # Unobtainable item (as of now, strangifier is extremely rare)
]
for item in items:
if item in name:
return True
return False
my_items = my_items.get('result', {}).get('items', [])
schema_items = schema_items_json.get('items', [])
strange_items = filter(is_strange_items, my_items)
strange_schema_items = filter(is_strange_schema, schema_items)
# Filter to only weapons, for brevity
strange_schema_items = filter(is_weapon, strange_schema_items)
# Filter out war paints
strange_schema_items = filter(lambda item: not is_war_paint(item), strange_schema_items)
# Filter out slot tokens
strange_schema_items = filter(lambda item: not is_slot_token(item), strange_schema_items)
# Filter out default items
strange_schema_items = filter(lambda item: not is_default(item), strange_schema_items)
# Filter out ineligible promo items
strange_schema_items = filter(lambda item: not is_promo(item), strange_schema_items)
# Filter out ineligible community items
strange_schema_items = filter(lambda item: not is_community(item), strange_schema_items)
# Filter out botkiller items (are strange, but undesirable)
strange_schema_items = filter(lambda item: not is_botkiller(item), strange_schema_items)
# Filter out festive items (are strange, but undesirable)
strange_schema_items = filter(lambda item: not is_festive(item), strange_schema_items)
# Filter out bread items (are strange, but undesirable)
#strange_schema_items = filter(lambda item: not is_bread_item(item), strange_schema_items)
# Filter out reskins (are strange, but generally expensive)
#strange_schema_items = filter(lambda item: not is_reskin(item), strange_schema_items)
# Filter out general ineligible items
strange_schema_items = filter(lambda item: not final_filter(item), strange_schema_items)
# Now remove items from schema that have the same defidex as items in my_items
for item in strange_items:
defindex = item.get('defindex')
strange_schema_items = [s_item for s_item in strange_schema_items if s_item.get('defindex') != defindex]
# Now print what's remaining, like defindex: name
for item in strange_schema_items:
defindex = item.get('defindex')
name = item.get('name', 'Unknown Item')
common_name = item.get('item_name', name) # Fallback to 'name' if 'item_name' is not present
#print(f"Defindex: {defindex}, Name: {name}")
print(f"{common_name} ({name}) [{defindex}]")