Today I was trying to expand my code a little by automating when the user goes online.
To do this, I use players.json from a FiveM server, the output looks like this:
{"endpoint":"127.0.0.1","id":32,"identifiers":["license:948704b759518d74a682144ade779ac2a1e47c89","xbl:2535411592184061","live:914798949911430","discord:757436127689965649","fivem:3055601","license2:948704b759518d74a682144ade779ac2a1e47c89"],"name":"perez_04","ping":60},
and this goes on and on for every user.
I was able to retrieve all the information I needed, like the discord id and the player name, however, I have a problem.
What I have now is that every piece of data, including numbers-only, I store them as strings (I think this is the only way to get it to work with a list) like this:
# ----- GET INFO -----
users = {}
for player_data_eu1 in online_eu1:
player_name_eu1 = player_data_eu1.get("name", "N/A")
discord_id_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "discord" in identifier]
in_game_id_eu1 = player_data_eu1.get("id", "N/A")
endpoint_eu1 = player_data_eu1.get("endpoint", "N/A")
license_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "license" in identifier]
xbl_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "xbl" in identifier]
live_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "live" in identifier]
fivem_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "fivem" in identifier]
license2_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "license2" in identifier]
ping_eu1 = player_data_eu1.get("ping", "N/A")
#----- SAVE INFO -----
users[str(player_name_eu1)] = player_name_eu1
users[str(discord_id_eu1)] = discord_id_eu1
users[str(in_game_id_eu1)] = in_game_id_eu1
users[str(endpoint_eu1)] = endpoint_eu1
users[str(license_eu1)] = license_eu1
users[str(xbl_eu1)] = xbl_eu1
users[str(live_eu1)] = live_eu1
users[str(fivem_eu1)] = fivem_eu1
users[str(license2_eu1)] = license2_eu1
users[str(ping_eu1)] = ping_eu1
and everything works fine however I need the discord ID as an integer and out of the squared brackets because the output of the print message:
print("Loaded online data for:", player_name_eu1)
print("Player Name:", player_name_eu1)
print("Discord ID:", discord_id_eu1_i)
print("In-Game ID:", in_game_id_eu1)
print("\n") # Add a newline after each user's data
gives me the discord id as for example:
Discord ID: ['633993765494033'] # Note that this is not an actual discord ID, its just to show.
I need to remove the ' '
and the [ ]
from the final product, but I'm unable to do so.
This is what I have tried so far:
if discord_id_eu1:
discord_id_eu1_i = [int(s.strip("[]'")) for s in discord_id_eu1]
elif not discord_id_eu1:
print("No discord ID, skipping")
continue
else:
discord_id_eu1 = []
discord_id_eu1_i = []
but this only stripped the ' '
, and not the [ ]
. I tried everything!
Please not that discord_id_eu1 is a STRING list full of MULTIPLE STRINGS of Numbers, so converting it into an integer without separating each number first throws an error
An unexpected error occurred: argument of type 'int' is not iterable
Here is the full code section, for any questions, please feel free to ask. Thank you in advance!
@tasks.loop(seconds=20)
async def check_activities():
for guild in bot.guilds:
for member in guild.members:
if member.bot:
continue
# Check if member has Trainee, Cadet, or SWAT role
allowed_role_ids = [1033432392758722682, 962226985222959145, 958274314036195359]
has_allowed_role = any(role.id in allowed_role_ids for role in member.roles)
if not has_allowed_role:
continue # Skip members without the specified roles
try:
# ---- EU1 ----
request_online_eu1 = requests.get(api_url_online_eu1)
request_online_eu1.raise_for_status() # Raise an HTTPError for bad responses
online_eu1 = request_online_eu1.json()
time.sleep(1)
if request_online_eu1.status_code == 200:
print("Status Code: 200 (OK)")
online_eu1 = request_online_eu1.json()
else:
print("Status code not 200, locked program")
users = {}
for player_data_eu1 in online_eu1:
player_name_eu1 = player_data_eu1.get("name", "N/A")
discord_id_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "discord" in identifier]
in_game_id_eu1 = player_data_eu1.get("id", "N/A")
endpoint_eu1 = player_data_eu1.get("endpoint", "N/A")
license_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "license" in identifier]
xbl_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "xbl" in identifier]
live_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "live" in identifier]
fivem_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "fivem" in identifier]
license2_eu1 = [identifier.split(":")[1] for identifier in player_data_eu1.get("identifiers", []) if "license2" in identifier]
ping_eu1 = player_data_eu1.get("ping", "N/A")
users[str(player_name_eu1)] = player_name_eu1
users[str(discord_id_eu1)] = discord_id_eu1
users[str(in_game_id_eu1)] = in_game_id_eu1
users[str(endpoint_eu1)] = endpoint_eu1
users[str(license_eu1)] = license_eu1
users[str(xbl_eu1)] = xbl_eu1
users[str(live_eu1)] = live_eu1
users[str(fivem_eu1)] = fivem_eu1
users[str(license2_eu1)] = license2_eu1
users[str(ping_eu1)] = ping_eu1
if discord_id_eu1:
discord_id_eu1_i = [int(s.strip("[]'")) for s in discord_id_eu1]
elif not discord_id_eu1:
print("No discord ID, skipping")
continue
else:
discord_id_eu1 = []
discord_id_eu1_i = []
print("Loaded online data for:", player_name_eu1)
print("Player Name:", player_name_eu1)
print("Discord ID:", discord_id_eu1_i)
print("In-Game ID:", in_game_id_eu1)
print("\n") # Add a newline after each user's data
# ------ LOGIC ------
# ---- EU1 ----
if member.id in discord_id_eu1_i:
print(f"Success!, ID: {in_game_id_eu1}, NAME: {player_name_eu1}, DISCORD: {discord_id_eu1_i}")
# ---- EXCEPTIONS ----
except requests.exceptions.HTTPError as e:
print(f'HTTPError: {e}')
except requests.exceptions.ConnectionError as e:
print(f'ConnectionError: {e}')
except requests.exceptions.RequestException as e:
print(f'RequestException: {e}')
except Exception as e:
print(f'An unexpected error occurred: {e}')
The response you get from the server is in JSON Format. Treat it as such. Right now you are working with strings, which complicates everything.
Try this instead:
import json
# The provided JSON string
json_string = '{"endpoint":"127.0.0.1","id":32,"identifiers":["license:948704b759518d74a682144ade779ac2a1e47c89","xbl:2535411592184061","live:914798949911430","discord:757436127689965649","fivem:3055601","license2:948704b759518d74a682144ade779ac2a1e47c89"],"name":"perez_04","ping":60}'
# Deserialize the JSON string into a Python dictionary
data = json.loads(json_string)
# Access the data
print("Endpoint:", data["endpoint"])
print("ID:", data["id"])
print("Identifiers:", data["identifiers"])
print("Name:", data["name"])
print("Ping:", data["ping"])