hetch/app/Main.hs
2025-02-04 20:07:16 +00:00

74 lines
3 KiB
Haskell

module Main where
import Data.List (isPrefixOf)
import Data.Maybe (fromMaybe)
import System.Environment (lookupEnv)
import System.IO (readFile')
readUptime :: String -> Int
readUptime "" = 0
readUptime uptime
| length (words uptime) > 1 = floor (read . head . words $ uptime :: Float)
| otherwise = floor (read uptime :: Float)
getUptime :: Int -> String
getUptime uptime
| uptime < 60 = remS
| uptime < 3600 = unwords [remM, remS]
| otherwise = unwords [remH, remM, remS]
where
totalM = uptime `div` 60
remS = show (uptime `mod` 60) ++ "s"
remM = show (totalM `mod` 60) ++ "m"
remH = show (totalM `div` 60) ++ "h"
getKVer :: String -> String
getKVer "" = ""
getKVer info
| length (words info) < 3 = head (words info)
| otherwise = (\(k : ks) -> k ++ " " ++ (head . tail) ks) . words $ info
findPrettyName :: [String] -> String
findPrettyName (o : os)
| "PRETTY_NAME" `isPrefixOf` o = (reverse . tail . init . takeWhile (/= '=') . reverse) o
| otherwise = findPrettyName os
parseKBFromMeminfo :: String -> Int
parseKBFromMeminfo "" = 0
parseKBFromMeminfo line = read (head . tail . words $ line) :: Int
getMemory :: String -> String
getMemory meminfo
| length (lines meminfo) < 2 = "N/A"
| otherwise = memAvail ++ "/" ++ memTotal
where
memTotal = show (parseKBFromMeminfo (head $ lines meminfo) `div` 1000) ++ "MB"
memAvail = show (parseKBFromMeminfo (head . tail . tail $ lines meminfo) `div` 1000) ++ "MB"
getWM :: Maybe String -> Maybe String -> String
getWM (Just desktop) (Just session) = desktop ++ " (" ++ session ++ ")"
getWM _ _ = "Unknown"
main :: IO ()
main = do
uptime <- readFile' "/proc/uptime"
version <- readFile' "/proc/version"
osRelease <- readFile' "/etc/os-release"
hostname <- readFile' "/proc/sys/kernel/hostname"
meminfo <- readFile' "/proc/meminfo"
username <- lookupEnv "USER"
currentDesktop <- lookupEnv "XDG_CURRENT_DESKTOP"
sessionType <- lookupEnv "XDG_SESSION_TYPE"
locale <- lookupEnv "LANG"
putStr
( unlines
[ "\x1b[1;35m █ \x1b[1;34m" ++ fromMaybe "username" username ++ "@" ++ init hostname
, "\x1b[1;35m █ \x1b[1;34m"
, "\x1b[1;35m █ \x1b[1;34m" ++ "up\t" ++ (getUptime . readUptime) uptime
, "\x1b[1;35m █ \x1b[1;34m" ++ "wm\t" ++ getWM currentDesktop sessionType
, "\x1b[1;35m ███ \x1b[1;34m" ++ "krl\t" ++ getKVer version
, "\x1b[1;35m █ ██ \x1b[1;34m" ++ "os\t" ++ (findPrettyName . lines) osRelease
, "\x1b[1;35m █ ██ \x1b[1;34m" ++ "lcl\t" ++ fromMaybe "??_??" locale
, "\x1b[1;35m █ ██ \x1b[1;34m" ++ "mem\t" ++ getMemory meminfo
]
)