' sysinfo for Telehack (Cult Edition)
   ' by pbernicc & underwood

   ' essential variables
   e$         = chr$(27)
   file$      = argv$(0)
   ver$       = "6.6.6"
   curhost$   =  th_re$( th_hostname$, "[^\s]+")

   ' ANSI colours
   reset$     = e$ + "[m"
   bold$      = e$ + "[1m"
   red$       = e$ + "[91m"
   green$     = e$ + "[92m"
   yellow$    = e$ + "[93m"
   blue$      = e$ + "[94m"
   magenta$   = e$ + "[95m"
   cyan$      = e$ + "[96m"

   ' colour choices (make this an option?)
   primary$   = cyan$
   secondary$ = green$

   ' underline and at-symbol styles
   ul$ = secondary$ + string$(len(user$ + "@" + curhost$),"-") + reset$
   at$ = primary$ + "@"

   ' string manipulation functions
   def fnchomp$(s$)   = th_sed$(s$, "(^\s+)|(\s+$)", "", "g")
   def fncols$(a$,b$) = th_sprintf$(primary$ + bold$ + "%S " + reset$ + secondary$ + "%S" + reset$, a$, b$)

   ' colour chart 1
   for i = 1 to 8 : c1$ = c1$ + e$ + "[" + str$(39+i) + "m   " : next
   c1$ = c1$ + reset$

   ' colour chart 2
   for i = 1 to 8 : c2$ = c2$ + e$ + "[" + str$(99+i) + "m   " : next
   c2$ = c2$ + reset$

   ' help
   if arg$ = "?" then ? file$ " v" ver$ : ?  "usage: " : ? file$ " [1|2|3|4|5|6|7|8]" : end

   ' initial checks
   if val( arg$ ) > 8 then ? "%invalid option" : end
   if user$ = "guest" then ? "%login please" : end
   if curhost$ <> "telehack" then ? "%unsupported os" : end

   ' gather data
   th_exec "\show vmsize"                              ; vmsize$ : vmsize$ = fnchomp$(vmsize$)
   th_exec "\w /tver|cut -f 1,8|grep \*"               ; tver$   : tver$   = th_sed$(tver$,"(^\*\s)|(\s+$)","","g")
   th_exec "\show uptime|head -n1"                     ; up$     : up$     = fnchomp$(up$)
   th_exec "\stty|grep term"                           ; term$   : term$   = fnchomp$(term$)
   th_exec "\ll *exe|cut -f3|grep " + user$ + "|wc -l" ; pack$   : pack$   = th_re$(pack$,"[^\s]+")
   th_exec "\ps|grep memory used"                      ; memr$   : mem$    = th_re$(memr$,"background processes,\s(.*)","\1")
   th_exec "\w /protocol /sock|grep \*|cut -f 1,8,9"   ; socks$  : socks$  = fnchomp$(socks$)
   th_exec "\df|cut -f1,2,5|grep -i user"              ; diskl$

   ' adjust / format data
   up$   = th_sed$(up$, "\s+[^\s]+$")
   mem$  = th_sed$(mem$,"memory\s","","g")
   pack$ = pack$ + " EXEs, " + th_re$(memr$,"([^\s]+)\sback","\1") + " TSRs running"
   disk$ = th_re$(diskl$,"User\s+([^\s]+)","\1") + " (" + th_re$(diskl$,"User\s+([^\s]+)\s+([^\s]+)","\2") + " used)"
   tver$ = th_sprintf$("0x%H",tver$) + " (" + tver$ + ")"
   term$ = th_sed$(term$, "^term:\s")
   prot$ = th_re$(socks$,"\*\s+([^\s]+)\s+","\1")
   sock$ = th_re$(socks$,"\*\s+([^\s]+)\s+(.*)","\2")

   f$(1)  = secondary$ + user$ + at$ + secondary$ + curhost$ + reset$
   f$(2)  = ul$
   f$(3)  = fncols$("cpu"         , "ColossusFrame Mark VII")
   f$(4)  = fncols$("dimensions"  , str$(height) + "x" + str$(width))
   f$(5)  = fncols$("disk"        , disk$)
   f$(6)  = fncols$("host"        , th_hostname$)
   f$(7)  = fncols$("memory"      , mem$)
   f$(8)  = fncols$("packages"    , pack$)
   f$(9)  = fncols$("port"        , str$(port%) + " via " + ups$(sock$) + ":" + prot$)
   f$(10) = fncols$("syslevel"    , str$(th_syslevel) + " (" + th_syslevel$  +")")
   f$(11) = fncols$("term"        , term$)
   f$(12) = fncols$("tver"        , tver$)
   f$(13) = fncols$("uptime"      , up$)
   f$(14) = fncols$("vmsize"      , vmsize$)
   f$(15) = ""
   f$(16) = c1$
   f$(17) = c2$

   ' theme selection
   if arg$ = "" then gosub 10
   on val(arg$) gosub 10,20,30,40,50,60,70,80

   ' print it all
   ? bold$ file$ " v " ver$ reset$ : ?
   for i = 1 to h : ? primary$ i$(i) f$(i) : next : ?

   end

