'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'
);
'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'
);
###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
###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
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
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 • '.$_title.' • '.$_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,
{'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()},
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
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 {