summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/Philipp15b/go-steam/trade/trade.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/Philipp15b/go-steam/trade/trade.go')
-rw-r--r--vendor/github.com/Philipp15b/go-steam/trade/trade.go122
1 files changed, 122 insertions, 0 deletions
diff --git a/vendor/github.com/Philipp15b/go-steam/trade/trade.go b/vendor/github.com/Philipp15b/go-steam/trade/trade.go
new file mode 100644
index 00000000..4889f407
--- /dev/null
+++ b/vendor/github.com/Philipp15b/go-steam/trade/trade.go
@@ -0,0 +1,122 @@
+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)
+}