10  ' PBERNICC'S WONKY TRIANGLE
   h = 17
   i$( peek(-1) ) = "               .@.               "
   i$( peek(-1) ) = "            . @@@@@ .            "
   i$( peek(-1) ) = "          . @,     #@.           "
   i$( peek(-1) ) = "          #  @@@&@@@  ##         "
   i$( peek(-1) ) = "        .@   @@/. @@@&&&@.       "
   i$( peek(-1) ) = "      . @@@   @@ .@@@  @@@.      "
   i$( peek(-1) ) = "     .@@@@@*  @@@@@@  *@@@@,     "
   i$( peek(-1) ) = "    .@@@@@@@@@     @@@@@@@@@.    "
   i$( peek(-1) ) = "    ##%@,@@%@@@&((@@@@@@/%,@%#.  "
   i$( peek(-1) ) = "         C O L O S S U S         "
   i$( peek(-1) ) = "            COMPUTER             "
   i$( peek(-1) ) = "             SYSTEMS             "
   i$( peek(-1) ) = "                                 "
   i$( peek(-1) ) = "                                 "
   i$( peek(-1) ) = "                                 "
   i$( peek(-1) ) = "                                 "
   i$( peek(-1) ) = "                                 "
   return

20  ' INVERTED WONK
   h = 17
   i$( peek(-1) ) = "@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@   "
   i$( peek(-1) ) = "@@@@@@@@@@@@@@  &@@@@@@@@@@@@@   "
   i$( peek(-1) ) = "@@@@@@@@@@@@&     @&@@@@@@@@@@   "
   i$( peek(-1) ) = "@@@@@@@@@&@ %@@@@@% @&@@@@@@@@   "
   i$( peek(-1) ) = "@@@@@@@@@*@@   .   @@*@@@@@@@@   "
   i$( peek(-1) ) = "@@@@@@@& @#  #*((#     @&@@@@@   "
   i$( peek(-1) ) = "@@@@&@   @@   /( .  @@   @@@@@   "
   i$( peek(-1) ) = "@@@@.     @@@     @@#     %@@@   "
   i$( peek(-1) ) = "@&&          @@@@@          @@   "
   i$( peek(-1) ) = "@@*@@%@@@@&&&@@@@&&&@@@@%@@*@@   "
   i$( peek(-1) ) = "@@&&*  C O L O S S U S   &&&@@   "
   i$( peek(-1) ) = "@@@@@@&@   COMPUTER  @&@@@@@@@   "
   i$( peek(-1) ) = "@@@@@@@@   SYSTEMS   @@@@@@@@@   "
   i$( peek(-1) ) = "@@@@@@@&&&&&&&&&&&&&&&&@@@@@@@   "
   i$( peek(-1) ) = "                                 "
   i$( peek(-1) ) = "                                 "
   i$( peek(-1) ) = "                                 "
   return

