# Config Part
#
#######################

$data_dir = "data"; # Каталог данных. Например "data"
$unknowncmd_msg = "Неизвестная команда"; # Сообщение когда команда не известна
$unknownnick_msg = "Неизвестный ник"; # Сообщение когда ник не известен
$help_msg= << "[END]"; # Сообщение которое отобразится при вводе команды /help (НЕ УДАЛЯЙТЕ "[END]")
    <I><B>Команды:</B></I><BR>
    /msg <KBD>ник</KBD> <KBD>сообщение</KBD> - поговорить наедине<KBD></KBD> с <KBD>ник</KBD><BR>
    /help - Этот текст<BR>
    /about - о программе<BR>
    /me - Действие (например "/me говорит привет" будет "* юзер говорит привет")<BR>
    /userinfo <KBD>ник</KBD> - инфа о пользователе которого нет в чате<BR>
	/memo <KBD>ник сообщение</KBD> - сообщение для человека которого нет в чате<BR><BR>
    <I><B>Административные команды:</B></I><BR>    
    /list_nicks <KBD>админпароль</KBD> - список всех зарегистрированных пользователей<BR>
    /clean_old_nicks <KBD>админпароль x</KBD> - удалить всех пользователей кто не посещал чат <KBD>x</KBD> дней<BR>
    /remove_nick <KBD>админпароль ник</KBD> - удалить <KBD>ник</KBD><BR>
    /ban <KBD>админпароль ник</KBD> - запретить вход пользователю<BR>
    /ban <KBD>админпароль</KBD> ip:<KBD>x.x.x.x</KBD> - запретить вход определённому ip адресу <BR>
    /kick <KBD>админпароль ник</KBD> - выгнать<BR>
    /unban <KBD>админпароль ник</KBD> - разрешить посещение нику<BR>
    /unban <KBD>админпароль</KBD> ip:<KBD>x.x.x.x</KBD> - разрешить посещение ip<BR>
[END]
$welcome_msg = << "[END]"; # Сообщение которое будет напечатано когда юзер войдёт
    Добро пожаловать в чат Визит!<BR>
    /help - введите для получения помощи
[END]
$masterpassword = "mpw"; # Пароль для спец команд - админпароль
$wrongmasterpass_msg = "Неверный пароль"; # будет напечатано при вводе неправильного пароля с административными командами
$updatefrequency = 5; # обновление чата в секундах
$clear_old_msgs = 1; # при 1 старые сообщения будут удалены когда чат пуст
$nocleantime_msg = "время не определено"; # если не давлось никакого числа в /clean_old_nicks 
$message_limit = 20; # максимальное кол-во сообщений в чате
$new_msg_on_top = 0; # если 1 новые сообщения будут печататься сверху, 
$admin_email_addresse = "freyn\@com2com.ru"; # Ваш email (не удаляйте перед @ знак \@)
$mailprogramme = '/usr/sbin/sendmail'; # путь к программе sendmail
$mail_on_new_registration = 0; # 1 вы получите сообщение при рег. нового пользователя, 0 не получите
$logtype = 0; # тип лог файла: 0 - нет, 1 - регистрации, 2 - +входы, 3 - +сообщения
$log_dir = "logs"; # каталог для логов
$script_name = "chat.cgi"; # название скрипта "chat.cgi"
$script2_name = "chat2.cgi"; # название второго скрипта "chat2.cgi"
$max_users = "-1"; # макс. кол-во юзеров которые могут быть в чате, "-1" неограниченно
$login_msg = "Вошёл в чат"; # покажется когда пользователь входит
$logout_msg = "Покинул чат"; # когда выходит
$days_to_keep_memos = 60; # кол-во дней которые должны храниться записки
$min_update_freq = 2; # мин частота обновления
$reset_private_msg_select = 0; # set to 1 if you want the select field for private msgs to be reset to "to all users" after msg was sent NEW

# Files - don't need to be changed, only if you want several script
# using eg the same nick file but different msg file. So you can use
# the script for multiple chat rooms.

$data_msg_file = "messages";
$data_stillalive_file = "stillalive";
$data_private_file = "private"; # without .user
$data_nicks_file = "nicks"; # you should leave this one, else the user has to register on every single script
$data_userinfo_file = "userinfo"; # the user-info database
$data_banned_file = "banned"; # banned user file
$data_memo_file = "memo"; # memo file

# HTML-Stuff

$html_bodytag = '<BODY BGColor=#000000 TEXT=#6699FF Link=#0000FF VLINK=#0000CC ALINK=#0000FF>'; # The bodytag for html files
$html_title = "Чат Визит"; # The title of your chat
$banner_picture = ""; # url рисунка баннера. Если не нужен оставьте ""
$banner_link = "http://www.ralfchat.de"; # Ссылка баннера
$logout_url = "http://www.freyn.agava.ru/top/topsites/index.html"; # url для выхода 
$input_field_size = "30"; # Размер поля для ввода сообщений

# END CONFIG PART - ALL DONE
#
########################

# HTML Part
#
########################


