BBS-Universal

 view release on metacpan or  search on metacpan

bin/bbs  view on Meta::CPAN

        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);



( run in 1.183 second using v1.01-cache-2.11-cpan-2398b32b56e )