-
Notifications
You must be signed in to change notification settings - Fork 0
/
EventHandler.php
104 lines (87 loc) · 2.97 KB
/
EventHandler.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
/************************************************************
* icarus v1.0-beta -- an IRC framework for PHP *
* Author: rintaun - Matthew J. Lanigan <rintaun@gmail.com> *
* *
* Copyright 2011 Matthew J. Lanigan. *
* See LICENSE file for licensing restrictions *
************************************************************
* Portions adapted or inspired by from Praxis IRC Services *
* Copyright (c) 2004 Eric Will <rakaur@malkier.net> *
* Copyright (c) 2003-2004 shrike development team. *
************************************************************/
//if (!defined('_ICARUS_')) die('This script may not be invoked directly.' . "\n");
abstract class EventHandler
{
private $eventheap = array();
public function eventAdd($event, $callback, $priority=0)
{
$eid = uniqid('e');
$this->eventheap[$event][$eid] = array(
'priority' => $priority,
'callback' => $callback
);
_log(L_DEBUG, "%s->eventAdd(): (%s) Adding new callback for event %s at %d priority", get_called_class(), $eid, $event, $priority);
return $eid;
}
public function eventDelete($event, $callback)
{
foreach ($this->eventheap[$event] AS $eid => $entry)
{
if ($callback == $entry['callback'])
{
unset($this->eventheap[$eid]);
_log(L_DEBUG, "%s->eventDelete(): Deleted eventid %s", get_called_class(), $eif);
return;
}
}
_log(L_DEBUG, "%s->eventDelete(): Unable to delete eventid %s: not found", get_called_class(), $eid);
}
public function eventDeleteID($eid)
{
if (isset($this->eventheap[$eid]))
{
unset($this->eventheap[$eid]);
_log(L_DEBUG, "%s->eventDeleteID(): Deleted eventid %s", get_called_class(), $eid);
return;
}
_log(L_DEBUG, "%s->eventDeleteID(): Unable to delete eventid %s: not found", get_called_class(), $eid);
}
public function eventPost($event)
{
$args = func_get_args();
array_shift($args);
if (!isset($this->eventheap[$event]))
{
_log(L_DEBUG, "%s->eventPost(): No events registered for %s", get_called_class(), $event);
return;
}
$this->eventSort($event);
_log(L_DEBUG,"%s->eventPost(): Posting event %s", get_called_class(), $event);
foreach ($this->eventheap[$event] AS $eid => $entry)
{
if ((call_user_func_array($entry['callback'], $args)) === FALSE) break;
}
}
private function eventSort($event)
{
if (!isset($this->eventheap[$event]))
{
_log(L_DEBUG, "%s->eventSort(): No events registered for %s", get_called_class(), $event);
return;
}
foreach ($this->eventheap[$event] AS $eid => $entry)
if (!is_array($entry))
{
_log(L_WARNING, "%s->eventSort(): Removing invalid event from eventheap", get_called_class());
unset($this->eventheap[$key]);
}
uasort($this->eventheap[$event], array($this, 'eventCmp'));
}
private function eventCmp($a, $b)
{
if ($a['priority'] == $b['priority'])
return 0;
return ($a['priority'] < $b['priority']) ? -1 : 1;
}
}