BBS-Universal

 view release on metacpan or  search on metacpan

bin/bbs  view on Meta::CPAN

    'SYSOP FILE MANAGER' => sub {
        my $self = shift;
        return ($self->sysop_parse_menu(($CACHE->get('START_ROW') + $CACHE->get('ROW_ADJUST')), 'files/sysop/filemanager.ANSI'));
    },
    'SYSOP SETTINGS' => sub {
        my $self = shift;
        return ($self->sysop_parse_menu(($CACHE->get('START_ROW') + $CACHE->get('ROW_ADJUST')), 'files/sysop/settings.ANSI'));
    },
    'SYSOP SHUTDOWN' => sub {
        my $self = shift;
        print "\nShutdown BBS (y/N)?  ";
        if ($self->sysop_decision) {
            print "\n", colored(['bright_yellow','on_red'],' Shutting down threads '), "\n";
            $CACHE->set('RUNNING', FALSE);
        } else {
            return('BACK');
        }
    },
    'SYSOP SHOW ENVIRONMENT' => sub {
        my $self = shift;
        return ($self->sysop_parse_menu(($CACHE->get('START_ROW') + $CACHE->get('ROW_ADJUST')), 'files/sysop/environment.ANSI'));
    },
    'SYSOP STATISTICS' => sub {
        my $self = shift;
        return ($self->sysop_parse_menu(($CACHE->get('START_ROW') + $CACHE->get('ROW_ADJUST')), 'files/sysop/statistics.ANSI'));
    },
    'SYSOP USER MANAGER' => sub {
        my $self = shift;
        return ($self->sysop_parse_menu(($CACHE->get('START_ROW') + $CACHE->get('ROW_ADJUST')), 'files/sysop/usermanager.ANSI'));
    },
};

$DEBUG->DEBUG(['SysOp Commands Initialized','Starting BBS']);
system_menu($BBS_OBJ);
chdir($OLDDIR);
if ($RESTART) {
    print "\n\nRESTARTING...\n";
    exec($ENV{'_'}, @CALL);
}

exit(0);

##############################################################################

sub ruler {
    my $width   = shift;

    my $text = "\r" . '⏺' x $width;
    for (my $count=0;$count<$width;$count++) {
        my $v = $count / 10;
        if (int($count / 10) == $v) {
            substr($text,$count,1) = substr("$count",0,1);
        }
    }
    return($text);
}