#NONICK.HTML - when nick doesnot exists
sub nonick_html {
	print <<"[END]";
<HTML>
<HEAD><TITLE>$html_title - Ник не существует</TITLE>
</HEAD>
$html_bodytag
<CENTER>
<H1><I>Ник не существует</I></H1>
<B><A HREF="$script2_name?action=register">Регистрация</A> <BR>
<A HREF="$script_name">Войти под другим ником</A></B>
</CENTER>
</BODY>
</HTML>
[END]
}

#WRONGPASS.HTML - when wrong password was entered
sub wrongpass_html {
	print <<"[END]";
<HTML>
<HEAD><TITLE>$html_title - Неверный пароль</TITLE>
</HEAD>
$html_bodytag
<CENTER>
<H1><I>Неверный пароль</I></H1>
<B><A HREF="$script2_name?action=send_pwd&name=$query{'name'}">Забыл пароль</A></B><BR>
<B><A HREF="$script_name">Повтор</A></B>
</CENTER>
</BODY>
</HTML>
[END]
}

#KICKED.HTML - when user is kicked
sub kicked_html {
	print <<"[END]";
<HTML>
<HEAD><TITLE>$html_title - Тебя выгнали</TITLE>
</HEAD>
$html_bodytag
<CENTER>
<H1><I>Тебя выгнали</I></H1>
<B><A HREF="$script2_name?action=gotourl&url=$logout_url" TARGET="_parent">Выход</A></B>
</CENTER>
</BODY>
</HTML>
[END]
}

#BANNED.HTML - when user is banned
sub banned_html {
	print <<"[END]";
<HTML>
<HEAD><TITLE>$html_title - Тебе вход запрещён</TITLE>
</HEAD>
$html_bodytag
<CENTER>
<H1><I>Тебе вход запрещён</I></H1>
<B><A HREF="$script2_name?action=gotourl&url=$logout_url" TARGET="_parent">Выход</A></B>
</CENTER>
</BODY>
</HTML>
[END]
}

# Main Part - DON'T CHANGE ANYTHING HERE!
#
#######################

$version = "0.11.2";     # don't change
$lastmodified = "26.11.99"; # don't change
$about_msg = "Ralfs Chat - <A HREF=\"$script2_name?action=gotourl\&url=http://www.ralfchat.de\" TARGET=\"ralfchat\">www.ralfchat.de</A> -  created and copyright by Ralf Gueldemeister \&lt;ralf\@ralfchat.de> on 25.12.98; last modified on $lastmodified; Version $version"; # msg printed on /about

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon++; $year += 1900;
$log_file = "$year-$mon-$mday.txt";

&getquery;

sub extract_qs { # einzelne variablen aus query_string extrahieren und in hash $query uebergeben
	my @split = split (/&/, $qs);
	foreach $split (@split) {
		($query_key, $query_value) = split (/=/, $split);
		$query_value =~ tr/+/ /;
		$query_value =~ s/%([\dA-Fa-f][\dA-Fa-f])/ pack ("C", hex ($1))/eg;
		$query{$query_key} = $query_value;	
	}

}

sub getquery {
	if ($ENV{'REQUEST_METHOD'} eq "GET") {
		$qs= $ENV{'QUERY_STRING'}; # Wert vom query_string wird in $qs gespeichert
	} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN, $qs, $ENV{'CONTENT_LENGTH'});
	}
	&extract_qs; # einzelne variablen aus querystring auslesen
}

sub header { # Gibt standard html header aus
	print "Content-type: text/html\n\n";
}

sub error { # Irgendein Fehler ist aufgetreten
	&header;
	print "<H1>Произошла ошибка</H1>";
	print "<I>Query_String:</I> $qs<BR>";
	print "<I>Errormessage:</I> $_[0]";
	exit;
}


