#!/usr/bin/perl # MimerDesk # Web based groupware and eLearning environment # www.mimerdesk.org # # Copyright (C) 2001 Ionstream Ltd. # www.ionstream.fi # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This program is distributed with a hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # $Id: chat.html,v 1.10 2002/06/07 19:19:36 inf Exp $ ############################################ # # # MimerDesk: I-Chat # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # (c) Ionstream Design AY 1999 - 2000 # # # # Programmed by: Teemu Vainio # # # ############################################ ############# # Asetukset # ############# # Timelimit (3 minuuttia) ei saa pienentää, ellei myös nph-chat_checkissä pienennä pingin sendimis aikaväliä! # Käyttäjämäärän rajoitus use strict; use vars qw ($APPLICATION $ACTIVEGRP $time_limit $max_kayttajat $USER $IP $LAST_ACT $FORWARDED $TIME_USED $IDLE $form $ref $sth @nicks @kayttajat $lkm $confbutton $trans); use lib::MimerDesk; use CGI::Carp "fatalsToBrowser"; $time_limit = 180; $max_kayttajat = 25; sub alkusivu; sub etusivulle; sub astu_sisaan; sub count_users; sub channel_name; sub tutki_idle; sub tapa_kummitus; ########### # Ohjelma # ########### # 1. Haetaan tietokannasta lista kaikista kanavista # 2. Jos kanava on valittu, varmistetaan että se on luvallinen # 3. Jos kanava on valittu, siirrytään eteenpäin # 3.1 lasketaan käyttäjät # 3.2 Astu sisään jos nimi on ilmoitettu # 3.3 Jos kanava on täynnä, kerrotaan siitä käyttäjälle # 4. Tulostetaan käyttäjälle loginruutu $APPLICATION = 'Communication - Chat'; my (@kanava,$kanavat); read_config('../config/mimerdesk.cfg'); initialize(); $form = decode_multipart(); $form->{'ID'} =~ tr/0-9//cd; $form->{'auth'} =~ tr/0-9a-z//cd; ($USER, $IP, $LAST_ACT, $FORWARDED, $TIME_USED, $IDLE, $ACTIVEGRP) = authenticate($form->{'ID'}, $form->{'auth'}, $form->{'changeGroup'}); $trans = lib::MimerDesk->new_gettext(program => 'chat',language => $config{'language'}); $APPLICATION = $trans->gettext('Communication - Chat'); if ($form->{'quit'}) {redirect("$config{'loc_server'}$config{'bin_dir'}/index.html?ID=$form->{'ID'}&auth=$form->{'auth'}&quit=quit");} if ($form->{'kanava'}){etusivulle();} else {alkusivu();} ########################## # ___ # # ___ | | | \ ___ # # / \ | | | / / \ # # \___ | | |--< \___ # # \ | | | \ \ # # \___/ \__/ |___/ \___/ # # # ########################## ############ # alkusivu # ############ # # Tulostaa käyttäjälle chatin etusivun # (siis sen fuckin' sivun jossa valitaan kanava) # sub alkusivu { my (@channelname, @channelid); ########################################################################################################### # Tää koko purkkaviritys on siks kun tuota count_usersia ei voi tehdä tuon toisen tietokantahaun sisällä. # ########################################################################################################### lock_tables('READ', 'chatrooms'); db_list("select * from chatrooms order by NAME"); while (my $ref = $sth->fetchrow_hashref()) { push @channelname, $ref->{'NAME'}; push @channelid, $ref->{'ID'}; } db_end(); unlock_tables(); my $admin_status; lock_tables('READ', 'users'); db_list("SELECT * FROM users where nimi = '$USER'"); while (my $ref = $sth->fetchrow_hashref()){$admin_status = $ref->{'flags'};} db_end(); unlock_tables(); if($admin_status =~ /C0/) { $confbutton .= (tagged ('a',{href =>"chatconfig.html?ID=$form->{'ID'}&auth=$form->{'auth'}", content => image(src => "$config{'loc_pictures'}/configurechannels.gif")})); } my $i=0; foreach (@channelname) { $kanavat .= startrow(). column(class => 'content', bgcolor => 'white', content => tagged('a',{href =>"chat.html?ID=$form->{'ID'}&auth=$form->{'auth'}&kanava=$channelid[$i]", content => $channelname[$i]})). column(class => 'content', bgcolor => 'white', content => count_users($channelid[$i])). endrow(); $i++; } unless ($kanavat) { $kanavat .= startrow(). column(colspan => '2', class => 'content', bgcolor => 'white', align => 'center', content => tagged('b',{content => $trans->gettext('No chat channels.') })). endrow(); } print_template("$config{'theme'}_chat_alkuruutu", undef, $kanavat); } ############## # etusivulle # ############## # # Tulostaa käyttäjälle kanavan etusivun # # 1. Jos kanava on valittu, varmistetaan että se on luvallinen # 2. Jos kanava on valittu, siirrytään eteenpäin # 3.1 lasketaan käyttäjät # 3.2 Astu sisään jos nimi on ilmoitettu # 3.3 Jos kanava on täynnä, kerrotaan siitä käyttäjälle # 3. Tulostetaan käyttäjälle loginruutu sub etusivulle { tutki_idle(); db_list("SELECT * FROM chat_users where USER like '$form->{'kanava'}&%'"); while (my $ref = $sth->fetchrow_hashref()) { (undef, $ref->{'USER'}) = split "&", $ref->{'USER'}; push @nicks, $ref->{'NICK'}; push @kayttajat, $ref->{'USER'}; $lkm++; } db_end(); $lkm = ($max_kayttajat - $lkm); my $kayttajat; foreach (@nicks) {$kayttajat = $kayttajat."$_
\n";} $kayttajat = $kayttajat."

