@@ -7857,7 +7857,9 @@ class MeshtasticManager {
78577857 const { promisify } = await import ( 'util' ) ;
78587858 const execFileAsync = promisify ( execFile ) ;
78597859
7860- const scriptEnv = await this . createScriptEnvVariables ( message , matchedPattern , extractedParams , trigger , packetId ) ;
7860+ const scriptEnv = await this . createScriptEnvVariables ( message , matchedPattern , extractedParams , trigger , packetId , {
7861+ nodeId, hopsTraveled, isDirectMessage
7862+ } ) ;
78617863
78627864 // Expand tokens in script args if provided
78637865 let scriptArgsList : string [ ] = [ ] ;
@@ -8050,7 +8052,14 @@ class MeshtasticManager {
80508052 * - MSG_*: All message fields (e.g., MSG_rxSnr, MSG_rxRssi, MSG_hopStart, MSG_hopLimit, MSG_viaMqtt, etc.)
80518053 * - PARAM_*: Extracted parameters from trigger pattern
80528054 */
8053- private async createScriptEnvVariables ( message : TextMessage , matchedPattern : string , extractedParams : Record < string , string > , trigger : AutoResponderTrigger , packetId ?: number ) {
8055+ private async createScriptEnvVariables (
8056+ message : TextMessage ,
8057+ matchedPattern : string ,
8058+ extractedParams : Record < string , string > ,
8059+ trigger : AutoResponderTrigger ,
8060+ packetId ?: number ,
8061+ context ?: { nodeId : string ; hopsTraveled : number ; isDirectMessage : boolean }
8062+ ) {
80548063 const config = await this . getScriptConnectionConfig ( ) ;
80558064 const scriptEnv : Record < string , string > = {
80568065 ...process . env as Record < string , string > ,
@@ -8063,15 +8072,32 @@ class MeshtasticManager {
80638072 MESHTASTIC_PORT : String ( config . tcpPort ) ,
80648073 } ;
80658074
8075+ // Add token-matching environment variables (Issue #2314)
8076+ // These match the {TOKEN} names from the auto responder documentation
8077+ if ( context ) {
8078+ scriptEnv . NODE_ID = context . nodeId ;
8079+ scriptEnv . HOPS = String ( context . hopsTraveled ) ;
8080+ scriptEnv . IS_DIRECT = String ( context . isDirectMessage ) ;
8081+ }
8082+ if ( message . rxSnr !== undefined ) scriptEnv . SNR = String ( message . rxSnr ) ;
8083+ if ( message . rxRssi !== undefined ) scriptEnv . RSSI = String ( message . rxRssi ) ;
8084+ scriptEnv . CHANNEL = String ( message . channel ) ;
8085+ scriptEnv . VIA_MQTT = String ( message . viaMqtt ) ;
8086+
80668087 // Add sender node information environment variables
80678088 const fromNode = await databaseService . nodes . getNode ( message . fromNodeNum ) ;
80688089 if ( fromNode ) {
80698090 // Add node names (Issue #1099)
80708091 if ( fromNode . shortName ) {
80718092 scriptEnv . FROM_SHORT_NAME = fromNode . shortName ;
8093+ scriptEnv . SHORT_NAME = fromNode . shortName ;
80728094 }
80738095 if ( fromNode . longName ) {
80748096 scriptEnv . FROM_LONG_NAME = fromNode . longName ;
8097+ scriptEnv . LONG_NAME = fromNode . longName ;
8098+ }
8099+ if ( fromNode . firmwareVersion ) {
8100+ scriptEnv . VERSION = fromNode . firmwareVersion ;
80758101 }
80768102 // Add location (FROM_LAT, FROM_LON)
80778103 if ( fromNode . latitude != null && fromNode . longitude != null ) {
@@ -8080,6 +8106,12 @@ class MeshtasticManager {
80808106 }
80818107 }
80828108
8109+ // Add NODECOUNT - active nodes based on maxNodeAgeHours setting
8110+ const maxNodeAgeHours = parseInt ( await databaseService . settings . getSetting ( 'maxNodeAgeHours' ) || '24' ) ;
8111+ const maxNodeAgeDays = maxNodeAgeHours / 24 ;
8112+ const activeNodes = await databaseService . nodes . getActiveNodes ( maxNodeAgeDays ) ;
8113+ scriptEnv . NODECOUNT = String ( activeNodes . length ) ;
8114+
80838115 // Add location environment variables for the MeshMonitor node (MM_LAT, MM_LON)
80848116 const localNodeInfo = this . getLocalNodeInfo ( ) ;
80858117 if ( localNodeInfo ) {
0 commit comments