Skip to content

Commit 6ceb2b5

Browse files
adding faction and simpleregionview
1 parent b3f7742 commit 6ceb2b5

File tree

8 files changed

+108
-23
lines changed

8 files changed

+108
-23
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ classifiers = [
2222
keywords=['helldivers2','api']
2323
requires-python = ">=3.8.1"
2424

25-
version = '0.0.1.18.3.2'
25+
version = '0.0.1.18.4'
2626
dependencies= [
2727
"pydantic>=2.9.2",
2828
"httpx>=0.27.2"

src/hd2api/builders/campaign_builder.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def build_campaign(planets: Dict[int, Optional[Planet]], campaign: Campaign):
2222
planet=planet,
2323
count=campaign.count,
2424
type=campaign.type,
25+
faction=campaign.faction,
2526
)
2627
return camp2
2728

src/hd2api/builders/planet_builder.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ def build_planet_basic(
5757
weather = [gstatic.environmentals.get(e, None) for e in planet_base.weather_effects]
5858
env.extend(weather)
5959
# Build Statistics
60-
stats_new = statistics_builder(stats, planetStatus.players, planetStatus.retrieved_at)
60+
stats_new = statistics_builder(
61+
stats, planetStatus.players, planetStatus.retrieved_at
62+
)
6163
# Position can come from planetInfo OR planetStatus
6264
pos = planetInfo.position
6365
if planetStatus.position is not None:
@@ -93,7 +95,9 @@ def check_compare_value(key, value, target: List[Dict[str, Any]]):
9395
return None
9496

9597

96-
def check_compare_value_list(keys: List[str], values: List[Any], target: List[Dict[str, Any]]):
98+
def check_compare_value_list(
99+
keys: List[str], values: List[Any], target: List[Dict[str, Any]]
100+
):
97101
values = []
98102
for s in target:
99103
if all(s[key] == value for key, value in zip(keys, values)):
@@ -106,12 +110,14 @@ def get_time(status: WarStatus, info: WarInfo) -> dt.datetime:
106110

107111
# Get datetime diveharder object was retrieved at
108112
now = status.retrieved_at
109-
gametime = dt.datetime.fromtimestamp(info.startDate, tz=dt.timezone.utc) + dt.timedelta(
110-
seconds=status.time
111-
)
113+
gametime = dt.datetime.fromtimestamp(
114+
info.startDate, tz=dt.timezone.utc
115+
) + dt.timedelta(seconds=status.time)
112116
deviation = now - gametime
113117
# print(deviation)
114-
relative_game_start = dt.datetime.fromtimestamp(info.startDate, tz=dt.timezone.utc) + deviation
118+
relative_game_start = (
119+
dt.datetime.fromtimestamp(info.startDate, tz=dt.timezone.utc) + deviation
120+
)
115121
return relative_game_start
116122

117123

@@ -234,7 +240,9 @@ def build_planet_2(planetIndex: int, warall: DiveharderAll, statics: StaticAll):
234240
summary: Optional[WarSummary] = warall.planet_stats
235241

236242
regions = build_all_regions(warall, statics)
237-
planet = build_planet_full(planetIndex, status, info, summary, statics, regions=regions)
243+
planet = build_planet_full(
244+
planetIndex, status, info, summary, statics, regions=regions
245+
)
238246
return planet
239247

240248

src/hd2api/builders/region_builder.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
DiveharderAll,
77
Event,
88
GalaxyStatic,
9+
PlanetStatic,
910
Planet,
1011
PlanetEvent,
1112
PlanetInfo,
@@ -43,7 +44,9 @@ def build_region(
4344
if statics.galaxystatic is None or statics.galaxystatic.planetRegion is None:
4445
return None
4546
index = region_info.planetIndex if region_info.planetIndex is not None else -1
46-
planet_base = statics.galaxystatic.planets.get(index, None)
47+
planet_base = statics.galaxystatic.planets.get(
48+
index, PlanetStatic(name="UNKNOWN PLANET")
49+
)
4750
if not planet_base:
4851
return None
4952
if region_info.settingsHash in statics.galaxystatic.planetRegion:
@@ -101,7 +104,8 @@ def build_all_regions(warall: DiveharderAll, statics: StaticAll) -> List[Region]
101104

102105
# Index PlanetRegionInfo by (planetIndex, regionIndex)
103106
info_lookup = {
104-
f"{info.planetIndex}_{info.regionIndex}": info for info in warall.war_info.planetRegions
107+
f"{info.planetIndex}_{info.regionIndex}": info
108+
for info in warall.war_info.planetRegions
105109
}
106110

107111
for region in warall.status.planetRegions:

src/hd2api/models/Base/Campaign.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,9 @@ class Campaign(BaseApiModel):
3232
default=None,
3333
description="A numerical count, the amount of campaigns the planet has seen.",
3434
)
35+
36+
faction: Optional[int] = Field(
37+
alias="faction",
38+
default=None,
39+
description="Optional Faction ID.",
40+
)

src/hd2api/models/Campaign2.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,19 @@ class Campaign2(BaseApiModel):
3333
default=None,
3434
description="Indicates how many campaigns have already been fought on this Planet.",
3535
)
36+
faction: Optional[int] = Field(
37+
alias="faction",
38+
default=None,
39+
description="Optional Faction ID.",
40+
)
3641

3742
def __sub__(self, other: "Campaign2") -> "Campaign2":
3843
camp = Campaign2(
3944
id=self.id,
4045
planet=self.planet - other.planet, # type: ignore
4146
type=self.type,
4247
count=self.count,
48+
faction=self.faction,
4349
time_delta=self.retrieved_at - other.retrieved_at, # type: ignore
4450
)
4551
# camp.retrieved_at = self.retrieved_at - other.retrieved_at
@@ -49,4 +55,10 @@ def __sub__(self, other: "Campaign2") -> "Campaign2":
4955
def average(changes: List["Campaign2"]) -> "Campaign2":
5056
first = changes[0]
5157
avg = Planet.average([c.planet for c in changes])
52-
return Campaign2(id=first.id, planet=avg, type=first.type, count=first.count)
58+
return Campaign2(
59+
id=first.id,
60+
planet=avg,
61+
type=first.type,
62+
count=first.count,
63+
faction=first.faction,
64+
)

src/hd2api/models/Planet.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,9 @@ def calculate_timeval(self, change: float, is_positive: bool) -> datetime.dateti
231231

232232
def format_estimated_time_string(self, change: float, esttime: datetime.datetime):
233233
change_str = f"{round(change, 5)}"
234-
timeval_str = f"Est.Loss {fdt(esttime,'R')}" if change > 0 else f"{fdt(esttime,'R')}"
234+
timeval_str = (
235+
f"Est.Loss {fdt(esttime,'R')}" if change > 0 else f"{fdt(esttime,'R')}"
236+
)
235237

236238
return f"`[{change_str} dps]`, {timeval_str}"
237239

@@ -275,7 +277,8 @@ def average(planets_list: List["Planet"]) -> "Planet":
275277
return Planet()
276278

277279
avg_health = (
278-
sum(planet.health for planet in planets_list if planet.health is not None) // count
280+
sum(planet.health for planet in planets_list if planet.health is not None)
281+
// count
279282
)
280283

281284
stats = []
@@ -357,9 +360,7 @@ def simple_planet_view(
357360
faction = emj(self.currentOwner.lower())
358361

359362
name = f"{faction}P#{self.index}: {self.name}"
360-
players = (
361-
f"{emj('hdi')}: `{self.statistics.playerCount} {cfi(diff.statistics.playerCount)}`"
362-
)
363+
players = f"{emj('hdi')}: `{self.statistics.playerCount} {cfi(diff.statistics.playerCount)}`"
363364
outlist = [f"{players}"]
364365
if (not self.event) or show_hp_without_event:
365366
outlist.append(
@@ -384,6 +385,8 @@ def simple_planet_view(
384385
outlist.append(f"Deadline: [{timev}]")
385386
if avg:
386387
if avg.event:
387-
outlist.append(f"{self.event.estimate_remaining_lib_time(avg.event)}")
388+
outlist.append(
389+
f"{self.event.estimate_remaining_lib_time(avg.event)}"
390+
)
388391

389392
return name, outlist

src/hd2api/models/Region.py

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@ class Region(BaseApiModel, HealthMixin):
2323
)
2424
# From PlanetRegionInfo (static/config)
2525
keyCombo: str = Field(
26-
alias="keyCombo", default="NOKEY", description="Unique key of planetIndex_regionIndex"
26+
alias="keyCombo",
27+
default="NOKEY",
28+
description="Unique key of planetIndex_regionIndex",
2729
)
2830
id: Optional[int] = Field(
29-
alias="id", default=None, description="The identifier of this campaign, hash of key_combo."
31+
alias="id",
32+
default=None,
33+
description="The identifier of this campaign, hash of key_combo.",
3034
)
3135
# From PlanetRegionInfo (static/config)
3236
planetName: Optional[str] = Field(
@@ -45,7 +49,9 @@ class Region(BaseApiModel, HealthMixin):
4549
description="Hash for the internal region settings.",
4650
)
4751

48-
name: Optional[str] = Field(alias="name", default=None, description="The name of the region.")
52+
name: Optional[str] = Field(
53+
alias="name", default=None, description="The name of the region."
54+
)
4955

5056
description: Optional[str] = Field(
5157
alias="description",
@@ -139,6 +145,45 @@ def calculate_change(self, diff: "Region") -> float:
139145
return 0.0
140146
return diff.health / diff.time_delta.total_seconds()
141147

148+
def simple_region_view(
149+
self, prev: Optional["Region"] = None, avg: Optional["Region"] = None
150+
) -> Tuple[str, List[str]]:
151+
"""Return a string containing the formated state of the planet.
152+
153+
Args:
154+
prev (Optional['Planet'], optional):
155+
avg (Optional['Planet'], optional):Average stats for the past X planets
156+
157+
Returns:
158+
Tuple[str,str]: _description_
159+
"""
160+
diff = self - self
161+
if prev is not None:
162+
diff = prev
163+
164+
name = f"P#{self.planetIndex}:{self.planetName}-{self.name}"
165+
players = f"{emj('hdi')}: `{self.players} {cfi(diff.players)}`"
166+
167+
outlist = [
168+
self.description,
169+
f"{players}, Owner: {self.owner}, Is available {self.isAvailable}",
170+
]
171+
outlist.append(f"availabilityFactor {self.availabilityFactor}")
172+
outlist.append(f"Region Size: {self.regionSize}")
173+
174+
outlist.append(
175+
f"HP: {self.get_health_percent(self.health)}%({self.health}) {cfi(self.get_health_percent(diff.health))}`"
176+
)
177+
outlist.append(
178+
f"Regen:`{round((100*(self.regenPerSecond/self.maxHealth))*60*60,2)}`" # type: ignore
179+
) # type: ignore
180+
if avg:
181+
remaining_time = self.estimate_remaining_lib_time(avg)
182+
if remaining_time:
183+
outlist.append(remaining_time)
184+
185+
return name, outlist
186+
142187
def calculate_timeval(self, change: float, is_positive: bool) -> datetime.datetime:
143188
if self.health is None or self.maxHealth is None:
144189
return self.retrieved_at
@@ -149,9 +194,13 @@ def calculate_timeval(self, change: float, is_positive: bool) -> datetime.dateti
149194
seconds = abs(self.health / change)
150195
return self.retrieved_at + datetime.timedelta(seconds=seconds)
151196

152-
def format_estimated_time_string(self, change: float, esttime: datetime.datetime) -> str:
197+
def format_estimated_time_string(
198+
self, change: float, esttime: datetime.datetime
199+
) -> str:
153200
change_str = f"{round(change, 5)}"
154-
timeval_str = f"Est.Loss {fdt(esttime, 'R')}" if change > 0 else f"{fdt(esttime, 'R')}"
201+
timeval_str = (
202+
f"Est.Loss {fdt(esttime, 'R')}" if change > 0 else f"{fdt(esttime, 'R')}"
203+
)
155204
return f"`[{change_str} dps]`, {timeval_str}"
156205

157206
def estimate_remaining_lib_time(self, diff: "Region") -> str:
@@ -173,7 +222,9 @@ def average(regions: List["Region"]) -> "Region":
173222

174223
avg_health = sum(r.health for r in regions if r.health is not None) // count
175224
avg_players = sum(r.players for r in regions if r.players is not None) // count
176-
avg_time = sum(r.time_delta.total_seconds() for r in regions if r.time_delta) // count
225+
avg_time = (
226+
sum(r.time_delta.total_seconds() for r in regions if r.time_delta) // count
227+
)
177228

178229
return Region(
179230
planetIndex=regions[0].planetIndex,

0 commit comments

Comments
 (0)