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
151
152
153
154
155
156
157
158
159
|
<?php
/**
* Phergie
*
* PHP version 5
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.
* It is also available through the world-wide-web at this URL:
* http://phergie.org/license
*
* @category Phergie
* @package Phergie_Plugin_Serve
* @author Phergie Development Team <team@phergie.org>
* @copyright 2008-2010 Phergie Development Team (http://phergie.org)
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie_Plugin_Serve
*/
/**
* Processes requests to serve a user something from a database.
*
* @category Phergie
* @package Phergie_Plugin_Serve
* @author Phergie Development Team <team@phergie.org>
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie_Plugin_Serve
* @uses extension pdo
* @uses extension pdo_sqlite
*/
class Phergie_Plugin_Serve extends Phergie_Plugin_Abstract
{
/**
* Checks for dependencies.
*
* @return void
*/
public function onLoad()
{
if (!extension_loaded('PDO') || !extension_loaded('pdo_sqlite')) {
$this->fail('PDO and pdo_sqlite extensions must be installed');
}
}
/**
* Retrieves a random item from the database table.
*
* @param string $database Path to the SQLite database file
* @param string $table Name of the database table
* @param array $request Parsed request
*
* @return object Retrieved item
*/
protected function getItem($database, $table, array $request)
{
$db = new PDO('sqlite:' . $database);
if (!empty($request['suggestion'])) {
$query = 'SELECT * FROM ' . $table . ' WHERE name LIKE ? ORDER BY RANDOM() LIMIT 1';
$stmt = $db->prepare($query);
$stmt->execute(array('%' . $request['suggestion'] . '%'));
$item = $stmt->fetchObject();
if (!$item) {
$item = new stdClass;
$item->name = $request['suggestion'];
$item->link = null;
}
} else {
$query = 'SELECT * FROM ' . $table . ' ORDER BY RANDOM() LIMIT 1';
$stmt = $db->query($query);
$item = $stmt->fetchObject();
}
return $item;
}
/**
* Processes a request to serve a user something.
*
* @param string $database Path to the SQLite database file
* @param string $table Name of the database table
* @param string $format Format of the response where %target%,
* %item%, %article%', and %link will be replaced with their
* respective data
* @param string $request Request string including the target and an
* optional suggestion of the item to fetch
* @param boolean $censor TRUE to integrate with the Censor plugin,
* defaults to FALSE
*
* @return boolean TRUE if the request was processed successfully, FALSE
* otherwise
*/
public function serve($database, $table, $format, $request, $censor = false)
{
// Parse the request
$result = preg_match(
'/(?P<target>[^\s]+)(\s+an?\s+)?(?P<suggestion>.*)?/',
$request,
$match
);
if (!$result) {
return false;
}
// Resolve the target
$target = $match['target'];
if ($target == 'me') {
$target = $this->event->getNick();
}
// Process the request
$item = $this->getItem($database, $table, $match);
// Reprocess the request for censorship if required
$attempts = 0;
while ($censor && $attempts < 3) {
$plugin = $this->plugins->getPlugin('Censor');
$clean = $plugin->cleanString($item->name);
if ($item->name != $clean) {
$attempts++;
$item = $this->getItem($database, $table, $match);
} else {
$censor = false;
}
}
if ($censor && $attempts == 3) {
$this->doAction($this->event->getSource(), 'shrugs.');
}
// Derive the proper article for the item
if (preg_match('/^[aeiou]/i', $item->name)) {
$article = 'an';
} else {
$article = 'a';
}
// Format the message
$replacements = array(
'target' => $target,
'item' => $item->name,
'link' => $item->link,
'article' => $article
);
$msg = $format;
foreach ($replacements as $placeholder => $value) {
$msg = str_replace(
'%' . $placeholder . '%',
$value,
$msg
);
}
// Send the message
$this->doAction($this->event->getSource(), $msg);
}
}
|