diff --git a/lib/format.go b/lib/format.go
index 253369f..aba5c89 100644
--- a/lib/format.go
+++ b/lib/format.go
@@ -47,6 +47,9 @@ func (self *Formatter) format_market(m *Market) string {
markup += "\n"
markup += `{{.Advances.name}}: {{.Advances.nyse}} ({{.Advances.nysep}}) on NYSE and {{.Advances.nasdaq}} ({{.Advances.nasdaqp}}) on Nasdaq. `
markup += `{{.Declines.name}}: {{.Declines.nyse}} ({{.Declines.nysep}}) on NYSE and {{.Declines.nasdaq}} ({{.Declines.nasdaqp}}) on Nasdaq`
+ if !m.Open {
+ markup += `U.S. markets closed`
+ }
markup += "\n"
markup += `New highs: {{.Highs.nyse}} on NYSE and {{.Highs.nasdaq}} on Nasdaq. `
markup += `New lows: {{.Lows.nyse}} on NYSE and {{.Lows.nasdaq}} on Nasdaq.`
diff --git a/lib/line_editor.go b/lib/line_editor.go
index 0af7a11..039ed59 100644
--- a/lib/line_editor.go
+++ b/lib/line_editor.go
@@ -147,17 +147,17 @@ func (self *LineEditor) execute() {
case '+':
tickers := self.tokenize()
if len(tickers) > 0 {
- self.quotes.profile.AddTickers(tickers)
- self.screen.Draw(self.quotes)
+ if added,_ := self.quotes.AddTickers(tickers); added > 0 {
+ self.screen.Draw(self.quotes)
+ }
}
case '-':
tickers := self.tokenize()
if len(tickers) > 0 {
before := len(self.quotes.profile.Tickers)
- self.quotes.profile.RemoveTickers(tickers)
- after := len(self.quotes.profile.Tickers)
- if after < before {
+ if removed,_ := self.quotes.RemoveTickers(tickers); removed > 0 {
self.screen.Draw(self.quotes)
+ after := before - removed
for i := before; i > after; i-- {
self.screen.ClearLine(0, i + 4)
}
diff --git a/lib/profile.go b/lib/profile.go
index 96b14bc..136d222 100644
--- a/lib/profile.go
+++ b/lib/profile.go
@@ -52,7 +52,8 @@ func (self *Profile) ListOfTickers() string {
}
//-----------------------------------------------------------------------------
-func (self *Profile) AddTickers(tickers []string) {
+func (self *Profile) AddTickers(tickers []string) (added int, err error) {
+ added = 0
existing := make(map[string]bool)
for _, ticker := range self.Tickers {
@@ -62,22 +63,27 @@ func (self *Profile) AddTickers(tickers []string) {
for _, ticker := range tickers {
if _, found := existing[ticker]; !found {
self.Tickers = append(self.Tickers, ticker)
+ added++
}
}
sort.Strings(self.Tickers)
- self.Save()
+ err = self.Save()
+ return
}
//-----------------------------------------------------------------------------
-func (self *Profile) RemoveTickers(tickers []string) {
+func (self *Profile) RemoveTickers(tickers []string) (removed int, err error) {
+ removed = 0
for _, ticker := range tickers {
for i, existing := range self.Tickers {
if ticker == existing { // Requested ticker is there: remove i-th slice item.
self.Tickers = append(self.Tickers[:i], self.Tickers[i+1:]...)
+ removed++
}
}
}
- self.Save()
+ err = self.Save()
+ return
}
// private
diff --git a/lib/yahoo_market.go b/lib/yahoo_market.go
index 4b49727..1930989 100644
--- a/lib/yahoo_market.go
+++ b/lib/yahoo_market.go
@@ -51,6 +51,7 @@ func (self *Market) Fetch() *Market {
panic(err)
}
+ body = self.check_if_market_open(body)
return self.extract(self.trim(body))
}
@@ -59,6 +60,16 @@ func (self *Market) Format() string {
return new(Formatter).Format(self)
}
+// private
+//-----------------------------------------------------------------------------
+func (self *Market) check_if_market_open(body []byte) []byte {
+ start := bytes.Index(body, []byte(`id="yfs_market_time"`))
+ finish := start + bytes.Index(body[start:], []byte(``))
+ self.Open = !bytes.Contains(body[start:finish], []byte(`closed`))
+
+ return body[finish:]
+}
+
//-----------------------------------------------------------------------------
func (self *Market) trim(body []byte) []byte {
start := bytes.Index(body, []byte(`
0 {
+ self.stocks = nil // Force fetch.
+ }
+ return
+}
+
+//-----------------------------------------------------------------------------
+func (self *Quotes) RemoveTickers(tickers []string) (removed int, err error) {
+ if removed, err = self.profile.RemoveTickers(tickers); removed > 0 {
+ self.stocks = nil // Force fetch.
+ }
+ return
+}
+
//-----------------------------------------------------------------------------
func (self *Quotes) parse(body []byte) *Quotes {
lines := bytes.Split(body, []byte{'\n'})