#
# The ONG bot
#
-# Copyright (C) 2016, 2017, 2023 Balthasar Szczepański
+# Copyright (C) 2016, 2017, 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
# along with this program. If not, see <http://www.gnu.org/licenses/>.
use strict;
-#use warnings;
+use utf8;
+# use Encode::Locale ('decode_argv');
+use Encode ('encode', 'decode');
+
###PERL_LIB: use lib /botm/lib/bsta
-use bsta_lib qw(entityencode readdatafile writedatafile urlencode);
-use File::Copy;
+use botm_common (
+ 'open_encoded',
+);
+use bsta_lib (
+ 'STATE',
+ 'ong',
+ 'write_static_viewer_page', 'write_index', 'write_static_goto',
+ 'read_default', 'read_frame_data', 'read_settings', 'read_goto',
+ 'read_state', 'write_state'
+);
-###PERL_DATA_PATH: DATA_PATH = /botm/data/bsta
-###PERL_DATA_DEFAULT_PATH: DATA_DEFAULT_PATH = /botm/data/bsta/default
-###PERL_DATA_SETTINGS_PATH: DATA_SETTINGS_PATH = /botm/data/bsta/settings
###PERL_DATA_STATE_PATH: DATA_STATE_PATH = /botm/data/bsta/state
-###PERL_WWW_PATH: WWW_PATH = /botm/www/1190/bsta/
-###PERL_DATA_LIST_PATH: DATA_LIST_PATH = /botm/data/bsta/list
-my %framedata;
-my %nextframedata;
-my %default;
+binmode STDIN, ':encoding(UTF-8)';
+binmode STDOUT, ':encoding(UTF-8)';
+binmode STDERR, ':encoding(UTF-8)';
+# decode_argv();
+
+my $time = time();
+srand ($time-$$);
+
my %settings;
my %state;
-my %gotolist;
+my %new_state;
+# my %goto_list;
+my %default;
+my %frame_data;
+my %frame_1_data;
+my %frame_2_data;
+my %frame_3_data;
-my $statefile;
+my $fh;
my $ongstate;
my $frame;
-my $nextong;
-my $inpath;
-my $outpath;
+my $next_ong;
my $ongtime;
-my $static;
-my $dynamic;
+my $static_timer;
+my $timer;
my $last;
+my $r = 0;
-my $time = time();
-srand ($time-$$);
-$ongtime = int($time / 3600) * 3600;
+$ongtime = int($time / 3600) * 3600; # check time as if it was last full hour!
print $time.' - '.$ongtime."\n";
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
###PERL_SET_PATH: $ENV{'PATH'} = /usr/local/bin:/usr/bin:/bin;
+unless (open_encoded($fh, "+<:encoding(UTF-8)", DATA_STATE_PATH())) {
+ print "NO STATEFILE\n\n";
+ exit;
+}
+unless (flock($fh, 2)) {
+ print "NO STATELOCK\n\n";
+ close ($fh);
+ exit;
+}
+%state = read_state($fh);
+$ongstate = int($state{'state'});
+print 'state: '.$ongstate."\n";
+unless ($ongstate > STATE->{'inactive'}) {
+ print "INACTIVE\n\n";
+ close ($fh);
+ exit;
+}
+$next_ong = int($state{'nextong'});
+print 'ongtime: '.$next_ong."\n";
+
+unless ($ongtime >= $next_ong) {
+ print "WAIT\n\n";
+ close ($fh);
+ exit;
+}
+
+%settings = read_settings();
+$static_timer = int($settings{'ongtime'});
+$timer = int($settings{'dynamicongtime'});
+$last = int($settings{'last'});
+$frame = int($state {'last'})+1;
-if (open ($statefile,"+<",DATA_STATE_PATH)){
- if (flock($statefile,2)) {
- %state=readdatafile($statefile);
- $ongstate=int($state{'state'});
- print 'state: '.$ongstate."\n";
- if($ongstate > 0) {
- $nextong = int($state{'nextong'});
- print 'ongtime: '.$nextong."\n";
-
- if($ongtime >= $nextong) {
- %settings=readdatafile(DATA_SETTINGS_PATH);
- $static=int($settings{'ongtime'});
- $dynamic=int($settings{'dynamicongtime'});
- $last=int($settings{'last'});
- $frame=int($state{'last'})+1;
-
- if($dynamic > 0 && $frame < $last) {
- $dynamic = int($dynamic/($last-$frame));
- }
- else {
- $dynamic=0;
- }
-
- if($static>$dynamic){
- $dynamic=$static;
- }
- $nextong=$ongtime+($dynamic*3600);
- $state{'nextong'}=$nextong;
- print 'next ongtime: '.$nextong.' (+'.$dynamic.")\n";
- $state{'ongtime'}=$dynamic;
-
- if($ongstate == 2) {
- print 'next frame: '.$frame."\n";
- %framedata=readdatafile(DATA_PATH.$frame);
- %default=readdatafile(DATA_DEFAULT_PATH);
- %gotolist=readdatafile(DATA_LIST_PATH);
-
- $framedata{'ongtime'}=$time;
- $framedata{'timer'}=$dynamic;
- $gotolist{'title-'.$frame}=$framedata{'title'};
- $gotolist{'ongtime-'.$frame}=$framedata{'ongtime'};
- writedatafile(DATA_PATH.$frame,%framedata);
- writedatafile(DATA_LIST_PATH,%gotolist);
-
- foreach my $ind (keys %default) {
- unless(defined($framedata{$ind})){
- $framedata{$ind}=$default{$ind};
- }
- unless(defined($nextframedata{$ind})){
- $nextframedata{$ind}=$default{$ind};
- }
- }
-
- $inpath = DATA_PATH.sprintf($settings{'frame'},$frame,$framedata{'ext'});
- $outpath = WWW_PATH.sprintf($settings{'frame'},$frame,$framedata{'ext'});
-
- print $inpath.' -> '.$outpath."\n";
-
- # ALSO-ATTACHMENTS!!! (here)
-
- if(copy ($inpath, $outpath)) {
- $state{'last'}=$frame;
- $state{'state'}=1;
- $state{'ip1'}='';
- $state{'ip2'}='';
- $state{'ip3'}='';
- $state{'ongtime'}=$dynamic;
- print "ONG\n";
- }
- else {
- print "NO ONG\n";
- }
- }
- writedatafile($statefile,%state);
- }
- else {
- print "WAIT\n";
- }
- }
- else {
- print "INACTIVE\n";
- }
+if (($timer > 0) && ($frame < $last)) {
+ $timer = int($timer / ($last - $frame));
+}
+else {
+ $timer=0;
+}
+
+if ($static_timer > $timer) {
+ $timer = $static_timer;
+}
+$next_ong = $ongtime + ($timer*3600);
+$state{'nextong'} = $next_ong;
+print 'next ongtime: '.$next_ong.' (+'.$timer.")\n";
+$state{'ongtime'}=$timer;
+
+if ($ongstate == STATE->{'ready'}) {
+ print 'next frame: '.$frame."\n";
+
+ %default = read_default();
+ %frame_data = read_frame_data($frame);
+ # %goto_list = read_goto());
+
+ %new_state = %state;
+ $new_state{'last'} = $frame;
+ $new_state{'state'} = 1;
+ $new_state{'ip1'} = '';
+ $new_state{'ip2'} = '';
+ $new_state{'ip3'} = '';
+ $new_state{'ongtime'}= $timer;
+
+ if ($frame >= 1) {
+ %frame_1_data = read_frame_data($frame-1);
+ }
+ if ($frame >= 2) {
+ %frame_2_data = read_frame_data($frame-2);
+ }
+ if ($frame >= 3) {
+ %frame_3_data = read_frame_data($frame-3);
+ }
+
+ $r = ong (
+ $frame, # frame ID
+ $time, # ONG time
+ $timer, # timer to next ONG
+ 0, # update
+ 1, # print
+ \%settings,
+ \%default,
+ \%frame_data,
+ '' # \%goto_list
+ );
+ if ($r && ($frame >= 2)) {
+ print 'static page '.($frame-1);
+ $r = write_static_viewer_page(
+ $frame-1, # frame ID
+ \%new_state,
+ \%settings,
+ \%default,
+ \%frame_1_data, # frame data
+ \%frame_2_data, # prev frame data
+ \%frame_data, # next frame data
+ '' # words data
+ );
+ print (($r) ? " OK\n" : " FAIL\n");
+ }
+ if ($r && ($frame >= 3)) {
+ print 'static page '.($frame-2);
+ $r = write_static_viewer_page(
+ $frame-2, # frame ID
+ \%new_state,
+ \%settings,
+ \%default,
+ \%frame_2_data, # frame data
+ \%frame_3_data, # prev frame data
+ \%frame_1_data, # next frame data
+ '' # words data
+ );
+ print (($r) ? " OK\n" : " FAIL\n");
+ }
+ if ($r && ($frame <= 2)) {
+ print 'index';
+ $r = write_index(
+ \%new_state,
+ \%settings
+ );
+ print (($r) ? " OK\n" : " FAIL\n");
+ }
+ if ($r) {
+ print 'static GOTO';
+ $r = write_static_goto(
+ \%new_state,
+ \%settings,
+ '' # \%goto_list
+ );
+ print (($r) ? " OK\n" : " FAIL\n");
+ }
+ if ($r) {
+ %state = %new_state;
+ print "ONG\n\n";
}
else {
- print "NO STATELOCK\n";
+ print "NO ONG\n\n";
}
- close ($statefile);
-}
-else {
- print "NO STATEFILE\n";
}
-print "\n";
\ No newline at end of file
+write_state($fh, \%state);
+close ($fh);