dotfiles/scripts/fm6000
2021-08-18 17:05:04 -05:00

346 lines
13 KiB
Perl
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env perl
# Dilbert themed system info fetch tool
# https://github.com/anhsirk0/fetch-master-6000
use strict;
use Term::ANSIColor;
use Getopt::Long;
my $length = 13;
my $gap = 3;
my $margin = 2;
my $color = 'yellow';
my $wally;
my $dogbert;
my $alice;
my $phb;
my $asok;
my $help;
my $not_de;
my $random;
my @colors = (
'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white',
'bright_red', 'bright_green', 'bright_yellow',
'bright_blue', 'bright_magenta', 'bright_cyan', 'bright_white'
);
sub get_os {
my $os = `lsb_release -sd`;
# for BSD
unless ($os) { $os = `uname -s`; }
for($os){
s/"//;
s/ .*//;
s/"//;
chomp;
}
return $os;
}
sub get_de {
my $de = $ENV{XDG_CURRENT_DESKTOP};
unless ($de) { $de = $ENV{XDG_SESSION_DESKTOP} };
unless ($de) { $de = $ENV{DESKTOP_SESSION} };
# return $de;
return "awesome";
}
sub shell {
# return (split '/', $ENV{SHELL})[-1];
return "fish";
}
sub kernel {
my $ke = `uname -r`;
$ke =~ s/-.*//;
chomp $ke;
return $ke
}
sub packages {
# for arch based
my $pacs = `pacman -Q`;
# for debian based
unless ($pacs) { $pacs = `dpkg-query -f '\n' -W`; }
# for fedora
unless ($pacs) { $pacs = `yum list installed`; }
# for BSD
unless ($pacs) { $pacs = `pkg info`; }
my $count = $pacs =~ tr/\n//;
return $count;
}
sub uptime {
my $time = `uptime`;
for($time) {
s/.*up\s+//;
s/,\s+[0-9]+ user.*//;
s/ //g;
s/,/:/g;
s/[a-z]+//g;
chomp
}
my @time = reverse(split ":", $time);
if (scalar @time == 2) {
$time[0] =~ s/^0//; # remove starting '0' (01 -> 1)
$time = $time[1]. "h, " . $time[0] . "m";
} elsif (scalar @time == 3) {
$time[0] =~ s/^0//; # remove starting '0' (01 -> 1)
$time = $time[2]. "d, " . $time[1]. "h, " . $time[0] . "m";
} else {
$time .= "m";
}
return $time;
}
# today's internet usage via vnstat
sub usage {
my $data = `vnstat`;
my $today;
foreach my $line (split '\n', $data) {
if ($line =~ /today/) {
$today = (split '\|', $line)[2];
$today =~ s/^ *//;
}
}
return $today;
}
sub format_info {
my %info = %{(shift)};
# format => "MARGIN PLACEHOLDER GAP NAME"
my $text = ' ' x $margin . colored($info{'placeholder'}, $info{'color'});
$text .= ' ' x (7 + $gap - length $info{'placeholder'});
$text .= $info{'name'} . ' ' x ($length - length $info{'name'});
return $text;
}
sub get_info {
my $os = get_os();
my $ke = kernel();
my $de = get_de();
my $sh = shell();
my $up = uptime();
my $pac = packages();
my $de_placeholder = 'DE';
my $vnstat = '-1';
my $usg;
GetOptions (
"help" => \$help,
"os=s" => \$os,
"kernel=s" => \$ke,
"de=s" => \$de,
"shell=s" => \$sh,
"uptime=s" => \$up,
"packages=i" => \$pac,
"margin=i" => \$margin,
"length=i" => \$length,
"gap=i" => \$gap,
"color=s" => \$color,
"not_de" => \$not_de,
"vnstat:s" => \$vnstat,
"wally" => \$wally,
"dogbert" => \$dogbert,
"alice" => \$alice,
"phb" => \$phb,
"asok" => \$asok,
"random" => \$random,
);
if ($help) {
print_help();
exit;
}
if ($not_de) {
$de_placeholder = 'WM';
}
if ($vnstat eq '') {
$vnstat = usage();
}
if ($color eq "random") {
$color = @colors[int(rand scalar @colors)];
}
my %usg = (
'placeholder' => 'VNSTAT',
'color' => 'magenta',
'name' => $vnstat
);
my %os = (
'placeholder' => 'OS',
'color' => 'bright_green',
'name' => $os,
);
my %ke = (
'placeholder' => 'KERNEL',
'color' => 'blue',
'name' => $ke,
);
my %de = (
'placeholder' => $de_placeholder,
'color' => 'bright_red',
'name' => $de,
);
my %sh = (
'placeholder' => 'SHELL',
'color' => 'yellow',
'name' => $sh,
);
my %up = (
'placeholder' => 'UPTIME',
'color' => 'bright_magenta',
'name' => $up,
);
my %pac = (
'placeholder' => 'PACKAGE',
'color' => 'cyan',
'name' => $pac,
);
$os = format_info(\%os);
$ke = format_info(\%ke);
$de = format_info(\%de);
$sh = format_info(\%sh);
$up = format_info(\%up);
$pac = format_info(\%pac);
$usg = format_info(\%usg);
my $i = 0;
my @info;
$info[$i++] = ' ' x ($length + $gap + 7 + $margin);
$info[$i++] = $os;
if ($vnstat eq '-1' ) { $info[$i++] = $ke; }
$info[$i++] = $de;
$info[$i++] = $sh;
$info[$i++] = $up;
$info[$i++] = $pac;
unless ($vnstat eq '-1' ) { $info[$i++] = $usg; }
$info[$i++] = ' ' x ($length + $gap + 7 + $margin);
return @info;
}
sub main {
my @info = get_info();
if ($random) {
my @arr = map { 0 } (1..6);
$arr[int rand(6)] = 1;
($wally, $dogbert, $alice, $phb, $asok) = splice @arr, 0, 4;
}
my $text = "\n";
if ($wally) {
$text .= colored(q{} . '─' x ($length + $margin + $gap + 7) . '╮', $color) . "\n";
$text .= colored(q{ .-'''-. │}, $color) . $info[0] . colored('│', $color) . "\n";
$text .= colored(q{ | | │}, $color) . $info[1] . colored('│', $color) . "\n";
$text .= colored(q{ ⪜|---_---|⪛ ╭│}, $color) . $info[2] . colored('│', $color) . "\n";
$text .= colored(q{ Ͼ|__(_)__|Ͽ ││}, $color) . $info[3] . colored('│', $color) . "\n";
$text .= colored(q{ | _ | ││}, $color) . $info[4] . colored('│', $color) . "\n";
$text .= colored(q{ | | ╯│}, $color) . $info[5] . colored('│', $color) . "\n";
$text .= colored(q{ ˏ====○====ˎ │}, $color) . $info[6] . colored('│', $color) . "\n";
$text .= colored(q{ / \}, $color) . $info[7] . colored('│', $color) . "\n";
$text .= colored(q{} . '─' x ($length + $margin + $gap + 7) . '╯', $color) . "\n";
} elsif ($dogbert) {
$text .= colored(q{} . '─' x ($length + $margin + $gap + 7) . '╮', $color) . "\n";
$text .= colored(q{}, $color) . $info[0] . colored('│', $color) . "\n";
$text .= colored(q{ .-----. │}, $color) . $info[1] . colored('│', $color) . "\n";
$text .= colored(q{ .` `. ╭│}, $color) . $info[2] . colored('│', $color) . "\n";
$text .= colored(q{ / /-() ()-\ \ ││}, $color) . $info[3] . colored('│', $color) . "\n";
$text .= colored(q{ \_| ○ |_/ ││}, $color) . $info[4] . colored('│', $color) . "\n";
$text .= colored(q{ '. .' ╯│}, $color) . $info[5] . colored('│', $color) . "\n";
$text .= colored(q{ `-._.-' │}, $color) . $info[6] . colored('│', $color) . "\n";
$text .= colored(q{}, $color) . $info[7] . colored('│', $color) . "\n";
$text .= colored(q{} . '─' x ($length + $margin + $gap + 7) . '╯', $color) . "\n";
} elsif ($alice) {
$text .= colored(q{ ..-.. ╭} . '─' x ($length + $margin + $gap + 7) . '╮', $color) . "\n";
$text .= colored(q{ (~ ~) │}, $color) . $info[0] . colored('│', $color) . "\n";
$text .= colored(q{ ( ) │}, $color) . $info[1] . colored('│', $color) . "\n";
$text .= colored(q{ ( ~~~~~~~ ) ╭│}, $color) . $info[2] . colored('│', $color) . "\n";
$text .= colored(q{ ( | . . | ) ││}, $color) . $info[3] . colored('│', $color) . "\n";
$text .= colored(q{ ( | (_) | ) ││}, $color) . $info[4] . colored('│', $color) . "\n";
$text .= colored(q{ ( | | ) ╯│}, $color) . $info[5] . colored('│', $color) . "\n";
$text .= colored(q{ (.,.,.| === |.,.,.) │}, $color) . $info[6] . colored('│', $color) . "\n";
$text .= colored(q{ '.___.' │}, $color) . $info[7] . colored('│', $color) . "\n";
$text .= colored(q{ / \} . '─' x ($length + $margin + $gap + 7) . '╯', $color) . "\n";
} elsif ($phb) {
$text .= colored(q{ @ @ ╭} . '─' x ($length + $margin + $gap + 7) . '╮', $color) . "\n";
$text .= colored(q{ @@ ..-.. @@ │}, $color) . $info[0] . colored('│', $color) . "\n";
$text .= colored(q{ @@@' _ _ '@@@ │}, $color) . $info[1] . colored('│', $color) . "\n";
$text .= colored(q{ @( . . )@ ╭│}, $color) . $info[2] . colored('│', $color) . "\n";
$text .= colored(q{ | (_) | ││}, $color) . $info[3] . colored('│', $color) . "\n";
$text .= colored(q{ | _ | ││}, $color) . $info[4] . colored('│', $color) . "\n";
$text .= colored(q{ |_ _| ╯│}, $color) . $info[5] . colored('│', $color) . "\n";
$text .= colored(q{ /|_'---'_|\}, $color) . $info[6] . colored('│', $color) . "\n";
$text .= colored(q{ / | '\_/' | \}, $color) . $info[7] . colored('│', $color) . "\n";
$text .= colored(q{/ | | | | \} . '─' x ($length + $margin + $gap + 7) . '╯', $color) . "\n";
} elsif ($asok) {
$text .= colored(q{} . '─' x ($length + $margin + $gap + 7) . '╮', $color) . "\n";
$text .= colored(q{ @@@@@@@@@ │}, $color) . $info[0] . colored('│', $color) . "\n";
$text .= colored(q{ | | │}, $color) . $info[1] . colored('│', $color) . "\n";
$text .= colored(q{ | _ _ | ╭│}, $color) . $info[2] . colored('│', $color) . "\n";
$text .= colored(q{ Ͼ| ○ ○ |Ͽ ││}, $color) . $info[3] . colored('│', $color) . "\n";
$text .= colored(q{ | u | ││}, $color) . $info[4] . colored('│', $color) . "\n";
$text .= colored(q{ | --- | ╯│}, $color) . $info[5] . colored('│', $color) . "\n";
$text .= colored(q{ / `-._.-´ \}, $color) . $info[6] . colored('│', $color) . "\n";
$text .= colored(q{ | │}, $color) . $info[7] . colored('│', $color) . "\n";
$text .= colored(q{} . '─' x ($length + $margin + $gap + 7) . '╯', $color) . "\n";
} else {
$text .= colored(q{} . '─' x ($length + $margin + $gap + 7) . '╮', $color) . "\n";
$text .= colored(q{ დოოოოოდ │}, $color) . $info[0] . colored('│', $color) . "\n";
$text .= colored(q{ | | │}, $color) . $info[1] . colored('│', $color) . "\n";
$text .= colored(q{ | | ╭│}, $color) . $info[2] . colored('│', $color) . "\n";
$text .= colored(q{ |-ᱛ ᱛ-| ││}, $color) . $info[3] . colored('│', $color) . "\n";
$text .= colored(q{ Ͼ Ͽ ││}, $color) . $info[4] . colored('│', $color) . "\n";
$text .= colored(q{ | | ╯│}, $color) . $info[5] . colored('│', $color) . "\n";
$text .= colored(q{ ˏ`-.ŏ.-´ˎ │}, $color) . $info[6] . colored('│', $color) . "\n";
$text .= colored(q{ @ │}, $color) . $info[7] . colored('│', $color) . "\n";
$text .= colored(q{ @ ╰} . '─' x ($length + $margin + $gap + 7) . '╯', $color) . "\n";
}
$text .= "\n";
print $text;
}
sub print_help {
print "usage: fm6000 [options]\n\n";
print "-c, --color=STR Base color\n";
print "-w, --wally Display Wally \n";
print "-dog, --dogbert Display Dogbert \n";
print "-al, --alice Display Alice \n";
print "-phb, --phb Display Pointy haired Boss \n";
print "-as, --asok Display Asok \n";
print "-r, --random Display Random Art \n";
print "-n, --not_de To use 'WM' instead of 'DE'\n";
print "-o, --os=STR OS name\n";
print "-k or --kernel=STR Kernel version\n";
print "-de or --de=STR Desktop environment name\n";
print "-s or --shell=STR Shell name\n";
print "-u or --uptime=STR Uptime\n";
print "-pa or --package=INT Number of packages\n";
print "-v or --vnstat=STR Use vnstat instead of kernel\n";
print "-m or --margin=INT Spaces on the left side of info\n";
print "-g or --gap=INT Spaces between info and info_value\n";
print "-l or --length=INT Length of the board ( > 14)\n\n";
print "available colors: \n";
print join(", ", splice(@colors, 0, 7)) . ", random\n";
print join(", ", @colors) . "\n";
}
main();