aboutsummaryrefslogtreecommitdiff
path: root/src/agent.rs
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2021-11-12 17:42:32 +0100
committerDaniel Schadt <kingdread@gmx.de>2021-11-12 17:45:11 +0100
commit6f049aa5e1524169b302db4c6b8b9f5edb82df87 (patch)
treee07da5b055e39a3a9ac5cbd323ebe94fb97b0156 /src/agent.rs
parent09285afdb729565a484fe93a7958b330681a4bc1 (diff)
downloadevtclib-6f049aa5e1524169b302db4c6b8b9f5edb82df87.tar.gz
evtclib-6f049aa5e1524169b302db4c6b8b9f5edb82df87.tar.bz2
evtclib-6f049aa5e1524169b302db4c6b8b9f5edb82df87.zip
Fix player name parsing logic
The old code seemed to choke on WvW players, as the subgroup-calculating code did 0 - b'0', which underflowed. The proper way to parse a subgroup is not to take a single character anyway, because subgroups can be bigger than 10. The new code fixes that by properly extracting the "subgroup str literal" and then parsing it as an integer, with some special logic to detect an "empty" subgroup as it is in WvW.
Diffstat (limited to 'src/agent.rs')
-rw-r--r--src/agent.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/agent.rs b/src/agent.rs
index 60c16e3..4dece3e 100644
--- a/src/agent.rs
+++ b/src/agent.rs
@@ -39,6 +39,8 @@ pub struct Player {
impl Player {
/// The player's character name.
+ ///
+ /// **Note**: Hostile WvW agents will have a randomly generated player name.
pub fn character_name(&self) -> &str {
&self.character_name
}
@@ -46,6 +48,8 @@ impl Player {
/// The player's account name.
///
/// This includes the leading colon and the 4-digit denominator.
+ ///
+ /// **Note**: Hostile WvW agents will have an empty account name.
pub fn account_name(&self) -> &str {
&self.account_name
}
@@ -158,10 +162,19 @@ impl AgentKind {
let character_name = raw::cstr_up_to_nul(&raw_agent.name)
.ok_or(EvtcError::InvalidData)?
.to_str()?;
- let account_name = raw::cstr_up_to_nul(&raw_agent.name[character_name.len() + 1..])
+ let remainder = &raw_agent.name[character_name.len() + 1..];
+ let account_name = raw::cstr_up_to_nul(remainder)
+ .ok_or(EvtcError::InvalidData)?
+ .to_str()?;
+ let remainder = &remainder[account_name.len() + 1..];
+ let subgroup = raw::cstr_up_to_nul(remainder)
.ok_or(EvtcError::InvalidData)?
.to_str()?;
- let subgroup = raw_agent.name[character_name.len() + account_name.len() + 2] - b'0';
+ let subgroup = if subgroup.is_empty() {
+ 0
+ } else {
+ subgroup.parse().map_err(|_| EvtcError::InvalidData)?
+ };
let elite = if raw_agent.is_elite == 0 {
None
} else {