30  ' BIG TRIANGLE
   h = 19
   i$( peek(-1) ) = "                           .                          "
   i$( peek(-1) ) = "                       .  &@                          "
   i$( peek(-1) ) = "                        ,@@@@@  .                     "
   i$( peek(-1) ) = "                    .  @@@@@@@@/                      "
   i$( peek(-1) ) = "                  .  #@@@@@@@@@@@                     "
   i$( peek(-1) ) = "                   .@&,        .#@&  .                "
   i$( peek(-1) ) = "               .  &     *@@@@%     ,/                 "
   i$( peek(-1) ) = "                #   .@@@@@#*@@@@@/   (  .             "
   i$( peek(-1) ) = "              .@   %@@@@@(/%#@@(@@@   #&  .           "
   i$( peek(-1) ) = "          .  @@(   @@#&@(,/(((#@(@@@@@@@@,            "
   i$( peek(-1) ) = "           (@@@@   @@@@/&,,,*(@&@@@(**/@@@@  .        "
   i$( peek(-1) ) = "          @@@@@@.   @@@#%@@@/&(@@@*   @@@@@@%  .      "
   i$( peek(-1) ) = "     .  &@@@@@@@@%    #@@@@@@@@&.   *@@@@@@@@@,       "
   i$( peek(-1) ) = "     /@@@@@@@@@@@@@,             &@@@@@@@@@@@@@  .    "
   i$( peek(-1) ) = "   . #&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&# .  "
   i$( peek(-1) ) = "   ,@@@@ @@@@@ .@    #@@#  @@//@ @@//@ @   @  @@//@   "
   i$( peek(-1) ) = "   ,#    @   # .@   //  \\ \\    \\   .@   @  \\      "
   i$( peek(-1) ) = "   ,#    @   #  @   ||  ||  \\    \\  .@   @   \\     "
   i$( peek(-1) ) = "   ,@@@@ @@@@#  %%%  #@@# @//@@ @//@@ .@&@%@ @//@@    "
   return

40  ' ILLUMINATOOD
   h = 17
   i$( peek(-1) ) = "              .                "
   i$( peek(-1) ) = "              @@               "
   i$( peek(-1) ) = "            *@*#@              "
   i$( peek(-1) ) = "           +@@%%@@             "
   i$( peek(-1) ) = "          @@:    @@.           "
   i$( peek(-1) ) = "         @   @=@   *=          "
   i$( peek(-1) ) = "        @ -@@+#=%@*  :         "
   i$( peek(-1) ) = "       @  @+: -:.-%@@@:        "
   i$( peek(-1) ) = "      @@  @.+-:.+.+%=#@*       "
   i$( peek(-1) ) = "     @##+  @@#@%%@=  #+@*      "
   i$( peek(-1) ) = "   .@%*#@@         *@%*#@@     "
   i$( peek(-1) ) = "  *@@%##%@@@@%=+@@@@%###%@@    "
   i$( peek(-1) ) = "                               "
   i$( peek(-1) ) = "   ILLUMINATUS WATCHES YOU     "
   i$( peek(-1) ) = "                               "
   i$( peek(-1) ) = "                               "
   i$( peek(-1) ) = "                               "
   return