sub repair_safile {
	my $i=0;
	my @satemp;
	my @satemp2;
	for (@sa) {        
		if (/[A-Za-z]/) {
			$satemp[$i]=$_;
			$i++;
		}
	}    
	$i=0;
	@sa = "";
	for (@satemp) {
		$sa[$i*2] = $satemp[$i];
		$sa[$i*2+1] = time;
		$i++; 
	}

	@sa = "" if ($#sa % 2 == 0);
}

sub checkpass {
	if (-e "$data_dir/$data_nicks_file") {  # wenn nickfile existiert dann oeffnen
		open (NICKFILE, "<$data_dir/$data_nicks_file") || &error("::Невозможно открыть Nickfile ::");
	} 
	else {  # else print nonick_html
		&header;
		&nonick_html;
		exit;
	}
	my @nickfile = <NICKFILE>; 
	close NICKFILE; 

	my @nickfile_matrix = ();

	for (my $i = 0; $i <= $#nickfile; $i++) {
		chomp($nickfile[$i]);
		push(@nickfile_matrix, [split(/;;/, $nickfile[$i])]);
	}
	
	my $nickok;
	for (my $cpi=0; $cpi<=$#nickfile_matrix; $cpi++) {
		if ($nickfile_matrix[$cpi][0] eq $query{'name'}) {
			$nickok = 1;
			if ($nickfile_matrix[$cpi][1] ne $query{'password'}) {
				&header;
				&wrongpass_html;
				exit;
			}
			if ($nickfile_matrix[$cpi][10] == 1) {
				&header;
				&kicked_html;
				exit;
			}
			if ($nickfile_matrix[$cpi][10] == 2) {
				&header;
				&banned_html;
				exit;
			}
		} 
	}

	if ($nickok != 1) {
		&header;
		&nonick_html;
		exit;
	}

}

sub postprivatemsg { # parameter: 0: empfaenger 1: sender 2: msg 
	&checkpass;  # Passwort checken

	# kill linebreaks
	$_[2] =~ s/\n/ /g;

	if (-e "$data_dir/$data_private_file.$_[0]") {
	} else {
		&postprivatemsg($query{'name'}, "MSG", "$unknownnick_msg: $_[0]");
		return;
	}

	# alte Eintraege >35 loeschen
	open (PRIVATEFILE, "<$data_dir/$data_private_file.$_[0]") || &error("Невозможно открыть $data_dir/$data_private_file.$_[0] ");
	my @privatefile = <PRIVATEFILE>;
	close PRIVATEFILE;

	for (my $ppm_i=0; $ppm_i <= ($#privatefile -35); $ppm_i++) {
		shift(@privatefile);
	}
	open (PRIVATEFILE, ">$data_dir/$data_private_file.$_[0]") || &error("Невозможно открыть privatefile ");
	flock(PRIVATEFILE,2);

	print PRIVATEFILE @privatefile;

	close PRIVATEFILE;

	while (time == $last_priv_msg_id) {}
	$priv_msg_id = time;
	$last_priv_msg_id = $priv_msg_id;

	open (PRIVATEFILE, ">>$data_dir/$data_private_file.$_[0]");
	flock(PRIVATEFILE,2);

	if ($query{'color'} eq "standard") {
		print PRIVATEFILE "$priv_msg_id;;<B>[$_[1]]</B> $_[2]\n";
	} else {
	print PRIVATEFILE "$priv_msg_id;;<FONT COLOR=\"$query{'color'}\"><B>[$_[1]]</B> $_[2]</FONT>\n";
	}        

	close PRIVATEFILE;

	open (CHATFILE, ">>$data_dir/$data_msg_file");
	flock(CHATFILE,2);

	print CHATFILE "<!--PrivateMsgHere;;$_[0];;$priv_msg_id;;-->";

	close CHATFILE;
}

sub create_file { # Datei erstellen (in Klammern als parameter zu uebergeben)
	my $file2create = $_[0];
	open (CREATEFILE, ">$file2create") || &error(" $file2create Создать невозможно");
	close (CREATEFILE);
}

sub userinfo {
	open (UIFILE, "<$data_dir/$data_userinfo_file") || &create_file("$data_dir/$data_userinfo_file");
	my @uifile = <UIFILE>; 
	close UIFILE;

	my @uifile_matrix = ();

	for (my $i = 0; $i <= $#uifile; $i++) {
		chomp($uifile[$i]);
		push(@uifile_matrix, [split(/;;/, $uifile[$i])]);
	}
	
	my $nickfound = 0;
	for (my $i=0; $i<=$#uifile_matrix; $i++) {
		if ($uifile_matrix[$i][0] eq $query{'infoabout'}) {
			$userinfo{'realname'} = $uifile_matrix[$i][1];
			$userinfo{'email'} = $uifile_matrix[$i][2];
			$userinfo{'age'} = $uifile_matrix[$i][3];
			$userinfo{'city'} = $uifile_matrix[$i][4];
			$userinfo{'country'} = $uifile_matrix[$i][5];
			$userinfo{'url'} = $uifile_matrix[$i][6];
			$userinfo{'stuff'} = $uifile_matrix[$i][7];
			$userinfo{'photo_url'} = $uifile_matrix[$i][8];
			$userinfo{'icq_uin'} = $uifile_matrix[$i][9];
			$nickfound = 1;
		}
	}

	if ($userinfo_as_private_msg != 1) {
		&header;
		&userinfo_html;
	} elsif ($nickfound == 0){
		&postprivatemsg($query{'name'}, "USERINFO", "Юзверь $query{'infoabout'} не найден");
	} else {
		&postprivatemsg($query{'name'}, "USERINFO", "<B>$query{'infoabout'}</B><BR>Имя: $userinfo{'realname'}<BR>email: <A HREF=\"mailto:$userinfo{'email'}\">$userinfo{'email'}</A><BR>Возраст: $userinfo{'age'}<BR>Город: $userinfo{'city'}<BR>Страна: $userinfo{'country'}<BR>Домашняя страница: <A HREF=\"$userinfo{'url'}\">$userinfo{'url'}</A><BR>Что нить ещё: $userinfo{'stuff'}<BR>Фото: <A HREF=\"$userinfo{'photo_url'}\">$userinfo{'photo_url'}</A>");
	}
}

1;
