bid: fix losing story mode; pretty it up a little

This commit is contained in:
Chris Sexton 2019-07-15 22:00:19 -04:00
parent 286582417b
commit bdfd6060a0
3 changed files with 93 additions and 26 deletions

View File

@ -102,8 +102,14 @@ func (p *NewsBid) check(conn bot.Connector, ch string) {
return
}
for _, res := range wr {
msg := fmt.Sprintf("%s: won %d and lost %d for a score of %d",
msg := fmt.Sprintf("%s won %d and lost %d for a score of %d",
res.User, res.Won, res.Lost, res.Score)
if len(res.WinningArticles) > 0 {
msg += "\nWinning articles: " + res.WinningArticles.Titles()
}
if len(res.LosingArticles) > 0 {
msg += "\nLosing articles: " + res.LosingArticles.Titles()
}
p.bot.Send(conn, bot.Message, ch, msg)
}
}

View File

@ -14,8 +14,21 @@ import (
"time"
)
type Config struct {
HNFeed string
HNLimit int
BalanceReferesh int
}
var DefaultConfig = Config{
HNFeed: "topstories",
HNLimit: 10,
BalanceReferesh: 100,
}
type Webshit struct {
db *sqlx.DB
config Config
}
type Story struct {
@ -23,6 +36,19 @@ type Story struct {
URL string
}
type Stories []Story
func (s Stories) Titles() string {
out := ""
for i, v := range s {
if i > 0 {
out += ", "
}
out += v.Title
}
return out
}
type Bid struct {
ID int
User string
@ -45,12 +71,18 @@ type Balance struct {
type WeeklyResult struct {
User string
Won int
WinningArticles Stories
Lost int
LosingArticles Stories
Score int
}
func New(db *sqlx.DB) *Webshit {
w := &Webshit{db}
return NewConfig(db, DefaultConfig)
}
func NewConfig(db *sqlx.DB, cfg Config) *Webshit {
w := &Webshit{db: db, config: cfg}
w.setup()
return w
}
@ -108,7 +140,8 @@ func (w *Webshit) Check() ([]WeeklyResult, error) {
}
// Set all balances to 100
if _, err = w.db.Exec(`update webshit_balances set balance=100`); err != nil {
if _, err = w.db.Exec(`update webshit_balances set balance=?`,
w.config.BalanceReferesh); err != nil {
return nil, err
}
@ -118,35 +151,39 @@ func (w *Webshit) Check() ([]WeeklyResult, error) {
func (w *Webshit) checkBids(bids []Bid, storyMap map[string]Story) []WeeklyResult {
wr := map[string]WeeklyResult{}
for _, b := range bids {
win, loss := 0, 0
score := w.GetScore(b.User)
if s, ok := storyMap[b.Title]; ok {
log.Info().Interface("story", s).Msg("won bid")
win = b.Bid
} else {
log.Info().Interface("story", s).Msg("lost bid")
loss = b.Bid
}
if res, ok := wr[b.User]; !ok {
if _, ok := wr[b.User]; !ok {
wr[b.User] = WeeklyResult{
User: b.User,
Won: win,
Lost: loss,
Score: score + win - loss,
Won: 0,
Lost: 0,
Score: score,
}
}
rec := wr[b.User]
if s, ok := storyMap[b.Title]; ok {
log.Debug().Interface("story", s).Msg("won bid")
rec.Won += b.Bid
rec.Score += b.Bid
rec.WinningArticles = append(rec.WinningArticles, s)
log.Debug().Interface("story", s).Msg("Appending to winning log")
} else {
res.Won += win
res.Lost += loss
res.Score += win - loss
wr[b.User] = res
log.Debug().Interface("story", s).Msg("lost bid")
rec.Lost += b.Bid
rec.Score -= b.Bid
rec.LosingArticles = append(rec.LosingArticles, Story{Title: b.Title, URL: b.URL})
log.Debug().Interface("story", s).Msg("Appending to losing log")
}
wr[b.User] = rec
log.Debug().Interface("WR User", wr[b.User]).Str("user", b.User).Msg("setting WR")
}
return wrMapToSlice(wr)
}
// GetHeadlines will return the current possible news headlines for bidding
func (w *Webshit) GetHeadlines() ([]Story, error) {
news := hacknews.Initializer{Story: "topstories", NbPosts: 10}
news := hacknews.Initializer{Story: w.config.HNFeed, NbPosts: w.config.HNLimit}
ids, err := news.GetCodesStory()
if err != nil {
return nil, err

View File

@ -2,12 +2,19 @@ package webshit
import (
"github.com/jmoiron/sqlx"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/stretchr/testify/assert"
"os"
"testing"
_ "github.com/mattn/go-sqlite3"
)
func init() {
log.Logger = log.Logger.Output(zerolog.ConsoleWriter{Out: os.Stderr})
}
func make(t *testing.T) *Webshit {
db := sqlx.MustOpen("sqlite3", "file::memory:?mode=memory&cache=shared")
w := New(db)
@ -51,3 +58,20 @@ func TestWebshit_GetBalance(t *testing.T) {
actual := w.GetBalance("foo")
assert.Equal(t, expected, actual)
}
func TestWebshit_checkBids(t *testing.T) {
w := make(t)
bids := []Bid{
Bid{User: "foo", Title: "bar", URL: "baz", Bid: 10},
Bid{User: "foo", Title: "bar2", URL: "baz2", Bid: 10},
}
storyMap := map[string]Story{
"bar": Story{Title: "bar", URL: "baz"},
}
result := w.checkBids(bids, storyMap)
assert.Len(t, result, 1)
if len(result) > 0 {
assert.Len(t, result[0].WinningArticles, 1)
assert.Len(t, result[0].LosingArticles, 1)
}
}