Latest commit

History

83 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FoxAPI Documentation

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

Dependencies

pip install pillow requests aiohttp

Wrapper

classFoxAPI(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 session
    • etag (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

fromfoxapiimportFoxAPIapi=FoxAPI()
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=api.run_task_sync()
forelemindata:
print(elem.result)
fromfoxapiimportFoxAPIimportasyncioapi=FoxAPI()
asyncdefmain():
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=awaitapi.run_task()
forelemindata:
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

classAPIResponse:
headers: dictjson: dictstatus_code: inthexagon: stris_cache: boolclassHexagonObject:
hexagon: strwar_report: WarReportObjectstatic: SDObjectdynamic: SDObjectcaptured_towns: dictcasualty_rate: dictclassWarObject:
warId: strwarNumber: intwinner: strconquestStartTime: strconquestEndTime: strresistanceStartTime: strscheduledConquestEndTime: strrequiredVictoryTowns: strshortRequiredVictoryTowns: strresponse: APIResponseclassWarReportObject:
totalEnlistments: intcolonialCasualties: intwardenCasualties: intdayOfWar: intversion: intresponse: APIResponseclassMapItemsObject:
teamId: striconType: intx: floaty: floatflags: intviewDirection: intclassMapTextItemsObject:
text: strx: floaty: floatmapMarkerType: strclassSDObject:
regionId: intscorchedVictoryTowns: intmapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: intversion: intresponse: APIResponse

Example Usage

fromfoxapiimportFoxAPI# 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")
deffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=fox.get_maps_sync()
war: WarObject=fox.get_war_sync()
# Retrieve data for a specific hexagondynamic_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 itmap_image=fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalentasyncdeffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=awaitfox.get_maps()
war: WarObject=awaitfox.get_war()
# Retrieve data for a specific hexagondynamic_data: SDObject=awaitfox.get_dynamic(hexagon)
static_data: SDObject=awaitfox.get_static(hexagon)
war_report: WarReportObject=awaitfox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on itmap_image=awaitfox.make_map_png(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=awaitfox.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")defon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well@fox.on_hexagon_update("all")asyncdefon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

About

A wrapper for the foxhole API in python

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

83 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FoxAPI Documentation

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

Dependencies

pip install pillow requests aiohttp

Wrapper

classFoxAPI(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 session
    • etag (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

fromfoxapiimportFoxAPIapi=FoxAPI()
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=api.run_task_sync()
forelemindata:
print(elem.result)
fromfoxapiimportFoxAPIimportasyncioapi=FoxAPI()
asyncdefmain():
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=awaitapi.run_task()
forelemindata:
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

classAPIResponse:
headers: dictjson: dictstatus_code: inthexagon: stris_cache: boolclassHexagonObject:
hexagon: strwar_report: WarReportObjectstatic: SDObjectdynamic: SDObjectcaptured_towns: dictcasualty_rate: dictclassWarObject:
warId: strwarNumber: intwinner: strconquestStartTime: strconquestEndTime: strresistanceStartTime: strscheduledConquestEndTime: strrequiredVictoryTowns: strshortRequiredVictoryTowns: strresponse: APIResponseclassWarReportObject:
totalEnlistments: intcolonialCasualties: intwardenCasualties: intdayOfWar: intversion: intresponse: APIResponseclassMapItemsObject:
teamId: striconType: intx: floaty: floatflags: intviewDirection: intclassMapTextItemsObject:
text: strx: floaty: floatmapMarkerType: strclassSDObject:
regionId: intscorchedVictoryTowns: intmapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: intversion: intresponse: APIResponse

Example Usage

fromfoxapiimportFoxAPI# 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")
deffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=fox.get_maps_sync()
war: WarObject=fox.get_war_sync()
# Retrieve data for a specific hexagondynamic_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 itmap_image=fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalentasyncdeffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=awaitfox.get_maps()
war: WarObject=awaitfox.get_war()
# Retrieve data for a specific hexagondynamic_data: SDObject=awaitfox.get_dynamic(hexagon)
static_data: SDObject=awaitfox.get_static(hexagon)
war_report: WarReportObject=awaitfox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on itmap_image=awaitfox.make_map_png(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=awaitfox.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")defon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well@fox.on_hexagon_update("all")asyncdefon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

About

A wrapper for the foxhole API in python

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

83 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FoxAPI Documentation

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

Dependencies

pip install pillow requests aiohttp

Wrapper

classFoxAPI(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 session
    • etag (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

fromfoxapiimportFoxAPIapi=FoxAPI()
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=api.run_task_sync()
forelemindata:
print(elem.result)
fromfoxapiimportFoxAPIimportasyncioapi=FoxAPI()
asyncdefmain():
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=awaitapi.run_task()
forelemindata:
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

classAPIResponse:
headers: dictjson: dictstatus_code: inthexagon: stris_cache: boolclassHexagonObject:
hexagon: strwar_report: WarReportObjectstatic: SDObjectdynamic: SDObjectcaptured_towns: dictcasualty_rate: dictclassWarObject:
warId: strwarNumber: intwinner: strconquestStartTime: strconquestEndTime: strresistanceStartTime: strscheduledConquestEndTime: strrequiredVictoryTowns: strshortRequiredVictoryTowns: strresponse: APIResponseclassWarReportObject:
totalEnlistments: intcolonialCasualties: intwardenCasualties: intdayOfWar: intversion: intresponse: APIResponseclassMapItemsObject:
teamId: striconType: intx: floaty: floatflags: intviewDirection: intclassMapTextItemsObject:
text: strx: floaty: floatmapMarkerType: strclassSDObject:
regionId: intscorchedVictoryTowns: intmapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: intversion: intresponse: APIResponse

Example Usage

fromfoxapiimportFoxAPI# 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")
deffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=fox.get_maps_sync()
war: WarObject=fox.get_war_sync()
# Retrieve data for a specific hexagondynamic_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 itmap_image=fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalentasyncdeffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=awaitfox.get_maps()
war: WarObject=awaitfox.get_war()
# Retrieve data for a specific hexagondynamic_data: SDObject=awaitfox.get_dynamic(hexagon)
static_data: SDObject=awaitfox.get_static(hexagon)
war_report: WarReportObject=awaitfox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on itmap_image=awaitfox.make_map_png(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=awaitfox.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")defon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well@fox.on_hexagon_update("all")asyncdefon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

About

A wrapper for the foxhole API in python

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

83 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FoxAPI Documentation

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

Dependencies

pip install pillow requests aiohttp

Wrapper

classFoxAPI(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 session
    • etag (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

fromfoxapiimportFoxAPIapi=FoxAPI()
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=api.run_task_sync()
forelemindata:
print(elem.result)
fromfoxapiimportFoxAPIimportasyncioapi=FoxAPI()
asyncdefmain():
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=awaitapi.run_task()
forelemindata:
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

classAPIResponse:
headers: dictjson: dictstatus_code: inthexagon: stris_cache: boolclassHexagonObject:
hexagon: strwar_report: WarReportObjectstatic: SDObjectdynamic: SDObjectcaptured_towns: dictcasualty_rate: dictclassWarObject:
warId: strwarNumber: intwinner: strconquestStartTime: strconquestEndTime: strresistanceStartTime: strscheduledConquestEndTime: strrequiredVictoryTowns: strshortRequiredVictoryTowns: strresponse: APIResponseclassWarReportObject:
totalEnlistments: intcolonialCasualties: intwardenCasualties: intdayOfWar: intversion: intresponse: APIResponseclassMapItemsObject:
teamId: striconType: intx: floaty: floatflags: intviewDirection: intclassMapTextItemsObject:
text: strx: floaty: floatmapMarkerType: strclassSDObject:
regionId: intscorchedVictoryTowns: intmapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: intversion: intresponse: APIResponse

Example Usage

fromfoxapiimportFoxAPI# 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")
deffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=fox.get_maps_sync()
war: WarObject=fox.get_war_sync()
# Retrieve data for a specific hexagondynamic_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 itmap_image=fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalentasyncdeffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=awaitfox.get_maps()
war: WarObject=awaitfox.get_war()
# Retrieve data for a specific hexagondynamic_data: SDObject=awaitfox.get_dynamic(hexagon)
static_data: SDObject=awaitfox.get_static(hexagon)
war_report: WarReportObject=awaitfox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on itmap_image=awaitfox.make_map_png(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=awaitfox.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")defon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well@fox.on_hexagon_update("all")asyncdefon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

About

A wrapper for the foxhole API in python

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

83 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FoxAPI Documentation

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

Dependencies

pip install pillow requests aiohttp

Wrapper

classFoxAPI(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 session
    • etag (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

fromfoxapiimportFoxAPIapi=FoxAPI()
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=api.run_task_sync()
forelemindata:
print(elem.result)
fromfoxapiimportFoxAPIimportasyncioapi=FoxAPI()
asyncdefmain():
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=awaitapi.run_task()
forelemindata:
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

classAPIResponse:
headers: dictjson: dictstatus_code: inthexagon: stris_cache: boolclassHexagonObject:
hexagon: strwar_report: WarReportObjectstatic: SDObjectdynamic: SDObjectcaptured_towns: dictcasualty_rate: dictclassWarObject:
warId: strwarNumber: intwinner: strconquestStartTime: strconquestEndTime: strresistanceStartTime: strscheduledConquestEndTime: strrequiredVictoryTowns: strshortRequiredVictoryTowns: strresponse: APIResponseclassWarReportObject:
totalEnlistments: intcolonialCasualties: intwardenCasualties: intdayOfWar: intversion: intresponse: APIResponseclassMapItemsObject:
teamId: striconType: intx: floaty: floatflags: intviewDirection: intclassMapTextItemsObject:
text: strx: floaty: floatmapMarkerType: strclassSDObject:
regionId: intscorchedVictoryTowns: intmapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: intversion: intresponse: APIResponse

Example Usage

fromfoxapiimportFoxAPI# 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")
deffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=fox.get_maps_sync()
war: WarObject=fox.get_war_sync()
# Retrieve data for a specific hexagondynamic_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 itmap_image=fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalentasyncdeffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=awaitfox.get_maps()
war: WarObject=awaitfox.get_war()
# Retrieve data for a specific hexagondynamic_data: SDObject=awaitfox.get_dynamic(hexagon)
static_data: SDObject=awaitfox.get_static(hexagon)
war_report: WarReportObject=awaitfox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on itmap_image=awaitfox.make_map_png(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=awaitfox.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")defon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well@fox.on_hexagon_update("all")asyncdefon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

About

A wrapper for the foxhole API in python

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

83 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FoxAPI Documentation

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

Dependencies

pip install pillow requests aiohttp

Wrapper

classFoxAPI(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 session
    • etag (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

fromfoxapiimportFoxAPIapi=FoxAPI()
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=api.run_task_sync()
forelemindata:
print(elem.result)
fromfoxapiimportFoxAPIimportasyncioapi=FoxAPI()
asyncdefmain():
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=awaitapi.run_task()
forelemindata:
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

classAPIResponse:
headers: dictjson: dictstatus_code: inthexagon: stris_cache: boolclassHexagonObject:
hexagon: strwar_report: WarReportObjectstatic: SDObjectdynamic: SDObjectcaptured_towns: dictcasualty_rate: dictclassWarObject:
warId: strwarNumber: intwinner: strconquestStartTime: strconquestEndTime: strresistanceStartTime: strscheduledConquestEndTime: strrequiredVictoryTowns: strshortRequiredVictoryTowns: strresponse: APIResponseclassWarReportObject:
totalEnlistments: intcolonialCasualties: intwardenCasualties: intdayOfWar: intversion: intresponse: APIResponseclassMapItemsObject:
teamId: striconType: intx: floaty: floatflags: intviewDirection: intclassMapTextItemsObject:
text: strx: floaty: floatmapMarkerType: strclassSDObject:
regionId: intscorchedVictoryTowns: intmapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: intversion: intresponse: APIResponse

Example Usage

fromfoxapiimportFoxAPI# 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")
deffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=fox.get_maps_sync()
war: WarObject=fox.get_war_sync()
# Retrieve data for a specific hexagondynamic_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 itmap_image=fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalentasyncdeffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=awaitfox.get_maps()
war: WarObject=awaitfox.get_war()
# Retrieve data for a specific hexagondynamic_data: SDObject=awaitfox.get_dynamic(hexagon)
static_data: SDObject=awaitfox.get_static(hexagon)
war_report: WarReportObject=awaitfox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on itmap_image=awaitfox.make_map_png(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=awaitfox.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")defon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well@fox.on_hexagon_update("all")asyncdefon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

About

A wrapper for the foxhole API in python

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

83 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FoxAPI Documentation

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

Dependencies

pip install pillow requests aiohttp

Wrapper

classFoxAPI(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 session
    • etag (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

fromfoxapiimportFoxAPIapi=FoxAPI()
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=api.run_task_sync()
forelemindata:
print(elem.result)
fromfoxapiimportFoxAPIimportasyncioapi=FoxAPI()
asyncdefmain():
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=awaitapi.run_task()
forelemindata:
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

classAPIResponse:
headers: dictjson: dictstatus_code: inthexagon: stris_cache: boolclassHexagonObject:
hexagon: strwar_report: WarReportObjectstatic: SDObjectdynamic: SDObjectcaptured_towns: dictcasualty_rate: dictclassWarObject:
warId: strwarNumber: intwinner: strconquestStartTime: strconquestEndTime: strresistanceStartTime: strscheduledConquestEndTime: strrequiredVictoryTowns: strshortRequiredVictoryTowns: strresponse: APIResponseclassWarReportObject:
totalEnlistments: intcolonialCasualties: intwardenCasualties: intdayOfWar: intversion: intresponse: APIResponseclassMapItemsObject:
teamId: striconType: intx: floaty: floatflags: intviewDirection: intclassMapTextItemsObject:
text: strx: floaty: floatmapMarkerType: strclassSDObject:
regionId: intscorchedVictoryTowns: intmapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: intversion: intresponse: APIResponse

Example Usage

fromfoxapiimportFoxAPI# 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")
deffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=fox.get_maps_sync()
war: WarObject=fox.get_war_sync()
# Retrieve data for a specific hexagondynamic_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 itmap_image=fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalentasyncdeffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=awaitfox.get_maps()
war: WarObject=awaitfox.get_war()
# Retrieve data for a specific hexagondynamic_data: SDObject=awaitfox.get_dynamic(hexagon)
static_data: SDObject=awaitfox.get_static(hexagon)
war_report: WarReportObject=awaitfox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on itmap_image=awaitfox.make_map_png(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=awaitfox.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")defon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well@fox.on_hexagon_update("all")asyncdefon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

About

A wrapper for the foxhole API in python

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

83 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FoxAPI Documentation

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

Dependencies

pip install pillow requests aiohttp

Wrapper

classFoxAPI(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 session
    • etag (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

fromfoxapiimportFoxAPIapi=FoxAPI()
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=api.run_task_sync()
forelemindata:
print(elem.result)
fromfoxapiimportFoxAPIimportasyncioapi=FoxAPI()
asyncdefmain():
foriinrange(10):
api.add_task(function=api.get_war) # or any other methoddata=awaitapi.run_task()
forelemindata:
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

classAPIResponse:
headers: dictjson: dictstatus_code: inthexagon: stris_cache: boolclassHexagonObject:
hexagon: strwar_report: WarReportObjectstatic: SDObjectdynamic: SDObjectcaptured_towns: dictcasualty_rate: dictclassWarObject:
warId: strwarNumber: intwinner: strconquestStartTime: strconquestEndTime: strresistanceStartTime: strscheduledConquestEndTime: strrequiredVictoryTowns: strshortRequiredVictoryTowns: strresponse: APIResponseclassWarReportObject:
totalEnlistments: intcolonialCasualties: intwardenCasualties: intdayOfWar: intversion: intresponse: APIResponseclassMapItemsObject:
teamId: striconType: intx: floaty: floatflags: intviewDirection: intclassMapTextItemsObject:
text: strx: floaty: floatmapMarkerType: strclassSDObject:
regionId: intscorchedVictoryTowns: intmapItems: list[MapItemsObject]
mapItemsC: list[MapItemsObject]
mapItemsW: list[MapItemsObject]
mapTextItems: list[MapTextItemsObject]
lastUpdated: intversion: intresponse: APIResponse

Example Usage

fromfoxapiimportFoxAPI# 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")
deffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=fox.get_maps_sync()
war: WarObject=fox.get_war_sync()
# Retrieve data for a specific hexagondynamic_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 itmap_image=fox.make_map_png_sync(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=fox.get_hexagon_data_sync(hexagon=hexagon, use_cache=True)
# Async equivalentasyncdeffunction(hexagon: str="DeadLandsHex"):
# Get the list of available hexagons (maps) and state of the current warmaps: list=awaitfox.get_maps()
war: WarObject=awaitfox.get_war()
# Retrieve data for a specific hexagondynamic_data: SDObject=awaitfox.get_dynamic(hexagon)
static_data: SDObject=awaitfox.get_static(hexagon)
war_report: WarReportObject=awaitfox.get_war_report(hexagon)
# Create a map PNG for a hexagon with building informations on itmap_image=awaitfox.make_map_png(hexagon)
map_image.show()
# to get all the data at oncedata: HexagonObject=awaitfox.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")defon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")
# The following async code works as well@fox.on_hexagon_update("all")asyncdefon_update(hexa: HexagonObject):
print(f"Hexagon {hexa.hexagon} has been updated")

I am not responsible for what you are doing with it

About

A wrapper for the foxhole API in python

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages