mirror of
https://github.com/cwinfo/matterbridge.git
synced 2024-12-26 16:45:40 +00:00
123 lines
2.6 KiB
Go
123 lines
2.6 KiB
Go
package trade
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/Philipp15b/go-steam/steamid"
|
|
"github.com/Philipp15b/go-steam/trade/tradeapi"
|
|
)
|
|
|
|
const pollTimeout = time.Second
|
|
|
|
type Trade struct {
|
|
ThemId steamid.SteamId
|
|
|
|
MeReady, ThemReady bool
|
|
|
|
lastPoll time.Time
|
|
queuedEvents []interface{}
|
|
api *tradeapi.Trade
|
|
}
|
|
|
|
func New(sessionId, steamLogin, steamLoginSecure string, other steamid.SteamId) *Trade {
|
|
return &Trade{
|
|
other,
|
|
false, false,
|
|
time.Unix(0, 0),
|
|
nil,
|
|
tradeapi.New(sessionId, steamLogin, steamLoginSecure, other),
|
|
}
|
|
}
|
|
|
|
func (t *Trade) Version() uint {
|
|
return t.api.Version
|
|
}
|
|
|
|
// Returns all queued events and removes them from the queue without performing a HTTP request, like Poll() would.
|
|
func (t *Trade) Events() []interface{} {
|
|
qe := t.queuedEvents
|
|
t.queuedEvents = nil
|
|
return qe
|
|
}
|
|
|
|
func (t *Trade) onStatus(status *tradeapi.Status) error {
|
|
if !status.Success {
|
|
return errors.New("trade: returned status not successful! error message: " + status.Error)
|
|
}
|
|
|
|
if status.NewVersion {
|
|
t.api.Version = status.Version
|
|
|
|
t.MeReady = status.Me.Ready == true
|
|
t.ThemReady = status.Them.Ready == true
|
|
}
|
|
|
|
switch status.TradeStatus {
|
|
case tradeapi.TradeStatus_Complete:
|
|
t.addEvent(&TradeEndedEvent{TradeEndReason_Complete})
|
|
case tradeapi.TradeStatus_Cancelled:
|
|
t.addEvent(&TradeEndedEvent{TradeEndReason_Cancelled})
|
|
case tradeapi.TradeStatus_Timeout:
|
|
t.addEvent(&TradeEndedEvent{TradeEndReason_Timeout})
|
|
case tradeapi.TradeStatus_Failed:
|
|
t.addEvent(&TradeEndedEvent{TradeEndReason_Failed})
|
|
case tradeapi.TradeStatus_Open:
|
|
// nothing
|
|
default:
|
|
// ignore too
|
|
}
|
|
|
|
t.updateEvents(status.Events)
|
|
return nil
|
|
}
|
|
|
|
func (t *Trade) updateEvents(events tradeapi.EventList) {
|
|
if len(events) == 0 {
|
|
return
|
|
}
|
|
|
|
var lastLogPos uint
|
|
for i, event := range events {
|
|
if i < t.api.LogPos {
|
|
continue
|
|
}
|
|
if event.SteamId != t.ThemId {
|
|
continue
|
|
}
|
|
|
|
if lastLogPos < i {
|
|
lastLogPos = i
|
|
}
|
|
|
|
switch event.Action {
|
|
case tradeapi.Action_AddItem:
|
|
t.addEvent(&ItemAddedEvent{newItem(event)})
|
|
case tradeapi.Action_RemoveItem:
|
|
t.addEvent(&ItemRemovedEvent{newItem(event)})
|
|
case tradeapi.Action_Ready:
|
|
t.ThemReady = true
|
|
t.addEvent(new(ReadyEvent))
|
|
case tradeapi.Action_Unready:
|
|
t.ThemReady = false
|
|
t.addEvent(new(UnreadyEvent))
|
|
case tradeapi.Action_SetCurrency:
|
|
t.addEvent(&SetCurrencyEvent{
|
|
newCurrency(event),
|
|
event.OldAmount,
|
|
event.NewAmount,
|
|
})
|
|
case tradeapi.Action_ChatMessage:
|
|
t.addEvent(&ChatEvent{
|
|
event.Text,
|
|
})
|
|
}
|
|
}
|
|
|
|
t.api.LogPos = uint(lastLogPos) + 1
|
|
}
|
|
|
|
func (t *Trade) addEvent(event interface{}) {
|
|
t.queuedEvents = append(t.queuedEvents, event)
|
|
}
|