Aktion: Wiki-Messenger

Compatible with: R6.0
Current version: 0.3
Credits: AhA

{{messenger}}

1. Description

Ein einfacher Wiki-Messenger, der es registrierten Nutzern ermöglicht sich innerhalb des Wikis Nachrichten zu schreiben.


Desweiteren hat man die Möglichkeit eine Kontaktliste zu führen und eigene Ordner anzulegen, um die erhaltenen Nachrichten
entsprechend zu verwalten.
Der Absender kann Nachrichten markieren und wird darüber informiert, ob eine Nachricht gelesen wurde.
Ebenfalls vorbereitet ist eine Codezeile, die in der header.php integriert werden kann – um den Nutzer sofort nach der Anmeldung
im Wiki anzuzeigen, dass er neue Nachrichten bekommen hat.


Der Code basiert auf dem Script Wikka Mail und wurde nur etwas angepasst und übersetzt.
Die Filterfunktion wurde komplett entfernt, da sie nur bedingt brauchbar bzw sinvoll ist. Mail wurde der Verwechslung wegen in Messenger umbenannt.
Die Funktion Nachrichten löschen wurde ebenfalls überarbeitet, da die Nachrichten im ursprünglichen Code nicht aus der Datenbank
gelöscht wurden, sondern lediglich nicht mehr im Posteingang angezeigt wurden. Die Nachricht ist dann zwar nicht mehr im 
Posteingang, aber es baut sich eine enorme Datenbank auf – da die Nachrichten ja nicht wirklich gelöscht wurden.


Die implementierte Hilfe für den Wiki-Messenger ist noch nicht ganz fertig, wird aber in kürze vervollständigt.
Da aber so gut wie alle Funktionen selbsterklärend sind steht einem Einsatz eigentlich nichts im Wege.

2. Installation

Um das Message-System zu installieren, muss die bestehende Datenbank um 2 Tabellen erweitert werden sowie die nachfolgende PHP-Datei in den Ordner /action kopiert werden.


Aufgerufen wird der Messenger im Wiki mit {{messenger}}


Dieses Script muss unter dem Namen messenger.php gespeichert werden und in den Ordner /action kopiert werden.


/action/messenger.php


<?php

if (!defined('IN_WACKO'))
{
    exit;
}

/* messenger action:
 * https://wackowiki.org/doc/Dev/PatchesHacks/WikiMessenger
 * modify the script for your needs, please conribute your improvements
 */

// Aufrufen: {{messenger}} (ohne parameter). Benötigt: 2 Tabellen in MYSQL-Datenbank & sowie diese Datei, welche in den Ordner "action" eingefügt werden muss.

$prefix $this->db->table_prefix;

$create_table = function() use ($prefix)
{
    
$this->db->sql_query(
        
"CREATE TABLE {$prefix}messenger (
            message_id INT(80) NOT NULL AUTO_INCREMENT,
            user_to_id INT(10) UNSIGNED NOT NULL DEFAULT '0',
            repliedto TINYINT(1) DEFAULT '0',
            folder TINYTEXT NOT NULL,
            user_from_id INT(10) UNSIGNED NOT NULL DEFAULT '0',
            urgent TINYINT(1) DEFAULT NULL,
            subject MEDIUMTEXT NOT NULL,
            message LONGTEXT NOT NULL,
            fltr1 TINYINT(1) DEFAULT '0',
            fltr2 TINYINT(1) DEFAULT '0',
            fltr3 TINYINT(1) DEFAULT '0',
            status TEXT NOT NULL,
            datesent DATETIME NULL DEFAULT NULL,
            viewrecipient TINYINT(1) DEFAULT '1',
        PRIMARY KEY (message_id)
    );"
);

    
$this->db->sql_query(
        
"CREATE TABLE {$prefix}messenger_info (
            msg_info_id INT(80) NOT NULL AUTO_INCREMENT,
            owner_id INT(10) UNSIGNED NOT NULL DEFAULT '0',
            type TINYTEXT NOT NULL,
            info TINYTEXT NOT NULL,
            notes TINYTEXT,
        PRIMARY KEY (msg_info_id)
    );"
);
};

