From 50d5de7c2da00af64db562674cfc6d6e3d28f3a4 Mon Sep 17 00:00:00 2001 From: Tobias Lenz Date: Thu, 14 Sep 2017 00:19:24 +0200 Subject: [PATCH] sends items from opened container to nats + player location --- Gopkg.lock | 168 +++++---------------- client/albion_state.go | 7 +- client/decode.go | 12 ++ client/event_bank_container_contents.go | 52 +++++++ client/event_equipment_item.go | 24 +++ client/event_furniture_item.go | 23 +++ client/event_generic_container_contents.go | 52 +++++++ client/event_journal_item.go | 23 +++ client/event_stackable_item.go | 21 +++ client/router.go | 3 +- lib/container.go | 10 ++ lib/item.go | 60 ++++++++ lib/nats.go | 6 +- 13 files changed, 323 insertions(+), 138 deletions(-) create mode 100644 client/event_bank_container_contents.go create mode 100644 client/event_equipment_item.go create mode 100644 client/event_furniture_item.go create mode 100644 client/event_generic_container_contents.go create mode 100644 client/event_journal_item.go create mode 100644 client/event_stackable_item.go create mode 100644 lib/container.go create mode 100644 lib/item.go diff --git a/Gopkg.lock b/Gopkg.lock index 1f87116..00b4a1c 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1,12 +1,6 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. -[[projects]] - name = "cloud.google.com/go" - packages = ["compute/metadata","iam","internal","internal/optional","internal/version","storage"] - revision = "0f0b8420cb699ac4ce059c63bac263f4301fe95b" - version = "v0.12.0" - [[projects]] name = "github.com/Sirupsen/logrus" packages = ["."] @@ -14,10 +8,10 @@ version = "v1.0.3" [[projects]] - branch = "master" - name = "github.com/StackExchange/wmi" - packages = ["."] - revision = "ea383cf3ba6ec950874b8486cd72356d007c768f" + name = "github.com/albiondata/go-githubupdate" + packages = ["updater"] + revision = "254d343bc0ec7869462798ee14740dc365ddadb1" + version = "0.0.3" [[projects]] name = "github.com/blang/semver" @@ -26,10 +20,10 @@ version = "v3.5.1" [[projects]] - name = "github.com/davecgh/go-spew" - packages = ["spew"] - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" + name = "github.com/ctcpip/notifize" + packages = ["."] + revision = "89b506bbcaf11bc5ffd34e2ec1a1274f4e31147f" + version = "v1.0.0" [[projects]] branch = "master" @@ -85,18 +79,6 @@ packages = ["."] revision = "66e6fad5eea92d7adda31abfae7a5a52070dfae5" -[[projects]] - name = "github.com/go-ole/go-ole" - packages = [".","oleutil"] - revision = "0e87ea779d9deb219633b828a023b32e1244dd57" - version = "v1.2.0" - -[[projects]] - branch = "master" - name = "github.com/golang/protobuf" - packages = ["proto","protoc-gen-go/descriptor","ptypes","ptypes/any","ptypes/duration","ptypes/timestamp"] - revision = "17ce1425424ab154092bbb43af630bd647f3bb0d" - [[projects]] branch = "master" name = "github.com/gonutz/w32" @@ -117,14 +99,20 @@ [[projects]] name = "github.com/google/gopacket" - packages = [".","bytediff","dumpcommand","examples/util","ip4defrag","layers","pcap","pcapgo","pfring","reassembly","routing","tcpassembly","tcpassembly/tcpreader"] + packages = [".","layers","pcap"] revision = "8af772c0bcc826f671fd7c133917fec9686d720d" [[projects]] - branch = "master" - name = "github.com/googleapis/gax-go" + name = "github.com/google/uuid" packages = ["."] - revision = "8c160ca1523d8eea3932fbaa494c8964b7724aa8" + revision = "064e2069ce9c359c118179501254f67d7d37ba24" + version = "0.2" + +[[projects]] + name = "github.com/gorilla/websocket" + packages = ["."] + revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" + version = "v1.2.0" [[projects]] branch = "master" @@ -162,15 +150,9 @@ packages = ["."] revision = "d0303fe809921458f417bcf828397a65db30a7e4" -[[projects]] - name = "github.com/nats-io/gnatsd" - packages = ["conf","logger","server","server/pse","test","util"] - revision = "4ccbd2e3bac4a1e1f32ed760549f1f26560f58be" - version = "v1.0.2" - [[projects]] name = "github.com/nats-io/go-nats" - packages = [".","bench","encoders/builtin","encoders/protobuf","encoders/protobuf/testdata","test","util"] + packages = [".","encoders/builtin","util"] revision = "29f9728a183bf3fa7e809e14edac00b33be72088" version = "v1.3.0" @@ -182,133 +164,55 @@ [[projects]] branch = "master" - name = "github.com/oxtoacart/bpool" + name = "github.com/nu7hatch/gouuid" packages = ["."] - revision = "4e1c5567d7c2dd59fa4c7c83d34c2f3528b025d6" - -[[projects]] - name = "github.com/pcdummy/go-githubupdate" - packages = ["updater"] - revision = "254d343bc0ec7869462798ee14740dc365ddadb1" - version = "0.0.3" + revision = "179d4d0c4d8d407a32af483c2354df1d2c91e6c3" [[projects]] - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" + branch = "master" + name = "github.com/oxtoacart/bpool" + packages = ["."] + revision = "4e1c5567d7c2dd59fa4c7c83d34c2f3528b025d6" [[projects]] name = "github.com/shirou/gopsutil" - packages = ["cpu","host","internal/common","mem","net","process"] + packages = ["internal/common","net"] revision = "d573c8e3f1c5337585b0e285214e80df7429d8b5" source = "https://github.com/gradiuscypher/gopsutil.git" -[[projects]] - branch = "master" - name = "github.com/shirou/w32" - packages = ["."] - revision = "bb4de0191aa41b5507caa14b0650cdbddcd9280b" - -[[projects]] - name = "github.com/sirupsen/logrus" - packages = ["."] - revision = "f006c2ac4710855cf0f916dd6b77acf6b048dc6e" - version = "v1.0.3" - -[[projects]] - name = "github.com/stretchr/testify" - packages = ["assert","require"] - revision = "69483b4bd14f5845b5a1e55bca19e954e827f1d0" - version = "v1.1.4" - -[[projects]] - branch = "master" - name = "golang.org/x/build" - packages = ["autocertcache"] - revision = "ff164f568a9272a43619de784daac65b15b8db66" - [[projects]] branch = "master" name = "golang.org/x/crypto" - packages = ["acme","acme/autocert","bcrypt","blowfish","cast5","chacha20poly1305/internal/chacha20","cryptobyte","curve25519","ed25519","ed25519/internal/edwards25519","hkdf","md4","nacl/auth","nacl/box","nacl/secretbox","openpgp","openpgp/armor","openpgp/elgamal","openpgp/errors","openpgp/packet","openpgp/s2k","pbkdf2","pkcs12/internal/rc2","poly1305","ripemd160","salsa20/salsa","ssh","ssh/agent","ssh/terminal","ssh/testdata"] + packages = ["ssh/terminal"] revision = "81e90905daefcd6fd217b62423c0908922eadb30" -[[projects]] - branch = "master" - name = "golang.org/x/net" - packages = ["bpf","context","context/ctxhttp","html","html/atom","http2","http2/hpack","idna","internal/timeseries","lex/httplex","trace","websocket"] - revision = "66aacef3dd8a676686c7ae3716979581e8b03c47" - -[[projects]] - branch = "master" - name = "golang.org/x/oauth2" - packages = [".","google","internal","jws","jwt"] - revision = "d89af98d7c6bba047c5a2622f36bc14b8766df85" - [[projects]] branch = "master" name = "golang.org/x/sys" - packages = ["plan9","unix","windows","windows/registry","windows/svc","windows/svc/debug","windows/svc/eventlog","windows/svc/mgr"] + packages = ["unix","windows"] revision = "7ddbeae9ae08c6a06a59597f0c9edbc5ff2444ce" -[[projects]] - branch = "master" - name = "golang.org/x/text" - packages = ["internal/gen","internal/triegen","internal/ucd","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable"] - revision = "bd91bbf73e9a4a801adbfb97133c992678533126" - [[projects]] branch = "master" name = "golang.org/x/tools" - packages = ["benchmark/parse","blog","blog/atom","cmd/guru","cmd/guru/serial","container/intsets","cover","go/ast/astutil","go/buildutil","go/callgraph","go/callgraph/cha","go/callgraph/rta","go/callgraph/static","go/gccgoexportdata","go/gcexportdata","go/gcimporter15","go/internal/gccgoimporter","go/loader","go/pointer","go/ssa","go/ssa/interp","go/ssa/ssautil","go/types/typeutil","godoc","godoc/analysis","godoc/dl","godoc/proxy","godoc/redirect","godoc/short","godoc/static","godoc/util","godoc/vfs","godoc/vfs/gatefs","godoc/vfs/httpfs","godoc/vfs/mapfs","godoc/vfs/zipfs","imports","playground","playground/socket","present","refactor/eg","refactor/importgraph","refactor/rename","refactor/satisfy"] + packages = ["container/intsets"] revision = "3b1faeda9afbcba128c2d794b38ffe7982141139" -[[projects]] - branch = "master" - name = "google.golang.org/api" - packages = ["gensupport","googleapi","googleapi/internal/uritemplates","googleapi/transport","internal","iterator","option","storage/v1","transport/http"] - revision = "f5fa6a3eed6362c07f4e2e4425faeab907a041bd" - -[[projects]] - name = "google.golang.org/appengine" - packages = [".","datastore","internal","internal/app_identity","internal/base","internal/datastore","internal/log","internal/memcache","internal/modules","internal/remote_api","internal/urlfetch","internal/user","log","memcache","urlfetch","user"] - revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a" - version = "v1.0.0" - -[[projects]] - branch = "master" - name = "google.golang.org/genproto" - packages = ["googleapis/api/annotations","googleapis/iam/v1","googleapis/rpc/status"] - revision = "ee236bd376b077c7a89f260c026c4735b195e459" - -[[projects]] - name = "google.golang.org/grpc" - packages = [".","codes","connectivity","credentials","grpclb/grpc_lb_v1/messages","grpclog","internal","keepalive","metadata","naming","peer","stats","status","tap","transport"] - revision = "f92cdcd7dcdc69e81b2d7b338479a19a8723cfa3" - version = "v1.6.0" - -[[projects]] - name = "gopkg.in/airbrake/gobrake.v2" - packages = ["."] - revision = "668876711219e8b0206e2994bf0a59d889c775aa" - version = "v2.0.9" - -[[projects]] - name = "gopkg.in/gemnasium/logrus-airbrake-hook.v2" - packages = ["."] - revision = "e928b033a891c0175fb643d5aa0779e86325eb12" - version = "v2.1.2" - [[projects]] branch = "v0" name = "gopkg.in/inconshreveable/go-update.v0" packages = [".","download"] revision = "d8b0b1d421aa1cbf392c05869f8abbc669bb7066" +[[projects]] + branch = "v1" + name = "gopkg.in/toast.v1" + packages = ["."] + revision = "b700e246b8b6d3e13554091e540e1019e26389f1" + [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "d7665d8d3fa4b4ebeb678be9e6e2368c825c616154a8ba06f6ec1b756a7eb684" + inputs-digest = "6bb1777d4185ac1849f12cedd055d9a4aa4503ce4586e4439691f50bdf3e58a3" solver-name = "gps-cdcl" solver-version = 1 diff --git a/client/albion_state.go b/client/albion_state.go index 4ec10ed..ab023b3 100644 --- a/client/albion_state.go +++ b/client/albion_state.go @@ -5,7 +5,8 @@ import ( ) type albionState struct { - LocationId int - CharacterId lib.CharacterID - CharacterName string + LocationId int + CharacterId lib.CharacterID + CharacterName string + ContainerItemsToSend map[int64]lib.ItemContainer } diff --git a/client/decode.go b/client/decode.go index a3131ed..d37733d 100644 --- a/client/decode.go +++ b/client/decode.go @@ -79,6 +79,18 @@ func decodeEvent(params map[string]interface{}) (event operation, err error) { eventType := params["252"].(int16) switch eventType { + case 23: + event = &eventEquipmentItem{} + case 24: + event = &eventStackableItem{} + case 25: + event = &eventFurnitureItem{} + case 26: + event = &eventJournalItem{} + case 42: + event = &eventBankContainerContents{} + case 75: + event = &eventGenericContainerContents{} case 77: event = &eventPlayerOnlineStatus{} case 114: diff --git a/client/event_bank_container_contents.go b/client/event_bank_container_contents.go new file mode 100644 index 0000000..c2d0d1d --- /dev/null +++ b/client/event_bank_container_contents.go @@ -0,0 +1,52 @@ +package client + +import ( + "github.com/regner/albiondata-client/lib" + "github.com/regner/albiondata-client/log" + "github.com/regner/albiondata-client/notification" +) + +type eventBankContainerContents struct { + Slots []int64 `mapstructure:"1"` + ContainerID lib.CharacterID `mapstructure:"2"` +} + +func (event eventBankContainerContents) Process(state *albionState) { + log.Debug("Got Bank container opening event...") + + items := []*lib.ItemContainer{} + + for _, v := range event.Slots { + if v == 0 { + continue + } + + item := state.ContainerItemsToSend[v] + items = append(items, &item) + } + + // clear the array to prepare for the next container opening + state.ContainerItemsToSend = make(map[int64]lib.ItemContainer) + + if len(items) < 1 { + return + } + + if state.LocationId == 0 { + msg := "The players location has not yet been set. Please transition zones so the location can be identified." + log.Warn(msg) + notification.Push(msg) + return + } + + upload := lib.ContainerUpload{ + Items: items, + CurrentLocation: state.LocationId, + ContainerType: "Bank", + ContainerGUID: event.ContainerID, + } + + log.Infof("Sending Bank container with %d items of %v to ingest.", len(items), state.CharacterName) + + sendMsgToPrivateUploaders(&upload, lib.NatsBankContainerData, state) +} diff --git a/client/event_equipment_item.go b/client/event_equipment_item.go new file mode 100644 index 0000000..054f137 --- /dev/null +++ b/client/event_equipment_item.go @@ -0,0 +1,24 @@ +package client + +import ( + "github.com/regner/albiondata-client/lib" + "github.com/regner/albiondata-client/log" +) + +type eventEquipmentItem struct { + IDInContainer int64 `mapstructure:"0"` + ItemIndex int64 `mapstructure:"1"` + Quantity int16 `mapstructure:"2"` + Creator string `mapstructure:"3"` + Quality byte `mapstructure:"4"` + Durability int64 `mapstructure:"5"` // was multiplied by 10000 +} + +func (event eventEquipmentItem) Process(state *albionState) { + log.Debug("Got equipment item event...") + + item := lib.ItemContainer{} + item.AsEquipmentItem(event.ItemIndex, event.Quantity, event.Creator, event.Quality, event.Durability) + + state.ContainerItemsToSend[event.IDInContainer] = item +} diff --git a/client/event_furniture_item.go b/client/event_furniture_item.go new file mode 100644 index 0000000..543aa23 --- /dev/null +++ b/client/event_furniture_item.go @@ -0,0 +1,23 @@ +package client + +import ( + "github.com/regner/albiondata-client/lib" + "github.com/regner/albiondata-client/log" +) + +type eventFurnitureItem struct { + IDInContainer int64 `mapstructure:"0"` + ItemIndex int64 `mapstructure:"1"` + Quantity int16 `mapstructure:"2"` + Creator string `mapstructure:"3"` + Durability int64 `mapstructure:"4"` // was multiplied by 10000 +} + +func (event eventFurnitureItem) Process(state *albionState) { + log.Debug("Got equipment item event...") + + item := lib.ItemContainer{} + item.AsFurnitureItem(event.ItemIndex, event.Quantity, event.Creator, event.Durability) + + state.ContainerItemsToSend[event.IDInContainer] = item +} diff --git a/client/event_generic_container_contents.go b/client/event_generic_container_contents.go new file mode 100644 index 0000000..f4d24b9 --- /dev/null +++ b/client/event_generic_container_contents.go @@ -0,0 +1,52 @@ +package client + +import ( + "github.com/regner/albiondata-client/lib" + "github.com/regner/albiondata-client/log" + "github.com/regner/albiondata-client/notification" +) + +type eventGenericContainerContents struct { + Slots []int64 `mapstructure:"1"` + ContainerID lib.CharacterID `mapstructure:"2"` +} + +func (event eventGenericContainerContents) Process(state *albionState) { + log.Debug("Got Generic container opening event...") + + items := []*lib.ItemContainer{} + + for _, v := range event.Slots { + if v == 0 { + continue + } + + item := state.ContainerItemsToSend[v] + items = append(items, &item) + } + + // clear the array to prepare for the next container opening + state.ContainerItemsToSend = make(map[int64]lib.ItemContainer) + + if len(items) < 1 { + return + } + + if state.LocationId == 0 { + msg := "The players location has not yet been set. Please transition zones so the location can be identified." + log.Warn(msg) + notification.Push(msg) + return + } + + upload := lib.ContainerUpload{ + Items: items, + CurrentLocation: state.LocationId, + ContainerType: "Generic", + ContainerGUID: event.ContainerID, + } + + log.Infof("Sending Generic container with %d items of %v to ingest", len(items), state.CharacterName) + + sendMsgToPrivateUploaders(&upload, lib.NatsGenericContainerData, state) +} diff --git a/client/event_journal_item.go b/client/event_journal_item.go new file mode 100644 index 0000000..4f14d02 --- /dev/null +++ b/client/event_journal_item.go @@ -0,0 +1,23 @@ +package client + +import ( + "github.com/regner/albiondata-client/lib" + "github.com/regner/albiondata-client/log" +) + +type eventJournalItem struct { + IDInContainer int64 `mapstructure:"0"` + ItemIndex int64 `mapstructure:"1"` + Quantity int16 `mapstructure:"2"` + Creator string `mapstructure:"3"` + FameStored int64 `mapstructure:"6"` // was multiplied by 10000 +} + +func (event eventJournalItem) Process(state *albionState) { + log.Debug("Got journal item event...") + + item := lib.ItemContainer{} + item.AsJournalItem(event.ItemIndex, event.Quantity, event.Creator, event.FameStored) + + state.ContainerItemsToSend[event.IDInContainer] = item +} diff --git a/client/event_stackable_item.go b/client/event_stackable_item.go new file mode 100644 index 0000000..297a6c0 --- /dev/null +++ b/client/event_stackable_item.go @@ -0,0 +1,21 @@ +package client + +import ( + "github.com/regner/albiondata-client/lib" + "github.com/regner/albiondata-client/log" +) + +type eventStackableItem struct { + IDInContainer int64 `mapstructure:"0"` + ItemIndex int64 `mapstructure:"1"` + Quantity int16 `mapstructure:"2"` +} + +func (event eventStackableItem) Process(state *albionState) { + log.Debug("Got stackable item event...") + + item := lib.ItemContainer{} + item.AsStackableItem(event.ItemIndex, event.Quantity) + + state.ContainerItemsToSend[event.IDInContainer] = item +} diff --git a/client/router.go b/client/router.go index a0712e0..9c7508a 100644 --- a/client/router.go +++ b/client/router.go @@ -1,6 +1,7 @@ package client import ( + "github.com/regner/albiondata-client/lib" "github.com/regner/albiondata-client/log" ) @@ -12,7 +13,7 @@ type Router struct { func newRouter() *Router { return &Router{ - albionstate: &albionState{}, + albionstate: &albionState{ContainerItemsToSend: make(map[int64]lib.ItemContainer)}, newOperation: make(chan operation, 1000), quit: make(chan bool, 1), } diff --git a/lib/container.go b/lib/container.go new file mode 100644 index 0000000..d13bc7f --- /dev/null +++ b/lib/container.go @@ -0,0 +1,10 @@ +package lib + +// ContainerUpload contains a list of items +type ContainerUpload struct { + PrivateUpload + Items []*ItemContainer `json:"Items"` + CurrentLocation int `json:"CurrentLocation"` + ContainerType string `json:"ContainerType"` + ContainerGUID CharacterID `json:"ContainerGUID"` +} diff --git a/lib/item.go b/lib/item.go new file mode 100644 index 0000000..a2d9017 --- /dev/null +++ b/lib/item.go @@ -0,0 +1,60 @@ +package lib + +type EquipmentItem struct { + ItemIndex int64 `json:"ItemIndex"` + Quantity int16 `json:"Quantity"` + Creator string `json:"Creator"` + Quality byte `json:"Quality"` + Durability int64 `json:"Durability"` // was multiplied by 10000 +} + +type StackableItem struct { + ItemIndex int64 `json:"ItemIndex"` + Quantity int16 `json:"Quantity"` +} + +type FurnitureItem struct { + ItemIndex int64 `json:"ItemIndex"` + Quantity int16 `json:"Quantity"` + Creator string `json:"Creator"` + Durability int64 `json:"Durability"` // was multiplied by 10000 +} + +type JournalItem struct { + ItemIndex int64 `json:"ItemIndex"` + Quantity int16 `json:"Quantity"` + Creator string `json:"Creator"` + FameStored int64 `json:"FameStored"` // was multiplied by 10000 +} + +const ( + ItemType_EquipmentItem = "EquipmentItem" + ItemType_FurnitureItem = "FurnitureItem" + ItemType_JournalItem = "JournalItem" + ItemType_StackableItem = "StackableItem" +) + +type ItemContainer struct { + Item interface{} `json:"Item"` + ItemType string `json:"ItemType"` +} + +func (container *ItemContainer) AsEquipmentItem(itemIndex int64, quantity int16, creator string, quality byte, durability int64) { + container.Item = EquipmentItem{ItemIndex: itemIndex, Quantity: quantity, Creator: creator, Quality: quality, Durability: durability} + container.ItemType = ItemType_EquipmentItem +} + +func (container *ItemContainer) AsStackableItem(itemIndex int64, quantity int16) { + container.Item = StackableItem{ItemIndex: itemIndex, Quantity: quantity} + container.ItemType = ItemType_StackableItem +} + +func (container *ItemContainer) AsFurnitureItem(itemIndex int64, quantity int16, creator string, durability int64) { + container.Item = FurnitureItem{ItemIndex: itemIndex, Quantity: quantity, Creator: creator, Durability: durability} + container.ItemType = ItemType_FurnitureItem +} + +func (container *ItemContainer) AsJournalItem(itemIndex int64, quantity int16, creator string, fameStored int64) { + container.Item = JournalItem{ItemIndex: itemIndex, Quantity: quantity, Creator: creator, FameStored: fameStored} + container.ItemType = ItemType_JournalItem +} diff --git a/lib/nats.go b/lib/nats.go index e39cc29..d759aff 100644 --- a/lib/nats.go +++ b/lib/nats.go @@ -10,6 +10,8 @@ const ( NatsMapDataDeduped = "mapdata.deduped" // Private Topics - NatsSkillData = "skills" - NatsMarketNotifications = "marketnotifications" + NatsSkillData = "skills" + NatsMarketNotifications = "marketnotifications" + NatsBankContainerData = "bank.container" + NatsGenericContainerData = "generic.container" )