diff --git a/CHANGELOG.md b/CHANGELOG.md index fd4032d96558d69c10ab1b6b6cd9e07d53d869e6..5e82240f8a4892ddc822d82f88f2f90c7ccfd760 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr ### Added - More flexible query-based filter when listing realtime multiplayer matches. - Runtime function to batch get groups by group ID. +- Allow authoritative match join attempts to carry metadata from the client. ### Changed - Improved cancellation of ongoing work when clients disconnect. diff --git a/data/modules/clientrpc.lua b/data/modules/clientrpc.lua index 72cf6fad3e687b65ae94f4f290a667ab9737c00b..e924b3934aa4207a327ff2eadb65c1a7f50018c9 100644 --- a/data/modules/clientrpc.lua +++ b/data/modules/clientrpc.lua @@ -65,8 +65,14 @@ local function send_stream_data(context, payload) end nk.register_rpc(send_stream_data, "clientrpc.send_stream_data") -local function create_authoritative_match(_context, _payload) - local match_id = nk.match_create("match", { debug = true }) +local function create_authoritative_match(_context, payload) + local decoded = nk.json_decode(payload) + local params = { + debug = (decoded and decoded.debug) or true, + label = (decoded and decoded.label) + } + + local match_id = nk.match_create("match", params) return nk.json_encode({ match_id = match_id }) end nk.register_rpc(create_authoritative_match, "clientrpc.create_authoritative_match") diff --git a/data/modules/match.lua b/data/modules/match.lua index 8b240fc5478018e000d7f8be796528ddba84e88b..29e5e691908bf22fa17c4a9612ba89d2764b3efb 100644 --- a/data/modules/match.lua +++ b/data/modules/match.lua @@ -86,13 +86,21 @@ Presence is the user attempting to join the match. Format: node: "name of the Nakama node the user is connected to" } +Metadata is an optional set of arbitrary key-value pairs received from the client. These may contain information +the client wishes to supply to the match handler in order to process the join attempt, for example: authentication or +match passwords, client version information, preferences etc. Format: +{ + key: "value" +} + Expected return these values (all required) in order: 1. An (optionally) updated state. May be any non-nil Lua term, or nil to end the match. 2. Boolean true if the join attempt should be allowed, false otherwise. --]] -local function match_join_attempt(context, dispatcher, tick, state, presence) +local function match_join_attempt(context, dispatcher, tick, state, presence, metadata) if state.debug then print("match join attempt:\n" .. du.print_r(presence)) + print("match join attempt metadata:\n" .. du.print_r(metadata)) end return state, true end diff --git a/data/modules/p2prelayer.lua b/data/modules/p2prelayer.lua index 78d774766ea43489b857a0ed9563f9b28deb5e85..0fcfb97d8748adf1a7c9e7d2cedcd2d8b2e3a134 100644 --- a/data/modules/p2prelayer.lua +++ b/data/modules/p2prelayer.lua @@ -52,4 +52,8 @@ function M.match_loop(context, dispatcher, tick, state, messages) end end +function M.match_terminate(context, dispatcher, tick, state, grace_seconds) + return nil +end + return M diff --git a/rtapi/realtime.pb.go b/rtapi/realtime.pb.go index 2be727a478d181d9c7d9fa7136883732d31237f3..0ca8664bf43c8c421966bcecd74686246e647b5c 100644 --- a/rtapi/realtime.pb.go +++ b/rtapi/realtime.pb.go @@ -1989,10 +1989,12 @@ type MatchJoin struct { // Types that are valid to be assigned to Id: // *MatchJoin_MatchId // *MatchJoin_Token - Id isMatchJoin_Id `protobuf_oneof:"id"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Id isMatchJoin_Id `protobuf_oneof:"id"` + // An optional set of key-value metadata pairs to be passed to the match handler, if any. + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *MatchJoin) Reset() { *m = MatchJoin{} } @@ -2057,6 +2059,13 @@ func (m *MatchJoin) GetToken() string { return "" } +func (m *MatchJoin) GetMetadata() map[string]string { + if m != nil { + return m.Metadata + } + return nil +} + // XXX_OneofFuncs is for the internal use of the proto package. func (*MatchJoin) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { return _MatchJoin_OneofMarshaler, _MatchJoin_OneofUnmarshaler, _MatchJoin_OneofSizer, []interface{}{ @@ -3145,6 +3154,7 @@ func init() { proto.RegisterType((*MatchData)(nil), "nakama.realtime.MatchData") proto.RegisterType((*MatchDataSend)(nil), "nakama.realtime.MatchDataSend") proto.RegisterType((*MatchJoin)(nil), "nakama.realtime.MatchJoin") + proto.RegisterMapType((map[string]string)(nil), "nakama.realtime.MatchJoin.MetadataEntry") proto.RegisterType((*MatchLeave)(nil), "nakama.realtime.MatchLeave") proto.RegisterType((*MatchPresenceEvent)(nil), "nakama.realtime.MatchPresenceEvent") proto.RegisterType((*MatchmakerAdd)(nil), "nakama.realtime.MatchmakerAdd") @@ -3171,138 +3181,140 @@ func init() { func init() { proto.RegisterFile("rtapi/realtime.proto", fileDescriptor_0163624496220f8c) } var fileDescriptor_0163624496220f8c = []byte{ - // 2127 bytes of a gzipped FileDescriptorProto + // 2156 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x59, 0xcd, 0x73, 0xe3, 0x48, - 0x15, 0xb7, 0xfc, 0x95, 0xf8, 0x25, 0x4e, 0x9c, 0x8e, 0x27, 0xa3, 0x75, 0x76, 0x32, 0x83, 0x66, - 0x29, 0x96, 0xa5, 0x70, 0x6a, 0x3e, 0xb6, 0x0a, 0x66, 0x61, 0xaa, 0x12, 0x5b, 0x89, 0x3d, 0x6c, - 0x6c, 0x97, 0x6c, 0xb3, 0xec, 0x54, 0x51, 0x2a, 0x45, 0xea, 0x49, 0xb4, 0xb1, 0x3e, 0x90, 0xe4, - 0xcc, 0x84, 0x13, 0xdc, 0xe0, 0xc2, 0x89, 0x1b, 0x27, 0x38, 0xc2, 0x0d, 0x6e, 0x1c, 0xb8, 0x71, - 0xe0, 0xce, 0x5f, 0xc2, 0x99, 0x03, 0xd5, 0x1f, 0x92, 0x25, 0xd9, 0xb2, 0x93, 0xdd, 0xaa, 0xa9, - 0xe2, 0xe6, 0x7e, 0xfd, 0x7b, 0xbf, 0xd7, 0x7a, 0xfd, 0xfa, 0xf5, 0x7b, 0x6d, 0xa8, 0x7b, 0x81, - 0xe6, 0x9a, 0x87, 0x1e, 0xd6, 0x26, 0x81, 0x69, 0xe1, 0xa6, 0xeb, 0x39, 0x81, 0x83, 0xb6, 0x6d, - 0xed, 0x4a, 0xb3, 0xb4, 0x66, 0x28, 0x6e, 0x3c, 0xbc, 0x70, 0x9c, 0x8b, 0x09, 0x3e, 0xa4, 0xd3, - 0xe7, 0xd3, 0x37, 0x87, 0x44, 0xea, 0x07, 0x9a, 0xe5, 0x32, 0x8d, 0xc6, 0x41, 0x1a, 0xf0, 0xd6, - 0xd3, 0x5c, 0x17, 0x7b, 0x3e, 0x9f, 0xff, 0xe4, 0xc2, 0x0c, 0x2e, 0xa7, 0xe7, 0x4d, 0xdd, 0xb1, - 0x0e, 0x2f, 0xb1, 0xe7, 0x98, 0xfa, 0x44, 0x3b, 0xf7, 0x0f, 0x99, 0x9d, 0x43, 0xb2, 0x04, 0xcd, - 0x35, 0x19, 0x56, 0xfa, 0xcb, 0x0e, 0xac, 0xcb, 0xf6, 0x35, 0x9e, 0x38, 0x2e, 0x46, 0x35, 0x28, - 0xe8, 0xa6, 0x21, 0x0a, 0x8f, 0x84, 0x8f, 0x2b, 0x0a, 0xf9, 0x89, 0x9e, 0xc3, 0x9a, 0x7e, 0xa9, - 0xd9, 0x36, 0x9e, 0x88, 0xf9, 0x47, 0xc2, 0xc7, 0x1b, 0x4f, 0xc5, 0x66, 0x6a, 0xb9, 0xcd, 0x16, - 0x9b, 0xef, 0xe4, 0x94, 0x10, 0x8a, 0x8e, 0x60, 0x93, 0xff, 0x54, 0xbf, 0x72, 0x4c, 0x5b, 0x2c, - 0x50, 0xd5, 0x0f, 0xb3, 0x54, 0x5f, 0x39, 0xa6, 0xdd, 0xc9, 0x29, 0x1b, 0xfa, 0x6c, 0x88, 0xda, - 0x50, 0x0d, 0x29, 0x26, 0x58, 0xbb, 0xc6, 0x62, 0x91, 0x72, 0x3c, 0xc8, 0xe2, 0xf8, 0x9c, 0x80, - 0x3a, 0x39, 0x25, 0x34, 0x4c, 0xc7, 0x48, 0x86, 0xed, 0x90, 0xc5, 0xc2, 0xbe, 0xaf, 0x5d, 0x60, - 0xb1, 0x44, 0x79, 0x1a, 0x21, 0x0f, 0xf1, 0x04, 0xa7, 0x38, 0x63, 0x88, 0x4e, 0x4e, 0xd9, 0xd2, - 0x13, 0x12, 0x34, 0x82, 0xdd, 0x14, 0x8d, 0xaa, 0xe9, 0x57, 0x62, 0x99, 0x52, 0x49, 0x59, 0x4b, - 0xe2, 0xda, 0x47, 0xfa, 0x55, 0x27, 0xa7, 0xec, 0xe8, 0x69, 0x21, 0xfa, 0x02, 0xea, 0x69, 0x56, - 0x1f, 0xdb, 0x86, 0xb8, 0x46, 0x69, 0x1f, 0xaf, 0xa0, 0x1d, 0x62, 0xdb, 0xe8, 0xe4, 0x14, 0xa4, - 0xcf, 0x49, 0xd1, 0xcf, 0x61, 0x2f, 0x4d, 0x3c, 0x75, 0x0d, 0x2d, 0xc0, 0xe2, 0x3a, 0xa5, 0xfe, - 0xf6, 0x0a, 0xea, 0x31, 0x05, 0x77, 0x72, 0x4a, 0x5d, 0x5f, 0x20, 0x5f, 0x44, 0xef, 0x61, 0xcb, - 0xb9, 0xc6, 0x62, 0xe5, 0x56, 0xf4, 0x0a, 0x05, 0xcf, 0xd3, 0x33, 0x79, 0x9c, 0xde, 0xf5, 0xb0, - 0x8f, 0x6d, 0x1d, 0xab, 0xf8, 0x1a, 0xdb, 0x81, 0x08, 0xcb, 0xe9, 0x07, 0x1c, 0x2d, 0x13, 0x70, - 0x8c, 0x3e, 0x21, 0x47, 0x4d, 0x28, 0x61, 0xcf, 0x73, 0x3c, 0x71, 0x83, 0xb2, 0xed, 0xcd, 0xb1, - 0xc9, 0x64, 0xb6, 0x93, 0x53, 0x18, 0x8c, 0xe0, 0x2d, 0x2d, 0xd0, 0x2f, 0xc5, 0xcd, 0x0c, 0xfc, - 0x19, 0x99, 0x25, 0x78, 0x0a, 0x23, 0xb1, 0x4f, 0x7f, 0xa8, 0xba, 0x87, 0x89, 0xcb, 0xab, 0x19, - 0xb1, 0x4f, 0xd5, 0x5a, 0x14, 0x43, 0x62, 0xdf, 0x9a, 0x0d, 0xd1, 0x67, 0x00, 0x8c, 0xc2, 0xd0, - 0x02, 0x4d, 0xdc, 0x4a, 0x06, 0x6c, 0x92, 0xa0, 0xad, 0x05, 0x5a, 0x27, 0xa7, 0x54, 0xac, 0x70, - 0x80, 0x3a, 0xb0, 0x3d, 0x53, 0x66, 0x01, 0xb5, 0x4d, 0x19, 0x0e, 0xb2, 0x19, 0x78, 0x2c, 0x55, - 0xad, 0xb8, 0x60, 0xb6, 0x0c, 0x7a, 0x86, 0x6b, 0xcb, 0x96, 0xc1, 0x4f, 0x30, 0x5b, 0x06, 0x3d, - 0xbf, 0x2f, 0x81, 0x7d, 0x12, 0x3f, 0xbd, 0x3b, 0x54, 0x7b, 0x7f, 0xb1, 0x76, 0x78, 0x76, 0x99, - 0x39, 0x76, 0x72, 0xbf, 0x80, 0x3a, 0xd3, 0x4f, 0xc5, 0x00, 0xca, 0x38, 0x1c, 0x94, 0x28, 0x1d, - 0x01, 0xc8, 0x9a, 0x93, 0xa2, 0x53, 0xd8, 0xa2, 0x52, 0x4b, 0xbb, 0xc2, 0x9e, 0xaa, 0x19, 0x86, - 0xb8, 0xbb, 0xcc, 0x3d, 0x14, 0x76, 0x64, 0xcc, 0xdc, 0x13, 0x0a, 0xd0, 0x10, 0x50, 0x8c, 0x88, - 0xfe, 0xc4, 0x86, 0x58, 0xcf, 0xc8, 0x09, 0x33, 0xb2, 0x33, 0x86, 0x24, 0x39, 0xc1, 0x4a, 0x0b, - 0xd1, 0x00, 0x62, 0xc2, 0xf0, 0x58, 0xdd, 0xa3, 0x9c, 0xdf, 0x5a, 0xc2, 0x19, 0x1d, 0xa9, 0x9a, - 0x95, 0x92, 0xa5, 0x18, 0x03, 0x53, 0xbf, 0xc2, 0x81, 0xb8, 0xb7, 0x92, 0x71, 0x44, 0x81, 0x49, - 0x46, 0x26, 0x43, 0x27, 0x50, 0xb5, 0x9d, 0xc0, 0x7c, 0x63, 0xea, 0x5a, 0x60, 0x3a, 0xb6, 0x2f, - 0xde, 0xcf, 0x70, 0x60, 0x2f, 0x8e, 0x22, 0x0e, 0x4c, 0xa8, 0xa1, 0xc7, 0x50, 0xf0, 0x5c, 0x5d, - 0x14, 0xa9, 0xf6, 0x76, 0x3c, 0x21, 0x2b, 0xae, 0xde, 0xc9, 0x29, 0x64, 0x16, 0x3d, 0x81, 0xb2, - 0x1f, 0x68, 0xc1, 0xd4, 0x17, 0x3f, 0xa0, 0xb8, 0xfb, 0x73, 0x56, 0x86, 0x74, 0xba, 0x93, 0x53, - 0x38, 0x90, 0x5c, 0x1d, 0xec, 0x97, 0xfa, 0xc6, 0x99, 0x4c, 0x9c, 0xb7, 0x62, 0x23, 0xe3, 0xea, - 0x60, 0x9a, 0x27, 0x14, 0x44, 0xae, 0x0e, 0x3f, 0x36, 0x46, 0xaf, 0xe1, 0x1e, 0x67, 0x49, 0x45, - 0xe0, 0x3e, 0x65, 0xfb, 0x28, 0x83, 0x2d, 0x1d, 0x82, 0xbb, 0xfe, 0xbc, 0x18, 0xbd, 0x82, 0x6d, - 0xce, 0x3d, 0xb5, 0xf9, 0x1a, 0x3f, 0xa4, 0xac, 0x0f, 0x33, 0x58, 0xc7, 0x1c, 0x46, 0xee, 0x26, - 0x3f, 0x21, 0x89, 0x7d, 0x2d, 0xcf, 0xf1, 0x0f, 0x96, 0x7e, 0x6d, 0x94, 0xdb, 0xf9, 0xd7, 0xf2, - 0x9c, 0xfe, 0x12, 0x36, 0xfc, 0xc0, 0xc3, 0x9a, 0xc5, 0x72, 0xce, 0x41, 0xc6, 0x71, 0x1d, 0x52, - 0x0c, 0x4f, 0x3a, 0xe0, 0x47, 0x23, 0xe6, 0x2d, 0xaa, 0x9f, 0xf2, 0xd6, 0xc3, 0x4c, 0x6f, 0x11, - 0xf4, 0x02, 0x6f, 0xcd, 0x89, 0x8f, 0x2b, 0xb0, 0xc6, 0xef, 0x19, 0xe9, 0xb7, 0x02, 0xac, 0xf1, - 0x6c, 0x8f, 0xb6, 0x20, 0x1f, 0xd5, 0x2a, 0x79, 0x93, 0xa4, 0xab, 0x4a, 0x68, 0xdb, 0x17, 0xf3, - 0x8f, 0x0a, 0x0b, 0x9d, 0x30, 0xf6, 0xb1, 0x17, 0xb2, 0x2b, 0x33, 0x3c, 0x7a, 0x02, 0x45, 0x1f, - 0x4f, 0xde, 0xf0, 0x4a, 0x65, 0x85, 0x1e, 0x85, 0x4a, 0xff, 0x11, 0x60, 0x23, 0x56, 0xc0, 0xa0, - 0x3d, 0x28, 0x07, 0x9a, 0x77, 0x81, 0x03, 0xbe, 0x26, 0x3e, 0x42, 0x08, 0x8a, 0xc1, 0x8d, 0x8b, - 0x69, 0xfd, 0x54, 0x52, 0xe8, 0x6f, 0xf4, 0x23, 0xd8, 0x20, 0xf5, 0x9a, 0xe9, 0x07, 0x84, 0x90, - 0x5b, 0x6d, 0x34, 0x59, 0x5d, 0xd7, 0x0c, 0xeb, 0xba, 0xe6, 0xb1, 0xe3, 0x4c, 0x7e, 0xaa, 0x4d, - 0xa6, 0x58, 0x89, 0xc3, 0xd1, 0x53, 0x28, 0x5f, 0x9a, 0x86, 0x81, 0x6d, 0x5e, 0x14, 0x2d, 0x53, - 0xe4, 0x48, 0x49, 0x86, 0xe2, 0x88, 0x58, 0xae, 0x43, 0x6d, 0xf4, 0xe5, 0x40, 0x56, 0xc7, 0xbd, - 0xe1, 0x40, 0x6e, 0x75, 0x4f, 0xba, 0x72, 0xbb, 0x96, 0x43, 0xeb, 0x50, 0x54, 0xfa, 0xfd, 0xb3, - 0x9a, 0x80, 0x10, 0x6c, 0xb5, 0xbb, 0x8a, 0xdc, 0x1a, 0xa9, 0x67, 0xf2, 0x70, 0x78, 0x74, 0x2a, - 0xd7, 0xf2, 0xa8, 0x02, 0xa5, 0x53, 0xa5, 0x3f, 0x1e, 0xd4, 0x0a, 0xd2, 0xf7, 0x61, 0x33, 0x5e, - 0x70, 0xa1, 0x07, 0x00, 0xe1, 0x65, 0x1d, 0x6d, 0x46, 0x85, 0x4b, 0xba, 0x86, 0xf4, 0xef, 0x3c, - 0xec, 0xcc, 0x55, 0x43, 0x2b, 0x94, 0xc8, 0x74, 0x58, 0x57, 0x98, 0x06, 0x75, 0x5b, 0x45, 0xa9, - 0x70, 0x49, 0xd7, 0x40, 0x87, 0x50, 0xd4, 0x1d, 0x23, 0x74, 0xda, 0xfe, 0xdc, 0xb7, 0x77, 0xed, - 0xe0, 0xd9, 0x53, 0xf6, 0xf1, 0x14, 0x88, 0x1a, 0xb0, 0x3e, 0xf5, 0xb1, 0x67, 0x6b, 0x16, 0xab, - 0x22, 0x2b, 0x4a, 0x34, 0x46, 0x9f, 0xc1, 0x06, 0xbb, 0xa7, 0x55, 0xb2, 0xcd, 0x51, 0x71, 0x98, - 0xe6, 0x1c, 0x85, 0x15, 0xb8, 0x02, 0x0c, 0x4e, 0x04, 0x44, 0x99, 0x9d, 0x39, 0xa6, 0x5c, 0x5e, - 0xad, 0xcc, 0xe0, 0x54, 0xf9, 0x05, 0x40, 0xb4, 0xa7, 0x01, 0xaf, 0xf9, 0x96, 0x6d, 0x64, 0x0c, - 0x2d, 0x9d, 0x01, 0x9a, 0x2f, 0x06, 0x57, 0xb9, 0x55, 0x84, 0x35, 0xdd, 0xb1, 0xa9, 0x35, 0xe6, - 0xd3, 0x70, 0x28, 0xd9, 0x50, 0x5f, 0x54, 0x00, 0x7e, 0xc3, 0x7d, 0x8a, 0xd9, 0x2b, 0x24, 0xed, - 0x8d, 0xd2, 0xf6, 0xf8, 0x55, 0xf5, 0x8d, 0xec, 0x49, 0x7f, 0x14, 0x22, 0xda, 0x64, 0xb6, 0x5d, - 0x41, 0xfb, 0x0c, 0x4a, 0xa4, 0xc0, 0xb9, 0x65, 0xce, 0x60, 0x58, 0xf4, 0x29, 0x94, 0x69, 0x61, - 0xe3, 0x8b, 0x85, 0xdb, 0x68, 0x71, 0xb0, 0xf4, 0xdf, 0x3c, 0x94, 0x68, 0x7d, 0x49, 0xb2, 0x02, - 0x8d, 0x62, 0x81, 0x65, 0x05, 0x1a, 0xa8, 0x62, 0x94, 0xe8, 0xc2, 0x1d, 0xe2, 0x43, 0xf4, 0x63, - 0xee, 0xcb, 0x77, 0x01, 0xb7, 0xf7, 0x78, 0x71, 0xd9, 0xda, 0x6c, 0x31, 0x94, 0x6c, 0x07, 0xde, - 0x8d, 0x12, 0xea, 0x34, 0x5e, 0xc0, 0x66, 0x7c, 0x82, 0xf4, 0x79, 0x57, 0xf8, 0x26, 0xec, 0xf3, - 0xae, 0xf0, 0x0d, 0xaa, 0x43, 0xe9, 0x9a, 0x84, 0x19, 0x37, 0xcc, 0x06, 0x2f, 0xf2, 0x3f, 0x10, - 0xa4, 0x7f, 0x09, 0x50, 0x6c, 0x91, 0xd5, 0xdd, 0x83, 0x1d, 0x65, 0xdc, 0x1b, 0x75, 0xcf, 0x64, - 0x55, 0xfe, 0x59, 0x4b, 0x1e, 0x8c, 0xba, 0xfd, 0x5e, 0x2d, 0x87, 0x44, 0xa8, 0x8f, 0x7b, 0x8a, - 0xdc, 0xea, 0x9f, 0xf6, 0xba, 0xaf, 0xe5, 0xb6, 0x3a, 0x38, 0xfa, 0xf2, 0xf3, 0xfe, 0x51, 0xbb, - 0x26, 0xa0, 0x5d, 0xd8, 0x3e, 0xeb, 0x0e, 0x87, 0xdd, 0xde, 0x69, 0x24, 0xcc, 0xa3, 0x2a, 0x54, - 0x8e, 0x8f, 0xda, 0x6a, 0xb7, 0x37, 0x18, 0x8f, 0x6a, 0x05, 0x8a, 0x39, 0x1a, 0xb5, 0x3a, 0x6a, - 0xaf, 0x3f, 0x52, 0x4f, 0xfa, 0xe3, 0x5e, 0xbb, 0x56, 0x44, 0xf7, 0x61, 0x97, 0x09, 0x5f, 0xf5, - 0xbb, 0x3d, 0x55, 0x91, 0x5f, 0xc9, 0xad, 0x91, 0xdc, 0xae, 0x95, 0xd0, 0x01, 0x34, 0xc2, 0x25, - 0x9c, 0x8c, 0x7b, 0x2d, 0xb2, 0x82, 0x98, 0x62, 0x79, 0xe1, 0xfc, 0x6c, 0xad, 0x6b, 0xd2, 0xaf, - 0xf2, 0x50, 0xa2, 0x25, 0x0e, 0xfa, 0x00, 0xd6, 0x59, 0x79, 0x19, 0x45, 0xc4, 0x1a, 0x1d, 0x77, - 0x0d, 0xf4, 0x11, 0x54, 0xb5, 0x69, 0x70, 0xe9, 0x78, 0x66, 0xa0, 0x05, 0xe6, 0x35, 0x73, 0xc9, - 0xba, 0x92, 0x14, 0xa2, 0xa7, 0x50, 0x9a, 0x68, 0xe7, 0x78, 0x12, 0xf5, 0xb6, 0xe9, 0x93, 0x3b, - 0x0c, 0x3c, 0xd3, 0xbe, 0x60, 0x67, 0x97, 0x41, 0xc9, 0x9e, 0xfb, 0xe6, 0x2f, 0x59, 0x12, 0x2a, - 0x29, 0xf4, 0x77, 0xf2, 0xd6, 0x2a, 0x7d, 0xcd, 0x5b, 0xab, 0x7c, 0xfb, 0x5b, 0xab, 0x0a, 0x1b, - 0xb1, 0xce, 0x43, 0xfa, 0x9d, 0x00, 0x95, 0xa8, 0x0d, 0x58, 0xe6, 0x95, 0x1f, 0xc2, 0x7a, 0x68, - 0x97, 0xbf, 0x04, 0xac, 0x30, 0x17, 0xc1, 0xd1, 0x7d, 0x58, 0x73, 0x5c, 0x35, 0xca, 0xd9, 0x05, - 0xa5, 0xec, 0xb8, 0x34, 0xa2, 0x10, 0x14, 0x69, 0xb5, 0x41, 0xfc, 0xb1, 0xa9, 0xd0, 0xdf, 0xd2, - 0xef, 0x05, 0xa8, 0x26, 0xfa, 0x92, 0x65, 0x8b, 0x8a, 0x31, 0xe7, 0x17, 0x32, 0x17, 0x66, 0xcc, - 0x49, 0x4f, 0x17, 0xef, 0xe6, 0x69, 0xe9, 0x84, 0xbb, 0x89, 0xde, 0xf4, 0xfb, 0xe9, 0x15, 0x75, - 0x72, 0xb3, 0x35, 0xed, 0x41, 0x29, 0x70, 0xae, 0xb0, 0xcd, 0x4e, 0x12, 0xe9, 0x0b, 0xe9, 0xf0, - 0xb8, 0x48, 0xca, 0x15, 0xe9, 0x3b, 0x00, 0xb3, 0x96, 0x67, 0xc9, 0xa7, 0x49, 0x7f, 0x10, 0x00, - 0xcd, 0xf7, 0x34, 0xcb, 0x9c, 0xf1, 0x3e, 0xf3, 0xd8, 0xdf, 0x0a, 0x7c, 0x97, 0xa2, 0x6e, 0x68, - 0x1f, 0x2a, 0x96, 0x69, 0xab, 0xba, 0x33, 0xb5, 0x03, 0x9e, 0xd4, 0xd6, 0x2d, 0xd3, 0x6e, 0x91, - 0x31, 0x9d, 0xd4, 0xde, 0xf1, 0xc9, 0x3c, 0x9f, 0xd4, 0xde, 0xb1, 0xc9, 0x3a, 0x94, 0x7e, 0x31, - 0xc5, 0xde, 0x0d, 0xbf, 0x25, 0xd8, 0x00, 0x69, 0xb0, 0xe3, 0xd3, 0x13, 0xa4, 0xba, 0x9e, 0xe3, - 0x62, 0x2f, 0x30, 0xa3, 0x5d, 0x7b, 0xbe, 0xbc, 0x53, 0xe3, 0x27, 0x6f, 0x10, 0xa9, 0xb1, 0x64, - 0x58, 0xf3, 0x53, 0x62, 0x64, 0x00, 0xb2, 0xa7, 0x16, 0xf6, 0x4c, 0x3d, 0x6e, 0x83, 0x9d, 0xc1, - 0x4f, 0x57, 0xd8, 0xe8, 0x31, 0xc5, 0xb4, 0x91, 0x1d, 0x3b, 0x2d, 0x6f, 0xb4, 0xe0, 0xde, 0xc2, - 0x05, 0xdd, 0x25, 0x09, 0x37, 0xda, 0xb0, 0xb7, 0xd8, 0xe2, 0x2a, 0x16, 0x21, 0x9e, 0xca, 0xff, - 0x51, 0x82, 0x9d, 0xb9, 0x3e, 0x94, 0xd6, 0xad, 0xac, 0x2b, 0x0c, 0xeb, 0x56, 0xd6, 0xe6, 0xc5, - 0xa3, 0x3c, 0x9f, 0x19, 0xe5, 0x85, 0x44, 0x94, 0xa3, 0x53, 0x28, 0x91, 0xda, 0x2a, 0xdc, 0xaa, - 0x27, 0xab, 0xfb, 0xe0, 0x98, 0x84, 0x84, 0x9a, 0xc2, 0xf4, 0x91, 0xcc, 0x53, 0x1b, 0xab, 0xc8, - 0xbe, 0x06, 0x0f, 0x55, 0x6f, 0xfc, 0xb3, 0x00, 0x5b, 0xc9, 0x89, 0x44, 0x26, 0x13, 0xee, 0x96, - 0xc9, 0x82, 0x45, 0x41, 0xc9, 0x02, 0xe6, 0xf4, 0xce, 0x2b, 0xbc, 0x75, 0x9c, 0xbe, 0x5d, 0x18, - 0xa7, 0x65, 0x6a, 0xb6, 0x73, 0x77, 0xb3, 0xff, 0x8f, 0xa1, 0xcb, 0xb3, 0xe7, 0x27, 0x50, 0x4b, - 0xbf, 0x79, 0x64, 0x85, 0x6f, 0x12, 0xcb, 0x5f, 0x2e, 0xb2, 0xb0, 0x7d, 0xa8, 0x26, 0xde, 0x2a, - 0xd0, 0xcb, 0xf4, 0x13, 0x87, 0x40, 0xbd, 0x2d, 0xc6, 0x1f, 0x29, 0xe2, 0x1a, 0xa9, 0xa7, 0x0d, - 0x49, 0x86, 0x32, 0x6b, 0xb7, 0x93, 0xb7, 0x8e, 0x70, 0xc7, 0x5b, 0xe7, 0xbb, 0xb0, 0x19, 0x7f, - 0xa3, 0x20, 0xd9, 0x9f, 0x9c, 0x0e, 0xd5, 0x34, 0x18, 0x57, 0x45, 0x59, 0x23, 0xe3, 0xae, 0xe1, - 0x4b, 0xbf, 0x16, 0x60, 0x77, 0xc1, 0x0b, 0xc4, 0x7b, 0xbd, 0x15, 0xbe, 0x07, 0x5b, 0xc9, 0xe7, - 0x8a, 0x65, 0x0b, 0x6e, 0x87, 0xdf, 0xc6, 0x9b, 0x8d, 0xe7, 0xd1, 0x43, 0x8f, 0x70, 0x8b, 0x8a, - 0x8a, 0x63, 0xa5, 0x09, 0x71, 0xb4, 0x87, 0x35, 0x8b, 0x5c, 0xf9, 0x56, 0xac, 0xa0, 0xb6, 0x78, - 0x41, 0xed, 0x4f, 0xcf, 0xbf, 0xc2, 0x7a, 0xd4, 0xf2, 0xf0, 0x21, 0x3a, 0x00, 0x30, 0xb0, 0xaf, - 0x7b, 0xa6, 0x1b, 0x38, 0x1e, 0xbf, 0x79, 0x62, 0x12, 0x12, 0x89, 0xac, 0xbc, 0x63, 0x0d, 0x23, - 0x1b, 0x48, 0xbf, 0x11, 0x00, 0x66, 0x4f, 0x20, 0xe8, 0x90, 0x2c, 0x99, 0x8c, 0xf8, 0x92, 0xef, - 0x67, 0xbc, 0x72, 0x28, 0x1c, 0x46, 0xfc, 0xea, 0x63, 0xdb, 0xc0, 0xde, 0xed, 0x4a, 0x28, 0x0e, - 0x4e, 0x54, 0x33, 0x15, 0x5e, 0x27, 0xfd, 0x95, 0xee, 0xf7, 0xdc, 0x63, 0xc9, 0xdd, 0xd7, 0xf4, - 0x3e, 0x03, 0xe4, 0xef, 0x02, 0x6c, 0xc6, 0x27, 0x48, 0x01, 0xc7, 0xe3, 0x23, 0x3c, 0x91, 0x2c, - 0x3c, 0x48, 0xcf, 0xe6, 0x63, 0xdf, 0x37, 0x1d, 0x3b, 0xd6, 0xeb, 0x71, 0x49, 0xd7, 0x48, 0xb4, - 0xf4, 0x85, 0x54, 0x4b, 0xff, 0x28, 0xf9, 0xb6, 0x52, 0xa4, 0xd5, 0x7b, 0xe2, 0xfd, 0x64, 0x16, - 0x6a, 0xa5, 0xdb, 0x87, 0xda, 0xf1, 0x09, 0xec, 0xeb, 0x8e, 0xd5, 0x9c, 0xfd, 0xa1, 0x16, 0x7d, - 0x73, 0xa0, 0xb9, 0xe6, 0xf1, 0x56, 0x8f, 0x8e, 0x14, 0xee, 0x80, 0x81, 0xf0, 0xba, 0x44, 0x27, - 0xfe, 0x94, 0x2f, 0xf6, 0x7e, 0x32, 0x38, 0xfe, 0x73, 0xbe, 0xcc, 0x00, 0xe7, 0x65, 0x6a, 0xe5, - 0xd9, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xf3, 0xd4, 0x54, 0x0e, 0x1c, 0x00, 0x00, + 0x15, 0xb7, 0xfc, 0x95, 0xf8, 0x25, 0x4e, 0x9c, 0x8e, 0x27, 0xd1, 0x3a, 0x3b, 0x99, 0x41, 0xb3, + 0x14, 0xc3, 0x52, 0x38, 0x35, 0x1f, 0x5b, 0x05, 0x33, 0x30, 0x55, 0x89, 0xad, 0xc4, 0x1e, 0xd6, + 0x1f, 0x25, 0xdb, 0x2c, 0x3b, 0x55, 0x94, 0x4a, 0x91, 0x7a, 0x12, 0x6d, 0x2c, 0xc9, 0x48, 0x72, + 0x66, 0xc2, 0x09, 0x6e, 0x70, 0xe1, 0xc4, 0x8d, 0x13, 0x1c, 0xe1, 0x06, 0x37, 0x0e, 0xdc, 0x38, + 0x70, 0xe7, 0x2f, 0xe1, 0xcc, 0x81, 0xea, 0x0f, 0xc9, 0x92, 0x6c, 0xd9, 0xc9, 0x6e, 0xd5, 0x54, + 0x71, 0x73, 0xbf, 0xfe, 0xbd, 0x5f, 0xb7, 0x5e, 0xbf, 0xf7, 0xfa, 0xbd, 0x36, 0x54, 0x5d, 0x5f, + 0x9b, 0x98, 0x47, 0x2e, 0xd6, 0xc6, 0xbe, 0x69, 0xe1, 0xfa, 0xc4, 0x75, 0x7c, 0x07, 0x6d, 0xdb, + 0xda, 0x95, 0x66, 0x69, 0xf5, 0x40, 0x5c, 0x7b, 0x70, 0xe1, 0x38, 0x17, 0x63, 0x7c, 0x44, 0xa7, + 0xcf, 0xa7, 0x6f, 0x8f, 0x88, 0xd4, 0xf3, 0x35, 0x6b, 0xc2, 0x34, 0x6a, 0x87, 0x49, 0xc0, 0x3b, + 0x57, 0x9b, 0x4c, 0xb0, 0xeb, 0xf1, 0xf9, 0x4f, 0x2f, 0x4c, 0xff, 0x72, 0x7a, 0x5e, 0xd7, 0x1d, + 0xeb, 0xe8, 0x12, 0xbb, 0x8e, 0xa9, 0x8f, 0xb5, 0x73, 0xef, 0x88, 0xad, 0x73, 0x44, 0xb6, 0xa0, + 0x4d, 0x4c, 0x86, 0x95, 0xfe, 0xb2, 0x03, 0xeb, 0xb2, 0x7d, 0x8d, 0xc7, 0xce, 0x04, 0xa3, 0x0a, + 0xe4, 0x74, 0xd3, 0x10, 0x85, 0x87, 0xc2, 0xe3, 0x92, 0x42, 0x7e, 0xa2, 0xe7, 0xb0, 0xa6, 0x5f, + 0x6a, 0xb6, 0x8d, 0xc7, 0x62, 0xf6, 0xa1, 0xf0, 0x78, 0xe3, 0xa9, 0x58, 0x4f, 0x6c, 0xb7, 0xde, + 0x60, 0xf3, 0xad, 0x8c, 0x12, 0x40, 0xd1, 0x31, 0x6c, 0xf2, 0x9f, 0xea, 0x57, 0x8e, 0x69, 0x8b, + 0x39, 0xaa, 0xfa, 0x71, 0x9a, 0xea, 0x6b, 0xc7, 0xb4, 0x5b, 0x19, 0x65, 0x43, 0x9f, 0x0d, 0x51, + 0x13, 0xca, 0x01, 0xc5, 0x18, 0x6b, 0xd7, 0x58, 0xcc, 0x53, 0x8e, 0xfb, 0x69, 0x1c, 0x9f, 0x13, + 0x50, 0x2b, 0xa3, 0x04, 0x0b, 0xd3, 0x31, 0x92, 0x61, 0x3b, 0x60, 0xb1, 0xb0, 0xe7, 0x69, 0x17, + 0x58, 0x2c, 0x50, 0x9e, 0x5a, 0xc0, 0x43, 0x2c, 0xc1, 0x29, 0x3a, 0x0c, 0xd1, 0xca, 0x28, 0x5b, + 0x7a, 0x4c, 0x82, 0x86, 0xb0, 0x9b, 0xa0, 0x51, 0x35, 0xfd, 0x4a, 0x2c, 0x52, 0x2a, 0x29, 0x6d, + 0x4b, 0x5c, 0xfb, 0x58, 0xbf, 0x6a, 0x65, 0x94, 0x1d, 0x3d, 0x29, 0x44, 0x5f, 0x40, 0x35, 0xc9, + 0xea, 0x61, 0xdb, 0x10, 0xd7, 0x28, 0xed, 0xa3, 0x15, 0xb4, 0x03, 0x6c, 0x1b, 0xad, 0x8c, 0x82, + 0xf4, 0x39, 0x29, 0xfa, 0x39, 0xec, 0x25, 0x89, 0xa7, 0x13, 0x43, 0xf3, 0xb1, 0xb8, 0x4e, 0xa9, + 0xbf, 0xbd, 0x82, 0x7a, 0x44, 0xc1, 0xad, 0x8c, 0x52, 0xd5, 0x17, 0xc8, 0x17, 0xd1, 0xbb, 0xd8, + 0x72, 0xae, 0xb1, 0x58, 0xba, 0x15, 0xbd, 0x42, 0xc1, 0xf3, 0xf4, 0x4c, 0x1e, 0xa5, 0x9f, 0xb8, + 0xd8, 0xc3, 0xb6, 0x8e, 0x55, 0x7c, 0x8d, 0x6d, 0x5f, 0x84, 0xe5, 0xf4, 0x7d, 0x8e, 0x96, 0x09, + 0x38, 0x42, 0x1f, 0x93, 0xa3, 0x3a, 0x14, 0xb0, 0xeb, 0x3a, 0xae, 0xb8, 0x41, 0xd9, 0xf6, 0xe6, + 0xd8, 0x64, 0x32, 0xdb, 0xca, 0x28, 0x0c, 0x46, 0xf0, 0x96, 0xe6, 0xeb, 0x97, 0xe2, 0x66, 0x0a, + 0xbe, 0x43, 0x66, 0x09, 0x9e, 0xc2, 0x88, 0xef, 0xd3, 0x1f, 0xaa, 0xee, 0x62, 0x62, 0xf2, 0x72, + 0x8a, 0xef, 0x53, 0xb5, 0x06, 0xc5, 0x10, 0xdf, 0xb7, 0x66, 0x43, 0xf4, 0x12, 0x80, 0x51, 0x18, + 0x9a, 0xaf, 0x89, 0x5b, 0x71, 0x87, 0x8d, 0x13, 0x34, 0x35, 0x5f, 0x6b, 0x65, 0x94, 0x92, 0x15, + 0x0c, 0x50, 0x0b, 0xb6, 0x67, 0xca, 0xcc, 0xa1, 0xb6, 0x29, 0xc3, 0x61, 0x3a, 0x03, 0xf7, 0xa5, + 0xb2, 0x15, 0x15, 0xcc, 0xb6, 0x41, 0x63, 0xb8, 0xb2, 0x6c, 0x1b, 0x3c, 0x82, 0xd9, 0x36, 0x68, + 0xfc, 0xbe, 0x02, 0xf6, 0x49, 0x3c, 0x7a, 0x77, 0xa8, 0xf6, 0xc1, 0x62, 0xed, 0x20, 0x76, 0xd9, + 0x72, 0x2c, 0x72, 0xbf, 0x80, 0x2a, 0xd3, 0x4f, 0xf8, 0x00, 0x4a, 0x09, 0x0e, 0x4a, 0x94, 0xf4, + 0x00, 0x64, 0xcd, 0x49, 0xd1, 0x19, 0x6c, 0x51, 0xa9, 0xa5, 0x5d, 0x61, 0x57, 0xd5, 0x0c, 0x43, + 0xdc, 0x5d, 0x66, 0x1e, 0x0a, 0x3b, 0x36, 0x66, 0xe6, 0x09, 0x04, 0x68, 0x00, 0x28, 0x42, 0x44, + 0x7f, 0x62, 0x43, 0xac, 0xa6, 0xe4, 0x84, 0x19, 0x59, 0x87, 0x21, 0x49, 0x4e, 0xb0, 0x92, 0x42, + 0xd4, 0x87, 0x88, 0x30, 0x08, 0xab, 0x7b, 0x94, 0xf3, 0x5b, 0x4b, 0x38, 0xc3, 0x90, 0xaa, 0x58, + 0x09, 0x59, 0x82, 0xd1, 0x37, 0xf5, 0x2b, 0xec, 0x8b, 0x7b, 0x2b, 0x19, 0x87, 0x14, 0x18, 0x67, + 0x64, 0x32, 0x74, 0x0a, 0x65, 0xdb, 0xf1, 0xcd, 0xb7, 0xa6, 0xae, 0xf9, 0xa6, 0x63, 0x7b, 0xe2, + 0x7e, 0x8a, 0x01, 0xbb, 0x51, 0x14, 0x31, 0x60, 0x4c, 0x0d, 0x3d, 0x82, 0x9c, 0x3b, 0xd1, 0x45, + 0x91, 0x6a, 0x6f, 0x47, 0x13, 0xb2, 0x32, 0xd1, 0x5b, 0x19, 0x85, 0xcc, 0xa2, 0x27, 0x50, 0xf4, + 0x7c, 0xcd, 0x9f, 0x7a, 0xe2, 0x47, 0x14, 0xb7, 0x3f, 0xb7, 0xca, 0x80, 0x4e, 0xb7, 0x32, 0x0a, + 0x07, 0x92, 0xab, 0x83, 0xfd, 0x52, 0xdf, 0x3a, 0xe3, 0xb1, 0xf3, 0x4e, 0xac, 0xa5, 0x5c, 0x1d, + 0x4c, 0xf3, 0x94, 0x82, 0xc8, 0xd5, 0xe1, 0x45, 0xc6, 0xe8, 0x0d, 0xdc, 0xe3, 0x2c, 0x09, 0x0f, + 0x3c, 0xa0, 0x6c, 0x9f, 0xa4, 0xb0, 0x25, 0x5d, 0x70, 0xd7, 0x9b, 0x17, 0xa3, 0xd7, 0xb0, 0xcd, + 0xb9, 0xa7, 0x36, 0xdf, 0xe3, 0xc7, 0x94, 0xf5, 0x41, 0x0a, 0xeb, 0x88, 0xc3, 0xc8, 0xdd, 0xe4, + 0xc5, 0x24, 0x91, 0xaf, 0xe5, 0x39, 0xfe, 0xfe, 0xd2, 0xaf, 0x0d, 0x73, 0x3b, 0xff, 0x5a, 0x9e, + 0xd3, 0x5f, 0xc1, 0x86, 0xe7, 0xbb, 0x58, 0xb3, 0x58, 0xce, 0x39, 0x4c, 0x09, 0xd7, 0x01, 0xc5, + 0xf0, 0xa4, 0x03, 0x5e, 0x38, 0x62, 0xd6, 0xa2, 0xfa, 0x09, 0x6b, 0x3d, 0x48, 0xb5, 0x16, 0x41, + 0x2f, 0xb0, 0xd6, 0x9c, 0xf8, 0xa4, 0x04, 0x6b, 0xfc, 0x9e, 0x91, 0x7e, 0x2b, 0xc0, 0x1a, 0xcf, + 0xf6, 0x68, 0x0b, 0xb2, 0x61, 0xad, 0x92, 0x35, 0x49, 0xba, 0x2a, 0x05, 0x6b, 0x7b, 0x62, 0xf6, + 0x61, 0x6e, 0xa1, 0x11, 0x46, 0x1e, 0x76, 0x03, 0x76, 0x65, 0x86, 0x47, 0x4f, 0x20, 0xef, 0xe1, + 0xf1, 0x5b, 0x5e, 0xa9, 0xac, 0xd0, 0xa3, 0x50, 0xe9, 0x3f, 0x02, 0x6c, 0x44, 0x0a, 0x18, 0xb4, + 0x07, 0x45, 0x5f, 0x73, 0x2f, 0xb0, 0xcf, 0xf7, 0xc4, 0x47, 0x08, 0x41, 0xde, 0xbf, 0x99, 0x60, + 0x5a, 0x3f, 0x15, 0x14, 0xfa, 0x1b, 0xfd, 0x08, 0x36, 0x48, 0xbd, 0x66, 0x7a, 0x3e, 0x21, 0xe4, + 0xab, 0xd6, 0xea, 0xac, 0xae, 0xab, 0x07, 0x75, 0x5d, 0xfd, 0xc4, 0x71, 0xc6, 0x3f, 0xd5, 0xc6, + 0x53, 0xac, 0x44, 0xe1, 0xe8, 0x29, 0x14, 0x2f, 0x4d, 0xc3, 0xc0, 0x36, 0x2f, 0x8a, 0x96, 0x29, + 0x72, 0xa4, 0x24, 0x43, 0x7e, 0x48, 0x56, 0xae, 0x42, 0x65, 0xf8, 0x65, 0x5f, 0x56, 0x47, 0xdd, + 0x41, 0x5f, 0x6e, 0xb4, 0x4f, 0xdb, 0x72, 0xb3, 0x92, 0x41, 0xeb, 0x90, 0x57, 0x7a, 0xbd, 0x4e, + 0x45, 0x40, 0x08, 0xb6, 0x9a, 0x6d, 0x45, 0x6e, 0x0c, 0xd5, 0x8e, 0x3c, 0x18, 0x1c, 0x9f, 0xc9, + 0x95, 0x2c, 0x2a, 0x41, 0xe1, 0x4c, 0xe9, 0x8d, 0xfa, 0x95, 0x9c, 0xf4, 0x7d, 0xd8, 0x8c, 0x16, + 0x5c, 0xe8, 0x3e, 0x40, 0x70, 0x59, 0x87, 0x87, 0x51, 0xe2, 0x92, 0xb6, 0x21, 0xfd, 0x3b, 0x0b, + 0x3b, 0x73, 0xd5, 0xd0, 0x0a, 0x25, 0x32, 0x1d, 0xd4, 0x15, 0xa6, 0x41, 0xcd, 0x56, 0x52, 0x4a, + 0x5c, 0xd2, 0x36, 0xd0, 0x11, 0xe4, 0x75, 0xc7, 0x08, 0x8c, 0x76, 0x30, 0xf7, 0xed, 0x6d, 0xdb, + 0x7f, 0xf6, 0x94, 0x7d, 0x3c, 0x05, 0xa2, 0x1a, 0xac, 0x4f, 0x3d, 0xec, 0xda, 0x9a, 0xc5, 0xaa, + 0xc8, 0x92, 0x12, 0x8e, 0xd1, 0x4b, 0xd8, 0x60, 0xf7, 0xb4, 0x4a, 0x8e, 0x39, 0x2c, 0x0e, 0x93, + 0x9c, 0xc3, 0xa0, 0x02, 0x57, 0x80, 0xc1, 0x89, 0x80, 0x28, 0xb3, 0x98, 0x63, 0xca, 0xc5, 0xd5, + 0xca, 0x0c, 0x4e, 0x95, 0x5f, 0x00, 0x84, 0x67, 0xea, 0xf3, 0x9a, 0x6f, 0xd9, 0x41, 0x46, 0xd0, + 0x52, 0x07, 0xd0, 0x7c, 0x31, 0xb8, 0xca, 0xac, 0x22, 0xac, 0xe9, 0x8e, 0x4d, 0x57, 0x63, 0x36, + 0x0d, 0x86, 0x92, 0x0d, 0xd5, 0x45, 0x05, 0xe0, 0x37, 0x3c, 0xa7, 0xc8, 0x7a, 0xb9, 0xf8, 0x7a, + 0xc3, 0xe4, 0x7a, 0xfc, 0xaa, 0xfa, 0x46, 0xeb, 0x49, 0x7f, 0x14, 0x42, 0xda, 0x78, 0xb6, 0x5d, + 0x41, 0xfb, 0x0c, 0x0a, 0xa4, 0xc0, 0xb9, 0x65, 0xce, 0x60, 0x58, 0xf4, 0x19, 0x14, 0x69, 0x61, + 0xe3, 0x89, 0xb9, 0xdb, 0x68, 0x71, 0xb0, 0xf4, 0xdf, 0x2c, 0x14, 0x68, 0x7d, 0x49, 0xb2, 0x02, + 0xf5, 0x62, 0x81, 0x65, 0x05, 0xea, 0xa8, 0x62, 0x98, 0xe8, 0x82, 0x13, 0xe2, 0x43, 0xf4, 0x63, + 0x6e, 0xcb, 0xf7, 0x3e, 0x5f, 0xef, 0xd1, 0xe2, 0xb2, 0xb5, 0xde, 0x60, 0x28, 0xd9, 0xf6, 0xdd, + 0x1b, 0x25, 0xd0, 0xa9, 0xbd, 0x80, 0xcd, 0xe8, 0x04, 0xe9, 0xf3, 0xae, 0xf0, 0x4d, 0xd0, 0xe7, + 0x5d, 0xe1, 0x1b, 0x54, 0x85, 0xc2, 0x35, 0x71, 0x33, 0xbe, 0x30, 0x1b, 0xbc, 0xc8, 0xfe, 0x40, + 0x90, 0xfe, 0x25, 0x40, 0xbe, 0x41, 0x76, 0x77, 0x0f, 0x76, 0x94, 0x51, 0x77, 0xd8, 0xee, 0xc8, + 0xaa, 0xfc, 0xb3, 0x86, 0xdc, 0x1f, 0xb6, 0x7b, 0xdd, 0x4a, 0x06, 0x89, 0x50, 0x1d, 0x75, 0x15, + 0xb9, 0xd1, 0x3b, 0xeb, 0xb6, 0xdf, 0xc8, 0x4d, 0xb5, 0x7f, 0xfc, 0xe5, 0xe7, 0xbd, 0xe3, 0x66, + 0x45, 0x40, 0xbb, 0xb0, 0xdd, 0x69, 0x0f, 0x06, 0xed, 0xee, 0x59, 0x28, 0xcc, 0xa2, 0x32, 0x94, + 0x4e, 0x8e, 0x9b, 0x6a, 0xbb, 0xdb, 0x1f, 0x0d, 0x2b, 0x39, 0x8a, 0x39, 0x1e, 0x36, 0x5a, 0x6a, + 0xb7, 0x37, 0x54, 0x4f, 0x7b, 0xa3, 0x6e, 0xb3, 0x92, 0x47, 0xfb, 0xb0, 0xcb, 0x84, 0xaf, 0x7b, + 0xed, 0xae, 0xaa, 0xc8, 0xaf, 0xe5, 0xc6, 0x50, 0x6e, 0x56, 0x0a, 0xe8, 0x10, 0x6a, 0xc1, 0x16, + 0x4e, 0x47, 0xdd, 0x06, 0xd9, 0x41, 0x44, 0xb1, 0xb8, 0x70, 0x7e, 0xb6, 0xd7, 0x35, 0xe9, 0x57, + 0x59, 0x28, 0xd0, 0x12, 0x07, 0x7d, 0x04, 0xeb, 0xac, 0xbc, 0x0c, 0x3d, 0x62, 0x8d, 0x8e, 0xdb, + 0x06, 0xfa, 0x04, 0xca, 0xda, 0xd4, 0xbf, 0x74, 0x5c, 0xd3, 0xd7, 0x7c, 0xf3, 0x9a, 0x99, 0x64, + 0x5d, 0x89, 0x0b, 0xd1, 0x53, 0x28, 0x8c, 0xb5, 0x73, 0x3c, 0x0e, 0x7b, 0xdb, 0x64, 0xe4, 0x0e, + 0x7c, 0xd7, 0xb4, 0x2f, 0x58, 0xec, 0x32, 0x28, 0x39, 0x73, 0xcf, 0xfc, 0x25, 0x4b, 0x42, 0x05, + 0x85, 0xfe, 0x8e, 0xdf, 0x5a, 0x85, 0xaf, 0x79, 0x6b, 0x15, 0x6f, 0x7f, 0x6b, 0x95, 0x61, 0x23, + 0xd2, 0x79, 0x48, 0xbf, 0x13, 0xa0, 0x14, 0xb6, 0x01, 0xcb, 0xac, 0xf2, 0x43, 0x58, 0x0f, 0xd6, + 0xe5, 0x2f, 0x01, 0x2b, 0x96, 0x0b, 0xe1, 0x68, 0x1f, 0xd6, 0x9c, 0x89, 0x1a, 0xe6, 0xec, 0x9c, + 0x52, 0x74, 0x26, 0xd4, 0xa3, 0x10, 0xe4, 0x69, 0xb5, 0x41, 0xec, 0xb1, 0xa9, 0xd0, 0xdf, 0xd2, + 0xef, 0x05, 0x28, 0xc7, 0xfa, 0x92, 0x65, 0x9b, 0x8a, 0x30, 0x67, 0x17, 0x32, 0xe7, 0x66, 0xcc, + 0x71, 0x4b, 0xe7, 0xef, 0x66, 0x69, 0x12, 0x05, 0xa5, 0xb0, 0xd3, 0x41, 0x07, 0xc9, 0x2d, 0xb5, + 0x32, 0xb3, 0x4d, 0xed, 0x41, 0xc1, 0x77, 0xae, 0xb0, 0xcd, 0x42, 0x89, 0x34, 0x86, 0x74, 0x88, + 0x9a, 0xb0, 0x6e, 0x61, 0x5f, 0xe3, 0xfb, 0x22, 0xcb, 0x3f, 0x4e, 0x6f, 0xa6, 0xea, 0x1d, 0x0e, + 0x65, 0x91, 0x1c, 0x6a, 0xd6, 0x5e, 0x42, 0x39, 0x36, 0x75, 0x97, 0x58, 0x3e, 0xc9, 0x93, 0x92, + 0x49, 0xfa, 0x0e, 0xc0, 0xac, 0xed, 0x5a, 0x62, 0x5e, 0xe9, 0x0f, 0x02, 0xa0, 0xf9, 0xbe, 0x6a, + 0xd9, 0x81, 0x7c, 0xc8, 0x5c, 0xfa, 0xb7, 0x1c, 0xf7, 0x94, 0xb0, 0x23, 0x3b, 0x80, 0x92, 0x65, + 0xda, 0xaa, 0xee, 0x4c, 0x6d, 0x9f, 0x27, 0xd6, 0x75, 0xcb, 0xb4, 0x1b, 0x64, 0x4c, 0x27, 0xb5, + 0xf7, 0x7c, 0x32, 0xcb, 0x27, 0xb5, 0xf7, 0x6c, 0xb2, 0x0a, 0x85, 0x5f, 0x4c, 0xb1, 0x7b, 0xc3, + 0x6f, 0x2a, 0x36, 0x40, 0x1a, 0xec, 0x78, 0x34, 0x8a, 0xd5, 0x89, 0xeb, 0x4c, 0xb0, 0xeb, 0x9b, + 0xa1, 0xe7, 0x3c, 0x5f, 0xde, 0x2d, 0xf2, 0xe8, 0xef, 0x87, 0x6a, 0xec, 0x18, 0x2b, 0x5e, 0x42, + 0x8c, 0x0c, 0x40, 0xf6, 0xd4, 0xc2, 0xae, 0xa9, 0x47, 0xd7, 0x60, 0x79, 0xe0, 0xb3, 0x15, 0x6b, + 0x74, 0x99, 0x62, 0x72, 0x91, 0x1d, 0x3b, 0x29, 0xaf, 0x35, 0xe0, 0xde, 0xc2, 0x0d, 0xdd, 0xc5, + 0x79, 0x6a, 0x4d, 0xd8, 0x5b, 0xbc, 0xe2, 0x2a, 0x16, 0x21, 0x7a, 0x9d, 0xfc, 0xa3, 0x00, 0x3b, + 0x73, 0xbd, 0x30, 0xad, 0x9d, 0x59, 0x67, 0x1a, 0xd4, 0xce, 0xac, 0xd5, 0x8c, 0x06, 0x5a, 0x36, + 0x35, 0xd0, 0x72, 0xf1, 0x40, 0x3b, 0x83, 0x02, 0xa9, 0xef, 0x82, 0xa3, 0x7a, 0xb2, 0xba, 0x17, + 0x8f, 0x48, 0x88, 0xab, 0x29, 0x4c, 0x1f, 0xc9, 0x3c, 0xbd, 0xb2, 0xaa, 0xf0, 0x6b, 0xf0, 0x50, + 0xf5, 0xda, 0x3f, 0x73, 0xb0, 0x15, 0x9f, 0x88, 0x65, 0x53, 0xe1, 0x6e, 0xd9, 0xd4, 0x5f, 0xe4, + 0x94, 0xcc, 0x61, 0xce, 0xee, 0xbc, 0xc3, 0x5b, 0xfb, 0xe9, 0xbb, 0x85, 0x7e, 0x5a, 0xa4, 0xcb, + 0xb6, 0xee, 0xbe, 0xec, 0xff, 0xa3, 0xeb, 0xf2, 0xec, 0xf9, 0x29, 0x54, 0x92, 0xef, 0x2e, 0x69, + 0xee, 0x1b, 0xc7, 0xf2, 0xd7, 0x93, 0x34, 0x6c, 0x0f, 0xca, 0xb1, 0xf7, 0x12, 0xf4, 0x2a, 0xf9, + 0xcc, 0x22, 0x50, 0x6b, 0x8b, 0xd1, 0x87, 0x92, 0xa8, 0x46, 0xe2, 0x79, 0x45, 0x92, 0xa1, 0xc8, + 0x5a, 0xfe, 0xf8, 0xcd, 0x27, 0xdc, 0xf1, 0xe6, 0xfb, 0x2e, 0x6c, 0x46, 0xdf, 0x49, 0x48, 0xf6, + 0x27, 0xd1, 0xa1, 0x9a, 0x06, 0xe3, 0x2a, 0x29, 0x6b, 0x64, 0xdc, 0x36, 0x3c, 0xe9, 0xd7, 0x02, + 0xec, 0x2e, 0x78, 0x05, 0xf9, 0xa0, 0xb7, 0xc2, 0xf7, 0x60, 0x2b, 0xfe, 0x64, 0xb2, 0x6c, 0xc3, + 0xcd, 0xe0, 0xdb, 0x78, 0xc3, 0xf3, 0x3c, 0x7c, 0x6c, 0x12, 0x6e, 0x51, 0xd5, 0x71, 0xac, 0x34, + 0x26, 0x86, 0x76, 0xb1, 0x66, 0x91, 0xb2, 0xc3, 0x8a, 0x14, 0xf5, 0x16, 0x2f, 0xea, 0xbd, 0xe9, + 0xf9, 0x57, 0x58, 0x0f, 0xdb, 0x2e, 0x3e, 0x44, 0x87, 0x00, 0x06, 0xf6, 0x74, 0xd7, 0x9c, 0xf8, + 0x8e, 0xcb, 0x6f, 0x9e, 0x88, 0x84, 0x78, 0x22, 0x2b, 0x31, 0x59, 0xd3, 0xca, 0x06, 0xd2, 0x6f, + 0x04, 0x80, 0xd9, 0x33, 0x0c, 0x3a, 0x22, 0x5b, 0x26, 0x23, 0xbe, 0xe5, 0xfd, 0x94, 0x97, 0x16, + 0x85, 0xc3, 0x88, 0x5d, 0x3d, 0x6c, 0x1b, 0xd8, 0xbd, 0x5d, 0x19, 0xc7, 0xc1, 0xb1, 0x8a, 0xaa, + 0xc4, 0x6b, 0xb5, 0xbf, 0xd2, 0xf3, 0x9e, 0x7b, 0xb0, 0xb9, 0xfb, 0x9e, 0x3e, 0xa4, 0x83, 0xfc, + 0x5d, 0x80, 0xcd, 0xe8, 0x04, 0x29, 0x22, 0xb9, 0x7f, 0x04, 0x11, 0xc9, 0xdc, 0x83, 0xf4, 0x8d, + 0x1e, 0xf6, 0x3c, 0xd3, 0xb1, 0x23, 0xfd, 0x26, 0x97, 0xb4, 0x8d, 0xd8, 0xb3, 0x42, 0x2e, 0xf1, + 0xac, 0xf0, 0x30, 0xfe, 0xbe, 0x93, 0xa7, 0x1d, 0x44, 0xec, 0x0d, 0x67, 0xe6, 0x6a, 0x85, 0xdb, + 0xbb, 0xda, 0xc9, 0x29, 0x1c, 0xe8, 0x8e, 0x55, 0x9f, 0xfd, 0xa9, 0x17, 0x7e, 0xb3, 0xaf, 0x4d, + 0xcc, 0x93, 0xad, 0x2e, 0x1d, 0x29, 0xdc, 0x00, 0x7d, 0xe1, 0x4d, 0x81, 0x4e, 0xfc, 0x29, 0x9b, + 0xef, 0xfe, 0xa4, 0x7f, 0xf2, 0xe7, 0x6c, 0x91, 0x01, 0xce, 0x8b, 0x74, 0x95, 0x67, 0xff, 0x0b, + 0x00, 0x00, 0xff, 0xff, 0x82, 0x5d, 0x4f, 0x51, 0x92, 0x1c, 0x00, 0x00, } diff --git a/rtapi/realtime.proto b/rtapi/realtime.proto index 4f9589168fb3d0dafac2e73fbe1b386c2465a842..3858727d8ceb8b788b3db88dc948f302473d4a78 100644 --- a/rtapi/realtime.proto +++ b/rtapi/realtime.proto @@ -275,6 +275,8 @@ message MatchJoin { // A matchmaking result token. string token = 2; } + // An optional set of key-value metadata pairs to be passed to the match handler, if any. + map metadata = 3; } // Leave a realtime match. diff --git a/runtime/runtime.go b/runtime/runtime.go index b0fa32888e6f769711a269dada11a15792370e37..5b00a0f46702920e20f79a79f7847d932b7b3391 100644 --- a/runtime/runtime.go +++ b/runtime/runtime.go @@ -228,7 +228,7 @@ type MatchDispatcher interface { type Match interface { MatchInit(ctx context.Context, logger *log.Logger, db *sql.DB, nk NakamaModule, params map[string]interface{}) (interface{}, int, string) - MatchJoinAttempt(ctx context.Context, logger *log.Logger, db *sql.DB, nk NakamaModule, dispatcher MatchDispatcher, tick int64, state interface{}, presence Presence) (interface{}, bool, string) + MatchJoinAttempt(ctx context.Context, logger *log.Logger, db *sql.DB, nk NakamaModule, dispatcher MatchDispatcher, tick int64, state interface{}, presence Presence, metadata map[string]string) (interface{}, bool, string) MatchJoin(ctx context.Context, logger *log.Logger, db *sql.DB, nk NakamaModule, dispatcher MatchDispatcher, tick int64, state interface{}, presences []Presence) interface{} MatchLeave(ctx context.Context, logger *log.Logger, db *sql.DB, nk NakamaModule, dispatcher MatchDispatcher, tick int64, state interface{}, presences []Presence) interface{} MatchLoop(ctx context.Context, logger *log.Logger, db *sql.DB, nk NakamaModule, dispatcher MatchDispatcher, tick int64, state interface{}, messages []MatchData) interface{} diff --git a/sample_go_module/sample.go b/sample_go_module/sample.go index dc787aae4f4ae2d47e2a6e33c0917bce0d9522f7..ed9652944d05d92e8eee091e062e6319a63ed476 100644 --- a/sample_go_module/sample.go +++ b/sample_go_module/sample.go @@ -82,9 +82,9 @@ func (m *Match) MatchInit(ctx context.Context, logger *log.Logger, db *sql.DB, n return state, tickRate, label } -func (m *Match) MatchJoinAttempt(ctx context.Context, logger *log.Logger, db *sql.DB, nk runtime.NakamaModule, dispatcher runtime.MatchDispatcher, tick int64, state interface{}, presence runtime.Presence) (interface{}, bool, string) { +func (m *Match) MatchJoinAttempt(ctx context.Context, logger *log.Logger, db *sql.DB, nk runtime.NakamaModule, dispatcher runtime.MatchDispatcher, tick int64, state interface{}, presence runtime.Presence, metadata map[string]string) (interface{}, bool, string) { if state.(*MatchState).debug { - logger.Printf("match join attempt username %v user_id %v session_id %v node %v", presence.GetUsername(), presence.GetUserId(), presence.GetSessionId(), presence.GetNodeId()) + logger.Printf("match join attempt username %v user_id %v session_id %v node %v with metadata %v", presence.GetUsername(), presence.GetUserId(), presence.GetSessionId(), presence.GetNodeId(), metadata) } return state, true, "" diff --git a/server/match_handler.go b/server/match_handler.go index 9579ced8bcef68f260ca886e67f6c73cc6a4fe31..afeb58b20b232a0a309bf0acf8a1b21d77378474 100644 --- a/server/match_handler.go +++ b/server/match_handler.go @@ -230,14 +230,14 @@ func loop(mh *MatchHandler) { mh.tick++ } -func JoinAttempt(resultCh chan *MatchJoinResult, userID, sessionID uuid.UUID, username, node string) func(mh *MatchHandler) { +func JoinAttempt(resultCh chan *MatchJoinResult, userID, sessionID uuid.UUID, username, node string, metadata map[string]string) func(mh *MatchHandler) { return func(mh *MatchHandler) { if mh.stopped.Load() { resultCh <- &MatchJoinResult{Allow: false} return } - state, allow, reason, err := mh.core.MatchJoinAttempt(mh.tick, mh.state, userID, sessionID, username, node) + state, allow, reason, err := mh.core.MatchJoinAttempt(mh.tick, mh.state, userID, sessionID, username, node, metadata) if err != nil { mh.Stop() mh.logger.Warn("Stopping match after error from match_join_attempt execution", zap.Int64("tick", mh.tick), zap.Error(err)) diff --git a/server/match_registry.go b/server/match_registry.go index 5ff471c94a572d4c21fd987c82e5abeb0d2e820c..5cc82650bc78a7b24bae329f8903e246105bb53a 100644 --- a/server/match_registry.go +++ b/server/match_registry.go @@ -97,7 +97,7 @@ type MatchRegistry interface { Stop(graceSeconds int) chan struct{} // Pass a user join attempt to a match handler. Returns if the match was found, if the join was accepted, a reason for any rejection, and the match label. - JoinAttempt(id uuid.UUID, node string, userID, sessionID uuid.UUID, username, fromNode string) (bool, bool, string, string) + JoinAttempt(id uuid.UUID, node string, userID, sessionID uuid.UUID, username, fromNode string, metadata map[string]string) (bool, bool, string, string) // Notify a match handler that one or more users have successfully joined the match. // Expects that the caller has already determined the match is hosted on the current node. Join(id uuid.UUID, presences []*MatchPresence) @@ -422,7 +422,7 @@ func (r *LocalMatchRegistry) Stop(graceSeconds int) chan struct{} { return r.stoppedCh } -func (r *LocalMatchRegistry) JoinAttempt(id uuid.UUID, node string, userID, sessionID uuid.UUID, username, fromNode string) (bool, bool, string, string) { +func (r *LocalMatchRegistry) JoinAttempt(id uuid.UUID, node string, userID, sessionID uuid.UUID, username, fromNode string, metadata map[string]string) (bool, bool, string, string) { if node != r.node { return false, false, "", "" } @@ -437,7 +437,7 @@ func (r *LocalMatchRegistry) JoinAttempt(id uuid.UUID, node string, userID, sess } resultCh := make(chan *MatchJoinResult, 1) - if !mh.QueueCall(JoinAttempt(resultCh, userID, sessionID, username, fromNode)) { + if !mh.QueueCall(JoinAttempt(resultCh, userID, sessionID, username, fromNode, metadata)) { // The match call queue was full, so will be closed and therefore can't be joined. return true, false, "", "" } diff --git a/server/pipeline_match.go b/server/pipeline_match.go index b1eb34084d25c6b866f606548342af0109c97e7b..ad3f1103376d90c477c17725881777f822ab5e71 100644 --- a/server/pipeline_match.go +++ b/server/pipeline_match.go @@ -173,7 +173,7 @@ func (p *Pipeline) matchJoin(logger *zap.Logger, session Session, envelope *rtap // The user is not yet part of the match, attempt to join. if mode == StreamModeMatchAuthoritative { // If it's an authoritative match, ask the match handler if it will allow the join. - found, allow, reason, l = p.matchRegistry.JoinAttempt(matchID, node, session.UserID(), session.ID(), username, p.node) + found, allow, reason, l = p.matchRegistry.JoinAttempt(matchID, node, session.UserID(), session.ID(), username, p.node, incoming.Metadata) } if !found { // Match did not exist. diff --git a/server/runtime.go b/server/runtime.go index 5e08c51f794885f0c64dc715556fcb06267ef6f2..beaa54ecff8dafa90db8a106d8adca80595767ae 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -215,7 +215,7 @@ func (e RuntimeExecutionMode) String() string { type RuntimeMatchCore interface { MatchInit(params map[string]interface{}) (interface{}, int, string, error) - MatchJoinAttempt(tick int64, state interface{}, userID, sessionID uuid.UUID, username, node string) (interface{}, bool, string, error) + MatchJoinAttempt(tick int64, state interface{}, userID, sessionID uuid.UUID, username, node string, metadata map[string]string) (interface{}, bool, string, error) MatchJoin(tick int64, state interface{}, joins []*MatchPresence) (interface{}, error) MatchLeave(tick int64, state interface{}, leaves []*MatchPresence) (interface{}, error) MatchLoop(tick int64, state interface{}, inputCh chan *MatchDataMessage) (interface{}, error) diff --git a/server/runtime_go_match_core.go b/server/runtime_go_match_core.go index 4c28d8a689aacb3e121fef44667314200d14faf5..bbbacb81eb4d8cb8b2bc8f2b256637a2e7bbb903 100644 --- a/server/runtime_go_match_core.go +++ b/server/runtime_go_match_core.go @@ -99,7 +99,7 @@ func (r *RuntimeGoMatchCore) MatchInit(params map[string]interface{}) (interface return state, tickRate, label, nil } -func (r *RuntimeGoMatchCore) MatchJoinAttempt(tick int64, state interface{}, userID, sessionID uuid.UUID, username, node string) (interface{}, bool, string, error) { +func (r *RuntimeGoMatchCore) MatchJoinAttempt(tick int64, state interface{}, userID, sessionID uuid.UUID, username, node string, metadata map[string]string) (interface{}, bool, string, error) { presence := &MatchPresence{ Node: node, UserID: userID, @@ -107,7 +107,7 @@ func (r *RuntimeGoMatchCore) MatchJoinAttempt(tick int64, state interface{}, use Username: username, } - newState, allow, reason := r.match.MatchJoinAttempt(r.ctx, r.stdLogger, r.db, r.nk, r, tick, state, presence) + newState, allow, reason := r.match.MatchJoinAttempt(r.ctx, r.stdLogger, r.db, r.nk, r, tick, state, presence, metadata) return newState, allow, reason, nil } diff --git a/server/runtime_lua_match_core.go b/server/runtime_lua_match_core.go index 00603c5e05ac3f3ea11f7b76073f2f4b70a6a3ba..689ff8809f97af458ae80a0d9b05c2196bb6ac6e 100644 --- a/server/runtime_lua_match_core.go +++ b/server/runtime_lua_match_core.go @@ -233,13 +233,18 @@ func (r *RuntimeLuaMatchCore) MatchInit(params map[string]interface{}) (interfac return state, rateInt, labelStr, nil } -func (r *RuntimeLuaMatchCore) MatchJoinAttempt(tick int64, state interface{}, userID, sessionID uuid.UUID, username, node string) (interface{}, bool, string, error) { +func (r *RuntimeLuaMatchCore) MatchJoinAttempt(tick int64, state interface{}, userID, sessionID uuid.UUID, username, node string, metadata map[string]string) (interface{}, bool, string, error) { presence := r.vm.CreateTable(0, 4) presence.RawSetString("user_id", lua.LString(userID.String())) presence.RawSetString("session_id", lua.LString(sessionID.String())) presence.RawSetString("username", lua.LString(username)) presence.RawSetString("node", lua.LString(node)) + metadataTable := r.vm.CreateTable(0, len(metadata)) + for k, v := range metadata { + metadataTable.RawSetString(k, lua.LString(v)) + } + // Execute the match_join_attempt call. r.vm.Push(LSentinel) r.vm.Push(r.joinAttemptFn) @@ -248,8 +253,9 @@ func (r *RuntimeLuaMatchCore) MatchJoinAttempt(tick int64, state interface{}, us r.vm.Push(lua.LNumber(tick)) r.vm.Push(state.(lua.LValue)) r.vm.Push(presence) + r.vm.Push(metadataTable) - err := r.vm.PCall(5, lua.MultRet, nil) + err := r.vm.PCall(6, lua.MultRet, nil) if err != nil { return nil, false, "", err }