Skip to content

Commit 224f609

Browse files
authored
Merge pull request #169 from DJDevon3/DJDevon3-SteamAPI
Update Steam API Example with Connection Manager
2 parents 77aee46 + eda9969 commit 224f609

File tree

1 file changed

+87
-76
lines changed

1 file changed

+87
-76
lines changed
Lines changed: 87 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,48 @@
1-
# SPDX-FileCopyrightText: 2022 DJDevon3 (Neradoc & Deshipu helped) for Adafruit Industries
1+
# SPDX-FileCopyrightText: 2024 DJDevon3
22
# SPDX-License-Identifier: MIT
3-
# Coded for Circuit Python 8.0
4-
"""DJDevon3 Adafruit Feather ESP32-S2 api_steam Example"""
5-
import gc
6-
import json
3+
# Coded for Circuit Python 8.2.x
4+
"""Steam API Get Owned Games Example"""
5+
# pylint: disable=import-error
6+
77
import os
8-
import ssl
98
import time
109

11-
import socketpool
10+
import adafruit_connection_manager
1211
import wifi
1312

1413
import adafruit_requests
1514

1615
# Steam API Docs: https://steamcommunity.com/dev
1716
# Steam API Key: https://steamcommunity.com/dev/apikey
18-
# Steam Usernumber: Visit https://steamcommunity.com
19-
# click on your profile icon, your usernumber will be in the browser url.
17+
# Numerical Steam ID: Visit https://store.steampowered.com/account/
18+
# Your account name will be in big bold letters.
19+
# Your numerical STEAM ID will be below in a very small font.
2020

2121
# Get WiFi details, ensure these are setup in settings.toml
2222
ssid = os.getenv("CIRCUITPY_WIFI_SSID")
2323
password = os.getenv("CIRCUITPY_WIFI_PASSWORD")
2424
# Requires Steam Developer API key
25-
steam_usernumber = os.getenv("steam_id")
26-
steam_apikey = os.getenv("steam_api_key")
27-
28-
# Initialize WiFi Pool (There can be only 1 pool & top of script)
29-
pool = socketpool.SocketPool(wifi.radio)
25+
steam_usernumber = os.getenv("STEAM_ID")
26+
steam_apikey = os.getenv("STEAM_API_KEY")
3027

31-
# Time between API refreshes
28+
# API Polling Rate
3229
# 900 = 15 mins, 1800 = 30 mins, 3600 = 1 hour
33-
sleep_time = 900
30+
SLEEP_TIME = 3600
31+
32+
# Set debug to True for full JSON response.
33+
# WARNING: Steam's full response will overload most microcontrollers
34+
# SET TO TRUE IF YOU FEEL BRAVE =)
35+
DEBUG = False
36+
37+
# Initalize Wifi, Socket Pool, Request Session
38+
pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio)
39+
ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio)
40+
requests = adafruit_requests.Session(pool, ssl_context)
3441