if (
$user_id $this->get_user_id())
{
    
$pagenum        $_GET['page'] ?? null;
    
$folder            $_GET['folder'] ?? null;
    
$which            $_REQUEST['whichfolder'] ?? null;
    if (!
$folder) {$folder $which;}
    
$filterset        $_GET['fltrset'] ?? null;
    
$msg_id            = (int) ($_GET['message_id'] ?? null);
    
$filter            $_GET['fltr'] ?? null;
    
$move2folder    $_REQUEST['move2folder'] ?? null;
    
$action            $_GET['action'] ?? null;
    
$message_id        $msg_id;
    
$id                = (int) ($_GET['id'] ?? null);
    
$to                = (int) ($_GET['to'] ?? null);
    
?>

    <script>
    <!-- Begin
    function textCounter(field, countfield, maxlimit)
    {
        if (field.value.length > maxlimit)        // if too long...trim it!
            field.value = field.value.substring(0, maxlimit);
                else                            // otherwise, update 'characters left' counter
            countfield.value = maxlimit - field.value.length;
    }
    // End -->
    </script>

    <table>
        <tr>
            <td> <a href="<?php echo $this->href('''', ['action' => 'inbox']); ?>">Posteingang</a> </td>
            <td> | <a href="<?php echo $this->href('''', ['action' => 'compose']); ?>">Verfassen</a> </td>
            <td> | <b>Ordner</b></td>
            <td>

    <?php
    $results 
$this->db->load_all(
        
"SELECT DISTINCT info
        FROM 
{$prefix}messenger_info
        WHERE type = 'folder'
            AND owner_id = " 
. (int) $user_id "
        ORDER BY info ASC"
);

    
#echo '<form method="post" action="' . $this->href() . '">';
    
echo $this->form_open('message_folder');
    echo 
'<select name="whichfolder">';

    foreach (
$results as $row)
    {
        
extract ($row);

        if (
$_REQUEST['whichfolder'] == $info)
        {
            echo 
'<option selected value="' $info '">' $info '</option>';
        }
        else
        {
            echo 
'<option value="' $info '">' $info '</option>';
        }
    }

    echo 
'</select><input type="submit" value="Anzeigen"></form>';
    
?>
            </td>
            <td> | <a href="<?php echo $this->href('''', ['action' => 'sent']); ?>">Postausgang</a> </td>
            <td> | <b>Verwalten: </b><a href="<?php echo $this->href('''', ['action' => 'folders']); ?>">Ordner</a> | <a href="<?php echo $this->href('''', ['action' => 'contacts']); ?>">Kontaktliste</a> </td>
            <td> | <a href="<?php echo $this->href('''', ['action' => 'users']); ?>">Benutzer</a></td>
            <td> | <a href="<?php echo $this->href('''', ['action' => 'help']); ?>">Hilfe</a></td>
        </tr>
    </table>

    <?php
    
if (! in_array($action, ['compose''forward''contacts''folders''users''help''reply''delete''store']))
    {
        if (
$action == 'inbox' || (($action == '' || $action == 'view')
            && @
$_REQUEST['whichfolder'] == '' && $folder == ''))
        {
            
$which2 $pagenum '<b>    Posteingang</b>';
        }
        else if (
$action == 'sent' || $action == 'view2')
        {
            
$which2 $pagenum '<b>    gesendete Nachrichten</b>';
        }
        else if (
$folder != '')
        {
            
$which    $folder;
            
$which2    '<a href="' $this->href('''', ['folder' => $folder]) . '">' $which '</a>';
        }

        echo 
"<br><b>Ordner: </b>" $which2;
    }

    
// code for moving messages to folders
    
if ($move2folder)
    {
        
$rs $this->db->sql_query(
            
"UPDATE {$prefix}messenger SET
                folder = " 
$this->db->q($move2folder) . "
            WHERE message_id = " 
. (int) $message_id "
                AND user_to_id = " 
. (int) $user_id);

        if (
$rs)
        {
            echo 
'<br><strong>Die Nachricht wurde in Ordner ' $move2folder .' verschoben.';
        }
        else
        {
            echo 
'Die Nachricht wurde nicht verschoben!';
        }
    }

    
// shows inbox
    
else if (($action == '' || $action == 'inbox')
        && @
$_REQUEST['whichfolder'] == '' && (!$folder))
    {
        if (
$filter == 1)        {$search "AND fltr1 = '1' ";}
        else if (
$filter == 2)    {$search "AND fltr2 = '1' ";}
        else if (
$filter == 3)    {$search "AND fltr3 = '1' ";}
        else if (
$filter == 0)    {$search "AND fltr1 = '0' AND fltr2 = '0' AND fltr3 = '0' ";}
        else                    {
$search '';}

        
// setting the filter conditions into the database
        
$filters $this->db->load_all(
            
"SELECT fltr1, fltr2, fltr3, message_id
                FROM 
{$prefix}messenger
                WHERE user_to_id = " 
. (int) $user_id "
                    AND folder = 'inbox'
                    AND viewrecipient = '1'
                ORDER BY datesent DESC"
);

        foreach (
$filters as $row)
        {
            
// code to set filters in database
            
if ($filterset && ($row['message_id'] == $msg_id))
            {
                
// code to determine setting of filters on server
                
if ($row['fltr1'] != 1) {$filtervar1 1;} else {$filtervar1 0;}
                if (
$row['fltr2'] != 1) {$filtervar2 1;} else {$filtervar2 0;}
                if (
$row['fltr3'] != 1) {$filtervar3 1;} else {$filtervar3 0;}

                
// code to set which filter is being set
                
if ($filterset == 1)        {$filter 'fltr1'$set $filtervar1;}
                else if (
$filterset == 2)    {$filter 'fltr2'$set $filtervar2;}
                else if (
$filterset == 3)    {$filter 'fltr3'$set $filtervar3;}

                
$this->db->sql_query(
                    
"UPDATE {$prefix}messenger SET " .
                        
$filter " = " $set "
                    WHERE message_id = " 
. (int) $msg_id "
                        AND user_to_id = " 
. (int) $user_id);
            }
        }

        
//needed for pagination of sent box
        
$limit 10;

        
$selector =
            
"FROM {$prefix}messenger m
                LEFT JOIN 
{$prefix}user u ON (m.user_from_id = u.user_id)
            WHERE m.user_to_id = " 
. (int) $user_id " " .
            
$search "
                AND m.folder = 'inbox'
                AND m.viewrecipient = '1' "
;

        
// count pages
        
$count $this->db->load_single(
            
"SELECT COUNT(message_id) AS n " .
            
$selector
            
true);

        
$pagination $this->pagination($count['n'], $limit'm' , ['action' => 'inbox']);

        
$result $this->db->load_all(
            
"SELECT m.*, u.user_name " .
            
$selector .
            
"ORDER BY m.datesent DESC " .
            
$pagination['limit']);

        echo 
'<table class="hl-line" cellpadding="2" cellspacing="3" width="800" valign="top">';
        echo 
"<tr><td colspan='4' align='center'>";

        
// to paginate the "inbox" page messeges
        
$this->print_pagination($pagination);

        echo 
"</td></tr>";
        echo 
"<tr bgcolor=#93B2DD>\n";
        echo 
"<td width='400'><table border='0' cellpadding='0' cellspacing='0' width='100%'>
                <tr><td width='100'> <b>Betreff:</b></td><td align='right'>"
;
        echo 
"</td></tr></table></td>\n";
        echo 
"<td width='100'> <b>Absender:</b></td>\n";
        echo 
"<td width='250'><b> Verschieben in Ordner:</b></td>\n";
        echo 
"<td width='80'><b>Löschen:</b></td>\n";
        echo 
"</tr>\n";

        foreach (
$result as $row )
        {
            
// Extracting & formatting date
            
$datetime date('dMy g:i a'strtotime($row['datesent']));

            
// setzt Zeichen für Status der Nachricht (wichtig/gelesen/beantwortet)
            
if ($row['status'] == 'pending')
            {
                
$status "<a title='Diese Nachricht wurde noch nicht gelesen!'><font color=Red>*</font></a>";
            }
            else
            {
                
$status '';
            }

            if (
$row['urgent'] == 1)
            {
                
$urgent_flag "<a title='Dies ist eine dringende Nachricht!'><font color=Red><strong>!</strong></font></a>";
            }
            else
            {
                
$urgent_flag '';
            }

            if (
$row['repliedto'] == 1)
            {
                
$replied "<a title='Auf diese Nachricht wurde bereits geantwortet!'><font color='grey'><strong> beantwortet am: </strong></grey></a>";
            }
            else
            {
                
$replied '';
            }

            echo 
"<tr><td>$status$urgent_flag <a href=" $this->href('''', ['action' => 'view''message_id' => $row['message_id'], 'page' => 'viewmessage']) . $pagenum ">" strip_tags($row['subject']) . "</a><small>" $replied "(" $datetime ")</small>";
            
// put in asterisks if indicated to do so in database
            
echo "</td>";
            echo 
"<td>" $this->format($row['user_name']) . "<small> [<a href=" $this->href('''', ['action' => 'contacts''contact' => $row['user_from_id']])  . ">-></a>]</small></td><td align='left' width='155'>";

            
// code to put in drop down box to move to a new folder
            
$resultdrop2 $this->db->load_all(
                
"SELECT DISTINCT info
                FROM 
{$prefix}messenger_info
                WHERE type='folder'
                    AND owner_id = " 
. (int) $user_id "
                ORDER BY info ASC"
);

            
#echo '<form method=post action="' . $this->href('', '', ['message_id' => $row['message_id']]) . '">';
            
echo $this->form_open('move_folder', ['href_param' => 'message_id=' $row['message_id']]);
            echo 
'<select name="move2folder">';

            foreach (
$resultdrop2 as $row2)
            {
                
extract ($row2);
                echo 
'<option value="' $info '">' $info '</option>';
            }

            echo 
"</select><input type='submit' value='Verschieben'></form>";
            echo 
"</td><td> <a href=\"javascript: if (confirm('Bist Du sicher, dass Du diesen Eintrag löschen möchtest?')){ window.self.location='" $this->href('''', ['action' => 'delete''id' => $row['message_id']]) . "' }\">Löschen</a><br></td>";
        }
        echo 
"</table>";

        if (
$count['n'] == 0)
        {
            echo 
"<br>    Zur Zeit sind keine Nachrichten im Posteingang <br><br>";
        }
    }
    
// send a new message to a user
    
else if ($action == 'compose')
    {
        
$users $this->db->load_all(
            
"SELECT user_id, user_name
            FROM 
{$prefix}user
            ORDER BY user_name ASC"
);

        echo 
"<br><b>Nachricht verfassen</b><br><br>";
        echo 
"<table width='675'><tr><td>";
        
#echo "<form name='myform' action=" . $this->href('', '', ['action' => 'store']) . " method='post'>";
        
echo $this->form_open('message_store', ['href_param' => 'action=store']);
        echo 
"<table>";
        echo 
"<tr>
                <td>Betreff:</td>
                <td><input type='text' name='subject' maxlength='65' size='30' value='' required></td>
            </tr>"
;
        echo 
'<tr>
                <td>Empfänger:</td>
                <td>
                    <select name="to" required>
                        <option value="">Wähle einen Empfänger</option>'
;
                        foreach (
$users as $user)
                        {
                            echo 
'<option value="' $user['user_id'] . '"' . ($to == $user['user_id'] ? ' selected' '') . '>' $user['user_name'] . '</option>';
                        }
        echo        
'</select>
                </td>
            </tr>'
;
        echo 
"<tr>
                <td>Nachricht:</td>
                <td><textarea rows='16' cols='45' name='message' onKeyDown=\"textCounter(this.form.message,this.form.remLen,2000);\" onKeyUp=\"textCounter(this.form.message,this.form.remLen,2000);\"></textarea><br>
                    <input readonly type='text' name='remLen' size='4' maxlength='4' value='2000'> Zeichen stehen noch zur Verfügung.</td>
            </tr>"
;
        echo 
"<tr>
                <td><button type='submit'>Abschicken!</button></td>
                <td align='right'>Dringend? <input type='checkbox' name='urgent' value='1'></td>
            </tr>"
;
        echo 
'</table>';
        echo 
"</form>";
        echo 
"</td><td width='200' valign='top'>";
    
?>
        Um einen User zu Deiner Kontaktliste hinzuzufügen bitte <a href="<?php echo $this->href('''', ['action' => 'users']); ?>">hier</a> klicken!<br><br>
    <?php
        
echo "<b>Kontakt-Liste:<br></b><small>(Klick auf den Namen um den User<br>als Empfänger einzusetzen)</small><br><br>";

        
$contacts $this->db->load_all(
            
"SELECT i.info, u.user_name
            FROM 
{$prefix}messenger_info i
                LEFT JOIN 
{$prefix}user u ON (i.info = u.user_id)
            WHERE i.type = 'contact'
                AND i.owner_id = " 
. (int) $user_id "
            ORDER BY i.info ASC"
);

        foreach (
$contacts as $row)
        {
            echo 
"<a href=" $this->href('''', ['action' => 'compose''to' => (int) $row['info']]) . ">" $row['user_name'] . "</a><br>";
        }

        echo 
"</td></tr></table>";
    }

    
// Antwort an den Absender einer Nachricht schicken
    
else if ($action == 'reply')
    {
        
$row $this->db->load_single(
            
"SELECT *
            FROM 
{$prefix}messenger
            WHERE user_to_id = " 
. (int) $user_id "
                AND message_id = " 
. (int) $message_id);

        
$user $this->db->load_single(
            
"SELECT user_id, user_name
            FROM 
{$prefix}user
            WHERE user_id = " 
. (int) $to "
                LIMIT 1"
);

        echo 
"<br><b>Antwort erstellen</b><br><br>";
        echo 
"<table width='400'><tr><td>";
        
#echo "<form name='myform' action=" . $this->href('', '', ['action' => 'store', 'replyto' => $msg_id]) . " method='post'>";
        
echo $this->form_open('message_reply', ['href_param' => 'action=store&replyto' $msg_id]);
        echo 
'<tr>
                <td>Betreff:</td>
                <td><input readonly type="text" name="subject" maxlength="65" size="30" value="' 
$row['subject'] . '" required></td>
            </tr>'
;
        echo 
'<tr>
                <td>Empfänger:</td>
                <td>
                    <select name="to" readonly  required>
                        <option value="' 
$user['user_id'] . '">' $user['user_name'] . '</option>
                    </select>
                </td>
            </tr>'
;

        
$origmsg    =     " \n \n++++++++++ Original Message ++++++++++\n" .
                        
strip_tags($row['message']) .
                        
"\n+++++++++++++++++++++++++++++++++";

        echo 
"<tr><td>Nachricht:</td>
                <td><textarea rows='16' cols='45' name='message' onKeyDown=\"textCounter(this.form.message,this.form.remLen,2000);\" onKeyUp=\"textCounter(this.form.message,this.form.remLen,2000);\">" 
$origmsg "</textarea><br>
                    <input readonly type='text' name='remLen' size='4' maxlength='4' value='2000'> Zeichen stehen noch zur Verfügung.</td></tr>"
;
        echo 
"<tr><td><button type='submit'>Abschicken!</button></td><td align='right'>Dringend? <input type='checkbox' name='urgent' value='1'></td></tr>";
        echo 
'</table>';
        echo 
"</form>";
    }

    
// Nachricht weiterleiten
    
else if ($action == 'forward' && $message_id != '')
    {
        
$row $this->db->load_single(
            
"SELECT *
            FROM 
{$prefix}messenger
            WHERE user_to_id = " 
. (int) $user_id "
                AND message_id = " 
. (int) $message_id);

        echo 
"<br><b>Nachricht weiterleiten</b><br><br>";
        echo 
'<table width="675"><tr><td>';
        
#echo "<form name='myform' action=" . $this->href('', '', ['action' => 'store']) . " method='post'>";
        
echo $this->form_open('message_forward', ['href_param' => 'action=store']);
        echo 
'<table>';
        
$subject2 'FWD: ' $row['subject'];
        echo 
"<tr>
                <td>Betreff:</td>
                <td><input type='text' name='subject' maxlength='65' size='30' value='
$subject2' required></td>
            </tr>"
;
        echo 
"<tr>
                <td>Empfänger:</td>
                <td><input type='text' name='to' maxlength='65' size='30' value='
$to' required></td></tr>";

        
$origmsg    =    " \n \n++++++++++++ Forward ++++++++++++++\n" .
                        
strip_tags($row['message']) .
                        
"\n+++++++++++++++++++++++++++++++++";

        echo 
"<tr><td>Nachricht:</td>
                <td><textarea rows='16' cols='45' name='message' onKeyDown=\"textCounter(this.form.message,this.form.remLen,2500);\" onKeyUp=\"textCounter(this.form.message,this.form.remLen,2500);\">
$origmsg</textarea><br>
                    <input readonly type='text' name='remLen' size='4' maxlength='4' value='2500'>Zeichen stehen noch zur Verfügung.</td></tr>"
;
        echo 
"<tr>
                <td><button type=submit>Abschicken!</button></td>
                <td align='right'>Dringend? <input type='checkbox' name='urgent' value='1'></td>
            </tr>"
;
        echo 
'</table>';
        echo 
"</form>";
        echo 
"</td><td width='200' valign='top'>";
    
?>
        Um einen User zu Deiner Kontaktliste hinzuzufügen bitte <a href="<?php echo $this->href('''', ['action' => 'users']); ?>">hier</a> klicken!<br><br>
    <?php
        
echo "<b>Kontakt-Liste:<br></b><small>(Klick auf den Namen um den User<br>als Empfänger einzusetzen)</small><br><br>";

        
$contacts $this->db->load_all(
            
"SELECT i.info, u.user_name
            FROM 
{$prefix}messenger_info i
                LEFT JOIN 
{$prefix}user u ON (i.info = u.user_id)
            WHERE i.type='contact'
                AND i.owner_id = " 
. (int) $user_id "
            ORDER BY i.info ASC"
);

        foreach (
$contacts as $row)
        {
            echo 
'<a href="' $this->href('''', ['action' => 'forward''to' => (int) $row['info'], 'message_id' => $message_id]) . '">' $row['user_name'] . '</a><br>';
        }

        echo 
"</td></tr></table>";
    }

    
// schreibt versendete Nachrichten (original/weitergeleitet) in die Datenbank
    
if ($action == 'store')
    {
        
$urgent        $_POST['urgent'] ?? null;
        
$to            $_POST['to'] ?? null;
        
$to            addslashes($to);
        
$subject    $_POST['subject'] ?? null;
        
$subject    addslashes($subject);
        
$message    $_POST['message'] ?? null;
        
$message    strip_tags($message);
        
$message    addslashes($message);
        
$replyto    $_GET['replyto'] ?? null;
        
$date        date('YmdHis');

        
// prüft ob der Nutzer existiert und versendet die Nachricht
        
if ($subject == '' || $message == '' || $to == '')
        {
            
?>
                <br><center><span class="cite">Ein Feld wurde nicht ausgefüllt. Es müssen alle Felder ausgefüllt sein!</span></center><br><br>
                <a href="<?php echo $this->href('''', ['action' => 'compose']); ?>">Zurück</a>
            <?php
        
}
        else
        {
            if (
$this->load_user(''$to))
            {
                
$this->db->sql_query(
                    
"INSERT INTO {$prefix}messenger
                        (user_to_id, folder, user_from_id, subject, message, datesent, status, urgent)
                    VALUES
                        ('
$to', 'inbox', '$user_id', '$subject', '$message', '$date', 'pending', '$urgent')");

                echo 
'Nachricht gesendet an ' $to .'!';

                
// to set the database so that the message has been replied to
                
$this->db->sql_query(
                    
"UPDATE {$prefix}messenger SET
                        repliedto = '1'
                    WHERE message_id = '
$replyto'
                        AND user_to_id = " 
. (int) $user_id);
            }
            else
            {
                
?>
                <br><center><span class="cite">Die Nachricht konnte nicht versendet werden, da der eingetragende Empfänger kein registrierter Benutzer ist.<br><br>
                Überprüfe die Schreibweise (Gross- / Kleinschreibung)!</span><br><br></center>
                <a href="<?php echo $this->href('''', ['action' => 'compose']); ?>">Zurück</a>
                <?php
            
}
        }
    }
    
// zeigt den Ordner "versendete Nachrichten"
    
else if ($action == 'sent')
    {
        
// needed for pagination of sent box
        
$limit 10;

        
$selector =
            
"FROM {$prefix}messenger m
                LEFT JOIN 
{$prefix}user u ON (m.user_to_id = u.user_id)
            WHERE m.user_from_id = " 
. (int) $user_id " ";

        
// count pages
        
$count $this->db->load_single(
            
"SELECT COUNT(message_id) AS n " .
            
$selector
            
true);

        
$pagination $this->pagination($count['n'], $limit'm' , ['action' => 'sent']);

        
$result $this->db->load_all(
            
"SELECT m.*, u.user_name " .
            
$selector .
            
"ORDER BY m.datesent DESC " .
            
$pagination['limit']);

        echo 
'<table class="hl-line" cellpadding="2" cellspacing="3" width="750" valign="top">';
        echo 
"<tr><td colspan='3' align='center'>";

        
// to paginate the "sent" page messages
        
$this->print_pagination($pagination);

        echo 
"</td></tr>";
        echo 
"<tr bgcolor=#93B2DD>\n";
        echo 
"<td width='400'> <b>Betreff:</b></td>\n";
        echo 
"<td width='85'> <b>Empfänger:</b></td>\n";
        echo 
"<td width='75'> <b>Gelesen?</b></td>\n";
        echo 
"</tr>\n";

        foreach (
$result as $row)
        {
            
$datetime date("dMy g:i a"strtotime($row['datesent']));
            echo 
"<tr>
                    <td><a href=" 
$this->href('''', ['action' => 'view2''message_id' => $row['message_id'], 'page' => 'view2']) . $pagenum ">" strip_tags($row['subject']) . "</a><small> (" $datetime ")</small></td>
                    <td>" 
$this->format($row['user_name'])."<small> [<a href=" $this->href('''', ['action' => 'contacts''contact' => $row['user_to_id']]) . ">-></a>]</small></td>
                    <td width=50> 
$row[status]<br></td>
                </tr>"
;
        }

        echo 
"</table>";
        
#echo '<br><br>Löscht der Empfänger eine Nachricht, wird sie auch hier automatisch entfernt!';
    
}

    
// show selected folder
    
else if (((@$_REQUEST['whichfolder'] != '') || ($folder)) && ($action != 'view'))
    {
        if (
$filter == 1)
        {
            
$search "AND fltr1 = '1' ";
        }
        else if (
$filter == 2)
        {
            
$search "AND fltr2 = '1' ";
        }
        else if (
$filter == 3)
        {
            
$search "AND fltr3 = '1' ";
        }
        else if (
$filter == 0)
        {
            
$search "AND fltr1 = '0' AND fltr2 = '0' AND fltr3 = '0' ";
        }
        else
        {
            
$search '';
        }

        if (isset(
$_REQUEST['whichfolder']) && $_REQUEST['whichfolder'] != '')
        {
            
$showfolder $_REQUEST['whichfolder'];
        }
        else
        {
            
$showfolder $folder;
        }

        echo 
'<table class="hl-line" cellpadding="2" cellspacing="3" width="800" valign="top">';
        echo 
"<tr bgcolor=#93B2DD>\n";
        echo 
"<td><table border='0' cellpadding='0' cellspacing='0' width='100%'>
                <tr><td width='400'><b> Betreff:</b></td><td align='right'>"
;

        if (
$filter == 1) {$red        "<u>*</u>";} else {$red "*";}
        if (
$filter == 2) {$blue    "<u>*</u>";} else {$blue "*";}
        if (
$filter == 3) {$green    "<u>*</u>";} else {$green "*";}
        if (
$filter == 0) {$none    "<u>N</u>";} else {$none "N";}

        echo 
"</td></tr></table></td>\n" .
                
"<td width='100'><b> Absender:</b></td>\n" .
                
"<td width='250'><b> In Ordner verschieben:</b></td>\n" .
                
"<td width='80'><b> Löschen:</b></td>\n" .
            
"</tr>\n";

        
$result $this->db->load_all(
            
"SELECT fltr1, fltr2, fltr3, message_id
            FROM 
{$prefix}messenger
            WHERE user_to_id = " 
. (int) $user_id " " .
            
$search "
                AND folder = " 
$this->db->q($folder) . "
                AND viewrecipient = '1'
            ORDER BY datesent DESC"
);

        foreach (
$result as $row)
        {
            
// code to set filters in database
            
if (($filterset) && ($row['message_id'] == $msg_id))
            {
                
// code to determine setting of filters on server
                
if ($row['fltr1'] != 1) {$filtervar1=1;} else {$filtervar1 0;}
                if (
$row['fltr2'] != 1) {$filtervar2=1;} else {$filtervar2 0;}
                if (
$row['fltr3'] != 1) {$filtervar3=1;} else {$filtervar3 0;}

                
// code to set which filter is being set
                
if ($filterset == 1)
                {
                    
$filter    'fltr1';
                    
$set    $filtervar1;
                }
                else if (
$filterset == 2)
                {
                    
$filter    'fltr2';
                    
$set    $filtervar2;
                }
                else if (
$filterset == 3)
                {
                    
$filter    'fltr3';
                    
$set    $filtervar3;
                }

                
$this->db->sql_query(
                    
"UPDATE {$prefix}messenger SET " .
                        
$filter " = " . (int) $set "
                    WHERE message_id = " 
. (int) $msg_id "
                        AND user_to_id = " 
. (int) $user_id);
            }
        }

        
$result $this->db->load_all(
            
"SELECT m.*, u.user_name
            FROM 
{$prefix}messenger m
                LEFT JOIN 
{$prefix}user u ON (m.user_from_id = u.user_id)
            WHERE m.user_to_id = " 
. (int) $user_id " " .
            
$search "
                AND m.folder = " 
$this->db->q($showfolder) . "
            ORDER BY m.datesent DESC"
);

        
$numrows count($result);

        foreach (
$result as $row)
        {
            
$datetime date("dMy g:i a"strtotime($row['datesent']));

            if (
$row['status'] == 'unread')
            {
                
$status "<a title='This message has not been read yet!'><font color=Red>*</font></a>";
            }
            else
            {
                
$status '';
            }

            if (
$row['urgent'] == 1)
            {
                
$urgent_flag "<a title='This is an urgent message!'><font color=Red><strong>!</strong></font></a>";
            }
            else
            {
                
$urgent_flag '';
            }

            if (
$row['repliedto'] == 1)
            {
                
$replied "<a title='You have replied to this message!'><font color='black'><strong>+</strong></black></a>";
            }
            else
            {
                
$replied ' ';
            }

            echo 
'<tr><td>' $status $urgent_flag '<a href="' $this->href('''', ['action' => 'view''message_id' => $row['message_id'], 'folder' => $which]) . '">' strip_tags($row['subject']) . '</a>' $replied '<small>(' $datetime ')</small>';

            
// put in asterisks if indicated to do so in database
            
if ($row['fltr1'] == 1) {echo "<font color='red'><strong>*</strong></font>";}    else {echo '    ';}
            if (
$row['fltr2'] == 1) {echo "<font color='blue'><strong>*</strong></font>";}    else {echo '    ';}
            if (
$row['fltr3'] == 1) {echo "<font color='green'><strong>*</strong></font>";}    else {echo '    ';}

            echo 
"</td><td width=125>" $this->format($row['user_name']) . "<small> [<a href=" $this->href('''', ['action' => 'contacts''contact' => $row['user_from_id']]) . ">-></a>]</small></td><td>";

            
// code to put in drop down box to move to a new folder
            
$resultdrop2 $this->db->load_all(
                
"SELECT DISTINCT info
                FROM 
{$prefix}messenger_info
                WHERE type = 'folder'
                    AND owner_id = " 
. (int) $user_id "
                ORDER BY info ASC"
);

            
#echo '<form method="post" action="' . $this->href('', '', ['message_id' => $row['message_id'], 'folder' => $which]) . '">';
            
echo $this->form_open('edit_contacts', ['href_param' => 'message_id=' $row['message_id'] . '&folder=' $which]);
            echo 
'<select name="move2folder">';

            foreach (
$resultdrop2 as $row2)
            {
                
extract ($row2);
                echo 
'<option value="' $info '">' $info '</option>';
            }

            echo 
'</select><input type="submit" value="Verschieben"></form>';
            echo 
"</td><td> <a href=\"javascript: if (confirm('Bist Du sicher, dass Du diesen Eintrag löschen möchtest?')){ window.self.location='" $this->href('''', ['action' => 'delete''id' => $row['message_id']]) . "' }\">Löschen</a><br></td>";
        }

        echo 
"</table>";

        if (
$numrows == 0)
        {
            echo 
"<br>    Zur Zeit sind keine Nachrichten in diesem Ordner! <br><br>";
        }
    }
    
// view individual messages
    
else if ($action == 'view')
    {
        
$row $this->db->load_single(
            
"SELECT *
            FROM 
{$prefix}messenger
            WHERE user_to_id = " 
. (int) $user_id "
                AND message_id = " 
. (int) $msg_id);

        if ((
$filterset) && ($row['message_id'] == $msg_id))
        {
            
// code to determine setting of filters on server
            
if ($row['fltr1'] != 1) {$filtervar1 1;} else {$filtervar1 0;}
            if (
$row['fltr2'] != 1) {$filtervar2 1;} else {$filtervar2 0;}
            if (
$row['fltr3'] != 1) {$filtervar3 1;} else {$filtervar3 0;}

            
// code to set which filter is being set
            
if ($filterset == 1)
            {
                
$filter    'fltr1';
                
$set    $filtervar1;
            }
            else if (
$filterset == 2)
            {
                
$filter    'fltr2';
                
$set    $filtervar2;
            }
            else if (
$filterset == 3)
            {
                
$filter    'fltr3';
                
$set    $filtervar3;
            }

            
$this->db->sql_query(
                
"UPDATE {$prefix}messenger SET " .
                    
$filter " = " . (int) $set "
                WHERE message_id = " 
. (int) $msg_id "
                    AND user_to_id = " 
. (int) $user_id);
        }

        
$row $this->db->load_single(
            
"SELECT m.*, u.user_name
            FROM 
{$prefix}messenger m
                LEFT JOIN 
{$prefix}user u ON (m.user_from_id = u.user_id)
            WHERE m.user_to_id = " 
. (int) $user_id "
                AND m.message_id = " 
. (int) $msg_id);

        if (
$row['repliedto'] == 1)
        {
            
$replied "<a title='You have replied to this message at least once!'><small>replied to<small></a>";
        }
        else
        {
            
$replied ' ';
        }

        
// code to set filters in database
        
if ($row['user_to_id'] == $user_id)
        {
            
$datetime date("dMy g:i a"strtotime($row['datesent']));

            echo 
"<table border='1' bordercolor='#666699' width='600'>
                <tr><td width='350'><strong> Betreff: </strong>" 
strip_tags($row['subject']) . " ";

            
// put in asterisks if indicated to do so in database
            
if ($row['fltr1'] == 1) {echo "<font color='red'><strong>*</strong></font>";} else {echo "    ";}
            if (
$row['fltr2'] == 1) {echo "<font color='blue'><strong>*</strong></font>";} else {echo "    ";}
            if (
$row['fltr3'] == 1) {echo "<font color='green'><strong>*</strong></font>";} else {echo "    ";}

            echo 
"</td><td>";
            echo 
"</td><td><strong> Von: </strong>" $this->format($row['user_name']) . "<small> [<a href=" $this->href('''', ['action' => 'contacts''contact' => $row['user_from_id']]) . ">-></a>]</small></td></tr>";
            echo 
'<tr><td colspan="3"><strong> Nachricht: </strong>' strip_tags($row['message']) . '</td></tr>
                <tr><td>
                    <a href="' 
$this->href('''', ['action' => 'reply''to' => $row['user_from_id'], 'message_id' => $row['message_id']]) . '"> Antworten</a>
                    / <a href="' 
$this->href('''', ['action' => 'forward''message_id' => $row['message_id']]) . '">Weiterleiten</a>' .
                
" / <a href=\"javascript: if (confirm('Bist Du sicher, dass Du diesen Eintrag löschen möchtest?')){ window.self.location='" $this->href('''', ['action' => 'delete''id' => $row['message_id']]) . "' }\">Löschen</a></td><td>".$replied."</td><td><small><strong> Gesendet am:</strong> $datetime</small></td></tr></table><br>";

            
$rs $this->db->sql_query(
                
"UPDATE {$prefix}messenger SET
                    status = 'gelesen'
                WHERE message_id = " 
. (int) $msg_id);
        }
        else
        {
            echo 
'Das ist nicht Deine Post!';
        }
    }

    
// added filter for viewing "folder sorted" messages
    
else if ($action == 'view2')
    {
        
$row $this->db->load_single(
            
"SELECT m.*, u.user_name
            FROM 
{$prefix}messenger m
                LEFT JOIN 
{$prefix}user u ON (m.user_to_id = u.user_id)
            WHERE m.user_from_id = " 
. (int) $user_id "
                AND m.message_id = " 
. (int) $msg_id);

        if (
$row['user_from_id'] == $user_id)
        {
            
$datetime date('dMy g:i a'strtotime($row['datesent']));

            echo 
"<table border = '1' bordercolor = 'black' width = '600'>
                    <tr><td colspan='2' valign='top'><strong>Betreff:</strong> " 
strip_tags($row['subject']) . "</td></tr>
                    <tr>"
;
            echo 
'<td colspan="2"><strong>Empfänger:</strong> ' $this->format($row['user_name']) . '<small> [<a href="' $this->href('''', ['action' => 'contacts''contact' => $row['user_to_id']]) . '">-></a>]</small></td></tr>
                    <tr><td colspan="2"><strong>Nachricht: </strong>' 
$row['message'] . '</td></tr>
                    <tr><td colspan="2"><small><strong>Gesendet: </strong>' 
$datetime '</small></td></tr></table>';
        }
    }

    
// Nachrichten löschen (geändert - Nachrichten werden jetzt komplett aus Datenbank entfernt)
    
else if ($action == 'delete')
    {
        
$rs $this->db->sql_query(
            
"DELETE FROM {$prefix}messenger
            WHERE message_id = " 
. (int) $id);

        if (
$rs)
        {
            echo 
'Die Nachricht wurde gelöscht.';
        }
        else
        {
            echo 
'Die Nachricht wurde nicht gelöscht.';
        }
    }

    
// Kontaktliste verwalten
    
else if ($action == 'contacts')
    {
        
$add_contact    $_GET['contact'] ?? '';
        
$field1_label    ' Name:';
        
$field2_label    ' Bemerkung:';
        
$delete_contact    $_GET['delete_contact'] ?? null;
        
$field1_value    $_POST['field1_value'] ?? null;
        if (
$field1_value) {$insert '1';} else {$insert '';}
        
$field2_value    $_POST['field2_value'] ?? null;
        
$category        'contact';

        if (
$insert)
        {
            if (
$this->load_user(''$field1_value))
            {
                
$this->db->sql_query(
                    
"INSERT INTO {$prefix}messenger_info
                        (info, notes, owner_id, type)
                    VALUES
                        (\"
$field1_value\", \"$field2_value\", \"$user_id\", \"$category\")");
            }
        }

        if (
$delete_contact)
        {
            
$this->db->sql_query(
                
"DELETE FROM {$prefix}messenger_info
                WHERE msg_info_id = 
$delete_contact
                    AND owner_id = " 
. (int) $user_id);
        }

        
$users $this->db->load_all(
            
"SELECT user_id, user_name
            FROM 
{$prefix}user
            ORDER BY user_name ASC"
);

        
$result    $this->db->load_all(
            
"SELECT i.msg_info_id, i.owner_id, i.type, i.info, i.notes, u.user_name
            FROM 
{$prefix}messenger_info i
                LEFT JOIN 
{$prefix}user u ON (i.info = u.user_id)
            WHERE i.owner_id = " 
. (int) $user_id "
                AND i.type = " 
$this->db->q($category) . "
            ORDER BY i.info ASC"
);

        echo 
"<br><b>Kontaktliste:</b><br><br>";
        echo 
"<table border='1' cellspacing='0' width= 70% align=left>\n";
        echo 
"<tr>\n";
        echo 
"<td><strong>$field1_label</strong></td>\n";
        echo 
"<td><strong>$field2_label</strong></td>\n";
        echo 
"<td> </td>\n";
        echo 
"</tr>\n";
        
// This is the entry boxes
        #echo '<form action="' . $this->href('', '', ['action' => 'contacts']) . '" method="post">' . "\n";
        
echo $this->form_open('edit_contacts', ['href_param' => 'action=contacts']);
        echo 
"<tr>\n";
        echo 
"<input type='hidden' name='insert' value='1'></td>\n";
        echo 
'<td>
                <select name="field1_value" required>
                        <option value="">Wähle einen Empfänger</option>'
;
                        foreach (
$users as $user)
                        {
                            echo 
'<option value="' $user['user_id'] . '"' . ($add_contact == $user['user_id'] ? ' selected' '') . '>' $user['user_name'] . '</option>';
                        }
        echo        
"</select>
            </td>\n"
;
        echo 
"<td><input type='text' size='35' maxlength='65' name='field2_value'></td>\n";
        echo 
"<td colspan=2 align=center>";
        echo 
'<input type="submit" value="Hinzufügen"></td>' "\n";
        echo 
"</tr>\n";
        echo 
"</form>\n";

        
// This is the data under the entry boxes
        
foreach ($result as $row)
        {
            echo 
"<tr>\n";
            echo 
'<td><a href="' $this->href('''', ['action' => 'compose''to' => $row['info']]) . '">' $row['user_name'] . '</a></td>' "\n";
            echo 
'<td>' strip_tags($row['notes']) . "</td>\n";
            echo 
"<td><a href=\"javascript: if (confirm('Bist Du sicher, dass Du diesen Eintrag löschen möchtest?')){ window.self.location='" $this->href('''', ['action' => 'contacts''delete_contact' => $row['msg_info_id']]) . "' }\"><center>Löschen</center></a></td>\n";
            echo 
"</tr>\n";
        }

        echo 
"</table>";
        echo 
"<table>";
        echo 
"<td width='25' valign='top' ></td>";
        echo 
"<td width='150' valign='top' >";
        echo 
'<left><span class="cite">Klick auf den Benutzernamen um einem Benutzer aus der Kontaktliste eine Nachricht zu schreiben.</span></left><br><br>';
    
?>
        Um einen Benutzer zu Deiner Kontaktliste hinzuzufügen bitte <a href="<?php echo $this->href('''', ['action' => 'users']); ?>">hier</a> klicken!<br><br>Es können <b>nur</b> registrierte Benutzer hinzugefügt werden.
    <?php
        
echo "</td></table>";
    }

    
// Ordner verwalten
    
else if ($action == 'folders')
    {
        
$field1_label    ' Ordner:';
        
$field2_label    " Beschreibung:";
        
$delete_folder    $_GET['delete_folder'] ?? null;
        
$folder            $_GET['folder'] ?? null;
        
$field1_value    $_POST['field1_value'] ?? null;
        if (
$field1_value) {$insert '1';}
        else {
$insert '';}
        
$field2_value    $_POST['field2_value'] ?? null;
        
$category        'folder';

        if (
$insert)
        {
            
$this->db->sql_query(
                
"INSERT INTO {$prefix}messenger_info
                    (info, notes, owner_id, type)
                VALUES
                    (\"
$field1_value\", \"$field2_value\", \"$user_id\", \"$category\")");
        }

        if (
$delete_folder)
        {
            
// delete folder name from messenger_info
            
$this->db->sql_query(
                
"DELETE from {$prefix}messenger_info
                WHERE msg_info_id = '
$delete_folder'
                    AND owner_id = " 
. (int) $user_id "
                    AND type = 'folder'"
);

            
// change files from being stored in folder being deleted to being stored in inbox
            
$this->db->sql_query(
                
"UPDATE {$prefix}messenger SET
                    folder = 'inbox'
                WHERE folder = " 
$this->db->q($folder) . "
                    AND user_to_id = " 
. (int) $user_id);
        }

        
$result    $this->db->load_all(
            
"SELECT msg_info_id, owner_id, type, info, notes
            FROM 
{$prefix}messenger_info
            WHERE owner_id = " 
. (int) $user_id "
                AND type = " 
$this->db->q($category) . "
            ORDER BY info ASC"
);

        echo 
"<br><b>Ordner verwalten:</b><br><br>";
        echo 
"<table border='1' cellspacing='0' width= 65% align=left>\n";
        echo 
"<tr>\n";
        echo 
"<td><strong>$field1_label</strong></td>\n";
        echo 
"<td><strong>$field2_label</strong></td>\n";
        echo 
"<td> </td>\n";
        echo 
"</tr>\n";

        
// This is the entry boxes
        #echo '<form action="' . $this->href('', '', ['action' => 'folders']) . '" method="post">' . "\n";
        
echo $this->form_open('message_folders', ['href_param' => 'action=folders']);
        echo 
"<tr>\n";
        echo 
"<input type='hidden' name='insert' value='1'></td>\n";
        echo 
"<td><input type='text' size='25' maxlength='65' name='field1_value'></td>\n";
        echo 
"<td><input type='text' size='35' maxlength='65' name='field2_value'></td>\n";
        echo 
"<td colspan='2' align='center'>";
        echo 
"<input type='submit' value=\"    Hinzufügen    \"></td>\n";
        echo 
"</tr>\n";
        echo 
"</form>\n";

        
// This is the data under the entry boxes
        
foreach ($result as $row)
        {
            echo 
"<tr>\n";
            echo 
'<td><a href="' $this->href('''', ['folder' => strip_tags($row['info'])]) . '">' strip_tags($row['info']) . "</a></td>\n";
            echo 
"<td>" strip_tags($row['notes']) . "</td>\n";
            echo 
"<td><a href=\"javascript: if (confirm('Bist Du sicher, dass Du diesen Eintrag löschen möchtest?')){ window.self.location='" $this->href('''', ['action' => 'folders''delete_folder' => $row['msg_info_id'], 'folder' => $row['info']]) . "' }\">
                <center>Löschen</center></a></td>\n"
;
        }

        echo 
"</table>";
        echo 
"<table>";
        echo 
"<td width='25' valign='top' ></td>";
        echo 
"<td width='200' valign='top' >";
        echo 
'<span class="cite">Klick auf den Ordnernamen um einen Ordner zu öffnen!</span><br><br><b>Ordner erstellen:</b><br><br>Gib in das leere Feld unter <b>Ordner:</b> den Namen für den neuen Ordner ein.<br><br>In das Feld <b>Beschreibung:</b> kannst Du eine Beschreibung für den Ordner eingeben.<br><br>Nun noch ein Klick auf <b>Hinzufügen</b> und der neue Ordner steht Dir zur Verfügung.';
        echo 
"</td></table>";
    }

    
// code to display user list
    
else if ($action == 'users')
    {
        echo 
"<table width='650'><tr><td>";

        
$users $this->db->load_all(
            
"SELECT user_id, user_name
            FROM 
{$prefix}user
            ORDER BY user_name ASC"
);

        echo 
"<br><b>Benutzer:</b><br><br>";

        foreach (
$users as $user)
        {
            echo 
'<a href="' $this->href('''', ['action' => 'contacts''contact' => $user['user_id']]) . '">' $user['user_name'] . '</a> ';
        }

        echo 
"</td></tr></table>";
        echo 
'<span class="cite"><br><br>Klick auf den Namen um den User zu Deiner Kontaktliste hinzuzufügen!</span><br><br>';
    }

    
// help
    
else if ($action == 'help')
    {
        echo 
"<table width='700'><tr><td>";
        echo 
"<a name= anfang></a>";
        echo 
"<h3><center>Hilfe für das WackoWiki-Message-System</center></h3>";
        echo 
"<br><br>Auf dieser Seite gibt es einige Hilfestellungen zu den Funktionen des WackoWiki-Message-Systems. Die Erklärungen sind kurz gehalten, da die meisten Funktionen selbsterklärend sind.<br>Nachfolgend findest Du ein Inhaltsverzeichnis zu den hier erläuterten Funktionen:<br><br><br>";

        echo 
"<a href=#post>Posteingang</a><br>";
        echo 
"<a href=#verf>Verfassen</a><br>";
        echo 
"<a href=#vers>Postausgang</a><br>";
        echo 
"<a href=#verw>Verwalten</a><br>";
        echo 
"    - <a href=#ordn>Ordner</a><br>";
        echo 
"    - <a href=#kont>Kontaktliste</a><br>";

        echo 
"<a href=#benu>Benutzer</a><br><br>";
        echo 
"<a name= post><center><h3>Posteingang</h3></center></a><br><br>";
        echo 
"Im Posteing werden alle eingetroffenen Nachrichten angezeigt, sowie einige zusätzliche Info`s zu den einzelnen Nachrichten.<br><br>In der folgenden Darstellung siehst Du ein Beispiel, wie der Posteingangsordner aussehen kann:<br><br><br>";

        echo 
"<table>";
        echo 
"<tr bgcolor='#93B2DD'>";
        echo 
"<td width='400'>";
        echo 
"<table border='0' cellspacing='0' cellpadding='0' width='100%'>";
        echo 
"<tr><td width='100'><b> Betreff:</b></td></td></tr></table></td>";
        echo 
"<td width='100'><b> Absender:</b></td>";
        echo 
"<td width='250'><b> Verschieben in Ordner:</b></td>";
        echo 
"<td width='80'><b> Löschen:</b></td></tr></table>";

        echo 
"<table>";
        echo 
"<tr>";
        echo 
"<td width='400'>";
        echo 
"<table border='0' cellspacing='0' cellpadding='0' width='100%'>";
        echo 
"<tr><td width='100'><font color= #ff0000>!*</font><a href=#test>Testnachricht</a> (03Jun06 2:57 pm)</td></td></tr></table></td>";
        echo 
"<td width='100'><a href=#testuser>Testuser</a> [<a href=#pfeil>-></a>]</td>";
        echo 
"<td width='250'><form method=post <select name=\"move2folder\"></select><input type='submit' value='Verschieben'></form></td>";
        echo 
"<td width='80'><a href=#loeschen>Löschen</a></td></tr></table>";

        echo 
"<table>";
        echo 
"<tr>";
        echo 
"<td width='400'>";
        echo 
"<table border='0' cellspacing='0' cellpadding='0' width='100%'>";
        echo 
"<tr><td width='100'><font color= #ff0000>!</font><a href=#test1>Testnachricht1</a><font color= #808080><small><b> beantwortet am:</b> (01Jun06 1:02 pm)</font></small></td></td></tr></table></td>";
        echo 
"<td width='100'><a href=#testuser>Testuser16</a> [<a href=#pfeil>-></a>]</td>";
        echo 
"<td width='250'><right><form method=post <select name=\"move2folder\"></select><input type='submit' value='Verschieben'></form></right></td>";
        echo 
"<td width='80'><a href=#loeschen>Löschen</a></td></tr></table><br>";

        echo 
"<a href=#anfang>Seitenanfang</a><br><br>";
        echo 
"<h4><center>Was bedeuten die Zeichen vor und hinter den Nachrichten?</center></h4><br><br> - Das <b><font color= #ff0000>!</font></b> vor einer Nachricht erscheint, wenn der Absender die Nachricht als <b>dringend</b> markiert hat.<br><br> - Das <b><font color= #ff0000>*</font></b> vor der Nachricht zeigt an, das die Nachricht noch nicht gelesen wurde. Sobald die Nachricht gelesen wurde verschwindet<br>    das <b><font color= #ff0000>*</font></b> und der Absender erhält die Information, dass die Nachricht gelesen wurde.<br><br>";
        echo 
" - Die Daten hinter der Nachricht geben an, wann die Nachricht erhalten bzw. gesendet wurde. Ausserdem wird in einer anderen<br>    Farbe angezeigt ob und wann eine Nachricht beantwortet wurde.<br><br><center><h4>Wie kann ich eine Nachricht öffnen?</center></h4><br><br>Um eine Nachricht zu lesen muss man auf den <b>Betreff</b> der Nachricht klicken, die geöffnet werden soll. Anschliessend wird die Nachricht<br>in einem neuen Fenster dargestellt.<br><br><center><h4>Nachrichten in andere Ordner verschieben!</center></h4><br><br>";
    }
}
else
{
    echo 
'Du must registriert und angemeldet sein um das Message-System nutzen zu können!';
}


Die bestehende Wacko-MySQL-Datenbank muss um die folgenden 2 Tabellen erweitert werden. Den Präfix für die Tabellen entsprechend ändern falls erforderlich.


CREATE TABLE wacko_messenger (
  message_id INT(10NOT NULL AUTO_INCREMENT,
  user_to_id INT(10) UNSIGNED NOT NULL DEFAULT '0',
  repliedto TINYINT(1DEFAULT '0',
  folder TINYTEXT NOT NULL,
  user_from_id INT(10) UNSIGNED NOT NULL DEFAULT '0',
  urgent TINYINT(1DEFAULT NULL,
  subject MEDIUMTEXT NOT NULL,
  message LONGTEXT NOT NULL,
  fltr1 TINYINT(1DEFAULT '0',
  fltr2 TINYINT(1DEFAULT '0',
  fltr3 TINYINT(1DEFAULT '0',
  status TEXT NOT NULL,
  datesent DATETIME NULL DEFAULT NULL,
  viewrecipient TINYINT(1DEFAULT '1',
PRIMARY KEY (message_id)
);

CREATE TABLE wacko_messenger_info (
  msg_info_id INT(10NOT NULL AUTO_INCREMENT,
  owner_id INT(10) UNSIGNED NOT NULL DEFAULT '0',
  type TINYTEXT NOT NULL,
  info TINYTEXT NOT NULL,
  notes TINYTEXT,
PRIMARY KEY (msg_info_id)
);

3. Notify there are messages in the Box


You might wish to have a little icon appearing besite your Username after loging in, if you have still messages in your inbox. Here is a codesnippet wo do this for you.


Die nachfolgende Codezeile kann z.B. in die header.php eingefügt werden. Bekommt der Nutzer eine neue Nachricht, wird das dann an der entsprechende Stelle angezeigt sobald er sich anmeldet.



<?php
if ($this->db->load_all(
         
"SELECT status
         FROM 
{$this->db->table_prefix}messenger
         WHERE user_to_id = " 
. (int) $this->get_user_id() . "
             AND folder = 'inbox'
             AND status = 'pending'
             AND viewrecipient = '1'
         LIMIT 1"
)) != 0)
{
         echo 
'<a title="Du hast neue Nachrichten."><span class="cite"><strong>Neue Nachricht</strong></span></a>';
}

4. ToDo

  • localization
  • refactoring
  • table optimization
  • template
  • using wacko internal pagination
  • put it in community repo

Comments

  1. English version of text

    A simple wiki messenger that allows registered users to write messages within the wiki.

    Furthermore, you have the option to keep a contact list and create your own folders to receive the messages
    manage accordingly.
    The sender can mark messages and is informed whether a message has been read.
    A line of code is also prepared, which can be integrated in the header.php – to the user immediately after registration
    to indicate in the wiki that he has received new messages.

    The code is based on the Wikka Mail script and has only been slightly adapted and translated.
    The filter function has been completely removed because it is only of limited use or useful. Mail was renamed Messenger because of the confusion.
    The function delete messages has also been revised because the messages in the original code are not from the database
    have been deleted, but simply no longer appear in the inbox. The message is then no longer in the
    Inbox, but an enormous database is building up – since the messages weren't really deleted.

    The implemented help for the Wiki Messenger is not yet completely finished, but will be completed shortly.
    But since almost all functions are self-explanatory, there is nothing to prevent them from being used.

    To install the message system, the existing SQL table must be expanded by two entries and the
    subsequent php file are copied to the /action folder
    Messenger is called in the wiki with {{messenger}}

    This script must be saved under the name messenger.php and copied into the / action folder.
    • bear
    • 06.07.2020 15:12 edited
  2. 2 Quick questions?

    1. What two fields tables are we adding to what database?
    2. Is this mod English or German?
    • bear
    • 07.07.2020 08:03 edited
  3. The raw version works again

    Now we have a working dummy for testing and evaluation. The code is still quite a mess. I added all open tasks to ToDo above.

    For testing (even it is all still in German)
    • create both tables
    • copy the action in the action/ folder




    • WikiAdmin
    • 10.07.2020 16:02 edited