source: branches/1.2/content/plugins/messaging/messaging.php @ 1266

Revision 1266, 17.3 KB checked in by nick_ramsay, 3 years ago (diff)

[Branch 1.2] Messaging 0.4 Fix for empty inbox and outbox.

Line 
1<?php
2/**
3 * name: Messaging
4 * description: Enable users to send private messages to each other
5 * version: 0.4
6 * folder: messaging
7 * class: Messaging
8 * requires: users 1.5
9 * hooks: install_plugin, theme_index_top, header_include, profile_navigation, breadcrumbs, theme_index_main, admin_maintenance_database, admin_maintenance_top, user_settings_pre_save, user_settings_fill_form, user_settings_extra_settings, userauth_checkcookie_success, hotaru_announcements, smart_cache_sql
10 * author: Nick Ramsay
11 * authorurl: http://hotarucms.org/member.php?1-Nick
12 */
13
14class Messaging
15{
16    /**
17     * Default settings on install
18     */
19    public function install_plugin($h)
20    {
21         // Create a new empty table called "messaging"
22        $exists = $h->db->table_exists('messaging');
23        if (!$exists) {
24            //echo "table doesn't exist. Stopping before creation."; exit;
25            $sql = "CREATE TABLE `" . DB_PREFIX . "messaging` (
26              `message_id` int(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
27              `message_updatedts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
28              `message_archived` enum('Y','N') NOT NULL DEFAULT 'N',
29              `message_from` int(20) NOT NULL DEFAULT 0,
30              `message_to` int(20) NOT NULL DEFAULT 0,
31              `message_date` timestamp NOT NULL,
32              `message_subject` varchar(255) NOT NULL DEFAULT '',
33              `message_content` text NULL,
34              `message_read` tinyint(1) NOT NULL DEFAULT '0',
35              `message_inbox` tinyint(1) NOT NULL DEFAULT '1',
36              `message_outbox` tinyint(1) NOT NULL DEFAULT '1',
37              `message_updateby` int(20) NOT NULL DEFAULT 0
38            ) ENGINE=" . DB_ENGINE . " DEFAULT CHARSET=" . DB_CHARSET . " COLLATE=" . DB_COLLATE . " COMMENT='Messaging';";
39            $h->db->query($sql);
40        }
41       
42        // Permissions
43        $site_perms = $h->getDefaultPermissions('all');
44        if (!isset($site_perms['can_do_messaging'])) {
45            $perms['options']['can_do_messaging'] = array('yes', 'no');
46            $perms['can_do_messaging']['admin'] = 'yes';
47            $perms['can_do_messaging']['supermod'] = 'yes';
48            $perms['can_do_messaging']['moderator'] = 'yes';
49            $perms['can_do_messaging']['member'] = 'yes';
50            $perms['can_do_messaging']['undermod'] = 'yes';
51            $perms['can_do_messaging']['default'] = 'no';
52            $h->updateDefaultPermissions($perms);
53        }
54       
55        // Add "pm notify" option to the default user settings
56        $base_settings = $h->getDefaultSettings('base'); // originals from plugins
57        $site_settings = $h->getDefaultSettings('site'); // site defaults updated by admin
58        if (!isset($base_settings['pm_notify'])) {
59            $base_settings['pm_notify'] = "checked";
60            $site_settings['pm_notify'] = "checked";
61            $h->updateDefaultSettings($base_settings, 'base');
62            $h->updateDefaultSettings($site_settings, 'site');
63        }
64    }
65   
66   
67    /**
68     * Determine page and get user details
69     */
70    public function theme_index_top($h)
71    {
72        if ($h->currentUser->getPermission('can_do_messaging') == 'no') { return false; }
73
74        $messaging = false;
75       
76        $user = $h->cage->get->testUsername('user');
77        if (!$user) { $user = $h->currentUser->name; }
78       
79        switch ($h->pageName)
80        {
81            case 'inbox':
82                $messaging = true;
83                $h->pageTitle = $h->lang['messaging_inbox'] . "[delimiter]" . $user;
84                break;
85            case 'outbox':
86                $messaging = true;
87                $h->pageTitle = $h->lang['messaging_outbox'] . "[delimiter]" . $user;
88                break;
89            case 'compose':
90                $messaging = true;
91                $h->pageTitle = $h->lang['messaging_compose'] . "[delimiter]" . $user;
92            case 'show_message':
93                $messaging = true;
94                $h->pageTitle = $h->lang['messaging_view_message'] . "[delimiter]" . $user;
95        }
96       
97        // set page types & create UserAuth and MessagingFuncs objects
98        if ($messaging) {
99            $h->pageType = 'user';  // this setting hides the posts filter bar
100            $h->subPage = 'user';
101           
102            include_once(PLUGINS . 'messaging/libs/MessagingFuncs.php');
103            $msgFuncs = new MessagingFuncs();
104           
105            // create a user object and fill it with user info (user being viewed)
106            $h->vars['user'] = new UserAuth();
107            $h->vars['user']->getUserBasic($h, 0, $user);
108           
109            //defaults:
110            $h->vars['message_to'] = '';
111            $h->vars['message_from'] = '';
112            $h->vars['message_subject'] = '';
113            $h->vars['message_body'] = '';
114            $h->vars['message_reply'] = false;
115            $h->vars['message_id'] = 0;
116        }
117       
118        switch ($h->pageName)
119        {
120            case 'inbox':
121
122                // see if we need to delete any messages:
123                if ($h->cage->post->keyExists('delete_selected') && $h->cage->post->keyExists('message')) {
124                    foreach ($h->cage->post->keyExists('message') as $id => $checked) {
125                        // delete checked message
126                        $msgFuncs->deleteMessage($h, $id, 'inbox');
127                    }
128                }
129                $count = $msgFuncs->getBoxCount($h, 'inbox');
130                $query = $msgFuncs->getBoxQuery($h, 'inbox');
131                $h->vars['messages_list'] = $h->pagination($query, $count, 20);
132                break;
133               
134            case 'outbox':
135               
136                // see if we need to delete any messages:
137                if ($h->cage->post->keyExists('delete_selected') && $h->cage->post->keyExists('message')) {
138                    foreach ($h->cage->post->keyExists('message') as $id => $checked) {
139                        // delete checked message
140                        $msgFuncs->deleteMessage($h, $id, 'outbox');
141                    }
142                }
143               
144                $count = $msgFuncs->getBoxCount($h, 'outbox');
145                $query = $msgFuncs->getBoxQuery($h, 'outbox');
146                $h->vars['messages_list'] = $h->pagination($query, $count, 20);
147                break;
148               
149            case 'compose':
150               
151                // when clicking "Send Message"...
152                $h->vars['message_to'] = $h->cage->get->testUsername('message_to');
153               
154                // SENDING A NEW MESSAGE
155                if ($h->cage->get->testAlpha('action') == 'send')
156                {
157                    // check CSRF key
158                    if (!$h->csrf()) {
159                        $h->messages[$h->lang['error_csrf']] = 'red';
160                        return false;
161                    }
162           
163                    // get submitted data
164                    if (!$h->vars['message_to']) {
165                        $h->vars['message_to'] = $h->cage->post->testUsername('message_to');
166                    }
167                    $h->vars['message_subject'] = $h->cage->post->getHtmLawed('message_subject');
168                    $h->vars['message_body'] = $h->cage->post->getHtmLawed('message_body');
169                   
170                    // Create and fill MessagingFuncs object
171                    $msgFuncs->to = $h->vars['message_to'];
172                    $msgFuncs->from = $h->currentUser->name;
173                    $msgFuncs->subject = $h->vars['message_subject'];
174                    $msgFuncs->body = $h->vars['message_body'];
175                   
176                    // Attempt to send the message
177                    $result = $msgFuncs->sendMessage($h);
178                    if ($result) {
179                        $h->messages[$h->lang['messaging_sent']] = 'green';
180                    } else {
181                        foreach ($msgFuncs->errors as $err) {
182                            $error_message = "messaging_" . $err;
183                            if (isset($h->lang[$error_message])) {
184                                $h->messages[$h->lang[$error_message]] = 'red';
185                            }
186                        }
187                    }
188                }
189               
190                // REPLYING TO A MESSAGE
191                elseif ($h->cage->get->testInt('reply'))
192                {
193                    $h->vars['message_id'] = $h->cage->get->testInt('reply');
194                    $original_message = $msgFuncs->getMessage($h, $h->vars['message_id']);
195                   
196                    if (!$original_message) { return false; }
197                    $h->vars['message_to'] = $h->getUserNameFromId($original_message->message_from);
198                    $h->vars['message_subject'] = urldecode($original_message->message_subject);
199                    $h->vars['message_body'] = "";
200                    $h->vars['message_reply'] = true;
201                   
202                    // mark this message as read
203                    $msgFuncs->markRead($h, $h->vars['message_id']);
204                }
205                break;
206               
207            case 'show_message':
208               
209                $h->vars['message_id'] = $h->cage->get->testInt('id');
210                $original_message = $msgFuncs->getMessage($h, $h->vars['message_id']);
211               
212                if (!$original_message) { $h->vars['message_id'] = 0; return false; }
213                                $h->vars['message_to_id'] = $original_message->message_to;
214                $h->vars['message_from_name'] = $h->getUserNameFromId($original_message->message_from);
215                $h->vars['message_from_id'] = $original_message->message_from;
216                $h->vars['message_date'] = $original_message->message_date;
217                $h->vars['message_subject'] = sanitize(urldecode($original_message->message_subject), 'all');
218                $h->vars['message_body'] = sanitize(urldecode($original_message->message_content), 'all');
219               
220                // mark this message as read
221                $msgFuncs->markRead($h, $h->vars['message_id']);
222        }
223    }
224   
225   
226    /**
227     * Profile menu link on other people's profiles for sending a message
228     */
229    public function profile_navigation($h)
230    {
231        if ($h->currentUser->getPermission('can_do_messaging') == 'no') { return false; }
232       
233        if ($h->currentUser->name != $h->vars['user']->name) {
234            echo "<li><a href='" . $h->url(array('page'=>'compose', 'user'=>$h->currentUser->name, 'message_to'=>$h->vars['user']->name)) . "'>" . $h->lang['messaging_send_message'] . "</a></li>\n";
235        } else {
236            echo "<li><a href='" . $h->url(array('page'=>'inbox', 'user'=>$h->vars['user']->name)) . "'>" . $h->lang['messaging_inbox'] . "</a></li>\n";
237            echo "<li><a href='" . $h->url(array('page'=>'outbox', 'user'=>$h->vars['user']->name)) . "'>" . $h->lang['messaging_outbox'] . "</a></li>\n";
238            echo "<li><a href='" . $h->url(array('page'=>'compose', 'user'=>$h->vars['user']->name)) . "'>" . $h->lang['messaging_compose'] . "</a></li>\n";
239        }
240    }
241   
242   
243    /**
244     * Breadcrumbs for messaging pages
245     */
246    public function breadcrumbs($h)
247    {
248        $user = $h->cage->get->testUsername('user');
249        if (!$user) { $user = $h->currentUser->name; }
250       
251        switch ($h->pageName)
252        {
253            case 'inbox':
254                return "<a href='" . $h->url(array('user'=>$user)) . "'>" . $user . "</a> &raquo; " . $h->lang['messaging_inbox'];
255                break;
256            case 'outbox':
257                return "<a href='" . $h->url(array('user'=>$user)) . "'>" . $user . "</a> &raquo; " . $h->lang['messaging_outbox'];
258                break;
259            case 'compose':
260                return "<a href='" . $h->url(array('user'=>$user)) . "'>" . $user . "</a> &raquo; " . $h->lang['messaging_compose'];
261                break;
262            case 'show_message':
263                return "<a href='" . $h->url(array('user'=>$user)) . "'>" . $user . "</a> &raquo; " . $h->lang['messaging_view_message'];
264                break;
265        }
266    }
267   
268   
269    /**
270     * Display pages
271     */
272    public function theme_index_main($h)
273    {
274        if (isset($h->vars['user']->id) && ($h->currentUser->id != $h->vars['user']->id)) { return false; }
275           
276        switch ($h->pageName)
277        {
278            case 'inbox':
279                $h->displayTemplate('messaging_inbox');
280                return true;
281                break;
282            case 'outbox':
283                $h->displayTemplate('messaging_outbox');
284                return true;
285                break;
286            case 'compose':
287                $h->displayTemplate('messaging_compose');
288                return true;
289                break;
290            case 'show_message':
291                if (!$h->vars['message_id']) { return false; }
292                $h->displayTemplate('messaging_show_message');
293                return true;
294                break;
295        }
296    }
297   
298   
299    /**
300     * Clear deleted messages on Maintenance page
301     */
302    public function admin_maintenance_database($h)
303    {
304        echo "<li><a href='" . BASEURL . "admin_index.php?page=maintenance&amp;action=clear_messages'>";
305        echo $h->lang["messaging_maintenance_clear_messages"] . "</a> - ";
306        echo $h->lang["messaging_maintenance_clear_messages_desc"];
307        echo "</li>";
308    }
309   
310   
311    /**
312     * Delete messages that are no longer shown in either inbox or outbox
313     */
314    public function admin_maintenance_top($h)
315    {
316        if (($h->pageName == 'maintenance') && ($h->cage->get->testAlnumLines('action') == 'clear_messages')) {
317            $sql = "DELETE FROM " . DB_PREFIX . "messaging WHERE message_inbox = %d AND message_outbox = %d";
318            $h->db->query($h->db->prepare($sql, 0, 0));
319           
320            // optimize the table
321            $h->db->query("OPTIMIZE TABLE " . DB_PREFIX . "messaging");
322           
323            $h->message = $h->lang['messaging_maintenance_table_cleaned'];
324            $h->messageType = 'green';
325            $h->showMessage();
326            return true;
327        }
328    }
329   
330   
331    /**
332     * User Settings - before saving
333     */
334    public function user_settings_pre_save($h)
335    {
336        if ($h->currentUser->getPermission('can_do_messaging') == 'no') { return false; }
337       
338        // Email notification of private messages:
339        if ($h->cage->post->getAlpha('pm_notify') == 'yes') {
340            $h->vars['settings']['pm_notify'] = "checked";
341        } else {
342            $h->vars['settings']['pm_notify'] = "";
343        }
344    }
345   
346   
347    /**
348     * User Settings - fill the form
349     */
350    public function user_settings_fill_form($h)
351    {
352        if ($h->currentUser->getPermission('can_do_messaging') == 'no') { return false; }
353
354        if (!isset($h->vars['settings']) || !$h->vars['settings']) { return false; }
355       
356        if ($h->vars['settings']['pm_notify']) {
357            $h->vars['pm_notify_yes'] = "checked";
358            $h->vars['pm_notify_no'] = "";
359        } else {
360            $h->vars['pm_notify_yes'] = "";
361            $h->vars['pm_notify_no'] = "checked";
362        }
363    }
364   
365   
366    /**
367     * User Settings - html for form
368     */
369    public function user_settings_extra_settings($h)
370    {
371        if ($h->currentUser->getPermission('can_do_messaging') == 'no') { return false; }
372
373        if (!isset($h->vars['settings']) || !$h->vars['settings']) { return false; }
374       
375        echo "<tr>\n";
376            // Allow email notification of private messages?
377        echo "<td>" . $h->lang['users_settings_pm_notification_by_email'] . "</td>\n";
378        echo "<td><input type='radio' name='pm_notify' value='yes' " . $h->vars['pm_notify_yes'] . "> " . $h->lang['users_settings_yes'] . " &nbsp;&nbsp;\n";
379        echo "<input type='radio' name='pm_notify' value='no' " . $h->vars['pm_notify_no'] . "> " . $h->lang['users_settings_no'] . "</td>\n";
380        echo "</tr>\n";
381    }
382   
383   
384    /**
385     * Check for waiting messages
386     */
387    public function userauth_checkcookie_success($h)
388    {
389        if ($h->currentUser->getPermission('can_do_messaging') == 'no') { return false; }
390       
391        $sql = "SELECT count(*) FROM " . DB_PREFIX . "messaging WHERE message_archived = %s AND message_to = %d AND message_read = %d AND message_inbox = %d";
392        $query = $h->db->prepare($sql, 'N', $h->currentUser->id, 0, 1);
393
394        $h->smartCache('on', 'messaging', 10, $query); // start using cache
395        $h->vars['messages_waiting'] = $h->db->get_var($query);
396        $h->smartCache('off'); // stop using cache 
397    }
398   
399   
400    /**
401     * Show "You have unread messages in your inbox!" as an announcement
402     */
403    public function hotaru_announcements($h)
404    {
405        if ($h->currentUser->getPermission('can_do_messaging') == 'no') { return false; }
406
407        if (isset($h->vars['messages_waiting']) && $h->vars['messages_waiting'] > 0) {
408            $inbox_link = "<a href='" . $h->url(array('page'=>'inbox', 'user'=>$h->currentUser->name)) . "'>";
409            $inbox_link .= $h->lang['messaging_unread_messages_announcement'] . "</a>";
410            array_push($h->vars['hotaru_announcements'], $inbox_link);
411        }
412    }
413   
414   
415    /**
416     * Check for updates to the messages table
417     */
418    public function smart_cache_sql($h)
419    {
420        $h->vars['smart_cache_sql'] = "SELECT message_updatedts FROM " . DB_PREFIX . "messaging ORDER BY message_updatedts DESC";
421    }
422}
423?>
Note: See TracBrowser for help on using the repository browser.