@@ -5,6 +5,8 @@ local subscribe_all
55local handle_event
66local handle_metadata
77local handle_own_state
8+ local handle_player_info
9+ local populate_initial_players
810local cleanup_lobby
911
1012---- -------------------------
@@ -71,8 +73,8 @@ MPAPI.join_lobby = function(mod_id, code, opts)
7173 })
7274
7375 _current_lobby = lobby
74-
75- conn .api :join_lobby (conn .jwt_token , code , )
76+
77+ conn .api :join_lobby (conn .jwt_token , code , join_lobby_callback )
7678
7779 return lobby
7880end
@@ -97,13 +99,15 @@ MPAPI._internal.create_reconnected_lobby = function(lobby_data)
9799 code = lobby_data .code ,
98100 mod_id = lobby_data .modId ,
99101 is_host = lobby_data .isHost or false ,
102+ max_players = lobby_data .maxPlayers ,
100103 player_id = conn .player_id ,
101104 mqtt = mqtt ,
102105 api = conn .api ,
103106 connection = conn ,
104107 metadata = lobby_data .metadata or {},
105108 })
106109
110+ populate_initial_players (lobby , lobby_data .players )
107111 subscribe_all (lobby )
108112 _current_lobby = lobby
109113 lobby :_fire (' connected' )
@@ -119,12 +123,14 @@ join_lobby_callback = function(err, data)
119123 return
120124 end
121125
122- conn .jwt_token = data .token
126+ _current_lobby . _connection .jwt_token = data .token
123127
124128 _current_lobby .code = data .lobby .code
125129 _current_lobby .is_host = data .lobby .isHost or false
126- lo_current_lobbybby ._metadata = data .lobby .metadata or {}
130+ _current_lobby .max_players = data .lobby .maxPlayers or 16
131+ _current_lobby ._metadata = data .lobby .metadata or {}
127132
133+ populate_initial_players (_current_lobby , data .lobby .players )
128134 subscribe_all (_current_lobby )
129135 _current_lobby :_fire (' connected' )
130136end
@@ -135,12 +141,14 @@ create_lobby_callback = function(err, data)
135141 return
136142 end
137143
138- conn .jwt_token = data .token
144+ _current_lobby . _connection .jwt_token = data .token
139145
140146 _current_lobby .code = data .lobby .code
141147 _current_lobby .is_host = true
148+ _current_lobby .max_players = data .lobby .maxPlayers or 16
142149 _current_lobby ._metadata = data .lobby .metadata or {}
143150
151+ populate_initial_players (_current_lobby , data .lobby .players )
144152 subscribe_all (_current_lobby )
145153 _current_lobby :_fire (' connected' )
146154end
@@ -150,6 +158,7 @@ create_lobby_object = function(opts)
150158 code = opts .code ,
151159 mod_id = opts .mod_id ,
152160 is_host = opts .is_host or false ,
161+ max_players = opts .max_players or 16 ,
153162 player_id = opts .player_id ,
154163 _mqtt = opts .mqtt ,
155164 _api = opts .api ,
@@ -265,6 +274,11 @@ subscribe_all = function(lobby)
265274 lobby ._mqtt :subscribe (state_topic , 1 , function (topic , payload )
266275 handle_own_state (lobby , payload )
267276 end )
277+
278+ local info_topic = lobby ._mqtt :lobby_topic (lobby .code , ' players/+/info' )
279+ lobby ._mqtt :subscribe (info_topic , 1 , function (topic , payload )
280+ handle_player_info (lobby , topic , payload )
281+ end )
268282end
269283
270284handle_event = function (lobby , payload )
@@ -281,11 +295,10 @@ handle_event = function(lobby, payload)
281295
282296 if event_type == ' player_joined' then
283297 if data .playerId then
284- lobby ._players [data .playerId ] = {
285- id = data .playerId ,
286- displayName = data .displayName ,
287- is_away = false ,
288- }
298+ lobby ._players [data .playerId ] = lobby ._players [data .playerId ] or {}
299+ lobby ._players [data .playerId ].id = data .playerId
300+ lobby ._players [data .playerId ].displayName = data .displayName
301+ lobby ._players [data .playerId ].is_away = false
289302 end
290303 lobby :_fire (' player_joined' , data .playerId )
291304 elseif event_type == ' player_left' then
@@ -346,6 +359,57 @@ handle_own_state = function(lobby, payload)
346359 lobby ._player_state = data
347360end
348361
362+ handle_player_info = function (lobby , topic , payload )
363+ if lobby ._destroyed then
364+ return
365+ end
366+
367+ local player_id = topic :match (' /players/([^/]+)/info$' )
368+ if not player_id then
369+ return
370+ end
371+
372+ if not payload or payload == ' ' then
373+ if lobby ._players [player_id ] then
374+ lobby ._players [player_id ] = nil
375+ lobby :_fire (' player_left' , player_id )
376+ end
377+ return
378+ end
379+
380+ local ok , data = pcall (MPAPI .json_decode , payload )
381+ if not ok or not data then
382+ return
383+ end
384+
385+ local is_new = not lobby ._players [player_id ]
386+ lobby ._players [player_id ] = lobby ._players [player_id ] or {}
387+ lobby ._players [player_id ].id = player_id
388+ lobby ._players [player_id ].displayName = data .displayName
389+ lobby ._players [player_id ].preferredJoker = data .preferredJoker
390+
391+ if is_new then
392+ lobby :_fire (' player_joined' , player_id )
393+ end
394+ lobby :_fire (' player_info' , player_id , lobby ._players [player_id ])
395+ end
396+
397+ populate_initial_players = function (lobby , players )
398+ if not players then
399+ return
400+ end
401+ for _ , p in ipairs (players ) do
402+ if p .id then
403+ lobby ._players [p .id ] = {
404+ id = p .id ,
405+ displayName = p .displayName ,
406+ preferredJoker = p .preferredJoker ,
407+ is_away = false ,
408+ }
409+ end
410+ end
411+ end
412+
349413cleanup_lobby = function (lobby )
350414 if lobby ._destroyed then
351415 return
@@ -356,6 +420,7 @@ cleanup_lobby = function(lobby)
356420 lobby ._mqtt :unsubscribe (lobby ._mqtt :lobby_topic (lobby .code , ' events' ))
357421 lobby ._mqtt :unsubscribe (lobby ._mqtt :lobby_topic (lobby .code , ' metadata' ))
358422 lobby ._mqtt :unsubscribe (lobby ._mqtt :lobby_topic (lobby .code , ' players/' .. lobby .player_id .. ' /state' ))
423+ lobby ._mqtt :unsubscribe (lobby ._mqtt :lobby_topic (lobby .code , ' players/+/info' ))
359424 end
360425
361426 if _current_lobby == lobby then
0 commit comments