"; my $lkmjuttu; if ($lkm == 0) { $lkmjuttu = $trans->gettext('The channel is full. Either wait for someone to leave or try another channel'); print_template("$config{'theme'}_chat_kanava_taynna", $lkmjuttu, $kanavat, $kayttajat); } elsif ($lkm == 1) {$lkmjuttu = $trans->gettext('There is room for one more user on this channel');} else {$lkmjuttu = sprintf($trans->gettext("There is room for %d more users on this channel"),$lkm);} if ($form->{'ok'}) { $form->{'nimi'} =~ tr/A-ZÅÄÖa-zåäö0-9_\-|//cd; $form->{'nimi'} = substr $form->{'nimi'}, 0, 15; $form->{'nimi'} =~ s/^l/L/; if ($lkm > 0 && $form->{'nimi'}) { if ($form->{'nimi'} eq 'kaikki' || $form->{'nimi'} eq 'i-system') {print_template("$config{'theme'}_chat_varattu_nimi", $lkmjuttu, $kanavat, $kayttajat);} foreach (@nicks) {if ((lc $_) eq (lc $form->{'nimi'})) {print_template("$config{'theme'}_chat_varattu_nimi", $lkmjuttu, $kanavat, $kayttajat);}} astu_sisaan($form->{'nimi'}); } else {print_template("$config{'theme'}_chat_vaaranimi", $lkmjuttu, $kanavat, $kayttajat);} } elsif ($form->{'kicker'} && $form->{'reason'}) {print_template("$config{'theme'}_chat_kicked", $lkmjuttu, $kanavat, $kayttajat);} else {print_template("$config{'theme'}_chat_kanavan_etusivu", $lkmjuttu, $kanavat, $kayttajat);} } ############### # astu_sisaan # ############### # # Vie käyttäjän sisälle chattiin # # 1. Poistetaan kaikki ihme sälät nimestä # 2. Varmistetaan ettei nimi ole liian pitkä # 3. Jos on jo inessä, hyppää nimenlisäämisjuttujen ohi # 4. Katsotaan kellosta aika # 5. Lisätään käyttäjä tietokantaan # 6. Tiedotetaan sankarin esiinmarssista koko chattikansalle sub astu_sisaan { my ($kanavanimi) = channel_name($form->{'kanava'}); my $lkmjuttu; my $kayttaja = shift; foreach(@kayttajat) {if ($_ eq $USER) {print_template("chat_frameset");}} my $aika = time; my $user = $form->{'kanava'}."&".$USER; db_list("insert into chat_users (USER, NICK, PING) values ('$user', '$kayttaja', '$aika')"); db_end(); my $messu = sprintf($trans->gettext("%s has joined channel %s"),$kayttaja,$kanavanimi); if ($form->{'message'}) { $form->{'message'} = substr $form->{'message'}, 0, 80; $form->{'message'} =~ s/\n//g; $form->{'message'} =~ s/^(\s+)(.*)/$2/; $form->{'message'} =~ s/\\/\\\\/g; $form->{'message'} =~ s/\'/\\\'/g; $form->{'message'} =~ s/\)//g; $form->{'message'} =~ s/\(//g; $form->{'message'} = replace_tags($form->{'message'}); $messu =~ s/$form->{'kanava'}/$form->{'kanava'} \($form->{'message'}\)/; } db_list("insert into chatroom_$form->{'kanava'} (LINE, TARGET, SENDER, TIME, TYPE, MESSAGE) values ('NULL','kaikki','i-system','$aika','partjoin','$messu')"); db_end(); print_template ('chat_frameset'); } ############### # count_users # ############### # # laskee käyttäjien määrän kanavalla # sub count_users { my ($users) = 0; lock_tables('READ', "chat_users"); db_list("SELECT * FROM chat_users where USER like '@_&%'"); while (my $ref = $sth->fetchrow_hashref()) { $users++; } unlock_tables; return $users; } ################ # channel_name # ################ # # Hakee tietokannasta kanavan nimen id:n perusteella # sub channel_name { my ($name); lock_tables('READ', 'chatrooms'); db_list("select NAME from chatrooms where ID = @_"); while (my $ref = $sth->fetchrow_hashref()) { $name = $ref->{'NAME'}; } db_end(); unlock_tables(); return $name; } ############## # tutki_idle # ############## # # Chekkaa onko joku timeoutannut # sub tutki_idle { my(@ghosts); db_list("SELECT * FROM chat_users where USER like '$form->{'kanava'}&%'"); while (my $ref = $sth->fetchrow_hashref()) { (undef, $ref->{'USER'}) = split "&", $ref->{'USER'}; if ((time() - $ref->{'PING'}) >= $time_limit) { $ref->{'USER'} = $ref->{'USER'}."&".$ref->{'NICK'}; push @ghosts, $ref->{'USER'}; } } db_end(); foreach (@ghosts) { my ($user, $nick) = split "&", $_; tapa_kummitus($user, $nick); } } ################# # tapa_kummitus # ################# # # Poistaa timeoutanneen käyttäjän kummittelemasta # # 1. Tiedotetaan muille poistumisesta # sub tapa_kummitus { my ($user, $nick) = @_; $user = $form->{'kanava'}."&".$user; db_list("delete from chat_users where USER like '$user'"); db_end(); my $time = time(); my $messu = sprintf($trans->gettext("%s timed out"),$nick); db_list("insert into chatroom_$form->{'kanava'} (LINE, TARGET, SENDER, TIME, TYPE, MESSAGE) values ('NULL','kaikki','i-system','$time','partjoin','$messu')"); db_end(); } ################## # print_template # ################## # # printtaa templaten # sub print_template { my ($kanavanimi); if ($form->{'kanava'}) {$kanavanimi = channel_name($form->{'kanava'});} my ($ref,$fulltemplate); my ($template, $lkmjuttu, $kanavat, $kayttajat) = @_; print_header('pragma'); if ($template ne 'chat_frameset') { $ref = get_template('maintemplate',$template); $ref->{'maintemplate'} =~ s/<>/$ref->{$template}/m; $fulltemplate = $ref->{'maintemplate'}; $ref = get_template('js_doClock', 'js_help', 'js_gotosite'); my $stuff = join "", ($ref->{'js_doClock'},$ref->{'js_help'},$ref->{'js_gotosite'}); $fulltemplate =~ s/<>/$stuff/ms; $fulltemplate = create_buttons($fulltemplate, 'Communication', 'Chat', $form); $fulltemplate =~ s/<>/minea/gm; $fulltemplate =~ s/<>/MimerDesk\: $APPLICATION/ms; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); $fulltemplate = add_popups($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}); $fulltemplate =~ s/<>/$confbutton/gmi; $fulltemplate =~ s/<>/$kanavat/gmi; $fulltemplate =~ s/<>/$form->{'kanava'}/gmi; $fulltemplate =~ s/<>/$kanavanimi/gmi; $fulltemplate =~ s/<>/$kayttajat/gmi; $fulltemplate =~ s/<>/$lkmjuttu/gmi; $fulltemplate =~ s/<>/$form->{'kicker'}/gmi; $fulltemplate =~ s/<>/$form->{'reason'}/gmi; print $fulltemplate; } else { $ref = get_template($template); $fulltemplate = $ref->{$template}; $fulltemplate =~ s/<>/$kanavat/gmi; $fulltemplate =~ s/<>/$kanavanimi/gmi; $fulltemplate =~ s/<>/$form->{'kanava'}/gmi; $fulltemplate =~ s/<>/$kayttajat/gmi; $fulltemplate =~ s/<>/$lkmjuttu/gmi; $fulltemplate =~ s/<>/$form->{'kicker'}/gmi; $fulltemplate =~ s/<>/$form->{'reason'}/gmi; $fulltemplate = replace_tags($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}, $TIME_USED); $fulltemplate = add_popups($fulltemplate, $USER, $form->{'auth'}, $form->{'ID'}); print $fulltemplate; } db_end('disconnect'); exit; }