BitBar で私家版通勤タイマー (1) - portal shit! の続き。
JSON から情報を読み取って出力する奴は Ruby で書こうかなと思っていたんだけど、先日新しい上司と 1 on 1 をしていてどんな言語を使えるかの話になったときに Ruby と PHP とコールドフュ〜ジョン(と片手間 JavaScript )くらいしか使える言語がないということが判明してダメだと思ったので無理矢理 Go 言語で書いてみた。クソコードなので恥ずかしい。
package main
import (
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
"time"
)
type Hour struct {
Hour string
Minutes []string
}
func printLefts(m int, minutes []string, hour string) {
for i := 0; i < len(minutes); i++ {
mindes := strings.Split(minutes[i], " ")
min := mindes[0]
var Dest string
if len(mindes) > 1 {
Dest = mindes[1]
}
_m, _ := strconv.Atoi(min)
left := _m - m
if left > 0 && left < 30 {
leftS := strconv.Itoa(left)
takeM := fmt.Sprintf("%02d", _m)
Str := leftS + " minutes left to " + hour + ":" + takeM
if Dest != "" {
Str = Str + " " + Dest
}
fmt.Println(Str)
}
}
}
func main() {
decoder := json.NewDecoder(os.Stdin)
timetable := make([]Hour, 0)
decoder.Decode(&timetable)
t := time.Now()
h := t.Hour()
m := t.Minute()
var CurrentHour, NextHour Hour
for i := 0; i < len(timetable); i++ {
hour := timetable[i]
_h, _ := strconv.Atoi(hour.Hour)
if _h == h {
CurrentHour = hour
NextHour = timetable[i+1]
break
}
}
minutes := CurrentHour.Minutes
printLefts(m, minutes, CurrentHour.Hour)
if m > 44 {
nextMinutes := NextHour.Minutes
printLefts(m-60, nextMinutes, NextHour.Hour)
}
}
こんな感じに表示される。
あとはこれを BitBar で良い感じに読めるように出力内容を調整していけば良い。
Go 言語、 2 年くらい前に gyowitter っての作って Yo が来たら Twitter に晒すってのやってた以来に触った。変数のスコープとかがわかりづらかったし、 PHP っぽい雰囲気もある。やっぱり Ruby の方が書きやすいし好きだけど歯を食いしばって使ってみる。