mirror of https://github.com/velour/catbase.git
newsbid: improve display of news items
This commit is contained in:
parent
7b8f37d67d
commit
408794fe58
|
@ -82,7 +82,7 @@ func (p *NewsBid) message(conn bot.Connector, k bot.Kind, message msg.Message, a
|
||||||
}
|
}
|
||||||
amount, _ := strconv.Atoi(parts[1])
|
amount, _ := strconv.Atoi(parts[1])
|
||||||
url := parts[2]
|
url := parts[2]
|
||||||
if bid, err := p.ws.Bid(message.User.Name, amount, url); err != nil {
|
if bid, err := p.ws.Bid(message.User.Name, amount, parts[1], url); err != nil {
|
||||||
p.bot.Send(conn, bot.Message, ch, fmt.Sprintf("Error placing bid: %s", err))
|
p.bot.Send(conn, bot.Message, ch, fmt.Sprintf("Error placing bid: %s", err))
|
||||||
} else {
|
} else {
|
||||||
p.bot.Send(conn, bot.Message, ch, fmt.Sprintf("Your bid has been placed on %s", bid.Title))
|
p.bot.Send(conn, bot.Message, ch, fmt.Sprintf("Your bid has been placed on %s", bid.Title))
|
||||||
|
@ -128,10 +128,10 @@ func (p *NewsBid) check(conn bot.Connector, ch string) {
|
||||||
msg := fmt.Sprintf("%s%s won %d for a score of %d",
|
msg := fmt.Sprintf("%s%s won %d for a score of %d",
|
||||||
icon, res.User, res.Won, res.Score)
|
icon, res.User, res.Won, res.Score)
|
||||||
if len(res.WinningArticles) > 0 {
|
if len(res.WinningArticles) > 0 {
|
||||||
msg += "\nWinning articles: " + res.WinningArticles.Titles()
|
msg += "\nWinning articles: \n" + res.WinningArticles.Titles()
|
||||||
}
|
}
|
||||||
if len(res.LosingArticles) > 0 {
|
if len(res.LosingArticles) > 0 {
|
||||||
msg += "\nLosing articles: " + res.LosingArticles.Titles()
|
msg += "\nLosing articles: \n" + res.LosingArticles.Titles()
|
||||||
}
|
}
|
||||||
p.bot.Send(conn, bot.Message, ch, msg)
|
p.bot.Send(conn, bot.Message, ch, msg)
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,11 +33,9 @@ type Items []Item
|
||||||
|
|
||||||
func (is Items) Titles() string {
|
func (is Items) Titles() string {
|
||||||
out := ""
|
out := ""
|
||||||
for i, v := range is {
|
for _, v := range is {
|
||||||
if i > 0 {
|
hnURL := fmt.Sprintf("https://news.ycombinator.com/item?id=%d", v.ID)
|
||||||
out += ", "
|
out += fmt.Sprintf("• %s <%s|%s> (<%s|Comments>)\n", v.Bid, v.URL, v.Title, hnURL)
|
||||||
}
|
|
||||||
out += fmt.Sprintf("<%s|%s>", v.URL, v.Title)
|
|
||||||
}
|
}
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,4 +16,9 @@ type Item struct {
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Parts []int `json:"parts"`
|
Parts []int `json:"parts"`
|
||||||
Descendants int `json:"descendants"`
|
Descendants int `json:"descendants"`
|
||||||
|
|
||||||
|
// This is not in the API but it's
|
||||||
|
// easier to hack it in here than
|
||||||
|
// fix my code.
|
||||||
|
Bid string `json:"bid"`
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,9 @@ type Bid struct {
|
||||||
User string
|
User string
|
||||||
Title string
|
Title string
|
||||||
URL string
|
URL string
|
||||||
|
HNID int `db:"hnid"`
|
||||||
Bid int
|
Bid int
|
||||||
|
BidStr string
|
||||||
PlacedScore int `db:"placed_score"`
|
PlacedScore int `db:"placed_score"`
|
||||||
ProcessedScore int `db:"processed_score"`
|
ProcessedScore int `db:"processed_score"`
|
||||||
Placed int64
|
Placed int64
|
||||||
|
@ -80,7 +82,9 @@ func (w *Webshit) setup() {
|
||||||
user string,
|
user string,
|
||||||
title string,
|
title string,
|
||||||
url string,
|
url string,
|
||||||
|
hnid string,
|
||||||
bid integer,
|
bid integer,
|
||||||
|
bidstr string,
|
||||||
placed_score integer,
|
placed_score integer,
|
||||||
processed_score integer,
|
processed_score integer,
|
||||||
placed integer,
|
placed integer,
|
||||||
|
@ -100,14 +104,21 @@ func (w *Webshit) Check(last int64) ([]WeeklyResult, int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if published.Unix() <= last {
|
if published.Unix() <= last {
|
||||||
|
log.Debug().Msgf("No new ngate: %v vs %v", published.Unix(), last)
|
||||||
return nil, 0, fmt.Errorf("no new ngate")
|
return nil, 0, fmt.Errorf("no new ngate")
|
||||||
}
|
}
|
||||||
|
|
||||||
var bids []Bid
|
var bids []Bid
|
||||||
if err = w.db.Select(&bids, `select user,title,url,bid from webshit_bids where processed=0`); err != nil {
|
if err = w.db.Select(&bids, `select user,title,url,hnid,bid,bidstr from webshit_bids where processed=0`); err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Debug().
|
||||||
|
Interface("bids", bids).
|
||||||
|
Interface("ngate", stories).
|
||||||
|
Interface("published", published).
|
||||||
|
Msg("checking ngate")
|
||||||
|
|
||||||
// Assuming no bids earlier than the weekly means there hasn't been a new weekly
|
// Assuming no bids earlier than the weekly means there hasn't been a new weekly
|
||||||
if len(bids) == 0 {
|
if len(bids) == 0 {
|
||||||
return nil, 0, fmt.Errorf("there are no bids against the current ngate post")
|
return nil, 0, fmt.Errorf("there are no bids against the current ngate post")
|
||||||
|
@ -115,8 +126,7 @@ func (w *Webshit) Check(last int64) ([]WeeklyResult, int64, error) {
|
||||||
|
|
||||||
storyMap := map[string]hn.Item{}
|
storyMap := map[string]hn.Item{}
|
||||||
for _, s := range stories {
|
for _, s := range stories {
|
||||||
id := strconv.Itoa(s.ID)
|
storyMap[s.URL] = s
|
||||||
storyMap[id] = s
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wr := w.checkBids(bids, storyMap)
|
wr := w.checkBids(bids, storyMap)
|
||||||
|
@ -127,8 +137,8 @@ func (w *Webshit) Check(last int64) ([]WeeklyResult, int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete all those bids
|
// Delete all those bids
|
||||||
if _, err = w.db.Exec(`update webshit_bids set processed=? where placed < ?`,
|
if _, err = w.db.Exec(`update webshit_bids set processed=? where processed=0`,
|
||||||
time.Now().Unix(), published.Unix()); err != nil {
|
time.Now().Unix()); err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,19 +167,19 @@ func (w *Webshit) checkBids(bids []Bid, storyMap map[string]hn.Item) []WeeklyRes
|
||||||
}
|
}
|
||||||
rec := wr[b.User]
|
rec := wr[b.User]
|
||||||
|
|
||||||
u, err := url.Parse(b.URL)
|
if s, ok := storyMap[b.URL]; ok {
|
||||||
if err != nil {
|
|
||||||
log.Error().Err(err).Msg("couldn't parse URL")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
id := u.Query().Get("id")
|
|
||||||
|
|
||||||
if s, ok := storyMap[id]; ok {
|
|
||||||
wins = append(wins, b)
|
wins = append(wins, b)
|
||||||
|
s.Bid = b.BidStr
|
||||||
rec.WinningArticles = append(rec.WinningArticles, s)
|
rec.WinningArticles = append(rec.WinningArticles, s)
|
||||||
totalWinning += float64(b.Bid)
|
totalWinning += float64(b.Bid)
|
||||||
} else {
|
} else {
|
||||||
rec.LosingArticles = append(rec.LosingArticles, hn.Item{Title: b.Title, URL: b.URL})
|
bid := hn.Item{
|
||||||
|
ID: b.HNID,
|
||||||
|
URL: b.URL,
|
||||||
|
Title: b.Title,
|
||||||
|
Bid: b.BidStr,
|
||||||
|
}
|
||||||
|
rec.LosingArticles = append(rec.LosingArticles, bid)
|
||||||
}
|
}
|
||||||
total += float64(b.Bid)
|
total += float64(b.Bid)
|
||||||
wr[b.User] = rec
|
wr[b.User] = rec
|
||||||
|
@ -274,7 +284,7 @@ func (w *Webshit) GetAllBalances() ([]Balance, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bid allows a user to place a bid on a particular story
|
// Bid allows a user to place a bid on a particular story
|
||||||
func (w *Webshit) Bid(user string, amount int, URL string) (Bid, error) {
|
func (w *Webshit) Bid(user string, amount int, bidStr, URL string) (Bid, error) {
|
||||||
bal := w.GetBalance(user)
|
bal := w.GetBalance(user)
|
||||||
if amount < 0 {
|
if amount < 0 {
|
||||||
return Bid{}, fmt.Errorf("cannot bid less than 0")
|
return Bid{}, fmt.Errorf("cannot bid less than 0")
|
||||||
|
@ -290,8 +300,8 @@ func (w *Webshit) Bid(user string, amount int, URL string) (Bid, error) {
|
||||||
ts := time.Now().Unix()
|
ts := time.Now().Unix()
|
||||||
|
|
||||||
tx := w.db.MustBegin()
|
tx := w.db.MustBegin()
|
||||||
_, err = tx.Exec(`insert into webshit_bids (user,title,url,bid,placed,processed,placed_score,processed_score) values (?,?,?,?,?,0,?,0)`,
|
_, err = tx.Exec(`insert into webshit_bids (user,title,url,hnid,bid,bidstr,placed,processed,placed_score,processed_score) values (?,?,?,?,?,?,?,0,?,0)`,
|
||||||
user, story.Title, story.URL, amount, ts, story.Score)
|
user, story.Title, story.URL, story.ID, amount, bidStr, ts, story.Score)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err := tx.Rollback(); err != nil {
|
if err := tx.Rollback(); err != nil {
|
||||||
return Bid{}, err
|
return Bid{}, err
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package webshit
|
||||||
|
|
||||||
|
//func TestWebshit_Check(t *testing.T) {
|
||||||
|
// mb := bot.NewMockBot()
|
||||||
|
// ws := New(mb.DB())
|
||||||
|
// ws.checkBids()
|
||||||
|
//}
|
Loading…
Reference in New Issue