Data.psm1

Add-Type -AssemblyName System.Windows.Forms

Function Get-SystemSpecifications {

    $UserInfo = Get-UserInformation;
    $OS = Get-OS;
    $Kernel = Get-Kernel;
    $Uptime = Get-Uptime;
    $Motherboard = Get-Mobo;
    $Shell = Get-Shell;
    $Displays = Get-Displays([System.Windows.Forms.Screen]::AllScreens);
    $WM = Get-WM;
    $Font = Get-Font;
    $CPU = Get-CPU;
    $GPU = Get-GPU;
    $RAM = Get-RAM;
    $Disks = Get-Disks;


    [System.Collections.ArrayList] $SystemInfoCollection = 
        $UserInfo, 
        $OS, 
        $Kernel,
        $Uptime,
        $Motherboard,
        $Shell,
        $Displays,
        $WM,
        $Font,
        $CPU,
        $GPU,
        $RAM;

    foreach ($Disk in $Disks){
        [void]$SystemInfoCollection.Add($Disk);
    }
    
    return $SystemInfoCollection;
}

Function Get-LineToTitleMappings { 
    $TitleMappings = @{
        0 = "";
        1 = "OS: "; 
        2 = "Kernel: ";
        3 = "Uptime: ";
        4 = "Motherboard: ";
        5 = "Shell: ";
        6 = "Scaled Resolution: ";
        7 = "Window Manager: ";
        8 = "Font: ";
        9 = "CPU: ";
        10 = "GPU ";
        11 = "RAM: ";
    };

    return $TitleMappings;
}

Function Get-UserInformation {
    return $env:USERNAME + "@" + (Get-WmiObject Win32_OperatingSystem).CSName;
}

Function Get-OS {
    return (Get-WmiObject Win32_OperatingSystem).Caption + " " + 
        (Get-WmiObject Win32_OperatingSystem).OSArchitecture;
}

Function Get-Kernel {
    return (Get-WmiObject  Win32_OperatingSystem).Version;
}

Function Get-Uptime {
    $Uptime = ((Get-WmiObject Win32_OperatingSystem).ConvertToDateTime(
        (Get-WmiObject Win32_OperatingSystem).LocalDateTime) - 
        (Get-WmiObject Win32_OperatingSystem).ConvertToDateTime(
            (Get-WmiObject Win32_OperatingSystem).LastBootUpTime));

    $FormattedUptime =  $Uptime.Days.ToString() + "d " + $Uptime.Hours.ToString() + "h " + $Uptime.Minutes.ToString() + "m " + $Uptime.Seconds.ToString() + "s ";
    return $FormattedUptime;
}

Function Get-Mobo {
    $Motherboard = Get-CimInstance Win32_BaseBoard | Select-Object Manufacturer, Product;
    return $Motherboard.Manufacturer + " " + $Motherboard.Product;

}

Function Get-Shell {
    return "PowerShell $($PSVersionTable.PSVersion.ToString())";
}

Function Get-Displays { Param ($monitorArray)
    $Displays = New-Object System.Collections.Generic.List[System.Object];

    foreach ($monitor in $monitorArray)
    {
        $resolution = [System.Tuple]::Create($monitor.Bounds.Width, $monitor.Bounds.Height);
        $displayString = $resolution.Item1.ToString() + "x" + $resolution.Item2.ToString() + " ";

        $Displays.Add($displayString);
    }

    return $Displays;
}

Function Get-WM {
    return "DWM";
}

Function Get-Font {
    return "Segoe UI";
}

Function Get-CPU {
    return (((Get-WmiObject Win32_Processor).Name) -replace '\s+', ' ');
}

Function Get-GPU {
    return (Get-WmiObject Win32_DisplayConfiguration).DeviceName;
}

Function Get-RAM {
    $FreeRam = ([math]::Truncate((Get-WmiObject Win32_OperatingSystem).FreePhysicalMemory / 1KB)); 
    $TotalRam = ([math]::Truncate((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory / 1MB));
    $UsedRam = $TotalRam - $FreeRam;
    $FreeRamPercent = ($FreeRam / $TotalRam) * 100;
    $FreeRamPercent = "{0:N0}" -f $FreeRamPercent;
    $UsedRamPercent = ($UsedRam / $TotalRam) * 100;
    $UsedRamPercent = "{0:N0}" -f $UsedRamPercent;

    return $UsedRam.ToString() + "MB / " + $TotalRam.ToString() + " MB " + "(" + $UsedRamPercent.ToString() + "%" + ")";
}

Function Get-Disks {
      
    $FormattedDisks = New-Object System.Collections.Generic.List[System.Object];

    $NumDisks = (Get-WmiObject Win32_LogicalDisk).Count;

    if ($NumDisks) {
        for ($i=0; $i -lt ($NumDisks); $i++) {
            $DiskID = (Get-WmiObject Win32_LogicalDisk)[$i].DeviceId;

            $FreeDiskSize = (Get-WmiObject Win32_LogicalDisk)[$i].FreeSpace
            $FreeDiskSizeGB = $FreeDiskSize / 1073741824;
            $FreeDiskSizeGB = "{0:N0}" -f $FreeDiskSizeGB;

            $DiskSize = (Get-WmiObject Win32_LogicalDisk)[$i].Size;
            $DiskSizeGB = $DiskSize / 1073741824;
            $DiskSizeGB = "{0:N0}" -f $DiskSizeGB;

            $FreeDiskPercent = ($FreeDiskSizeGB / $DiskSizeGB) * 100;
            $FreeDiskPercent = "{0:N0}" -f $FreeDiskPercent;

            $UsedDiskSizeGB = $DiskSizeGB - $FreeDiskSizeGB;
            $UsedDiskPercent = ($UsedDiskSizeGB / $DiskSizeGB) * 100;
            $UsedDiskPercent = "{0:N0}" -f $UsedDiskPercent;

            $FormattedDisk = "Disk " + $DiskID.ToString() + " " + 
                $UsedDiskSizeGB.ToString() + "GB" + " / " + $DiskSizeGB.ToString() + "GB " + 
                "(" + $UsedDiskPercent.ToString() + "%" + ")";
            $FormattedDisks.Add($FormattedDisk);
        }
    }
    else {
        $DiskID = (Get-WmiObject Win32_LogicalDisk).DeviceId;

        $FreeDiskSize = (Get-WmiObject Win32_LogicalDisk).FreeSpace
        $FreeDiskSizeGB = $FreeDiskSize / 1073741824;
        $FreeDiskSizeGB = "{0:N0}" -f $FreeDiskSizeGB;

        $DiskSize = (Get-WmiObject Win32_LogicalDisk).Size;
        $DiskSizeGB = $DiskSize / 1073741824;
        $DiskSizeGB = "{0:N0}" -f $DiskSizeGB;

        $FreeDiskPercent = ($FreeDiskSizeGB / $DiskSizeGB) * 100;
        $FreeDiskPercent = "{0:N0}" -f $FreeDiskPercent;

        $UsedDiskSizeGB = $DiskSizeGB - $FreeDiskSizeGB;
        $UsedDiskPercent = ($UsedDiskSizeGB / $DiskSizeGB) * 100;
        $UsedDiskPercent = "{0:N0}" -f $UsedDiskPercent;

        $FormattedDisk = "Disk " + $DiskID.ToString() + " " + 
            $UsedDiskSizeGB.ToString() + "GB" + " / " + $DiskSizeGB.ToString() + "GB " + 
            "(" + $UsedDiskPercent.ToString() + "%" + ")";
        $FormattedDisks.Add($FormattedDisk);
    }

    return $FormattedDisks;
}