ShellServer.psm1

$LocalHost = '127.0.0.1'
$Port = 5432
$Enc = [System.Text.Encoding]::UTF8
$Sock = New-Object System.Net.Sockets.UdpClient
$Sock.Connect($LocalHost, $Port)

$Address = [System.Net.IpAddress]::Parse($LocalHost)
$End = New-Object System.Net.IPEndPoint $Address, $Port


$Buffer = $Enc.GetBytes('#Init')
$Sock.Send($Buffer) > $nul

$esc = $([char]27)
$cyan = '[96m'
$reset = '[0m'

$Symbols = @{
    'Python' = '🐍'
    'Branch' = ''
   # untracked = ?, staged = +
  }

function global:prompt {
  $origLastError = $?

  if (-Not (Test-Path 'ENV:VIRTUAL_ENV')) {
    Write-Host ""  # new line from previous prompt
  }

  $Buffer = $Enc.GetBytes('%' + (Get-Location).Path)
  $Sock.Send($Buffer) > $nul

  $response = $Enc.GetString($Sock.Receive([ref] $End))

  if ($response -Like '*&*') {
    $arr = $response.Split('&')
    $cwd = $arr[0]

    Write-Host "$esc$cyan$cwd$esc$reset" -NoNewLine

    foreach ($entry in $arr[1..$arr.Length]){
        $parcials = $entry.Split(';')
        $symbol = $Symbols[$parcials[0]]
        $version = $parcials[1]
        $color = $DefaultThemeColors['Command']

        Write-Host " [$symbol $color$version$esc$reset] " -NoNewLine
    }
  } else {
      $cwd = $response
      Write-Host "$esc$cyan$cwd$esc$reset" -NoNewLine
    }
  Write-Host ''

  if ($origLastError) {
      $color = 'Green'
  } else {
      $color = 'Red'
    }
  Write-Host "❯" -NoNewLine -ForegroundColor $color
  ' '
}

function global:p {
  $Buffer = $Enc.GetBytes('!' + $args -join ' ')
  $Sock.Send($Buffer) > $nul
  $response = $Enc.GetString($Sock.Receive([ref] $End))
  if ($response) {
    Invoke-Expression "Set-Location '$response'"
  } else {
      Write-Host "ShellServer: No match found."
    }
}

function global:pz {
  $Buffer = $Enc.GetBytes('*')
  $Sock.Send($Buffer) > $nul
  $response = $Enc.GetString($Sock.Receive([ref] $End))
  $query = $args -Join ' '

  if ($query) {
    $answer = Write-Output $response | fzf --height=~20 --layout=reverse -q $query
  } else {
      $answer = Write-Output $response | fzf --height=~20 --layout=reverse
    }

  $Sock.Send($Enc.GetBytes('*' + $answer)) > $nul
  Invoke-Expression "Set-Location $answer"
}

Register-EngineEvent PowerShell.Exiting -action {
  $Sock = New-Object System.Net.Sockets.UdpClient
  $Sock.Connect('127.0.0.1', 5432)
  $Sock.Send([System.Text.Encoding]::UTF8.GetBytes('#Exit'))
} > $nul

Export-ModuleMember -Function prompt
Export-ModuleMember -Function p
Export-ModuleMember -Function pz