]> bicyclesonthemoon.info Git - ott/bsta/blobdiff - info.1.pl
move merge_settings to common library
[ott/bsta] / info.1.pl
index 09f185ae054d001fb76859c4b65af3c8c10f55c3..58a675fc51381708ecc28dd61556ccd33c189b99 100644 (file)
--- a/info.1.pl
+++ b/info.1.pl
@@ -27,27 +27,23 @@ use Encode ('encode', 'decode');
 
 ###PERL_LIB: use lib /botm/lib/bsta
 use botm_common (
+       'HTTP_STATUS',
+       'fail_method', 'fail_content_type',
+       'http_header_status',
        'read_header_env',
-       'read_data_file', 'write_data_file',
+       'write_data_file',
        'url_query_decode',
-       'join_path'
+       'merge_settings'
 );
 use bsta_lib (
        'STATE',
-       'fail_method', 'fail_content_type',
        'get_password',
-       'merge_settings'
+       'get_page_file', 'get_frame_file',
+       'read_frame_data', 'read_default', 'read_noaccess',
+       'read_settings', 'read_default', 'read_state',
+       'read_words_list', 'read_words', 'read_attachment'
 );
 
-###PERL_PATH_SEPARATOR:     PATH_SEPARATOR     = /
-
-###PERL_DATA_PATH:          DATA_PATH          = /botm/data/bsta
-###PERL_DATA_ATTACH_PATH:   DATA_ATTACH_PATH   = /botm/data/bsta/a
-###PERL_DATA_DEFAULT_PATH:  DATA_DEFAULT_PATH  = /botm/data/bsta/default
-###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
-
 binmode STDIN,  ':encoding(UTF-8)';
 binmode STDOUT, ':encoding(UTF-8)';
 binmode STDERR, ':encoding(UTF-8)';
@@ -58,7 +54,7 @@ srand ($time-$$);
 
 my %http;
 my %cgi;
-my %frame_data;
+my %info_data;
 my %next_frame_data;
 my %default;
 my %settings;
@@ -67,14 +63,13 @@ my %state;
 my $method;
 my $frame = '';
 my $attachment = '';
+my $words = '';
 my $password;
 my $password_ok;
 my $access;
 my $show_command;
 my $ongtime;
 my $timer;
-my $frame_data_path;
-my $next_frame_data_path;
 my $ong_state;
 my $last_frame;
 
@@ -85,7 +80,7 @@ if ($ENV{'REQUEST_METHOD'} =~ /^(HEAD|GET|POST)$/) {
        $method = $1;
 }
 else{
-       exit fail_method($ENV{'REQUEST_METHOD'}, 'GET, POST, HEAD');
+       exit fail_method($ENV{'REQUEST_METHOD'}, ['GET', 'POST', 'HEAD']);
 }
 
 %http = read_header_env(\%ENV);
