function send_reminders() { global $db, $fs, $proj; $notify =& new Notifications(); $user =& new User(0); $now = time(); $lang = $fs->prefs['lang_code']; $get_reminders = $db->Query("SELECT r.*, t.*, u.*\n FROM {reminders} r\n INNER JOIN {users} u ON u.user_id = r.to_user_id\n INNER JOIN {tasks} t ON r.task_id = t.task_id\n INNER JOIN {projects} p ON t.project_id = p.project_id\n WHERE t.is_closed = '0' AND r.start_time < ?\n AND r.last_sent + r.how_often < ?\n ORDER BY r.reminder_id", array(time(), time())); while ($row = $db->FetchRow($get_reminders)) { // So that the sender in emails will is the right project, not 'Default project' // and also to get the projects default language, if needed. $proj = new Project($row['project_id']); $jabber_users = array(); $email_users = array(); if (($fs->prefs['user_notify'] == 1 || $fs->prefs['user_notify'] == 2) && ($row['notify_type'] == 1 || $row['notify_type'] == 3)) { $email_users[] = $row['email_address']; } if (($fs->prefs['user_notify'] == 1 || $fs->prefs['user_notify'] == 3) && ($row['notify_type'] == 2 || $row['notify_type'] == 3)) { $jabber_users[] = $row['jabber_id']; } if (!empty($row['lang_code'])) { $lang = $row['lang_code']; } else { if (!empty($proj->prefs['lang_code'])) { $lang = $proj->prefs['lang_code']; } else { $lang = $fs->prefs['lang_code']; } } $subject = tL('notifyfromfs', $lang); $message = $row['reminder_message']; // Pass the recipients and message onto the notification function $notify->SendEmail($email_users, $subject, $message); $notify->StoreJabber($jabber_users, $subject, $message); // Update the database with the time sent $update_db = $db->Query("UPDATE {reminders}\n SET last_sent = ?\n WHERE reminder_id = ?", array(time(), $row['reminder_id'])); } // send those stored notifications $notify->SendJabber(); unset($notify, $user); }
function GenerateMsg($type, $task_id, $arg1 = '0', $lang) { global $db, $fs, $user, $proj; // Get the task details $task_details = Flyspray::getTaskDetails($task_id); if ($task_id) { $proj = new Project($task_details['project_id']); } // Set the due date correctly if ($task_details['due_date'] == '0') { $due_date = tL('undecided', $lang); } else { $due_date = formatDate($task_details['due_date']); } // Set the due version correctly if ($task_details['closedby_version'] == '0') { $task_details['due_in_version_name'] = tL('undecided', $lang); } // Get the string of modification $notify_type_msg = array(0 => tL('none'), NOTIFY_TASK_OPENED => tL('taskopened', $lang), NOTIFY_TASK_CHANGED => tL('pm.taskchanged', $lang), NOTIFY_TASK_CLOSED => tL('taskclosed', $lang), NOTIFY_TASK_REOPENED => tL('pm.taskreopened', $lang), NOTIFY_DEP_ADDED => tL('pm.depadded', $lang), NOTIFY_DEP_REMOVED => tL('pm.depremoved', $lang), NOTIFY_COMMENT_ADDED => tL('commentadded', $lang), NOTIFY_ATT_ADDED => tL('attachmentadded', $lang), NOTIFY_REL_ADDED => tL('relatedadded', $lang), NOTIFY_OWNERSHIP => tL('ownershiptaken', $lang), NOTIFY_PM_REQUEST => tL('pmrequest', $lang), NOTIFY_PM_DENY_REQUEST => tL('pmrequestdenied', $lang), NOTIFY_NEW_ASSIGNEE => tL('newassignee', $lang), NOTIFY_REV_DEP => tL('revdepadded', $lang), NOTIFY_REV_DEP_REMOVED => tL('revdepaddedremoved', $lang), NOTIFY_ADDED_ASSIGNEES => tL('assigneeadded', $lang)); // Generate the nofication message if (isset($proj->prefs['notify_subject']) && !$proj->prefs['notify_subject']) { $proj->prefs['notify_subject'] = '[%p][#%t] %s'; } if (!isset($proj->prefs['notify_subject']) || $type == NOTIFY_CONFIRMATION || $type == NOTIFY_ANON_TASK || $type == NOTIFY_PW_CHANGE || $type == NOTIFY_NEW_USER || $type == NOTIFY_OWN_REGISTRATION) { $subject = tL('notifyfromfs', $lang); } else { $subject = strtr($proj->prefs['notify_subject'], array('%p' => $proj->prefs['project_title'], '%s' => $task_details['item_summary'], '%t' => $task_id, '%a' => $notify_type_msg[$type], '%u' => $user->infos['user_name'])); } $subject = strtr($subject, "\n", ''); /* ------------------------------- | List of notification types: | | 1. Task opened | | 2. Task details changed | | 3. Task closed | | 4. Task re-opened | | 5. Dependency added | | 6. Dependency removed | | 7. Comment added | | 8. Attachment added | | 9. Related task added | |10. Taken ownership | |11. Confirmation code | |12. PM request | |13. PM denied request | |14. New assignee | |15. Reversed dep | |16. Reversed dep removed | |17. Added to assignees list | |18. Anon-task opened | |19. Password change | |20. New user | |21. User registration | ------------------------------- */ $body = tL('donotreply', $lang) . "\n\n"; $online = ''; // {{{ New task opened if ($type == NOTIFY_TASK_OPENED) { $body .= tL('newtaskopened', $lang) . " \n\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ") \n\n"; $body .= tL('attachedtoproject', $lang) . ' - ' . $task_details['project_title'] . "\n"; $body .= tL('summary', $lang) . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('tasktype', $lang) . ' - ' . $task_details['tasktype_name'] . "\n"; $body .= tL('category', $lang) . ' - ' . $task_details['category_name'] . "\n"; $body .= tL('status', $lang) . ' - ' . $task_details['status_name'] . "\n"; $body .= tL('assignedto', $lang) . ' - ' . implode(', ', $task_details['assigned_to_name']) . "\n"; $body .= tL('operatingsystem', $lang) . ' - ' . $task_details['os_name'] . "\n"; $body .= tL('severity', $lang) . ' - ' . $task_details['severity_name'] . "\n"; $body .= tL('priority', $lang) . ' - ' . $task_details['priority_name'] . "\n"; $body .= tL('reportedversion', $lang) . ' - ' . $task_details['reported_version_name'] . "\n"; $body .= tL('dueinversion', $lang) . ' - ' . $task_details['due_in_version_name'] . "\n"; $body .= tL('duedate', $lang) . ' - ' . $due_date . "\n"; $body .= tL('details', $lang) . ' - ' . $task_details['detailed_desc'] . "\n\n"; if ($arg1 == 'files') { $body .= tL('fileaddedtoo', $lang) . "\n\n"; $subject .= ' (' . tL('attachmentadded', $lang) . ')'; } $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); $online .= tL('newtaskopened', $lang) . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; $online .= tL('attachedtoproject', $lang) . ' - ' . $task_details['project_title'] . ". "; $online .= tL('summary', $lang) . ' - ' . $task_details['item_summary']; } // }}} // {{{ Task details changed if ($type == NOTIFY_TASK_CHANGED) { $translation = array('priority_name' => tL('priority', $lang), 'severity_name' => tL('severity', $lang), 'status_name' => tL('status', $lang), 'assigned_to_name' => tL('assignedto', $lang), 'due_in_version_name' => tL('dueinversion', $lang), 'reported_version_name' => tL('reportedversion', $lang), 'tasktype_name' => tL('tasktype', $lang), 'os_name' => tL('operatingsystem', $lang), 'category_name' => tL('category', $lang), 'due_date' => tL('duedate', $lang), 'percent_complete' => tL('percentcomplete', $lang), 'mark_private' => tL('visibility', $lang), 'item_summary' => tL('summary', $lang), 'detailed_desc' => tL('taskedited', $lang), 'project_title' => tL('attachedtoproject', $lang), 'estimated_effort' => tL('estimatedeffort', $lang)); $body .= tL('taskchanged', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ': ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n"; $online .= tL('taskchanged', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary']; foreach ($arg1 as $change) { if ($change[0] == 'assigned_to_name') { $change[1] = implode(', ', $change[1]); $change[2] = implode(', ', $change[2]); } if ($change[0] == 'detailed_desc') { $body .= $translation[$change[0]] . ":\n-------\n" . $change[2] . "\n-------\n"; } else { $body .= $translation[$change[0]] . ': ' . ($change[1] ? $change[1] : '[-]') . ' -> ' . ($change[2] ? $change[2] : '[-]') . "\n"; } } $body .= "\n" . tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); } // }}} // {{{ Task closed if ($type == NOTIFY_TASK_CLOSED) { $body .= tL('notify.taskclosed', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n\n"; $body .= tL('reasonforclosing', $lang) . ' ' . $task_details['resolution_name'] . "\n"; if (!empty($task_details['closure_comment'])) { $body .= tL('closurecomment', $lang) . ' ' . $task_details['closure_comment'] . "\n\n"; } $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); $online .= tL('notify.taskclosed', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Task re-opened if ($type == NOTIFY_TASK_REOPENED) { $body .= tL('notify.taskreopened', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n\n"; $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); $online .= tL('notify.taskreopened', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Dependency added if ($type == NOTIFY_DEP_ADDED) { $depend_task = Flyspray::getTaskDetails($arg1); $body .= tL('newdep', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n"; $body .= CreateURL('details', $task_id) . "\n\n\n"; $body .= tL('newdepis', $lang) . ':' . "\n\n"; $body .= 'FS#' . $depend_task['task_id'] . ' - ' . $depend_task['item_summary'] . "\n"; $body .= CreateURL('details', $depend_task['task_id']); $online .= tL('newdep', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Dependency removed if ($type == NOTIFY_DEP_REMOVED) { $depend_task = Flyspray::getTaskDetails($arg1); $body .= tL('notify.depremoved', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n"; $body .= CreateURL('details', $task_id) . "\n\n\n"; $body .= tL('removeddepis', $lang) . ':' . "\n\n"; $body .= 'FS#' . $depend_task['task_id'] . ' - ' . $depend_task['item_summary'] . "\n"; $body .= CreateURL('details', $depend_task['task_id']); $online .= tL('notify.depremoved', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Comment added if ($type == NOTIFY_COMMENT_ADDED) { // Get the comment information $result = $db->Query("SELECT comment_id, comment_text\n FROM {comments}\n WHERE user_id = ?\n AND task_id = ?\n ORDER BY comment_id DESC", array($user->id, $task_id), '1'); $comment = $db->FetchRow($result); $body .= tL('notify.commentadded', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n\n"; $body .= "----------\n"; $body .= $comment['comment_text'] . "\n"; $body .= "----------\n\n"; if ($arg1 == 'files') { $body .= tL('fileaddedtoo', $lang) . "\n\n"; $subject .= ' (' . tL('attachmentadded', $lang) . ')'; } $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id) . '#comment' . $comment['comment_id']; $online .= tL('notify.commentadded', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Attachment added if ($type == NOTIFY_ATT_ADDED) { $body .= tL('newattachment', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n\n"; $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); $online .= tL('newattachment', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Related task added if ($type == NOTIFY_REL_ADDED) { $related_task = Flyspray::getTaskDetails($arg1); $body .= tL('notify.relatedadded', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n"; $body .= CreateURL('details', $task_id) . "\n\n\n"; $body .= tL('relatedis', $lang) . ':' . "\n\n"; $body .= 'FS#' . $related_task['task_id'] . ' - ' . $related_task['item_summary'] . "\n"; $body .= CreateURL('details', $related_task['task_id']); $online .= tL('notify.relatedadded', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Ownership taken if ($type == NOTIFY_OWNERSHIP) { $body .= implode(', ', $task_details['assigned_to_name']) . ' ' . tL('takenownership', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n\n"; $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); $online .= implode(', ', $task_details['assigned_to_name']) . ' ' . tL('takenownership', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "."; } // }}} // {{{ Confirmation code if ($type == NOTIFY_CONFIRMATION) { $body .= tL('noticefrom', $lang) . " {$proj->prefs['project_title']}\n\n" . tL('addressused', $lang) . "\n\n" . " {$arg1[0]}index.php?do=register&magic_url={$arg1[1]} \n\n" . tL('username', $lang) . ': ' . $arg1[2] . "\n" . tL('confirmcodeis', $lang) . " {$arg1['3']} \n\n"; $online = $body; } // }}} // {{{ Pending PM request if ($type == NOTIFY_PM_REQUEST) { $body .= tL('requiresaction', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho') . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n\n"; $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); $online .= tL('requiresaction', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ PM request denied if ($type == NOTIFY_PM_DENY_REQUEST) { $body .= tL('pmdeny', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n\n"; $body .= tL('denialreason', $lang) . ':' . "\n"; $body .= $arg1 . "\n\n"; $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); $online .= tL('pmdeny', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ New assignee if ($type == NOTIFY_NEW_ASSIGNEE) { $body .= tL('assignedtoyou', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n\n"; $body .= tL('moreinfo', $lang) . "\n"; $body .= CreateURL('details', $task_id); $online .= tL('assignedtoyou', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Reversed dep if ($type == NOTIFY_REV_DEP) { $depend_task = Flyspray::getTaskDetails($arg1); $body .= tL('taskwatching', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n"; $body .= CreateURL('details', $task_id) . "\n\n\n"; $body .= tL('isdepfor', $lang) . ':' . "\n\n"; $body .= 'FS#' . $depend_task['task_id'] . ' - ' . $depend_task['item_summary'] . "\n"; $body .= CreateURL('details', $depend_task['task_id']); $online .= tL('taskwatching', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Reversed dep - removed if ($type == NOTIFY_REV_DEP_REMOVED) { $depend_task = Flyspray::getTaskDetails($arg1); $body .= tL('taskwatching', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n"; $body .= CreateURL('details', $task_id) . "\n\n\n"; $body .= tL('isnodepfor', $lang) . ':' . "\n\n"; $body .= 'FS#' . $depend_task['task_id'] . ' - ' . $depend_task['item_summary'] . "\n"; $body .= CreateURL('details', $depend_task['task_id']); $online .= tL('taskwatching', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ User added to assignees list if ($type == NOTIFY_ADDED_ASSIGNEES) { $body .= tL('useraddedtoassignees', $lang) . "\n\n"; $body .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . "\n"; $body .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . ")\n"; $body .= CreateURL('details', $task_id); $online .= tL('useraddedtoassignees', $lang) . ". "; $online .= 'FS#' . $task_id . ' - ' . $task_details['item_summary'] . ". "; $online .= tL('userwho', $lang) . ' - ' . $user->infos['real_name'] . ' (' . $user->infos['user_name'] . "). "; } // }}} // {{{ Anon-task has been opened if ($type == NOTIFY_ANON_TASK) { $body .= tL('thankyouforbug', $lang) . "\n\n"; $body .= CreateURL('details', $task_id, null, array('task_token' => $arg1)) . "\n\n"; $online .= tL('thankyouforbug') . ""; } // }}} // {{{ Password change if ($type == NOTIFY_PW_CHANGE) { $body = tL('magicurlmessage', $lang) . " \n" . "{$arg1[0]}index.php?do=lostpw&magic_url={$arg1['1']}\n\n" . tL('messagefrom', $lang) . $arg1[0]; $online = $body; } // } }} // {{{ New user if ($type == NOTIFY_NEW_USER) { $body = tL('newuserregistered', $lang) . " \n\n" . tL('username', $lang) . ': ' . $arg1[1] . "\n" . tL('realname', $lang) . ': ' . $arg1[2] . "\n"; $online = $body; if ($arg1[6]) { $body .= tL('password', $lang) . ': ' . $arg1[5] . "\n"; } $body .= tL('emailaddress', $lang) . ': ' . $arg1[3] . "\n"; $body .= tL('jabberid', $lang) . ':' . $arg1[4] . "\n\n"; $body .= tL('messagefrom', $lang) . $arg1[0]; } // }}} // {{{ New user him/herself if ($type == NOTIFY_OWN_REGISTRATION) { $body = tL('youhaveregistered', $lang) . " \n\n" . tL('username', $lang) . ': ' . $arg1[1] . "\n" . tL('realname', $lang) . ': ' . $arg1[2] . "\n"; $online = $body; if ($arg1[6]) { $body .= tL('password', $lang) . ': ' . $arg1[5] . "\n"; } $body .= tL('emailaddress', $lang) . ': ' . $arg1[3] . "\n"; $body .= tL('jabberid', $lang) . ':' . $arg1[4] . "\n\n"; // Add something here to tell the user whether the registration must // first be accepted by Administrators or not. And if it had and was // rejected, the reason. Check first what happening when requests are // either denied or accepted. $body .= tL('messagefrom', $lang) . $arg1[0]; } // }}} $body .= "\n\n" . tL('disclaimer', $lang); return array(Notifications::fixMsgData($subject), Notifications::fixMsgData($body), $online); }