diff options
| author | Paul Buetow <paul@buetow.org> | 2013-04-06 13:14:47 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2013-04-06 13:14:47 +0200 |
| commit | 630af0ed6c0af69c7df2e45aef7a87722a3c00c0 (patch) | |
| tree | ad76f850278b090f7e5c26561035d19c320400cc /0.8.1 | |
| parent | 2860b03f00e48264ed15c132ad90b240ebe6070b (diff) | |
tagging ychat-perl-legacyychat-perl-legacy
Diffstat (limited to '0.8.1')
| -rwxr-xr-x | 0.8.1/config.pm | 43 | ||||
| -rwxr-xr-x | 0.8.1/data/hierachie | 12 | ||||
| -rwxr-xr-x | 0.8.1/modules/changeroom.pm | 67 | ||||
| -rwxr-xr-x | 0.8.1/modules/commands.pm | 867 | ||||
| -rwxr-xr-x | 0.8.1/modules/divcom.pm | 288 | ||||
| -rwxr-xr-x | 0.8.1/modules/hierachie.pm | 77 | ||||
| -rwxr-xr-x | 0.8.1/modules/htdocs.pm | 127 | ||||
| -rwxr-xr-x | 0.8.1/modules/input.pm | 14 | ||||
| -rwxr-xr-x | 0.8.1/modules/loggedin.pm | 41 | ||||
| -rw-r--r-- | 0.8.1/modules/nohup.out | 2 | ||||
| -rwxr-xr-x | 0.8.1/modules/online.pm | 167 | ||||
| -rwxr-xr-x | 0.8.1/modules/postmessage.pm | 90 | ||||
| -rwxr-xr-x | 0.8.1/modules/shared.pm | 353 | ||||
| -rwxr-xr-x | 0.8.1/modules/start.pm | 264 | ||||
| -rwxr-xr-x | 0.8.1/modules/statistic.pm | 148 | ||||
| -rwxr-xr-x | 0.8.1/modules/stream.pm | 170 | ||||
| -rwxr-xr-x | 0.8.1/modules/webchat.pm | 22 | ||||
| -rwxr-xr-x | 0.8.1/modules/ychatd.pl | 94 | ||||
| -rwxr-xr-x | 0.8.1/setup.sh | 19 | ||||
| -rwxr-xr-x | 0.8.1/templates/chatiq.sno | 1 | ||||
| -rwxr-xr-x | 0.8.1/templates/colors.sno | 290 | ||||
| -rwxr-xr-x | 0.8.1/templates/help.sno | 79 | ||||
| -rwxr-xr-x | 0.8.1/ychatd.pl | 94 |
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'>] . ×tring . " <font color='$col'>$alias</font> verlä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'>] . ×tring . " 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'>] . ×tring . " 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'>] . ×tring . " 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'>] . ×tring . " <font color='$col'>$alias</font> wechselt in den Raum <b>$newroom</b> ...</font></i>", $alias); + $room = $newroom; + &post($room, q[<i><font color='ffffff'>] . ×tring . " <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'>] . ×tring . " <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'>] . ×tring . " <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'>] . ×tring . " <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'>] . ×tring . " <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'>] . ×tring . " <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'>] . ×tring . " <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>' . ×tring . " <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>' . ×tring . " <font color='$col'>$alias</font> sperrt den Raum ab ...</font></i>", $alias) if $method ne 'separee'; + } + else { + &post($room, '<i><font color=ffffff>' . ×tring . " <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>' . ×tring . " <font color='ffa500'><b>Das System</b></font> meldet <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivität ab ...</i></font>", $alias); + } + else { + &post($room, '<i><font color=ffffff>' . ×tring . " <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>' . ×tring . "</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>' . ×tring . " <font color='ffa500'><b>Das System</b></font> loggt <font color='".&get_ident($alias,3)."'>$alias</font> wegen Inaktivität aus ... </font></i>", $alias); + } + else { + &post($room, '<i><font color=ffffff>' . ×tring . " <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ö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>' . ×tring . " <font color='$col'>$alias</font> verlä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>' . ×tring . " <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'>] . ×tring . " <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ä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'>] . ×tring . " <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>' . ×tring . " <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'>] . ×tring . 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>' . ×tring . " <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>' . ×tring . " <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>' . ×tring . " <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ärer Wä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ö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>' . ×tring . " <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>' . ×tring . " <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>' . ×tring . " <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>' . ×tring . " <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'>] . ×tring . " <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>' . ×tring . 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>' . ×tring . " <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öheren Rang und kann nicht aus dem System entfernt werden !</font>"); + } + else { + &post($room, '<i><font color=ffffff>' . ×tring . " <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'>] . ×tring . " </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ären Wächter ernannt werden!</font></font>"); + } + else { + &hierachie_add_rstat($alias2wa, 3, $room2); + &post($room, '<i><font color=ffffff>' . ×tring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2wa,3)."'>$alias2wa</font> zum <font color='ff0000'>temporä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'>] . ×tring . " <font color='$col'>$alias</font> hat <font color='".&get_ident($alias2rwa,3)."'>$alias2rwa</font> vom <font color='ff0000'>temporä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ä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ächter ernannt werden!</font></font>"); + } + else { + &hierachie_add($alias2wa, 5); + &post($room, '<i><font color=ffffff>' . ×tring . " <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'>] . ×tring . " <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ächter ernannt werden!</font></font>"); + } + else { + &hierachie_add($alias2ow, 7); + &post($room, '<i><font color=ffffff>' . ×tring . " <font color='$col'>$alias</font> ernennt <font color='".&get_ident($alias2ow,3)."'>$alias2ow</font> zum Oberwä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'>] . ×tring . " <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>' . ×tring . " $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ü zu ö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/</</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/</</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/</</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>' . ×tring . " <font color='$col'>$alias</font> <font color='$secol'>hat seine Chat-Einstellungen geä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>' . ×tring . " <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ärer Wächter' alt='Temporärer Wächter' src='$gfxpath/twa.gif'></td>"; + last; + } + elsif ($level == 5) { + print "<tr><td><img title='Wächter' alt='Wächter' src='$gfxpath/wa.gif'></td>"; + last; + } + elsif ($level == 7) { + print "<tr><td><img title='oberwächter' alt='Oberwä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ächter' alt='Unsichtbarer Wächter' src='$gfxpath/wa-i.gif'></td>"; + last; + } + elsif ($level == 8) { + print "<tr><td><img title='oberwächter' alt='Unsichtbarer Oberwä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>' . ×tring . " <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/</</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>' . ×tring . " <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>' . ×tring . " <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ö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 ü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ählt!'); + print $q->br, $q->div('(', $q->a({-'href', "chat?request=statistic&var=del&tmp=true&alias=$alias&tmpid=$tmpid"}, 'Vollständige Ansicht'), ')') if $full eq undef; + } + elsif ($var eq 'var') { + print '<div>', $q->b('Server Umgebungsvariablen:'), $q->br, $q->br, 'Die Serverumgebungsvariablen können nur von Oberwächtern oder hö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ö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 Ä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ü 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'>] . ×tring . " <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ögen es gar nicht, angepöbelt, beleidigt oder in sonstiger Weise angegriffen zu werden.</div></li><li><div>Stö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ällt auch immer wieder stö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ür ist ein Chat ja da. Sobald allerdings das Thema der Diskussion zu sehr entgleist, sollte die Diskussion in einen etwas weniger ö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öner und verfassungsfeindlicher Wortschatz fä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ört fühlt</div></li><li><div>Diese Liste ist nicht vollständig. Mit dem gesunden Menschenverstand sollte es eigentlich möglich sein, sich die nicht aufgeführten Punkte zu denken.</div></li></ul><div>So - nach den ganzen "lass-es-bessers" noch ein paar Überlebenstips:</div><ul><li><div>beachte die oben stehenden Punkte ;-)</div></li><li><div>es macht sich immer gut, beim Reinkommen mal zu grü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ächsthema - lies dich einfach rein</div></li><li><div>die frage "wer will chatten" ist eigentlich überflü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ört einige Leute</div></li></ul><div>Problematisch für die Wächter und Oberwächter ist:</div><ul><li><div>"der nervt mich - schmeiss den mal raus" ist oft nicht nachvollziehbar, weil der WÄ oder OW die Vorgeschichte - die vielleicht ausserhalb des yChat stattgefunden hat - nicht kennt oder keinen Beweis dafür hat.</div></li></ul><hr><div><h2>Richtlinien für den gestressten WÄ und OW:</h2></div><ul><li><div>Du hast die Macht - aber mißbrauche sie nicht!</div></li><li><div>Leute, die ganz offensichtlich stö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ä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ür euch gelten die oben aufgeführten Regeln!</div></li><li><div>Vergabe von Raumbesetzer- und Wächterrechten:<br>(dies gilt für RB-Vergabe in der Cyberbar, WÄ allgemein)</div><ul><li><div>Um RB oder WÄ betteln wird schon mal gar nicht beachtet.</div></li><li><div>Wer WÄ wird, soll sichs verdienen - z.B. durch häufiges Helfen bei Neulingen.</div></li><li><div>Ein WÄ sollte schon öfter im Chat sein.</div></li><li><div>Oberwächter zu werden ist sehr schwierig. Frag gar nicht erst danach ;-)</div></li></ul></ul><div>Wer meint, von einem Wächter oder Oberwächter ungerecht behandelt worden zu sein (z.B. weil dieser wegen persönlichen Streitigkeiten rausschmeisst), richte seine Klage an einen Oberwä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; + } +} |
