with('coin')->findAll( "enabled AND lastchecked <= {$since} ". " AND (nc.installed OR nc.enable OR nc.watch)" ); foreach($notifications as $rule) { $coin = $rule->coin; $condw = explode(" ", $rule->conditiontype); $field = $condw[0]; if (count($condw) < 2) { debuglog("notify: invalid conditiontype for {coin->symbol}, need at least one space like 'price >'"); continue; } $comp = $condw[1]; $triggered = false; if (array_key_exists($field, $rule->coin->attributes)) { $value = $rule->coin->attributes[$field]; $valref = $rule->conditionvalue; switch ($comp) { case '<': $triggered = $value < $valref; break; case '>': $triggered = $value > $valref; break; case '<=': $triggered = $value <= $valref; break; case '>=': $triggered = $value >= $valref; break; case '=': case '==': $triggered = $value == $valref; break; } } else { debuglog("notify: invalid field '{$field}' in conditiontype for {$coin->symbol}!"); continue; } if ($triggered && $rule->lasttriggered == $rule->lastchecked) { // already notified $rule->lasttriggered = $time; $rule->lastchecked = $time; $rule->save(); continue; } else { $rule->lasttriggered = $triggered ? $time : 0; $rule->lastchecked = $time; $rule->save(); } if (!$triggered) continue; $value = bitcoinvaluetoa($value); debuglog("trigger: {$coin->symbol} {$rule->notifytype} {$rule->conditiontype} {$rule->conditionvalue} ({$value})"); switch ($rule->notifytype) { case 'email': $subject = "[{$coin->symbol}] Trigger {$rule->conditiontype} {$rule->conditionvalue} ({$value})"; $message = "Description: {$rule->description}\n\n"; $message .= "Field: {$field}\n"; $message .= "Value: {$value} at ".strftime("%Y-%m-%d %T %z", $time)."\n"; // replace some possible vars in message (description) $message = str_replace('$X', $value, $message); $message = str_replace('$F', $field, $message); $message = str_replace('$T', $rule->conditiontype, $message); $message = str_replace('$V', $rule->conditionvalue, $message); $message = str_replace('$N', $coin->name, $message); $message = str_replace('$SYM', $coin->symbol, $message); $message = str_replace('$S2', $coin->symbol2, $message); $message = str_replace('$A', $coin->master_wallet, $message); $dest = YAAMP_ADMIN_EMAIL; if (!empty($rule->notifycmd) && strstr($rule->notifycmd, "@")) { $dest = $rule->notifycmd; } $res = mail($dest, $subject, $message); if (!$res) debuglog("notify: {$coin->symbol} unable to send mail to {$dest}!"); break; case 'rpc': $command = $rule->notifycmd; // replace some possible vars in user command $command = str_replace('$X', $value, $command); $command = str_replace('$F', $field, $command); $command = str_replace('$T', $rule->conditiontype, $command); $command = str_replace('$V', $rule->conditionvalue, $command); $command = str_replace('$N', $coin->name, $command); $command = str_replace('$SYM', $coin->symbol, $command); $command = str_replace('$S2', $coin->symbol2, $command); $command = str_replace('$A', $coin->master_wallet, $command); $remote = new WalletRPC($coin); $res = $remote->execute($command); if ($res === false) debuglog("trigger: {$coin->symbol} rpc error '{$command}' {$remote->error}"); else debuglog("trigger: {$coin->symbol} rpc -> $res"); break; case 'system': $command = $rule->notifycmd; // replace some possible vars in user command $command = str_replace('$X', $value, $command); $command = str_replace('$F', $field, $command); $command = str_replace('$T', $rule->conditiontype, $command); $command = str_replace('$V', $rule->conditionvalue, $command); $command = str_replace('$N', $coin->name, $command); $command = str_replace('$SYM', $coin->symbol, $command); $command = str_replace('$S2', $coin->symbol2, $command); $command = str_replace('$A', $coin->master_wallet, $command); $res = system($command); if ($res === false) debuglog("trigger: {$coin->symbol} unable to execute '{$command}'!"); break; } } }