hetch/app/Main.hs

84 lines
3.2 KiB
Haskell
Raw Permalink Normal View History

2025-01-15 01:57:39 +00:00
module Main where
import Data.List (isPrefixOf)
import Data.Maybe (fromMaybe)
import System.Environment (lookupEnv)
import System.IO (readFile')
2025-02-24 07:32:35 +00:00
import Control.Monad.IO.Class (MonadIO)
fromIOMaybe :: (MonadIO m) => a -> m (Maybe a) -> m a
fromIOMaybe failsafe maybeVal = do
res <- maybeVal
case res of
Nothing -> return failsafe
(Just val) -> return val
2025-01-15 01:57:39 +00:00
readUptime :: String -> Int
readUptime "" = 0
readUptime uptime
2025-02-24 07:32:35 +00:00
| length (words uptime) > 1 = floor (read . head $ words uptime :: Float)
2025-01-15 01:57:39 +00:00
| 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
2025-02-24 07:32:35 +00:00
remS = show (uptime `mod` 60) <> "s"
remM = show (totalM `mod` 60) <> "m"
remH = show (totalM `div` 60) <> "h"
2025-01-15 01:57:39 +00:00
getKVer :: String -> String
getKVer "" = ""
getKVer info
| length (words info) < 3 = head (words info)
2025-02-24 07:32:35 +00:00
| otherwise = (\(k : ks) -> unwords [k, (!! 1) ks]) (words info)
2025-01-15 01:57:39 +00:00
findPrettyName :: [String] -> String
2025-02-24 07:32:35 +00:00
findPrettyName [] = "Unknown"
2025-01-15 01:57:39 +00:00
findPrettyName (o : os)
2025-02-24 07:32:35 +00:00
| "PRETTY_NAME" `isPrefixOf` o = tail . init $ dropWhile (/='"') o
2025-01-15 01:57:39 +00:00
| otherwise = findPrettyName os
2025-02-24 07:32:35 +00:00
parseKB :: String -> Int
parseKB "" = 0
parseKB line = read (head . tail $ words line) :: Int
2025-01-15 01:57:39 +00:00
getMemory :: String -> String
2025-02-24 07:32:35 +00:00
getMemory memInfo
| length (lines memInfo) < 2 = "N/A"
| otherwise = memAvail <> "/" <> memTotal
2025-01-15 01:57:39 +00:00
where
2025-02-24 07:32:35 +00:00
memAvail = show ((parseKB . (!! 2) $ lines memInfo) `div` 1000) <> "MB"
memTotal = show ((parseKB . head $ lines memInfo) `div` 1000) <> "MB"
2025-01-15 01:57:39 +00:00
2025-02-24 07:32:35 +00:00
getWM :: String -> String -> String
getWM desktop session = unwords [desktop, "(" <> session <> ")"]
2025-02-04 20:07:16 +00:00
2025-01-15 01:57:39 +00:00
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"
2025-02-24 07:32:35 +00:00
username <- fromIOMaybe "username" (lookupEnv "USER")
currentDesktop <- fromIOMaybe "Unknown" (lookupEnv "XDG_CURRENT_DESKTOP")
sessionType <- fromIOMaybe "Unkown" (lookupEnv "XDG_SESSION_TYPE")
locale <- fromIOMaybe "un_KN.own" (lookupEnv "LANG")
let userandhost = username <> "@" <> init hostname
2025-01-15 01:57:39 +00:00
putStr
( unlines
2025-02-24 07:32:35 +00:00
[ "\x1b[1;35m █ \x1b[1;34m" <> userandhost
, "\x1b[1;35m █ \x1b[1;34m" <> take (length userandhost) (repeat '-')
, "\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" <> locale
, "\x1b[1;35m █ ██ \x1b[1;34m" <> "mem\t" <> getMemory meminfo
2025-01-15 01:57:39 +00:00
]
)