summaryrefslogtreecommitdiff
path: root/0.8.1
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2013-04-06 13:14:47 +0200
committerPaul Buetow <paul@buetow.org>2013-04-06 13:14:47 +0200
commit630af0ed6c0af69c7df2e45aef7a87722a3c00c0 (patch)
treead76f850278b090f7e5c26561035d19c320400cc /0.8.1
parent2860b03f00e48264ed15c132ad90b240ebe6070b (diff)
tagging ychat-perl-legacyychat-perl-legacy
Diffstat (limited to '0.8.1')
-rwxr-xr-x0.8.1/config.pm43
-rwxr-xr-x0.8.1/data/hierachie12
-rwxr-xr-x0.8.1/modules/changeroom.pm67
-rwxr-xr-x0.8.1/modules/commands.pm867
-rwxr-xr-x0.8.1/modules/divcom.pm288
-rwxr-xr-x0.8.1/modules/hierachie.pm77
-rwxr-xr-x0.8.1/modules/htdocs.pm127
-rwxr-xr-x0.8.1/modules/input.pm14
-rwxr-xr-x0.8.1/modules/loggedin.pm41
-rw-r--r--0.8.1/modules/nohup.out2
-rwxr-xr-x0.8.1/modules/online.pm167
-rwxr-xr-x0.8.1/modules/postmessage.pm90
-rwxr-xr-x0.8.1/modules/shared.pm353
-rwxr-xr-x0.8.1/modules/start.pm264
-rwxr-xr-x0.8.1/modules/statistic.pm148
-rwxr-xr-x0.8.1/modules/stream.pm170
-rwxr-xr-x0.8.1/modules/webchat.pm22
-rwxr-xr-x0.8.1/modules/ychatd.pl94
-rwxr-xr-x0.8.1/setup.sh19
-rwxr-xr-x0.8.1/templates/chatiq.sno1
-rwxr-xr-x0.8.1/templates/colors.sno290
-rwxr-xr-x0.8.1/templates/help.sno79
-rwxr-xr-x0.8.1/ychatd.pl94
23 files changed, 3329 insertions, 0 deletions
diff --git a/0.8.1/config.pm b/0.8.1/config.pm
new file mode 100755
index 0000000..3b3007f
--- /dev/null
+++ b/0.8.1/config.pm
@@ -0,0 +1,43 @@
+# yChat - Copyright by Paul C. Bütow
+########################### Dieser Teil bestimmt die Standart-Variabeln.
+##STANDART-CONFIGURATION:## (CSS, Farben, Version etc.)
+###########################
+$limit = 50; # Benutzerlimit
+$datum = "19.02.03"; # Datum der letzten Änderung (ändern erwünscht)
+$version = "0.8.1"; # Bitte Hauptversionsnummer nicht ändern
+$title = "yChat [$version]"; # Erscheint in der Browser-Leiste oben
+$standardroom = "Cyberbar"; # Standardchatraum
+$loginplace = "Lounge"; # Bezeichnung der Startseite nach dem Login
+$localhost = "62.75.136.147";# Host oder IP# des Chat-Servers
+$localport = 2000; # Port über den fer Chat-Server läuft
+$gfxpath = "http://$localhost/yChat"; # URL der Binärdaten (Grafiken etc.)
+$bgcolor = "#3E535B"; # Hintergrundfarbe der HTML-Seiten
+$chatbg = "#000000"; # Hintergrundfarbe des Chat-Frames
+$cryptkey = "ka:jASD73jnS"; # Hiermit wetden die PW's verschlüsselt.
+
+# PS: Um einen Chat-Administrator anzulegen, dann die Datei data/hierachie
+# anlegen, in eine Zeile muß folgendes eingetragen werden: "Nickname<;7"
+# (Natürlich ohne Anführungsstriche) Nickname ist somit Chat-Administrator
+# und kann Oberwächter und Wächter bestimmen!
+
+sub style {
+print <<ENDCSS;
+<style type="text/css">
+ body { background-color: $bgcolor }
+ body.blank { background-color: $chatbg }
+ body.online { background-color: $chatbg }
+ div { font-family: arial, geneva, verdana, helvetiva; font-size: 12px; color: #ffffff }
+ div.b { font-weight: bold; color: #ffa500 }
+ a { color: #ffffef; }
+ a:hover { color: #ffffff; }
+ p { font-family:verdana, arial, geneva, helvetica, sans-serif; color:#FFFFFF; font-size:12px; }
+</style>
+<style type="text/css" media="all">
+ a { text-decoration: none; }
+ a:hover { text-decoration:underline; }
+ input { border:2px solid #000000; font-size:12px; color:#000000; background-color: #ffffff; height:23px; padding:2px;}
+ select { border:2px solid #000000; font-family:arial, verdana, helvetica; font-size:11px; color:#000000; height:21px; padding:2px;}
+</style>
+ENDCSS
+}
+1;
diff --git a/0.8.1/data/hierachie b/0.8.1/data/hierachie
new file mode 100755
index 0000000..8f5f747
--- /dev/null
+++ b/0.8.1/data/hierachie
@@ -0,0 +1,12 @@
+red_pepper<;2
+Snoop<;3
+Lantara<;8
+SMX<;5
+bilke<;6
+Stoffel<;6
+Romeo3008<;5
+Chatter<;5
+Cozmo<;7
+Snooper<;9
+Tekkie<;7
+Peacemaker<;7
diff --git a/0.8.1/modules/changeroom.pm b/0.8.1/modules/changeroom.pm
new file mode 100755
index 0000000..4a5e787
--- /dev/null
+++ b/0.8.1/modules/changeroom.pm
@@ -0,0 +1,67 @@
+sub change_room {
+ my($method, $newroom, $oldroom, $alias2) = @_;
+ if ($newroom eq $oldroom) {
+ &post_prv($alias, "<font color='ffffff'>Du befindest dich bereits im Raum <font color='ffa500'>$newroom</font>!</font>");
+ &reload_html;
+ }
+ elsif ($newroom eq $loginplace) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat und geht in die <b>$loginplace</b> ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ open RSTAT, "<data/online/rstat/$newroom";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ if ($rstat[0] eq "1\n") {
+ if (3 <= &hierachie($alias)) {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$newroom</font> ist leider abgesperrt!</font>");
+ &reload_html;
+ }
+ }
+ &private_javascript($alias, $room, "parent.input.document.inf.room.value = '$newroom';open('chat?request=online&room=$newroom&alias=$alias&tmpid=$tmpid','online');");
+ open MSGFILE, ">>data/msgs/$newroom";
+ print MSGFILE "$alias<;" . time . "<;!<;!<;<;\n";
+ close MSGFILE;
+ open MSGFILE, ">>data/msgs/$room";
+ if ($method eq 'j') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'ju') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du folgst <font color='".&get_ident($alias2,3)."'>$alias2</font> aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i><br><;\n";
+ }
+ elsif ($method eq 'sep') {
+ print MSGFILE "$alias<;" . time . q[<;!<;!<;<i><font color='ffffff'>] . &timestring . " Du wechselst aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrst ab...</font></i><br><;\n";
+ }
+ close MSGFILE;
+ &post_strmsg($alias, $room, 'cr', $newroom);
+ $room = $oldroom;
+ my $tmpstamp = time;
+ if ($method eq 'j') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'ju') {
+ my $col2 = &get_ident($alias2,3);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> folgt <font color='$col2'>$alias2</font> in den Raum <b>$newroom</b> ...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> und folgt <font color='$col2'>$alias2</font> herein nach <b>$newroom</b> ...</font></i>", $alias);
+ }
+ elsif ($method eq 'sep') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> kommt aus dem Raum <b>$oldroom</b> herein nach <b>$newroom</b> und sperrt ab...</font></i>", $alias);
+ }
+ elsif ($method eq 'beam') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> in den Raum <b>$newroom</b>...</font></i>", $alias2);
+ $room = $newroom;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias2</font> beamt <b>$alias</b> aus dem Raum <b>$oldroom</b> herein nach <b>$room</b>...</font></i>", $alias2);
+ }
+ unlink "data/online/rooms/$oldroom/$alias";
+ &rm_rstat($alias, $oldroom);
+ &check_online;
+}
+1;
diff --git a/0.8.1/modules/commands.pm b/0.8.1/modules/commands.pm
new file mode 100755
index 0000000..8d6211b
--- /dev/null
+++ b/0.8.1/modules/commands.pm
@@ -0,0 +1,867 @@
+sub command {
+ $_[0] = $_[0] . ' ';
+ $_[0] = substr($_[0], 1, length($_[0]) - 1);
+ my(@cmd) = split(/ /, $_[0], 0);
+ my $cmd = substr($_[0], 0, index($_[0], ' '));
+ my $tmp = $_[1];
+ sub lock {
+ my $method = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $lock = "0\n";
+ if ($room eq $standardroom) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ohne Erfolg ab ...</font></i>", $alias);
+ }
+ else {
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum ab ...</font></i>", $alias) if $method ne 'separee';
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum auf ...</font></i>", $alias) if $method ne 'separee';
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ &reload_html;
+ }
+ if ($cmd eq 'about') {
+ &post_prv($alias, "<font color=ffffff>Aktuelle Version ist $title und wurde am $datum aktuallisiert. Programmiert von Paul C. B\374tow (2000 - 2002).</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'away') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $away_msg = $away_msg . ' ' . $cmd[$i];
+ }
+ my $room = &get_room($alias);
+ if ($tmp eq 'autoaway') {
+ $away_msg = "$alias wurde vom System agbemeldet ...";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> meldet <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivit&auml;t ab ...</i></font>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> meldet sich ab (<font color='$col'>$away_msg</font> ) ...</i></font>", $alias);
+ }
+ open AWAY, ">>data/online/rstat/$room.away";
+ print AWAY "$alias<;$away_msg\n";
+ close AWAY;
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'away'; parent.online.location.reload();]);
+ &reload_html;
+ }
+ elsif ($cmd eq 'clear') {
+ &post_prv($alias, "<script language='JavaScript'>window.open('chat?request=stream&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');</script>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'col') {
+ my $col, $secol;
+ if ($cmd[1] ne undef) {
+ $col = $cmd[1];
+ &prove_color($alias, $col);
+ my $tmpsecol = $cmd[2];
+ my $length = length $tmpsecol;
+ if ($tmpsecol eq '' or $length < 6 or $length > 6) {
+ $secol = $col;
+ }
+ else {
+ $secol = $tmpsecol;
+ }
+ }
+ else {
+ $col = &random_color;
+ $secol = &random_color;
+ }
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $options[0] . $col . "\n" . $secol;
+ close OPTIONS;
+ open IDENT, "<data/online/ident/$alias";
+ my(@ident) = <IDENT>;
+ close IDENT;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $ident[0] . $ident[1] . $ident[2] . "$col\n$secol";
+ close IDENT;
+ &post($room, '<i><font color=ffffff>' . &timestring . "</font> <font color=$col>$alias</font> <font color=$secol> hat die Farbe gewechselt...</font></i>", $alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &reload_html;
+ }
+ elsif ($cmd eq 'date') {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ &post_prv($alias, "<font color=ffffff>Heute ist der $days.$months. Jahr $years. Es ist genau $hours:$mins Uhr und $secs Sekunden.</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'exit') {
+ my $room = &get_room($alias);
+ if ($tmp eq 'autologout') {
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=autologout','_top');]);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='ffa500'><b>Das System</b></font> loggt <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivit&auml;t aus ... </font></i>", $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt sich ganz aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=quit','_top');]);
+ }
+ &rm_alias($alias, $room);
+ &rm_away($alias, $room);
+ &reload_html;
+ }
+ elsif ($cmd eq 'getcol') {
+ my $cols2show = $cmd[1];
+ if (-f "data/user/options/$cols2show") {
+ open FILE, "<data/user/options/$cols2show";
+ my(@file) = <FILE>;
+ close FILE;
+ chomp $file[1];
+ chomp $file[2];
+ &post_prv($alias, "<font color='ffa500'>$cols2show <font color='ffffff'> verwendet als 1. Farbe <font color='$file[1]'>$file[1]</font> und als 2. Farbe <font color='$file[2]'>$file[2]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$cols2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'hits' or $cmd eq 'uptime') {
+ &post_prv($alias, "<font color=ffffff>Uptime: $startime " . &calculate_uptime_hours($STARTIME) . "h; $HITS Hits; " . &calculate_hpm($HITS, $STARTIME) . ' Hits pro Minute</font>');
+ &reload_html;
+ }
+ elsif ($cmd eq 'ig') {
+ my $alias2ignore = $cmd[1];
+ if ($alias2ignore) {
+ if (-f "data/user/options/$alias2ignore") {
+ if (3 <= &hierachie($alias2ignore)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'> kann nicht ignoriert werden!</font>");
+ }
+ else {
+ &post_strmsg($alias, $room, 'ig', $alias2ignore);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ignore</font> <font color='ffffff'>existiert nicht in der Datenbank!</font>");
+ }
+ }
+ else {
+ &post_strmsg($alias, $room, 'igl');
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'j' or $cmd eq 'sep') {
+ if ($cmd[1] =~ /\W/ or $cmd[1] eq '') {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> enth\344lt illegale Zeichen!</font>");
+ &reload_html;
+ }
+ else {
+ if ($cmd eq 'j') {
+ &change_room('j', $cmd[1], $room);
+ &reload_html;
+ }
+ else {
+ if ($cmd[1] eq $standardroom) {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$cmd[1]</font> ist ein Standardraum und kann nicht als Separee er&ouml;ffnet werden!</font>");
+ }
+ else {
+ &change_room('sep', $cmd[1], $room);
+ &lock('separee');
+ }
+ &reload_html;
+ }
+ }
+ }
+ elsif ($cmd eq 'me' or $cmd eq 'm') {
+ my $me_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $me_msg = $me_msg . ' ' . $cmd[$i];
+ }
+ $me_msg =~ s[/me/][<i>$alias</i>]g;
+ $me_msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if ($cmd eq 'm') {
+ &post($room, "<b><font color=$col><i>$alias</i> <font color=$secol>$me_msg</font></font></b>", $alias);
+ }
+ else {
+ &post($room, "<b><font color=$col><i>$alias</i> $me_msg</font></b>", $alias);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'memo') {
+ my $alias2memo = $cmd[1];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if (-f "data/user/options/$alias2memo") {
+ my $memo_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $memo_msg = $memo_msg . ' ' . $cmd[$i];
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>wurde folgende memo erfolgreich hinterlassen: $memo_msg</font></font>");
+ open MEMO, ">>data/user/memos/$alias2memo";
+ print MEMO "<font color=ffffff>($days.$months.$years - $hours:$mins:$secs) <font color=$col>$alias</font> hat Dir eine Memo hinterlassen: <font color=ffa500>$memo_msg</font></font><br>\n";
+ close MEMO;
+ &reload_html;
+ }
+ &post_prv($alias, "<font color=ffa500>$alias2memo <font color=ffffff>existiert in der Datenbank nicht !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'menu') {
+ &private_javascript($alias, $room, "window.open('chat?request=htdocs&alias=$alias&var=menu_html&room=$standardroom&col=$col&secol=$secol&tmpid=$tmpid','_new','width=500,height=500,screenX=100,screenY=100,scrollbars');");
+ &reload_html;
+ }
+ elsif ($cmd eq 'online') {
+ my $alias2prove = $cmd[1];
+ my $totaltime = &get_online_time($alias2prove);
+ if ($totaltime ne false) {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>war insgesamt schon $totaltime Stunden online!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color=ffa500>$alias2prove <font color=ffffff>existiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'q') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verl&auml;sst den Chat ... </font></i>", $alias);
+ &post_strmsg($alias, $room, 'quit');
+ unlink "data/online/rooms/$room/$alias";
+ &rm_rstat($alias, $room);
+ &rm_away($alias, $room);
+ &check_online;
+ &reload_html;
+ }
+ elsif ($cmd eq 'rmgb') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das eigene G\344stebuch ...</font></i>", $alias);
+ unlink "data/user/gbooks/$alias";
+ &reload_html;
+ }
+ elsif ($cmd eq 's') {
+ my $msg2scream;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2scream = $msg2scream . ' ' . $cmd[$i];
+ }
+ $msg2scream =~ s/\344/\304/g;
+ $msg2scream =~ s/\366/\326/g;
+ $msg2scream =~ s/\374/\334/g;
+ $msg2scream = "\U$msg2scream\E";
+ &post($room, "<b><font color=$col><i>$alias schreit:</i> <font color=$secol>$msg2scream</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'seen') {
+ my $alias2prove = $cmd[1];
+ if (-f "data/user/options/$alias2prove") {
+ if (-f "data/user/lastlogin/$alias2prove") {
+ open LASTLOGIN, "<data/user/lastlogin/$alias2prove";
+ my $lastlogin = <LASTLOGIN>;
+ close LASTLOGIN;
+ my $timestamp = sprintf('%.2f', (time - $lastlogin) / 3600);
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich vor $timestamp Stunden zuletzt in das System eingeloggt!</font></font>");
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> hat sich seit der Einf\374hrung dieses Befehls noch nie eingeloggt!</font></font>");
+ }
+ }
+ else {
+ &post_prv("$alias", "<font color='ffa500'>$alias2prove <font color=ffffff> exsistiert nicht in der Benutzerdatenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'selfkill') {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> entfernt sich ganz und gar aus dem System und loggt sich aus ... </font></i>", $alias);
+ &private_javascript($alias, $room, q[open('chat?request=start&tmp=selfkill','_top');]);
+ &kill_alias($alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'w') {
+ my $theme = &get_theme($room);
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my($is, $nr) = ('t', 0);
+ my $persons;
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-f "data/online/rooms/$room/$_") {
+ $persons = $persons . ' ' . "<font color='".&get_ident($_,3)."'>$_</font>";
+ ++$nr;
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Der aktuelle <b>Raum:</b> $room $theme $door ($nr): $persons</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'wc' or $cmd eq 'wc/') {
+ my $raum = $cmd[1];
+ my $persons;
+ if ($raum eq '' and $cmd eq 'wc') {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ close USERS;
+ foreach $_ (@users) {
+ $persons = $persons . ' ' . "<font color='".&get_ident($_,3)."'>$_</font>" if -f "data/online/users/$_";
+ }
+ my $nr = $#users - 1;
+ my($nrs, $is) = ('', 'ist');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'sind';
+ }
+ &post_prv("$alias", "<font color=ffffff>$nr Person$nrs $is insgesamt eingeloggt: $persons</font>");
+ }
+ elsif ($raum eq '' and $cmd eq 'wc/') {
+ my $msg2post;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ opendir DIR, "data/online/rooms/$_";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ open RSTAT, "<data/online/rstat/$_";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+ my $nr = $#dir2 - 1;
+ $msg2post = $msg2post . "<tr><td><b><font size=2 color='ffffff'>$_ $door ($nr) [" . $rstat[1] . q(]: </font></b></td></tr><tr><td><font size=2 color='ffa500'>);
+ foreach $chatter (@dir2) {
+ $msg2post = $msg2post . "<font color='".&get_ident($chatter,3)."'>$chatter</font> " if -f "data/online/rooms/$_/$chatter";
+ }
+ print '</font></td>';
+ }
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende R&auml;ume sind offen:</font><table>$msg2post</table>");
+ }
+ elsif ($raum ne '') {
+ my $persons;
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ $persons = $persons . ' ' . "<font color='".&get_ident($chatter,3)."'>$_</font>" if -f "data/online/rooms/$raum/$_";
+ }
+ my($nr, $is) = ($#dir - 1, 't');
+ if ($nr != 1) {
+ $nrs = 'en';
+ $is = 'n';
+ }
+ &post_prv($alias, "<font color=ffffff> $nr Person$nrs befinde$is sich im Raum <b>$raum</b> $persons</font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wj' or $cmd eq 'ju') {
+ my $alias2search = $cmd[1];
+ my $roomofalias = &get_room($alias2search);
+ if ($roomofalias) {
+ if ($cmd eq 'wj') {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff>befindet sich im Raum <b>$roomofalias</b> !</font></font>");
+ }
+ else {
+ &change_room('ju', $roomofalias, $room, $alias2search);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2search <font color=ffffff> ist nicht eingeloggt!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (1 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'l') {
+ &lock;
+ }
+ elsif ($cmd eq 'su') {
+ my $alias2su = $cmd[1];
+ opendir DIR, "data/online/rooms/$room";
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2su) {
+ open DATEI, "<data/online/rstat/$room";
+ my(@rstat) = <DATEI>;
+ close DATEI;
+ if (1 <= hierachie($alias2su, $room)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color='ffffff'> kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, W\304 oder OW)</font>");
+ &reload_html;
+ }
+ open RSTAT, ">>data/online/rstat/$room";
+ print RSTAT "$alias2su<;1\n";
+ close RSTAT;
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> verleiht <font color='".&get_ident($alias2su,3)."'>$alias2su</font> Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2su</font> <font color=ffffff> kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)</font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rsu') {
+ my $alias2rsu = $cmd[1];
+ if (1 == hierachie($alias2rsu, $room)) {
+ &rm_rstat($alias2rsu, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entzieht <font color='".&get_ident($alias2rsu,3)."'>$alias2rsu</font> die Raumbesetzerrechte ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rsu <font color='ffffff'>ist gar kein Raumbesetzer!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 't') {
+ open RSTAT, "data/online/rstat/$room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ my $theme;
+ if ($cmd[1] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, q[<i><font color='ffffff'>] . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums ...</font></i>", $alias);
+ }
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i] . "\n";
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT $theme;
+ close RSTAT;
+ &reload_html;
+ }
+ elsif (3 <= &hierachie($alias, $room)) {
+ if ($cmd eq 'ban' or $cmd eq 'banip') {
+ my $alias2ban = $cmd[1];
+ my $hierachie = &hierachie($alias2ban);
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ if ($cmd[1] eq undef) {
+ my $nr = @ban;
+ my $banned;
+ foreach $_ (@ban) {
+ chomp $_;
+ $banned .= " $_";
+ }
+ &post_prv($alias, "<font color=ffffff>Folgende Benutzer sind verbannt [$nr]: <font color='ff0000'>$banned</font></font>");
+ &reload_html;
+ }
+ elsif (-f "data/user/options/$alias2ban") {
+ if (3 <= $hierachie) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color='ffffff'>kann nicht verbannt werden!</font></font>");
+ &reload_html;
+ }
+ if ($cmd eq 'ban') {
+ if (&add_entry($alias2ban, 'ban') == 1) {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> verbannt <b>$alias2ban</b> aus dem Chat ...</font></i>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff>ist bereits verbannt!</font></font>");
+ }
+ }
+ elsif ($cmd eq 'banip') {
+ open DATEI, "<data/online/ident/$alias2ban";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ if (add_entry("ip://$ipnr", 'ban') == 1) {
+ &post_prv($alias, "<font color='ffffff'>IP-Nummer von <font color='ffa500'>$alias2ban</font> (<font color='ff0000'>$ipnr</font>) wurde verbannt!</font></i>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$ipnr</font> von <font color='ffa500'>$alias2ban</font> ist bereits verbannt!</font></font>");
+ }
+ &reload_html;
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2ban <font color=ffffff> kann nicht verbannt werden, da Benutzername nicht existiert!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'rban' or $cmd eq 'rbanip') {
+ my $alias2rban = $cmd[1];
+ open BAN, '<data/ban';
+ @ban = <BAN>;
+ close BAN;
+ foreach $ban (@ban) {
+ if (&rm_entry($alias2rban, 'ban') == 1) {
+ if ($alias2rban =~ /ip:/) {
+ &post_prv($alias, "<font color='ffffff'>Die IP-Nummer <font color='ff0000'>$alias2rban</font> wurde aus der Banliste ausgetragen!</font></font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> entbannt <font color='".&get_ident($alias2rban,3)."'>$alias2rban</font> ...</font></i>", $alias);
+ }
+ &reload_html;
+ }
+ }
+ &post_prv($alias, "<font color='ff0000'>$alias2rban <font color='ffffff'>ist nicht verbannt!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'img') {
+ my $hierachie = &hierachie($alias, $room);
+ &hierachie_rm($alias);
+ if ($hierachie == 3) {
+ &post_prv($alias, q[<font color='ffffff'>Als tempor&auml;rer W&auml;chter kannst du dein Superuserlogo nicht verstecken!</font>]);
+ }
+ elsif ($hierachie % 2 > 0) {
+ &post_prv($alias, q[<font color='ffffff'>Dein Superuserlogo wurde versteckt!</font>]);
+ &hierachie_add($alias, $hierachie + 1);
+ }
+ else {
+ &post_prv("$alias", q[<font color='ffffff'>Dein Superuserlogo wurde wieder sichtbar gemacht!</font></font>]);
+ &hierachie_add($alias, $hierachie - 1);
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ip') {
+ my $alias2prove = $cmd[1];
+ opendir DIR, 'data/online/ident';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach $_ (@dir) {
+ if ($_ eq $alias2prove) {
+ open DATEI, "<data/online/ident/$alias2prove";
+ my $ipnr = <DATEI>;
+ close DATEI;
+ chomp $ipnr;
+ &post_prv($alias, "<font color='ffa500'>$_<font color='ffffff'> hat die IP-Nummer <font color='ff0000'>$ipnr</font> !</font></font>");
+ }
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'k' or $cmd eq 'o') {
+ my $alias2kick = $cmd[1];
+ if (-f "data/online/users/$alias2kick") {
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $raum (@dir) {
+ opendir DIR, "data/online/rooms/$raum";
+ my(@dir2) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@dir2) {
+ if ($chatter eq $alias2kick) {
+ my $hierachie2 = &hierachie($alias2kick);
+ if (&hierachie($alias) <= &hierachie($alias2kick)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> besitzt einen h&ouml;heren oder gleichen Rang und kann nicht gekickt/ausgeloggt werden!</font></font>");
+ }
+ else {
+ if ($cmd eq 'k') {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=kick","_top");</script>');
+ }
+ else {
+ &post_prv($alias2kick, '<script language="JavaScript">window.open("chat?request=start&tmp=logout","_top");</script>');
+ }
+ $_ = undef if $room eq $raum;
+ if ($cmd eq 'k') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> katapultiert <font color='".&get_ident($alias2kick,3)."'>$alias2kick</font> aus dem Chat ...</font></i>", $alias, $raum);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> loggt <font color='".&get_ident($alias2kick,3)."'>$alias2kick</font> aus dem Chat aus ...</font></i>", $alias, $alias);
+ }
+ &rm_alias($alias2kick, $raum);
+ &check_online;
+ }
+ &reload_html;
+ }
+ }
+ }
+ }
+ &post_prv($alias, "<font color='ffa500'>$alias2kick <font color='ffffff'> ist nicht anwesend und kann nicht aus dem System katapultiert werden werden!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'sl') {
+ my $sl_room = $cmd[1];
+ if (-e "data/online/rooms/$sl_room") {
+ my $lock = "0\n";
+ open RSTAT, "<data/online/rstat/$sl_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ if ($r_stat[0] == 0) {
+ $lock = "1\n";
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen ab ...</font></i>", $alias, $sl_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> sperrt den Raum <b>$sl_room</b> von aussen auf ...</font></i>", $alias, $sl_room);
+ }
+ for ($i = 1; $i <= $#r_stat; ++$i) {
+ $lock = $lock . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$sl_room";
+ print RSTAT $lock;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$sl_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'ss') {
+ my $ss_room = $cmd[1];
+ if (-e "data/online/rooms/$ss_room") {
+ my $ss_msg;
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $ss_msg = $ss_msg . ' ' . $cmd[$i];
+ }
+ my $msg2scream = "\U$ss_msg\E";
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> ruft in den Raum <b>$ss_room</b> hinein: <b><font color=$col>$msg2scream</font></b> ...</font></i>", $alias, $ss_room);
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffffff'>Der Raum <font color='ffa500'>$ss_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'st') {
+ my $st_room = $cmd[1];
+ if (-e "data/online/rooms/$st_room") {
+ my $theme;
+ if ($cmd[2] ne undef) {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $theme = $theme . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . qq[ <font color='$col'>$alias</font> gibt dem Raum <b>$st_room</b> das Thema "<font color='$col'>$theme</font>" ...</font></i>], $alias, $st_room);
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> l\366scht das Thema des Raums <b>$st_room</b> ...</font></i>", $alias, $st_room);
+ }
+ open RSTAT, "<data/online/rstat/$st_room";
+ my(@r_stat) = <RSTAT>;
+ close RSTAT;
+ $theme = $r_stat[0] . $theme . "\n";
+ for ($i = 2; $i <= $#r_stat; ++$i) {
+ $theme = $theme . $r_stat[$i];
+ }
+ open RSTAT, ">data/online/rstat/$st_room";
+ print RSTAT $theme;
+ close RSTAT;
+ }
+ else {
+ &post_prv($alias, "<font color=ffffff>Der Raum <font color=ffa500>$st_room</font> existiert nicht!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'status') {
+ my $alias2level = $cmd[1];
+ &post_prv($alias, "<font color='ffa500'>$alias2level <font color='ffffff'>hat den Superuserstatus <font color='ff0000'>".&hierachie($alias2level, &get_room($alias2level))."</font> !</font></font>");
+ &reload_html;
+ }
+ elsif (7 <= &hierachie($alias)) {
+ if ($cmd eq 'kill') {
+ my $alias2kill = $cmd[1];
+ if (-f "data/user/options/$alias2kill") {
+ if (7 <= &hierachie($alias2kill)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill</font> <font color='ffffff'>hat einen h&ouml;heren Rang und kann nicht aus dem System entfernt werden !</font>");
+ }
+ else {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col>$alias</font> killt <b>$alias2kill</b> ganz und gar aus dem System ...</font></i>", $alias);
+ &kill_alias($alias2kill, $alias);
+ }
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2kill <font color='ffffff'> existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'sys') {
+ my $sys_msg;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $sys_msg = $sys_msg . ' ' . $cmd[$i];
+ }
+ $sys_msg = q[<i><font color='ffffff'>] . &timestring . " </font></i> <b><font size=2 color='red'>SYSTEMNACHRICHT</font></b><i><font color='ffffff'>: $sys_msg ...</font></i>";
+ opendir ROOMS, 'data/msgs';
+ my(@rooms) = readdir ROOMS;
+ close ROOMS;
+ foreach $_ (@rooms) {
+ &post($_, $sys_msg, $alias) unless /\./;
+ }
+ &log($sys_msg);
+ &reload_html;
+ }
+ elsif ($cmd eq 'twa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ my $room2 = &get_room($alias2wa);
+ if (3 <= &hierachie($alias2wa, $room2)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum tempor&auml;ren W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add_rstat($alias2wa, 3, $room2);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum <font color='ff0000'>tempor&auml;ren</font> W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rtwa') {
+ my $alias2rwa = $cmd[1];
+ my $room2 = &get_room($alias2rwa);
+ if (3 == &hierachie($alias2rwa, $room2)) {
+ &hierachie_rm_rstat($alias2rwa, $room2);
+
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom <font color='ff0000'>tempor&auml;ren</font> W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein tempor&auml;rer W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'wa') {
+ my $alias2wa = $cmd[1];
+ if (-f "data/user/options/$alias2wa") {
+ if (5 <= &hierachie($alias2wa)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color='ffffff'>kann nicht zum W&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2wa, 5);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum W\344chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'rwa') {
+ my $alias2rwa = $cmd[1];
+ my $hierachie = &hierachie($alias2rwa);
+ if (5 == $hierachie or 6 == $hierachie) {
+ &hierachie_rm($alias2rwa);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom W\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2rwa <font color=ffffff>ist kein W\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif (9 <= &hierachie($alias)) {
+ if ($cmd eq 'ow') {
+ my $alias2ow = $cmd[1];
+ if (-f "data/user/options/$alias2ow") {
+ if (7 <= &hierachie($alias2ow)) {
+ &post_prv($alias, "<font color='ffa500'>$alias2ow <font color='ffffff'>kann nicht zum Oberw&auml;chter ernannt werden!</font></font>");
+ }
+ else {
+ &hierachie_add($alias2ow, 7);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2ow,3)."'>$alias2ow</font> zum Oberw&auml;chter ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ &reload_html;
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2wa <font color=ffffff>existiert nicht in der Datenbank!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'row') {
+ my $alias2row = $cmd[1];
+ my $hierachie = &hierachie($alias2row);
+ if (7 == $hierachie or 8 == $hierachie) {
+ &hierachie_rm($alias2row);
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2row,3)."'>$alias2row</font> vom Oberw\344chter zum normalen Chatter degradiert ...</font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$alias2row <font color=ffffff>ist kein Oberw\344chter und k\366nnen diese Rechte nicht entzogen werden!</font></font>");
+ }
+ &reload_html;
+ }
+ elsif ($cmd eq 'pw') {
+ my $pw2show = $cmd[1];
+ if (-f "data/user/options/$pw2show") {
+ open PW, "<data/user/options/$pw2show";
+ my(@pw) = <PW>;
+ close PW;
+ chomp $pw[0];
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> hat das Passwort <font color='ff0000'>$pw[0]</font> !</font></font>");
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$pw2show <font color='ffffff'> existiert nicht in der Benutzerdatenbank!</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'id' or $cmd eq 'agent') {
+ my $id2show = $cmd[1];
+ if (-f "data/online/ident/$id2show") {
+ if ($cmd eq 'id') {
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> hat die Temp-ID <font color='ff0000'>".&get_ident($id2show, 1)."</font> !</font></font>");
+ }
+ else {
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> verwendet <font color='ff0000'>".&get_ident($id2show, 2)."</font> !</font></font>");
+ }
+ &reload_html;
+ }
+ &post_prv($alias, "<font color='ffa500'>$id2show <font color='ffffff'> ist nicht eingeloggt !</font></font>");
+ &reload_html;
+ }
+ elsif ($cmd eq 'cool') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ &post($room, '<i><font color=ffffff>' . &timestring . " $msg2post</font></i>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'rev') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post = reverse($msg2post);
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'arks') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ $msg2post =~ s/i/1/gi;
+ $msg2post =~ s/e/3/gi;
+ $msg2post =~ s/a/4/gi;
+ $msg2post =~ s/s/5/gi;
+ $msg2post =~ s/g/6/gi;
+ $msg2post =~ s/t/7/gi;
+ $msg2post =~ s/b/8/gi;
+ $msg2post =~ s/o/0/gi;
+ &post($room, "<b><font color='$col'>$alias: <font color='$secol'>$msg2post</font></font></b>", $alias);
+ &reload_html;
+ }
+ elsif ($cmd eq 'ultra') {
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ my @letters = split '', "$alias: $msg2post";
+ $msg2post = undef;
+ foreach (@letters) {
+ $msg2post .= "<font color='".&random_color."'>$_</font>";
+ }
+ &post($room, "<b>$msg2post</b>", $alias);
+ &reload_html;
+ }
+ }
+ }
+ }
+ }
+ my($alias2post, $msg2post, $action);
+ if ($cmd eq 'msg') {
+ $alias2post = $cmd[1];
+ for ($i = 2; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ elsif ($cmd eq '') {
+ $alias2post = $whisper;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ else {
+ $alias2post = $cmd;
+ for ($i = 1; $i <= $#cmd; ++$i) {
+ $msg2post = $msg2post . ' ' . $cmd[$i];
+ }
+ }
+ $msg2post =~ s[/me/][<i>$alias</i>]g;
+ $msg2post =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ if (-f "data/online/users/$alias2post" and not -f "data/online/rooms/$loginplace/$alias2post") {
+ &post_prv($alias, "<b><font color='$col'><i>Zu $alias2post gefl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &post_prv($alias2post, "<b><font color='$col'><i>$alias fl\374stert:</i> <font color='$secol'>$msg2post</font></font></i></b>");
+ &private_javascript($alias, $room, "parent.input.document.inf.whisper.value = '$alias2post';");
+ &reload_html;
+ }
+ &post_prv($alias, qq[ <font color=ffffff>Benutzer oder Befehl <font color=ffa500>$alias2post</font> ist nicht anwesend/verf\374gbar! Bitte den Befehl "/menu" eingeben, um das Chat-Men&uuml zu &ouml;ffnen.</font></font>]);
+ &reload_html;
+}
+1;
diff --git a/0.8.1/modules/divcom.pm b/0.8.1/modules/divcom.pm
new file mode 100755
index 0000000..8e17cbe
--- /dev/null
+++ b/0.8.1/modules/divcom.pm
@@ -0,0 +1,288 @@
+sub divcom {
+ if ($var eq 'list_alias_html') {
+ &list_alias_html;
+ }
+ elsif ($var eq 'alias_html') {
+ &alias_html;
+ }
+ elsif ($var eq 'edit_profile_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_profile_html');
+ }
+ elsif ($var eq 'edit_options_html') {
+ &secure_checkid($alias, $tmpid);
+ &edit_html('edit_options_html');
+ }
+ elsif ($var eq 'gb_html') {
+ &gb_html;
+ }
+ elsif ($var eq 'post_gb') {
+ &secure_checkid($alias, $tmpid);
+ &post_gb;
+ }
+ elsif ($var eq 'edit_profile') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_profile');
+ }
+ elsif ($var eq 'edit_options') {
+ &secure_checkid($alias, $tmpid);
+ &edit('edit_options');
+ }
+ elsif ($var eq 'rm_gb_alias') {
+ &secure_checkid($alias, $tmpid);
+ &rm_gb;
+ }
+ else {
+ &error('Parameter fehlt');
+ }
+}
+sub gb_html {
+ my ($message,$method) = @_;
+ unless ($method eq 'loggedin') {
+ &start_html('Benutzerboard');
+ &menu();
+ }
+ if ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </i>\n einen Text und poste\n <u>dann</u>\n !\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_less') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Ein Eintrag muss mindestens aus 30 Zeichen bestehen ...\n </div>\n <hr>\n";
+
+ }
+ elsif ($message eq 'post_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Vielen Dank f\374r Deinen Beitrag. Wenn Du willst, kannst Du jetzt gleich noch einen Eintrag posten ...\n </div>\n <hr>\n";
+ }
+ else {
+ print " <div>\n Falls Du Anregungen oder Verbesserungsvorschl\344ge f\374r die Community hast, dann poste doch einen kleinen Eintrag :-)\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="col" value="$col">\n<input type="hidden" name="secol" value="$secol">\n<input type="hidden" name="maxVerlauf" value="$maxVerlauf">\n<input type="hidden" name="verlaufOrder" value="$verlaufOrder">\n<input type="hidden" name="request" value="divcom">\n <input type="hidden" name="method" value="$method">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="guestbook">\n <input type="hidden" name="id" value="y">\n <input size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e 'data/guestbook') {
+ &error("Konnte dat/guestbook nicht \366ffnen") unless open DATEI, '<data/guestbook';
+ @datei = <DATEI>;
+ close DATEI;
+ print $q->div(@datei);
+ }
+ print $q->end_html;
+}
+sub post_gb {
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ if ($msg eq '') {
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_empty');
+ } else {
+ &gb_html('post_empty');
+ }
+ }
+ else {
+ &alias_html('post_empty');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ if (length($msg) < 30) {
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_less');
+ } else {
+ &gb_html('post_less');
+ }
+ }
+ else {
+ &alias_html('post_less');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+
+ $msg =~ s/</&lt;/g;
+ $msg =~ s/\n/<br>/g;
+ my $tmpath = '';
+ if ($id eq 'y') {
+ $tmpath = 'data/guestbook';
+ }
+ else {
+ $tmpath = "data/user/gbooks/$tmp";
+ }
+ open GB, "$tmpath";
+ my(@gb) = <GB>;
+ close GB;
+ pop @gb if $#gb > 99;
+ my(@newdatei) = "<br><b>$alias schrieb am $days.$months.$years um $hours:$mins:$secs ...</b><br>$msg<br>\n";
+ push @newdatei, @gb;
+ open GB, ">$tmpath";
+ print GB @newdatei;
+ close GB;
+ if ($id eq 'y') {
+ if ($method eq 'loggedin') {
+ &loggedin('post_ok');
+ } else {
+ &gb_html('post_ok');
+ }
+ $client->shutdown(2);
+ exit 0;
+ }
+ &post_prv ($tmp, "<font color=ffffff>$alias hat soeben einen Pin in Dein Profil geh\344ngt ... </font>");
+ &alias_html;
+ $client->shutdown(2);
+ exit 0;
+}
+sub rm_gb {
+ open GB, "<data/user/gbooks/$alias";
+ my(@gbfile) = <GB>;
+ close GB;
+ my(@newgbfile) = ();
+ for ($i = 0; $i <= $#gbfile; ++$i) {
+ push @newgbfile, $gbfile[$i] if $i != $id;
+ }
+ open GB, ">data/user/gbooks/$alias";
+ print GB @newgbfile;
+ close GB;
+ &alias_html('rm_ok');
+}
+sub list_alias_html {
+ &start_html('Alle Benutzer');
+ opendir REGISTERED, 'data/user/options';
+ my(@users) = readdir REGISTERED;
+ closedir REGISTERED;
+ my(@liste) = sort(@users);
+ my $nr = $#users - 1;
+ &menu();
+ print " <div>\n Es sind z.Z. genau $nr Benutzernamen in der Datenbank vorhanden! (Sortiert nach #, A-Z, a-z)\n </div>\n <hr>\n <div>\n";
+ foreach $_ (@liste) {
+ if (-f "data/user/options/$_") {
+ print $q->a({-'href', "chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid"}, "$_"), ' ';
+ }
+ }
+ print " </div>\n</body>\n</html>\n";
+}
+sub alias_html {
+ my $message = $_[0];
+ open COUNTS, "<data/user/counts/$tmp";
+ local $counter = <COUNTS>;
+ close COUNTS;
+ ++$counter;
+ open COUNTS, ">data/user/counts/$tmp";
+ print COUNTS $counter;
+ close COUNTS;
+ &start_html($tmp);
+ &menu();
+ print "";
+ if ($message eq 'rm_ok') {
+ print " <div class=b>\n Meldung:\n </div>\n <div>\n Der von Dir gew\344hlte Eintrag wurde erfolgreich gel\366scht.\n </div>\n <hr>\n";
+ }
+ elsif ($message eq 'post_empty') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wolltest soeben einen leeren Eintrag posten. Bitte schreib\n <i>\n zuerst\n </u>\n einen Text und poste\n <u>dann</u>\n !\n <hr>\n";
+ }
+ open PROFILE, "<data/user/profiles/$tmp";
+ @data = <PROFILE>;
+ close PROFILE;
+ print qq[ <div>\n Dieses Profil wurde insgesamt schon $counter mal aufgerufen !\n <br><br>Alias: $tmp\n <br><br>Nachname: $data[0]\n <br><br>Vorname: $data[1]\n <br><br>Alter: $data[2]\n <br><br>Wohnort: $data[3]\n <br><br>E-Mail:\n <a href="mailto:$data[4]">$data[4]</a>\n <br><br>ICQ-Nummer: $data[5]\n <br><br>Homepage: <a href="$data[6]" target="_new">$data[6]</a>\n <br><br>Weiteres:<br>$data[7]\n <hr>\n Hier kannst Du $tmp eine Nachricht hinterlassen!\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="post_gb">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n <input type="text" size="40" name="msg">\n <font color="ffffff">\n <input type="submit" value="Hinterlassen ...">\n </font>\n </form>\n <hr>\n];
+ if (-e "data/user/gbooks/$tmp") {
+ &error("Konnte data/user/gbooks/$tmp nicht \366ffnen") unless open DATEI, "<data/user/gbooks/$tmp";
+ @datei = <DATEI>;
+ close DATEI;
+ my $nr = 1;
+ if ($alias ne $tmp) {
+ foreach $_ (@datei) {
+ print "<br>Eintrag # $nr: $_";
+ ++$nr;
+ }
+ }
+ else {
+ print qq[ <table>\n <form action="chat">\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="var" value="rm_gb_alias">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="tmp" value="$tmp">\n];
+ for ($i = 0; $i <= $#datei; ++$i) {
+ print qq[ <tr>\n <td>\n <input type="radio" name="id" value="$i">\n </td>\n <td>\n <div class=q>\n <br>\n Eintrag # $nr:\n $datei[$i]\n </div>\n </td>\n </tr>\n];
+ ++$nr;
+ }
+ print qq[ </table>\n <table>\n <tr>\n <td>\n <font color=ffffff>\n <input type="submit" value="Markierten Eintrag l\366schen">\n </font>\n </td>\n <td>\n <font color=ffffff>\n <input type="reset" value="Markierung r\374ckg\344ngig machen">\n </font>\n </td>\n </tr>\n </table>\n </form>\n];
+ }
+ }
+ print $q->end_html;
+}
+sub edit_html {
+ my($method, $message) = @_;
+ &start_html("Benutzerprofil \344ndern");
+ if ($method eq 'edit_options_html') {
+ open DATEI, "<data/user/options/$alias";
+ }
+ elsif ($method eq 'edit_profile_html') {
+ open DATEI, "<data/user/profiles/$alias";
+ }
+ @data = <DATEI>;
+ close DATEI;
+ foreach $_ (@data) {
+ chomp $_;
+ }
+ &menu();
+ if ($method eq 'edit_options_html') {
+ if ($message eq 'edit_options_ok') {
+ print "<div class=b>\n Hinweis:\n</div>\n<div>\n Du hast soeben Deine Chat-Optionen erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren. Um\n weiterzuchatten einfach Fenster schliessen!\n</div>\n<hr>\n";
+ }
+ elsif ($message eq 'edit_pw_wrong') {
+ print "<div class=b>\n ACHTUNG!\n</div>\n<div>\n Du hast soeben versucht, dein Passwort zu \344ndern. Jedoch stimmte die Erste Eingabe nicht mit der Zweiten \374berein.\n Bitte versuch es erneuert ...\n</div>\n<hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Deine Chat-Optionen editieren!'), $q->hr;
+ }
+ print qq[<script lang="javascript" type="text/javascript">\n<!--\n\nfunction radioWert(rObj) {\n for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;\n return false;\n}\n\nfunction insertcode( code ) {\n document.optionen.elements[radioWert(document.optionen.eingabe)].value = code;\n}\n\n//-->\n</script>\n\n<form name="optionen" action="chat">\n <input type="hidden" name="var" value="edit_options">\n <table>\n <tr>\n <td>\n <div>\n Dein Passwort\n <font color=ffa500>\n (Gut merken !!)\n </font>\n <br>\n <input type="password" name="id" value="$data[0]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n Geb hier das Passwort erneuert ein:\n <br>\n <input type="password" name="tmp" value="$data[0]">\n </div>\n </td>\n </tr>\n </table>\n <hr>\n <div>Einstellungen f\374r den Nachrichten-Verlauf</div>\n <table>\n <tr>\n <td>\n <br>\n <div>Anzahl der Nachrichten im Verlauf (Standart = 10)</div>\n <font color=ffffff>\n <select name="maxVerlauf" size="1">\n <option value="$data[3]">$data[3]\n];
+ for ($i = 1; $i <= 50; ++$i) {
+ print qq[<option value="$i">$i];
+ }
+ print qq[ </select>\n </font>\n </td>\n </tr>\n <tr>\n <td>\n <br>\n<div>Wie sollen die Nachrichten im Verlauf angeordnet sein?</div>\n <font color=ffffff>\n <select name="verlaufOrder" size="1">\n <option value="$data[4]">Bisherige Einstellung ($data[4])\n <option value="0">Neue Verlaufnachrichten oben (0)\n <option value="1">Neue Verlaufnachrichten unten (1)\n </select>\n </font>\n </td>\n </tr>\n </table>\n<br>\n <div>PS: Einstellungen des Nachrichten-Verlaufs werden erst nach einem Neueinloggen aktualisiert.</div>\n <hr>\n <table>\n <tr>\n <td>\n <div>\n <input type="radio" name="eingabe" value="col" checked>\n Auswahl von Farbe 1\n <br>\n (Farbe Deines Nicks):\n <br>\n <input name="col" size="6" maxlength="6" value="$data[1]">\n </div>\n </td>\n <td width=20>\n </td>\n <td>\n <div>\n <input type="radio" name="eingabe" value="secol">\n Auswahl von Farbe 2\n <br>\n (Farbe Deiner Nachrichten):\n <br>\n <input name="secol" size="6" maxlength="6" value="$data[2]">\n </div>\n </td>\n </tr>\n </table>\n<br>\n <div>\n Beliebige Auswahl markieren und Farbe w\344hlen. Um Deine Optionen abzuspeichern,\n auf "Daten \344ndern" klicken!\n </div>\n <br>\n];
+ open COLORS, '<templates/colors.sno';
+ @colors = <COLORS>;
+ close COLORS;
+ print @colors;
+ }
+ elsif ($method eq 'edit_profile_html') {
+ if ($message eq 'edit_profile_ok') {
+ print " <div class=b>\n Hinweis:\n </div>\n <div>\n Du hast soeben Dein Profil erfolgreich editiert. Hier kannst Du Dein Profil erneuert editieren:\n <hr>\n";
+ }
+ else {
+ print $q->div('Hier kannst Du Dein Profil editieren!'), $q->hr;
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="var" value="edit_profile">\n <div>\n Dein Nachname:\n <br>\n <input name="nachname" value="$data[0]">\n </div>\n <br>\n <div>\n Dein Vorname:\n <br>\n <input name="vorname" value="$data[1]">\n </div>\n <br>\n <div>\n Dein Alter:\n <br>\n <input name="alter" value="$data[2]">\n </div>\n <br>\n <div>\n Dein Wohnort:\n <br>\n <input name="wohnort" value="$data[3]">\n </div>\n <br>\n <div>\n Deine E-Mail Adresse:\n <br>\n <input name="email" value="$data[4]">\n </div>\n <br>\n <div>\n Deine ICQ-Nummer:\n <br>\n <input name="icq" value="$data[5]">\n </div>\n <br>\n <div>\n Deine Homepage:\n <br>\n <input name="homepage" value="$data[6]">\n </div>\n <br>\n <div>\n Weiteres:\n <br>\n <textarea rows="5" cols="40"name="weiteres" wrap="virtual">$data[7]</textarea>\n </div>\n];
+ }
+ print qq[ <hr>\n <font color=ffffff>\n <input type="hidden" name="request" value="divcom">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="room" value="$room">\n <input type="submit" value="Daten \344ndern ...">\n </font>\n </form>\n</body>\n</html>\n];
+}
+sub edit {
+ my $method = $_[0];
+ if ($method eq 'edit_profile') {
+ my $url = $homepage;
+ $url =~ s[^http://*][];
+ $url =~ s[=][];
+ $url =~ s["][];
+ open PROFILE, ">data/user/profiles/$alias";
+ my $profile = "$nachname\n$vorname\n$alter\n$wohnort\n$email\n$icq\nhttp://$url\n$weiteres";
+ $profile =~ s/</&lt;/g;
+ print PROFILE $profile;
+ close PROFILE;
+ &edit_html('edit_profile_html', 'edit_profile_ok');
+ }
+ elsif ($method eq 'edit_options') {
+ if ($id ne $tmp) {
+ &edit_html('edit_options_html', 'edit_pw_wrong');
+ $client->shutdown(2);
+ exit 0;
+ }
+ $id = crypt $id, $cryptkey;
+ open OPTIONS, ">data/user/options/$alias";
+ my $options = "$id\n$col\n$secol\n$maxVerlauf\n$verlaufOrder";
+ $options =~ s/</&lt;/g;
+ print OPTIONS $options;
+ close OPTIONS;
+ open IDENT, "<data/online/ident/$alias";
+ my (@ident) = <IDENT>;
+ close IDENT;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $ident[0] . $ident[1] . $ident[2] . "$col\n$secol";
+ close IDENT;
+ my $room = &get_room($alias);
+ &private_javascript($alias, $room, "parent.input.document.inf.col.value = '$col'; parent.input.document.inf.secol.value = '$secol';");
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> <font color='$secol'>hat seine Chat-Einstellungen ge&auml;ndert</font> ...</font></i>", $alias);
+ &post_strmsg($alias, $room, 'col', "$col;$secol");
+ &edit_html('edit_options_html', 'edit_options_ok');
+ }
+}
+1;
diff --git a/0.8.1/modules/hierachie.pm b/0.8.1/modules/hierachie.pm
new file mode 100755
index 0000000..b6f5732
--- /dev/null
+++ b/0.8.1/modules/hierachie.pm
@@ -0,0 +1,77 @@
+sub hierachie {
+ my($alias, $room) = @_;
+ open FILE, "<data/online/rstat/$room";
+ flock FILE, 2;
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+ open FILE, '<data/hierachie';
+ flock FILE, 2;
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my(@userlevels) = (@hierachie, @rstat);
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ chomp $level;
+ return $level;
+ }
+ }
+ return 0;
+}
+sub hierachie_rm {
+ my $alias = shift @_;
+ my @return;
+ open FILE, '<data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, '>data/hierachie';
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_rm_rstat {
+ my($alias, $room) = @_;
+ my @return;
+ return unless open FILE, "<data/online/rstat/$room";
+ my(@hierachie) = <FILE>;
+ close FILE;
+ foreach $_ (@hierachie) {
+ push @return, $_ unless /^$alias<;/;
+ }
+ open FILE, ">data/online/rstat/$room";
+ print FILE @return;
+ close FILE;
+}
+sub hierachie_add {
+ my($alias, $level) = @_;
+ &hierachie_rm($alias);
+ open FILE, '>>data/hierachie';
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub hierachie_add_rstat {
+ my($alias, $level, $room) = @_;
+ &hierachie_rm_rstat($alias, $room);
+ return unless open FILE, ">>data/online/rstat/$room";
+ print FILE "$alias<;$level\n";
+ close FILE;
+}
+sub prove_away {
+ my($alias, $room) = @_;
+ return unless open AWAY, "<data/online/rstat/$room.away";
+ @away = <AWAY>;
+ close AWAY;
+ my $name, $away;
+ foreach $_ (@away) {
+ if (/^$alias.*/) {
+ ($name, $away) = split(/<; /, $_, 3);
+ chomp $away;
+ return $away;
+ }
+ }
+}
+1;
diff --git a/0.8.1/modules/htdocs.pm b/0.8.1/modules/htdocs.pm
new file mode 100755
index 0000000..4f1bbeb
--- /dev/null
+++ b/0.8.1/modules/htdocs.pm
@@ -0,0 +1,127 @@
+sub htdocs {
+ if ($var eq 'help_html') {
+ &printfile('templates/help.sno', 'Alle Chatbefehle');
+ }
+ elsif ($var eq 'logo_html') {
+ &start_html('Logo');
+ &logo_html;
+ }
+ elsif ($var eq 'menu_html') {
+ &menu_html;
+ }
+ elsif ($var eq 'logs_html') {
+ &logs_html;
+ }
+ elsif ($var eq 'view_logs_html') {
+ &secure_checkid($alias, $tmpid);
+ &printfile("data/logs/$tmp", 'Logdatei', 'blank') if 7 <= &hierachie($alias);
+ }
+ elsif ($var eq 'superuser_html') {
+ &secure_checkid($alias, $tmpid);
+ &superuser_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &printfile('templates/chatiq.sno', 'Chatiquette');
+ print $q->end_html;
+ }
+ else {
+ print $q->start_html(-'bgcolor', '000000'), $q->end_html;
+ }
+}
+sub menu_html {
+ &start_html("Men\374");
+ print "<div>\n Von hier aus kannst du alle Untermen\374punkte des Systems erreichen:\n</div>\n<hr>\n";
+ &menu();
+ print "</body>\n</html>";
+}
+sub logo_html {
+ print qq[ <layer top=-3 left=0><div style="position:absolute; top:5; left:10">\n <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"\n codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"\n WIDTH=48 HEIGHT=48>\n <PARAM NAME=movie VALUE="$gfxpath/ySymbol.swf">\n <PARAM NAME=loop VALUE=false>\n <PARAM NAME=menu VALUE=false>\n <PARAM NAME=quality VALUE=high>\n <PARAM NAME=scale VALUE=noborder>\n <PARAM NAME=wmode VALUE=opaque>\n <PARAM NAME=bgcolor VALUE=$bgcolor>\n <EMBED src="$gfxpath/ySymbol.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=48 HEIGHT=48 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </OBJECT>\n </div></layer>\n];
+ print $q->end_html;
+}
+sub logs_html {
+ &start_html('Logdateien');
+ &menu;
+ print "<div>\n Hier befinden sich alle Logdateien\n</div>\n<hr>\n";
+ if (5 <= &hierachie($alias)) {
+ print $q->div(qq[Folgende Logdateien des Raumes "$standardroom" k\366nnen nur von Oberw\344chtern oder h\366her gelesen werden (Sortiert nach A-Z, a-z):]), $q->br;
+ opendir LOGS, 'data/logs';
+ my(@logs) = readdir LOGS;
+ closedir LOGS;
+ my(@sortedir) = sort(@logs);
+ foreach $_ (@sortedir) {
+ if (-f "data/logs/$_") {
+ print $q->a({-'href', "chat?request=htdocs&alias=$alias&var=view_logs_html&tmp=$_&tmpid=$tmpid", -'target', '_new'}, "$_"), ' ';
+ }
+ }
+ }
+ else {
+ print $q->div("Logdateien k\366nnen nur von Oberw\344chtern (OW) gelesen werden. Du bist jedoch ein W\344chter (W\304) oder ein", qq["Normaler Chatter". Oberw\344chter k\366nnen alles nachlesen, was \366ffentlich im Raum "Cyberbar" gechattet wurde.]), $q->hr;
+ }
+ print $q->end_html;
+}
+sub superuser_html {
+ &start_html ('Superuser');
+ &menu;
+ print "<div>Hallo $alias. Du bist als ";
+ my $hierachie = &hierachie($alias);
+ if (9 <= $hierachie) {
+ print $q->b('Administrator'), ' (AD) eingetragen.</div><br>', $q->br;
+ }
+ elsif (7 <= $hierachie) {
+ print $q->b("Oberw\344chter"), ' (OW) eingetragen.</div><br>', $q->br;
+ }
+ elsif (5 <= $hierachie) {
+ print $q->b("W\344chter"), " (W\304) eingetragen.</div><br>", $q->br;
+ }
+ else {
+ print $q->b('normaler Chatter'), ' (NC) eingetragen.</div><br>', $q->br;
+ }
+ open FILE, 'data/hierachie';
+ my(@hierachie) = <FILE>;
+ close FILE;
+ my @ows, @was, @ads;
+ foreach $_ (@hierachie) {
+ my($name, $level) = split(/<;/, $_, 3);
+ chomp $level;
+ if ($level == 5) {
+ push @was, $name;
+ }
+ elsif ($level == 7) {
+ push @ows, $name;
+ }
+ elsif ($level == 9) {
+ push @ads, $name;
+ }
+ if (3 <= $hierachie) {
+ if ($level == 6) {
+ push @was, "$name!";
+ }
+ elsif ($level == 8) {
+ push @ows, "$name!";
+ }
+ elsif ($level == 10) {
+ push @ads, "$name!";
+ }
+ }
+ }
+ my $nads = $#ads + 1;
+ print '<div>', $q->b('AD'), "s ($nads St\374ck)";
+ foreach $_ (@ads) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrow = $#ows + 1;
+ print '</div><br><br><div>', $q->b('OW'), "s ($nrow St\374ck)";
+ foreach $_ (@ows) {
+ print $q->font({-'color', 'ffa500'}, ' ' . $_);
+ }
+ my $nrwa = $#was + 1;
+ print '</div><br>', $q->br, '<div>', $q->b("W\304"), "s ($nrwa St\374ck)";
+ foreach $_ (@was) {
+ print $q->font({-'color', 'FFA500'}, ' ' . $_);
+ }
+ print qq[<hr>\n Die jeweiligen F\344higkeiten der Oberw\344chter (OW) und der W\344chter (W\304) sind unter\n "<a href="chat?request=htdocs&var=help_html">Chat-Befehle</a>"\n dokumentiert. Versteckte Superuser k\366nnen nur von anderen Superusern auf\ndieser Liste eingesehen werden!\n</div>\n</body>\n</html>\n];
+}
+sub menu {
+ print "<div>\n <a href='chat?request=divcom&var=edit_profile_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Profil \344ndern</a>\n <a href='chat?request=divcom&var=edit_options_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Optionen</a>\n <a href='chat?request=divcom&var=list_alias_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Benutzer</a>\n <a href='chat?request=htdocs&var=help_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Befehle</a>\n <a href='chat?request=divcom&var=gb_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Board</a>\n <a href='chat?request=htdocs&var=superuser_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Superuser</a>\n <a href='chat?request=htdocs&var=logs_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Logs</a>\n <a href='chat?request=statistic&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Statistik</a>\n <a href='chat?request=htdocs&var=chatiquette_html&alias=$alias&tmp=$tmp&tmpid=$tmpid'>Chatiquette</a>\n</div>\n<hr>\n";
+}
+1;
diff --git a/0.8.1/modules/input.pm b/0.8.1/modules/input.pm
new file mode 100755
index 0000000..48df243
--- /dev/null
+++ b/0.8.1/modules/input.pm
@@ -0,0 +1,14 @@
+sub input {
+ &rm_away($alias, $room);
+ $maxVerlauf = '10' if $maxVerlauf eq undef;
+ $verlaufOrder = '1' if $verlaufOrder eq undef;
+ if ($tmp eq 'login') {
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat den Chat im Raum <b>$room</b> betreten ...</font></i>");
+ }
+ print qq[<html>\n<head>\n<script language="JavaScript"><!--\n\n// Einstellungsvariablen\nmaxVerlauf = $maxVerlauf; // Anzahl der Eintr\344ge des Verlaufs\nmaxPreview = 20; // Zeichenl\344nge der Verlaufsvorschau\nverlaufOrder = $verlaufOrder; // Neue Nachrichten von: 0=oben, 1=unten\n//autoAwayTimeout = 5; // Sekunden, nach denen der User 'Away' gesetzt wird\n//autoQuitTimeout = 10; // Sekunden, nach denen der User den Chat verl\344sst\nautoAwayTimeout = 300; // Sekunden, nach denen der User 'Away' gesetzt wird\nautoQuitTimeout = 1200; // Sekunden, nach denen der User den Chat verl\344sst\n\n// Interne Variablen\nuserNotFocused = false; // Wenn User nicht schreibt\nuserAway = false; // Wenn User automatisch auf 'Away' gesetzt ist\nuserAwayTime = 0; // Sekunden, die User 'Away' ist\nfullVerlauf = new Array( maxVerlauf ); // Verlaufspuffer\n\nfunction delout()\n{\n addVerlauf (document.inf.msg.value); // Dem Verlauf eine Nachricht anh\344ngen\n document.inf.msg.focus(); // Fukus in das Eingabeform\n document.inf.msg.select(); // Text im Eigabeform markieren\n document.inf.submit(); // Formular absenden\n return false; // Abbrechen, damit das Frame nicht neu geladen wird\n}\n\nfunction CheckAuswahl()\n{\n id=document.verlaufform.verlauf.selectedIndex; // ID des ausgew\344hlten Feldes\n\n if (fullVerlauf[id-1] != null) // Nur, wenn das Feld nicht leer ist\n {\n document.inf.msg.value = fullVerlauf[id-1]; // Eintrag ins Textfeld\n }\n\n document.verlaufform.verlauf.selectedIndex = 0; // Ersten Eintrag (\334berschrift) ausw\344hlen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n\n return true;\n}\n\nfunction addVerlauf (msg)\n{\n if (msg == "") // Falls msg leer\n return false; // Aufruf ignorieren\n\n if (verlaufOrder) // neue Nachrichten von unten\n {\n for (i=0; i<(maxVerlauf-1); i++) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+1].text = document.verlaufform.verlauf.options[i+2].text;\n fullVerlauf[i] = fullVerlauf[i+1];\n }\n }\n else // neue Nachrichten von oben\n {\n for (i=(maxVerlauf-2); i>=0; i--) // Alle Eintr\344ge einen aufrutschen\n {\n document.verlaufform.verlauf.options[i+2].text = document.verlaufform.verlauf.options[i+1].text;\n fullVerlauf[i+1] = fullVerlauf[i];\n }\n }\n\n if (msg.length > maxPreview) // Vorschau zuschneiden\n pre = msg.slice(0, maxPreview-3) + "...";\n else\n pre = msg;\n\n if (verlaufOrder) // pos = Position des neuen Eintrags\n pos = maxVerlauf-1;\n else\n pos = 0\n\n document.verlaufform.verlauf.options[pos+1].text = pre; // Neue Vorschau anf\374gen\n fullVerlauf[pos] = msg; // Neuen Eintrag an den Verlauf anf\374gen\n\n// document.verlaufform.verlauf.selectedIndex = maxVerlauf; // Fokus auf den letzten Eintrag\n document.verlaufform.verlauf.selectedIndex = 0; // Fokus auf den ersten Eintrag (\334berschrift)\n}\n\nfunction msgBlur()\n{\n userNotFocused = true;\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction msgFocus()\n{\n userNotFocused = false;\n if (userAway) // Wird ausgef\374hrt, falls User 'Away' war\n {\n ; // nop\n }\n userAwayTime = 0;\n userAway = false;\n}\n\nfunction checkInterval()\n{\n// status = "userNotFocused=" + userNotFocused + "; userAway=" + userAway + "; userAwayTime=" + userAwayTime + ""; // Debug\n if (userNotFocused)\n {\n userAwayTime += 5; // Addiere 5, da nur alle 5Sek ausgef\374hrt\n if (!userAway)\n {\n if (autoAwayTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n if (document.inf.tmp.value != "away")\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2faway&tmp=autoaway","reload"); // 'Away' setzen\n userAway = true;\n }\n }\n else\n {\n if (autoQuitTimeout < userAwayTime) // Falls Zeit abgelaufen\n {\n open ("chat?request=postmessage&alias=$alias&tmpid=$tmpid&msg=%2fexit&tmp=autologout","reload"); // Chat beenden\n }\n }\n }\n\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden wieder aufrufen\n}\n\nfunction initFrame()\n{\n window.setTimeout("checkInterval()",5000); // In 5 Sekunden aufrufen\n document.inf.msg.focus(); // Eingabefeld fokusieren\n}\n//-->\n</script>\n];
+ &style;
+ print qq[</head>\n<body class="blank" onload="initFrame();">\n <div align="left">\n <table border="0" cellpadding="0" cellspacing="0">\n <tr>\n <td>\n <form name="inf" target="reload" action="chat" onsubmit="return delout();">\n <input type="hidden" name="request" value="postmessage">\n <input type="hidden" name="alias" value="$alias">\n <input type="hidden" name="room" value="$room">\n <input type="hidden" name="col" value="$col">\n <input type="hidden" name="secol" value="$secol">\n <input type="hidden" name="tmpid" value="$tmpid">\n <input type="hidden" name="whisper" value="$whisper">\n <input type="hidden" name="tmp" value="$tmp">\n <input size="40" maxlength="300" name="msg" onBlur="msgBlur();" onFocus="msgFocus();">\n </form>\n </td>\n <td><form name="verlaufform">\n <script language="JavaScript"><!--\n document.write("<select size='1' name='verlauf' size='40' onChange='CheckAuswahl();'>");\n document.write("<option>- Nachrichten-Verlauf -</option>");\n for(i=0; i<maxVerlauf; i++) // Leere Verlaufsfelder generieren\n document.write("<option value>(leer)</option>");\n document.write("</select>");\n //-->\n </script>\n </form>\n </td>\n </tr>\n </table>\n </div>\n</body>\n</html>\n];
+ $client->$shutdown(2);
+ exit 0;
+}
+1;
diff --git a/0.8.1/modules/loggedin.pm b/0.8.1/modules/loggedin.pm
new file mode 100755
index 0000000..848505d
--- /dev/null
+++ b/0.8.1/modules/loggedin.pm
@@ -0,0 +1,41 @@
+sub loggedin {
+ &start_html($loginplace, 'blank');
+ print qq[<div>\n <font color='$col'>$alias</font>, sch\366n da\337 Du da bist :-), <a href='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder' style="text-decoration: underline; color: red">hier</a> kannst du die Seite aktualisieren.\n</div>\n<hr>\n<div>\n<a href="chat?request=stream&alias=$alias&room=$standardroom&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder" style="text-decoration: underline; color: red; font-size:20px">Hier</a>\nkannst du den Standardraum $standardroom betreten. <br><br>\n];
+ opendir ROOMDIRS, 'data/online/rooms';
+ local(@roomdirs) = readdir ROOMDIRS;
+ close ROOMDIRS;
+ foreach $_ (@roomdirs) {
+ if (-e "data/online/rooms/$_" and $_ ne '..' and $_ ne '.') {
+ my $room = $_;
+
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+
+ my $door = '[<font color=red>Abgesperrt!</font>]' if $rstat[0] eq "1\n";
+
+ opendir ROOMDIR, "data/online/rooms/$room";
+ my(@roomdir) = readdir ROOMDIR;
+ close ROOMDIR;
+
+ my $nr = $#roomdir - 1;
+ if ($door or $_ eq $loginplace) {
+ print $q->b($_), " $door ($nr) ";
+ }
+ else {
+ print $q->b($q->a({-'href', "chat?request=stream&alias=$alias&room=$_&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder"}, "$_")), " ($nr)";
+ }
+ print " Raumthema: $rstat[1]" if $rstat[1] ne "\n";
+ print $q->br;
+ foreach $_ (@roomdir) {
+ if ($_ ne '..' and $_ ne '.') {
+ my $col = &get_ident($_,3);
+ print "<a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$_&tmpid=$tmpid' target='$_' style='color: $col'>$_</a> ";
+ }
+ }
+ print $q->br, $q->br;
+ }
+ }
+ &gb_html($_[0],'loggedin');
+}
+1;
diff --git a/0.8.1/modules/nohup.out b/0.8.1/modules/nohup.out
new file mode 100644
index 0000000..bb27a65
--- /dev/null
+++ b/0.8.1/modules/nohup.out
@@ -0,0 +1,2 @@
+Can't locate config.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i686-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i686-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl .) at ychatd.pl line 5.
+BEGIN failed--compilation aborted at ychatd.pl line 5.
diff --git a/0.8.1/modules/online.pm b/0.8.1/modules/online.pm
new file mode 100755
index 0000000..4c87fb0
--- /dev/null
+++ b/0.8.1/modules/online.pm
@@ -0,0 +1,167 @@
+sub online {
+ &secure_checkid($alias, $tmpid);
+ my(@away) = &prove_away($alias, $room, 'return_list');
+ for (;;) {
+ for ($i = 0; $i <= $#away; $i += 2) {
+ last if ($away[$i] eq $alias || $room eq $loginplace);
+ }
+ open DATEI, "<data/online/users/$alias";
+ my $oldstamp = <DATEI>;
+ close DATEI;
+ if ($oldstamp > time - 100) {
+ open DATEI, "<data/user/counts/$alias.online";
+ my $online = <DATEI>;
+ close DATEI;
+ my $total = time - $oldstamp + $online;
+ open DATEI, ">data/user/counts/$alias.online";
+ print DATEI $total;
+ close DATEI;
+ }
+ last;
+ }
+ unless (-d "data/online/rooms/$room") {
+ mkdir "data/online/rooms/$room", 511;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, '<data/online/prove';
+ my $provetime = <DATEI>;
+ close DATEI;
+
+ &check_online if $provetime < time - 40;
+ print <<END;
+ <html>
+ <head>
+ <meta http-equiv="refresh" content="20" URL="chat?request=online&room=$room&alias=$alias&tmpid=$tmpid">
+ <style type="text/css">\n a { font-family: arial; font-size:11px; color: #ffffef; }\n a:hover { color: #ffffff; }\n </style>\n <style type="text/css" media="all">\n a { text-decoration: none; }\n a:hover { text-decoration:underline; }
+ </style>
+ </head>
+ <body bgcolor="$chatbg">
+END
+
+ opendir ROOM, 'data/online/rooms/' . $room;
+ my(@room) = readdir(ROOM);
+ closedir ROOM;
+
+ my $chatter = $#room - 1;
+ print "<font size='1' color='ffffff' face='arial'>$room ($chatter):</font><table>\n";
+
+ open FILE, "<data/online/rstat/$room";
+ my(@rstat) = <FILE>;
+ close FILE;
+ shift @rstat;
+ shift @rstat;
+
+ open FILE, '<data/hierachie';
+ my(@userlevels) = (<FILE>, @rstat);
+ close FILE;
+
+ open FILE, "<data/online/rstat/$room.away";
+ my(@away) = <FILE>;
+ close FILE;
+
+ my $hierachie;
+ foreach (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($name eq $alias) {
+ $hierachie = $level;
+ last;
+ }
+ }
+
+ my %alias;
+ foreach (@room) {
+ if (-f "data/online/rooms/$room/$_") {
+ open IDENT, "data/online/ident/$_";
+ my @ident = <IDENT>;
+ close IDENT;
+ chomp $ident[2];
+ chomp $ident[3];
+ $alias{$ident[2]} = [$_, $ident[3]];
+
+ }
+ }
+
+ @room = undef;
+ foreach my $value (reverse (sort { $a <=> $b } keys %alias)) {
+ push @room, ${$alias{$value}}[0]
+ }
+
+ foreach my $nick (@room) {
+ if (-f "data/online/rooms/$room/$nick") {
+ my $inside = 0;
+ my $col = &get_ident($nick,3);
+ foreach $_ (@away) {
+ my($name, $awaymessage) = split(/<;/, $_, 3);
+ if ($name eq $nick) {
+ chomp $awaymessage;
+ $awaymessage =~ s/=//ig;
+ print "<tr><td><img border='0' title='$awaymessage' alt='$awaymessage' src='$gfxpath/away.gif'></td>";
+ $inside = 2;
+ }
+ }
+ if ($inside == 0) {
+ foreach $_ (@userlevels) {
+ my($name, $level) = split(/<;/, $_, 3);
+ if ($nick eq $name) {
+ chomp $level;
+ $inside = 1;
+ if ($level == 1) {
+ print "<tr><td><img title='Raumbesetzer' alt='Raumbesetzer' src='$gfxpath/rb.gif'></td>";
+ last;
+ }
+ elsif ($level == 2) {
+ print "<tr><td><img title='Die Unschuld vom Land' alt='Die Unschuld vom Land' src='$gfxpath/uvl.gif'></td>";
+ last;
+ }
+ elsif ($level == 3) {
+ print "<tr><td><img title='Tempor&auml;rer W&auml;chter' alt='Tempor&auml;rer W&auml;chter' src='$gfxpath/twa.gif'></td>";
+ last;
+ }
+ elsif ($level == 5) {
+ print "<tr><td><img title='W&auml;chter' alt='W&auml;chter' src='$gfxpath/wa.gif'></td>";
+ last;
+ }
+ elsif ($level == 7) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Oberw&auml;chter' src='$gfxpath/ow.gif'></td>";
+ last;
+ }
+ elsif ($level == 9) {
+ print "<tr><td><img title='Administrator' alt='Administrator' src='$gfxpath/adm.gif'></td>";
+ last;
+ }
+
+ if (5 <= $hierachie) {
+ if ($level == 6) {
+ print "<tr><td><img title='W&auml;chter' alt='Unsichtbarer W&auml;chter' src='$gfxpath/wa-i.gif'></td>";
+ last;
+ }
+ elsif ($level == 8) {
+ print "<tr><td><img title='oberw&auml;chter' alt='Unsichtbarer Oberw&auml;chter' src='$gfxpath/ow-i.gif'></td>";
+ last;
+ }
+ elsif ($level == 10) {
+ print "<tr><td><img title='Administrator' alt='Unsichtbarer Administrator' src='$gfxpath/adm-i.gif'></td>";
+ last;
+ }
+
+ }
+ print '<tr><td></td>';
+ last;
+ }
+ }
+ }
+ if ($inside == 0) {
+ print '<tr><td></td>';
+ }
+ print "<td><a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$nick&tmpid=$tmpid' target='$nick' style='color: $col'>$nick</a></td></tr>\n";
+ }
+ }
+ print '</table></body></html>';
+}
+1;
diff --git a/0.8.1/modules/postmessage.pm b/0.8.1/modules/postmessage.pm
new file mode 100755
index 0000000..f787534
--- /dev/null
+++ b/0.8.1/modules/postmessage.pm
@@ -0,0 +1,90 @@
+sub postmessage {
+ if (not -e "data/online/rooms/$room/$alias" and $tmp ne 'autoaway' and $tmp ne 'autologout') {
+ &post_prv($alias, "<font color=ffffff>Du befindest Dich nicht im Raum <font color=ffa500>$room</font> und kannst dort auch keine Nachrichten posten!</font>");
+ &reload_html;
+ }
+ elsif (length $msg > 300) {
+ &post_prv($alias, "<font color=ffffff>Deine Nachricht enth\344lt zu viele Zeichen. Maximal sind 300 Zeichen erlaubt.</font>");
+ &reload_html;
+ }
+ if ($tmp eq 'away') {
+ &rm_away($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$alias</font> hat sich zur\374ck gemeldet ... </font></i><script language='JavaScript'>parent.online.location.reload();</script>", $alias);
+ &private_javascript($alias, $room, q[parent.input.document.inf.tmp.value = 'notaway';]);
+ }
+ $msg =~ s/</&lt;/g;
+ if (substr($msg, 0, 1) ne '/') {
+ unless ($tmp eq 'autoaway') {
+ foreach $_ ($col, $secol) {
+ &prove_color($alias, $_);
+ }
+ }
+ open MSGFILE, ">>data/msgs/$room";
+ if (not $msg =~ s[/me/][<i>$alias</i>]g || $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g) {
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color='$col'>$alias: <font color='$secol'>$msg<br></font></font></b><;$alias<;\n";
+ }
+ else {
+ $msg =~ s[/me/][<i>$alias</i>]g;
+ $msg =~ s[/m/][<i><font color=$col>$alias</font></i>]g;
+ print MSGFILE '!<;' . time . "<;!<;!<;<b><font color=$secol>$msg</font></font></b><br><;$alias<;\n";
+ }
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+ &log("<b><font color=$col>$alias: <font color=$secol>$msg</font></font></b>") if $room eq $standardroom;
+ &reload_html;
+ }
+ else {
+ &command($msg, $tmp);
+ }
+}
+sub post {
+ my($room, $msg2post, $alias, $secroom) = @_;
+ my(@rooms) = $room;
+ push @rooms, $secroom if $room ne $secroom;
+ foreach my $theroom (@rooms) {
+ open MSGFILE, ">>data/msgs/$theroom";
+ print MSGFILE '!<;' . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$theroom";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$theroom/$_";
+ }
+ }
+ &log($msg2post) if $room eq $standardroom;
+}
+sub post_prv {
+ my($alias2post, $msg2post) = @_;
+ my $roomofalias = &get_room($alias2post);
+ return 'false' if not $roomofalias;
+ open MSGFILE, ">>data/msgs/$roomofalias";
+ print MSGFILE "$alias2post<;" . time . "<;!<;!<;$msg2post<br><;$alias<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$roomofalias";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$roomofalias/$_";
+ }
+ return 'true';
+}
+sub post_strmsg {
+ my($alias, $room, $command, $action) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . "<;$command<;$action<;!<;!<;\n";
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+
+1;
diff --git a/0.8.1/modules/shared.pm b/0.8.1/modules/shared.pm
new file mode 100755
index 0000000..e458953
--- /dev/null
+++ b/0.8.1/modules/shared.pm
@@ -0,0 +1,353 @@
+sub reload_html {
+ print "<html><body bgcolor='$chatbg'></body></html>";
+ &del_awake();
+ $client->shutdown(2);
+ exit 0;
+}
+sub printfile {
+ my($file2print, $pagetitle, $bodyclass) = @_;
+ &start_html($pagetitle, $bodyclass) if $pagetitle ne '';
+ &menu unless $bodyclass eq 'blank';
+ open FILE2PRINT, "<$file2print";
+ print "$_\n" while defined($_ = <FILE2PRINT>);
+ close FILE2PRINT;
+}
+sub start_html {
+ print "<html><head><title>$title - $_[0]</title>$_[2]";
+ &style;
+ print '</head>';
+ if ($_[1] eq 'start') {
+ print '<body onload="document.login.alias.focus();">';
+ }
+ elsif ($_[1] ne '') {
+ print "<body class=$_[1]>";
+ }
+ else {
+ print '<body>';
+ }
+}
+sub log {
+ my $msg2log = $_[0];
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ my $js;
+ $hours--;
+ ($msg2log, $js) = split(/<script/, $msg2log, 3);
+ open LOG, ">>data/logs/$days.$months.$years";
+ print LOG "<br><font color=ffffef><i>($hours:$mins:$secs)</i></font> $msg2log\n";
+ close LOG;
+}
+sub timestring {
+ my($mins, $hours) = (localtime)[1, 2];
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ return "$hours:$mins";
+}
+sub timearray {
+ my($secs, $mins, $hours, $days, $months, $years) = (localtime)[(0, 1, 2, 3, 4, 5)];
+ $months += 1;
+ $hours = '0' . $hours if $hours < 10;
+ $mins = '0' . $mins if $mins < 10;
+ $secs = '0' . $secs if $secs < 10;
+ $days = '0' . $days if $days < 10;
+ $months = '0' . $months if $months < 10;
+ $years = $years - 100;
+ if ($years < 10) {
+ $years = '200' . $years;
+ }
+ else {
+ $years = '20' . $years;
+ }
+ return $secs, $mins, $hours, $days, $months, $years;
+}
+sub error {
+ my $error_msg = $_[0];
+ &start_html("Error: ($error_msg)");
+ print $q->div("Error: ($error_msg)"), $q->end_html;
+ open ERROR, '>>data/error';
+ print ERROR "Alias: $alias TempID: $tmpid File. $0 PID: $$ Time: " . time . " Message: $error_msg \n";
+ close ERROR;
+ $client->shutdown(2) if $client;
+ exit 0;
+}
+sub check_online {
+ open PROVE, '>data/online/prove';
+ print PROVE time;
+ close PROVE;
+ opendir DIR, 'data/online/rooms';
+ my(@roomdir) = readdir DIR;
+ closedir DIR;
+ foreach my $theroom (@roomdir) {
+ opendir DIR, "data/online/rooms/$theroom";
+ my(@roomusers) = readdir DIR;
+ closedir DIR;
+ my $empty = 1;
+ foreach $user (@roomusers) {
+ if (-f "data/online/rooms/$theroom/$user") {
+ $empty = 0;
+ open USER, "<data/online/rooms/$theroom/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ unlink "data/online/$theroom/$user";
+ open USER, "<data/online/users/$user";
+ my $userstamp = <USER>;
+ close USER;
+ if ($userstamp < time - 40) {
+ &post($theroom, '<i><font color=ffffff>' . &timestring . " <font color='".&get_ident($user,3)."'>$user</font> hat den Chat verlassen ... </font></i>");
+ if ($user ne $alias) {
+ &rm_alias($user, $theroom);
+ }
+ else {
+ unlink "data/online/rooms/$theroom/$user";
+ }
+ }
+ }
+ }
+ }
+ opendir PIDS, "data/online/pids/$theroom";
+ my(@pids) = readdir PIDS;
+ closedir PIDS;
+ if ($empty == 1) {
+ rmdir "data/online/rooms/$theroom";
+ unlink "data/online/rstat/$theroom";
+ unlink "data/online/rstat/$theroom.away";
+ unlink "data/msgs/$theroom";
+ foreach $_ (@pids) {
+ unlink "data/online/pids/$theroom/$_" if -f "data/online/pids/$theroom/$_";
+ }
+ rmdir "data/online/pids/$theroom";
+ }
+ }
+}
+sub rm_if_loggedin {
+ my $alias = shift;
+ my $room = &get_room($alias);
+ while ($room ne undef) {
+ &rm_alias($alias, $room);
+ &post($room, '<i><font color=ffffff>' . &timestring . " <font color='$col'>$user</font> hat den Chat verlassen ... </font></i>");
+ $room = &get_room($alias);
+ }
+}
+sub secure_checkid {
+ my($alias2check, $tmpid) = @_;
+ &error("Falsche TempID! $tmpid") unless -f "data/online/tmpid/$alias.$tmpid";
+}
+sub rm_alias {
+ my($alias, $room) = @_;
+ unlink "data/online/rooms/$room/$alias";
+ unlink "data/online/users/$alias";
+ opendir TMPID, 'data/online/tmpid';
+ my(@tmpid) = readdir TMPID;
+ close TMPID;
+ foreach $_ (@tmpid) {
+ unlink "data/online/tmpid/$_" if /^$alias\..+$/;
+ }
+ unlink "data/online/ident/$alias";
+ &rm_rstat($alias, $room);
+}
+sub rm_rstat {
+ my($alias, $room) = @_;
+ open RSTAT, "<data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ my(@rstat2) = ($rstat[0], $rstat[1]);
+ for ($i = 2; $i <= $#rstat; ++$i) {
+ chomp $rstat[$i];
+ push @rstat2, $rstat[$i] . "\n" unless $rstat[$i] =~ /^$alias<;/;
+ }
+ open RSTAT, ">data/online/rstat/$room";
+ print RSTAT @rstat2;
+ close RSTAT;
+}
+sub rm_away {
+ my($alias, $room) = @_;
+ open AWAY, "<data/online/rstat/$room.away";
+ my(@away) = <AWAY>;
+ close AWAY;
+ my @away2;
+ foreach $_ (@away) {
+ my(@split) = split(/<;/, $_, 0);
+ push @away2, $_ if $alias ne $split[0];
+ }
+ open AWAY, ">data/online/rstat/$room.away";
+ print AWAY @away2;
+ close AWAY;
+}
+sub rm_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ my @new;
+ foreach $_ (@entry) {
+ push @new, $_ if $entry . "\n" ne $_;
+ }
+ if (@entry != @new) {
+ open ENTRY, ">data/$file";
+ print ENTRY @new;
+ close ENTRY;
+ return 1;
+ }
+ else {
+ return;
+ }
+}
+sub add_entry {
+ my($entry, $file) = @_;
+ open ENTRY, "<data/$file";
+ my(@entry) = <ENTRY>;
+ close ENTRY;
+ foreach $_ (@entry) {
+ chomp $_;
+ return if $entry eq $_;
+ }
+ open ENTRY, ">>data/$file";
+ print ENTRY $entry . "\n";
+ close ENTRY;
+ return 1;
+}
+sub prove_color {
+ my($alias, $color) = @_;
+ my $length = length $color;
+ if ($length > 6 or $length < 6) {
+ &post_prv($alias, "<font color=ffffff>Ung\374ltige Hexadezimalfarbe.</font>");
+ &reload_html;
+ }
+}
+sub kill_alias {
+ my($alias2kill, $alias) = @_;
+ my($secs, $mins, $hours, $days, $months, $years) = &timearray;
+ unlink "data/user/options/$alias2kill";
+ unlink "data/user/profiles/$alias2kill";
+ unlink "data/user/gbooks/$alias2kill";
+ unlink "data/user/counts/$alias2kill";
+ unlink "data/user/counts/$alias2kill.online";
+ unlink "data/user/lastlogin/$alias2kill";
+ unlink "data/user/memos/$alias2kill";
+ &rm_entry($alias2kill, 'ban');
+ open DEL, '>>data/kill';
+ print DEL "($days.$months.$years $hours:$mins:$secs) $alias2kill wurde von $alias gekillt\n";
+ close DEL;
+}
+sub random_color {
+ my(@digit) = ('F', 'C', 'A', 'B', (5, 6, 7, 8, 9));
+ my $dig1 = rand @digit;
+ my $dig2 = rand @digit;
+ my $dig3 = rand @digit;
+ my $dig4 = rand @digit;
+ my $dig5 = rand @digit;
+ my $dig6 = rand @digit;
+ return $digit[$dig1] . $digit[$dig2] . $digit[$dig3] . $digit[$dig4] . $digit[$dig5] . $digit[$dig6];
+}
+sub url_decode {
+ my $t = shift @_;
+ $t =~ s[/][];
+ $t =~ tr/+/ /;
+ while ($t =~ s/%([a-f0-9][a-f0-9])/chr hex $1;/ie) {
+ ();
+ }
+ return $t;
+}
+sub url_encode {
+ my $t = shift @_;
+ while ($t =~ s/([^\w()'*~!.-])/sprintf '%%%02x', $1;/eg) {
+ ();
+ }
+ return $t;
+}
+sub calculate_hpm {
+ my($hits, $starttime) = @_;
+ return sprintf('%.2f', $hits / ((time - $starttime) / 60));
+}
+sub calculate_uptime_hours {
+ my $starttime = shift @_;
+ return sprintf('%.2f', (time - $starttime) / 3600);
+}
+sub private_javascript {
+ my($alias, $room, $javascript) = @_;
+ open MSGFILE, ">>data/msgs/$room";
+ print MSGFILE "$alias<;" . time . qq[<;!<;!<;<script language="JavaScript">$javascript</script><;\n];
+ close MSGFILE;
+ opendir PID, "data/online/pids/$room";
+ my(@pids) = readdir PID;
+ closedir PID;
+ foreach $_ (@pids) {
+ kill 'USR1', $_ if -f "data/online/pids/$room/$_";
+ }
+}
+sub get_theme {
+ my $room = shift @_;
+ open RSTAT, "data/online/rstat/$room";
+ my(@rstat) = <RSTAT>;
+ close RSTAT;
+ chomp $rstat[1];
+ return '<b>Raumthema:</b>' . $rstat[1] if $rstat[1] ne undef;
+}
+sub get_room {
+ my $alias = shift @_;
+ opendir DIR, 'data/online/rooms';
+ my(@dir) = readdir DIR;
+ closedir DIR;
+ foreach my $room (@dir) {
+ opendir DIR, "data/online/rooms/$room";
+ my(@chatter) = readdir DIR;
+ closedir DIR;
+ foreach my $chatter (@chatter) {
+ return $room if $chatter eq $alias;
+ }
+ }
+ return undef;
+}
+sub get_ident {
+ my ($alias,$line) = @_;
+ open IDENT, "data/online/ident/$alias";
+ my (@ident) = <IDENT>;
+ close IDENT;
+ chomp $ident[$line];
+ return $ident[$line];
+}
+sub get_online_users {
+ my @dir = &diropen('data/online/rooms');
+ my @users;
+
+ foreach my $room (@dir) {
+ next if $room =~ /\./;
+ my @room = &diropen("data/online/rooms/$room");
+
+ foreach (@room) {
+ push @users, $_ unless /\./;
+ }
+ }
+ return @users;
+}
+sub get_online_time {
+ my $alias = shift;
+ if (-f "data/user/options/$alias") {
+ open ONLINE, "<data/user/counts/$alias.online";
+ my $online = <ONLINE>;
+ close ONLINE;
+ return sprintf('%.2f', $online / 3600);
+ }
+ return false;
+}
+sub diropen {
+ my $dir = shift;
+
+ opendir DIR, $dir;
+ my @dir = readdir(DIR);
+ closedir(DIR);
+
+ return @dir;
+}
+sub del_awake {
+ unlink "data/online/awake/$$";
+}
+sub debug {
+ open DEBUG, '>>debug';
+ while (@_) {
+ chomp $_;
+ print DEBUG "$_\n";
+ }
+ close DEBUG;
+}
+1;
diff --git a/0.8.1/modules/start.pm b/0.8.1/modules/start.pm
new file mode 100755
index 0000000..4fe416b
--- /dev/null
+++ b/0.8.1/modules/start.pm
@@ -0,0 +1,264 @@
+sub start {
+ if ($var eq 'create_alias_html') {
+ &create_alias_html;
+ }
+ elsif ($var eq 'create_alias') {
+ &create_alias;
+ }
+ elsif ($var eq 'login_html') {
+ &login_html;
+ }
+ elsif ($var eq 'chatiquette_html') {
+ &chatiquette_html;
+ }
+ elsif ($alias eq '') {
+ &login_html;
+ }
+ else {
+ &checklogin;
+ }
+}
+sub login_html {
+ &check_online;
+ my $counter = undef;
+ open COUNT, '<data/count';
+ $counter = <COUNT>;
+ close COUNT;
+ ++$counter;
+ open COUNT, '>data/count';
+ flock COUNT, 2;
+ print COUNT $counter;
+ close COUNT;
+
+ my(@users) = &get_online_users;
+
+ opendir REGISTRED, 'data/user/options';
+ my(@registred) = readdir REGISTRED;
+ closedir REGISTRED;
+
+ my($logtin, $users) = ($#users + 1, $#registred - 1);
+ &start_html("Created & Copyright by Paul C. B\374tow", 'start');
+ print qq[ <center>\n <table width=500>\n <tr>\n <td>\n <center>\n <table>\n <tr>\n <td>\n <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" WIDTH=240 HEIGHT=240>\n <param name=movie value="$gfxpath/yIntro.swf">\n <param name=loop value=false>\n <param name=menu value=false>\n <param name=quality value=high>\n <param name=scale value=noborder>\n <param name=wmode value=opaque>\n <param name=bgcolor value=$bgcolor>\n <embed src="$gfxpath/yIntro.swf" loop=false menu=false quality=high scale=noborder wmode=opaque bgcolor=$bgcolor WIDTH=240 HEIGHT=240 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED>\n </object>\n </td>\n <td>\n <div>\n yChat: Version $version\n <br><br>\n Letztes Update: $datum\n <br><br>\n Seitenaufrufe: $counter\n <br><br>\n Benutzer registriert: $users\n <br><br>\n Benutzer online: $logtin\n <br><br>\n Benutzerlimit: $limit\n <br><br>\n Beta-yChat: <a href="http://www.java.yChat.de">www.java.yChat.de</a>\n <br><br><a href="http://www.webchat.de" target="_new"> <img src="http://www.webchat.de/webchat.gif" alt="[webchat]" title="[webchat]" border="0"></a><br>\n<img src="http://stats.topwebmaster.net/extern/de/snooper"></div></td>\n </tr>\n </table>\n </center>\n </div>\n <br>\n <br>\n];
+ if ($tmp eq 'true') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Wahrscheinlich existiert Dein Alias "$alias" nicht,\n <br>\n Du hast Dich verschrieben oder das Passwort ist falsch.\n <br>\n Versuch es erneuert !\n </div>\n];
+ }
+ elsif ($tmp eq 'quit') {
+ print qq[ <div>\n Du hast soeben den Chat verlassen.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autologout') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat ausgeloggt. Grund: Du warst 20 Minuten inaktiv.\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'autokick') {
+ print qq[ <div>\n Du wurdest automatisch aus dem Chat katapultiert. Grund: Du hast den Chat geflutet!\n <br>\n Um den Chat erneuert zu betreten, einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'banned') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest aus dem Chat verbannt!!!\n <br>\n Z.z. kannst Du Dich leider nicht in den Chat einloggen.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'kick') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat katapultiert!\n <br>\n Schlechtes Verhalten mag die Ursache hierf\374r sein.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'selfkill') {
+ print qq[ <div>\n Du hast dich soeben ganz und gar aus dem System gel\366scht!\n <br>\n Wenn du dir einen neuen Nick angelen willst, dann einfach auf "Registrieren" klicken! :-)\n </div>\n];
+ }
+ elsif ($tmp eq 'selfkill') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Du wurdest soeben aus dem Chat ausgeloggt!\n <br>\n Ursache hierf\374r mag sein, da\337 der Chat voll war und Du Dich nicht am\n Geschehen beteiligt- und unn\366tige Chatkapazit\344ten in Anspruch\n genommen hast.\n <br>\n Sorry!\n </div>\n";
+ }
+ elsif ($tmp eq 'full') {
+ print "<div class=b>ACHTUNG!</div><div>Der Chat ist leider voll! Bitte versuch Dich sp\344ter noch mal einzuloggen!</div>";
+ }
+ elsif ($var eq 'create_alias') {
+ print q[<div>Du hast sich soeben in die Datenbank eingetragen. Einfach auf "Los Geht's" klicken :-)</div>];
+ }
+ else {
+ print qq[ <div>\n Herzlich willkommen!\n <br>\n Einfach Daten eingeben und auf "Los Geht's" klicken :-)\n </div>\n];
+ }
+ print qq[ <hr>\n <form name="login" method="GET">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="tmp" value="true">\n <table>\n <tr>\n <td>\n <div>\n Dein Alias:\n <br>\n <input name="alias" value="$alias">\n </div>\n </td>\n <td>\n <div>\n Dein Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n </td>\n </tr>\n </table>\n <br>\n <br>\n <div>\n Solltest Du noch keinen Nick besitzen, dann auf "Registrieren" klicken!\n </div>\n <br>\n <table>\n <tr>\n <td>\n <font color="ffffff">\n <input type="submit" value="Los geht's!">\n </font>\n </form>\n </td>\n <td>\n <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias_html">\n <font color="ffffff">\n <input type="submit" value="Registrieren">\n </font>\n </form>\n </td>\n </tr>\n </table>\n <hr>\n];
+ if ($logtin > 0) {
+ print q[<div>Folgende Personen sind eingeloggt:<br><font size='1'>];
+ foreach $_ (@users) {
+ print "$_ " if -f "data/online/users/$_";
+ }
+ print '</font></div>';
+ }
+ print " </td>\n </tr>\n </table>\n </center>\n</body>\n</html>\n";
+ unless (-d 'data/online/rooms') {
+ mkdir 'data/online/rooms', 511;
+ }
+}
+sub create_alias_html {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq 'ip://' . $client->peerhost) {
+ $tmp = 'banned';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ my $reload = $_[0];
+ &start_html('Registration');
+ print " <center>\n <table width=500>\n <tr>\n <td>\n";
+ if ($reload eq 'alias_exists') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Der von Dir gew\344hlte Benutzername "$alias" existiert in unserer Datenbank bereits. Bitte versuch es erneuert mit\n einem anderen Benutzernamen !\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'pw_wrong') {
+ print " <div class=b>\n ACHTUNG!\n </div>\n <div>\n Deine beiden Passworteingaben stimmen nicht \374berein. Bitte geb das Passwort erneuert an um sicherzugehen, da\337\n kein falsches Passwort abgespeichert wird !\n </div>\n <hr>\n";
+ }
+ elsif ($reload eq 'alias_prohibited') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt illegale Zeichen. Bitte versuch einen anderen Benutzernamen!\n </div>\n <hr>\n];
+ }
+ elsif ($reload eq 'alias_length') {
+ print qq[ <div class=b>\n ACHTUNG!\n </div>\n <div>\n Dein gew\344hlter Benutername "$alias" enth\344lt zu viele Zeichen. Es sind maximal 15 Zeichen erlaubt!!\n </div>\n <hr>\n];
+ }
+ else {
+ print " <div>\n Hier kannst Du Dich registrieren. Bitte beachte, da\337 die Passworteingabefelder \374bereinstimmen!\n </div>\n <hr>\n";
+ }
+ print qq[ <form action="chat">\n <input type="hidden" name="request" value="start">\n <input type="hidden" name="var" value="create_alias">\n <div>\n Dein Alias:\n <font color="ffa500">\n (Mu\337 angegeben werden)\n </font>\n <br>\n <input name="alias" VALUE="$alias">\n </div>\n <br>\n <div>\n Dein gew\374nschtes Passwort:\n <br>\n <input type="password" name="pw" value="$pw">\n </div>\n <br>\n <div>\n Geb hier Dein Passwort erneuert ein:\n <br>\n <input type="password" name="tmp">\n </div>\n <br>\n <font color=ffffff>\n <input type="submit" value="Registrieren">\n </font>\n <br>\n </form>\n <hr>\n <div>\n Um den Chat zu betreten m\374ssen die Daten nach der Registration auf der Startseite erneuert best\344tigt werden !\n </div>\n </td>\n </tr>\n </table>\n</center>\n</body>\n</html>\n];
+}
+sub checklogin {
+ opendir USERS, 'data/online/users';
+ my(@users) = readdir USERS;
+ closedir USERS;
+ my $users = $#users;
+ if ($users > $limit && 3 > &hierachie($alias)) {
+ $tmp = 'full';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ my $lognotexists = 'true';
+ opendir USERDIR, 'data/user/options';
+ my(@userdir) = readdir USERDIR;
+ closedir USERDIR;
+ foreach $user (@userdir) {
+ if ($user eq $alias) {
+ open OPTIONS, "<data/user/options/$alias";
+ my(@options) = <OPTIONS>;
+ close OPTIONS;
+ foreach $_ (@options) {
+ chomp $_;
+ }
+ if ((crypt $pw, $cryptkey) eq $options[0] || $options[0] eq $pw) {
+ open BAN, '<data/ban';
+ my(@ban) = <BAN>;
+ close BAN;
+ foreach $_ (@ban) {
+ chomp $_;
+ if ($_ eq $alias or $_ eq 'ip://' . $client->peerhost) {
+ if (-f "data/online/users/$admin") {
+ &post_prv($admin, "<font color=ffffff><font color=ffa500>$_</font> kann sich nicht einloggen (Ist verbannt)!!</font>");
+ }
+ $tmp = 'banned';
+ &login_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ if ($options[1] eq undef) {
+ $col = &random_color;
+ }
+ else {
+ $col = $options[1];
+ }
+ if ($options[2] eq undef) {
+ $secol = &random_color;
+ }
+ else {
+ $secol = $options[2];
+ }
+ if ($options[3] eq undef) {
+ $maxVerlauf = '10';
+ }
+ else {
+ $maxVerlauf = $options[3];
+ }
+ if ($options[4] eq undef) {
+ $verlaufOrder = '1';
+ }
+ else {
+ $verlaufOrder = $options[4];
+ }
+ &rm_if_loggedin($alias);
+ # Sorry weil so ausführlich, der Code-Optimizer formulierte dies um!
+ my(@digit) = (('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), '.');
+ my $num1 = rand @digit;
+ my $num2 = rand @digit;
+ my $num3 = rand @digit;
+ my $num4 = rand @digit;
+ my $num5 = rand @digit;
+ my $num6 = rand @digit;
+ my $num7 = rand @digit;
+ my $num8 = rand @digit;
+ my $num9 = rand @digit;
+ my $num10 = rand @digit;
+ my $num11 = rand @digit;
+ my $num12 = rand @digit;
+ $tmpid = $digit[$num1] . $digit[$num2] . $digit[$num3] . $digit[$num4] . $digit[$num5] . $digit[$num6] . $digit[$num7] . $digit[$num8] . $digit[$num9] . $digit[$num10] . $digit[$num11] . $digit[$num12];
+ open TMPID, ">data/online/tmpid/$alias.$tmpid";
+ print TMPID $alias;
+ close TMPID;
+ open IDENT, ">data/online/ident/$alias";
+ print IDENT $client->peerhost . "\n$tmpid\n" . &get_online_time($alias) . "\n$col\n$secol\n";
+ close IDENT;
+ open LASTLOGIN, ">data/user/lastlogin/$alias";
+ print LASTLOGIN time;
+ close LASTLOGIN;
+ &frameset_html;
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ else {
+ $lognotexists = 'false';
+ }
+ }
+ }
+ &login_html;
+}
+sub create_alias {
+ if ($alias =~ /\W/ or $alias eq '') {
+ goto CREATE if $alias =~ /[-]/ and not $alias =~ /\W/;
+ &create_alias_html('alias_prohibited');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif ($pw ne $tmp) {
+ &create_alias_html('pw_wrong');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ elsif (length $alias >= 15) {
+ &create_alias_html('alias_length');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ CREATE: opendir USERDIR, 'data/user/options';
+ my(@user) = readdir USERDIR;
+ close USERDIR;
+ foreach $user (@user) {
+ if ($user eq $alias) {
+ &create_alias_html('alias_exists');
+ &del_away();
+ $client->shutdown(2);
+ exit 0;
+ }
+ }
+ $pw = crypt $pw, $cryptkey;
+ open OPTIONS, ">data/user/options/$alias";
+ print OPTIONS $pw . "\n";
+ close OPTIONS;
+ &login_html;
+}
+sub frameset_html {
+ print qq[<html>\n <head>\n <title>\n $title\n </title>\n </head>\n<frameset border=0 frameborder=0 framespacing=0 cols="130,*">\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name="online" src="chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid">\n <frameset border=0 frameborder=0 framespacing=0 cols="70,*">\n <frame name="logo" src="chat?request=htdocs&var=logo_html" scrolling="no">\n <frame name="reload" src="chat?request=htdocs" scrolling="no">\n </frameset>\n </frameset>\n <frameset border=0 frameborder=0 framespacing=0 rows="*,55">\n <frame name='main' src='chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder'>\n <frame name="input" src="chat?request=htdocs" scrolling="no">\n </frameset>\n</frameset>\n</html>\n];
+}
+1;
diff --git a/0.8.1/modules/statistic.pm b/0.8.1/modules/statistic.pm
new file mode 100755
index 0000000..9d23f8b
--- /dev/null
+++ b/0.8.1/modules/statistic.pm
@@ -0,0 +1,148 @@
+sub statistic {
+ &start_html('Statistiken');
+ &menu;
+ print $q->div('yChat Statistiken'), $q->hr, $q->div($q->a({-'href', "chat?request=statistic&var=ranking&alias=$alias&tmpid=$tmpid"}, 'Rankings'), ' | ', $q->a({-'href', "chat?request=statistic&var=del&alias=$alias&tmpid=$tmpid"}, 'Loginstatistiken'), ' | ', $q->a({-'href', "chat?request=statistic&var=statistic&alias=$alias&tmpid=$tmpid"}, 'DB-Statistik'), ' | ', $q->a({-'href', "chat?request=statistic&var=var&alias=$alias&tmpid=$tmpid"}, 'Umgebungsvariablen')), $q->hr;
+ if ($var eq 'ranking') {
+ opendir COUNTS, 'data/user/counts';
+ my(@counts) = readdir COUNTS;
+ closedir COUNTS;
+ print '<div>';
+ my $nr_start = $start;
+ my $nr_end = $end;
+ my %online;
+ my $rank;
+ my $nr;
+ foreach $_ (@counts) {
+ if (-f "data/user/counts/$_") {
+ if (s/.online//g) {
+ open TOTAL, "<data/user/counts/$_.online";
+ my $total = <TOTAL>;
+ close TOTAL;
+ $online{sprintf '%.2f', $total / 3600} = $_;
+ }
+ }
+ }
+ print '<div>', $q->b('Rankings:'), $q->br, '<table><tr><td><div><b>#:</b></div></td><td><b><div>St.:</div></b></td><td><b><div>Name:</div></b></td></tr>';
+ if (not $nr_start) {
+ $nr_start = 1;
+ }
+ if (not $nr_end) {
+ $nr_end = 20;
+ }
+ foreach $wert (reverse (sort { $a <=> $b } keys %online)) {
+ ++$nr;
+ if ($online{$wert} eq $alias) {
+ $rank = $nr;
+ last if $nr > $nr_end;
+ }
+ next if ($nr < $nr_start or $nr > $nr_end);
+ print q[<tr><td><font color='ffffff' size='1' face='arial'>] . $nr . q[</font></td><td><font color='ffffff' size='1' face='arial'> ] . $wert . "h </font></td><td> <a href='chat?request=divcom&var=alias_html&alias=$alias&tmp=$online{$wert}&tmpid=$tmpid'><font size='1' face='arial'>$online{$wert}</font></a></td></tr>\n";
+ }
+ print '</table>', $q->hr;
+ $nr_start -= 20;
+ $nr_end -= 20;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...<br>" if $nr_start > 0;
+ $nr_start += 40;
+ $nr_end += 40;
+ print "Rankings von <a href='chat?request=statistic&var=ranking&start=$nr_start&end=$nr_end&alias=$alias&tmpid=$tmpid'>$nr_start bis $nr_end</a> anzeigen ...", $q->br, $q->br, $q->b("$alias, Du befindest Dich auf Rank $rank</div>");
+ }
+ elsif ($var eq 'del') {
+# print '<div>', $q->b('Alte Benutzer l&ouml;schen:'), $q->br, "Benutzer, die sich 1440 Stunden (60 Tage) nicht mehr in das System eingeloggt haben, werden gel\366scht.", $q->br, $q->br;
+ opendir USER, 'data/user/options';
+ my(@user) = readdir USER;
+ closedir USER;
+ @user = sort(@user);
+ my $i = 0;
+ my $j;
+ my $k = 0;
+ my $l = 0;
+ my $full = $tmp;
+ foreach $_ (@user) {
+ if (-f "data/user/lastlogin/$_") {
+ open LOGIN, "<data/user/lastlogin/$_";
+ my $login = <LOGIN>;
+ close LOGIN;
+ $login = sprintf('%.2f', (time - $login) / 3600);
+ ++$j;
+ if (999 < $login and $login < 1440) {
+ ++$k;
+ print $q->font({-'color', 'ff6600'}, $q->b("$j($k) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 48) {
+ ++$l;
+ print $q->font({-'color', 'ffffef'}, $q->b("$j($l) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ elsif ($login < 1440) {
+ print $q->font({-'color', 'ffa500'}, $q->b("$j($l) $_ Letztes Login vor: " . $login . 'h')), $q->br, "\n" if $full ne undef;
+ }
+ else {
+ ++$k;
+ &kill_it($_, $i++, $login);
+ }
+ }
+ elsif (-f "data/user/options/$_") {
+ &kill_it($_, $i++);
+ }
+ }
+ print $q->hr if $full ne undef;
+ print '</div>', $q->div($q->b("$j Benutzer befinden sich in der Datenbank!", $q->br, $q->font({-'color', 'ffffef'}, "$l Benutzer haben sich innerhalb der letzten 48 Stunden eingeloggt!"), $q->br, $q->font({-'color', 'ffa500'}, "$k Benutzer haben sich &uuml;ber 1000 Stunden nicht mehr eingeloggt!"), $q->br, $q->font({-'color', 'ff0000'}, "$i Benutzer wurden gerade eben gel\366scht!")), $q->br, $q->br, 'PS: Jeder registrierte Benutzername wird nur einmal gez&auml;hlt!');
+ print $q->br, $q->div('(', $q->a({-'href', "chat?request=statistic&var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, 'Vollst&auml;ndige Ansicht'), ')') if $full eq undef;
+ }
+ elsif ($var eq 'var') {
+ print '<div>', $q->b('Server Umgebungsvariablen:'), $q->br, $q->br, 'Die Serverumgebungsvariablen k&ouml;nnen nur von Oberw&auml;chtern oder h&ouml;her eingesehen werden!', $q->br, $q->br;
+ if (7 <= &hierachie($alias)) {
+ while (($key, $value) = each %ENV) {
+ print "$key = $value\n", $q->br;
+ }
+ }
+ print '</div>';
+ }
+ elsif ($var eq 'statistic') {
+ print $q->div($q->b('yChat-DB Statistik:')), $q->br;
+ $files = 0;
+ $size = 0;
+ $directorys = 1;
+ &zaehle('data');
+ $size = sprintf('%.2f', $size / 1048576);
+ print $q->div("Dateien insgesamt: $files", $q->br, "MB insgesamt: $size", $q->br, "Verzeichnisse insgesamt: $directorys");
+ }
+ print $q->end_html;
+}
+sub zaehle {
+ local($dir, $data) = @_;
+ $dir = "$dir/$data" if $data ne undef;
+ opendir DATA, $dir;
+ local(@data) = readdir DATA;
+ closedir DATA;
+ $files2 = 0;
+ foreach $_ (@data) {
+ if (-f "$dir/$_") {
+ ++$files;
+ ++$files2;
+ $size += -s "$dir/$_";
+ }
+ elsif (-d "$dir/$_" and $_ ne '.' and $_ ne '..') {
+ ++$directorys;
+ &zaehle($dir, $_);
+ }
+ }
+}
+sub kill_it {
+ my($rm, $nr, $login) = @_;
+ $login = 'XXXXXX' if $login eq undef;
+ print $q->font({-'color', 'ff0000'}, $q->b("$j($nr) $rm Letztes Login vor: " . $login . 'h (wurde gel&ouml;scht)')), $q->br, "\n";
+ print q[<font size='1' color='ffffef'>];
+ print 'options ' if unlink "data/user/options/$rm";
+ print 'profiles ' if unlink "data/user/profiles/$rm";
+ print 'gbooks ' if unlink "data/user/gbooks/$rm";
+ print 'counts ' if unlink "data/user/counts/$rm";
+ print 'counts.online ' if unlink 'data/user/counts/' . $rm . '.online';
+ print 'lastlogin ' if unlink "data/user/lastlogin/$rm";
+ print 'memos' if unlink "data/user/memos/$rm";
+ print '</font><hr>';
+ open DEL, '>>data/kill';
+ print DEL "$rm wurde automatisch gekillt [$alias]\n";
+ close DEL;
+ return;
+}
+1;
diff --git a/0.8.1/modules/stream.pm b/0.8.1/modules/stream.pm
new file mode 100755
index 0000000..2885d8b
--- /dev/null
+++ b/0.8.1/modules/stream.pm
@@ -0,0 +1,170 @@
+sub stream {
+ unlink "data/online/rooms/$loginplace/$alias";
+ &secure_checkid($alias, $tmpid);
+ my $pid = $$;
+ $SIG{'CHLD'} = 'IGNORE';
+ ++$|;
+ print qq[<html>\n <head>\n<script language="JavaScript">\n<!--\n open('chat?request=online&room=$room&alias=$alias&tmpid=$tmpid','online');\n open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmp=login&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// open('chat?request=input&alias=$alias&room=$room&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','input');\n\n// Scroll-Routine von Anklepper (http://www.anklepper.de)\n// speziell f\374r yChat (http://www.yChat.de), Copyright 2000\nscrolling = true;\nmoves_steps = 4;\nmoves_interval = 4;\nfunction moves()\n{\n if( scrolling != false )\n window.scrollBy( 0, moves_steps );\n window.setTimeout( "moves()", moves_interval );\n}\nmoves();\n//-->\n</script>\n</head>\n<body bgcolor="$chatbg">\n];
+ &check_online;
+ print "<font size=1 color=ffffff face=arial>$title - Letzte &Auml;nderung $datum\n; Der Chat wird geladen...\n<br>";
+ sleep 1;
+ print "<b>Hallo <font color=$col>$alias</font></b>, mit dem Befehl /menu kannst du das Chat-Men&uuml; aufrufen!<br>";
+ sleep 1;
+ print "Du befindest dich im Raum <b>$room</b>: " . get_theme($room) . "<br>\n";
+ print "</font>\n";
+
+ if (-f "data/user/memos/$alias") {
+ open MEMOS, "<data/user/memos/$alias";
+ my(@memos) = <MEMOS>;
+ close MEMOS;
+ my $memos;
+ foreach $_ (@memos) {
+ $memos .= $_;
+ }
+ print $memos;
+ unlink "data/user/memos/$alias";
+ }
+
+ my ($change_room,
+ $startime,
+ $flooding,
+ @ignore,
+ @flood);
+
+ OPENMSGFILE:
+ $change_room = 0;
+ $startime = time;
+ $flooding = 0;
+ unless (-f "data/online/rstat/$room") {
+ open DATEI, ">data/online/rstat/$room";
+ print DATEI "0\n\n$alias<;1\n";
+ close DATEI;
+ }
+ open DATEI, ">data/online/users/$alias";
+ print DATEI time;
+ close DATEI;
+ open DATEI, ">data/online/rooms/$room/$alias";
+ print DATEI time;
+ close DATEI;
+ if (-e "data/msgs/$room") {
+ open MSGFILE, "<data/msgs/$room";
+ mkdir 'data/online/pids', 511 unless -d 'data/online/pids';
+ mkdir "data/online/pids/$room", 511 unless -d "data/online/pids/$room";
+ open PID, ">data/online/pids/$room/$pid";
+ print PID time;
+ close PID;
+ }
+ else {
+ sleep 1;
+ goto OPENMSGFILE;
+ }
+ &sendmsgs;
+ while (-f "data/online/users/$alias") {
+ local $SIG{'USR1'} = \&sendmsgs;
+ goto OPENMSGFILE if $change_room == 1;
+ unlink "data/online/rooms/$loginplace/$alias"
+ if (-f "data/online/rooms/$loginplace/$alias");
+ sleep 15;
+ print "\n";
+ }
+ sub sendmsgs {
+ for ($curpos = tell MSGFILE; defined($_ = <MSGFILE>); $curpos = tell MSGFILE) {
+ my($address, $stamp, $command, $action, $message, $from) = split(/<;/, $_, 7);
+ if ($address =~ /$\!/ or $address eq $alias) {
+ if ($stamp > $startime) {
+ if ($command eq 'col') {
+ ($col, $secol) = split(/;/, $action, 3);
+ }
+ elsif ($command eq 'cr') {
+ unlink "data/online/pids/$room/$pid";
+ $room = $action;
+ close MSGFILE;
+ $change_room = 1;
+ }
+ elsif ($command eq 'ig') {
+ my @temp;
+ my $add2list = 1;
+ foreach $_ (@ignore) {
+ if ($action ne $_) {
+ push @temp, $_;
+ }
+ else {
+ $add2list = 0;
+ }
+ }
+ if ($add2list == 1) {
+ push @ignore, $action;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias ignoriert!</font>");
+ }
+ else {
+ @ignore = @temp;
+ print "<font color='#ffffff'><font color='#ffa500'>$action</font> wird nun nicht mehr ignoriert!</font><br>\n";
+ &post_prv_extra($action, "<font color='#ff0000'>Du wirst nun von $alias nicht mehr ignoriert!</font>");
+ }
+ }
+ elsif ($command eq 'igl') {
+ my $ignored;
+ foreach $_ (@ignore) {
+ $ignored .= "$_ ";
+ }
+ if ($#ignore == -1) {
+ print "<font color='#ffffff'>Momentan wird keine Person von dir ignoriert!</font><br>\n";
+ }
+ else {
+ print "<font color='#ffffff'>Folgende Personen werden von dir ignoriert: <font color='#ffa500'>$ignored</font>!</font><br>\n";
+ }
+ }
+ elsif ($command eq 'quit') {
+ print "<script language='JavaScript'>\n";
+ print "open('chat?request=online&room=$loginplace&alias=$alias&tmpid=$tmpid','online');\n";
+ print "open('chat?request=htdocs','input');\n";
+ print "open('chat?request=loggedin&alias=$alias&col=$col&secol=$secol&tmpid=$tmpid&maxVerlauf=$maxVerlauf&verlaufOrder=$verlaufOrder','main');\n";
+ print "</script>\n";
+ last;
+ }
+ elsif ($change_room != 1) {
+ my $ignored = 0;
+ foreach $_ (@ignore) {
+ if ($_ eq $from) {
+ $ignored = 1;
+ last;
+ }
+ }
+ if ($ignored != 1) {
+ print "$message\n";
+ }
+ else {
+ $address =~ s/!//;
+ &post_prv_extra($from, "<font color='#ff0000'>Du wirst von $alias ignoriert!</font>") if $address eq $alias;
+ }
+ }
+ push @flood, $address . $command . $action . $message . $from;
+ if ($flood[0] eq $flood[1] and $flood[0] eq $flood[2] and $flood[0] eq $flood[3]) {
+ print "<i><font color=red>$from flutet den Chat !</font></i><br>\n";
+ if ($from eq $alias and $flooding++ and $flooding >= 4) {
+ &post($room, q[<i><font color='ffffff'>] . &timestring . " <font color='ffa500'><b>Das System</b></font> katapultiert <font color='".&get_ident($alias,3)."'>$alias</font>> wegen Fluten des Chats nach draussen ... </font></i>", $alias);
+ print "<script language='JavaScript'>open('chat?request=start&tmp=autokick','_top');</script>\n";
+ &rm_alias($alias, $room);
+ }
+ }
+ else {
+ $flooding = 0;
+ }
+ shift @flood if $#flood > 2;
+ }
+ }
+ }
+ seek MSGFILE, $curpos, 0;
+ }
+ unlink "data/online/pids/$room/$pid";
+}
+sub post_prv_extra {
+ my($alias, $message) = @_;
+ my $helpid = fork;
+ if ($helpid == 0) {
+ &post_prv($alias, $message);
+ exit 0;
+ }
+}
+1;
diff --git a/0.8.1/modules/webchat.pm b/0.8.1/modules/webchat.pm
new file mode 100755
index 0000000..90f8731
--- /dev/null
+++ b/0.8.1/modules/webchat.pm
@@ -0,0 +1,22 @@
+sub webchat {
+ my @rooms = &diropen('data/online/rooms');
+ my $output;
+
+ foreach my $room (@rooms) {
+ next if ($room =~ /\./);
+ my @users = &diropen("data/online/rooms/$room") or print "$!\n";
+
+ foreach my $user (@users) {
+ next if ($user =~ /\./);
+ open FILE, "data/online/rooms/$room/$user";
+ my $timestamp = <FILE>;
+ close FILE;
+ chomp $timestamp;
+
+ $output = $output . "($user)($timestamp)($room)\n";
+ }
+ }
+
+ print $output;
+}
+1;
diff --git a/0.8.1/modules/ychatd.pl b/0.8.1/modules/ychatd.pl
new file mode 100755
index 0000000..f804436
--- /dev/null
+++ b/0.8.1/modules/ychatd.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+use CGI;
+$q = new CGI;
+
+use config;
+use modules::commands;
+use modules::changeroom;
+use modules::divcom;
+use modules::hierachie;
+use modules::htdocs;
+use modules::input;
+use modules::loggedin;
+use modules::online;
+use modules::postmessage;
+use modules::shared;
+use modules::start;
+use modules::statistic;
+use modules::stream;
+use modules::webchat;
+use IO::Socket;
+use Socket;
+use POSIX;
+
+$SIG{'CHLD'} = 'IGNORE';
+
+$mainsocket = 'IO::Socket::INET'->new('LocalHost', "$localhost", 'LocalPort', $localport, 'Porto', 'tcp', 'Listen', $limit + 10, 'Reuse', 1);
+die "Kann Server-Socket nicht erzeugen: $!\n" unless $mainsocket;
+
+print "yChat wurde auf $localhost:$localport gestartet...\n";
+
+$STARTIME = time;
+
+#Debugging only
+#open AWAKE, ">data/online/awake/-$$-";
+#print AWAKE "$STARTIME - Daemon";
+#close AWAKE;
+
+while ($client = $mainsocket->accept) {
+ print $client "HTTP/1.1 200 OK\nContent-type:text/html\n\n";
+
+ ++$HITS;
+ $pid = fork;
+ if ($pid == 0) {
+ my @reqheader;
+
+ $rv = $client->recv($reqheader[0], POSIX::BUFSIZ, 0);
+ @reqheader = split "\n", $reqheader[0];
+
+ my $requeststring;
+ my(@tmp) = split(/\s+/, $reqheader[0], 0);
+
+ if ($tmp[0] eq 'GET') {
+ $requeststring = $tmp[1];
+
+ } else {
+ $requeststring = 'chat?'.$reqheader[-1];
+ }
+
+ #Debug only
+ #open AWAKE, ">data/online/awake/$$";
+ #print AWAKE $requeststring;
+ #close AWAKE;
+
+ @tmp = split(/\?/, $requeststring, 0);
+ @tmp = split(/&/, $tmp[1], 0);
+ my %variables;
+
+ foreach $_ (@tmp) {
+ my(@tmp) = split(/=/, $_, 0);
+ next if $tmp[0] eq 'admin' or $tmp[0] eq 'mogeladmin';
+ $tmp[0] =~ s[/][];
+ $variables{$tmp[0]} = &url_decode($tmp[1]);
+ }
+
+ foreach $_ (keys %variables) {
+ $variables{$_} =~ s/'/\\'/g;
+ my $eval = "\$$_ = '" . $variables{$_} . "';";
+ # print "$eval\n";
+ eval $eval;
+ }
+ *STD = *STDOUT;
+ *STDOUT = $client;
+ if ($request) {
+ &secure_checkid($alias, $tmpid) if $request != 'start';
+ eval "&$request";
+ }
+ else {
+ &start;
+ }
+ &del_awake();
+ $client->shutdown(2);
+ exit 0;
+ }
+}
diff --git a/0.8.1/setup.sh b/0.8.1/setup.sh
new file mode 100755
index 0000000..944c2f4
--- /dev/null
+++ b/0.8.1/setup.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+mke2fs /dev/ram0
+mke2fs /dev/ram1
+
+mkdir data
+cd data
+mkdir {logs,msgs,user,online}
+mount /dev/ram0 msgs
+mount /dev/ram1 online
+cd user
+mkdir {counts,memos,options,profiles,gbooks,lastlogin}
+cd ../online
+mkdir {rstat,rooms,pids,users,ident,tmpid,awake}
+cd ..
+
+chmod 700 * -R
+chown yC * -R
+
diff --git a/0.8.1/templates/chatiq.sno b/0.8.1/templates/chatiq.sno
new file mode 100755
index 0000000..2a024f5
--- /dev/null
+++ b/0.8.1/templates/chatiq.sno
@@ -0,0 +1 @@
+<div><h2>Chatiquette</h2></div><hr><div>Hier einige Grundlagen ...</div><style type="text/css"> li { color: #ffffff }</style><ul><li><div>Vergiss nie, dass am anderen Ende auch nur Menschen sitzen. Diese m&ouml;gen es gar nicht, angep&ouml;belt, beleidigt oder in sonstiger Weise angegriffen zu werden.</div></li><li><div>St&ouml;rend ist auch immer, wenn ein privater Streit im Chat ausgetragen wird. Tragt eure privaten Sachen ausserhalb des Chats aus.<br>Selbst wenn es nur Spass ist - weiss der Rest im Chat das?</div></li><li><div>Dauergeschrei f&auml;llt auch immer wieder st&ouml;rend auf. Was in Grossbuchstaben geschrieben wird, wird als Schreien bezeichnet.</div></li><li><div>Unsere ganz besonderen Spezialisten wollen auch immer wieder rausfliegen. Um das zu erreichen, senden sie die ganze Zeit Unsinn.</div></li><li><div>Diskussionen sind dagegen kein Problem. Daf&uuml;r ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger &ouml;ffentlichen Raum verlegt werden.</div></li></ul><div>Daraus ergeben sich folgende Regeln:</div><ul><li><div>keinen beleidigenden Wortschatz verwenden</div></li><li><div>obz&ouml;ner und verfassungsfeindlicher Wortschatz f&auml;llt auch weg</div></li><li><div>streitet euch woanders oder in einem privaten Raum</div></li><li><div>schreit nich so viel</div></li><li><div>schreibt keinen Unsinn, der so aussieht, als ob eure Katze über die Tastatur gelaufen ist</div></li><li><div>schreibt nicht zu schnell hintereinander, besonders nicht dasselbe</div></li><li><div>verlagert die Diskussion, wenn sich jemand gest&ouml;rt f&uuml;hlt</div></li><li><div>Diese Liste ist nicht vollst&auml;ndig. Mit dem gesunden Menschenverstand sollte es eigentlich m&ouml;glich sein, sich die nicht aufgef&uuml;hrten Punkte zu denken.</div></li></ul><div>So - nach den ganzen "lass-es-bessers" noch ein paar &Uuml;berlebenstips:</div><ul><li><div>beachte die oben stehenden Punkte ;-)</div></li><li><div>es macht sich immer gut, beim Reinkommen mal zu gr&uuml;ssen</div></li><li><div>warte nicht, bis man/frau dich anspricht - werde selbst aktiv und gib deinen Senf dazu</div></li><li><div>es gibt meist kein allgemein anerkanntes Gespr&auml;chsthema - lies dich einfach rein</div></li><li><div>die frage &quot;wer will chatten&quot; ist eigentlich &uuml;berfl&uuml;ssig in einem Chat (wir warten doch alle nur aufs Ufo ;-)</div></li><li><div>fang nich sofort mit den W-Fragen (woher, wie alt, weiblich oder männlich?) an - es st&ouml;rt einige Leute</div></li></ul><div>Problematisch f&uuml;r die W&auml;chter und Oberw&auml;chter ist:</div><ul><li><div>&quot;der nervt mich - schmeiss den mal raus&quot; ist oft nicht nachvollziehbar, weil der W&Auml; oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis daf&uuml;r hat.</div></li></ul><hr><div><h2>Richtlinien f&uuml;r den gestressten W&Auml; und OW:</h2></div><ul><li><div>Du hast die Macht - aber mi&szlig;brauche sie nicht!</div></li><li><div>Leute, die ganz offensichtlich st&ouml;ren wollen und dabei den Chatbetrieb massiv behindern, sofort rausschmeissen! Kriterien dazu:</div><ul><li><div>Fluten des Chats</div></li><li><div>Wiederholung von Parolen</div></li><li><div>Exzessive Nutzung von zuf&auml;lligen Buchstaben-/Zeichenfolgen</div></li><li><div>usw...</div></li></ul></li><li><div>Bei den anderen vorher noch eine Warnung aussprechen...</div></li><li><div>Nicht vergessen: auch f&uuml;r euch gelten die oben aufgef&uuml;hrten Regeln!</div></li><li><div>Vergabe von Raumbesetzer- und W&auml;chterrechten:<br>(dies gilt f&uuml;r RB-Vergabe in der Cyberbar, W&Auml; allgemein)</div><ul><li><div>Um RB oder W&Auml; betteln wird schon mal gar nicht beachtet.</div></li><li><div>Wer W&Auml; wird, soll sichs verdienen - z.B. durch h&auml;ufiges Helfen bei Neulingen.</div></li><li><div>Ein W&Auml; sollte schon &ouml;fter im Chat sein.</div></li><li><div>Oberw&auml;chter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-)</div></li></ul></ul><div>Wer meint, von einem W&auml;chter oder Oberw&auml;chter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberw&auml;chter oder direkt an den obersten Boss: Snooper (<a href="mailto:admin@ychat.de">admin@ychat.de</a>).</div> \ No newline at end of file
diff --git a/0.8.1/templates/colors.sno b/0.8.1/templates/colors.sno
new file mode 100755
index 0000000..3640b9e
--- /dev/null
+++ b/0.8.1/templates/colors.sno
@@ -0,0 +1,290 @@
+ <table cellspacing=0 cellpadding=5 border=0>
+ <tr>
+ <td bgcolor="000000"><span style="color:#FFFFFF; text-decoration:line-through;">000000</span></td>
+ <td bgcolor="000033"><span style="color:#FFFFFF; text-decoration:line-through;">000033</span></td>
+ <td bgcolor="000066"><span style="color:#FFFFFF; text-decoration:line-through;">000066</span></td>
+ <td bgcolor="000099"><span style="color:#FFFFFF; text-decoration:line-through;">000099</span></td>
+ <td bgcolor="0000CC"><span style="color:#FFFFFF; text-decoration:line-through;">0000CC</span></td>
+ <td bgcolor="0000FF"><a href="javascript:insertcode('0000FF');" style="color:#FFFFFF;">0000FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="003300"><span style="color:#FFFFFF; text-decoration:line-through;">003300</span></td>
+ <td bgcolor="003333"><span style="color:#FFFFFF; text-decoration:line-through;">003333</span></td>
+ <td bgcolor="003366"><span style="color:#FFFFFF; text-decoration:line-through;">003366</span></td>
+ <td bgcolor="003399"><a href="javascript:insertcode('003399');" style="color:#FFFFFF;">003399</a></td>
+ <td bgcolor="0033CC"><a href="javascript:insertcode('0033CC');" style="color:#FFFFFF;">0033CC</a></td>
+ <td bgcolor="0033FF"><a href="javascript:insertcode('0033FF');" style="color:#FFFFFF;">0033FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="006600"><span style="color:#FFFFFF; text-decoration:line-through;">006600</span></td>
+ <td bgcolor="006633"><span style="color:#FFFFFF; text-decoration:line-through;">006633</span></td>
+ <td bgcolor="006666"><a href="javascript:insertcode('006666');" style="color:#FFFFFF;">006666</a></td>
+ <td bgcolor="006699"><a href="javascript:insertcode('006699');" style="color:#FFFFFF;">006699</a></td>
+ <td bgcolor="0066CC"><a href="javascript:insertcode('0066CC');" style="color:#FFFFFF;">0066CC</a></td>
+ <td bgcolor="0066FF"><a href="javascript:insertcode('0066FF');" style="color:#FFFFFF;">0066FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="009900"><a href="javascript:insertcode('009900');" style="color:#FFFFFF;">009900</a></td>
+ <td bgcolor="009933"><a href="javascript:insertcode('009933');" style="color:#FFFFFF;">009933</a></td>
+ <td bgcolor="009966"><a href="javascript:insertcode('009966');" style="color:#FFFFFF;">009966</a></td>
+ <td bgcolor="009999"><a href="javascript:insertcode('009999');" style="color:#FFFFFF;">009999</a></td>
+ <td bgcolor="0099CC"><a href="javascript:insertcode('0099CC');" style="color:#FFFFFF;">0099CC</a></td>
+ <td bgcolor="0099FF"><a href="javascript:insertcode('0099FF');" style="color:#FFFFFF;">0099FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00CC00"><a href="javascript:insertcode('00CC00');" style="color:#000000;">00CC00</a></td>
+ <td bgcolor="00CC33"><a href="javascript:insertcode('00CC33');" style="color:#000000;">00CC33</a></td>
+ <td bgcolor="00CC66"><a href="javascript:insertcode('00CC66');" style="color:#000000;">00CC66</a></td>
+ <td bgcolor="00CC99"><a href="javascript:insertcode('00CC99');" style="color:#000000;">00CC99</a></td>
+ <td bgcolor="00CCCC"><a href="javascript:insertcode('00CCCC');" style="color:#000000;">00CCCC</a></td>
+ <td bgcolor="00CCFF"><a href="javascript:insertcode('00CCFF');" style="color:#000000;">00CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="00FF00"><a href="javascript:insertcode('00FF00');" style="color:#000000;">00FF00</a></td>
+ <td bgcolor="00FF33"><a href="javascript:insertcode('00FF33');" style="color:#000000;">00FF33</a></td>
+ <td bgcolor="00FF66"><a href="javascript:insertcode('00FF66');" style="color:#000000;">00FF66</a></td>
+ <td bgcolor="00FF99"><a href="javascript:insertcode('00FF99');" style="color:#000000;">00FF99</a></td>
+ <td bgcolor="00FFCC"><a href="javascript:insertcode('00FFCC');" style="color:#000000;">00FFCC</a></td>
+ <td bgcolor="00FFFF"><a href="javascript:insertcode('00FFFF');" style="color:#000000;">00FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="330000"><span style="color:#FFFFFF; text-decoration:line-through;">330000</span></td>
+ <td bgcolor="330033"><span style="color:#FFFFFF; text-decoration:line-through;">330033</span></td>
+ <td bgcolor="330066"><span style="color:#FFFFFF; text-decoration:line-through;">330066</span></td>
+ <td bgcolor="330099"><a href="javascript:insertcode('330099');" style="color:#FFFFFF;">330099</a></td>
+ <td bgcolor="3300CC"><a href="javascript:insertcode('3300CC');" style="color:#FFFFFF;">3300CC</a></td>
+ <td bgcolor="3300FF"><a href="javascript:insertcode('3300FF');" style="color:#FFFFFF;">3300FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="333300"><span style="color:#FFFFFF; text-decoration:line-through;">333300</span></td>
+ <td bgcolor="333333"><span style="color:#FFFFFF; text-decoration:line-through;">333333</span></td>
+ <td bgcolor="333366"><a href="javascript:insertcode('333366');" style="color:#FFFFFF;">333366</a></td>
+ <td bgcolor="333399"><a href="javascript:insertcode('333399');" style="color:#FFFFFF;">333399</a></td>
+ <td bgcolor="3333CC"><a href="javascript:insertcode('3333CC');" style="color:#FFFFFF;">3333CC</a></td>
+ <td bgcolor="3333FF"><a href="javascript:insertcode('3333FF');" style="color:#FFFFFF;">3333FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="336600"><a href="javascript:insertcode('336600');" style="color:#FFFFFF;">336600</a></td>
+ <td bgcolor="336633"><a href="javascript:insertcode('336633');" style="color:#FFFFFF;">336633</a></td>
+ <td bgcolor="336666"><a href="javascript:insertcode('336666');" style="color:#FFFFFF;">336666</a></td>
+ <td bgcolor="336699"><a href="javascript:insertcode('336699');" style="color:#FFFFFF;">336699</a></td>
+ <td bgcolor="3366CC"><a href="javascript:insertcode('3366CC');" style="color:#FFFFFF;">3366CC</a></td>
+ <td bgcolor="3366FF"><a href="javascript:insertcode('3366FF');" style="color:#FFFFFF;">3366FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="339900"><a href="javascript:insertcode('339900');" style="color:#FFFFFF;">339900</a></td>
+ <td bgcolor="339933"><a href="javascript:insertcode('339933');" style="color:#FFFFFF;">339933</a></td>
+ <td bgcolor="339966"><a href="javascript:insertcode('339966');" style="color:#FFFFFF;">339966</a></td>
+ <td bgcolor="339999"><a href="javascript:insertcode('339999');" style="color:#FFFFFF;">339999</a></td>
+ <td bgcolor="3399CC"><a href="javascript:insertcode('3399CC');" style="color:#FFFFFF;">3399CC</a></td>
+ <td bgcolor="3399FF"><a href="javascript:insertcode('3399FF');" style="color:#FFFFFF;">3399FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33CC00"><a href="javascript:insertcode('33CC00');" style="color:#000000;">33CC00</a></td>
+ <td bgcolor="33CC33"><a href="javascript:insertcode('33CC33');" style="color:#000000;">33CC33</a></td>
+ <td bgcolor="33CC66"><a href="javascript:insertcode('33CC66');" style="color:#000000;">33CC66</a></td>
+ <td bgcolor="33CC99"><a href="javascript:insertcode('33CC99');" style="color:#000000;">33CC99</a></td>
+ <td bgcolor="33CCCC"><a href="javascript:insertcode('33CCCC');" style="color:#000000;">33CCCC</a></td>
+ <td bgcolor="33CCFF"><a href="javascript:insertcode('33CCFF');" style="color:#000000;">33CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="33FF00"><a href="javascript:insertcode('33FF00');" style="color:#000000;">33FF00</a></td>
+ <td bgcolor="33FF33"><a href="javascript:insertcode('33FF33');" style="color:#000000;">33FF33</a></td>
+ <td bgcolor="33FF66"><a href="javascript:insertcode('33FF66');" style="color:#000000;">33FF66</a></td>
+ <td bgcolor="33FF99"><a href="javascript:insertcode('33FF99');" style="color:#000000;">33FF99</a></td>
+ <td bgcolor="33FFCC"><a href="javascript:insertcode('33FFCC');" style="color:#000000;">33FFCC</a></td>
+ <td bgcolor="33FFFF"><a href="javascript:insertcode('33FFFF');" style="color:#000000;">33FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="660000"><span style="color:#FFFFFF; text-decoration:line-through;">660000</span></td>
+ <td bgcolor="660033"><span style="color:#FFFFFF; text-decoration:line-through;">660033</span></td>
+ <td bgcolor="660066"><a href="javascript:insertcode('660066');" style="color:#FFFFFF;">660066</a></td>
+ <td bgcolor="660099"><a href="javascript:insertcode('660099');" style="color:#FFFFFF;">660099</a></td>
+ <td bgcolor="6600CC"><a href="javascript:insertcode('6600CC');" style="color:#FFFFFF;">6600CC</a></td>
+ <td bgcolor="6600FF"><a href="javascript:insertcode('6600FF');" style="color:#FFFFFF;">6600FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="663300"><a href="javascript:insertcode('663300');" style="color:#FFFFFF;">663300</a></td>
+ <td bgcolor="663333"><a href="javascript:insertcode('663333');" style="color:#FFFFFF;">663333</a></td>
+ <td bgcolor="663366"><a href="javascript:insertcode('663366');" style="color:#FFFFFF;">663366</a></td>
+ <td bgcolor="663399"><a href="javascript:insertcode('663399');" style="color:#FFFFFF;">663399</a></td>
+ <td bgcolor="6633CC"><a href="javascript:insertcode('6633CC');" style="color:#FFFFFF;">6633CC</a></td>
+ <td bgcolor="6633FF"><a href="javascript:insertcode('6633FF');" style="color:#FFFFFF;">6633FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="666600"><a href="javascript:insertcode('666600');" style="color:#FFFFFF;">666600</a></td>
+ <td bgcolor="666633"><a href="javascript:insertcode('666633');" style="color:#FFFFFF;">666633</a></td>
+ <td bgcolor="666666"><a href="javascript:insertcode('666666');" style="color:#FFFFFF;">666666</a></td>
+ <td bgcolor="666699"><a href="javascript:insertcode('666699');" style="color:#FFFFFF;">666699</a></td>
+ <td bgcolor="6666CC"><a href="javascript:insertcode('6666CC');" style="color:#FFFFFF;">6666CC</a></td>
+ <td bgcolor="6666FF"><a href="javascript:insertcode('6666FF');" style="color:#FFFFFF;">6666FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="669900"><a href="javascript:insertcode('669900');" style="color:#000000;">669900</a></td>
+ <td bgcolor="669933"><a href="javascript:insertcode('669933');" style="color:#000000;">669933</a></td>
+ <td bgcolor="669966"><a href="javascript:insertcode('669966');" style="color:#000000;">669966</a></td>
+ <td bgcolor="669999"><a href="javascript:insertcode('669999');" style="color:#000000;">669999</a></td>
+ <td bgcolor="6699CC"><a href="javascript:insertcode('6699CC');" style="color:#000000;">6699CC</a></td>
+ <td bgcolor="6699FF"><a href="javascript:insertcode('6699FF');" style="color:#000000;">6699FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66CC00"><a href="javascript:insertcode('66CC00');" style="color:#000000;">66CC00</a></td>
+ <td bgcolor="66CC33"><a href="javascript:insertcode('66CC33');" style="color:#000000;">66CC33</a></td>
+ <td bgcolor="66CC66"><a href="javascript:insertcode('66CC66');" style="color:#000000;">66CC66</a></td>
+ <td bgcolor="66CC99"><a href="javascript:insertcode('66CC99');" style="color:#000000;">66CC99</a></td>
+ <td bgcolor="66CCCC"><a href="javascript:insertcode('66CCCC');" style="color:#000000;">66CCCC</a></td>
+ <td bgcolor="66CCFF"><a href="javascript:insertcode('66CCFF');" style="color:#000000;">66CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="66FF00"><a href="javascript:insertcode('66FF00');" style="color:#000000;">66FF00</a></td>
+ <td bgcolor="66FF33"><a href="javascript:insertcode('66FF33');" style="color:#000000;">66FF33</a></td>
+ <td bgcolor="66FF66"><a href="javascript:insertcode('66FF66');" style="color:#000000;">66FF66</a></td>
+ <td bgcolor="66FF99"><a href="javascript:insertcode('66FF99');" style="color:#000000;">66FF99</a></td>
+ <td bgcolor="66FFCC"><a href="javascript:insertcode('66FFCC');" style="color:#000000;">66FFCC</a></td>
+ <td bgcolor="66FFFF"><a href="javascript:insertcode('66FFFF');" style="color:#000000;">66FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="990000"><a href="javascript:insertcode('990000');" style="color:#FFFFFF;">990000</a></td>
+ <td bgcolor="990033"><a href="javascript:insertcode('990033');" style="color:#FFFFFF;">990033</a></td>
+ <td bgcolor="990066"><a href="javascript:insertcode('990066');" style="color:#FFFFFF;">990066</a></td>
+ <td bgcolor="990099"><a href="javascript:insertcode('990099');" style="color:#FFFFFF;">990099</a></td>
+ <td bgcolor="9900CC"><a href="javascript:insertcode('9900CC');" style="color:#FFFFFF;">9900CC</a></td>
+ <td bgcolor="9900FF"><a href="javascript:insertcode('9900FF');" style="color:#FFFFFF;">9900FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="993300"><a href="javascript:insertcode('993300');" style="color:#FFFFFF;">993300</a></td>
+ <td bgcolor="993333"><a href="javascript:insertcode('993333');" style="color:#FFFFFF;">993333</a></td>
+ <td bgcolor="993366"><a href="javascript:insertcode('993366');" style="color:#FFFFFF;">993366</a></td>
+ <td bgcolor="993399"><a href="javascript:insertcode('993399');" style="color:#FFFFFF;">993399</a></td>
+ <td bgcolor="9933CC"><a href="javascript:insertcode('9933CC');" style="color:#FFFFFF;">9933CC</a></td>
+ <td bgcolor="9933FF"><a href="javascript:insertcode('9933FF');" style="color:#FFFFFF;">9933FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="996600"><a href="javascript:insertcode('996600');" style="color:#FFFFFF;">996600</a></td>
+ <td bgcolor="996633"><a href="javascript:insertcode('996633');" style="color:#FFFFFF;">996633</a></td>
+ <td bgcolor="996666"><a href="javascript:insertcode('996666');" style="color:#FFFFFF;">996666</a></td>
+ <td bgcolor="996699"><a href="javascript:insertcode('996699');" style="color:#FFFFFF;">996699</a></td>
+ <td bgcolor="9966CC"><a href="javascript:insertcode('9966CC');" style="color:#FFFFFF;">9966CC</a></td>
+ <td bgcolor="9966FF"><a href="javascript:insertcode('9966FF');" style="color:#FFFFFF;">9966FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="999900"><a href="javascript:insertcode('999900');" style="color:#000000;">999900</a></td>
+ <td bgcolor="999933"><a href="javascript:insertcode('999933');" style="color:#000000;">999933</a></td>
+ <td bgcolor="999966"><a href="javascript:insertcode('999966');" style="color:#000000;">999966</a></td>
+ <td bgcolor="999999"><a href="javascript:insertcode('999999');" style="color:#000000;">999999</a></td>
+ <td bgcolor="9999CC"><a href="javascript:insertcode('9999CC');" style="color:#000000;">9999CC</a></td>
+ <td bgcolor="9999FF"><a href="javascript:insertcode('9999FF');" style="color:#000000;">9999FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99CC00"><a href="javascript:insertcode('99CC00');" style="color:#000000;">99CC00</a></td>
+ <td bgcolor="99CC33"><a href="javascript:insertcode('99CC33');" style="color:#000000;">99CC33</a></td>
+ <td bgcolor="99CC66"><a href="javascript:insertcode('99CC66');" style="color:#000000;">99CC66</a></td>
+ <td bgcolor="99CC99"><a href="javascript:insertcode('99CC99');" style="color:#000000;">99CC99</a></td>
+ <td bgcolor="99CCCC"><a href="javascript:insertcode('99CCCC');" style="color:#000000;">99CCCC</a></td>
+ <td bgcolor="99CCFF"><a href="javascript:insertcode('99CCFF');" style="color:#000000;">99CCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="99FF00"><a href="javascript:insertcode('99FF00');" style="color:#000000;">99FF00</a></td>
+ <td bgcolor="99FF33"><a href="javascript:insertcode('99FF33');" style="color:#000000;">99FF33</a></td>
+ <td bgcolor="99FF66"><a href="javascript:insertcode('99FF66');" style="color:#000000;">99FF66</a></td>
+ <td bgcolor="99FF99"><a href="javascript:insertcode('99FF99');" style="color:#000000;">99FF99</a></td>
+ <td bgcolor="99FFCC"><a href="javascript:insertcode('99FFCC');" style="color:#000000;">99FFCC</a></td>
+ <td bgcolor="99FFFF"><a href="javascript:insertcode('99FFFF');" style="color:#000000;">99FFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC0000"><a href="javascript:insertcode('CC0000');" style="color:#FFFFFF;">CC0000</a></td>
+ <td bgcolor="CC0033"><a href="javascript:insertcode('CC0033');" style="color:#FFFFFF;">CC0033</a></td>
+ <td bgcolor="CC0066"><a href="javascript:insertcode('CC0066');" style="color:#FFFFFF;">CC0066</a></td>
+ <td bgcolor="CC0099"><a href="javascript:insertcode('CC0099');" style="color:#FFFFFF;">CC0099</a></td>
+ <td bgcolor="CC00CC"><a href="javascript:insertcode('CC00CC');" style="color:#FFFFFF;">CC00CC</a></td>
+ <td bgcolor="CC00FF"><a href="javascript:insertcode('CC00FF');" style="color:#FFFFFF;">CC00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC3300"><a href="javascript:insertcode('CC3300');" style="color:#FFFFFF;">CC3300</a></td>
+ <td bgcolor="CC3333"><a href="javascript:insertcode('CC3333');" style="color:#FFFFFF;">CC3333</a></td>
+ <td bgcolor="CC3366"><a href="javascript:insertcode('CC3366');" style="color:#FFFFFF;">CC3366</a></td>
+ <td bgcolor="CC3399"><a href="javascript:insertcode('CC3399');" style="color:#FFFFFF;">CC3399</a></td>
+ <td bgcolor="CC33CC"><a href="javascript:insertcode('CC33CC');" style="color:#FFFFFF;">CC33CC</a></td>
+ <td bgcolor="CC33FF"><a href="javascript:insertcode('CC33FF');" style="color:#FFFFFF;">CC33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC6600"><a href="javascript:insertcode('CC6600');" style="color:#000000;">CC6600</a></td>
+ <td bgcolor="CC6633"><a href="javascript:insertcode('CC6633');" style="color:#000000;">CC6633</a></td>
+ <td bgcolor="CC6666"><a href="javascript:insertcode('CC6666');" style="color:#000000;">CC6666</a></td>
+ <td bgcolor="CC6699"><a href="javascript:insertcode('CC6699');" style="color:#000000;">CC6699</a></td>
+ <td bgcolor="CC66CC"><a href="javascript:insertcode('CC66CC');" style="color:#000000;">CC66CC</a></td>
+ <td bgcolor="CC66FF"><a href="javascript:insertcode('CC66FF');" style="color:#000000;">CC66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CC9900"><a href="javascript:insertcode('CC9900');" style="color:#000000;">CC9900</a></td>
+ <td bgcolor="CC9933"><a href="javascript:insertcode('CC9933');" style="color:#000000;">CC9933</a></td>
+ <td bgcolor="CC9966"><a href="javascript:insertcode('CC9966');" style="color:#000000;">CC9966</a></td>
+ <td bgcolor="CC9999"><a href="javascript:insertcode('CC9999');" style="color:#000000;">CC9999</a></td>
+ <td bgcolor="CC99CC"><a href="javascript:insertcode('CC99CC');" style="color:#000000;">CC99CC</a></td>
+ <td bgcolor="CC99FF"><a href="javascript:insertcode('CC99FF');" style="color:#000000;">CC99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCCC00"><a href="javascript:insertcode('CCCC00');" style="color:#000000;">CCCC00</a></td>
+ <td bgcolor="CCCC33"><a href="javascript:insertcode('CCCC33');" style="color:#000000;">CCCC33</a></td>
+ <td bgcolor="CCCC66"><a href="javascript:insertcode('CCCC66');" style="color:#000000;">CCCC66</a></td>
+ <td bgcolor="CCCC99"><a href="javascript:insertcode('CCCC99');" style="color:#000000;">CCCC99</a></td>
+ <td bgcolor="CCCCCC"><a href="javascript:insertcode('CCCCCC');" style="color:#000000;">CCCCCC</a></td>
+ <td bgcolor="CCCCFF"><a href="javascript:insertcode('CCCCFF');" style="color:#000000;">CCCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="CCFF00"><a href="javascript:insertcode('CCFF00');" style="color:#000000;">CCFF00</a></td>
+ <td bgcolor="CCFF33"><a href="javascript:insertcode('CCFF33');" style="color:#000000;">CCFF33</a></td>
+ <td bgcolor="CCFF66"><a href="javascript:insertcode('CCFF66');" style="color:#000000;">CCFF66</a></td>
+ <td bgcolor="CCFF99"><a href="javascript:insertcode('CCFF99');" style="color:#000000;">CCFF99</a></td>
+ <td bgcolor="CCFFCC"><a href="javascript:insertcode('CCFFCC');" style="color:#000000;">CCFFCC</a></td>
+ <td bgcolor="CCFFFF"><a href="javascript:insertcode('CCFFFF');" style="color:#000000;">CCFFFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF0000"><a href="javascript:insertcode('FF0000');" style="color:#FFFFFF;">FF0000</a></td>
+ <td bgcolor="FF0033"><a href="javascript:insertcode('FF0033');" style="color:#FFFFFF;">FF0033</a></td>
+ <td bgcolor="FF0066"><a href="javascript:insertcode('FF0066');" style="color:#FFFFFF;">FF0066</a></td>
+ <td bgcolor="FF0099"><a href="javascript:insertcode('FF0099');" style="color:#FFFFFF;">FF0099</a></td>
+ <td bgcolor="FF00CC"><a href="javascript:insertcode('FF00CC');" style="color:#FFFFFF;">FF00CC</a></td>
+ <td bgcolor="FF00FF"><a href="javascript:insertcode('FF00FF');" style="color:#FFFFFF;">FF00FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF3300"><a href="javascript:insertcode('FF3300');" style="color:#FFFFFF;">FF3300</a></td>
+ <td bgcolor="FF3333"><a href="javascript:insertcode('FF3333');" style="color:#FFFFFF;">FF3333</a></td>
+ <td bgcolor="FF3366"><a href="javascript:insertcode('FF3366');" style="color:#FFFFFF;">FF3366</a></td>
+ <td bgcolor="FF3399"><a href="javascript:insertcode('FF3399');" style="color:#FFFFFF;">FF3399</a></td>
+ <td bgcolor="FF33CC"><a href="javascript:insertcode('FF33CC');" style="color:#FFFFFF;">FF33CC</a></td>
+ <td bgcolor="FF33FF"><a href="javascript:insertcode('FF33FF');" style="color:#FFFFFF;">FF33FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF6600"><a href="javascript:insertcode('FF6600');" style="color:#000000;">FF6600</a></td>
+ <td bgcolor="FF6633"><a href="javascript:insertcode('FF6633');" style="color:#000000;">FF6633</a></td>
+ <td bgcolor="FF6666"><a href="javascript:insertcode('FF6666');" style="color:#000000;">FF6666</a></td>
+ <td bgcolor="FF6699"><a href="javascript:insertcode('FF6699');" style="color:#000000;">FF6699</a></td>
+ <td bgcolor="FF66CC"><a href="javascript:insertcode('FF66CC');" style="color:#000000;">FF66CC</a></td>
+ <td bgcolor="FF66FF"><a href="javascript:insertcode('FF66FF');" style="color:#000000;">FF66FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FF9900"><a href="javascript:insertcode('FF9900');" style="color:#000000;">FF9900</a></td>
+ <td bgcolor="FF9933"><a href="javascript:insertcode('FF9933');" style="color:#000000;">FF9933</a></td>
+ <td bgcolor="FF9966"><a href="javascript:insertcode('FF9966');" style="color:#000000;">FF9966</a></td>
+ <td bgcolor="FF9999"><a href="javascript:insertcode('FF9999');" style="color:#000000;">FF9999</a></td>
+ <td bgcolor="FF99CC"><a href="javascript:insertcode('FF99CC');" style="color:#000000;">FF99CC</a></td>
+ <td bgcolor="FF99FF"><a href="javascript:insertcode('FF99FF');" style="color:#000000;">FF99FF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFCC00"><a href="javascript:insertcode('FFCC00');" style="color:#000000;">FFCC00</a></td>
+ <td bgcolor="FFCC33"><a href="javascript:insertcode('FFCC33');" style="color:#000000;">FFCC33</a></td>
+ <td bgcolor="FFCC66"><a href="javascript:insertcode('FFCC66');" style="color:#000000;">FFCC66</a></td>
+ <td bgcolor="FFCC99"><a href="javascript:insertcode('FFCC99');" style="color:#000000;">FFCC99</a></td>
+ <td bgcolor="FFCCCC"><a href="javascript:insertcode('FFCCCC');" style="color:#000000;">FFCCCC</a></td>
+ <td bgcolor="FFCCFF"><a href="javascript:insertcode('FFCCFF');" style="color:#000000;">FFCCFF</a></td>
+ </tr>
+ <tr>
+ <td bgcolor="FFFF00"><a href="javascript:insertcode('FFFF00');" style="color:#000000;">FFFF00</a></td>
+ <td bgcolor="FFFF33"><a href="javascript:insertcode('FFFF33');" style="color:#000000;">FFFF33</a></td>
+ <td bgcolor="FFFF66"><a href="javascript:insertcode('FFFF66');" style="color:#000000;">FFFF66</a></td>
+ <td bgcolor="FFFF99"><a href="javascript:insertcode('FFFF99');" style="color:#000000;">FFFF99</a></td>
+ <td bgcolor="FFFFCC"><a href="javascript:insertcode('FFFFCC');" style="color:#000000;">FFFFCC</a></td>
+ <td bgcolor="FFFFFF"><a href="javascript:insertcode('FFFFFF');" style="color:#000000;">FFFFFF</a></td>
+ </tr>
+</table> \ No newline at end of file
diff --git a/0.8.1/templates/help.sno b/0.8.1/templates/help.sno
new file mode 100755
index 0000000..e1f6de9
--- /dev/null
+++ b/0.8.1/templates/help.sno
@@ -0,0 +1,79 @@
+<div>
+ Alle Chat-Befehle:
+</div>
+<hr>
+<table border=1>
+<tr><th><div>SU</div></th><th><div>Befehl</div></th><th><div>Beschreibung</div></th></tr>
+<tr><td><div>NC</div></td><td><div>/about</div></td><td><div>Zeigt aktuelle Version und andere Infos der Community an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/away <font color=red>Nachricht</font></div></td><td><div>Abmelden mit einer<font color=red>Abmeldenachricht</font></div></td></tr>
+<tr><td><div>NC</div></td><td><div>/clear</div></td><td><div>Bildschirm wird gelöscht</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/col <font color=red>XXXXXX</font> <font color=ffa500>XXXXXX</font></div></td><td><div>Farbe/n (<font color=red>Namensfarbe</font> / <font color=ffa500>Textfarbe</font>) wechseln. Angabe in Hexadezimal. Wird gar keine Farbe angegeben, dann wird eine zufällige generiert!</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/date</div></td><td><div>Zeigt aktuelles Datum und Urzeit an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/exit</div></td><td><div>Komplett aus dem System ausloggen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/getcol <font color=red>Alias</font></div></td><td><div>Zeigt an welche Farb-Codes <font color=red>Alias</font> zum Chatten verwendet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/hits</div></td><td><div>Zeigt an vor wieviel Stunden der Chat-Server neugestartet wurde und die Hits und Hits per Minute seit dieser Zeit</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ig <font color=red>Alias</font></div></td><td><div>Setzt/entfernt <font color=red>Alias</font> auf/aus die/der Ignorierliste. Wird das Argument weggelassen, so wird die Liste aller ignorierten Personen angezeigt</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/j <font color=red>Raumname</font></div></td><td><div>Raum wechseln/erstellen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ju <font color=red>Alias</font></div></td><td><div>In den Raum wechseln/folgen, wo sich <font color=red>Alias</font> befindet.</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/m <font color=red>Aktion</font></div></td><td><div>Handeln mit 2 Farben</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/me <font color=red>Aktion</font></div></td><td><div>Handeln mit einer Farbe</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/memo <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine <font color=ffa500>Memonachricht</font> hinterlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/msg <font color=red>Alias</font> <font color=ffa500>Nachricht</font></div></td><td><div><font color=red>Alias</font> eine private <font color=ffa500>Nachricht</font> flüstern</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/ <font color=ffa500>Nachricht</font></div></td><td><div>Eine private <font color=ffa500>Nachricht</font> demjenigen flüstern, dem zuletzt eine geflüstert wurde</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/online <font color=red>Alias</font></div></td><td><div>Zeigt Onlineminuten von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/q</div></td><td><div>Chat verlassen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/rmgb</div></td><td><div>Das eigene Gästebuch komplett weglöschen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/s <font color=red>Nachricht</font></div></td><td><div><font color=red>Nachricht</font> schreien</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/seen <font color=red>Alias</font></div></td><td><div>Zeigt an, vor wieviel Stunden sich <font color=red>Nachricht</font> zum letzten Mal in das System eingelogt hat</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/selfkill</div></td><td><div>Sich selbst ganz und gar aus dem System entfernen</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/sep <font color=red>Raumname</font></div></td><td><div>In den Raum <font color=red>Raumnamen</font> wechseln und gleichzeitig absperren</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/uptime</div></td><td><div>Siehe Befehl "/hits"</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/w</div></td><td><div>Zeigt an, wer sich im aktuellen Raum befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc <font color=red>Raum</font></div></td><td><div>Zeigt an, wer sich im <font color=red>Raum</font> befindet. Wird kein Raum angegeben, dann wird ledeglich angezeigt, wer sich im System befindet</div></td></tr>
+<tr><td><div>NC</div></td><td><div>/wc/</div></td><td><div>Zeigt alle offenen Räume und deren Chatter an</div></td></tr>
+<tr><td><div>NC</div></td><td> <div>/wj <font color=red>Alias</font></div></td><td><div>Zeigt an, in welchen Raum sich <font color=red>Alias</font> befindet</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/l</div></td><td><div>Der aktuelle Raum wird ab- bzw. aufgesperrt</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/rsu <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> die Raumbesetzerrechte entnehmen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/su <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Raumbesetzer ernennen</div></td></tr>
+<tr><td><div><font color=778899>RB</font></div></td><td><div>/t <font color=red>Thema</font></div></td><td><div>Dem Raum wird ein <font color=red>Thema</font> gegeben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban</div></td><td><div>Zeigt alle verbannten Benutzer an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rban <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/banip <font color=red>Alias</font></div></td><td><div>Die IP-Nummer von <font color=red>Alias</font> verbannen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/rbanip ip://<font color=red>x.x.x.x</font></div></td><td><div>Die IP-Nummer <font color=red>x.x.x.x</font> "entbannen"</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ip <font color=red>Alias</font></div></td><td><div>Zeigt die IP-Nummer von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/img</div></td><td><div>Versteckt/reaktiviert das eigene Superuser-Logo im Online-Frame</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/k <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat katapultiert!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/o <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird aus dem Chat ausgeloggt!</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/sl <font color=red>Raum</font></div></td><td><div>Einen anderen <font color=ffa500>Raum</font> absperren</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/ss <font color=red>Raum</font> <font color=ffa500>Nachricht</font></div></td><td><div>Eine <font color=ffa500>Nachricht</font> in <font color=red>Raum</font> hinüber rufen</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/st <font color=red>Raum</font> <font color=ffa500>Thema</font></div></td><td><div>Einem anderen <font color=red>Raum</font> ein <font color=ffa500>Thema</font > geben</div></td></tr>
+<tr><td><div><font color=ffa500>WÄ</font></div></td><td><div>/status <font color=ffa500>Alias</font></div></td><td><div>Zeigt den Superuserstatus von <font color=ffa500>Alias</font> an</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/kill <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> wird ganz und gar aus dem System entfernt</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/wa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/sys <font color=red>Nachricht</font></div></td><td><div>Systemnachricht schreiben. (Erscheint in allen existierenden Räumen)</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/twa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum temporären Wächter ernennen</div></td></tr>
+<tr><td><div><font color=green>OW</font></div></td><td><div>/rtwa <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom temporären Wächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/cool <font color=red>Nachricht</font></div></td><td><div>Gibt für den aktuellen Raum eine Systemmeldung aus</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/id <font color=red>Alias</font></div></td><td><div>Zeigt TempID von <font color=red>Alias</font> an</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/ow <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> zum Oberwächter ernennen</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/row <font color=red>Alias</font></div></td><td><div><font color=red>Alias</font> vom Oberwächter zum normalen Chatter degradieren</div></td></tr>
+<tr><td><div><font color=red>AD</font></div></td><td><div>/pw <font color=red>Alias</font></div></td><td><div>Zeigt das Passwort von <font color=red>Alias</font> an</div></td></tr>
+
+</table><hr>
+<div>
+ Zur Erklärung: NC steht für "Normale Chatter", RB für "Raumbesetzer", WÄ für "Wächter" und OW für "Oberwächter".
+ Obrige Befehle können nur von der/den jeweiligen Benutzergruppe/n ausgeführt werden.<br><br>
+ Allerdings gibt es folgendes zu beachten: Oberwächter verfügen über alle Chatbefehle. Normale Wächter über alle Chatbefehle, außer über die der Oberwächter.
+ Raumbesetzer können nur Raumbesetzerbefehle und die Befehle der normalen Chatter durchführen. Normale Chatter haben ledeglich die Standardbefehle zu verwenden.<br><br>
+ Weitere Besonderheiten der Wächter und Oberwächter:<br><br>
+ Wächter und Oberwächter können ....<br>
+ ... abgesperrte Chaträume problemlos betreten.<br>
+ ... nicht gekickt, verbannt oder gekillt werden.<br><br>
+ Nur Oberwächer können Logdateien der Cyberbar lesen!<br><br>
+ Oberwächter ernennt nur der Systemadministrator! Dieser wiederum hat weitere spezielle Befehle die geheim sind und die nur ihm
+ vorbehalten sind und ihm das Administrieren erleichtert.
+</div>
+</body>
+</html>
diff --git a/0.8.1/ychatd.pl b/0.8.1/ychatd.pl
new file mode 100755
index 0000000..f804436
--- /dev/null
+++ b/0.8.1/ychatd.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+use CGI;
+$q = new CGI;
+
+use config;
+use modules::commands;
+use modules::changeroom;
+use modules::divcom;
+use modules::hierachie;
+use modules::htdocs;
+use modules::input;
+use modules::loggedin;
+use modules::online;
+use modules::postmessage;
+use modules::shared;
+use modules::start;
+use modules::statistic;
+use modules::stream;
+use modules::webchat;
+use IO::Socket;
+use Socket;
+use POSIX;
+
+$SIG{'CHLD'} = 'IGNORE';
+
+$mainsocket = 'IO::Socket::INET'->new('LocalHost', "$localhost", 'LocalPort', $localport, 'Porto', 'tcp', 'Listen', $limit + 10, 'Reuse', 1);
+die "Kann Server-Socket nicht erzeugen: $!\n" unless $mainsocket;
+
+print "yChat wurde auf $localhost:$localport gestartet...\n";
+
+$STARTIME = time;
+
+#Debugging only
+#open AWAKE, ">data/online/awake/-$$-";
+#print AWAKE "$STARTIME - Daemon";
+#close AWAKE;
+
+while ($client = $mainsocket->accept) {
+ print $client "HTTP/1.1 200 OK\nContent-type:text/html\n\n";
+
+ ++$HITS;
+ $pid = fork;
+ if ($pid == 0) {
+ my @reqheader;
+
+ $rv = $client->recv($reqheader[0], POSIX::BUFSIZ, 0);
+ @reqheader = split "\n", $reqheader[0];
+
+ my $requeststring;
+ my(@tmp) = split(/\s+/, $reqheader[0], 0);
+
+ if ($tmp[0] eq 'GET') {
+ $requeststring = $tmp[1];
+
+ } else {
+ $requeststring = 'chat?'.$reqheader[-1];
+ }
+
+ #Debug only
+ #open AWAKE, ">data/online/awake/$$";
+ #print AWAKE $requeststring;
+ #close AWAKE;
+
+ @tmp = split(/\?/, $requeststring, 0);
+ @tmp = split(/&/, $tmp[1], 0);
+ my %variables;
+
+ foreach $_ (@tmp) {
+ my(@tmp) = split(/=/, $_, 0);
+ next if $tmp[0] eq 'admin' or $tmp[0] eq 'mogeladmin';
+ $tmp[0] =~ s[/][];
+ $variables{$tmp[0]} = &url_decode($tmp[1]);
+ }
+
+ foreach $_ (keys %variables) {
+ $variables{$_} =~ s/'/\\'/g;
+ my $eval = "\$$_ = '" . $variables{$_} . "';";
+ # print "$eval\n";
+ eval $eval;
+ }
+ *STD = *STDOUT;
+ *STDOUT = $client;
+ if ($request) {
+ &secure_checkid($alias, $tmpid) if $request != 'start';
+ eval "&$request";
+ }
+ else {
+ &start;
+ }
+ &del_awake();
+ $client->shutdown(2);
+ exit 0;
+ }
+}