FoxAPI Documentation
Join our discord : https://discord.gg/XJJkuDYZXw
Installation
pip install foxapi
FoxAPI is a wrapper for the Official Foxhole API. It provides methods to interact with various endpoints related to maps, war data, dynamic/static map states, and more. The client supports data caching and etags natively to avoid overloading the Foxhole servers.
If you are new to the developer world or just like coding, it's the perfect tool!
Also, if you work with discord.py or any asynchronous API, this tool might be useful as well since it support async methods natively as well as synchronous
Table of Contents
- FoxAPI Documentation
Dependencies
pip install pillow requests aiohttp
Wrapper
class FoxAPI(shard: str = "", image_dir: str = None, safe_mode: bool = True)
Methods
API Interaction (async)
Note : all of theses methods are async, to run the synchronous version, add _sync at the end (see API example)
get_data(endpoint: str, session: aiohttp.ClientSession | None = None, etag: str = None, use_cache: bool = False) -> APIResponse
Fetches data from the specified endpoint, you can choose to use cache instead of sending a request and you can pass ETag.
-
Parameters:
endpoint(str): The API endpoint to call.session(aiohttp.ClientSession, optional) the async sessionetag(str, optional): The ETag header for cache validation (not required since managed natively).use_cache(bool, optional): Whether to use cached data (default: False).
-
Returns: The response data from the API as a APIResponse object.
Map and War Data
get_maps(use_cache: bool = True, session: aiohttp.ClientSession | None = None) -> list[str]
- Retrieves a list of available hexagons (maps) in the game world.
get_war(use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> WarObject
- Retrieves the current war state (war data).
get_static(hexagon: str, use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> SDObject
- Retrieves the static data for the specified hexagon.
get_dynamic(hexagon: str, use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> SDObject
- Retrieves the dynamic data for the specified hexagon.
get_war_report(hexagon: str, use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> WarReportObject
- Retrieves the war report for the specified hexagon.
get_hexagon_data(hexagon: str, use_cache: bool = False, session: aiohttp.ClientSession | None = None) -> HexagonObject
- Retrieves all the data awailable for the specified hexagon.
Hexagon Operations
calc_distance(x1: float, y1: float, x2: float, y2: float) -> float
- Calculates the Euclidean distance between two points on the map.
get_captured_towns(hexagon: str = None, dynamic: SDObject = None, static: SDObject = None, session: aiohttp.ClientSession | None = None) -> dict
- Retrieves the captured towns for a given hexagon based on dynamic and static data.
load_hexagon_map(hexagon: str) -> pillow.Image
- Loads the PNG map for the specified hexagon.
make_map_png(hexagon: str, icons: str | list = "all", colored: bool = False, dynamic: SDObject = None, static: SDObject = None, force: bool = False, session: aiohttp.ClientSession | None = None) -> pillow.Image
- Generates a PNG image of the hexagon map with all the icons associated to each faction in their respective colors (included fields and town base). Only public data will be present.
- colored -> display each region in the team's color
- icons -> display selected building in their team's color
- force -> bypass the cache and generate a new map
calculate_death_rate(hexagon: str = None, war_report: WarReportObject = None, session: aiohttp.ClientSession | None = None): -> dict
- calculate the death rate between the first launch and the current one
Listener Functions
on_api_update(callback: callable = None, endpoints: list = None)
- Registers a callback function to be called when the data for specified API endpoints is updated.
on_hexagon_update(callback: callable = None, hexagons: list = "all")
- Registers a callback function to be called when the data for specified hexagons is updated.
Queue Tasks
This library also give the possibility to queue up some sync and async methods to run them simultaneously
from foxapi import FoxAPI
api = FoxAPI()
for i in range(10):
api.add_task(function=api.get_war) # or any other method
data = api.run_task_sync()
for elem in data:
print(elem.result)
from foxapi import FoxAPI
import asyncio
api = FoxAPI()
async def main():
for i in range(10):
api.add_task(function=api.get_war) # or any other method
data = await api.run_task()
for elem in data:
print(elem.result)
asyncio.run(main())
Error Handling
EndpointError: Raised if an invalid API endpoint is used.
HexagonError: Raised if an invalid hexagon is provided.
FoxAPIError: A general error for issues within the FoxAPI class (e.g., missing data).
Objects
class APIResponse:
headers: dict
json: dict
status_code: int
hexagon: str
is_cache: bool
class HexagonObject:
hexagon: str
war_report: WarReportObject
static: SDObject
dynamic: SDObject
captured_towns: dict
casualty_rate: dict
class WarObject:
warId: str
warNumber: int
winner: str
conquestStartTime: str
conquestEndTime: str
resistanceStartTime: str
scheduledConquestEndTime: str
requiredVictoryTowns: str
shortRequiredVictoryTowns: str
response: APIResponse
class WarReportObject:
totalEnlistments: int
colonialCasualties: int
wardenCasualties: int
dayOfWar: int
version: int
response: APIResponse
class MapItemsObject:
teamId: str
iconType: int
x: float
y: float
flags: int
viewDirection: int
class MapTextItemsObject:
text: str
x: float
y: float
mapMarkerType: str
class SDObject:
regionId: int
scorchedVictoryTowns: int
mapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: int
version: int
response: APIResponse
Example Usage
from foxapi import FoxAPI
# Initialize the API client in safe mode
# if you are a developer and plane to use the exact hexagons name
# you can turn the safe_mode off, otherwise it will convert
# api calls and hexagons name into valid ones
# Ex: deadlands -> DeadLandsHex (Yes, I am *that* lazy)
fox = FoxAPI(shard="1")
def function(hexagon: str = "DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current war
maps: list = fox.get_maps_sync()
war: WarObject = fox.get_war_sync()
# Retrieve data for a specific hexagon
dynamic_data: SDObject = fox.get_dynamic_sync(hexagon)
static_data: SDObject = fox.get_static_sync(hexagon)
war_report: WarReportObject = fox.get_war_report_sync(hexagon)
# Create a map PNG for a hexagon with building informations on it
map_image = fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at once
data: HexagonObject = fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalent
async def function(hexagon: str = "DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current war
maps: list = await fox.get_maps()
war: WarObject = await fox.get_war()
# Retrieve data for a specific hexagon
dynamic_data: SDObject = await fox.get_dynamic(hexagon)
static_data: SDObject = await fox.get_static(hexagon)
war_report: WarReportObject = await fox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on it
map_image = await fox.make_map_png(hexagon)
map_image.show()
# to get all the data at once
data: HexagonObject = await fox.get_hexagon_data(hexagon=hexagon, use_cache=True)
# Register a callback to listen for updates on all the hexagons
# it will run forever don't worry
@fox.on_hexagon_update("all")
def on_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well
@fox.on_hexagon_update("all")
async def on_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
I am not responsible for what you are doing with it
Metadata
Release files for foxapi 2.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| foxapi-2.1.1.tar.gz | 24.4 MB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| foxapi-2.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 48.8 MB
Release files / foxapi-2.1.1.tar.gz
| Download URL | foxapi-2.1.1.tar.gz |
|---|---|
| Size | 24.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad30c5f75d90756875bf0936221bcd83d1c875e0d6c57f7763c30858a5140ef3
|
|
BLAKE2b-256 checksum How to use checksums |
254e27d45665069df5ac7a20b1efe5b53b95fbb2f3ef794df9271b6a62b41aee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.11
|
Release files / foxapi-2.1.1-py3-none-any.whl
| Download URL | foxapi-2.1.1-py3-none-any.whl |
|---|---|
| Size | 24.4 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9049b411235a9c71eceffb4e61454abb456b6e9be81840f2fb2461deb66fc634
|
|
BLAKE2b-256 checksum How to use checksums |
6891cd511ac5e4fbf91e222586f8c285a20a59de25a6d7d9a8fdb46a2e73caa2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.11
|
Security for foxapi 2.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.