Skip to content

Commit

Permalink
Merge pull request #18 from glensc/move-events
Browse files Browse the repository at this point in the history
  • Loading branch information
glensc authored Apr 16, 2023
2 parents 9caa75c + 6a61235 commit eadfbf1
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 2 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ A DokuWiki plugin that notifies a Slack channel room of wiki edits.

![Example notification](example.png)

![Example rename notification](example_rename.png)

## Install

Download the latest release from [Tags] page and install the plugin using the
Expand Down
77 changes: 75 additions & 2 deletions action.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,97 @@
use dokuwiki\Extension\EventHandler;
use dokuwiki\HTTP\DokuHTTPClient;
use dokuwiki\Logger;
use dokuwiki\plugin\slacknotifier\event\PageMoveEvent;
use dokuwiki\plugin\slacknotifier\event\PageSaveEvent;
use dokuwiki\plugin\slacknotifier\helper\Config;
use dokuwiki\plugin\slacknotifier\helper\Context;
use dokuwiki\plugin\slacknotifier\helper\Formatter;

class action_plugin_slacknotifier extends ActionPlugin
{
/** @var Event[] */
private $changes = [];
/** @var PageMoveEvent[] */
private $created = [];
/** @var PageMoveEvent[] */
private $deleted = [];
private $inRename = false;

public function register(EventHandler $controller): void
{
$controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handleSave');
$controller->register_hook('PLUGIN_MOVE_PAGE_RENAME', 'BEFORE', $this, 'handleRenameBefore', 'BEFORE');
$controller->register_hook('PLUGIN_MOVE_PAGE_RENAME', 'AFTER', $this, 'handleRenameAfter', 'AFTER');
}

public function handleRenameBefore(Event $rawEvent): void
{
$this->inRename = true;
$event = new PageMoveEvent($rawEvent);
$this->created[$event->dst_id] = $event;
$this->deleted[$event->src_id] = $event;
}

public function handleRenameAfter(): void
{
if (!$this->inRename) {
// Sanity check
throw new RuntimeException('Logic error: in rename is false after rename');
}
$this->inRename = false;

foreach ($this->getEvents() as $event) {
$this->processEvent($event);
}
}

public function handleSave(Event $event): void
{
if ($this->inRename) {
$this->changes[] = $event;
return;
}

$this->processEvent(new PageSaveEvent($event));
}

/**
* @return PageSaveEvent[]
*/
private function getEvents(): array
{
$events = [];
foreach ($this->changes as $rawEvent) {
$event = new PageSaveEvent($rawEvent);
$pageId = $event->id;

if ($event->isCreate() && isset($this->created[$pageId])) {
$moveEvent = $this->created[$pageId];
$moveEvent->setCreatedPageEvent($event);
unset($this->created[$pageId]);
} elseif ($event->isDelete() && isset($this->deleted[$pageId])) {
$moveEvent = $this->deleted[$pageId];
$createdEvent = $moveEvent->getCreatedPageEvent();
$createdEvent->convertToRename($event);
unset($this->deleted[$pageId]);
// Skip delete event itself
continue;
}

$events[] = $event;
}
$this->changes = [];

return $events;
}

public function handleSave(Event $rawEvent): void
private function processEvent(PageSaveEvent $event): void
{
$config = new Config($this);
if (!$this->isValidNamespace($config->namespaces)) {
return;
}

$event = new PageSaveEvent($rawEvent);
if (!$this->isValidEvent($event->getEventType(), $config)) {
return;
}
Expand Down Expand Up @@ -63,6 +134,8 @@ private function isValidEvent(?string $eventType, Config $config): bool
return true;
} elseif ($eventType === 'delete' && $config->notify_delete) {
return true;
} elseif ($eventType === 'rename' && $config->notify_create && $config->notify_delete) {
return true;
}

return false;
Expand Down
9 changes: 9 additions & 0 deletions event/BaseEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,13 @@ public function __get(string $name)

return $this->data[$name];
}

public function __set(string $name, $value)
{
if (!array_key_exists($name, $this->data)) {
throw new InvalidArgumentException("Invalid property: $name");
}

$this->data[$name] = $value;
}
}
27 changes: 27 additions & 0 deletions event/PageMoveEvent.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace dokuwiki\plugin\slacknotifier\event;

use dokuwiki\Extension\Event;
use InvalidArgumentException;

/**
* @property string $src_id
* @property string $dst_id
* @link https://www.dokuwiki.org/plugin:move#for_plugin_authors
*/
class PageMoveEvent extends BaseEvent
{
/** @var PageSaveEvent|null */
private $createdPageEvent;

public function setCreatedPageEvent(PageSaveEvent $event)
{
$this->createdPageEvent = $event;
}

public function getCreatedPageEvent(): ?PageSaveEvent
{
return $this->createdPageEvent;
}
}
30 changes: 30 additions & 0 deletions event/PageSaveEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace dokuwiki\plugin\slacknotifier\event;

use InvalidArgumentException;

/**
* @property string $changeType
* @property string|null $summary
Expand All @@ -12,15 +14,43 @@
*/
class PageSaveEvent extends BaseEvent
{
const TYPE_RENAME = 'rename';

private const EVENT_TYPE = [
DOKU_CHANGE_TYPE_EDIT => 'edit',
DOKU_CHANGE_TYPE_MINOR_EDIT => 'edit minor',
DOKU_CHANGE_TYPE_CREATE => 'create',
DOKU_CHANGE_TYPE_DELETE => 'delete',
self::TYPE_RENAME => 'rename',
];

public function getEventType(): ?string
{
return self::EVENT_TYPE[$this->changeType] ?? null;
}

public function isCreate(): bool
{
return $this->changeType === DOKU_CHANGE_TYPE_CREATE;
}

public function isDelete(): bool
{
return $this->changeType === DOKU_CHANGE_TYPE_DELETE;
}

public function convertToRename(PageSaveEvent $deleteEvent)
{
// Sanity check
if (
!$this->isCreate() ||
!$deleteEvent->isDelete() ||
$this->summary !== $deleteEvent->summary
) {
throw new InvalidArgumentException("Unexpected event");
}

$this->changeType = self::TYPE_RENAME;
$this->oldRevision = $deleteEvent->oldRevision;
}
}
Binary file added example_rename.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions helper/Formatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public function format(PageSaveEvent $event, Context $context): array
'edit' => 'updated',
'edit minor' => 'updated (minor edit)',
'delete' => 'removed',
'rename' => 'renamed',
];
$eventType = $event->getEventType();
$action = $actionMap[$eventType] ?? null;
Expand Down

0 comments on commit eadfbf1

Please sign in to comment.