Event types
An event automation fires on exactly one event type, chosen in the automation builder. The event type determines which condition fields and template variables ({player.name}, {message}, …) are available on it.
Eleven event types are available:
Broadcast, Capture, Chat, Death, Deployed, Join, Leave, Map, Marker, Round, Teamkill
Almost every field listed below is read straight off the event line, so a condition on it is checked the moment the event is seen. Two kinds of field are not: player.team is filled in from the live roster, and the two server fields come from the live server snapshot — neither is part of the log line itself.
A field with no value on a given event — an empty source column, a roster or snapshot that has not been read — is treated as not resolved rather than as an empty string: a condition naming it does not fire the automation on that event.
Player-scoped events
Section titled “Player-scoped events”These events have a subject player, so the automation’s ban/note actions have someone to act on.
Chat — Chat message
Section titled “Chat — Chat message”| Field | Description |
|---|---|
message |
Text of the chat message |
channel |
Chat channel the message was sent to (ChatAll, ChatTeam, ChatSquad, ChatAdmin) |
player.name |
Sender’s in-game name |
player.eosID |
Sender’s EOS ID |
player.steamID |
Sender’s Steam ID; absent for a player without Steam |
Join — Player join
Section titled “Join — Player join”| Field | Description |
|---|---|
player.name |
Joining player’s name |
player.eosID |
EOS ID |
player.steamID |
Steam ID; absent for a player without Steam |
player.ip |
Masked address token |
player.country |
Country of the player’s address (ISO code, e.g. RU); absent if not resolved |
Leave — Player leave
Section titled “Leave — Player leave”| Field | Description |
|---|---|
player.name |
Leaving player’s name |
player.eosID |
EOS ID |
player.ip |
Masked address token |
player.country |
Country of the player’s address (ISO code, e.g. RU); absent if not resolved |
Death — Player death
Section titled “Death — Player death”Fires on a death that is not a teamkill, at the death itself and not at the wound: a player who is wounded and then revived does not produce a Death. Wounds, damage and revives are recorded and shown, but cannot be automation events. A death whose attacker and victim are different players with known, non-zero and equal teams goes to Teamkill instead, and a Death automation does not see it. The subject for a ban/note action is the attacker — on a suicide or bleed-out death there’s no attacker, so those actions are skipped.
| Field | Description |
|---|---|
attacker.name |
Attacking player’s name; absent on a suicide or bleed-out |
victim.name |
Player who died |
weapon |
Attacker’s soldier class as the death line names it |
Teamkill — Teamkill
Section titled “Teamkill — Teamkill”A death where the attacker and victim were on the same team. It fires at the death, not at the wound: a teammate who is wounded and then revived by a medic is not a Teamkill. The subject for a ban/note action is the attacker.
| Field | Description |
|---|---|
attacker.name |
Teamkiller’s name |
victim.name |
Player who was teamkilled |
weapon |
Attacker’s soldier class as the death line names it |
player.team |
Team number of the attacker; absent until the live roster knows them |
Marker — Map marker
Section titled “Marker — Map marker”A player placed a map marker. Squad 10.6 and later.
| Field | Description |
|---|---|
player.name |
Name of the player who placed the marker |
player.eosID |
EOS ID |
player.steamID |
Steam ID |
marker |
Marker type as the log prints it (e.g. BP_MapMarker_POI, BP_MapMarker_GridHeader_Spotted_Infantry) |
team |
Team number the marker was placed for |
Server-scoped events
Section titled “Server-scoped events”These events have no player subject — an automation on one of these can’t use the ban/note actions (there’s no one to apply them to).
Broadcast — Admin broadcast
Section titled “Broadcast — Admin broadcast”| Field | Description |
|---|---|
message |
Broadcast text |
admin.name |
Name of the broadcasting admin |
Capture — Capture zone
Section titled “Capture — Capture zone”A capture zone was captured or neutralized. Squad 10.6 and later.
| Field | Description |
|---|---|
zone |
Name of the capture zone (e.g. Old Factory) |
outcome |
captured or neutralized |
team |
Team number that took the action |
Deployed — Deployable spawned
Section titled “Deployed — Deployable spawned”A deployable appeared on the map. The two main-base radios present from the start of a round are reported too — tell them apart by the deployable class. Squad 10.6 and later.
| Field | Description |
|---|---|
deployable |
Deployable class (e.g. AmmoCrate_AFU) |
team |
Team number the deployable belongs to |
Map — Map change
Section titled “Map — Map change”| Field | Description |
|---|---|
layer |
New layer classname (e.g. Yehorivka_RAAS_v1) |
Round — Round ended
Section titled “Round — Round ended”| Field | Description |
|---|---|
winner.faction |
Winning faction |
winner.team |
Winning team number |
winner.tickets |
Winner’s remaining tickets |
loser.faction |
Losing faction |
loser.tickets |
Loser’s remaining tickets (often 0) |
Server fields
Section titled “Server fields”Server fields come from the live server snapshot and can be used in the automation’s top-level conditions:
| Field | Description |
|---|---|
server.name |
Server name |
server.players |
Current online player count |
server.layer |
Current map layer |
server.capacity |
Player slots on the server |
server.queue |
Players in the public queue |
server.reserveQueue |
Players in the reserve queue |
server.nextLayer |
Layer the server rotates to next |
server.team1.players |
Player count of team 1 |
server.team2.players |
Player count of team 2 |
server.team1.faction |
Faction code of team 1, as the game reports it (e.g. USA) |
server.team2.faction |
Faction code of team 2, as the game reports it (e.g. RUS) |
server.seeding |
true while the seeding window is open and the server hasn’t gone live yet in it; false otherwise or when seeding is off |
If the live snapshot can’t be read, server.name, server.players and the eight fields below server.layer are treated as not resolved, and a condition naming any of them does not fire the automation. The same holds when the game doesn’t declare a field or the server didn’t send it: a missing value is never replaced by 0 or an empty string. Factions are the raw codes, not display names.
server.seeding doesn’t come from the live snapshot: it is read from the server’s seeding settings and session data, and is treated as not resolved only when seeding is on and those can’t be read.
server.layer is resolved separately from the live snapshot, so it stays available when the snapshot can’t be read. If the server’s current layer isn’t known yet, server.layer is treated as not resolved, and a condition naming it does not fire the automation.
Fields resolved per action
Section titled “Fields resolved per action”A handful of fields aren’t part of the raw event — heliana looks them up when an action runs. Because of that, you can only use them in a per-action condition (the condition attached to one action), not in the automation’s top-level conditions:
| Field | Description |
|---|---|
player.accessLists |
Comma-separated names of the access lists that grant the player access on the server the action runs on — lists scoped to other servers and expired entries are left out; use $has / $lacks |
player.bans.count |
Number of active bans on record for the player in this organization |
player.firstSeen |
Date/time the player was first seen |
player.game.timePlayed |
Total recorded play time |
player.alts.banned |
Number of alts of the player (accounts sharing an address) with an active ban in this organization |
player.account |
true or false: whether a user is linked to the player through a Game ID verified in the organization |
player.alts.count |
Number of other players sharing an address with the player, banned or not |
player.country |
Country code of the address of the player’s latest session; absent if there is no session or the address has no country. On Join and Leave events it is a field of the event itself and also works in top-level conditions |
player.discord |
true or false: whether the user whose verified Game ID links them to the player has signed in with Discord |
player.discord.roles |
Comma-separated names of the guild roles the access lists grant the player (the roles the bot assigns, not the roles the member holds in Discord); absent without a Discord login or a connected guild |
player.exception |
true or false: whether the player has an active exception on any server of this organization |
player.lastSeen |
Date/time (ISO 8601, UTC) the player’s latest session started; absent if there are no sessions. Sessions are recorded about once a minute, so right after a join this is still the previous session |
player.notes.count |
Number of notes on the player in this organization |
player.patron.paidUntil |
Date/time (ISO 8601, UTC) of the patron’s next Patreon charge; absent without a patron match or a charge date |
player.patron.status |
active, excluded or former; absent without a patron match |
player.patron.tiers |
Comma-separated Patreon tier names, exact and case-sensitive — use $has / $lacks; absent without a patron match |
player.seed.days |
Days in the last 30 on which the player earned seeding credit on this server; absent when seeding is off for the server |
player.seed.excluded |
true or false: whether the player is excluded from seeding rewards in this organization |
player.seed.minutes |
Player’s seeding credit on this server over the last 30 days, in whole minutes; absent when seeding is off for the server |
player.session.minutes |
Minutes the player’s current session on this server has lasted; absent unless the player is on this server, and for up to a minute after the join |
player.cbl.activeBans |
Number of active bans on the player’s Community Ban List profile; 0 if CBL does not know the player |
player.cbl.risk |
Community Ban List risk rating; absent if CBL does not know the player |
player.steam.accountAgeDays |
Age of the player’s Steam account in days; absent for a private profile or a player without Steam |
player.steam.daysSinceLastBan |
Days since the player’s last VAC or game ban; absent if there are none |
player.steam.gameBans |
Number of game bans on the player’s Steam account |
player.steam.hours |
Hours played in the game on Steam; absent if the game details are private or the player doesn’t own the game |
player.steam.vacBans |
Number of VAC bans on the player’s Steam account |
player.tags |
Comma-separated names of the tags on the player — use $has / $lacks to check membership |
counter.<name> |
A windowed counter of one event type (by the acting player) you define on the automation |
Action text fields
Section titled “Action text fields”Three more fields are stamped on the run by heliana itself, not read off an event or a live
snapshot. Use them as template variables in an action’s text ({run.at}, {player.url},
{user.name}); per-action conditions see them too. The automation’s top-level conditions are checked
before these fields exist, so there a field reads as empty. An action whose text names {player.url} on a run whose player your organization
can’t see is skipped with the field named, rather than sent with the literal token.
| Field | Description |
|---|---|
run.at |
ISO 8601 timestamp of the run — the same moment for a manual run, an event, and a scheduled run |
player.url |
Link to the player’s card in the console; present only on a run with a player subject |
user.name |
Name of the operator who clicked Run — present only on a manual run; an event or a schedule has no actor |