]> bicyclesonthemoon.info Git - ott/bsta/blob - reset.1.pl
a7ee374f33ac81e4d4eabe88778fcde40f384968
[ott/bsta] / reset.1.pl
1 ###RUN_PERL: #!/usr/bin/perl
2
3 # reset is generated from reset.1.pl.
4 #
5 # Reset BSTA state
6 #
7 # Copyright (C) 2016, 2017, 2018, 2023, 2024  Balthasar SzczepaƄski
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU Affero General Public License as
11 # published by the Free Software Foundation, either version 3 of the
12 # License, or (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU Affero General Public License for more details.
18 #
19 # You should have received a copy of the GNU Affero General Public License
20 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22 use strict;
23 use utf8;
24 use Encode::Locale ('decode_argv');
25 use Encode ('encode', 'decode');
26
27 ###PERL_LIB: use lib /botm/lib/bsta
28 use botm_common (
29         'read_data_file', 'write_data_file',
30         'opendir_encoded', 'readdir_decoded', 'unlink_encoded',
31         'join_path'
32 );
33 use bsta_lib (
34         'STATE', 'INTF_STATE', 'CHAT_STATE',
35         'write_index',
36         'merge_settings'
37 );
38
39 binmode STDIN,  ':encoding(UTF-8)';
40 binmode STDOUT, ':encoding(UTF-8)';
41 binmode STDERR, ':encoding(UTF-8)';
42 decode_argv();
43
44 ###PERL_PATH_SEPARATOR:     PATH_SEPARATOR     = /
45
46 ###PERL_DATA_PATH:          DATA_PATH          = /botm/data/bsta/
47 ###PERL_DATA_ATTACH_PATH:   DATA_ATTACH_PATH   = /botm/data/bsta/a
48 ###PERL_DATA_CHAT_PATH:     DATA_CHAT_PATH     = /botm/data/bsta/chat
49 ###PERL_DATA_DEFAULT_PATH:  DATA_DEFAULT_PATH  = /botm/data/bsta/default
50 ###PERL_DATA_LIST_PATH:     DATA_LIST_PATH     = /botm/data/bsta/list
51 ###PERL_DATA_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/state
52 ###PERL_DATA_STATE_PATH:    DATA_STATE_PATH    = /botm/data/bsta/state
53 ###PERL_DATA_STORY_PATH:    DATA_STORY_PATH    = /botm/data/bsta/story
54 ###PERL_DATA_WORDS_PATH:    DATA_WORDS_PATH    = /botm/data/bsta/words/
55
56 ###PERL_WWW_PATH:           WWW_PATH           = /botm/www/
57
58 ###PERL_RESET_PASSWORD:     RESET_PASSWORD     = ''
59
60 my %story;
61 my %state;
62 my %chat;
63 my %settings;
64 my %goto_list;
65 my %default;
66 my $last_frame;
67 my @remove_list;
68
69 delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
70 ###PERL_SET_PATH: $ENV{'PATH'} = /usr/local/bin:/usr/bin:/bin;
71
72 %settings = read_data_file(DATA_SETTINGS_PATH());
73 unless (
74         ($ARGV[0] ne '') && (
75                 ($ARGV[0] eq $settings{'password'}) ||
76                 ($ARGV[0] eq RESET_PASSWORD())
77         )
78 ) {
79         print STDERR "Wrong password; no reset.\n";
80         exit 1;
81 }
82
83 $last_frame = int($settings{'last'});
84 %default = read_data_file(DATA_DEFAULT_PATH());
85
86 for (my $frame=0; $frame<=$last_frame; $frame+=1) {
87         my %frame_data =read_data_file(
88                 join_path(PATH_SEPARATOR(), DATA_PATH(), $frame)
89         );
90         %frame_data = merge_settings(\%default, \%frame_data);
91         unless ($frame == 0) {
92                 push @remove_list, (
93                         ($frame_data{'page'} ne '') ?
94                                 $frame_data{'page'} :
95                                 sprintf(
96                                         $settings{'frame'},
97                                         $frame, 'htm'
98                                 )
99                 );
100         }
101         push @remove_list, (
102                 ($frame_data{'frame'} ne '') ?
103                         $frame_data{'frame'} :
104                         sprintf(
105                                 $settings{'frame'},
106                                 $frame, $frame_data{'ext'}
107                         )
108         );
109 }
110 push @remove_list, 'goto.htm';
111 for (my $i=0; ;$i+=1) {
112         my %file_data;
113         
114         %file_data = read_data_file(DATA_ATTACH_PATH().$i);
115         if ($file_data{'frame'} eq '') {
116                 last;
117         }
118         if ($file_data{'content'} ne '') {
119                 next;
120         }
121         push @remove_list, $file_data{'filename'};
122 }
123
124 %state = (
125         'state' => STATE->{'inactive'},
126         'last'  => 0,
127         'ongtime' => '',
128         'nextong' => '',
129         'ip1' => '',
130         'ip2' => '',
131         'ip3' => ''
132 );
133 %story = (
134         'id'      => 0,
135         'letter'  => '',
136         'lastip'  => '0.0.0.0',
137         'content' => '',
138         'pass'    => 0,
139         'state'   => INTF_STATE->{'X'}
140 );
141 %chat = (
142         'id'      => 0,
143         'state'   => CHAT_STATE->{'disconnected'},
144         'content' => ''
145 );
146 %goto_list = (
147 );
148
149 write_data_file(DATA_STATE_PATH(), \%state);
150 write_data_file(DATA_STORY_PATH(), \%story);
151 write_data_file(DATA_CHAT_PATH() , \%chat);
152 write_data_file(DATA_LIST_PATH() , \%goto_list);
153
154 write_index(
155         \%state,
156         \%settings,
157         $story{'pass'},
158         $story{'state'},
159         0 # pause
160 );
161
162 if (opendir_encoded(my $dir, DATA_WORDS_PATH())) {
163         while (defined (my $file_name = readdir_decoded($dir))) {
164                 if ($file_name !~ /^[0-9]+$/) {
165                         next;
166                 }
167                 my $full_path = join_path(PATH_SEPARATOR(), DATA_WORDS_PATH(), $file_name);
168                 # print "RM $full_path\n";
169                 unlink_encoded ($full_path);
170         }
171 }
172 foreach my $file_name (@remove_list) {
173         my $full_path = join_path(PATH_SEPARATOR(), WWW_PATH(), $file_name);
174         # print "RM $full_path\n";
175         unlink_encoded ($full_path);
176 }