50  ' ALL HAIL THE SHEEP
   h = 17
   i$( peek(-1) ) = "  ......',;cclo;....;olcc;,'......  "
   i$( peek(-1) ) = "  .        ,d0XKkooxKK0d,        .  "
   i$( peek(-1) ) = "  .       .:OXXX0ddOXXXO;.       .  "
   i$( peek(-1) ) = "  ..     .'xKXXX0xdOXXXKd'.     ..  "
   i$( peek(-1) ) = "       .,:lk00XXOdxOXX00kl:,.       "
   i$( peek(-1) ) = "       ..;dkk0XX0xxOXX0kko;..       "
   i$( peek(-1) ) = "  .    .'..cldOK0kk0KOdl:..'.    '  "
   i$( peek(-1) ) = "  o;.   '..:;,:oddddo:,;:..'   .;o  "
   i$( peek(-1) ) = "  xo:.   ..;;;;;doot;;;;;..   .:ox  "
   i$( peek(-1) ) = "  clc'     ;olcokkkkoclo,     'llc  "
   i$( peek(-1) ) = "  ;oc.     :xdoxOkkOxodx:     .co;  "
   i$( peek(-1) ) = "  .'.      ';;;lkkkkl;;;'      .'.  "
   i$( peek(-1) ) = "   '        ';,,tood,,;'        '   "
   i$( peek(-1) ) = "             .:;....;:.             "
   i$( peek(-1) ) = "              ;c'..'c;              "
   i$( peek(-1) ) = "              ';....;'              "
   i$( peek(-1) ) = "                                    "
   return

60  ' BIG CLYDE
   h = 19
   i$( peek(-1) ) = "        ,ccllllollccddlc,.            .,clddccllollllcc,        "
   i$( peek(-1) ) = "      .:ol:,''''',;lddxdl:'.        .':ldxddc;,''''',:lo;.      "
   i$( peek(-1) ) = "     .;l:,..........,cllllc;.      .;cllllc,..........,:l;.     "
   i$( peek(-1) ) = "    .,c:..     .......',;cclo;....;olcc;,'.......     ..:c,.    "
   i$( peek(-1) ) = "    .;l,.    ....        ,d0XKkooxKK0d,        .'..    .;l;.    "
   i$( peek(-1) ) = "   ..;c'     .. .       .:OXXX0ddOXXXO;.       . .'     'c;..   "
   i$( peek(-1) ) = "   ooooc,.   .. ..     .'xKXXX0xdOXXXKd'.     .. ..   .;coooo   "
   i$( peek(-1) ) = "   cccoodoc;'...     .,:lk00XXOdxOXX00kl:,.     ...';codoolcc   "
   i$( peek(-1) ) = "   .....;:ldol;.     ..;dkk0XX0xxOXX0kko;..     .;lodl:;.....   "
   i$( peek(-1) ) = "       ....;cooc.    .'..cldOK0kk0KOdl:..'.    'colc;....       "
   i$( peek(-1) ) = "       .  ...,oxo;.   '..:;,:oddddo:,;:..'   .;oxo,...  ..      "
   i$( peek(-1) ) = "         .....,oxo:.   ..;;;;;doot;;;;;..   .:oxo'.....         "
   i$( peek(-1) ) = "          .....'clc'     ;olcokkkkoclo,     'llc'.....          "
   i$( peek(-1) ) = "            ....;oc.     :xdoxOkkOxodx:     .co;....            "
   i$( peek(-1) ) = "                .'.      ';;;lkkkkl;;;'      .'.                "
   i$( peek(-1) ) = "                 '        ';,,tood,,;'        '                 "
   i$( peek(-1) ) = "                           .:;....;:.                           "
   i$( peek(-1) ) = "                            ;c'..'c;                            "
   i$( peek(-1) ) = "                            ';....;'                            "
   return

