#!/usr/bin/perl -w # yChat - Copyright by Paul C. Bütow use CGI; # CGI-Modul laden $q = new CGI; require config; # config.pm in Dokument laden print $q->header(); # HTTP-Header erzeugen ##################################### ##WELCHE SUB MUß AUSGEFÜHRT WERDEN?## ##################################### if ($var eq "input_html") { &input_html; } elsif ($var eq "post_msg") { &post_msg; } elsif ($var eq "change_room") { &change_room; } else { &error("Parameter fehlt"); } sub input_html { # Eingabemaske für den Chat. my ($reload,$action,$whisper,$lastmsg) = @_; $action = $q->param('action') if ($action eq ""); if ($tmp eq "away") { &zeit; &post("($hours:$min:$sec) $alias meldet sich zurück ... "); } elsif ($tmp eq "login") { &remove_rooms; &zeit; &post("($hours:$min:$sec) $alias hat den Chat betreten ..."); } if ($action ne "" && $action ne "whisper" && $action ne "away") { print ""; } else { print ""; } print "
"; print "" if ($action eq "away"); print < END if ($reload eq "true") { print < END } print $q->end_html; } sub post_msg { # Wird aufgerufen, wenn aus input_html eine Eingabe gepostet wurde. $msg =~ s#<#<\;#g; # HTML-Tags deaktivieren $msg =~ s#kilahu#yChat#g; $msg =~ s#ooperle#ooper!#g; if (substr($msg,0,1) ne "/") { # Überprüfen, ob Befehl oder Nachricht $msg = "$alias: ".$msg.""; $msg =~ s#"#''#g; # " in '' umtauschen für den Befehl "//" &input_html("true","",$id,$msg); # -> Reload=true, Action=none, Whisper=$id &secure_checkip($alias,1); &post($msg); } else { &secure_checkip($alias,2); &cmd($msg); } } sub cmd { # Alle Chatbefehle, die über input_html eingegeben werden können. $_[0] = $_[0]." "; $_[0] = substr($_[0], 1, length($_[0])-1); my @cmd = split(/ /, $_[0]); my $cmd = substr($_[0],0 , index($_[0], " ")); my ($reload,$action,$whisper) = ("true","",$id); #############>- NORMALE CHATBEFEHLE ( Alphabetisch sortiert ) -< #############>- DER LETZTEN ZUGEFLÜSTERTEN PERSON NOCHEINMAL FLÜSTERN -< if ($cmd eq "/") { &post($q->param('lastmsg')); #############>- INFORMATIONEN ÜBER DAS SYSTEM AUSGEBEN -< } elsif ($cmd eq "about") { &post_prv("$alias","Aktuelle Version ist $title und wurde am $datum aktuallisiert. Created by Paul C. Bütow 2k."); #############>- ABMELDEN MIT 'AWAY-NACHRICHT' -< } elsif ($cmd eq "away") { if ($tmp eq "away") { # Falls 2 mal hintereinander /away eingegeben wurde $tmp = ""; } for ($i=1; $i <= $#cmd; $i++) { $tmp = $tmp." ".$cmd[$i]; } &zeit; &post("($hours:$min:$sec) $alias meldet sich ab ($tmp ) ..."); $action = "away"; #############>- EIGENEN CHATBILDSCHIRM LÖSCHEN -< } elsif ($cmd eq "clear") { &post_prv("$alias",""); #############>- FARBEN WECHSELN -< } elsif ($cmd eq "col") { $col = $cmd[1]; my $tmpsecol = $cmd[2]; if ($tmpsecol eq "") { $secol = $col } else { $secol = $tmpsecol; } &read_file("data/user/options/$alias"); my @pro = ; close DATEI; &write_file_new("data/user/options/$alias"); print DATEI $pro[0]."".$col."\n".$secol; close DATEI; &zeit; &post("($hours:$min:$sec) $alias hat die Farbe gewechselt ..."); $action = "change_colors"; #############>- AKTUELLES DATUM UND URZEIT AUSGEBEN -< } elsif ($cmd eq "date") { &zeit; &post_prv("$alias","Heute ist der $day.$month. Jahr $year. Es ist genau $hours:$min Uhr und $sec Sekunden."); #############>- EINEN NEUEN RAUM ERSTELLEN BZW. IN EINEN BESTEHENDEN RAUM WECHSELN -< } elsif ($cmd eq "j") { &change_room("j",$cmd[1],$room); $action = "change_room"; #############>- HANDELN -< } elsif ($cmd eq "me" || $cmd eq "m") { for ($i=1; $i <= $#cmd; $i++) { $me_msg = $me_msg." ".$cmd[$i]; } if ($cmd eq "m") { &post("$alias $me_msg"); } else { &post("$alias $me_msg"); } #############>- FLÜSTERN ( Auch mit '/' ) -< } elsif ($cmd eq "msg" || $cmd eq "") { my ($alias2post,$msg2post) = ($cmd[1],""); if ($cmd eq "msg") { for ($i=2; $i <= $#cmd; $i++) { $msg2post = $msg2post." ".$cmd[$i]; } } else { $alias2post = $id; for ($i=1; $i <= $#cmd; $i++) { $msg2post = $msg2post." ".$cmd[$i]; } } &list_dir("data/online/users"); foreach(@dir) { if ($_ eq $alias2post) { &write_file("data/msgs/$alias2post"); print DATEI "$alias flüstert =>$msg2post
\n"; close DATEI; &write_file("data/msgs/$alias"); print DATEI "Zu $alias2post geflüstert =>$msg2post
\n"; close DATEI; &input_html($reload,"",$alias2post); exit; } } &post_prv("$alias","$alias2post ist momentan nicht anwesend !"); #############>- DAS SYSTEM VERLASSEN -< } elsif ($cmd eq "q") { &post_prv("$alias",""); sleep 1; &remove_online($alias,$room); &secure_removeip($alias); unlink("data/msgs/$alias"); exit; #############>- SCHREIEN -< } elsif ($cmd eq "s") { my ($msg2scream,$msg2post); for ($i=1; $i <= $#cmd; $i++) { $msg2scream = $msg2scream." ".$cmd[$i]; } $msg2post = "\U$msg2scream"; &post("$alias schreit: ".$msg2post.""); #############>- ANZEIGEN WER SICH IM AKTUELLEN RAUM BEFINDET -< } elsif ($cmd eq "w") { &list_dir("data/online/rooms/$room"); &read_file("data/online/rstat/$room"); my @rstat = ; close DATEI; my $door = "[Abgesperrt!]" if ($rstat[0] eq "1\n"); my ($is,$nr) = ("t",0); foreach(@dir) { if (-f "data/online/rooms/$room/$_") { $personen = $personen." ".$_; $nr++; } } &post_prv("$alias","$room $door ($nr) [".$rstat[1]."] : $personen"); #############>- ANZEIGEN WER SICH IM SYSTEM BEFINDET -< } elsif ($cmd eq "wc" || $cmd eq "wc/") { $raum = $cmd[1]; if ($raum eq "" && $cmd eq "wc") { &list_dir("data/online/users"); foreach(@dir) { $personen = $personen." ".$_ if (-f "data/online/users/$_"); } my $nr = ($#dir-1); my ($nrs,$is) = ("","ist"); if ($nr != 1) { $nrs = "en"; $is = "sind"; } &post_prv("$alias","$nr Person$nrs $is insgesamt eingelogt: $personen"); } elsif ($raum eq "" && $cmd eq "wc/") { my $msg2post; &list_dir("data/online/rooms"); foreach(@dir) { if (-e "data/online/rooms/$_" && $_ ne ".." && $_ ne ".") { &list_dir("data/online/rooms/$_",2); &read_file("data/online/rstat/$_"); my @rstat = ; close DATEI; my $door = "[Abgesperrt!]" if ($rstat[0] eq "1\n"); my $nr = $#dir2-1; $msg2post = $msg2post."$_ $door ($nr) [".$rstat[1]."] "; foreach $chatter (@dir2) { if (-f "data/online/rooms/$_/$chatter") { $msg2post = $msg2post."$chatter "; } } print ""; } } &post_prv("$alias","Folgende Räume sind offen:$msg2post
"); } elsif ($raum ne "") { my $personen; &list_dir("data/online/rooms/$raum"); foreach(@dir) { $personen = $personen." ".$_ if (-f "data/online/rooms/$raum/$_"); } my ($nr,$is) = (($#dir-1),"t"); if ($nr != 1) { $nrs = "en"; $is = "n"; } &post_prv("$alias"," $nr Person$nrs befinde$is sich im Raum \"$raum\": $personen"); } #############>- ANZEIGEN IN WELCHEN RAUM SICH JMD. BEFINDET BZW. JMD IN EINEN RAUM FOLGEN -< } elsif ($cmd eq "wj" || $cmd eq "ju") { my $alias2search = $cmd[1]; &list_dir("data/online/rooms"); foreach $raum (@dir) { &list_dir("data/online/rooms/$raum",2) if (-d "data/online/rooms/$raum"); foreach $user (@dir2) { if (-f "data/online/rooms/$raum/$user") { if ($user eq $alias2search) { if ($cmd eq "wj") { &post_prv("$alias","$alias2search befindet sich im Raum \"$raum\" !"); } else { $action = "change_room"; &change_room("ju",$raum,$room,$alias2search); } &input_html($reload,$action,$whisper); exit; } } } } &post_prv("$alias","$alias2search ist nicht eingelogt !"); #############>- RAUMNESETZER BEFEHLE ( Alphabetisch sortiert ) -< #############>- RAUM ABSCHLIESSEN/AUFSCHLIESSEN -< } elsif ($cmd eq "l") { &prove_besetzer($alias,$room); &hirachie($alias); if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") { my $lock = "0\n"; &zeit; if ($room eq "Cyberbar") { &post("($hours:$min:$sec) $alias sperrt den Raum ohne Erfolg ab ..."); } else { if ($r_stat[0] == 0) { $lock = "1\n"; &post("($hours:$min:$sec) $alias sperrt den Raum ab ..."); } else { &post("($hours:$min:$sec) $alias sperrt den Raum auf ..."); } for ($i=1;$i<=$#r_stat;$i++) { $lock = $lock.$r_stat[$i]; } write_file_new("data/online/rstat/$room"); print DATEI $lock; close DATEI; } } #############>- RAUMBESETZER ERNENNEN -< } elsif ($cmd eq "su") { &prove_besetzer($alias,$room); &hirachie($alias); if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") { my $alias2su = $cmd[1]; &list_dir("data/online/rooms/$room"); foreach(@dir) { if ($_ eq $alias2su) { &read_file("data/online/rstat/$room"); my @rstat = ; close DATEI; &hirachie($alias2su); &prove_besetzer($alias2su,$room); if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") { &input_html($reload,$action,$whisper); &post_prv($alias,"$alias2su kann nicht zum Raumbesetzer ernannt werden. (Ist bereits RB, WÄ oder OW)"); exit; } &zeit; &post("($hours:$min:$sec) $alias ernennt \"$alias2su\" zum Raumbesetzer ..."); &write_file("data/online/rstat/$room"); print DATEI $alias2su."\n"; close DATEI; &input_html("true",$action,$whisper); exit; } } &post_prv($alias,"$alias2su kann nicht zum Raumbesetzer ernannt werden. (Ist nicht anwesend)"); } #############>- RAUMBESETZER ENTNENNEN -< } elsif ($cmd eq "rsu") { &prove_besetzer($alias,$room); &hirachie($alias); if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") { my $alias2rsu = $cmd[1]; &read_file("data/online/rstat/$room"); my @rstat = ; close DATEI; &prove_besetzer($alias2rsu,$room); if ($r_besetzer eq "true") { &zeit; &post("($hours:$min:$sec) $alias entzieht \"$alias2rsu\" die Raumbesetzerrechte ..."); my $newrstat = $rstat[0].$rstat[1]; for ($i=2;$i<=$#r_stat;$i++) { $newrstat = $newrstat.$r_stat[$i] if ($r_stat[$i] ne $alias2rsu."\n"); } &write_file_new("data/online/rstat/$room"); print DATEI $newrstat; close DATEI; } else { &post_prv($alias,"$alias2rsu ist kein Raumbesetzer und kann dieser Status auch nicht aberkannt werden !"); } } #############>- RAUM EIN THEMA GEBEN -< } elsif ($cmd eq "t") { &prove_besetzer($alias,$room); &hirachie($alias); if ($r_besetzer eq "true" || $hirachie eq "wa" || $hirachie eq "ow") { my $theme; for ($i=1; $i <= $#cmd; $i++) { $theme = $theme." ".$cmd[$i]; } &zeit; &post("($hours:$min:$sec) $alias gibt dem Raum das Thema ( $theme ) ..."); $theme = $r_stat[0].$theme."\n"; for ($i=2;$i<=$#r_stat;$i++) { $theme = $theme.$r_stat[$i]; } write_file_new("data/online/rstat/$room"); print DATEI $theme; close DATEI; } #############>- SUPERUSER BEFEHLE ( Alphabetisch sortiert ) -< #############>- ALIAS VERBANNEN BZW. ENTBANNEN -< } elsif ($cmd eq "ban" || $cmd eq "rban") { &hirachie($alias); if ($hirachie eq "ow") { my ($alias2handle,$registriert) = $cmd[1]; &list_dir("data/user/options"); foreach(@dir) { $registriert = "true" if ($_ eq $alias2handle); } if ($registriert ne "true") { if ($cmd eq "ban") { if ($alias2handle ne "") { &post_prv("$alias","$alias2handle existiert nicht in der Benutzerdatenbank und kann so nich verbannt werden !"); } else { &read_file("data/ban"); my @banned = ; my ($benutzer); my $nr = $#banned+1; close DATEI; foreach(@banned) { $benutzer = $benutzer." ".$_; } &post_prv("$alias","Folgende Benutzer sind verbannt [$nr]: $benutzer"); } } else { &post_prv("$alias","$alias2handle existiert nicht in der Benutzerdatenbank und kann so nicht \"entbannt\" werden !"); } &input_html("true"); exit; } &read_file("data/ban"); my @banlist = ; close DATEI; foreach(@banlist) { if ($_ eq "$alias2handle\n") { if ($cmd eq "ban") { &post_prv("$alias","$alias2handle ist bereits verbannt worden !"); } else { my $banned = "false"; foreach(@banlist) { $banned = "true" if ($_ eq "$alias2handle\n"); } if ($banned eq "true") { my @newbanlist; foreach(@banlist) { push @newbanlist,$_ if ($_ ne "$alias2handle\n"); } &write_file_new("data/ban"); print DATEI @newbanlist; close DATEI; &post_prv("$alias","$alias2handle wurde soeben \"entbannt\" !"); } } &input_html("true"); exit; } } if ($cmd eq "ban") { &hirachie($alias2handle); if ($hirachie ne "ow") { &write_file("data/ban"); print DATEI "$alias2handle\n"; close DATEI; &post_prv("$alias","$alias2handle wurde soeben verbannt und kann sich nun nichtmehr in den Chat einloggen !"); } else { &post_prv("$alias","$alias2handle ist ein Oberwächter und kann deshalb nicht verbannt werden !"); } } else { &post_prv("$alias","$alias2handle konnte nicht \"entbannt\" werden, da $alias2handle garnicht verbannt war !"); } } #############>- IP # VON ALIAS ANZEIGEN LASSEN -< } elsif ($cmd eq "ip") { &hirachie($alias); if ($hirachie eq "ow") { my $alias2prove = $cmd[1]; &list_dir("data/online/ident"); foreach(@dir) { if ($_ eq $alias2prove) { &read_file("data/online/ident/$_"); local $ipnr = ; close DATEI; &post_prv("$alias","$_ hat die IP-Nummer $ipnr !"); } } } #############>- ALIAS AUS DEM CHAT KATAPULTIEREN -< } elsif ($cmd eq "k") { &hirachie($alias); if ($hirachie eq "wa" || $hirachie eq "ow") { my $alias2kick = $cmd[1]; &list_dir("data/online/rooms"); foreach $raum (@dir) { &list_dir("data/online/rooms/$raum",2); foreach $chatter (@dir2) { if ($chatter eq $alias2kick) { &hirachie($alias2kick); if ($hirachie eq "ow") { &post_prv("$alias","$alias2kick ist Oberwächter und kann nicht \"gekickt\" werden !"); } elsif ($hirachie eq "wa") { &post_prv("$alias","$alias2kick ist Wächter und kann nicht \"gekickt\" werden !"); } else { &post_prv("$alias2kick",""); &zeit; $_ = undef if ($room eq $_); &post("($hours:$min:$sec) $alias katapultiert \"$alias2kick\" aus dem Chat ...",$_); &remove_online($alias2kick,$_,"kick"); &secure_removeip($alias2kick); } &input_html("true"); exit; } } } &post_prv("$alias","$alias2kick ist nicht anwesend und kann nicht \"gekickt\" werden !"); } #############>- EINEN BENUTZER AUS DEM SYSTEM LÖSCHEN -< } elsif ($cmd eq "kill") { &hirachie($alias); if ($hirachie eq "ow") { my $alias2kill = $cmd[1]; &hirachie($alias2kill); if ($hirachie eq "ow") { &post_prv($alias,"$alias2kill ist Oberwächter und kann nicht aus dem System entfernt werden !"); } elsif ($hirachie eq "wa") { &post_prv($alias,"$alias2kill ist Wächter und kann nicht aus dem System entfernt werden !"); } else { unlink("data/user/options/$alias2kill"); unlink("data/user/profiles/$alias2kill"); unlink("data/user/gbooks/$alias2kill"); unlink("data/user/counts/$alias2kill"); unlink("data/user/lastlogin/$alias2kill"); &zeit; &post("($hours:$min:$sec) $alias killt \"$alias2kill\" ganz und gar aus dem System ..."); } } #############>- SYSTEMNACHRICHT IN ALLE BESTEHENDEN RÄUME POSTEN -< } elsif ($cmd eq "sys") { &hirachie($alias); if ($hirachie eq "ow") { for ($i=1; $i <= $#cmd; $i++) { $sys_msg = $sys_msg." ".$cmd[$i]; } &zeit; &post_all("($hours:$min:$sec) SYSTEMNACHRICHT: $sys_msg ..."); } #############>- ALIAS ZUM WÄCHTER ERNNENNEN BZW. ZUM NORMALEN CHATTER DEGRADIEREN -< } elsif ($cmd eq "wa" || $cmd eq "rwa") { &hirachie($alias); if ($hirachie eq "ow") { &zeit; my $alias2handle = $cmd[1]; if ($cmd eq "wa") { my $anerkennen = "false"; &list_dir("data/user/options"); foreach(@dir) { if ($_ eq $alias2handle) { $anerkennen = "true"; } } if ($anerkennen eq "true") { &hirachie($alias2handle); if ($hirachie eq "wa") { &post_prv("$alias","$alias2handle ist bereits als Wächter eingetragen. Eine erneuerte Eintragung ist nicht möglich!"); } elsif ($hirachie eq "ow") { &post_prv("$alias","$alias2handle ist schon als Oberwächter eingetragen. Oberwächter können nicht gleichzeitig Wächter sein!"); } else { &write_file("data/wa"); print DATEI $alias2handle."\n"; close DATEI; &post("($hours:$min:$sec) $alias ernennt \"$alias2handle\" zum Wächter ..."); } } else { &post_prv($alias,"$alias2handle kann nicht zum Wächter ernannt werden da Benutzername nicht existiert!"); } } elsif ($cmd eq "rwa") { &read_file("data/wa"); my @wafile = ; close DATEI; my $aberkennen = "false"; foreach(@wafile) { if ($_ ne "$alias2handle\n") { push @newafile,$_; } else { $aberkennen = "true"; } } &write_file_new("data/wa"); print DATEI @newafile; close DATEI; if ($aberkennen eq "true") { &post("($hours:$min:$sec) $alias hat \"$alias2handle\" vom Wächter zum normalen Chatter degradiert ..."); } else { &post("$alias2handle konnte der Wächterstatus nicht aberkannt werden da Benutzer kein Wächter ist!"); } } } #############>- ENDE DER CHATBEFEHLE -< } &input_html($reload,$action,$whisper); } sub change_room { # Den Chat-Raum wechseln my ($method,$newroom,$oldroom,$alias2follow) = @_; # Überprüfen, ob Alias Raum betreten darf &read_file("data/online/rstat/$newroom"); my @rstat = ; close DATEI; if ($rstat[0] eq "1\n") { &hirachie($alias); if ($hirachie eq "wa" || $hirachie eq "ow") { } else { &post_prv("$alias","Der Raum \"$newroom\" ist leider abgesperrt!"); &input_html("true",$action,$id); exit; } } $room = $oldroom; &secure_checkip($alias); # IP Nummer überprüfen &zeit; # Zeit 'erneuern' if ($method eq "j") { unlink("data/online/rooms/$oldroom/$alias"); &post("($hours:$min:$sec) $alias wechselt in den Raum \"$newroom\" ..."); $room = $newroom; &post("($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" herein nach \"$newroom\" ..."); &post_prv("$alias","($hours:$min:$sec) Du wechselst aus dem Raum \"$oldroom\" herein nach \"$newroom\" ..."); } elsif ($method eq "ju") { unlink("data/online/rooms/$oldroom/$alias"); &post("($hours:$min:$sec) $alias folgt \"$alias2follow\" in den Raum \"$newroom\" ..."); $room = $newroom; &post("($hours:$min:$sec) $alias kommt aus dem Raum \"$oldroom\" und folgt \"$alias2follow\" herein nach \"$newroom\" ..."); &post_prv("$alias","($hours:$min:$sec) Du folgst \"$alias2follow\" aus dem Raum \"$oldroom\" herein nach \"$newroom\" ..."); } # Sicherheitshalber Alias erneuert entf. unlink("data/online/rooms/$oldroom/$alias"); &rm_rstat($oldroom,$alias); &rm_rooms; } sub prove_besetzer { # Prüfen, ob Benutzer Raumbesetzerrechte hat my ($r_alias,$r_room) = @_; $r_besetzer = "false"; &read_file("data/online/rstat/$r_room"); @r_stat = ; close DATEI; for($i=2;$i<=$#r_stat;$i++) { $r_besetzer = "true" if ($r_stat[$i] eq $r_alias || $r_stat[$i] eq $r_alias."\n"); } }