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