70  ' COLOSSUS MARTINI JUDGEMENT
   h = 28
   i$( peek(-1) )  = "                              @@                               "
   i$( peek(-1) )  = "                             @@@@                              "
   i$( peek(-1) )  = "                            @@**@@                             "
   i$( peek(-1) )  = "                           @@*++*@@                            "
   i$( peek(-1) )  = "                          @@*++++*@@                           "
   i$( peek(-1) )  = "                         @@*++++++*@@                          "
   i$( peek(-1) )  = "                        @@*++++++++*@@                         "
   i$( peek(-1) )  = "     ,----------,      @@*++++++++++*@@        ,----------,    "
   i$( peek(-1) )  = "     | COLOSSUS |     @@*++++++++++++*@@       |  THAT IS |    "
   i$( peek(-1) )  = "     | COMPUTER |    @@@**#@@@@@@@@@#**@@      | TOO MUCH |    "
   i$( peek(-1) )  = "     | SYSTEMS  |   @@@@@@@@*      *@@@@@@-    | VERMOUTH |    "
   i$( peek(-1) )  = "     '----------'  @@@@@               .@@@=   '----------'    "
   i$( peek(-1) )  = "                  @@@         .:.         @@#                  "
   i$( peek(-1) )  = "                 @@#     #@@@@+@@@@@@@      @%                 "
   i$( peek(-1) )  = "                @@     %@*==@ @#%.#*-=@@     @@                "
   i$( peek(-1) )  = "               @@    :@+@%%+..%%%-.-#%@+@@    @@               "
   i$( peek(-1) )  = "              @@:    @@==@%@-@@.-@:@@@#-%@@    @%              "
   i$( peek(-1) )  = "             @@@    @@#:. .--:-::::=    #%@@@@@@@#             "
   i$( peek(-1) )  = "            @@@%    @:#%@@:*-+*+**-:@=@%#* +@@@##@@            "
   i$( peek(-1) )  = "           @@+@%    @=*%@@--.+*+*#-.=+@%#+:+@@@@#+@@           "
   i$( peek(-1) )  = "          @@++@@    @@=.  -+:....:.*=...:%@@####+++@@          "
   i$( peek(-1) )  = "         @@+++@@     @@=-@%@-@%:-@:@#@*-@@@    @++++@@         "
   i$( peek(-1) )  = "        @@+++++@@    -@+@@%# :#%%= +%@@+@@    @@+++++@@        "
   i$( peek(-1) )  = "       @@+++++++@@     %#..+@ @#%.*#-.=@     @@+++++++@@       "
   i$( peek(-1) )  = "      @@+++++++++@@      @@@@@-@%%@@@@.     @@+++++++++@@      "
   i$( peek(-1) )  = "     @@+++++++++++@@@        -%-+=        @@@+++++++++++@@     "
   i$( peek(-1) )  = "    @@#+++++++++++++@@@-                @@@++++++++++++++@@    "
   i$( peek(-1) )  = "   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   "
   return