@@ -105,43 +100,70 @@ if ($method eq 'POST') {
 if ($cgi{'f'} =~ /^.+$/) {
        $frame = int($&);
 }
+elsif ($cgi{'a'} =~ /^.+$/) {
+       $attachment = int($&);
+}
 elsif ($cgi{'i'} =~ /^.+$/) {
        $attachment = int($&);
 }
-elsif ($ENV{'PATH_INFO'} =~ /^\/a(.+)$/) {
+elsif ($cgi{'w'} =~ /^.+$/) {
+       $words = $&;
+}
+elsif ($ENV{'PATH_INFO'} =~ /^\/a\/?(.+)$/) {
        $attachment = int($1);
 }
-elsif ($ENV{'PATH_INFO'} =~ /^\/(.+)$/) {
-       $frame = int($1);
+elsif ($ENV{'PATH_INFO'} =~ /^\/w\/?(.+)$/) {
+       $words = $1;
+}
+elsif ($ENV{'PATH_INFO'} =~ /^\/(f\/?)?(.+)$/) {
+       $frame = int($2);
 }
 
 $password = get_password(\%cgi);
 
-%settings   = read_data_file(DATA_SETTINGS_PATH());
-%default    = read_data_file(DATA_DEFAULT_PATH());
-%state      = read_data_file(DATA_STATE_PATH());
+%settings   = read_settings();
+%default    = read_default();
+%state      = read_state(());
 
 $ong_state  = int($state{'state'});
 $last_frame = int($state{'last'});
 
 $password_ok = ($password eq $settings{'password'});
 
+# comment info, not frame
+if ($words ne '') {
+       if ($words =~ /^[0-9]+$/) {
+               %info_data = read_words_list(
+                       int($&), # id
+                       0, # header only
+                       1 # not as list
+               );
+               $frame = int($&);
+               if ($info_data{'posts'} eq '') {
+                       $info_data{'posts'} = 0;
+               }
+       }
+       elsif ($words =~ /^[0-9]+\.[0-9\.]+$/) {
+               %info_data = read_words($&);
+               $frame = ($info_data{'frame'} ne '') ? int($info_data{'frame'}) : -1;
+               unless ($password_ok) {
+                       delete($info_data{'password'});
+                       delete($info_data{'key'});
+               }
+       }
+}
 # attachment info, not frame
-if ($attachment ne '') {
-       %frame_data = read_data_file(DATA_ATTACH_PATH().$attachment);
-       $frame = ($frame_data{'frame'} ne '') ? int($frame_data{'frame'}) : -1;
+elsif ($attachment ne '') {
+       %info_data = read_attachment($attachment);
+       $frame = ($info_data{'frame'} ne '') ? int($info_data{'frame'}) : -1;
 }
 # frame info
 elsif ($frame ne '') {
        if ($frame < 0) {
                $frame = $last_frame + $frame +1;
        }
-       $frame_data_path      = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame);
-       $next_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame+1);
-       %frame_data      = read_data_file($frame_data_path);
-       %next_frame_data = read_data_file($next_frame_data_path);
-       %frame_data      = merge_settings(\%default,      \%frame_data);
-       %next_frame_data = merge_settings(\%default, \%next_frame_data);
+       %info_data       = read_frame_data($frame, \%default);
+       %next_frame_data = read_frame_data($frame+1, \%default);
        
        $timer   = int($state{'nextong'}) - $time;
        $ongtime = int($state{'ongtime'});
@@ -164,7 +186,7 @@ else {
                        $state{'ip3'} = 1;
                }
        }
-       print "Content-type: text/plain\n\n";
+       print "Content-type: text/plain; charset=UTF-8\n\n";
        if ($method eq 'HEAD') {
                exit;
        }
@@ -187,8 +209,9 @@ if (
        $access = 1;
        
        if (
+               ($words eq '') &&
                ($attachment eq '') &&
-               ($frame_data{'command'} eq '') && (
+               ($info_data{'command'} eq '') && (
                        $password_ok ||
                        ($frame < $last_frame) || (
                                ($ong_state >= STATE->{'ready'}) &&
@@ -196,36 +219,45 @@ if (
                        )
                )
        ) {
-               $frame_data{'command'} = $next_frame_data{'title'};
+               $info_data{'command'} = $next_frame_data{'title'};
        }
 }
 else {
        $access = 0;
-       if ($attachment ne '') {
-               %frame_data = ();
+       if (($attachment ne '') || ($words ne '')) {
+               %info_data = ();
        }
        else {
-               %frame_data = read_data_file(DATA_NOACCESS_PATH());
-               %frame_data = merge_settings(\%default, \%frame_data);
+               %info_data = read_noaccess(\%default);
        }
 }
 if (
-       ($frame_data{'frame'} eq '') &&
-       ($attachment eq '')
+       ($attachment eq '') &&
+       ($words eq '')
 ) {
-       $frame_data{'frame'} = sprintf($settings{'frame'}, $frame, $frame_data{'ext'});
+       if ($info_data{'frame'} eq '') {
+               $info_data{'frame'} = get_frame_file($frame, \%info_data, \%settings)
+       }
+       if ($info_data{'page'} eq '') {
+               unless (($access) && ($frame < $last_frame)) {
+                       $info_data{'page'} = '';
+               }
+               else {
+                       $info_data{'page'} = get_page_file($frame, \%info_data, \%settings);
+               }
+       }
 }
 
-print "Content-type: text/plain\n";
+print "Content-type: text/plain; charset=UTF-8\n";
 if (!$access) {
-       print "Status: 403 Forbidden\n";
+       print http_header_status(HTTP_STATUS->{'forbidden'});
 }
 print "\n";
 if($method eq 'HEAD') {
        exit;
 }
 write_data_file(
-       \*STDOUT, \%frame_data, '',
+       \*STDOUT, \%info_data, '',
        0, 0, 0,
        '>>', 1
 );