mirror of
https://gitlab.com/siarp/beethoven2000.de.git
synced 2026-08-07 19:18:18 +00:00
154 lines
3.8 KiB
PHP
154 lines
3.8 KiB
PHP
<?php
|
|
|
|
require('message.inc');
|
|
|
|
|
|
class Shoutbox extends Message {
|
|
|
|
private $path_to_file = '';
|
|
private $entry_lines = array();
|
|
private $file_resource;
|
|
|
|
|
|
/**
|
|
* Setzt das Attribut $path_to_file auf den übergebenen Wert.
|
|
*/
|
|
function __construct ($path_to_file) {
|
|
$this->path_to_file = $path_to_file;
|
|
}
|
|
|
|
|
|
/**
|
|
* Liest die Datenbank-Textdatei in das Attribut $entry_lines.
|
|
* - überprüft, ob file resource vorhanden und setzt entweder den zeiger auf 0 oder öffnet neue
|
|
* - liest aus der Datei das array aus und dreht es um (ACHTUNG: noch mit Zeilenenden)
|
|
*/
|
|
function read_file () {
|
|
|
|
if ($this->file_resource) {
|
|
fseek($this->file_resource, 0);
|
|
}
|
|
else {
|
|
$this->file_resource = fopen($this->path_to_file, 'r');
|
|
|
|
if (!$this->file_resource) {
|
|
$this->error = true;
|
|
return false;
|
|
}
|
|
|
|
flock($this->file_resource, LOCK_EX);
|
|
}
|
|
|
|
$this->entry_lines = file($this->path_to_file);
|
|
|
|
if ($this->entry_lines === false) {
|
|
$this->error = true;
|
|
return false;
|
|
}
|
|
|
|
$this->entry_lines = array_reverse($this->entry_lines);
|
|
|
|
// remove lines with incorrect syntax or comments
|
|
$count_entry_lines = count($this->entry_lines); // necessary because count is changed by unsetting entries
|
|
for ($i = 0; $i < $count_entry_lines; $i++) {
|
|
if (!preg_match('~^\d{10}\t.+?\t.+$~', $this->entry_lines[$i])) {
|
|
unset($this->entry_lines[$i]);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Gibt den nächsten Eintrag zurück.
|
|
* - gibt je Aufruf eine Zeile als Array zurück
|
|
* - EOF gibt false zurück
|
|
* - ähnlich wie mysql_fetch_row
|
|
*/
|
|
function get_next_entry ($date_format = 'j.n.y') {
|
|
|
|
// eine Zeile
|
|
$entry = current($this->entry_lines);
|
|
next($this->entry_lines);
|
|
|
|
// ende
|
|
if ($entry === false) {
|
|
return false;
|
|
}
|
|
|
|
$entry = trim($entry);
|
|
|
|
$result = explode("\t", $entry);
|
|
|
|
// date
|
|
$result[0] = date($date_format, $result[0]);
|
|
|
|
// body: maskierte new lines demaskieren und breaks anfügen
|
|
$result[2] = preg_replace('~(\\\n)+~', "<br />\n", $result[2]);
|
|
|
|
return $result;
|
|
}
|
|
|
|
|
|
/**
|
|
* Speichert einen neuen Eintrag.
|
|
* - öffnet Datei zum schreiben (anhängen)
|
|
* - schreibt die Eingabe in die letzte Zeile
|
|
* - gibt bei Erfolg true zurück
|
|
*/
|
|
function add_entry ($sender, $message) {
|
|
|
|
if ($this->contains_spam_hints($sender . $message, array($sender))) {
|
|
return false;
|
|
}
|
|
|
|
$this->file_resource = fopen($this->path_to_file, 'a+');
|
|
|
|
if (!$this->file_resource) {
|
|
//$this->error = true; // Wird hier ein Fehler gesetzt, geht wird auch das Anzeigen der shoutbox unterbunden.
|
|
return false;
|
|
}
|
|
|
|
flock($this->file_resource, LOCK_EX);
|
|
|
|
$sender = substr($sender, 0, 25); // auf 25 Zeichen beschränken
|
|
$sender = preg_replace(array("~\t~", '~<~', '~>~'), array(' ', '<', '>'), $sender);
|
|
|
|
$message = substr($message, 0, 220); // auf 220 Zeichen beschränken
|
|
// TODO Lange Wörter richtig umbrechen und zwar in der Ausgabe, nicht der Eingabe.
|
|
// $message = wordwrap($message, 30, '-'); // nach 30 Zeichen mit '-' umbrechen
|
|
$message = preg_replace(array("~\n~", "~\r~"), array('\n', ''), $message); // new line in \n maskieren
|
|
$message = preg_replace(array("~\t~", '~<~', '~>~'), array(' ', '<', '>'), $message);
|
|
|
|
$entry = "\n" . time() . "\t" . $sender . "\t" . $message;
|
|
|
|
fwrite($this->file_resource, $entry);
|
|
|
|
|
|
/* __mail__ */
|
|
|
|
$to = 'Martin Stadler <martin@siarp.de>';
|
|
$subject = utf8_decode('Neuer Eintrag in der Gruß-Box');
|
|
$body =
|
|
'Name:' . $sender . "\n" .
|
|
'Nachricht: ' . "\n" . preg_replace('~(\\\n)+~', "\n", $message);
|
|
$body = utf8_decode(preg_replace('~\r~', '', $body)); // prepare_for_db
|
|
$from = 'From: Beethoven2000 Gruß-Box <gruss-box@beethoven2000.de>';
|
|
|
|
mail($to, $subject, $body, $from);
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Schließt die Datei.
|
|
*/
|
|
function __destruct () {
|
|
fclose($this->file_resource);
|
|
}
|
|
}
|
|
|
|
?>
|