BBS-Universal
view release on metacpan or search on metacpan
'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 )