Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Your domain user name (without domain name).")]
[string]$username,
[Parameter(Mandatory=$true, Position=1, HelpMessage="Your domain account password.")]
[SecureString]$password
)
function UnixTimeStampToDateTime([long]$unixTimeStamp)
{
$UnixEpoch = New-Object DateTime @(1970, 1, 1, 0, 0, 0, 0, "Utc")
return $UnixEpoch.AddMilliseconds($unixTimeStamp).ToLocalTime()
}
function GetIssueFromUrl([string]$url) {
return ($url -cReplace ".*/(MKT-\d+)/.*", '$1')
}
function IsToday($date) {
return (UnixTimeStampToDateTime $date).Date -eq [DateTime]::Today
}
$me = $username
$pass = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Invoke-RestMethod `
-Uri "http://youtrack.crossmarket.across.lan/rest/user/login" `
-Body @{login="acrosssys\$me"; password=$pass} `
-Method Post `
-SessionVariable sess `
-ErrorAction Stop | Out-Null
if(-not $?) {
throw "Could not login."
}
$ticketsResponse = Invoke-RestMethod `
-Uri "http://youtrack.crossmarket.across.lan/rest/issue?filter=for%3A+$me+updated%3AToday" `
-Method Get `
-WebSession $sess
$ids = $ticketsResponse.issueCompacts.issue.id
$allWorkItems = $ids `
| % { Invoke-RestMethod -Uri "http://youtrack.crossmarket.across.lan/rest/issue/$_/timetracking/workitem" -Method Get -WebSession $sess } `
| ? { $_.workitems } `
| % { $_.workitems.workitem }
$myWorkItems = @( $allWorkItems | ? { $_.author.login -eq $me -and (IsToday $_.date) } )
Write-Host "Tickets assigned to $me and updated $(get-date -Format d):"
$myWorkItems | %{
New-Object psobject -Property @{
Issue=GetIssueFromUrl $_.url
Duration=[timespan]::FromMinutes($_.duration) }} |
Format-Table -AutoSize -HideTableHeaders -GroupBy "Issue" -Property "Duration"
$totalDuration = ($myWorkItems.duration | measure -Sum).Sum
Write-Host "Total duration: $([timespan]::FromMinutes( $totalDuration ))"