]> bicyclesonthemoon.info Git - ott/bsta/blob - ong.1.pl
Generate static viewer pages
[ott/bsta] / ong.1.pl
1 ###RUN_PERL: #!/usr/bin/perl
2
3 # ong.pl is generated from ong.1.pl.
4 #
5 # The ONG bot
6 #
7 # Copyright (C) 2016, 2017, 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         'open_encoded',
31         'join_path'
32 );
33 use bsta_lib (
34         'STATE',
35         'ong',
36         'write_static_viewer_page', 'write_index'
37 );
38
39 ###PERL_PATH_SEPARATOR:     PATH_SEPARATOR     = /
40
41 ###PERL_DATA_PATH:          DATA_PATH          = /botm/data/bsta/
42 ###PERL_DATA_DEFAULT_PATH:  DATA_DEFAULT_PATH  = /botm/data/bsta/default
43 ###PERL_DATA_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/settings
44 ###PERL_DATA_STATE_PATH:    DATA_STATE_PATH    = /botm/data/bsta/state
45
46 binmode STDIN,  ':encoding(UTF-8)';
47 binmode STDOUT, ':encoding(UTF-8)';
48 binmode STDERR, ':encoding(UTF-8)';
49 # decode_argv();
50
51 my $time = time();
52 srand ($time-$$);
53
54 my %settings;
55 my %state;
56 my %goto_list;
57 my %default;
58 my %frame_data;
59
60 my $fh;
61 my $ongstate;
62 my $frame;
63 my $next_ong;
64 my $ongtime;
65 my $static_timer;
66 my $timer;
67 my $last;
68 my $r = 0;
69
70 $ongtime = int($time / 3600) * 3600; # check time as if it was last full hour!
71
72 print $time.' - '.$ongtime."\n";
73
74 delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
75 ###PERL_SET_PATH: $ENV{'PATH'} = /usr/local/bin:/usr/bin:/bin;
76
77 unless (open_encoded($fh, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
78         print "NO STATEFILE\n";
79 }
80 else {
81         unless (flock($fh, 2)) {
82                 print "NO STATELOCK\n";
83         }
84         else {
85                 %state = read_data_file($fh);
86                 $ongstate = int($state{'state'});
87                 print 'state: '.$ongstate."\n";
88                 unless ($ongstate > STATE->{'inactive'}) {
89                         print "INACTIVE\n";
90                 }
91                 else {
92                         $next_ong = int($state{'nextong'});
93                         print 'ongtime: '.$next_ong."\n";
94                         
95                         unless ($ongtime >= $next_ong) {
96                                 print "WAIT\n";
97                         }
98                         else {
99                                 %settings = read_data_file(DATA_SETTINGS_PATH());
100                                 $static_timer = int($settings{'ongtime'});
101                                 $timer        = int($settings{'dynamicongtime'});
102                                 $last         = int($settings{'last'});
103                                 $frame        = int($state   {'last'})+1;
104                                 
105                                 if (($timer > 0) && ($frame < $last)) {
106                                         $timer = int($timer / ($last - $frame));
107                                 }
108                                 else {
109                                         $timer=0;
110                                 }
111                                 
112                                 if ($static_timer > $timer) {
113                                         $timer = $static_timer;
114                                 }
115                                 $next_ong = $ongtime + ($timer*3600);
116                                 $state{'nextong'} = $next_ong;
117                                 print 'next ongtime: '.$next_ong.' (+'.$timer.")\n";
118                                 $state{'ongtime'}=$timer;
119                                 
120                                 if ($ongstate == STATE->{'ready'}) {
121                                         print 'next frame: '.$frame."\n";
122                                         
123                                         %default = read_data_file(DATA_DEFAULT_PATH());
124                                         %frame_data = read_data_file(
125                                                 join_path(PATH_SEPARATOR(), DATA_PATH(), $frame)
126                                         );
127                                         
128                                         $r = ong (
129                                                 $frame, # frame ID
130                                                 $time,  # ONG time
131                                                 $timer, # timer to next ONG
132                                                 0,      # update
133                                                 1,      # print
134                                                 \%settings,
135                                                 \%default,
136                                                 \%frame_data,
137                                                 ''      # %goto_list
138                                         );
139                                         if ($r) {
140                                                 $state{'last'}   = $frame;
141                                                 $state{'state'}  = 1;
142                                                 $state{'ip1'}    = '';
143                                                 $state{'ip2'}    = '';
144                                                 $state{'ip3'}    = '';
145                                                 $state{'ongtime'}= $timer;
146                                                 print "ONG\n";
147                                                 
148                                                 my %frame_1_data;
149                                                 my %frame_2_data;
150                                                 my %frame_3_data;
151                                                 if ($frame >= 1) {
152                                                         %frame_1_data = read_data_file(
153                                                                 join_path(PATH_SEPARATOR(), DATA_PATH(), $frame-1)
154                                                         );
155                                                 }
156                                                 if ($frame >= 2) {
157                                                         %frame_2_data = read_data_file(
158                                                                 join_path(PATH_SEPARATOR(), DATA_PATH(), $frame-2)
159                                                         );
160                                                 }
161                                                 if ($frame >= 3) {
162                                                         %frame_3_data = read_data_file(
163                                                                 join_path(PATH_SEPARATOR(), DATA_PATH(), $frame-3)
164                                                         );
165                                                 }
166                                                 if ($frame >= 2)
167                                                 {
168                                                         print 'static page '.($frame-1);
169                                                         $r = write_static_viewer_page(
170                                                                 $frame-1, # frame ID
171                                                                 \%state,
172                                                                 \%settings,
173                                                                 \%default,
174                                                                 \%frame_1_data, # frame data
175                                                                 \%frame_2_data, # prev frame data
176                                                                 \%frame_data,   # next frame data
177                                                                 '' # words data
178                                                         );
179                                                         print (($r) ? " OK\n" : " FAIL\n");
180                                                 }
181                                                 if ($frame >= 3)
182                                                 {
183                                                         print 'static page '.($frame-2);
184                                                         $r = write_static_viewer_page(
185                                                                 $frame-1, # frame ID
186                                                                 \%state,
187                                                                 \%settings,
188                                                                 \%default,
189                                                                 \%frame_2_data, # frame data
190                                                                 \%frame_3_data, # prev frame data
191                                                                 \%frame_1_data, # next frame data
192                                                                 '' # words data
193                                                         );
194                                                         print (($r) ? " OK\n" : " FAIL\n");
195                                                 }
196                                                 if ($frame <= 2) {
197                                                         print 'index';
198                                                         $r = write_index(
199                                                                 \%state,
200                                                                 \%settings
201                                                         );
202                                                         print (($r) ? " OK\n" : " FAIL\n");
203                                                 }
204                                         }
205                                         else {
206                                                 print "NO ONG\n";
207                                         }
208                                 }
209                                 write_data_file($fh, \%state);
210                         }
211                 }
212         }
213         close ($fh);
214 }
215
216 print "\n";