Merge pull request #4864 from bluewalk/pushover-improvements
Pushover improvements
This commit is contained in:
		| @@ -16,8 +16,7 @@ rules { | |||||||
|     backend = "http"; |     backend = "http"; | ||||||
|     url = "http://nginx:9081/pushover.php"; |     url = "http://nginx:9081/pushover.php"; | ||||||
|     selector = "mailcow_rcpt"; |     selector = "mailcow_rcpt"; | ||||||
|     # Only return msgid, do not parse the full message |     formatter = "json"; | ||||||
|     formatter = "msgid"; |  | ||||||
|     meta_headers = true; |     meta_headers = true; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -47,6 +47,7 @@ if (!function_exists('getallheaders'))  { | |||||||
| } | } | ||||||
|  |  | ||||||
| $headers = getallheaders(); | $headers = getallheaders(); | ||||||
|  | $json_body = json_decode(file_get_contents('php://input')); | ||||||
|  |  | ||||||
| $qid      = $headers['X-Rspamd-Qid']; | $qid      = $headers['X-Rspamd-Qid']; | ||||||
| $rcpts    = $headers['X-Rspamd-Rcpt']; | $rcpts    = $headers['X-Rspamd-Rcpt']; | ||||||
| @@ -65,6 +66,20 @@ if (is_array($symbols_array)) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | $sender_address = $json_body->header_from[0]; | ||||||
|  | $sender_name = '-'; | ||||||
|  | if (preg_match('/(?<name>.*?)<(?<address>.*?)>/i', $sender_address, $matches)) { | ||||||
|  | 	$sender_address = $matches['address']; | ||||||
|  |   $sender_name =  trim($matches['name'], '"\' '); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $to_address = $json_body->header_to[0]; | ||||||
|  | $to_name = '-'; | ||||||
|  | if (preg_match('/(?<name>.*?)<(?<address>.*?)>/i', $to_address, $matches)) { | ||||||
|  | 	$to_address = $matches['address']; | ||||||
|  |   $to_name =  trim($matches['name'], '"\' '); | ||||||
|  | } | ||||||
|  |  | ||||||
| $rcpt_final_mailboxes = array(); | $rcpt_final_mailboxes = array(); | ||||||
|  |  | ||||||
| // Loop through all rcpts | // Loop through all rcpts | ||||||
| @@ -229,9 +244,16 @@ foreach ($rcpt_final_mailboxes as $rcpt_final) { | |||||||
|     $post_fields = array( |     $post_fields = array( | ||||||
|       "token" => $api_data['token'], |       "token" => $api_data['token'], | ||||||
|       "user" => $api_data['key'], |       "user" => $api_data['key'], | ||||||
|       "title" => sprintf("%s", str_replace(array('{SUBJECT}', '{SENDER}'), array($subject, $sender), $title)), |       "title" => sprintf("%s", str_replace( | ||||||
|  |         array('{SUBJECT}', '{SENDER}', '{SENDER_NAME}', '{SENDER_ADDRESS}', '{TO_NAME}', '{TO_ADDRESS}'),  | ||||||
|  |         array($subject, $sender, $sender_name, $sender_address, $to_name, $to_address), $title) | ||||||
|  |       ), | ||||||
|       "priority" => $priority, |       "priority" => $priority, | ||||||
|       "message" => sprintf("%s", str_replace(array('{SUBJECT}', '{SENDER}'), array($subject, $sender), $text)) |       "message" => sprintf("%s", str_replace( | ||||||
|  |         array('{SUBJECT}', '{SENDER}', '{SENDER_NAME}', '{SENDER_ADDRESS}', '{TO_NAME}', '{TO_ADDRESS}', '\n'), | ||||||
|  |         array($subject, $sender, $sender_name, $sender_address, $to_name, $to_address, PHP_EOL), $text) | ||||||
|  |       ), | ||||||
|  |       "sound" => $attributes['sound'] ?? "pushover" | ||||||
|     ); |     ); | ||||||
|     if ($attributes['evaluate_x_prio'] == "1" && $priority == 1) { |     if ($attributes['evaluate_x_prio'] == "1" && $priority == 1) { | ||||||
|       $post_fields['expire'] = 600; |       $post_fields['expire'] = 600; | ||||||
|   | |||||||
| @@ -3349,6 +3349,7 @@ paths: | |||||||
|                           evaluate_x_prio: "0" |                           evaluate_x_prio: "0" | ||||||
|                           key: 21e8918e1jksdjcpis712 |                           key: 21e8918e1jksdjcpis712 | ||||||
|                           only_x_prio: "0" |                           only_x_prio: "0" | ||||||
|  |                           sound: "pushover" | ||||||
|                           senders: "" |                           senders: "" | ||||||
|                           senders_regex: "" |                           senders_regex: "" | ||||||
|                           text: "" |                           text: "" | ||||||
| @@ -3392,6 +3393,7 @@ paths: | |||||||
|                   evaluate_x_prio: "0" |                   evaluate_x_prio: "0" | ||||||
|                   key: 21e8918e1jksdjcpis712 |                   key: 21e8918e1jksdjcpis712 | ||||||
|                   only_x_prio: "0" |                   only_x_prio: "0" | ||||||
|  |                   sound: "pushover" | ||||||
|                   senders: "" |                   senders: "" | ||||||
|                   senders_regex: "" |                   senders_regex: "" | ||||||
|                   text: "" |                   text: "" | ||||||
| @@ -3413,6 +3415,9 @@ paths: | |||||||
|                     only_x_prio: |                     only_x_prio: | ||||||
|                       description: Only send push for prio mails |                       description: Only send push for prio mails | ||||||
|                       type: number |                       type: number | ||||||
|  |                     sound: | ||||||
|  |                       description: Set notification sound | ||||||
|  |                       type: string | ||||||
|                     senders: |                     senders: | ||||||
|                       description: Only send push for emails from these senders |                       description: Only send push for emails from these senders | ||||||
|                       type: string |                       type: string | ||||||
|   | |||||||
| @@ -51,6 +51,7 @@ function pushover($_action, $_data = null) { | |||||||
|           $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; |           $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; | ||||||
|           $evaluate_x_prio = (isset($_data['evaluate_x_prio'])) ? intval($_data['evaluate_x_prio']) : $is_now['evaluate_x_prio']; |           $evaluate_x_prio = (isset($_data['evaluate_x_prio'])) ? intval($_data['evaluate_x_prio']) : $is_now['evaluate_x_prio']; | ||||||
|           $only_x_prio = (isset($_data['only_x_prio'])) ? intval($_data['only_x_prio']) : $is_now['only_x_prio']; |           $only_x_prio = (isset($_data['only_x_prio'])) ? intval($_data['only_x_prio']) : $is_now['only_x_prio']; | ||||||
|  |           $sound = (isset($_data['sound'])) ? $_data['sound'] : $is_now['sound']; | ||||||
|         } |         } | ||||||
|         else { |         else { | ||||||
|           $_SESSION['return'][] = array( |           $_SESSION['return'][] = array( | ||||||
| @@ -101,7 +102,8 @@ function pushover($_action, $_data = null) { | |||||||
|         $po_attributes = json_encode( |         $po_attributes = json_encode( | ||||||
|           array( |           array( | ||||||
|             'evaluate_x_prio' => strval(intval($evaluate_x_prio)), |             'evaluate_x_prio' => strval(intval($evaluate_x_prio)), | ||||||
|             'only_x_prio' => strval(intval($only_x_prio)) |             'only_x_prio' => strval(intval($only_x_prio)), | ||||||
|  |             'sound' => strval($sound) | ||||||
|           ) |           ) | ||||||
|         ); |         ); | ||||||
|         $stmt = $pdo->prepare("REPLACE INTO `pushover` (`username`, `key`, `attributes`, `senders_regex`, `senders`, `token`, `title`, `text`, `active`) |         $stmt = $pdo->prepare("REPLACE INTO `pushover` (`username`, `key`, `attributes`, `senders_regex`, `senders`, `token`, `title`, `text`, `active`) | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ function init_db_schema() { | |||||||
|   try { |   try { | ||||||
|     global $pdo; |     global $pdo; | ||||||
|  |  | ||||||
|     $db_version = "25072022_2300"; |     $db_version = "17112022_2115"; | ||||||
|  |  | ||||||
|     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); |     $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); | ||||||
|     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); |     $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); | ||||||
| @@ -1264,6 +1264,7 @@ function init_db_schema() { | |||||||
|     $pdo->query("UPDATE `pushover` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;"); |     $pdo->query("UPDATE `pushover` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;"); | ||||||
|     $pdo->query("UPDATE `pushover` SET `attributes` =  JSON_SET(`attributes`, '$.evaluate_x_prio', \"0\") WHERE JSON_VALUE(`attributes`, '$.evaluate_x_prio') IS NULL;"); |     $pdo->query("UPDATE `pushover` SET `attributes` =  JSON_SET(`attributes`, '$.evaluate_x_prio', \"0\") WHERE JSON_VALUE(`attributes`, '$.evaluate_x_prio') IS NULL;"); | ||||||
|     $pdo->query("UPDATE `pushover` SET `attributes` =  JSON_SET(`attributes`, '$.only_x_prio', \"0\") WHERE JSON_VALUE(`attributes`, '$.only_x_prio') IS NULL;"); |     $pdo->query("UPDATE `pushover` SET `attributes` =  JSON_SET(`attributes`, '$.only_x_prio', \"0\") WHERE JSON_VALUE(`attributes`, '$.only_x_prio') IS NULL;"); | ||||||
|  |     $pdo->query("UPDATE `pushover` SET `attributes` =  JSON_SET(`attributes`, '$.sound', \"pushover\") WHERE JSON_VALUE(`attributes`, '$.sound') IS NULL;"); | ||||||
|     // mailbox |     // mailbox | ||||||
|     $pdo->query("UPDATE `mailbox` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;"); |     $pdo->query("UPDATE `mailbox` SET `attributes` = '{}' WHERE `attributes` = '' OR `attributes` IS NULL;"); | ||||||
|     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.passwd_update', \"0\") WHERE JSON_VALUE(`attributes`, '$.passwd_update') IS NULL;"); |     $pdo->query("UPDATE `mailbox` SET `attributes` =  JSON_SET(`attributes`, '$.passwd_update', \"0\") WHERE JSON_VALUE(`attributes`, '$.passwd_update') IS NULL;"); | ||||||
|   | |||||||
| @@ -574,6 +574,7 @@ | |||||||
|         "pushover_sender_regex": "Consider the following sender regex", |         "pushover_sender_regex": "Consider the following sender regex", | ||||||
|         "pushover_text": "Notification text", |         "pushover_text": "Notification text", | ||||||
|         "pushover_title": "Notification title", |         "pushover_title": "Notification title", | ||||||
|  |         "pushover_sound": "Sound", | ||||||
|         "pushover_vars": "When no sender filter is defined, all mails will be considered.<br>Regex filters as well as exact sender checks can be defined individually and will be considered sequentially. They do not depend on each other.<br>Useable variables for text and title (please take note of data protection policies)", |         "pushover_vars": "When no sender filter is defined, all mails will be considered.<br>Regex filters as well as exact sender checks can be defined individually and will be considered sequentially. They do not depend on each other.<br>Useable variables for text and title (please take note of data protection policies)", | ||||||
|         "pushover_verify": "Verify credentials", |         "pushover_verify": "Verify credentials", | ||||||
|         "quota_mb": "Quota (MiB)", |         "quota_mb": "Quota (MiB)", | ||||||
| @@ -1097,6 +1098,7 @@ | |||||||
|         "pushover_sender_regex": "Match senders by the following regex", |         "pushover_sender_regex": "Match senders by the following regex", | ||||||
|         "pushover_text": "Notification text", |         "pushover_text": "Notification text", | ||||||
|         "pushover_title": "Notification title", |         "pushover_title": "Notification title", | ||||||
|  |         "pushover_sound": "Sound", | ||||||
|         "pushover_vars": "When no sender filter is defined, all mails will be considered.<br>Regex filters as well as exact sender checks can be defined individually and will be considered sequentially. They do not depend on each other.<br>Useable variables for text and title (please take note of data protection policies)", |         "pushover_vars": "When no sender filter is defined, all mails will be considered.<br>Regex filters as well as exact sender checks can be defined individually and will be considered sequentially. They do not depend on each other.<br>Useable variables for text and title (please take note of data protection policies)", | ||||||
|         "pushover_verify": "Verify credentials", |         "pushover_verify": "Verify credentials", | ||||||
|         "q_add_header": "Junk folder", |         "q_add_header": "Junk folder", | ||||||
|   | |||||||
| @@ -536,6 +536,7 @@ | |||||||
|         "pushover_sender_regex": "Uitsluitend een afzender met de volgende regex", |         "pushover_sender_regex": "Uitsluitend een afzender met de volgende regex", | ||||||
|         "pushover_text": "Meldingstekst ({SUBJECT} zal worden vervangen door het onderwerp)", |         "pushover_text": "Meldingstekst ({SUBJECT} zal worden vervangen door het onderwerp)", | ||||||
|         "pushover_title": "Meldingstitel", |         "pushover_title": "Meldingstitel", | ||||||
|  |         "pushover_sound": "Geluid", | ||||||
|         "pushover_vars": "Wanneer er geen afzenders zijn uitgesloten zullen alle mails doorkomen.<br>Regex-filters en afzendercontroles kunnen individueel worden ingesteld en zullen in volgorde worden verwerkt. Ze zijn niet afhankelijk van elkaar.<br>Bruikbare variabelen voor tekst en titel (neem het gegevensbeschermingsbeleid in acht)", |         "pushover_vars": "Wanneer er geen afzenders zijn uitgesloten zullen alle mails doorkomen.<br>Regex-filters en afzendercontroles kunnen individueel worden ingesteld en zullen in volgorde worden verwerkt. Ze zijn niet afhankelijk van elkaar.<br>Bruikbare variabelen voor tekst en titel (neem het gegevensbeschermingsbeleid in acht)", | ||||||
|         "pushover_verify": "Verifieer aanmeldingsgegevens", |         "pushover_verify": "Verifieer aanmeldingsgegevens", | ||||||
|         "quota_mb": "Quota (MiB)", |         "quota_mb": "Quota (MiB)", | ||||||
| @@ -1002,6 +1003,7 @@ | |||||||
|         "pushover_sender_regex": "Uitsluitend een afzender met de volgende regex", |         "pushover_sender_regex": "Uitsluitend een afzender met de volgende regex", | ||||||
|         "pushover_text": "Meldingstekst ({SUBJECT} zal worden vervangen door het onderwerp)", |         "pushover_text": "Meldingstekst ({SUBJECT} zal worden vervangen door het onderwerp)", | ||||||
|         "pushover_title": "Meldingstitel", |         "pushover_title": "Meldingstitel", | ||||||
|  |         "pushover_sound": "Geluid", | ||||||
|         "pushover_vars": "Wanneer er geen afzenders zijn uitgesloten zullen alle mails doorkomen.<br>Regex-filters en afzendercontroles kunnen individueel worden ingesteld en zullen in volgorde worden verwerkt. Ze zijn niet afhankelijk van elkaar.<br>Bruikbare variabelen voor tekst en titel (let op het gegevensbeschermingsbeleid)", |         "pushover_vars": "Wanneer er geen afzenders zijn uitgesloten zullen alle mails doorkomen.<br>Regex-filters en afzendercontroles kunnen individueel worden ingesteld en zullen in volgorde worden verwerkt. Ze zijn niet afhankelijk van elkaar.<br>Bruikbare variabelen voor tekst en titel (let op het gegevensbeschermingsbeleid)", | ||||||
|         "pushover_verify": "Verifieer aanmeldingsgegevens", |         "pushover_verify": "Verifieer aanmeldingsgegevens", | ||||||
|         "q_add_header": "Spamfolder", |         "q_add_header": "Spamfolder", | ||||||
|   | |||||||
| @@ -275,7 +275,7 @@ | |||||||
|         </div> |         </div> | ||||||
|         <div class="col-sm-10"> |         <div class="col-sm-10"> | ||||||
|           <p class="help-block">{{ lang.user.pushover_info|format(mailbox)|raw }}</p> |           <p class="help-block">{{ lang.user.pushover_info|format(mailbox)|raw }}</p> | ||||||
|           <p class="help-block">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code></p> |           <p class="help-block">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code></p> | ||||||
|           <div class="form-group"> |           <div class="form-group"> | ||||||
|             <div class="row"> |             <div class="row"> | ||||||
|               <div class="col-sm-6"> |               <div class="col-sm-6"> | ||||||
| @@ -308,6 +308,36 @@ | |||||||
|                   <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="sender1@example.com, sender2@example.com"> |                   <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="sender1@example.com, sender2@example.com"> | ||||||
|                 </div> |                 </div> | ||||||
|               </div> |               </div> | ||||||
|  |               <div class="col-sm-12"> | ||||||
|  |                 <div class="form-group"> | ||||||
|  |                   <label for="sound">{{ lang.edit.pushover_sound }}</label><br> | ||||||
|  |                   <select name="sound" class="form-control"> | ||||||
|  |                     <option value="pushover"{% if pushover_data.attributes.sound == 'pushover' %} selected{% endif %}>Pushover (default)</option> | ||||||
|  |                     <option value="bike"{% if pushover_data.attributes.sound == 'bike' %} selected{% endif %}>Bike</option> | ||||||
|  |                     <option value="bugle"{% if pushover_data.attributes.sound == 'bugle' %} selected{% endif %}>Bugle</option> | ||||||
|  |                     <option value="cashregister"{% if pushover_data.attributes.sound == 'cashregister' %} selected{% endif %}>Cash Register</option> | ||||||
|  |                     <option value="classical"{% if pushover_data.attributes.sound == 'classical' %} selected{% endif %}>Classical</option> | ||||||
|  |                     <option value="cosmic"{% if pushover_data.attributes.sound == 'cosmic' %} selected{% endif %}>Cosmic</option> | ||||||
|  |                     <option value="falling"{% if pushover_data.attributes.sound == 'falling' %} selected{% endif %}>Falling</option> | ||||||
|  |                     <option value="gamelan"{% if pushover_data.attributes.sound == 'gamelan' %} selected{% endif %}>Gamelan</option> | ||||||
|  |                     <option value="incoming"{% if pushover_data.attributes.sound == 'incoming' %} selected{% endif %}>Incoming</option> | ||||||
|  |                     <option value="intermission"{% if pushover_data.attributes.sound == 'intermission' %} selected{% endif %}>Intermission</option> | ||||||
|  |                     <option value="magic"{% if pushover_data.attributes.sound == 'magic' %} selected{% endif %}>Magic</option> | ||||||
|  |                     <option value="mechanical"{% if pushover_data.attributes.sound == 'mechanical' %} selected{% endif %}>Mechanical</option> | ||||||
|  |                     <option value="pianobar"{% if pushover_data.attributes.sound == 'pianobar' %} selected{% endif %}>Piano Bar</option> | ||||||
|  |                     <option value="siren"{% if pushover_data.attributes.sound == 'siren' %} selected{% endif %}>Siren</option> | ||||||
|  |                     <option value="spacealarm"{% if pushover_data.attributes.sound == 'spacealarm' %} selected{% endif %}>Space Alarm</option> | ||||||
|  |                     <option value="tugboat"{% if pushover_data.attributes.sound == 'tugboat' %} selected{% endif %}>Tug Boat</option> | ||||||
|  |                     <option value="alien"{% if pushover_data.attributes.sound == 'alien' %} selected{% endif %}>Alien Alarm (long)</option> | ||||||
|  |                     <option value="climb"{% if pushover_data.attributes.sound == 'climb' %} selected{% endif %}>Climb (long)</option> | ||||||
|  |                     <option value="persistent"{% if pushover_data.attributes.sound == 'persistent' %} selected{% endif %}>Persistent (long)</option> | ||||||
|  |                     <option value="echo"{% if pushover_data.attributes.sound == 'echo' %} selected{% endif %}>Pushover Echo (long)</option> | ||||||
|  |                     <option value="updown"{% if pushover_data.attributes.sound == 'updown' %} selected{% endif %}>Up Down (long)</option> | ||||||
|  |                     <option value="vibrate"{% if pushover_data.attributes.sound == 'vibrate' %} selected{% endif %}>Vibrate Only</option> | ||||||
|  |                     <option value="none"{% if pushover_data.attributes.sound == 'none' %} selected{% endif %}> None (silent) </option> | ||||||
|  |                   </select> | ||||||
|  |                 </div> | ||||||
|  |               </div> | ||||||
|               <div class="col-sm-12"> |               <div class="col-sm-12"> | ||||||
|                 <div class="checkbox"> |                 <div class="checkbox"> | ||||||
|                   <label><input type="checkbox" value="1" name="active"{% if pushover_data.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label> |                   <label><input type="checkbox" value="1" name="active"{% if pushover_data.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label> | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|       </div> |       </div> | ||||||
|       <div class="col-sm-10"> |       <div class="col-sm-10"> | ||||||
|         <p class="help-block">{{ lang.user.pushover_info|format(mailcow_cc_username)|raw }}</p> |         <p class="help-block">{{ lang.user.pushover_info|format(mailcow_cc_username)|raw }}</p> | ||||||
|         <p class="help-block">{{ lang.user.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code></p> |         <p class="help-block">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code></p> | ||||||
|         <div class="form-group"> |         <div class="form-group"> | ||||||
|           <div class="row"> |           <div class="row"> | ||||||
|             <div class="col-sm-6"> |             <div class="col-sm-6"> | ||||||
| @@ -42,6 +42,36 @@ | |||||||
|                 <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="sender1@example.com, sender2@example.com"> |                 <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="sender1@example.com, sender2@example.com"> | ||||||
|               </div> |               </div> | ||||||
|             </div> |             </div> | ||||||
|  |             <div class="col-sm-12"> | ||||||
|  |               <div class="form-group"> | ||||||
|  |                 <label for="sound">{{ lang.edit.pushover_sound }}</label><br> | ||||||
|  |                 <select name="sound" class="form-control"> | ||||||
|  |                   <option value="pushover"{% if pushover_data.attributes.sound == 'pushover' %} selected{% endif %}>Pushover (default)</option> | ||||||
|  |                   <option value="bike"{% if pushover_data.attributes.sound == 'bike' %} selected{% endif %}>Bike</option> | ||||||
|  |                   <option value="bugle"{% if pushover_data.attributes.sound == 'bugle' %} selected{% endif %}>Bugle</option> | ||||||
|  |                   <option value="cashregister"{% if pushover_data.attributes.sound == 'cashregister' %} selected{% endif %}>Cash Register</option> | ||||||
|  |                   <option value="classical"{% if pushover_data.attributes.sound == 'classical' %} selected{% endif %}>Classical</option> | ||||||
|  |                   <option value="cosmic"{% if pushover_data.attributes.sound == 'cosmic' %} selected{% endif %}>Cosmic</option> | ||||||
|  |                   <option value="falling"{% if pushover_data.attributes.sound == 'falling' %} selected{% endif %}>Falling</option> | ||||||
|  |                   <option value="gamelan"{% if pushover_data.attributes.sound == 'gamelan' %} selected{% endif %}>Gamelan</option> | ||||||
|  |                   <option value="incoming"{% if pushover_data.attributes.sound == 'incoming' %} selected{% endif %}>Incoming</option> | ||||||
|  |                   <option value="intermission"{% if pushover_data.attributes.sound == 'intermission' %} selected{% endif %}>Intermission</option> | ||||||
|  |                   <option value="magic"{% if pushover_data.attributes.sound == 'magic' %} selected{% endif %}>Magic</option> | ||||||
|  |                   <option value="mechanical"{% if pushover_data.attributes.sound == 'mechanical' %} selected{% endif %}>Mechanical</option> | ||||||
|  |                   <option value="pianobar"{% if pushover_data.attributes.sound == 'pianobar' %} selected{% endif %}>Piano Bar</option> | ||||||
|  |                   <option value="siren"{% if pushover_data.attributes.sound == 'siren' %} selected{% endif %}>Siren</option> | ||||||
|  |                   <option value="spacealarm"{% if pushover_data.attributes.sound == 'spacealarm' %} selected{% endif %}>Space Alarm</option> | ||||||
|  |                   <option value="tugboat"{% if pushover_data.attributes.sound == 'tugboat' %} selected{% endif %}>Tug Boat</option> | ||||||
|  |                   <option value="alien"{% if pushover_data.attributes.sound == 'alien' %} selected{% endif %}>Alien Alarm (long)</option> | ||||||
|  |                   <option value="climb"{% if pushover_data.attributes.sound == 'climb' %} selected{% endif %}>Climb (long)</option> | ||||||
|  |                   <option value="persistent"{% if pushover_data.attributes.sound == 'persistent' %} selected{% endif %}>Persistent (long)</option> | ||||||
|  |                   <option value="echo"{% if pushover_data.attributes.sound == 'echo' %} selected{% endif %}>Pushover Echo (long)</option> | ||||||
|  |                   <option value="updown"{% if pushover_data.attributes.sound == 'updown' %} selected{% endif %}>Up Down (long)</option> | ||||||
|  |                   <option value="vibrate"{% if pushover_data.attributes.sound == 'vibrate' %} selected{% endif %}>Vibrate Only</option> | ||||||
|  |                   <option value="none"{% if pushover_data.attributes.sound == 'none' %} selected{% endif %}> None (silent) </option> | ||||||
|  |                 </select> | ||||||
|  |               </div> | ||||||
|  |             </div> | ||||||
|             <div class="col-sm-12"> |             <div class="col-sm-12"> | ||||||
|               <div class="checkbox"> |               <div class="checkbox"> | ||||||
|                 <label><input type="checkbox" value="1" name="active"{% if pushover_data.active == '1' %} checked{% endif %}> {{ lang.user.active }}</label> |                 <label><input type="checkbox" value="1" name="active"{% if pushover_data.active == '1' %} checked{% endif %}> {{ lang.user.active }}</label> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user