0 # pause
);
}
- write_data_file($fh, '', '', \%story);
+ write_data_file($fh, \%story);
}
if ($words ne '') {
if (split(/\r?\n/,$story{'content'}) >= (STORY_LENGTH-1)) {
# store finished game
$story_i_path = DATA_STORY_PATH.$story_id;
- write_data_file($story_i_path, '', '', \%story);
+ write_data_file($story_i_path, \%story);
# init new game
$new_story{'id' } = $story_id + 1;
$new_story{'letter' } = '';
);
}
# save new game
- write_data_file($fh, '', '', \%new_story);
+ write_data_file($fh, \%new_story);
}
else {
$message = 'To early to finish this wordgame.';
- write_data_file($fh, '', '', \%story);
+ write_data_file($fh, \%story);
}
}
else {
}
}
}
- write_data_file($fh, '', '', \%story);
+ write_data_file($fh, \%story);
}
}
}
$intf_mode,
$intf_pause
);
- write_data_file($fh, '', '', \%story);
+ write_data_file($fh, \%story);
}
@story_lines = split(/\r?\n/, $story{'content'});
if(@story_lines & 1) {
###PERL_LIB: use lib /botm/lib/bsta
use botm_common (
'read_header_env',
- 'read_data_file', 'write_data_file',
+ 'read_data_file',
'url_query_decode',
'join_path',
'merge_url'
-Subproject commit 6b4b21b9139670faf83bb894ec378d49ecc6acdc
+Subproject commit 8dbd1b461e07f2894c4fcacacd681ab7c34b6bcb
text-align: left;
border: solid #0057af 4px;
font-family: monospace;
+ padding: 2px;
}
div.fq:hover
{
text-align: left;
border: solid #0057af 4px;
+ padding: 2px;
}
div.tq:hover
background-color: #bb6622;
}
+div.opomba:target
+{
+ border-color: #bb6622;
+ background-color: #bb6622;
+}
+
+div.opomba:target:hover
+{
+ border-color: #bb6622;
+ background-color: #bb6622;
+}
+
div.opomba_info
{
color: #ffffff!important;
{
background-color: #ffffff;
color: #000000;
+ clear: both;
+ padding: 4px;
}
div.space
border-color: #bb6622;
}
+input.hl {
+ background:none!important;
+ border:none!important;
+ padding:0!important;
+/* font-family:inherit;
+ font-size:inherit; */
+ font: inherit;
+ text-decoration:underline;
+ border-color: #0057af;
+ color: #0057af;
+}
+input.hl:hover {
+ border-color: #bb6622;
+ color: #bb6622;
+}
+
.br
{
border-color: #bb6622!important;
color: #0057af!important;
}
+.hu
+{
+ text-decoration:none!important;
+}
+.hu:hover
+{
+ text-decoration:underline!important;
+}
+
div.le
{
float: left;
'/fq' => '</div>',
'tq' => '<div class="tq">',
'/tq' => '</div>',
- 'quote' => '<div class="tq">',
- 'quote=' => '<div class="tq"><b class="br">',
- 'quote/='=> '</b> wrote:<br>',
- '/quote' => '</div>',
+ 'quote' => '<div class="opomba"><div class="opomba_text">',
+ 'quote=' => '<div class="opomba"><div class="opomba_info"><b>',
+ 'quote/='=> '</b> wrote:</div><div class="opomba_text">',
+ '/quote' => '</div></div>',
'ni' => '<span class="ni">',
'/ni' => '</span>',
'br' => '<span class="br">',
);
my $show_command_link = ($next_available || (!$access));
my $show_command_cursor = ((!$next_available) || ($command eq ''));
+ my $show_words = ($password_ok || ($access && !$launch));
+
my $frame_indirect = !(
(!$access) || (
($frame <= $last_frame) &&
if ($password_ok) {
$password_query = url_query_encode({'p', $settings->{'password'}});
- $goto_url = merge_url($goto_url , {'query' => $password_query, 'append_query' => 1});
- $info_url = merge_url($info_url , {'query' => $password_query, 'append_query' => 1});
- $words_url = merge_url($words_url , {'query' => $password_query, 'append_query' => 1});
- $bbcode_url = merge_url($bbcode_url , {'query' => $password_query, 'append_query' => 1});
- $viewer_url = merge_url($viewer_url , {'query' => $password_query, 'append_query' => 1});
- $viewer_0_url = merge_url($viewer_0_url , {'query' => $password_query, 'append_query' => 1});
- $viewer_prev_url = merge_url($viewer_prev_url, {'query' => $password_query, 'append_query' => 1});
- $viewer_next_url = merge_url($viewer_next_url, {'query' => $password_query, 'append_query' => 1});
- $viewer_last_url = merge_url($viewer_last_url, {'query' => $password_query, 'append_query' => 1});
+ $goto_url = merge_url($goto_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $info_url = merge_url($info_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $words_url = merge_url($words_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $bbcode_url = merge_url($bbcode_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $viewer_url = merge_url($viewer_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $viewer_0_url = merge_url($viewer_0_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $viewer_prev_url = merge_url($viewer_prev_url, {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $viewer_next_url = merge_url($viewer_next_url, {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $viewer_last_url = merge_url($viewer_last_url, {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
if ($frame_indirect) {
- $frame_url = merge_url($frame_url , {'query' => $password_query, 'append_query' => 1});
+ $frame_url = merge_url($frame_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
}
if ($nextframe_indirect) {
- $frame_next_url= merge_url($frame_next_url , {'query' => $password_query, 'append_query' => 1});
+ $frame_next_url= merge_url($frame_next_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
}
}
my $_base_url = html_entity_encode_dec($base_url , 1);
print $fh '<a href="'.$_goto_url.'">GOTO</a>'."\n";
print $fh ' <span style="float: right;">'."\n ";
if ($text_mode == TEXT_MODE->{'normal'}) {
- print $fh '<a href="'.$_words_url.'">'.$words_link_text.'</a> | ';
+ if ($show_words) {
+ print $fh '<a href="'.$_words_url.'">'.$words_link_text.'</a> | ';
+ }
}
else {
print $fh '<a href="'.$_viewer_url.'">Without</a> | ';
print $fh " </div>\n";
print $fh " </div>\n";
- if ($text_mode == TEXT_MODE->{'words'}) {
+ if (($text_mode == TEXT_MODE->{'words'}) && $show_words) {
print_comments($fh, $context, $settings, $words_data);
}
my $frame = int($context->{'frame'});
my $page = int($context->{'words_page'});
my $post_count = int($words_data->{'posts'});
+ my $id_start = $page * COMMENT_PAGE_LENGTH();
+ my $id_stop = $id_start + COMMENT_PAGE_LENGTH();
+ my $older = ($page > 0) ? ($page-1) : '';
+ my $newer;
+ my $password_query;
+ if ($id_stop >= $post_count) {
+ $id_stop = $post_count;
+ }
+ else {
+ $newer = $page+1;
+ }
+ my $links;
+
+ my $words_url = merge_url(
+ {'path' => CGI_VIEWER_PATH()},
+ {
+ 'path' => $frame,
+ 'query' => {'b' => TEXT_MODE->{'words'}},
+ }
+ );
+ my $older_url = merge_url(
+ $words_url,
+ {
+ 'query' => {'i' => $page-1},
+ 'fragment' => 'insw',
+ 'append_query' => 1
+ }
+ );
+ my $newer_url = merge_url(
+ $words_url,
+ {
+ 'query' => {'i' => $page+1},
+ 'fragment' => 'insw',
+ 'append_query' => 1
+ }
+ );
+
+ if ($password_ok) {
+ $password_query = url_query_encode({'p', $settings->{'password'}});
+ $older_url = merge_url($older_url, {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $newer_url = merge_url($older_url, {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ }
my $_post_url = html_entity_encode_dec(CGI_WORDS_PATH(), 1);
my $_password = html_entity_encode_dec($settings->{'password'}, 1);
+ my $_older_url = html_entity_encode_dec($older_url, 1);
+ my $_newer_url = html_entity_encode_dec($newer_url, 1);
+
+ if (($older ne '') || ($newer ne '')) {
+ $links .= ' <div class="underlinks">'."\n";
+ $links .= ' ';
+ if ($older ne '') {
+ $links .= '<a href="'.$_older_url.'">Older</a>'
+ }
+ if (($older ne '') && ($newer ne '')) {
+ $links .= ' | ';
+ }
+ if ($newer ne '') {
+ $links .= '<a href="'.$_newer_url.'">Newer</a>';
+ }
+ $links .= "\n";
+ $links .= ' </div>'."\n";
+ }
print $fh ' <div class="space"></div>'."\n";
print $fh ' <div id="insw" class="ins">'."\n";
print $fh ' <h1 class="titletext" id="wordstitletext">Words</h1>'."\n";
print $fh ' </div>'."\n";
+ if ($links ne '') {
+ print $fh $links;
+ }
+
print $fh ' <div class="undertext" id="words">'."\n";
if ($post_count > 0) {
- my $start = $page * COMMENT_PAGE_LENGTH();
- my $stop = $start + COMMENT_PAGE_LENGTH();
- if ($stop > $post_count) {
- $stop = $post_count;
- }
- for (my $i=$start; $i<$stop; ++$i) {
+ for (my $i=$id_start; $i<$id_stop; ++$i) {
my $ID = $words_data->{'content'}->[$i];
my $post_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $ID);
my %post_data = read_data_file($post_path);
$time_tab[1]
);
}
+ my $quote_url = merge_url(
+ {'path' => CGI_WORDS_PATH()},
+ {
+ 'query' => {
+ 'f' => $frame,
+ 'quote' => $ID,
+ 'p' => ($password_ok ? $settings->{'password'} : '')
+ }
+ }
+ );
+ my $edit_url = merge_url(
+ {'path' => CGI_WORDS_PATH()},
+ {
+ 'query' => {
+ 'f' => $frame,
+ 'edit' => $ID,
+ 'key' => $post_data{'key'},
+ 'username' => $post_data{'name'},
+ 'p' => ($password_ok ? $settings->{'password'} : '')
+ }
+ }
+ );
+ my $remove_url = merge_url(
+ {'path' => CGI_WORDS_PATH()},
+ {
+ 'query' => {
+ 'f' => $frame,
+ 'remove' => $ID,
+ 'key' => $post_data{'key'},
+ 'username' => $post_data{'name'},
+ 'p' => ($password_ok ? $settings->{'password'} : '')
+ }
+ }
+ );
- my $_ID = html_entity_encode_dec($ID, 1);
- my $_name = html_entity_encode_dec($post_data{'name'}, 1);
+ my $_ID = html_entity_encode_dec($ID, 1);
+ my $_name = html_entity_encode_dec($post_data{'name'}, 1);
+ my $_quote_url = html_entity_encode_dec($quote_url, 1);
+ my $_edit_url = html_entity_encode_dec($edit_url, 1);
+ my $_remove_url = html_entity_encode_dec($remove_url, 1);
print $fh ' <div id="'.$_ID.'"class="opomba">'."\n";
print $fh ' <div class="opomba_info">'."\n";
- print $fh ' '.$i.': '.$_name;
+ print $fh ' <a href="#'.$_ID.'" class="bi hu">'.$i.': '.$_name;
if ($post_time_text ne '') {
print $fh ' • '.$post_time_text;
}
if ($edit_time_text ne '') {
print $fh ' • '.$edit_time_text;
}
+ print $fh '</a>'."\n";
print $fh ' <div class="pr">'."\n";
- print $fh ' edit | remove'."\n";
+ print $fh ' <a href="'.$_quote_url.'" class="bi hu">quote</a> | <a href="'.$_edit_url.'" class="bi hu">edit</a> | <a href="'.$_remove_url.'" class="bi hu">remove</a>'."\n";
print $fh ' </div>'."\n";
print $fh ' </div>'."\n";
print $fh ' <div class="opomba_text">'."\n";
}
}
- print $fh ' <form method="get" action="'.$_post_url.'">'."\n";
- print $fh ' <b>Your words</b>'."\n";
+ print $fh ' <form method="post" action="'.$_post_url.'">'."\n";
+ print $fh ' <b>Your words:</b>'."\n";
print $fh ' <textarea class="inta" name="words" rows="4"></textarea>'."\n";
print $fh ' <table cellpadding="0" cellspacing="0" border="0"><tr>'."\n";
print $fh ' <td><b>Your name: </b></td>'."\n";
print $fh ' </tr><tr>'."\n";
print $fh ' <td><b>Leave this empty: </b></td>'."\n";
print $fh ' <td><input class="intx" type="text" name="password2" value=""></td>'."\n";
- print $fh ' <td><input class="inbt" type="submit" name="post" value="Send"></td>'."\n";
+ print $fh ' <td>'."\n";
+ print $fh ' <input class="inbt" type="submit" name="post" value="Send">'."\n";
+ print $fh ' <input class="inbt" type="submit" name="preview" value="Preview">'."\n";
+ print $fh ' </td>'."\n";
print $fh ' </tr></table>'."\n";
print $fh ' <input type="hidden" name="f" value="'.$frame.'">'."\n";
if ($password_ok) {
print $fh ' </form>'."\n";
print $fh ' </div>'."\n";
+ if ($links ne '') {
+ print $fh $links;
+ }
+
print $fh ' </div>'."\n";
}
$write_data = 1;
}
if ($write_data) {
- $r = write_data_file($frame_data_path, '', '', \%frame_data);
+ $r = write_data_file($frame_data_path, \%frame_data);
unless ($r) {
print STDERR "fail writing $frame_data_path\n";
if ($print) {
}
$goto_list{'title-' .$frame} = $frame_full_data{'title'};
$goto_list{'ongtime-'.$frame} = $frame_full_data{'ongtime'};
- $r = write_data_file(DATA_LIST_PATH(), '', '', \%goto_list);
+ $r = write_data_file(DATA_LIST_PATH(), \%goto_list);
unless ($r) {
print STDERR "fail writing ".DATA_LIST_PATH()."\n";
if ($print) {
$chat_state = CHAT_STATE->{'active'};
$chat{'state'} = $chat_state;
}
- write_data_file($fh, '', '', \%chat);
+ write_data_file($fh, \%chat);
}
else {
$message = 'Invalid username.';
$chat_state = CHAT_STATE->{'ready'};
$chat{'state'} = $chat_state;
}
- write_data_file($fh, '', '', \%chat);
+ write_data_file($fh, \%chat);
}
elsif ($words eq '') {
$message = 'Server ID missing.';
if ($username =~ /^[A-Za-z]*$/) {
$chat{'content'} .= 'leave@'.$username.': '.$words."\n";
if ($username ne '') {
- write_data_file($fh, '', '', \%chat);
+ write_data_file($fh, \%chat);
}
else {
my %new_chat;
if ($chat_state > 1) {
- write_data_file(DATA_CHAT_PATH.$chat_id, '', '', \%chat);
+ write_data_file(DATA_CHAT_PATH.$chat_id, \%chat);
$new_chat{'id'} = $chat_id+1;
}
else {
}
$new_chat{'state'} = CHAT_STATE->{'disconnected'};
$new_chat{'content'} = '';
- write_data_file($fh, '', '', \%new_chat);
+ write_data_file($fh, \%new_chat);
}
}
else {
$chat_state = CHAT_STATE->{'active'};
$chat{'state'} = $chat_state;
}
- write_data_file($fh, '', '', \%chat);
+ write_data_file($fh, \%chat);
}
else {
$message = 'Invalid username.';
if ($password_ok) {
my $password_query = url_query_encode({'p', $settings{'password'}});
- $coin_url = merge_url($coin_url , {'query' => $password_query, 'append_query' => 1});
- $oldest_url = merge_url($oldest_url, {'query' => $password_query, 'append_query' => 1});
- $older_url = merge_url($older_url , {'query' => $password_query, 'append_query' => 1});
- $newer_url = merge_url($newer_url , {'query' => $password_query, 'append_query' => 1});
+ $coin_url = merge_url($coin_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $oldest_url = merge_url($oldest_url, {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $older_url = merge_url($older_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
+ $newer_url = merge_url($newer_url , {'query' => $password_query, 'append_query' => 1, 'preserve_fragment' => 1});
}
my $abbr = abbr_name($username);
'print_html_start', 'print_html_end',
'print_html_head_start', 'print_html_head_end',
'print_html_body_start', 'print_html_body_end',
- 'write_index'
+ 'write_index',
+ 'merge_settings'
);
###PERL_PATH_SEPARATOR: PATH_SEPARATOR = /
{'path' => $frame}
);
if ($password_ok) {
- $viewer_url = merge_url($viewer_url, {'query' => $password_query, 'append_query' => 1});
+ $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);
if ($method eq 'HEAD') {
exit;
}
- write_data_file(\*STDOUT, '', '', \%state);
+ write_data_file(
+ \*STDOUT, \%state, '',
+ 0, 0, 0,
+ '>>', 1
+ );
+
exit;
}
if($method eq 'HEAD') {
exit;
}
-write_data_file(\*STDOUT, '', '', \%frame_data);
+write_data_file(
+ \*STDOUT, \%frame_data, '',
+ 0, 0, 0,
+ '>>', 1
+);
print "NO ONG\n";
}
}
- write_data_file($fh, '', '', \%state);
+ write_data_file($fh, \%state);
}
}
}
'read_data_file', 'write_data_file',
'html_entity_encode_dec',
'open_encoded',
- 'join_path'
+ 'join_path',
+ 'merge_url',
+ 'make_id'
);
use bsta_lib (
'TEXT_MODE',
'redirect',
'print_html_start', 'print_html_end',
'print_html_head_start', 'print_html_head_end',
- 'print_html_body_start', 'print_html_body_end'
+ 'print_html_body_start', 'print_html_body_end',
+ 'bb_to_html', 'eval_bb',
+ 'merge_settings'
);
###PERL_PATH_SEPARATOR: PATH_SEPARATOR = /
###PERL_CGI_VIEWER_PATH: CGI_VIEWER_PATH = /bsta/v
+###PERL_CGI_WORDS_PATH: CGI_WORDS_PATH = /bsta/w
###PERL_DATA_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/settings
###PERL_DATA_WORDS_PATH: DATA_WORDS_PATH = /botm/data/bsta/words/
+###PERL_LOG_WORDS_PATH: LOG_WORDS_PATH = /botm/log/bsta/words.log
+
###PERL_WEBSITE_NAME: WEBSITE_NAME = Bicycles on the Moon
###PERL_COMMENT_PAGE_LENGTH:COMMENT_PAGE_LENGTH= 16
if ($ENV{'REQUEST_METHOD'} =~ /^(HEAD|GET|POST)$/) {
$method = $1;
}
-else{
+else {
exit fail_method($ENV{'REQUEST_METHOD'}, 'GET, POST, HEAD');
}
%cgi = merge_settings(\%cgi, \%cgi_post);
}
# multipart not supported
- else{
+ else {
exit fail_content_type($method, $http{'content-type'});
}
}
}
if ($frame eq '') {
- exit output(0, '', 'Frame ID not specified.');
+ exit output(0, '400 Bad Request', 'Frame ID not specified.');
}
$words_data_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $frame);
unless (open_encoded($fh, "+<:encoding(UTF-8)", $words_data_path)) {
- exit output(0, '500 Internal Server Error', 'Failed opening data file.');
+ unless (open_encoded($fh, "+>:encoding(UTF-8)", $words_data_path)) {
+ exit output(0, '500 Internal Server Error', 'Failed opening data file.', 1);
+ }
}
unless (flock($fh, 2)) {
- exit output(0, '500 Internal Server Error', 'Failed locking data file.');
+ exit output(0, '500 Internal Server Error', 'Failed locking data file.', 1);
}
%words_data = read_data_file(
}
}
-if ($remove) {
+if ($remove || ($ID ne '')) {
unless ($index ne '') {
close($fh);
- exit output(0, '404 Not Found', 'Nothing to remove.');
+ exit output(0, '404 Not Found', $remove ? 'Nothing to remove.' : 'No such message.');
}
unless ($cgi{'key'} eq $post_data{'key'}) {
close($fh);
- exit output(0, '403 Forbidden', 'Invalid request.');
+ exit output(0, '400 Bad Request', 'Invalid request.');
}
-
- if (($cgi{'username'} eq '') && ($cgi{'password'} eq ''))
- {
+}
+if ($remove) {
+ if ($cgi{'i'} eq '') { # followed a link, not confirmed yet
close($fh);
- exit output(0, '', '', 0, 1);
+ exit output(0, '', '', 1);
}
-
- unless ($cgi{'username'} ne '') {
+}
+else {
+ unless ($post) { # followed a link, not confirmed yet
close($fh);
- exit output(0, '403 Forbidden', 'Missing user name.', 0, 1);
+ exit output(0, '', '', 1);
}
+}
+if (!$remove) {
+ unless ($cgi{'words'} ne '') {
+ exit output(0, '400 Bad Request', 'Where are your words?', 1);
+ }
+}
+unless ($cgi{'username'} ne '') {
+ close($fh);
+ exit output(0, '400 Bad Request', 'Missing user name.', 1);
+}
+if ($remove || ($ID ne '')) {
unless ($cgi{'username'} eq $post_data{'name'}) {
close($fh);
- exit output(0, '403 Forbidden', 'Wrong user name.', 0, 1);
+ exit output(0, '403 Forbidden', 'Wrong user name.', 1);
}
- unless ($cgi{'password'} ne '') {
+}
+if ($remove || ($ID ne '')) {
+ unless ($cgi{'password'} ne '') {
close($fh);
- exit output(0, '403 Forbidden', 'Missing password.', 0, 1);
+ exit output(0, '400 Bad Request', 'Missing password.', 1);
}
unless (
($cgi{'password'} eq $post_data{'password'}) || (
)
) {
close($fh);
- exit output(0, '403 Forbidden', 'Wrong password.', 0, 1);
+ exit output(0, '403 Forbidden', 'Wrong password.', 1);
}
-
- # all conditions fulfilled
-
+ if ($password_ok) {
+ $cgi{'password'} = $post_data{'password'};
+ }
+}
+unless ($cgi{'password2'} eq '') {
+ close($fh);
+ exit output(0, '', 'Please don\'t write anything in the place which should remain empty.', 1);
+ # no error code to confuse spambot :)
+}
+
+# all conditions fulfilled
+
+if ($remove) {
splice @post_list, $index, 1;
$words_data{'posts'} = scalar(@post_list);
$words_data{'content'} = \@post_list;
- $r = write_data_file($fh, '', '', \%words_data);
- unless($r) {
+ $r = write_data_file(
+ $fh, # file
+ \%words_data,
+ '', # encoding
+ 0, # no header
+ 0, # header only
+ 1 # as list
+ );
+ unless ($r) {
close($fh);
exit output(0, '500 Internal Server Error', 'Failed writing data file.');
}
+
+ close ($fh);
+
+ if (open_encoded($fh, ">>:encoding(UTF-8)", LOG_WORDS_PATH())) {
+ print $fh "$time REMOVE $ID\n";
+ write_data_file(
+ $fh, \%post_data, '',
+ 0, 0, 0,
+ '>>', 1
+ );
+ print $fh "\n\n";
+ close ($fh);
+ }
+
$ID = 'insw';
exit output(1);
}
+if ($ID eq '') {
+ $ID = make_id($frame, 1);
+}
+if ($index eq '') {
+ $index = scalar(@post_list);
+ $page = int($index / COMMENT_PAGE_LENGTH());
+ push @post_list, $ID;
+}
+$words_data{'posts'} = scalar(@post_list);
+$words_data{'content'} = \@post_list;
+
+$post_data_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $ID);
+
+$post_data{'frame'} = $frame;
+$post_data{'name'} = $cgi{'username'};
+$post_data{'password'} = $cgi{'password'};
+if ($post_data{'posttime'} eq '') {
+ $post_data{'posttime'} = $time;
+}
+else {
+ $post_data{'edittime'} = $time;
+}
+if ($post_data{'key'} eq '') {
+ my $new_key = '';
+ for (my $i=1; $i<16; $i+=1) {
+ $new_key .= sprintf('%02X', int(rand(0x100)));
+ }
+ $post_data{'key'} = $new_key;
+}
+$post_data{'content'} = $cgi{'words'};
+
+$r = write_data_file($post_data_path, \%post_data);
+unless ($r) {
+ close($fh);
+ exit output(0, '500 Internal Server Error', 'Failed writing post file.', 1, 0);
+}
+
+$r = write_data_file(
+ $fh, # file
+ \%words_data,
+ '', # encoding
+ 0, # no header
+ 0, # header only
+ 1 # as list
+);
+unless ($r) {
+ close($fh);
+ exit output(0, '500 Internal Server Error', 'Failed writing data file.', 1, 0);
+}
+
close($fh);
-exit output(0, '', '???');
+if (open_encoded($fh, ">>:encoding(UTF-8)", LOG_WORDS_PATH())) {
+ print $fh "$time POST $ID\n";
+ write_data_file(
+ $fh, \%post_data, '',
+ 0, 0, 0,
+ '>>', 1
+ );
+ print $fh "\n\n";
+ close ($fh);
+}
+
+exit output(1);
+
sub output {
- (
- my $posted, my $status, my $message,
- my $edit, my $remove,
- ) = @_;
+ (my $done, my $status, my $message, my $show_content) = @_;
- if ($posted) {
- my $redirect_url = merge_url(
- {'path' => CGI_VIEWER_PATH()},
- {
- 'path' => $frame,
- 'query' => {
- 'b' => TEXT_MODE->{'words'},
- 'i' => $page,
- 'p' => ($password_ok ? $settings{'password'} : '')
- },
- 'fragment' => $ID
- }
- );
- return redirect ($method, $redirect_url, 303);
+
+ my $return_url = merge_url(
+ {'path' => CGI_VIEWER_PATH()},
+ {
+ 'path' => $frame,
+ 'query' => {
+ 'b' => TEXT_MODE->{'words'},
+ 'i' => $page,
+ 'p' => ($password_ok ? $settings{'password'} : '')
+ },
+ 'fragment' => $ID
+ }
+ );
+ if ($done) {
+ return redirect ($method, $return_url, 303);
}
print "Content-type: text/html\n";
return;
}
+ my $title;
+ my $name;
+ my $content;
+
+ if ($remove) {
+ $title = 'Remove message "'.$ID.'"';
+ }
+ elsif ($ID ne '') {
+ $title = 'Edit message "'.$ID.'"';
+ }
+ else {
+ $title = 'Words';
+ }
+
+ if ($cgi{'username'} ne '') {
+ $name = $cgi{'username'}
+ }
+ elsif ($post_data{'name'} ne '') {
+ $name = $post_data{'name'}
+ }
+ else {
+ $name = '';
+ }
+
+ if ($cgi{'words'} ne '') {
+ $content = $cgi{'words'};
+ }
+ elsif ($quote ne '') {
+ my $quote_data_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $quote);
+ my %quote_data = read_data_file($quote_data_path);
+ $content = '[quote="'.$quote_data{'name'}.'"]'.$quote_data{'content'}.'[/quote]';
+ }
+ elsif (($cgi{'edit'} ne '') || $remove) {
+ $content = $post_data{'content'};
+ }
+ else {
+ $content = '';
+ }
+
+ my $_key = html_entity_encode_dec($post_data{'key'}, 1);
+ my $_ID = html_entity_encode_dec($ID, 1);
+ my $_title = html_entity_encode_dec($title, 1);
my $_message = html_entity_encode_dec($message, 1);
+ my $_password = html_entity_encode_dec($settings{'password'}, 1);
my $_story = html_entity_encode_dec($settings{'story'}, 1);
+ my $_name = html_entity_encode_dec($name, 1);
+ my $_content = html_entity_encode_dec($content, 1);
+ my $_empty = html_entity_encode_dec($cgi{'password2'}, 1);
my $_website_name = html_entity_encode_dec(WEBSITE_NAME(), 1);
+ my $_post_url = html_entity_encode_dec(CGI_WORDS_PATH(), 1);
+ my $_return_url = html_entity_encode_dec($return_url, 1);
print_html_start(\*STDOUT);
print_html_head_start(\*STDOUT);
- print ' <title>Words • '.$_story.' • '.$_website_name.'</title>';
+ print ' <title>'.$_title.' • '.$_story.' • '.$_website_name.'</title>';
print_html_head_end(\*STDOUT);
print_html_body_start(\*STDOUT);
print ' <div id="inst" class="ins">'."\n";
print ' <div id="title">'."\n";
- print ' <h1 id="titletext">Words</h1>'."\n";
+ print ' <h1 id="titletext">'.$_title.'</h1>'."\n";
print ' </div>'."\n";
print ' </div>'."\n";
print ' </div>'."\n";
}
- if ($edit) {
- print "EDIT\n";
- }
- elsif ($remove) {
- print "REMOVE\n";
+ if ($show_content) {
+ print ' <div id="insw" class="ins">'."\n";
+
+ print ' <div class="undertext" id="words">'."\n";
+ print ' <form method="post" action="'.$_post_url.'">'."\n";
+ unless ($remove) {
+ print ' <b>Your words:</b>'."\n";
+ print ' <textarea class="inta" name="words" rows="4">'.$_content.'</textarea>'."\n";
+ }
+ print ' <table cellpadding="0" cellspacing="0" border="0"><tr>'."\n";
+ print ' <td><b>Your name: </b></td>'."\n";
+ print ' <td><input class="intx" type="text" name="username" value="'.$_name.'"></td>'."\n";
+ print ' <td></td>'."\n";
+ print ' </tr><tr>'."\n";
+ print ' <td><b>'.(($ID ne '') ? 'Password' : 'Optional password').': </b></td>'."\n";
+ print ' <td><input class="intx" type="password" name="password" value=""></td>'."\n";
+ print ' <td>'.(($ID ne '') ? '' : '(if you want to edit later)').'</td>'."\n";
+ print ' </tr><tr>'."\n";
+ print ' <td><b>Leave this empty: </b></td>'."\n";
+ print ' <td><input class="intx" type="text" name="password2" value="'.$_empty.'"></td>'."\n";
+ if ($remove) {
+ print ' <td><input class="inbt" type="submit" name="remove" value="Remove"></td>'."\n";
+ }
+ else {
+ print ' <td>'."\n";
+ print ' <input class="inbt" type="submit" name="post" value="'.(($ID ne '') ? 'Update' : 'Send').'">'."\n";
+ print ' <input class="inbt" type="submit" name="preview" value="Preview">'."\n";
+ print ' </td>'."\n";
+ }
+ print ' </tr></table>'."\n";
+ print ' <input type="hidden" name="f" value="'.$frame.'">'."\n";
+ if ($ID ne '') {
+ print ' <input type="hidden" name="i" value="'.$_ID.'">'."\n";
+ }
+ print ' <input type="hidden" name="key" value="'.$_key.'">'."\n";
+ if ($password_ok) {
+ print ' <input type="hidden" name="p" value="'.$_password.'">'."\n";
+ }
+ print ' </form>'."\n";
+ if ($content ne ''){
+ print ' <br>'."\n";
+ print ' <div id="preview"class="opomba">'."\n";
+ print ' <div class="opomba_info">'."\n";
+ print ' Preview:'."\n";
+ print ' </div>'."\n";
+ print ' <div class="opomba_text">'."\n";
+ print bb_to_html(eval_bb($content, 0))."\n";
+ print ' </div>'."\n";
+ print ' </div>'."\n";
+ }
+ print ' </div>'."\n";
+ print ' <div id="underlinks">'."\n";
+ print ' <a href="'.$_return_url.'">Return</a>'."\n";
+ print ' </div>'."\n";
+
+ print ' </div>'."\n";
}
print_html_body_end(\*STDOUT); # , $ong_state == STATE->{'inactive'}
print_html_end(\*STDOUT);
}
-
-
-
-
-
-
-
###PERL_LIB: use lib /botm/lib/bsta
use botm_common (
'read_data_file', 'write_data_file',
+ 'opendir_encoded', 'readdir_decoded', 'unlink_encoded',
+ 'join_path'
);
use bsta_lib (
'STATE', 'INTF_STATE', 'CHAT_STATE',
binmode STDERR, ':encoding(UTF-8)';
decode_argv();
+###PERL_PATH_SEPARATOR: PATH_SEPARATOR = /
+
###PERL_DATA_CHAT_PATH: DATA_CHAT_PATH = /botm/data/bsta/chat
###PERL_DATA_LIST_PATH: DATA_LIST_PATH = /botm/data/bsta/list
###PERL_DATA_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/state
###PERL_DATA_STATE_PATH: DATA_STATE_PATH = /botm/data/bsta/state
###PERL_DATA_STORY_PATH: DATA_STORY_PATH = /botm/data/bsta/story
+###PERL_DATA_WORDS_PATH: DATA_WORDS_PATH = /botm/data/bsta/words/
###PERL_RESET_PASSWORD: RESET_PASSWORD = ''
%goto_list = (
);
-write_data_file(DATA_STATE_PATH(), '', '', \%state);
-write_data_file(DATA_STORY_PATH(), '', '', \%story);
-write_data_file(DATA_CHAT_PATH() , '', '', \%chat);
-write_data_file(DATA_LIST_PATH() , '', '', \%goto_list);
+write_data_file(DATA_STATE_PATH(), \%state);
+write_data_file(DATA_STORY_PATH(), \%story);
+write_data_file(DATA_CHAT_PATH() , \%chat);
+write_data_file(DATA_LIST_PATH() , \%goto_list);
write_index(
\%state,
$story{'state'},
0 # pause
);
+
+if (opendir_encoded(my $dir, DATA_WORDS_PATH())) {
+ print DATA_WORDS_PATH()."\n";
+ while (my $file_name = readdir_decoded($dir)) {
+ print $file_name."\n";
+ if ($file_name !~ /^[0-9]+$/) {
+ next;
+ }
+ my $full_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $file_name);
+ print $full_path."\n";
+ unlink_encoded ($full_path);
+ }
+}
\ No newline at end of file
firstpage_length: 4
page_length : 16
-comment_page_length: 16
+comment_page_length: 40
story_credits: "BSTA" by Balthasar Szczepański
intf_credits: Online interface © Balthasar Szczepański; AGPL 3 license
firstpage_length: 4
page_length : 16
-comment_page_length: 16
+comment_page_length: 40
story_credits: "BSTA" by Balthasar Szczepański
intf_credits: Online interface © Balthasar Szczepański; AGPL 3 license
firstpage_length: 4
page_length : 16
-comment_page_length: 16
+comment_page_length: 4
story_credits: "BSTA" by Balthasar Szczepański
intf_credits: Online interface © Balthasar Szczepański; AGPL 3 license
_data_story_path = @_PATH( $data_path, story )
_data_words_path = @_PATH( $data_path, words )
-_log_path = @_PATH( $log_path, )
-_log_ong_path = @_PATH( $log_path, ong.log)
+_log_path = @_PATH( $log_path, )
+_log_ong_path = @_PATH( $log_path, ong.log )
+_log_words_path = @_PATH( $log_path, words.log)
_www_path = @_PATH( $www_path, )
_www_index_path = @_PATH( $www_path, index.htm)
PERL_DATA_STORY_PATH = @_PERL_CONSTANT_STR( DATA_STORY_PATH , $_data_story_path )
PERL_DATA_WORDS_PATH = @_PERL_CONSTANT_STR( DATA_WORDS_PATH , $_data_words_path )
-PERL_LOG_PATH = @_PERL_CONSTANT_STR( LOG_PATH, $_log_path)
+PERL_LOG_PATH = @_PERL_CONSTANT_STR( LOG_PATH , $_log_path )
+PERL_LOG_WORDS_PATH = @_PERL_CONSTANT_STR( LOG_WORDS_PATH, $_log_words_path)
PERL_WWW_PATH = @_PERL_CONSTANT_STR( WWW_PATH , $_www_path )
PERL_WWW_INDEX_PATH = @_PERL_CONSTANT_STR( WWW_INDEX_PATH, $_www_index_path)
else {
$new_state{'state'} = STATE->{'ready'};
}
- write_data_file($fh, '', '', \%new_state);
+ write_data_file($fh, \%new_state);
}
}
elsif (
$r = write_index(\%state, \%settings);
}
if ($r) {
- $r = write_data_file($fh, '','', \%state);
+ $r = write_data_file($fh, \%state);
}
unless ($r) {
# FAILED ONG! Story as if it was inactive!