80  ' ELLO, GUVNA
   h = 32
   i$( peek(-1) )  = " ///(#/((((#((##%%%&&&&&&&&&&&&@@@@@@@&&&&&@&&&&&&&&&%//#(##@(#///////(((( "
   i$( peek(-1) )  = " *//////(/((##%%%%&&&&&&&&&%&&&&&&&&&@@&%&@@@@@&@@@@&@&%(/(((%&#////////// "
   i$( peek(-1) )  = " ,,****/(######%%%%%&&%%&&&&&@@&&&@&&&&@@@@@@@@@@&&&(,,. .,.. .. ,(.//**** "
   i$( peek(-1) )  = " *,,**/(((########%%%&&&&&@@@@&@&&&@@&@@@&%&#.     .,/#%&&###*.    (#%#### "
   i$( peek(-1) )  = " ,*/(((((##((###%%%%&&@@@@@@@@@@@@@@@@@(.,.. (###%&&%%&&&&&&&&%&/  @.(((## "
   i$( peek(-1) )  = " *////(((#######%&@@&@@&&&&&&@%/ (% @    *(/(%@(###(#(((#&#####%%.@ (///// "
   i$( peek(-1) )  = " /////(####(#((/(,.             ....... (/(####%%(##((((#(/(/(((#/ ,(((### "
   i$( peek(-1) )  = " ///////*/*,,.,  *(((*/(@@..,..        .#(/(((((/&&#////*/(((****/..((/### "
   i$( peek(-1) )  = " //*/*    .*#((((((((((((#/,, .    ..,.. #(##((%@@(/,,**((((##(((* %/#//## "
   i$( peek(-1) )  = " .     *((/*/******,*,,*/*,...,.   &&&&@@  &&&&&%%%&%%%%(###%%&&, @&//*//# "
   i$( peek(-1) )  = "     ,/**,,,,,,,(##,,,(,#*,*//,.  ,(#%&&@@(  @&&@@@@@@@&%%%%&#   %@&#(,,/( "
   i$( peek(-1) )  = "     .*,,,,,,,,/(((*,#%%####%##(  *(%%&&@@@@/ .#/&&%#/,.   .#@@&%%%@@&*.,* "
   i$( peek(-1) )  = "  /*  **/*,**/(#(###%%&&&%##%##. **(#%&@@@@@@&%*,,,*/(%##//(#&%%%%#&@@%/,, "
   i$( peek(-1) )  = " #//**  /***(#%%%%%%%&&####&%/  //**((#%&&&&%%%&&#/(#&&@@&&&&&%%###%&@#,,, "
   i$( peek(-1) )  = " #/****/  #(//(((((###@&#%.  .,//(#/****((((#,.*(##/*/#%&@@&@@&&%%##@@&/ , "
   i$( peek(-1) )  = " #/**,,*(#, ,%&&%%(.    ../#(//*///*.  ..,**,,.,*%&@&(/(#&&&&&&&%%%#&&&@.( "
   i$( peek(-1) )  = " #(*,....,(#%((((*,.,*(#%##(/((....    .,(#%%&&@@&@@@@@((%&%%&%%&&@&%%&@(# "
   i$( peek(-1) )  = " //*,...    .....,*(######(/(##(***(###%%%#%&&@@@@@@@&@@&%&&&&&&&&&&##&@(( "
   i$( peek(-1) )  = " **,...     ..,**/(((######(##((###%%%%&@@&%%&%%%&&&&&&&@@&&%&%&&&@%(&&@(( "
   i$( peek(-1) )  = " *,,..   ...,*,**/*//(((#####((######%#(//**//**,,,,/#&&@@&@&@&&&&%%##%#(# "
   i$( peek(-1) )  = " ****,.....,*////***/(((######((((#(*,..,,#%@&@%(&%..,*#%&@@@@@&&&&&%##((# "
   i$( peek(-1) )  = "  ,*,,,...,*/(((((/*/((((######(/*,  **//#&#&(&%&##%,  ./#%&@@@@&&&%%#//(# "
   i$( peek(-1) )  = "     ....,,**/(((((//((#######((*. */(((##%%%%%%%%%%%%%%&&&&%&@@&&%%##*/## "
   i$( peek(-1) )  = "       ..,***,*/(/(/((((#%%%%%##(((((#((#%%&%%%%&%%%&&&&&&&&&&@&&&%%#((((( "
   i$( peek(-1) )  = " ,*/,    .,,*/,*/////(((#%%&%%#(((((((((###%%%&&&@&&&&&&&&&@@@@&&%###/(### "
   i$( peek(-1) )  = " *(((/,.  ..,**,*////(((###%&&#((#(/((###%%%&&@&&&&&&&&@&&&@@@&&%%##,*/*(/ "
   i$( peek(-1) )  = " ***((**,  +---------------------------------------------------+  (*,,.*** "
   i$( peek(-1) )  = "    ...   /|  You need at least sixteen pigs to finish the job |  .**/,,,/ "
   i$( peek(-1) )  = "          /|  in one sitting, so be wary of any man who keeps  |    ,**.,, "
   i$( peek(-1) )  = "          /|  a pig farm.  -- BT                               |  ..    ,% "
   i$( peek(-1) )  = " ,,.      /+---------------------------------------------------+    (.     "
   i$( peek(-1) )  = "  .       /////////////////////////////////////////////////////   ##(   *# "
   return