#
# Reset BSTA state
#
-# Copyright (C) 2016 - 2018, 2023 Balthasar Szczepański
+# Copyright (C) 2016, 2017, 2018, 2023, 2024 Balthasar Szczepański
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
###PERL_LIB: use lib /botm/lib/bsta
use botm_common (
- 'read_data_file', 'write_data_file',
+ 'write_data_file',
+ 'opendir_encoded', 'readdir_decoded', 'unlink_encoded',
+ 'join_path',
+ 'merge_settings'
);
use bsta_lib (
- 'STATE', 'INTF_STATE',
- 'write_index'
+ 'STATE', 'INTF_STATE', 'CHAT_STATE',
+ 'write_index',
+ 'get_page_file', 'get_frame_file',
+ 'read_settings', 'read_default', 'read_frame_data', 'read_attachment', 'read_state'
);
binmode STDIN, ':encoding(UTF-8)';
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_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/state
+###PERL_DATA_DEFAULT_PATH: DATA_DEFAULT_PATH = /botm/data/bsta/default
+###PERL_DATA_LIST_PATH: DATA_LIST_PATH = /botm/data/bsta/list
###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_WWW_PATH: WWW_PATH = /botm/www/
###PERL_RESET_PASSWORD: RESET_PASSWORD = ''
my %state;
my %chat;
my %settings;
+my %goto_list;
+my %default;
+my $last_frame;
+my @remove_list;
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
###PERL_SET_PATH: $ENV{'PATH'} = /usr/local/bin:/usr/bin:/bin;
-%settings = read_data_file(DATA_SETTINGS_PATH());
+%settings = read_settings();
+%state = read_state();
unless (
($ARGV[0] ne '') && (
($ARGV[0] eq $settings{'password'}) ||
exit 1;
}
+$last_frame = (int($settings{'last'}) > int($state{'last'})) ?
+ int($settings{'last'}) : int($state{'last'});
+%default = read_default();
+
+for (my $frame=0; $frame<=$last_frame; $frame+=1) {
+ my %frame_data = read_frame_data($frame, \%default);
+ unless ($frame == 0) {
+ push @remove_list, get_page_file($frame, \%frame_data, \%settings);
+ }
+ push @remove_list, get_frame_file($frame, \%frame_data, \%settings);
+}
+push @remove_list, 'goto.htm';
+for (my $i=0; ;$i+=1) {
+ my %file_data;
+
+ %file_data = read_attachment($i);
+ if ($file_data{'frame'} eq '') {
+ last;
+ }
+ if ($file_data{'content'} ne '') {
+ next;
+ }
+ push @remove_list, $file_data{'filename'};
+}
+
%state = (
'state' => STATE->{'inactive'},
'last' => 0,
);
%chat = (
'id' => 0,
- 'state' => 0, # TODO chat state enum?
+ 'state' => CHAT_STATE->{'disconnected'},
'content' => ''
);
+%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_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())) {
+ while (defined (my $file_name = readdir_decoded($dir))) {
+ if ($file_name !~ /^[0-9]+$/) {
+ next;
+ }
+ my $full_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $file_name);
+ # print "RM $full_path\n";
+ unlink_encoded ($full_path);
+ }
+}
+foreach my $file_name (@remove_list) {
+ my $full_path = join_path(PATH_SEPARATOR(), WWW_PATH(), $file_name);
+ # print "RM $full_path\n";
+ unlink_encoded ($full_path);
+}