sub system_menu {
    my $bbs_obj = shift;

    $DEBUG->DEBUG(['Start System Menu']);
    my $key = '';
    my ($wsize, $hsize, $wpixels, $hpixels) = logo($bbs_obj);
    my ($width, $height) = ($wsize, $hsize);
    print locate($CACHE->get('START_ROW'), 1), cldown;

    my $socket;
    $bbs_obj->playit('startup.mp3');
    unless ($TEST) {
        $DEBUG->DEBUG(['Loading Threads']);
        print 'Loading ' . $MAX_THREADS . ' Threads ...';
        $socket = IO::Socket->new(
            'Domain'    => AF_INET,
            'LocalHost' => $bbs_obj->{'CONF'}->{'HOST'},
            'LocalPort' => $bbs_obj->{'CONF'}->{'PORT'},
            'Type'      => SOCK_STREAM,
            'Proto'     => 'tcp',
            'Listen'    => 1,
            'ReuseAddr' => TRUE,
            'ReusePort' => TRUE,
            'Timeout'   => 1,
            'Blocking'  => FALSE,
        );
        my $error = undef;
        $error = "Cannot create socket for $!n" unless ($socket);
        if (defined($error)) {
            $DEBUG->ERROR([$error, 'Local Mode Only']);
            sleep 5;
        } else {
            foreach my $thread (1 .. $MAX_THREADS) {
                my $name = sprintf('TH_%02d', $thread);
                $SERVER_THREADS->{$name} = threads->create(
                    \&run_bbs,
                    $bbs_obj,
                    {
                        'thread_number' => $thread,
                        'thread_name'   => $name,
                        'socket'        => $socket,
                        'debuglevel'    => $LEVEL
                    }
                );
                $CACHE->set('UPDATE', TRUE);
                servers_status($bbs_obj, FALSE);
            }
            $SIG{'ALRM'} = sub { servers_status($bbs_obj, TRUE); };
            $CACHE->set('UPDATE', TRUE);
            servers_status($bbs_obj, TRUE);    # This is a sub not a method, so we pass the object conventionally
            $DEBUG->DEBUG(['Threads Loaded']);
        }
    } else {
        $DEBUG->DEBUG(['Test mode active, no server threads']);
    }
    # Set up window
    print setscroll(($CACHE->get('START_ROW') + $CACHE->get('ROW_ADJUST')), $hsize);
    print locate(($CACHE->get('START_ROW') + $CACHE->get('ROW_ADJUST')), 1), cldown;
    $bbs_obj->{'sysop'} = TRUE;
    $bbs_obj->users_load('sysop', '');
	$CACHE->set('RUNNING', TRUE);
    while ($CACHE->get('RUNNING')) {
        ($wsize, $hsize, $wpixels, $hpixels) = GetTerminalSize();
        if ($wsize != $width || $hsize != $height) {
            alarm(0);
            ($wsize, $hsize, $wpixels, $hpixels) = logo();
            ($width, $height) = ($wsize, $hsize);
            servers_status($bbs_obj, TRUE) unless ($TEST);
        }
        my $command = $bbs_obj->sysop_parse_menu(($CACHE->get('START_ROW') + $CACHE->get('ROW_ADJUST')), 'files/sysop/sysop.ANSI');
        while ($command !~ /BACK/ && $CACHE->get('RUNNING')) {
            if (exists($SYSOP_COMMANDS->{$command}) && ref($SYSOP_COMMANDS->{$command}) eq 'CODE') {
                $bbs_obj->playit('boing.mp3');
                $command = $SYSOP_COMMANDS->{$command}->($bbs_obj);
            } else {
                $DEBUG->ERROR(["$command is not a valid SysOp Command!"]);
                $command = 'BACK';
            }
            threads->yield();
        }
    }
    $socket->close() if (defined($socket));
    $CACHE->set('RUNNING', FALSE);
    finish($bbs_obj);
    shutdown_message();
    $DEBUG->DEBUG(['End System Menu']);
}

sub servers_status {
    my $bbs_obj    = shift;
    my $show_alarm = shift;

    if ($CACHE->get('SHOW_STATUS') && ! $bbs_obj->{'LOCAL LOGIN'}) {
        if ($CACHE->get('UPDATE') && !$TEST) {
            alarm(0);
            my ($wsize, $hsize, $wpixels, $hpixels) = GetTerminalSize();
            my $stp   = int($wsize / 22);
            my $steps = $stp;
            my @row   = ();
            my @sizes;
            foreach my $count (1 .. $stp) {
                push(@sizes, 18);
            }

            my $table = Text::SimpleTable->new(@sizes);
            my $count = 1;
            $CACHE->set_multi(
                ['ROW_ADJUST',      2],
                ['ONLINE',          0],
                ['THREADS_RUNNING', 0],
            );
            foreach my $name (sort(keys %{$SERVER_THREADS})) {
                if ($CACHE->get($name) eq 'CONNECTED') {
                    $CACHE->set_multi(
                        ['ONLINE',          $CACHE->get('ONLINE') + 1],
                        ['THREADS_RUNNING', $CACHE->get('THREADS_RUNNING') + 1],
                        [$name,             'CONNECTED'],
                    );
                } elsif ($CACHE->get($name) eq 'IDLE') {
                    $CACHE->set_multi(
                        ['THREADS_RUNNING', $CACHE->get('THREADS_RUNNING') + 1],
                        [$name,             'IDLE'],
                    );
                } else {
                    $CACHE->set_multi(
                        ['THREADS_RUNNING', $CACHE->get('THREADS_RUNNING') - 1],
                        [$name,             'FINISHED'],
                    );
                }
                push(@row, "$name -> " . $CACHE->get($name));
                $steps--;
                if ($steps == 0) {
                    $steps = $stp;
                    $table->row(@row);
                    @row = ();
                    $CACHE->set('ROW_ADJUST', $CACHE->get('ROW_ADJUST') + 1);
                }
                $count++;
                threads->yield();
            }
            if (scalar(@row)) {
                while ($steps >= 0) {
                    push(@row, ' ');
                    $steps--;
                    threads->yield();
                }



( run in 0.939 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )