Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/local/bin/perl -w
- use strict;
- use Socket;
- use File::Find;
- use File::Copy;
- use Fcntl qw (:DEFAULT :flock);
- use CGI qw (:standard escapeHTML *table);
- do "/opt/zabava/cgi-bin/functions.cgi";
- my $file_for_search = "tickets_plus.csv";
- my $directory_of_game = "/sec/GAME";
- my $directory_with_the_original_data_games = "/sec/GAME/adm/";
- my $directory_to_save_the_results = "/sec/GAME/results/";
- my $directory_to_save_the_flags = $directory_with_the_original_data_games;
- my $flag_of_finish_game = $directory_to_save_the_flags.".zplus_end";
- my $file_digits = $directory_to_save_the_results."digits";
- my $file_extra_wins = $directory_to_save_the_results."extra_wins";
- my $file_qnts = $directory_to_save_the_results."qnts";
- my ($titro_ip, $titro_port, $need_send, $copy_history, $copy_jp) = &get_game_properties("/sec/game.properties");
- my (@amount) = &consider_the_amount_of_winnings("/sec/zplus.properties");
- my $number_of_game = readlink($directory_of_game) || die "Can't readlink: $!\n";
- my $daddrfile = "/sec/dist_addr";
- my $dnamefile = "/sec/online_distr";
- my %stored_value_numbers;
- my %saved_entry;
- $number_of_game =~ s!.*/!!;
- my $link=readlink"$directory_of_game";
- my @a=split('\/',$link);
- my $title = "Розыгрыш Забава-Плюс - тираж № ".$a[$#a];
- print header(-charset=>'UTF-8');
- print start_html(
- -lang=>"ru-RU",
- -title=>$title,
- -head=>
- meta({
- -http_equiv => 'Content-Type',
- -content => 'text/html;charset=UTF-8'
- }).
- div({-align=>"center"})
- );
- if ( ! -e "$directory_with_the_original_data_games/$file_for_search") {
- print p(h2("Ошибка: Файл $file_for_search отсутствует"))."\n";
- print p((a({-href=>"/OPERATE/main.html"},"Вернуться в меню")))."\n";
- print p(hr);
- print end_html;
- exit;
- }
- &calculate_the_stored_numbers();
- unless (-e $flag_of_finish_game) {
- print &generate_an_input_form_numbers_ball();
- } else {
- print p(h2(b("Ошибка: Розыгрыш уже завершен")))."\n";
- print p((a({-href=>"/OPERATE/main.html"},"Вернуться в меню")))."\n";
- }
- print end_html;
- exit;
- sub get_game_properties () {
- my $confname = shift if @_;
- my ($titro_ip, $titro_port, $need_send, $copy_history, $copy_jp) = (undef, undef, undef, undef, undef);
- if ( -r $confname ) {
- open CNAME, "<$confname" || die "Can't open for read file $confname: $!\n";
- flock(CNAME, LOCK_EX);
- while (<CNAME>) {
- chomp;
- SWITCH: {
- /^TITRO_IP=(.*)/ && do { $titro_ip = $1; };
- /^TITRO_PORT=(.*)/ && do { $titro_port = $1; };
- /^NEED_SEND=(.*)/ && do { $need_send = $1; };
- /^COPY_HISTORY=(.*)/ && do { $copy_history = $1; };
- /^COPY_JP=(.*)/ && do { $copy_jp = $1; };
- }
- }
- close CNAME || die "Can't close file $confname: $!\n";
- }
- return ($titro_ip, $titro_port, $need_send, $copy_history, $copy_jp);
- }
- sub consider_the_amount_of_winnings () {
- my $winfname = shift if @_;
- my @amount = ( "win" );
- if ( -r $winfname ) {
- open WNAME, "<$winfname" || die "Can't open for read file $winfname: $!\n";
- while (<WNAME>) {
- chomp;
- /^_(\d+)BALL_SUMM=(\d+)/ && do { $amount[$1]=$2; }
- }
- close WNAME || die "Can't close file $winfname: $!\n";
- }
- return @amount;
- print @amount;
- }
- sub generate_an_input_form_numbers_ball () {
- my $form = start_form;
- if (defined param("send_summ_to_TS_ok")) {
- send_summ_to_TS() if param("send_summ_to_TS_ok");
- param("send_summ_to_TS_ok",'0');
- $form .= hidden('send_summ_to_TS_ok')."\n";
- }
- my $numball = 7;
- $numball = param("numberball", param("numberball")-1) if param() && defined param("numberball");
- &reload_the_game if $numball == 7;
- $form .= hidden('numberball', $numball )."\n";
- my $stored_numbers = param("stored_numbers", join(":", %stored_value_numbers));
- $form .= hidden('stored_numbers', $stored_numbers )."\n";
- my $saved_entry = param("saved_entry", join(":", %saved_entry));
- $form .= hidden('saved_entry', $saved_entry )."\n";
- if ($numball>0 && $numball<8) {
- $form .= h3("Забава-Плюс. Ввод выпавших шаров")."\n";
- } else {
- $form .= h3("Суммарная таблица результатов розыгрыша")."\n";
- }
- my ($tdentry_row1, $tdentry_row2) = ("\n".th({-align=>"left",-valign=>"middle"},"Выпавшая цифра")."\n", "\n".th({-align=>"left",-valign=>"middle"},"Результаты")."\n");
- $form .= start_table({ -border=> 1, -cellpadding=>2, -cellspacing=>0 })."\n";
- foreach ( reverse sort { $a <=> $b } keys %stored_value_numbers ) {
- $tdentry_row1 .= td({-width=>"18px"},$stored_value_numbers{$_})."\n";
- $tdentry_row2 .= td({-width=>"18px"},$saved_entry{$_})."\n";
- }
- $form .= TR({-align=>"center",-valign=>"middle",-height=>"18px"},th({-align=>"left",-valign=>"middle"},"Номер шара").th("1").th("2").th("3").th("4").th("5").th("6").th("7"))."\n";
- $form .= TR({-align=>"center",-valign=>"middle",-height=>"18px"},$tdentry_row1)."\n";
- $form .= TR({-align=>"center",-valign=>"middle",-height=>"18px"},$tdentry_row2)."\n";
- $form .= end_table;
- if ($numball>0 && $numball<8) {
- param("number","");
- my $play = 8 - int(defined param("numberball") ? param("numberball") : 1 );
- $play = 1 if (! defined param ("numberball"));
- unless ( defined param("send_summ_to_TS_ok")) {
- } else {
- $form .= p(("Введите цифру выпавшего шара № ".b($play)).": ".textfield(-name=>"number", -size=>3, -maxlength=>1, -tabindex=>1).br)."\n";
- $form .= start_table({ -border=>0, -cellpadding=>0, -cellspacing=>0 })."\n";
- $form .= TR(td({-align=>"left",-valign=>"middle",-width=>"200px"},reset(-value=>"Очистить поле ввода")),td({-align=>"right",-valign=>"middle",-width=>"140px"},submit(-value=>"Ввести")));
- $form .= end_table;
- }
- $form .= endform."\n";
- # $form .= p(start_form.submit(-value=>"Обнулить результаты и начать игру заново").endform.hr);
- $form .= p(start_form.submit(-value=>"Отослать данные на титровальную станцию").hidden('send_summ_to_TS_ok','1').endform) unless defined param("send_summ_to_TS_ok");
- $form .= hr;
- } else {
- &generate_and_record_Digits_Extra_wins_Qnts();
- open FFLG, ">$flag_of_finish_game" || die "Can't open for write file $flag_of_finish_game: $!\n";
- close FFLG || die "Can't close file $flag_of_finish_game: $!\n";
- $form .= endform."\n";
- $form .= p((a({-href=>"/OPERATE/main.html"},"Вернуться в меню")))."\n";
- }
- return $form;
- }
- sub calculate_the_stored_numbers () {
- (%stored_value_numbers) = split(":",param("stored_numbers")) if defined param("stored_numbers");
- (%saved_entry) = split(":",param("saved_entry")) if defined param("saved_entry");
- $stored_value_numbers{param("numberball")} = param("number")+0 if defined param("numberball") && defined param("number");
- my $mask_matches = "";
- for ( my $i=1; $i<=7; $i++ ) {
- $stored_value_numbers{$i} = "-" unless defined $stored_value_numbers{$i};
- unless (defined $saved_entry{$i}) {
- $saved_entry{$i} = "-";
- } else {
- $mask_matches .= $stored_value_numbers{$i};
- }
- }
- $mask_matches =~ s/-/./g;
- $mask_matches = reverse($mask_matches);
- &calculate_occurrence ($file_for_search, $mask_matches, param("numberball"));
- }
- sub get_filenames_for_calculate_occurrence () {
- my $play = shift if @_;
- my ($tmp,$dst,$fnom) = ("/tmp/","","");
- my $prefix = "";
- if (defined $play) {
- ($tmp,$dst,$fnom) = ($tmp.$play."_digits_prize.csv",$dst.$play."_digits_prize.csv",$dst.$play."_digits_prize.nom");
- }
- $tmp .= ".~";
- return ($tmp,$dst,$fnom);
- }
- sub calculate_occurrence () {
- my $ffs_name = shift if @_;
- my $mask_matches = shift if @_;
- my $version_of_the_game = shift if @_;
- $ffs_name = $directory_with_the_original_data_games.$ffs_name;
- if ( -e $ffs_name && -r $ffs_name && length($mask_matches)>0 ) {
- my $play = 8 - int(defined param("numberball") ? param("numberball") : 1 );
- for (my $iplay = 1; $iplay<=$play; $iplay++) {
- my ($ticket, $original_line, $matches_id) = (undef, undef, 8 - $iplay);
- my ($tmp_dest_filename, $dest_filename, $file_number_of_matches) = &get_filenames_for_calculate_occurrence($matches_id);
- my $mask_submatches = substr($mask_matches,$iplay-1);
- $saved_entry{$matches_id} = 0;
- open FFSTW, ">$tmp_dest_filename" || die "Can't open for write $tmp_dest_filename: $!\n";
- flock(FFSTW, LOCK_EX);
- print FFSTW
- "#draw=".$number_of_game."\n",
- "#base_ticket_number=\n";
- close FFSTW || die "Can't close file $tmp_dest_filename: $!\n";
- my $mask_submatches_prefix;
- if ($iplay>1) {
- $mask_submatches_prefix = substr($mask_matches,0,$iplay-1);
- $mask_submatches_prefix = (sprintf "."x (length($mask_submatches_prefix) -1).chop($mask_submatches_prefix));
- $mask_submatches_prefix =~ s/(\d)/\[^$1\]/g;
- }
- $mask_submatches_prefix = ":".$mask_submatches_prefix;
- # print pre("$mask_submatches_prefix$mask_submatches;");
- system("/bin/grep \"".$mask_submatches_prefix.$mask_submatches.";\" $ffs_name >> $tmp_dest_filename");
- $saved_entry{$matches_id} = `/bin/cat $tmp_dest_filename | /usr/bin/wc -l`-2;
- move($tmp_dest_filename,$directory_to_save_the_results.$dest_filename);
- send_information_to_the_number_of_matches(
- $play,
- $iplay,
- substr($mask_submatches,0,1),
- $saved_entry{$matches_id},
- $amount[$iplay],
- $directory_to_save_the_results.$file_number_of_matches,
- $mask_submatches
- );
- if ($play == $iplay) {
- my $zplus_wins = "";
- foreach my $k ( sort keys %saved_entry ) {
- $zplus_wins = join(" ",(split(",",$zplus_wins),int($saved_entry{$k})));
- }
- &send_data("ZPLUS_COUNTS $zplus_wins \n");
- select(undef, undef, undef, 0.1);
- if ($iplay == "7" && $amount[$iplay] > "0" ) {
- my $win_count = 0;
- open ZPW, "<${directory_to_save_the_results}7_digits_prize.csv" || die "Can't open for read 7_digits_prize.csv: $!\n";
- flock(ZPW, LOCK_EX);
- while (<ZPW>) {
- chomp; s/;.*$//;
- next if /^#/;
- select(undef, undef, undef, 0.2);
- $win_count++;
- my ($ticknum,undef,$dcode,undef)=split(":");
- $ticknum = "0000000".$ticknum;
- ($ticknum) = $ticknum =~ /(.{7})$/;
- # my $daddr = &getAddrByCode($dcode);
- my $dname = &getDistrNameByCode($dcode);
- # &send_data ("ZPLUS_WIN Білет № $ticknum $daddr\n");
- &send_data ("ZPLUS_WIN Білет № $ticknum $dname пр-во\n");
- }
- if ($win_count > "0") {
- select(undef, undef, undef, 0.2);
- &send_data ("ZPLUS_WIN_END\n");
- }
- }
- }
- }
- }
- }
- sub send_information_to_the_number_of_matches () {
- my ($play, $iplay, $taw, $coincidence, $amount, $fnom, $mask_matches) = (shift, shift, shift, shift, shift, shift, shift) if @_;
- if (defined $play && defined $iplay && defined $taw && defined $coincidence && defined $amount && defined $fnom && defined $mask_matches) {
- $coincidence = 0 if $coincidence eq "-";
- # &send_data("NEXT_BALL $iplay $taw $coincidence $amount \n");
- if ($play == $iplay) {
- &send_data("NEXT_BALL $taw \n");
- select(undef, undef, undef, 0.1);
- }
- $mask_matches =~ s/\.//g;
- open FNOM, ">".$fnom || die "Can't open for write $fnom: $!\n";
- flock(FNOM, LOCK_EX);
- print FNOM $iplay.":".$mask_matches.":".$coincidence.":".$amount.";\x0d\x0a";
- close FNOM || die "Can't close file $fnom: $!\n";
- } else {
- print "WARNING! There is no information about coincidences!" if $iplay>1;
- }
- }
- sub reload_the_game () {
- sub delete_files_older_games {
- /^[1-7]_digits_prize.(csv|nom)$/ && unlink($File::Find::name);
- }
- find(\&delete_files_older_games,($directory_to_save_the_results));
- foreach my $fname (($file_digits,$file_extra_wins,$file_qnts)) {
- unlink($fname);
- }
- }
- sub generate_and_record_Digits_Extra_wins_Qnts () {
- my @nomfiles;
- sub generate_from_files {
- /^[1-7]_digits_prize.nom$/ && push(@nomfiles,$File::Find::name);
- }
- find(\&generate_from_files,($directory_to_save_the_results));
- my ($digits, $extra_wins, $qnts) = (undef,undef,undef);
- foreach my $fnom (sort @nomfiles) {
- open FNOM, "<$fnom" || die "Can't open for write file $fnom: $!\n";
- while (<FNOM>) {
- chomp; s/;.*$//;
- my (undef, $mask_matches, $coincidence, $amount) = split(":");
- $digits = join(",",($mask_matches,split(",",$digits)));
- $extra_wins = join(",",(split(",",$extra_wins),$amount));
- $qnts = join(",",($coincidence,split(",",$qnts)));
- last;
- }
- close FNOM || die "Can't close file $fnom: $!\n";
- }
- foreach my $fname (($file_digits,$file_extra_wins,$file_qnts)) {
- open FILE, ">$fname" || die "Can't open file for write $fname: $!\n";
- print FILE $digits,"\n" if $fname eq $file_digits;
- print FILE $extra_wins,"\n" if $fname eq $file_extra_wins;
- print FILE $qnts,"\n" if $fname eq $file_qnts;
- close FILE || die "Can't close file $fname: $!\n";
- }
- }
- sub send_summ_to_TS () {
- &send_data("ZPLUS_SUMMS ".join(' ',reverse(@amount[1..7]))."\n");
- }
- sub send_data () {
- my $message = $_[0];
- &add2log("send_data: $message");
- if ($need_send) {
- socket( SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
- my $internet_address = inet_aton($titro_ip) || die "Couldn't convert $titro_ip into an Internet address: $!\n";
- my $port_address = sockaddr_in($titro_port, $internet_address);
- connect(SERVER, $port_address) || die "Couldn't connect to $titro_ip:$titro_port : $!\n";
- send( SERVER, $message, 0);
- close(SERVER);
- } else {
- &add2log("send_data: NEED_SEND is 0, message not sent");
- print pre("$message");
- }
- }
- sub getAddrByCode{
- my $d_code = shift;
- my $ret = "м.Київ, вул. Червоногвардiйська, 12, оф.9";
- add2log("getAddrByCode: I am called for $d_code from $daddrfile");
- open(ADD_FILE, "<$daddrfile");
- while (<ADD_FILE>) {
- chomp;
- my(@info)=split(/:/,$_);
- if($info[1] eq $d_code) {
- $ret = $info[2];
- last;
- }
- }
- close(ADD_FILE);
- add2log("getAddrByCode: Return address is: $ret");
- return $ret;
- }
- sub getDistrNameByCode{
- my $d_code = shift;
- my $ret = "Kиївське";
- add2log("getDistrNameByCode: I am called for $d_code from $dnamefile");
- open(A_FILE, "$dnamefile");
- while (<A_FILE>) {
- chomp;
- my(@info)=split(/;/,$_);
- if($info[0] eq $d_code) {
- $ret = $info[1];
- last;
- }
- }
- close(A_FILE);
- add2log("getDistrNameByCode: Return name is: $ret");
- return $ret;
- }
- sub add2log{
- open (ABB_FILE, ">>/sec/GAME/adm/zabava-plus.log") or print "EDIT_ERROR: $!";
- print ABB_FILE $_[0];
- print ABB_FILE "\n";
- close ABB_FILE;
- }
Add Comment
Please, Sign In to add comment