/
Plugin.php
150 lines (140 loc) · 5.14 KB
/
Plugin.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php
/**
* @file The main file of Mibew:Boilerplate plugin.
*
* Plugin's class name, its namespace and file path must follow special naming
* conventions. The name of the main plugin class should match pattern:
* "\<Vendor Name>\Mibew\Plugin\<Plugin name>\Plugin". It should be placed in
* "<mibew root>/plugins/<Vendor Name>/Mibew/Plugin/<Plugin name>/Plugin.php"
* file. Names of plugin and directories/files are case sensitive!
*
* To turn the plugin on add the following to <mibew root>/libs/config.php
* <code>
* $plugins_list[] = array(
* 'name' => 'Mibew:Boilerplate',
* 'config' => array(
* 'very_important_value' => '$3.50',
* );
* );
* </code>
*/
namespace Mibew\Mibew\Plugin\Aggressive;
/**
* Defenition of the main plugin class.
*
* Plugin class must implements \Mibew\Plugin\PluginInterface and can extends
* \Mibew\Plugin\AbstractPlugin class. The latter contains basic functions that
* can be helpfull.
*/
class Plugin extends \Mibew\Plugin\AbstractPlugin implements \Mibew\Plugin\PluginInterface
{
/**
* Determine if the plugin was initialized correctly or not.
*
* By setting this propery to true by default we can make the plugin
* initialized by default, so there is no need to add custom contructor
* or initializer.
*
* This propery is overridden here only for example. We do not need to do
* so in each plugin. In general case it should be set to true in the plugin
* constructor when all necessary checks will be passed.
*
* Another way to control initialization state of the plugin is by means of
* {@link \Mibew\Plugin\PluginInterface::initialized()} method.
*/
protected $initialized = true;
/**
* Plugin's constructor.
*
* The code is situated here can initialize the plugin but cannot depend
* on other plugins. All dependent code should be placed in "run" method.
*
* The current implementation just checks plugin's configurations.
*
* @param array $config Associative array of configuration params from the
* main config file.
*/
public function __construct($config)
{
// Check if a fake config param is set or it does not. In the sake of
// simplicity we do not check the value.
if (!isset($config['very_important_value'])) {
// "very_important_value" param was not set. In this case we cannot
// initialize the plugin correctly, so we need to tell the system
// about it.
$this->initialized = false;
}
}
/**
* The main entry point of a plugin
*
* If a plugin extends \Mibew\Plugin\AbstructPlugin class the only method
* that should be implemented is "run".
*
* Here we can attach event listeners and do other job.
*/
public function run()
{
// We need an instatance of EventDispatcher class to attach handlers to
// events. So get it.
$dispatcher = \Mibew\EventDispatcher::getInstance();
// There are a lot of events. Use a few of them to show how they work.
$dispatcher->attachListener('pageAddCSS', $this, 'addCustomCss');
$dispatcher->attachListener('visitorTrack', $this, 'inviteVisitor');
}
/**
* Just attaches custom CSS file to every page that support it (chat windows
* and users waiting screen).
*
* @param array $args Associative array of arguments passed in to event
* handler. The list of arguments can vary for different events. See an
* event description to know which arguments are available and how they
* should be used.
*/
public function addCustomCss(&$args)
{
$args['css'][] = MIBEW_WEB_ROOT . '/' . $this->getFilesPath() . '/css/styles.css';
}
/**
* Automatically invites visitor to the chat.
*
* @param array $args Event data
*/
public function inviteVisitor($args)
{
$visitor = $args['visitor'];
$visitor_id = $visitor['visitorid'];
$invitation_state = invitation_state($visitor_id);
$spent_on_site = (time() - $visitor['firsttime']);
$was_invited = $visitor['invitations'] > 0;
$anybody_online = has_online_operators();
$send_invitation = !$invitation_state['invited']
&& !$was_invited
&& $spent_on_site > 5*60
&& $anybody_online;
// Check if the visitor should be invited to chat
if ($send_invitation) {
// Send invitation to chat from the fist Mibew user (the admin).
$operator = operator_by_id(1);
invitation_invite($visitor_id, $operator);
}
}
/**
* Also we can add dependencies. But make sure that they were loaded BEFORE
* current plugin in config.php
*
* If the plugin depends, for example, on "Abc:BestFeature" and "Xyz:Logger"
* we need to return the following array:
* <code>
* return array(
* 'Abc:BestFeature',
* 'Xyz:Logger',
* );
* </code>
*/
public static function getDependencies()
{
// This plugin does not depend on others so return an empty array.
return array();
}
}