Guest User

Untitled

a guest
Apr 18th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 16.33 KB | None | 0 0
  1. #!/usr/local/bin/perl -w
  2.  
  3. use strict;
  4.  
  5. use Socket;
  6. use File::Find;
  7. use File::Copy;
  8. use Fcntl qw (:DEFAULT :flock);
  9. use CGI qw (:standard escapeHTML *table);
  10. do "/opt/zabava/cgi-bin/functions.cgi";
  11.  
  12. my $file_for_search = "tickets_plus.csv";
  13. my $directory_of_game = "/sec/GAME";
  14. my $directory_with_the_original_data_games = "/sec/GAME/adm/";
  15. my $directory_to_save_the_results = "/sec/GAME/results/";
  16. my $directory_to_save_the_flags = $directory_with_the_original_data_games;
  17. my $flag_of_finish_game = $directory_to_save_the_flags.".zplus_end";
  18. my $file_digits = $directory_to_save_the_results."digits";
  19. my $file_extra_wins = $directory_to_save_the_results."extra_wins";
  20. my $file_qnts = $directory_to_save_the_results."qnts";
  21. my ($titro_ip, $titro_port, $need_send, $copy_history, $copy_jp) = &get_game_properties("/sec/game.properties");
  22. my (@amount) = &consider_the_amount_of_winnings("/sec/zplus.properties");
  23. my $number_of_game = readlink($directory_of_game) || die "Can't readlink: $!\n";
  24. my $daddrfile = "/sec/dist_addr";
  25. my $dnamefile = "/sec/online_distr";
  26. my %stored_value_numbers;
  27. my %saved_entry;
  28. $number_of_game =~ s!.*/!!;
  29. my $link=readlink"$directory_of_game";
  30. my @a=split('\/',$link);
  31. my $title = "Розыгрыш Забава-Плюс - тираж № ".$a[$#a];
  32.  
  33. print header(-charset=>'UTF-8');
  34. print start_html(
  35.         -lang=>"ru-RU",
  36.         -title=>$title,
  37.         -head=>
  38.             meta({
  39.                 -http_equiv => 'Content-Type',
  40.                 -content => 'text/html;charset=UTF-8'
  41.             }).
  42.         div({-align=>"center"})
  43. );
  44.  
  45. if ( ! -e "$directory_with_the_original_data_games/$file_for_search") {
  46.     print p(h2("Ошибка: Файл $file_for_search отсутствует"))."\n";
  47.     print p((a({-href=>"/OPERATE/main.html"},"Вернуться в меню")))."\n";
  48.     print p(hr);
  49.     print end_html;
  50.     exit;
  51. }
  52.  
  53. &calculate_the_stored_numbers();
  54. unless (-e $flag_of_finish_game) {
  55.     print &generate_an_input_form_numbers_ball();
  56. } else {
  57.     print p(h2(b("Ошибка: Розыгрыш уже завершен")))."\n";
  58.     print p((a({-href=>"/OPERATE/main.html"},"Вернуться в меню")))."\n";
  59. }
  60.  
  61. print end_html;
  62.  
  63. exit;
  64.  
  65. sub get_game_properties () {
  66.     my $confname = shift if @_;
  67.     my ($titro_ip, $titro_port, $need_send, $copy_history, $copy_jp) = (undef, undef, undef, undef, undef);
  68.     if ( -r $confname ) {
  69.         open CNAME, "<$confname" || die "Can't open for read file $confname: $!\n";
  70.         flock(CNAME, LOCK_EX);
  71.         while (<CNAME>) {
  72.             chomp;
  73.             SWITCH: {
  74.                 /^TITRO_IP=(.*)/ && do { $titro_ip = $1; };
  75.                 /^TITRO_PORT=(.*)/ && do { $titro_port = $1; };
  76.                 /^NEED_SEND=(.*)/ && do { $need_send = $1; };
  77.                 /^COPY_HISTORY=(.*)/ && do { $copy_history = $1; };
  78.                 /^COPY_JP=(.*)/ && do { $copy_jp = $1; };
  79.             }
  80.         }
  81.         close CNAME || die "Can't close file $confname: $!\n";
  82.     }
  83.     return ($titro_ip, $titro_port, $need_send, $copy_history, $copy_jp);
  84. }
  85.  
  86. sub consider_the_amount_of_winnings () {
  87.     my $winfname = shift if @_;
  88.     my @amount = ( "win" );
  89.     if ( -r $winfname ) {
  90.         open WNAME, "<$winfname" || die "Can't open for read file $winfname: $!\n";
  91.         while (<WNAME>) {
  92.             chomp;
  93.             /^_(\d+)BALL_SUMM=(\d+)/ && do { $amount[$1]=$2; }
  94.         }
  95.         close WNAME || die "Can't close file $winfname: $!\n";
  96.     }
  97.     return @amount;
  98.     print  @amount;
  99. }
  100.  
  101. sub generate_an_input_form_numbers_ball () {
  102.     my $form = start_form;
  103.  
  104.     if (defined param("send_summ_to_TS_ok")) {
  105.         send_summ_to_TS() if param("send_summ_to_TS_ok");    
  106.         param("send_summ_to_TS_ok",'0');
  107.         $form .= hidden('send_summ_to_TS_ok')."\n";
  108.     }
  109.  
  110.     my $numball = 7;
  111.     $numball = param("numberball", param("numberball")-1) if param() && defined param("numberball");
  112.     &reload_the_game if $numball == 7;
  113.     $form .= hidden('numberball', $numball )."\n";
  114.  
  115.     my $stored_numbers = param("stored_numbers", join(":", %stored_value_numbers));
  116.     $form .= hidden('stored_numbers', $stored_numbers )."\n";
  117.  
  118.     my $saved_entry = param("saved_entry", join(":", %saved_entry));
  119.     $form .= hidden('saved_entry', $saved_entry )."\n";
  120.  
  121.     if ($numball>0 && $numball<8) {
  122.         $form .= h3("Забава-Плюс. Ввод выпавших шаров")."\n";
  123.     } else {
  124.         $form .= h3("Суммарная таблица результатов розыгрыша")."\n";
  125.     }
  126.  
  127.     my ($tdentry_row1, $tdentry_row2) = ("\n".th({-align=>"left",-valign=>"middle"},"Выпавшая цифра")."\n", "\n".th({-align=>"left",-valign=>"middle"},"Результаты")."\n");
  128.     $form .=  start_table({ -border=> 1, -cellpadding=>2, -cellspacing=>0 })."\n";
  129.     foreach ( reverse sort { $a <=> $b } keys %stored_value_numbers ) {
  130.         $tdentry_row1 .= td({-width=>"18px"},$stored_value_numbers{$_})."\n";
  131.         $tdentry_row2 .= td({-width=>"18px"},$saved_entry{$_})."\n";
  132.     }
  133.     $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";
  134.     $form .= TR({-align=>"center",-valign=>"middle",-height=>"18px"},$tdentry_row1)."\n";
  135.     $form .= TR({-align=>"center",-valign=>"middle",-height=>"18px"},$tdentry_row2)."\n";
  136.     $form .= end_table;
  137.  
  138.     if ($numball>0 && $numball<8) {
  139.         param("number","");
  140.  
  141.         my $play = 8 - int(defined param("numberball") ? param("numberball") : 1 );
  142.         $play = 1 if (! defined param ("numberball"));
  143.  
  144.         unless ( defined param("send_summ_to_TS_ok")) {
  145.         } else {
  146.             $form .= p(("Введите цифру выпавшего шара № ".b($play)).": ".textfield(-name=>"number", -size=>3, -maxlength=>1, -tabindex=>1).br)."\n";
  147.             $form .= start_table({ -border=>0, -cellpadding=>0, -cellspacing=>0 })."\n";
  148.             $form .= TR(td({-align=>"left",-valign=>"middle",-width=>"200px"},reset(-value=>"Очистить поле ввода")),td({-align=>"right",-valign=>"middle",-width=>"140px"},submit(-value=>"Ввести")));
  149.             $form .= end_table;
  150.         }
  151.         $form .= endform."\n";
  152. #       $form .= p(start_form.submit(-value=>"Обнулить результаты и начать игру заново").endform.hr);
  153.         $form .= p(start_form.submit(-value=>"Отослать данные на титровальную станцию").hidden('send_summ_to_TS_ok','1').endform) unless defined param("send_summ_to_TS_ok");
  154.         $form .= hr;
  155.  
  156.     } else {
  157.         &generate_and_record_Digits_Extra_wins_Qnts();
  158.         open FFLG, ">$flag_of_finish_game" || die "Can't open for write file $flag_of_finish_game: $!\n";
  159.         close FFLG || die "Can't close file $flag_of_finish_game: $!\n";
  160.         $form .= endform."\n";
  161.         $form .= p((a({-href=>"/OPERATE/main.html"},"Вернуться в меню")))."\n";
  162.     }
  163.  
  164.     return $form;
  165. }
  166.  
  167. sub calculate_the_stored_numbers () {
  168.     (%stored_value_numbers) = split(":",param("stored_numbers")) if defined param("stored_numbers");
  169.     (%saved_entry) = split(":",param("saved_entry")) if defined param("saved_entry");
  170.     $stored_value_numbers{param("numberball")} = param("number")+0 if defined param("numberball") && defined param("number");
  171.     my $mask_matches = "";
  172.     for ( my $i=1; $i<=7; $i++ ) {
  173.         $stored_value_numbers{$i} = "-" unless defined $stored_value_numbers{$i};
  174.         unless (defined $saved_entry{$i}) {
  175.             $saved_entry{$i} = "-";
  176.         } else {
  177.             $mask_matches .= $stored_value_numbers{$i};
  178.         }
  179.     }
  180.     $mask_matches =~ s/-/./g;
  181.     $mask_matches = reverse($mask_matches);
  182.     &calculate_occurrence ($file_for_search, $mask_matches, param("numberball"));
  183. }
  184.  
  185. sub get_filenames_for_calculate_occurrence () {
  186.     my $play = shift if @_;
  187.     my ($tmp,$dst,$fnom) = ("/tmp/","","");
  188.     my $prefix = "";
  189.     if (defined $play) {
  190.         ($tmp,$dst,$fnom) = ($tmp.$play."_digits_prize.csv",$dst.$play."_digits_prize.csv",$dst.$play."_digits_prize.nom");
  191.     }
  192.  
  193.     $tmp .= ".~";
  194.     return ($tmp,$dst,$fnom);
  195. }
  196.  
  197. sub calculate_occurrence () {
  198.     my $ffs_name = shift if @_;
  199.     my $mask_matches = shift if @_;
  200.     my $version_of_the_game = shift if @_;
  201.  
  202.     $ffs_name = $directory_with_the_original_data_games.$ffs_name;
  203.  
  204.     if ( -e $ffs_name && -r $ffs_name && length($mask_matches)>0 ) {
  205.  
  206.         my $play = 8 - int(defined param("numberball") ? param("numberball") : 1 );
  207.  
  208.         for (my $iplay = 1; $iplay<=$play; $iplay++) {
  209.             my ($ticket, $original_line, $matches_id) = (undef, undef, 8 - $iplay);
  210.             my ($tmp_dest_filename, $dest_filename, $file_number_of_matches) = &get_filenames_for_calculate_occurrence($matches_id);
  211.  
  212.             my $mask_submatches = substr($mask_matches,$iplay-1);
  213.             $saved_entry{$matches_id} = 0;
  214.  
  215.             open FFSTW, ">$tmp_dest_filename" || die "Can't open for write $tmp_dest_filename: $!\n";
  216.             flock(FFSTW, LOCK_EX);
  217.             print FFSTW
  218.                 "#draw=".$number_of_game."\n",
  219.                 "#base_ticket_number=\n";
  220.             close FFSTW || die "Can't close file $tmp_dest_filename: $!\n";
  221.  
  222.             my $mask_submatches_prefix;
  223.             if ($iplay>1) {
  224.                 $mask_submatches_prefix = substr($mask_matches,0,$iplay-1);
  225.                 $mask_submatches_prefix = (sprintf "."x (length($mask_submatches_prefix) -1).chop($mask_submatches_prefix));
  226.                 $mask_submatches_prefix =~ s/(\d)/\[^$1\]/g;
  227.             }
  228.             $mask_submatches_prefix = ":".$mask_submatches_prefix;
  229.  
  230. #               print pre("$mask_submatches_prefix$mask_submatches;");
  231.  
  232.             system("/bin/grep \"".$mask_submatches_prefix.$mask_submatches.";\" $ffs_name >> $tmp_dest_filename");
  233.             $saved_entry{$matches_id} = `/bin/cat $tmp_dest_filename | /usr/bin/wc -l`-2;
  234.             move($tmp_dest_filename,$directory_to_save_the_results.$dest_filename);
  235.  
  236.             send_information_to_the_number_of_matches(
  237.                 $play,
  238.                 $iplay,
  239.                 substr($mask_submatches,0,1),
  240.                 $saved_entry{$matches_id},
  241.                 $amount[$iplay],
  242.                 $directory_to_save_the_results.$file_number_of_matches,
  243.                 $mask_submatches
  244.             );
  245.             if ($play == $iplay) {
  246.                 my $zplus_wins = "";
  247.                 foreach my $k ( sort keys %saved_entry ) {
  248.                     $zplus_wins = join(" ",(split(",",$zplus_wins),int($saved_entry{$k})));
  249.                 }
  250.                 &send_data("ZPLUS_COUNTS $zplus_wins \n");
  251.                 select(undef, undef, undef, 0.1);
  252.                 if ($iplay == "7" && $amount[$iplay] > "0" ) {
  253.                     my $win_count = 0;
  254.                     open ZPW, "<${directory_to_save_the_results}7_digits_prize.csv" || die "Can't open for read 7_digits_prize.csv: $!\n";
  255.                     flock(ZPW, LOCK_EX);
  256.                     while (<ZPW>) {
  257.                         chomp; s/;.*$//;
  258.                         next if /^#/;
  259.                         select(undef, undef, undef, 0.2);
  260.                         $win_count++;
  261.                         my ($ticknum,undef,$dcode,undef)=split(":");
  262.                         $ticknum = "0000000".$ticknum;
  263.                         ($ticknum) = $ticknum =~ /(.{7})$/;
  264. #                       my $daddr = &getAddrByCode($dcode);
  265.                         my $dname = &getDistrNameByCode($dcode);
  266. #                       &send_data ("ZPLUS_WIN Білет № $ticknum $daddr\n");
  267.                         &send_data ("ZPLUS_WIN Білет № $ticknum $dname пр-во\n");
  268.                     }
  269.                     if ($win_count > "0") {
  270.                         select(undef, undef, undef, 0.2);
  271.                         &send_data ("ZPLUS_WIN_END\n");
  272.                     }
  273.                 }
  274.             }
  275.         }
  276.     }
  277. }
  278.  
  279. sub send_information_to_the_number_of_matches () {
  280.     my ($play, $iplay, $taw, $coincidence, $amount, $fnom, $mask_matches) = (shift, shift, shift, shift, shift, shift, shift) if @_;
  281.     if (defined $play && defined $iplay && defined $taw && defined $coincidence && defined $amount && defined $fnom && defined $mask_matches) {
  282.         $coincidence = 0 if $coincidence eq "-";
  283. #       &send_data("NEXT_BALL $iplay $taw $coincidence $amount \n");
  284.         if ($play == $iplay) {
  285.             &send_data("NEXT_BALL $taw \n");
  286.             select(undef, undef, undef, 0.1);
  287.         }
  288.         $mask_matches =~ s/\.//g;
  289.         open FNOM, ">".$fnom || die "Can't open for write $fnom: $!\n";
  290.         flock(FNOM, LOCK_EX);
  291.         print FNOM $iplay.":".$mask_matches.":".$coincidence.":".$amount.";\x0d\x0a";
  292.         close FNOM || die "Can't close file $fnom: $!\n";
  293.     } else {
  294.         print "WARNING! There is no information about coincidences!" if $iplay>1;
  295.     }
  296. }
  297.  
  298. sub reload_the_game () {
  299.     sub delete_files_older_games {
  300.         /^[1-7]_digits_prize.(csv|nom)$/ && unlink($File::Find::name);
  301.     }
  302.     find(\&delete_files_older_games,($directory_to_save_the_results));
  303.     foreach my $fname (($file_digits,$file_extra_wins,$file_qnts)) {
  304.         unlink($fname);
  305.     }
  306. }
  307.  
  308. sub generate_and_record_Digits_Extra_wins_Qnts () {
  309.     my @nomfiles;
  310.     sub generate_from_files {
  311.         /^[1-7]_digits_prize.nom$/ && push(@nomfiles,$File::Find::name);
  312.     }
  313.     find(\&generate_from_files,($directory_to_save_the_results));
  314.     my ($digits, $extra_wins, $qnts) = (undef,undef,undef);
  315.     foreach my $fnom (sort @nomfiles) {
  316.         open FNOM, "<$fnom" || die "Can't open for write file $fnom: $!\n";
  317.         while (<FNOM>) {
  318.             chomp; s/;.*$//;
  319.             my (undef, $mask_matches, $coincidence, $amount) = split(":");
  320.             $digits = join(",",($mask_matches,split(",",$digits)));
  321.             $extra_wins = join(",",(split(",",$extra_wins),$amount));
  322.             $qnts = join(",",($coincidence,split(",",$qnts)));
  323.             last;
  324.         }
  325.         close FNOM || die "Can't close file $fnom: $!\n";
  326.     }
  327.     foreach my $fname (($file_digits,$file_extra_wins,$file_qnts)) {
  328.         open FILE, ">$fname" || die "Can't open file for write $fname: $!\n";
  329.         print FILE $digits,"\n" if $fname eq $file_digits;
  330.         print FILE $extra_wins,"\n" if $fname eq $file_extra_wins;
  331.         print FILE $qnts,"\n" if $fname eq $file_qnts;
  332.         close FILE || die "Can't close file $fname: $!\n";
  333.     }
  334. }
  335.  
  336. sub send_summ_to_TS () {
  337.     &send_data("ZPLUS_SUMMS ".join(' ',reverse(@amount[1..7]))."\n");
  338. }
  339.  
  340. sub send_data () {
  341.     my $message = $_[0];
  342.     &add2log("send_data: $message");
  343.     if ($need_send) {
  344.         socket( SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
  345.         my $internet_address = inet_aton($titro_ip) || die "Couldn't convert $titro_ip into an Internet address: $!\n";
  346.         my $port_address = sockaddr_in($titro_port, $internet_address);
  347.         connect(SERVER, $port_address) || die "Couldn't connect to $titro_ip:$titro_port : $!\n";
  348.         send( SERVER, $message, 0);
  349.         close(SERVER);
  350.     } else {
  351.         &add2log("send_data: NEED_SEND is 0, message not sent");
  352.         print pre("$message");
  353.     }
  354. }
  355.  
  356. sub getAddrByCode{
  357.     my $d_code = shift;
  358.     my $ret = "м.Київ, вул. Червоногвардiйська, 12, оф.9";
  359.     add2log("getAddrByCode: I am called for $d_code from $daddrfile");
  360.     open(ADD_FILE, "<$daddrfile");
  361.     while (<ADD_FILE>) {
  362.         chomp;
  363.         my(@info)=split(/:/,$_);
  364.         if($info[1] eq $d_code) {
  365.             $ret = $info[2];
  366.             last;
  367.         }
  368.     }
  369.     close(ADD_FILE);
  370.     add2log("getAddrByCode: Return address is: $ret");
  371.     return $ret;
  372. }
  373.  
  374. sub getDistrNameByCode{
  375.     my $d_code = shift;
  376.     my $ret = "Kиївське";
  377.     add2log("getDistrNameByCode: I am called for $d_code from $dnamefile");
  378.     open(A_FILE, "$dnamefile");
  379.     while (<A_FILE>) {
  380.         chomp;
  381.         my(@info)=split(/;/,$_);
  382.         if($info[0] eq $d_code) {
  383.             $ret = $info[1];
  384.             last;
  385.         }
  386.     }
  387.     close(A_FILE);
  388.     add2log("getDistrNameByCode: Return name is: $ret");
  389.     return $ret;
  390. }
  391.  
  392. sub add2log{
  393.   open (ABB_FILE, ">>/sec/GAME/adm/zabava-plus.log") or print "EDIT_ERROR: $!";
  394.   print ABB_FILE $_[0];
  395.   print ABB_FILE "\n";
  396.   close ABB_FILE;
  397. }
Add Comment
Please, Sign In to add comment