5 * Implementation of hook_help().
7 function privatemsg_help($section) {
9 case
'admin/modules#description':
10 return t('Allows private messages between users.');
15 * Implementation of hook_link().
17 function privatemsg_link($type, $arg) {
18 if (user_access('access private messages')) {
21 if (variable_get('privatemsg_link_node', 0)) return array(l(t('write to author'), "privatemsg/msgto/$arg->uid"));
24 if (variable_get('privatemsg_link_comment', 0)) return array(l(t('write to author'), "privatemsg/msgto/$arg->uid"));
31 * Implementation of hook_menu().
33 function privatemsg_menu($may_cache) {
37 $items[] = array('path' => 'privatemsg',
38 'title' => t('view inbox') .
' ('.
(int)_privatemsg_get_new_messages() .
')',
39 'callback' => 'privatemsg_page',
40 'access' => user_access('access private messages'),
41 'type' => MENU_DYNAMIC_ITEM
);
47 * Implementation of hook_user().
49 function privatemsg_user($type, $edit, &$user, $category) {
50 if (user_access('access private messages')) {
53 return array(t('Private messages') => form_item('', l(t('send private message'), "privatemsg/msgto/$user->uid")));
55 if (!$edit['privatemsg_mailalert']) {
56 $edit['privatemsg_mailalert'] = 0;
60 if ($category == 'account') {
61 return array(array('title' => t('Private message settings'), 'data' => form_checkbox(t('Receive daily e-mail for unread messages'), 'privatemsg_mailalert', 1, $user->privatemsg_mailalert
, t('Check this box to receive e-mail notification for unread messages. Only one e-mail will be sent per day.'))));
68 * Implementation of hook_settings().
70 function privatemsg_settings() {
71 $rate = drupal_map_assoc(array(5, 10, 15, 20, 30, 60), 'format_interval');
72 $output .
= form_select(t('Private messaging max rate'), 'privatemsg_max_rate', variable_get('privatemsg_max_rate', 15), $rate, t('Max submit rate for private messaging. To prevent abuse.'));
73 $output .
= form_select(t('Sent message status'), 'privatemsg_sent_status', variable_get('privatemsg_sent_status', 1), array(t('Disabled'), t('Enabled')), t('If enabled users can see whether a message has been read or not.'));
74 $number = drupal_map_assoc(array(5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100));
75 $output .
= form_select(t('Messages per page'), 'privatemsg_per_page', variable_get('privatemsg_per_page', 10), $number, t('The maximum number of messages displayed per page; links to browse messages automatically appear.'));
77 $group = form_checkbox(t('Display link with posts'), 'privatemsg_link_node', 1, variable_get('privatemsg_link_node', 0), t('Provide a link to send private messages to users with posts they start.'));
78 $group .
= form_checkbox(t('Display link with comments'), 'privatemsg_link_comment', 1, variable_get('privatemsg_link_comment', 0), t('Provide a link to send private messages to users with their comments.'));
79 $output .
= form_group(t('"Write to author" links'), $group);
85 * Implementation of hook_perm().
87 function privatemsg_perm() {
88 return array('access private messages');
92 * Implementation of hook_cron().
94 function privatemsg_cron() {
95 // perform these actions just once per day
96 if (variable_get('privatemsg_last_cron', 0) < (time() - 3600*24)) {
98 _privatemsg_mailalert();
99 variable_set('privatemsg_last_cron', time());
103 function _privatemsg_prune() {
104 // move deleted message older than 1 month to archive table, and optimize table
105 $result = db_query("SELECT * FROM {privatemsg} WHERE author_del = 1 AND recipient_del = 1 AND timestamp < '%d'", (time() - 3600*24*30));
106 while ($message = db_fetch_object($result)) {
107 db_query("INSERT INTO {privatemsg_archive} (id, author, recipient, subject, message, timestamp, hostname, folder) VALUES ('%d', '%d', '%d', '%s', '%s', '%d', '%s', '%d')", $message->id
, $message->author
, $message->recipient
, $message->subject
, $message->message
, $message->timestamp
, $message->hostname
, $message->folder
);
108 db_query("DELETE FROM {privatemsg} WHERE id = '%d'", $message->id
);
111 // this is MySQL-specific
112 if ($GLOBALS['db_type'] == 'mysql') {
113 db_query("OPTIMIZE TABLE {privatemsg}");
117 function _privatemsg_mailalert() {
118 $result = db_query("SELECT COUNT(*) AS c, recipient FROM {privatemsg} WHERE new = 1 AND recipient_del = 0 GROUP BY recipient");
120 while ($alert = db_fetch_object($result)) {
121 $user = user_load(array("uid" => $alert->recipient
));
122 if ($user->privatemsg_mailalert
) {
123 user_mail($user->mail,
124 t('You have unread messages'),
125 t("Hi %name,\nthis is an automatic reminder from the site %site. You have %new unread private messages.\n\nTo read your messages, follow this link:\n%link1\n\nIf you don't want to receive these email again, change your preferences here:\n%link2\n\n",
126 array('%name' => $user->name
, '%site' => variable_get('site_name', 'drupal'), '%new' => $alert->c
, '%link1' => url('privatemsg', NULL
, NULL
, 1), '%link2' => url('user/'.
$user->uid .
'/edit'))),
127 t('New private messages at %site.', array('%site' => variable_get('site_name', 'drupal'))));
132 function privatemsg_page() {
137 $edit = $_POST["edit"];
138 $recipient = $_POST["recipient"];
139 $msg = $_POST["msg"];
148 $output = _privatemsg_list($arg);
149 $title = t('Private messages');
152 $output = _privatemsg_view($arg);
153 $title = t("Read message");
154 $breadcrumb = array(l(t('Home'), ''), l('Private messages', 'privatemsg'));
156 case
t("Write a new message"):
160 $output = _privatemsg_form($arg);
161 $title = t("Write a new message");
162 $breadcrumb = array(l(t('Home'), ''), l('Private messages', 'privatemsg'));
165 $msg->name
= db_result(db_query("SELECT name FROM {users} WHERE uid = '%d'", $arg));
166 $output = _privatemsg_form($msg);
167 $title = t("Write a new message");
168 $breadcrumb = array(l(t('Home'), ''), l('Private messages', 'privatemsg'));
171 case
t("Send private message"):
172 if (!$edit["recipient"]) {
173 $edit["recipient"] = $recipient;
175 $breadcrumb = array(l(t('Home'), ''), l('Private messages', 'privatemsg'));
176 $output = _privatemsg_edit($edit);
178 case
t("Move to folder"):
179 if ($edit["folder"] == 0 || db_result(db_query("SELECT fid FROM {privatemsg_folder} WHERE fid = '%d' AND uid = '%d'", $edit["folder"], $user->uid
))) {
180 // this folder belongs to him
182 foreach ($msg as
$mid) {
183 _privatemsg_move($mid, $edit["folder"]);
185 $output = _privatemsg_list($edit["folder"]);
190 $output = _privatemsg_list();
192 case
t("Delete messages"):
194 foreach ($msg as
$id) {
195 _privatemsg_delete($id);
198 $output = _privatemsg_list();
202 _privatemsg_delete($arg);
203 $output = _privatemsg_list();
206 case
t("New folder"):
207 case
t("Add folder"):
209 // check for uniqueness
210 if (!db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE name = '%s' AND uid = '%d'", $edit["name"], $user->uid
))) {
211 db_query("INSERT INTO {privatemsg_folder} (uid, name) VALUES ('%d', '%s')", $user->uid
, $edit["name"]);
213 $output = _privatemsg_list();
216 $title = t('Create new folder');
217 $breadcrumb = array(l(t('Home'), ''), l('Private messages', 'privatemsg'));
218 $output = _privatemsg_new_folder($edit);
222 case
t("Delete folder");
224 if (db_result(db_query("SELECT fid FROM {privatemsg_folder} WHERE fid = '%d' AND uid = '%d'", $edit["current_folder"], $user->uid
))) {
225 db_query("DELETE FROM {privatemsg_folder} WHERE fid = '%d'", $edit["current_folder"]);
226 db_query("UPDATE {privatemsg} SET recipient_del = 1 WHERE folder = '%d'", $edit["current_folder"]);
229 $output = _privatemsg_list();
231 case
t("Empty folder");
232 $fid = $edit["current_folder"];
235 db_query("UPDATE {privatemsg} SET author_del = 1 WHERE author = '%d'", $user->uid
);
237 else if ($fid == 0 || db_result(db_query("SELECT fid FROM {privatemsg_folder} WHERE fid = '%d' AND uid = '%d'", $fid, $user->uid
))) {
239 db_query("UPDATE {privatemsg} SET recipient_del = 1 WHERE folder = '%d' AND recipient = '%d'", $edit["current_folder"], $user->uid
);
242 $output = _privatemsg_list();
245 $output = _privatemsg_list();
246 $title = t('Private messages');
250 print theme('page', $output, $title, $breadcrumb);
254 function _privatemsg_list($current_folder = 0) {
257 if ($current_folder != 1) {
258 $result = pager_query("SELECT id, subject, p.timestamp, u.uid, u.name, new FROM {privatemsg} p, {users} u WHERE p.author = u.uid AND p.recipient = $user->uid AND folder = '".
addslashes($current_folder).
"' AND p.recipient_del = 0 ORDER BY p.timestamp DESC", variable_get("privatemsg_per_page", 10));
260 if ($current_folder > 0) {
261 $folder_name = db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE fid = '%d' AND uid = '$user->uid'", $current_folder));
264 $folder_name = t("Inbox");
269 $result = pager_query("SELECT id, subject, p.timestamp, u.uid, u.name, new FROM {privatemsg} p, {users} u WHERE p.recipient = u.uid AND p.author = $user->uid AND p.author_del = 0 ORDER BY p.timestamp DESC", variable_get("privatemsg_per_page", 10));
271 $folder_name = t("Sent messages");
275 while ($message = db_fetch_object($result)) {
276 $messages[] = $message;
279 $folders[] = array(0, t("Inbox"));
280 $result = db_query("SELECT fid, name FROM {privatemsg_folder} WHERE uid = '$user->uid'");
281 while ($folder = db_fetch_object($result)) {
282 $folders[] = array($folder->fid
, $folder->name
);
284 $folders[] = array(1, t("Sent messages"));
286 return theme("privatemsg_list", $current_folder, $messages, $folders);
289 function _privatemsg_format_folder($current, $fid, $name) {
290 if ($current == $fid) {
291 return "<b>$name</b>";
294 return l($name, "privatemsg/list/$fid");
298 function _privatemsg_form($message = 0) {
302 if (!is_object($message)) {
303 $message = db_fetch_object(db_query("SELECT subject, message, u.name FROM {privatemsg} p, {users} u WHERE u.uid = p.author AND id = '%d' AND recipient = '%d'", $message, $user->uid
));
305 if (!stristr($message->subject
, t("Re:"))) {
306 $message->subject
= t("Re:").
' '.
$message->subject
;
310 $message->message
= "\n".
str_replace ("\n", "\n> ", "\n".
$message->message
);
314 $to .
= "<input type='text' name='recipient' value='".
htmlentities($message->name
, ENT_QUOTES
).
"' maxlength='64' size='50'>";
316 if (!$message->name
) {
317 $to .
= ' <select name="quick" onChange="recipient.value=quick.value"><option value="--'.
t("contacts").
'--" selected="selected">--'.
t("contacts").
'--</option>';
318 $result = db_query("SELECT DISTINCT(name) AS name FROM {privatemsg} p, {users} u WHERE p.author = u.uid AND recipient = '%d' AND p.timestamp > (UNIX_TIMESTAMP(NOW()) - (3600 * 24 * 30)) ORDER BY name", $user->uid
);
319 while ($name = db_fetch_object($result)) {
320 $name = htmlentities($name->name
);
321 $to .
= "<option value='$name'>$name</option>";
326 $form .
= form_item(t("To"), $to);
328 $form .
= form_textfield(t("Subject"), "subject", $message->subject
, 50, 64);
329 $form .
= form_textarea(t("Message"), "message", $message->message
, 80, 5);
330 $form .
= form_submit(t("Send private message"));
335 function _privatemsg_edit($edit) {
337 $recipient = db_result(db_query("SELECT uid FROM {users} WHERE name = '%s'", $edit["recipient"]));
339 if (!$edit["recipient"] || !$edit["subject"] || !$edit["message"]) {
340 drupal_set_message(t('Warning: every field required'), 'error');
341 return _privatemsg_form(array2object($edit));
343 elseif ($recipient == $user->uid
) {
344 drupal_set_message(t('A message to yourself?'), 'error');
345 return _privatemsg_form(array2object($edit));
349 $result = db_query("INSERT INTO {privatemsg} (author, recipient, subject, message, timestamp, new, hostname) VALUES ('%d', '%d', '%s', '%s', '%d', '%d', '%s')", $user->uid
, $recipient, strip_tags($edit['subject']), strip_tags($edit['message']), time(), 1, getenv("REMOTE_ADDR"));
350 drupal_set_message(t('Message sent.'));
351 return _privatemsg_list();
354 drupal_set_message(t('Warning: user does not exist'), 'error');
355 return _privatemsg_form(array2object($edit));
360 function _privatemsg_view($message_id) {
363 $result = db_query("SELECT p.id, u.uid, u.name, p.author, p.timestamp, p.subject, p.message, p.new, p.recipient FROM {privatemsg} p, {users} u WHERE (recipient = '%d' OR author = '%d') AND author = u.uid AND id = '%d'", $user->uid
, $user->uid
, $message_id);
365 $message = db_fetch_object($result);
366 if (($message->new
) && ($user->uid
!= $message->author
)) {
367 $result = db_query("UPDATE {privatemsg} SET new = 0 WHERE recipient = '$user->uid' AND id = '%d'", $message_id);
370 return theme("privatemsg_view", $message);
373 function _privatemsg_delete($id) {
376 $result = db_query("SELECT author, recipient FROM {privatemsg} WHERE (recipient = '$user->uid' OR author = '$user->uid') AND id = '%d'", $id);
378 if ($message = db_fetch_object($result)) {
379 if ($message->author
== $user->uid
) {
380 db_query("UPDATE {privatemsg} SET author_del = 1 WHERE id = '%d'", $id);
382 else if ($message->recipient
== $user->uid
) {
383 db_query("UPDATE {privatemsg} SET recipient_del = 1 WHERE id = '%d'", $id);
393 function _privatemsg_get_new_messages($uid = 0) {
398 return db_result(db_query("SELECT COUNT(*) FROM {privatemsg} WHERE recipient = '%d' AND new = 1 AND recipient_del = 0", $uid));
401 function _privatemsg_new_folder($edit) {
402 $form = form_textfield(t("Name"), "name", "", 50, 64);
403 $form .
= form_submit(t("Add folder"));
408 function _privatemsg_move($mid, $fid) {
410 db_query("UPDATE {privatemsg} SET folder = '%d' WHERE id = '%d' AND recipient = '%d'", $fid, $mid, $user->uid
);
414 @addtogroup theme_system
416 Privatemsg module specific theme functions
421 Returns content to view a private message
425 function theme_privatemsg_view($message) {
430 <p><b>".
t("From").
":</b> ".
format_name($message).
"<br />
431 <b>".
t("To").
":</b> ".
format_name(user_load(array('uid' => $message->recipient
))).
"<br />
432 <b>".
t("Subject").
":</b> ".
strip_tags($message->subject
).
"<br />
433 <b>".
t("Date").
":</b> ".
format_date($message->timestamp
).
"</p>
434 ".
check_output($message->message
, 1);
436 if ($message->recipient
== $user->uid
) {
437 $links[] = l(t('Reply to this message'), "privatemsg/reply/$message->id");
439 if (($message->recipient
== $user->uid
) || (variable_get("privatemsg_sent_status", 1))) {
440 $links[] = l(t('Delete this message'), "privatemsg/delete/$message->id", array('onClick' => "return confirm('".
t('Are you sure to delete this message?').
"')"));
443 $links[] = l(t('List messages'), 'privatemsg');
444 $body .
= theme('links', $links);
446 drupal_set_message(t('Error: you can\'t read this message'), 'error');
454 Returns content to view a list of private messages
456 @param current_folder
460 function theme_privatemsg_list($current_folder, $messages, $folders) {
461 $extra_folders = array();
462 foreach ($folders as
$folder) {
463 $folder_list[] = _privatemsg_format_folder($current_folder, $folder[0], $folder[1]);
464 if ($folder[0] != 1 && $folder[0] != $current_folder) {
465 $extra_folders[$folder[0]] = $folder[1];
469 $out = theme('links', $folder_list);
472 foreach ($messages as
$message) {
474 $row[] = array('data' => '<input type="checkbox" name="msg[]" value="'.
$message->id .
'">');
475 if ($current_folder != 1) {
476 $new = $message->new
;
479 if (variable_get("privatemsg_sent_status", 1)) {
480 $new = $message->new
;
486 $row[] = array('data' => format_date($message->timestamp
, 'small'));
487 $row[] = array('data' => format_name($message));
488 $row[] = array('data' => l(strip_tags($message->subject
), 'privatemsg/view/'.
$message->id
) .
($new ?
(' '.
theme('mark')) : ''));
493 if (count($messages) < 1) {
494 $out .
= t('<p>No messages</p>');
499 array('data' => t('Date')),
500 array('data' => ($current_folder == 1 ?
t('To') : t('From'))),
501 array('data' => t('Subject')),
504 if ($pager = theme("pager_display", NULL
, variable_get("privatemsg_per_page", 10))) {
505 $rows[] = array(array('data' => $pager, 'colspan' => 5));
508 $out .
= theme('table', $header, $rows);
511 $out .
= '<hr />'.
form_submit(t("Write a new message"));
512 if (count($messages) > 0) {
513 $out .
= form_submit(t("Delete messages"), "op", array("onClick" => "return confirm('".
t("Are you sure you want to delete these messages?").
"')"));
517 if ((count($extra_folders) > 0) && ($current_folder != 1) && (count($messages) > 0)) {
518 $out .
= '<br /><select name="edit[folder]">';
519 foreach ($extra_folders as
$fid => $folder_name) {
520 $out .
= "<option value='$fid'>$folder_name</option>";
524 $out .
= form_submit(t("Move to folder"));
528 if ($current_folder > 1) {
529 // you can't delete Inbox
530 $out .
= form_submit(t("Delete folder"), "op", array("onClick" => "return confirm('".
t("Are you sure you want to delete this folder and all its messages?").
"')"));
532 if (count($messages) > 0) {
533 $out .
= form_submit(t("Empty folder"), "op", array("onClick" => "return confirm('".
t("Are you sure you want to delete every message in this folder?").
"')"));
535 $out .
= form_hidden("current_folder", $current_folder);
536 $out .
= form_submit(t("New folder"));
541 /** @} End of addtogroup theme_system **/