3542
# Deconstruct URL (pylint hates long lines)
3643
# http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/
3744
# ?key=XXXXXXXXXXXXXXXXXXXXX&include_played_free_games=1&steamid=XXXXXXXXXXXXXXXX&format=json
38-
Steam_OwnedGames_URL = (
45+
STEAM_SOURCE = (
3946
"http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?"
4047
+ "key="
4148
+ steam_apikey
@@ -45,75 +52,79 @@
4552
+ "&format=json"
4653
)
4754

48-
if sleep_time < 60:
49-
sleep_time_conversion = "seconds"
50-
sleep_int = sleep_time
51-
elif 60 <= sleep_time < 3600:
52-
sleep_int = sleep_time / 60
53-
sleep_time_conversion = "minutes"
54-
elif 3600 <= sleep_time < 86400:
55-
sleep_int = sleep_time / 60 / 60
56-
sleep_time_conversion = "hours"
57-
else:
58-
sleep_int = sleep_time / 60 / 60 / 24
59-
sleep_time_conversion = "days"
60-
61-
# Connect to Wi-Fi
62-
print("\n===============================")
63-
print("Connecting to WiFi...")
64-
requests = adafruit_requests.Session(pool, ssl.create_default_context())
65-
while not wifi.radio.ipv4_address:
66-
try:
67-
wifi.radio.connect(ssid, password)
68-
except ConnectionError as e:
69-
print("Connection Error:", e)
70-
print("Retrying in 10 seconds")
71-
time.sleep(10)
72-
gc.collect()
73-
print("Connected!\n")
55+
56+
def time_calc(input_time):
57+
"""Converts seconds to minutes/hours/days"""
58+
if input_time < 60:
59+
return f"{input_time:.0f} seconds"
60+
if input_time < 3600:
61+
return f"{input_time / 60:.0f} minutes"
62+
if input_time < 86400:
63+
return f"{input_time / 60 / 60:.0f} hours"
64+
return f"{input_time / 60 / 60 / 24:.1f} days"
65+
66+
67+
def _format_datetime(datetime):
68+
"""F-String formatted struct time conversion"""
69+
return (
70+
f"{datetime.tm_mon:02}/"
71+
+ f"{datetime.tm_mday:02}/"
72+
+ f"{datetime.tm_year:02} "
73+
+ f"{datetime.tm_hour:02}:"
74+
+ f"{datetime.tm_min:02}:"
75+
+ f"{datetime.tm_sec:02}"
76+
)
77+
7478

7579
while True:
80+
# Connect to Wi-Fi
81+
print("\nConnecting to WiFi...")
82+
while not wifi.radio.ipv4_address:
83+
try:
84+
wifi.radio.connect(ssid, password)
85+
except ConnectionError as e:
86+
print("❌ Connection Error:", e)
87+
print("Retrying in 10 seconds")
88+
print("✅ Wifi!")
89+
7690
try:
77-
print("\nAttempting to GET STEAM Stats!") # --------------------------------
78-
# Print Request to Serial
79-
debug_request = False # Set true to see full request
80-
if debug_request:
81-
print("Full API GET URL: ", Steam_OwnedGames_URL)
82-
print("===============================")
91+
print(" | Attempting to GET Steam API JSON!")
8392
try:
84-
steam_response = requests.get(url=Steam_OwnedGames_URL).json()
93+
steam_response = requests.get(url=STEAM_SOURCE)
94+
steam_json = steam_response.json()
8595
except ConnectionError as e:
8696
print("Connection Error:", e)
8797
print("Retrying in 10 seconds")
8898

89-
# Print Response to Serial
90-
debug_response = False # Set true to see full response
91-
if debug_response:
92-
dump_object = json.dumps(steam_response)
93-
print("JSON Dump: ", dump_object)
94-
95-
# Print Keys to Serial
96-
steam_debug_keys = True # Set True to print Serial data
97-
if steam_debug_keys:
98-
game_count = steam_response["response"]["game_count"]
99-
print("Total Games: ", game_count)
100-
total_minutes = 0
101-
102-
for game in steam_response["response"]["games"]:
103-
total_minutes += game["playtime_forever"]
104-
total_hours = total_minutes / 60
105-
total_days = total_minutes / 60 / 24
106-
print(f"Total Hours: {total_hours}")
107-
print(f"Total Days: {total_days}")
108-
109-
print("Monotonic: ", time.monotonic())
99+
print(" | ✅ Steam JSON!")
100+
101+
if DEBUG:
102+
print("Full API GET URL: ", STEAM_SOURCE)
103+
print(steam_json)
104+
105+
game_count = steam_json["response"]["game_count"]
106+
print(f" | | Total Games: {game_count}")
107+
TOTAL_MINUTES = 0
108+
109+
for game in steam_json["response"]["games"]:
110+
TOTAL_MINUTES += game["playtime_forever"]
111+
total_hours = TOTAL_MINUTES / 60
112+
total_days = TOTAL_MINUTES / 60 / 24
113+
total_years = TOTAL_MINUTES / 60 / 24 / 365
114+
print(f" | | Total Hours: {total_hours}")
115+
print(f" | | Total Days: {total_days}")
116+
print(f" | | Total Years: {total_years:.2f}")
117+
118+
steam_response.close()
119+
print("✂️ Disconnected from Steam API")
120+
110121
print("\nFinished!")
111-
print("Next Update in %s %s" % (int(sleep_int), sleep_time_conversion))
122+
print(f"Board Uptime: {time_calc(time.monotonic())}")
123+
print(f"Next Update: {time_calc(SLEEP_TIME)}")
112124
print("===============================")
113-
gc.collect()
114125

115126
except (ValueError, RuntimeError) as e:
116-
print("Failed to get data, retrying\n", e)
127+
print(f"Failed to get data, retrying\n {e}")
117128
time.sleep(60)
118-
continue
119-
time.sleep(sleep_time)
129+
break
130+
time.sleep(SLEEP_TIME)

0 commit comments

Comments
 (0)