Skip to content

Commit 0b8e6ae

Browse files
committed
Event system and callbacks added
1 parent 2fe7249 commit 0b8e6ae

20 files changed

+415
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ Updates should follow the [Keep a CHANGELOG](http://keepachangelog.com/) princip
66

77
## [UNRELEASED]
88
### Fixed
9-
- NaN
9+
- Quota handling fixed
1010

1111
### Added
12-
- NaN
12+
- Event system and callbacks added
1313

1414
### Affected Classes
1515
- NaN

README.md

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ The functionality is almost completely integrated and even supports IDLE operati
2828
- [Message flags](#message-flags)
2929
- [Attachments](#attachments)
3030
- [Advanced fetching](#advanced-fetching)
31+
- [Events](#events)
3132
- [Masking](#masking)
3233
- [Specials](#specials)
3334
- [Support](#support)
@@ -210,13 +211,13 @@ $oClient->connect();
210211
```
211212

212213
#### Idle
213-
Every time a new message is received the server will notify the client and return the new message.
214+
Every time a new message is received, the server will notify the client and return the new message.
214215
``` php
215216
/** @var \Webklex\PHPIMAP\Client $oClient */
216217

217218
/** @var \Webklex\PHPIMAP\Folder $oFolder */
218219
$oFolder->idle(function($message){
219-
dump($message->subject);
220+
echo $message->subject."\n";
220221
});
221222
```
222223

@@ -467,6 +468,39 @@ $aMessage = $oFolder->query()->whereAll()
467468
->get();
468469
```
469470

471+
#### Events
472+
The following events are available:
473+
- `Webklex\PHPIMAP\Events\MessageNewEvent($message)` — can get triggered by `Folder::idle`
474+
- `Webklex\PHPIMAP\Events\MessageDeletedEvent($message)` — triggered by `Message::delete`
475+
- `Webklex\PHPIMAP\Events\MessageRestoredEvent($message)` — triggered by `Message::restore`
476+
- `Webklex\PHPIMAP\Events\MessageMovedEvent($old_message, $new_message)` — triggered by `Message::move`
477+
- `Webklex\PHPIMAP\Events\MessageCopiedEvent($old_message, $new_message)` — triggered by `Message::copy`
478+
- `Webklex\PHPIMAP\Events\FlagNewEvent($flag)` — triggered by `Message::setFlag`
479+
- `Webklex\PHPIMAP\Events\FlagDeletedEvent($flag)` — triggered by `Message::unsetFlag`
480+
- `Webklex\PHPIMAP\Events\FolderNewEvent($folder)` — can get triggered by `Client::createFolder`
481+
- `Webklex\PHPIMAP\Events\FolderDeletedEvent($folder)` — triggered by `Folder::delete`
482+
- `Webklex\PHPIMAP\Events\FolderMovedEvent($old_folder, $new_folder)` — triggered by `Folder::move`
483+
484+
Create and register your own custom event:
485+
``` php
486+
class CustomMessageNewEvent extends Webklex\PHPIMAP\Events\MessageNewEvent {
487+
488+
/**
489+
* Create a new event instance.
490+
* @var Message[] $messages
491+
* @return void
492+
*/
493+
public function __construct($messages) {
494+
$this->message = $messages[0];
495+
echo "New message: ".$this->message->subject."\n";
496+
}
497+
}
498+
499+
/** @var \Webklex\PHPIMAP\Client $client */
500+
$client->setEvent("message", "new", CustomMessageNewEvent::class);
501+
```
502+
..or set it in your config file under `events.message.new`,
503+
470504
#### Masking
471505
Laravel-IMAP already comes with two default masks [MessageMask::class](#messagemaskclass) and [AttachmentMask::class](#attachmentmaskclass).
472506

src/Client.php

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@
2323
use Webklex\PHPIMAP\Support\FolderCollection;
2424
use Webklex\PHPIMAP\Support\Masks\AttachmentMask;
2525
use Webklex\PHPIMAP\Support\Masks\MessageMask;
26+
use Webklex\PHPIMAP\Traits\HasEvents;
2627

2728
/**
2829
* Class Client
2930
*
3031
* @package Webklex\PHPIMAP
3132
*/
3233
class Client {
34+
use HasEvents;
3335

3436

3537
/**
@@ -128,6 +130,7 @@ class Client {
128130
public function __construct($config = []) {
129131
$this->setConfig($config);
130132
$this->setMaskFromConfig($config);
133+
$this->setEventsFromConfig($config);
131134
}
132135

133136
/**
@@ -155,6 +158,21 @@ public function setConfig(array $config) {
155158
return $this;
156159
}
157160

161+
/**
162+
* Look for a possible events in any available config
163+
* @param $config
164+
*/
165+
protected function setEventsFromConfig($config) {
166+
$this->events = ClientManager::get("events");
167+
if(isset($config['events'])){
168+
if(isset($config['events'])) {
169+
foreach($config['events'] as $section => $events) {
170+
$this->events[$section] = array_merge($this->events[$section], $events);
171+
}
172+
}
173+
}
174+
}
175+
158176
/**
159177
* Look for a possible mask in any available config
160178
* @param $config
@@ -383,13 +401,21 @@ public function openFolder($folder) {
383401
*
384402
* @return bool
385403
* @throws ConnectionFailedException
404+
* @throws FolderFetchingException
405+
* @throws Exceptions\EventNotFoundException
386406
*/
387407
public function createFolder($folder, $expunge = true) {
388408
$this->checkConnection();
389409
$status = $this->connection->createFolder($folder);
390410
if($expunge) $this->expunge();
391411

392-
return $status;
412+
$folder = $this->getFolder($folder);
413+
if($status && $folder) {
414+
$event = $this->getEvent("folder", "new");
415+
$event::dispatch($folder);
416+
}
417+
418+
return $folder;
393419
}
394420

395421
/**
@@ -474,6 +500,14 @@ public function getDefaultMessageMask(){
474500
return $this->default_message_mask;
475501
}
476502

503+
/**
504+
* @param $section
505+
* @return array
506+
*/
507+
public function getDefaultEvents($section){
508+
return $this->events[$section];
509+
}
510+
477511
/**
478512
* @param $mask
479513
*

src/Events/Event.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Webklex\PHPIMAP\Events;
4+
5+
6+
abstract class Event {
7+
8+
/**
9+
* Dispatch the event with the given arguments.
10+
*/
11+
public static function dispatch() {
12+
return new static(func_get_args());
13+
}
14+
}

src/Events/FlagDeletedEvent.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Webklex\PHPIMAP\Events;
4+
5+
6+
class FlagDeletedEvent extends FlagNewEvent {
7+
8+
}

src/Events/FlagNewEvent.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Webklex\PHPIMAP\Events;
4+
5+
use Webklex\PHPIMAP\Message;
6+
7+
class FlagNewEvent extends Event {
8+
9+
/** @var Message $message */
10+
public $message;
11+
12+
/** @var string $flag */
13+
public $flag;
14+
15+
/**
16+
* Create a new event instance.
17+
* @var mixed[] $arguments
18+
* @return void
19+
*/
20+
public function __construct($arguments) {
21+
$this->message = $arguments[0];
22+
$this->flag = $arguments[1];
23+
}
24+
}

src/Events/FolderDeletedEvent.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Webklex\PHPIMAP\Events;
4+
5+
class FolderDeletedEvent extends FolderNewEvent {
6+
7+
}

src/Events/FolderMovedEvent.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Webklex\PHPIMAP\Events;
4+
5+
use Webklex\PHPIMAP\Folder;
6+
7+
class FolderMovedEvent extends Event {
8+
9+
/** @var Folder $old_folder */
10+
public $old_folder;
11+
/** @var Folder $new_folder */
12+
public $new_folder;
13+
14+
/**
15+
* Create a new event instance.
16+
* @var Folder[] $folders
17+
* @return void
18+
*/
19+
public function __construct($folders) {
20+
$this->old_folder = $folders[0];
21+
$this->new_folder = $folders[1];
22+
}
23+
}

src/Events/FolderNewEvent.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Webklex\PHPIMAP\Events;
4+
5+
use Webklex\PHPIMAP\Folder;
6+
7+
class FolderNewEvent extends Event {
8+
9+
/** @var Folder $folder */
10+
public $folder;
11+
12+
/**
13+
* Create a new event instance.
14+
* @var Folder[] $folders
15+
* @return void
16+
*/
17+
public function __construct($folders) {
18+
$this->folder = $folders[0];
19+
}
20+
}

src/Events/MessageCopiedEvent.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Webklex\PHPIMAP\Events;
4+
5+
6+
class MessageCopiedEvent extends MessageMovedEvent {
7+
8+
}

0 commit comments

Comments
 (0)