Răsfoiți Sursa

added support for Pushover API priority brought up by SteveEdson in issue #187; the priority levels can be adjusted either through the handler's constructor or setters

Artur Moczulski 12 ani în urmă
părinte
comite
fe13e80787

+ 25 - 1
src/Monolog/Handler/PushoverHandler.php

@@ -24,6 +24,9 @@ class PushoverHandler extends SocketHandler
     private $token;
     private $user;
     private $title;
+    
+    private $highPriorityLevel;
+    private $emergencyLevel;
 
     /**
      * @param string  $token  Pushover api token
@@ -33,8 +36,12 @@ class PushoverHandler extends SocketHandler
      * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
      * @param Boolean $useSSL Whether to connect via SSL. Required when pushing messages to users that are not
      *                        the pushover.net app owner. OpenSSL is required for this option.
+     * @param integer $highPriorityLevel The minimum logging level at which this handler will start
+     *                                   sending "high priority" requestes to Pushover API
+     * @param integer $emergencyLevel The minimum logging level at which this handler will start
+     *                                sending "emergency" requests to Pushover API
      */
-    public function __construct($token, $user, $title = null, $level = Logger::CRITICAL, $bubble = true, $useSSL = true)
+    public function __construct($token, $user, $title = null, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY)
     {
         $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80';
         parent::__construct($connectionString, $level, $bubble);
@@ -42,6 +49,8 @@ class PushoverHandler extends SocketHandler
         $this->token = $token;
         $this->user = $user;
         $this->title = $title ?: gethostname();
+        $this->highPriorityLevel = $highPriorityLevel;
+        $this->emergencyLevel = $emergencyLevel;
     }
 
     protected function generateDataStream($record)
@@ -66,6 +75,12 @@ class PushoverHandler extends SocketHandler
             'timestamp' => $timestamp
         );
 
+        if( $record['level'] >= $this->highPriorityLevel && $record['level'] < $this->emergencyLevel ) {
+            $dataArray['priority'] = 1;
+        } else if ( $record['level'] >= $this->emergencyLevel ) {
+            $dataArray['priority'] = 2;
+        }
+
         return http_build_query($dataArray);
     }
 
@@ -85,4 +100,13 @@ class PushoverHandler extends SocketHandler
         parent::write($record);
         $this->closeSocket();
     }
+
+    public function setHighPriorityLevel($value) {
+        $this->highPriorityLevel = $value;
+    }
+
+    public function setEmergencyLevel($value) {
+        $this->emergencyLevel = $value;
+    }
+
 }

+ 24 - 1
tests/Monolog/Handler/PushoverHandlerTest.php

@@ -29,6 +29,7 @@ class PushoverHandlerTest extends TestCase
     public function testWriteHeader()
     {
         $this->createHandler();
+        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications
         $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
         fseek($this->res, 0);
         $content = fread($this->res, 1024);
@@ -48,7 +49,7 @@ class PushoverHandlerTest extends TestCase
 
     public function testWriteWithComplexTitle()
     {
-        $this->createHandler('myToken', 'myUser', 'Backup finished - SQL1');
+        $this->createHandler('myToken', 'myUser', 'Backup finished - SQL1', Logger::EMERGENCY);
         $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
         fseek($this->res, 0);
         $content = fread($this->res, 1024);
@@ -59,6 +60,7 @@ class PushoverHandlerTest extends TestCase
     public function testWriteWithComplexMessage()
     {
         $this->createHandler();
+        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications
         $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.'));
         fseek($this->res, 0);
         $content = fread($this->res, 1024);
@@ -70,6 +72,7 @@ class PushoverHandlerTest extends TestCase
     {
         $message = str_pad('test', 520, 'a');
         $this->createHandler();
+        $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications
         $this->handler->handle($this->getRecord(Logger::CRITICAL, $message));
         fseek($this->res, 0);
         $content = fread($this->res, 1024);
@@ -79,6 +82,26 @@ class PushoverHandlerTest extends TestCase
         $this->assertRegexp('/message=' . $expectedMessage . '&title/', $content);
     }
 
+    public function testWriteWithHighPriority() 
+    {
+        $this->createHandler();
+        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1'));
+        fseek($this->res, 0);
+        $content = fread($this->res, 1024);
+
+        $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog&timestamp=\d{10}&priority=1$/', $content);
+    }
+
+    public function testWriteWithEmergencyPriority() 
+    {
+        $this->createHandler();
+        $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1'));
+        fseek($this->res, 0);
+        $content = fread($this->res, 1024);
+
+        $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog&timestamp=\d{10}&priority=2$/', $content);
+    }
+
     private function createHandler($token = 'myToken', $user = 'myUser', $title = 'Monolog')
     {
         $constructorArgs = array($token, $user, $title);