summaryrefslogtreecommitdiff
path: root/plugins/Irc/extlib/phergie/Phergie/Plugin/Serve.php
blob: cdb8f7f9198115b070c9243e330ff9e9c544f816 (plain)
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
160
<?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
        if ($this->plugins->hasPlugin('Censor')) {
            $plugin = $this->plugins->getPlugin('Censor');
            $attempts = 0;
            while ($censor && $attempts < 3) {
                $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);
    }
}