]> bicyclesonthemoon.info Git - ott/bsta/blobdiff - bsta_lib.1.pm
fix ONG; fix update; total reset
[ott/bsta] / bsta_lib.1.pm
index 9774a2dc6c0ac59cc615e6d3917487589598ea2e..7b8c37d5c45dee09ec0db16061a8bf4af51fe7e1 100644 (file)
@@ -45,8 +45,8 @@ our @EXPORT_OK   = (
        'print_html_start', 'print_html_end',
        'print_html_head_start', 'print_html_head_end',
        'print_html_body_start', 'print_html_body_end',
-       'print_viewer_page',
-       'write_index',
+       'print_viewer_page', 'print_goto',
+       'write_index', 'write_static_viewer_page', 'write_static_goto',
        'ong',
        'eval_bb', 'bb_to_bbcode', 'bb_to_html'
 );
@@ -61,7 +61,7 @@ use botm_common (
        'read_header_env',
        'read_data_file', 'write_data_file',
        'join_path',
-       'copy_encoded', 'open_encoded',
+       'copy_encoded', 'open_encoded', '_x_encoded',
        'http_header_line', 'http_status',
        'http_header_status', 'http_header_allow', 'http_header_location'
 );
@@ -77,6 +77,7 @@ use botm_common (
 ###PERL_CGI_FRAME_PATH:     CGI_FRAME_PATH     = /bsta/f
 ###PERL_CGI_GOTO_PATH:      CGI_GOTO_PATH      = /bsta/g
 ###PERL_CGI_INFO_PATH:      CGI_INFO_PATH      = /bsta/i
+###PERL_CGI_LIST_PATH:      CGI_LIST_PATH      = /bsta/goto.htm
 ###PERL_CGI_LOGO_PATH:      CGI_LOGO_PATH      = /bsta/botmlogo.png
 ###PERL_CGI_TIMER_PATH:     CGI_TIMER_PATH     = /bsta/timer.js
 ###PERL_CGI_VIEWER_PATH:    CGI_VIEWER_PATH    = /bsta/v
@@ -88,9 +89,12 @@ use botm_common (
 ###PERL_DATA_DEFAULT_PATH:  DATA_DEFAULT_PATH  = /botm/data/bsta/default
 ###PERL_DATA_LIST_PATH:     DATA_LIST_PATH     = /botm/data/bsta/list
 ###PERL_DATA_NOACCESS_PATH: DATA_NOACCESS_PATH = /botm/data/bsta/noaccess
+###PERL_DATA_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/settings
+###PERL_DATA_STATE_PATH:    DATA_STATE_PATH    = /botm/data/bsta/state
 ###PERL_DATA_WORDS_PATH:    DATA_WORDS_PATH    = /botm/data/bsta/words/
 
 ###PERL_WWW_PATH:           WWW_PATH           = /botm/www/
+###PERL_WWW_GOTO_PATH:      WWW_GOTO_PATH      = /botm/www/1190/bsta/goto.htm
 ###PERL_WWW_INDEX_PATH:     WWW_INDEX_PATH     = /botm/www/1190/bsta/index.htm
 
 ###PERL_SCHEME:             SCHEME             = http
@@ -353,6 +357,7 @@ sub redirect
        if ($code eq '') {
                $code = HTTP_STATUS->{'found'};
        }
+       # https://insanecoding.blogspot.com/2014/02/http-308-incompetence-expected.html
        # 301 Moved Permanently
        # 302 Found
        # 303 See Other
@@ -871,6 +876,146 @@ sub print_html_data {
        print $fh html_encode_line("\n".$data->{'content'});
 }
 
+sub print_goto {
+       (
+               my $file,
+               my $state,
+               my $settings,
+               my $goto_list,
+               my $password_ok,
+       ) = @_;
+       
+       my $fh;
+       my $last_frame;
+       my $ong_state;
+       my $password_query;
+       
+       $last_frame = int($state->{'last'});
+       $ong_state  = int($state->{'state'});
+       $password_query = url_query_encode({'p', $settings->{'password'}});
+       
+       my $_title        = html_entity_encode_dec($settings->{'story'}, 1);
+       my $_website_name = html_entity_encode_dec(WEBSITE_NAME()    , 1);
+       my $_base_url     = html_entity_encode_dec(CGI_PATH()        , 1);
+       
+       if (ref($file)) {
+               $fh=$file;
+               unless (seek($fh, 0, 0)) {
+                       #don't actually fail here
+               }
+       }
+       else {
+               unless (open_encoded($fh, ">:encoding(UTF-8)", $file)) {
+                       return 0;
+               }
+       }
+       
+       print_html_start($fh);
+       print_html_head_start($fh);
+       
+       print $fh '  <title>GOTO &bull; '.$_title.' &bull; '.$_website_name.'</title>'."\n";
+
+       print_html_head_end($fh);
+       print_html_body_start($fh);
+       
+       print $fh '   <div id="inst" class="ins">'."\n";
+
+       print $fh '    <div id="title">'."\n";
+       print $fh '     <h1 id="titletext">'.$_title.'</h1>'."\n";
+       print $fh '    </div>'."\n";
+
+       print $fh '   </div>'."\n";
+       print $fh '   <div id="insb" class="ins">'."\n";
+
+       print $fh '    <div id="chat">'."\n";
+       
+       for (my $frame = 0; ; $frame += 1) {
+               unless (
+                       $password_ok || (
+                               ($frame <= $last_frame) &&
+                               ($ong_state >= STATE->{'waiting'})
+                       )
+               ) {
+                       last;
+               }
+               my $title;
+               my $ongtime;
+               my @time_tab;
+               my $time_text;
+               my $timer_color;
+               my $frame_text;
+               my $viewer_url;
+               
+               $ongtime = $goto_list->{'ongtime-'.$frame};
+               $title   = $goto_list->{'title-'  .$frame};
+               if (($ongtime eq '') && ($title eq '')) {
+                       my $frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame);
+                       my %frame_data = read_data_file($frame_data_path);
+                       $ongtime = $frame_data{'ongtime'};
+                       $title   = $frame_data{'title'};
+                       unless (keys %frame_data) {
+                               last;
+                       }
+               }
+               
+               if ($ongtime ne '') {
+                       @time_tab = gmtime($ongtime);
+                       $time_text = sprintf(
+                               '%02d.%02d.%02d %02d:%02d',
+                               $time_tab[3],
+                               $time_tab[4]+1,
+                               $time_tab[5]%100,
+                               $time_tab[2],
+                               $time_tab[1]
+                       );
+               }
+               else {
+                       $time_text = (($frame <= $last_frame) && ($ong_state >= STATE->{'waiting'})) ?
+                               'EE.EE.EE EE:EE' : '--.--.-- --:--';
+               }
+               if ($title eq '') {
+                       $title = '_';
+               }
+               $timer_color = (($frame > $last_frame) || ($ong_state < STATE->{'waiting'})) ?
+                       'cz' : (
+                               (($frame == $last_frame) && ($ong_state < STATE->{'ready'})) ?
+                                       'ni' : 'br'
+                       );
+               $frame_text = sprintf('%03d',$frame);
+               $viewer_url = merge_url(
+                       {'path' => CGI_VIEWER_PATH()},
+                       {'path' => $frame}
+               ); # TODO: consider static here?
+               if ($password_ok) {
+                       $viewer_url = merge_url($viewer_url, {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+               }
+               
+               my $_viewer_url = html_entity_encode_dec($viewer_url, 1);
+               my $_title      = html_entity_encode_dec($title     , 1);
+               
+               print $fh '     <span class="'.$timer_color.'">'.$frame_text.'</span> '.$time_text.' <a href="'.$_viewer_url.'">'.$_title.'</a><br>'."\n";
+       }
+       print $fh '    </div>'."\n";
+
+       print $fh '    <div id="underlinks">'."\n";
+       print $fh '     <a href="'.$_base_url.'">BSTA</a>'."\n";
+       print $fh '    </div>'."\n";
+
+       print $fh '   </div>'."\n";
+
+       print_html_body_end($fh, $ong_state == STATE->{'inactive'});
+       print_html_end($fh);
+       
+       unless (ref($file)) {
+               close ($fh);
+       }
+       else {
+               truncate ($fh , tell($fh));
+       }
+       
+       return 1;
+}
+
 sub print_viewer_page {
        (
                my $file,
@@ -1019,6 +1164,54 @@ sub print_viewer_page {
                {'path' => CGI_VIEWER_PATH()},
                {'path' => ($static ? -1 : $last_frame)}
        );
+       unless ($password_ok) {
+               my $page_file;
+               $viewer_0_url = $base_url;
+               if ($prev_frame == 0) {
+                       $viewer_prev_url = $viewer_0_url;
+               }
+               else {
+                       if ($prev_frame_data->{'page'} ne '') {
+                               $page_file = $prev_frame_data->{'page'};
+                       }
+                       else {
+                               $page_file = sprintf(
+                                       $settings->{'frame'},
+                                       $prev_frame, 'htm'
+                               );
+                       }
+                       if (_x_encoded('-f',
+                               join_path(PATH_SEPARATOR(), WWW_PATH() , $page_file)
+                       )) {
+                               $viewer_prev_url = merge_url(
+                                       {'path' => $base_url},
+                                       {'path' => $page_file}
+                               );
+                       }
+               }
+               if ($next_frame < $last_frame) {
+                       if ($next_frame_data->{'page'} ne '') {
+                               $page_file = $next_frame_data->{'page'};
+                       }
+                       else {
+                               $page_file = sprintf(
+                                       $settings->{'frame'},
+                                       $next_frame, 'htm'
+                               );
+                       }
+                       if (_x_encoded('-f',
+                               join_path(PATH_SEPARATOR(), WWW_PATH() , $page_file)
+                       )) {
+                               $viewer_next_url = merge_url(
+                                       {'path' => $base_url},
+                                       {'path' => $page_file}
+                               );
+                       }
+               }
+               if (_x_encoded('-f',WWW_GOTO_PATH())) {
+                       $goto_url = CGI_LIST_PATH();
+               }
+       }
        my $bbcode_url = ($text_mode == TEXT_MODE->{'bb'}) ?
                merge_url(
                        {'path' => CGI_BBCODE_PATH()},
@@ -1169,9 +1362,23 @@ sub print_viewer_page {
                if ($show_command) {
                        $frame_data->{'command'} = $command;
                }
-               if ($context->{'access'}) {
+               if ($access) {
                        $frame_data->{'frame'} = $frame_file;
                }
+               if ($frame_data->{'page'} eq '') {
+                       unless (($access) && ($frame < $last_frame)) {
+                               $frame_data->{'page'} = '';
+                       }
+                       elsif ($frame == 0) {
+                               $frame_data->{'page'} = 'index.htm';
+                       }
+                       else {
+                               $frame_data->{'page'} = sprintf(
+                                       $settings->{'frame'},
+                                       $frame, 'htm'
+                               );
+                       }
+               }
        }
        
        # everything determined, now start generating
@@ -1816,6 +2023,152 @@ sub write_index {
        return $r
 }
 
+sub write_static_viewer_page {
+       (
+               my $frame,
+               my $state_ref,
+               my $settings_ref,
+               my $default_ref,
+               my $frame_data_ref,
+               my $prev_frame_data_ref,
+               my $next_frame_data_ref,
+               my $words_data_ref
+       ) = @_;
+       
+       my %state;
+       my %settings;
+       my %default;
+       my %frame_data;
+       my %prev_frame_data;
+       my %next_frame_data;
+       my %words_data;
+       
+       my $file;
+       
+       $frame = int($frame);
+       my $prev_frame = $frame -1;
+       my $next_frame = $frame +1;
+       
+       %state = (ref ($state_ref)) ?
+               %$state_ref :
+               read_data_file(DATA_STATE_PATH());
+       my $ong_state = int($state{'state'});
+       my $last_frame = int($state{'last'});
+       
+       unless ($ong_state > STATE->{'inactive'}) {
+               return 0;
+       }
+       unless (
+               ($frame >= 0) && (
+                       ($frame < $last_frame) || (
+                               ($frame <= $last_frame) &&
+                               ($ong_state >= STATE->{'end'})
+                       )
+               )
+       ) {
+               return 0;
+       }
+       
+       %settings = (ref ($settings_ref)) ?
+               %$settings_ref :
+               read_data_file(DATA_SETTINGS_PATH());
+       %default = (ref ($default_ref)) ?
+               %$default_ref :
+               read_data_file(DATA_DEFAULT_PATH());
+       
+       %frame_data = (ref ($frame_data_ref)) ?
+               %$frame_data_ref :
+               read_data_file(join_path(PATH_SEPARATOR(), DATA_PATH(), $frame));
+       
+       %prev_frame_data = (ref ($prev_frame_data_ref)) ?
+               %$prev_frame_data_ref : (
+                       ($prev_frame >= 0) ?
+                       read_data_file(join_path(PATH_SEPARATOR(), DATA_PATH(), $prev_frame)) :
+                       %default
+               );
+               
+       %next_frame_data = (ref ($next_frame_data_ref)) ?
+               %$next_frame_data_ref : (
+                       (($next_frame < $last_frame) || (
+                               ($next_frame <= $last_frame) &&
+                               ($next_frame >= STATE->{'end'})
+                       )) ?
+                       read_data_file(join_path(PATH_SEPARATOR(), DATA_PATH(), $next_frame)) :
+                       %default
+               );
+       
+       %frame_data      = merge_settings(\%default, \%frame_data);
+       %prev_frame_data = merge_settings(\%default, \%prev_frame_data);
+       %next_frame_data = merge_settings(\%default, \%next_frame_data);
+       
+       %words_data = (ref ($words_data_ref)) ?
+               %$words_data_ref :
+               read_data_file(
+                       join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $frame), # file
+                       '', # encoding
+                       0,  # no header
+                       1,  # header only
+                       1,  # as list; not relevant
+               );
+       
+       if ($frame_data{'page'} ne '') {
+               $file = $frame_data{'page'}
+       }
+       else {
+               $file = sprintf(
+                       $settings{'frame'},
+                       $frame, 'htm'
+               );
+       }
+       $file = join_path(PATH_SEPARATOR(), WWW_PATH(), $file);
+       
+       return print_viewer_page(
+               $file,
+               {
+                       'launch'        => 0,
+                       'frame'         => $frame,
+                       'access'        => 1,
+                       'password_ok'   => 0,
+                       'timer_unlocked'=> 3, # not relevant
+                       'timer'         => 0, # not relevant
+                       'static'        => 1,
+                       'show_command'  => 1,
+                       'text_mode'     => TEXT_MODE->{'normal'},
+                       'words_page'    => 0, # not relevant
+               },
+               \%state,
+               \%settings,
+               \%frame_data,
+               \%prev_frame_data,
+               \%next_frame_data,
+               \%words_data
+       );
+}
+
+sub write_static_goto {
+       (my $state_ref, my $settings_ref, my $goto_ref) = @_;
+       my %state;
+       my %settings;
+       my %goto_list;
+       
+       %state = (ref ($state_ref)) ?
+               %$state_ref :
+               read_data_file(DATA_STATE_PATH());
+       %settings = (ref ($settings_ref)) ?
+               %$settings_ref :
+               read_data_file(DATA_SETTINGS_PATH());
+       %goto_list = (ref ($goto_ref)) ?
+               %$goto_ref :
+               read_data_file(DATA_SETTINGS_PATH());
+       
+       return print_goto(
+               WWW_GOTO_PATH(),
+               \%state,
+               \%settings,
+               \%goto_list,
+               0, # password OK
+       );
+}
 
 # ONG the frame + attachment & stuff. NOT update state file.
 sub ong {