@@ -20,7 +20,16 @@ local function get_formspec(tabview, name, tabdata)
20
20
-- Update the cached supported proto info,
21
21
-- it may have changed after a change by the settings menu.
22
22
common_update_cached_supp_proto ()
23
- local fav_selected = menudata .favorites [tabdata .fav_selected ]
23
+ local fav_selected = nil
24
+ if menudata .search_result then
25
+ fav_selected = menudata .search_result [tabdata .fav_selected ]
26
+ else
27
+ fav_selected = menudata .favorites [tabdata .fav_selected ]
28
+ end
29
+
30
+ if not tabdata .search_for then
31
+ tabdata .search_for = " "
32
+ end
24
33
25
34
local retval =
26
35
" label[7.75,-0.15;" .. fgettext (" Address / Port" ) .. " ]" ..
@@ -33,7 +42,9 @@ local function get_formspec(tabview, name, tabdata)
33
42
" field[8,1.95;2.95,0.5;te_name;;" ..
34
43
core .formspec_escape (core .setting_get (" name" )) .. " ]" ..
35
44
" pwdfield[10.78,1.95;1.77,0.5;te_pwd;]" ..
36
- " box[7.73,2.35;4.3,2.28;#999999]"
45
+ " box[7.73,2.35;4.3,2.28;#999999]" ..
46
+ " field[0.15,0.25;4.5,0.27;te_search;;" .. core .formspec_escape (tabdata .search_for ).. " ]" ..
47
+ " button[4.8,0;2.7,0.1;btn_mp_search;" .. fgettext (" Search" ) .. " ]"
37
48
38
49
if tabdata .fav_selected and fav_selected then
39
50
if gamedata .fav then
@@ -58,9 +69,27 @@ local function get_formspec(tabview, name, tabdata)
58
69
image_column (fgettext (" PvP enabled" ), " pvp" ) .. " ,padding=0.25;" ..
59
70
" color,span=1;" ..
60
71
" text,padding=1]" ..
61
- " table[-0.15,-0.1;7.75,5.5;favourites;"
72
+ " table[-0.15,0.4;7.75,5.35;favourites;"
73
+
74
+ if menudata .search_result then
75
+ for i = 1 , # menudata .search_result do
76
+ local favs = core .get_favorites (" local" )
77
+ local server = menudata .search_result [i ]
62
78
63
- if # menudata .favorites > 0 then
79
+ for fav_id = 1 , # favs do
80
+ if server .address == favs [fav_id ].address and
81
+ server .port == favs [fav_id ].port then
82
+ server .is_favorite = true
83
+ end
84
+ end
85
+
86
+ if i ~= 1 then
87
+ retval = retval .. " ,"
88
+ end
89
+
90
+ retval = retval .. render_serverlist_row (server , server .is_favorite )
91
+ end
92
+ elseif # menudata .favorites > 0 then
64
93
local favs = core .get_favorites (" local" )
65
94
if # favs > 0 then
66
95
for i = 1 , # favs do
@@ -75,9 +104,9 @@ local function get_formspec(tabview, name, tabdata)
75
104
end
76
105
end
77
106
end
78
- retval = retval .. render_favorite (menudata .favorites [1 ], (# favs > 0 ))
107
+ retval = retval .. render_serverlist_row (menudata .favorites [1 ], (# favs > 0 ))
79
108
for i = 2 , # menudata .favorites do
80
- retval = retval .. " ," .. render_favorite (menudata .favorites [i ], (i <= # favs ))
109
+ retval = retval .. " ," .. render_serverlist_row (menudata .favorites [i ], (i <= # favs ))
81
110
end
82
111
end
83
112
92
121
93
122
---- ----------------------------------------------------------------------------
94
123
local function main_button_handler (tabview , fields , name , tabdata )
124
+ local serverlist = menudata .search_result or menudata .favorites
125
+
95
126
if fields .te_name then
96
127
gamedata .playername = fields .te_name
97
128
core .setting_set (" name" , fields .te_name )
98
129
end
99
130
100
131
if fields .favourites then
101
132
local event = core .explode_table_event (fields .favourites )
102
- local fav = menudata . favorites [event .row ]
133
+ local fav = serverlist [event .row ]
103
134
104
135
if event .type == " DCL" then
105
- if event .row <= # menudata . favorites then
136
+ if event .row <= # serverlist then
106
137
if menudata .favorites_is_public and
107
138
not is_server_protocol_compat_or_error (
108
139
fav .proto_min , fav .proto_max ) then
@@ -131,7 +162,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
131
162
end
132
163
133
164
if event .type == " CHG" then
134
- if event .row <= # menudata . favorites then
165
+ if event .row <= # serverlist then
135
166
gamedata .fav = false
136
167
local favs = core .get_favorites (" local" )
137
168
local address = fav .address
@@ -157,7 +188,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
157
188
158
189
if fields .key_up or fields .key_down then
159
190
local fav_idx = core .get_table_index (" favourites" )
160
- local fav = menudata . favorites [fav_idx ]
191
+ local fav = serverlist [fav_idx ]
161
192
162
193
if fav_idx then
163
194
if fields .key_up and fav_idx > 1 then
@@ -176,7 +207,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
176
207
177
208
local address = fav .address
178
209
local port = fav .port
179
-
210
+ gamedata . serverdescription = fav . description
180
211
if address and port then
181
212
core .setting_set (" address" , address )
182
213
core .setting_set (" remote_port" , port )
@@ -199,16 +230,75 @@ local function main_button_handler(tabview, fields, name, tabdata)
199
230
return true
200
231
end
201
232
233
+ if fields .btn_mp_search or fields .key_enter_field == " te_search" then
234
+ tabdata .fav_selected = 1
235
+ local input = fields .te_search :lower ()
236
+ tabdata .search_for = fields .te_search
237
+
238
+ if # menudata .favorites < 2 then
239
+ return true
240
+ end
241
+
242
+ menudata .search_result = {}
243
+
244
+ -- setup the keyword list
245
+ local keywords = {}
246
+ for word in input :gmatch (" %S+" ) do
247
+ table.insert (keywords , word )
248
+ end
249
+
250
+ if # keywords == 0 then
251
+ menudata .search_result = nil
252
+ return true
253
+ end
254
+
255
+ -- Search the serverlist
256
+ local search_result = {}
257
+ for i = 1 , # menudata .favorites do
258
+ local server = menudata .favorites [i ]
259
+ local found = 0
260
+ for k = 1 , # keywords do
261
+ local keyword = keywords [k ]
262
+ if server .name then
263
+ local name = server .name :lower ()
264
+ local _ , count = name :gsub (keyword , keyword )
265
+ found = found + count * 4
266
+ end
267
+
268
+ if server .description then
269
+ local desc = server .description :lower ()
270
+ local _ , count = desc :gsub (keyword , keyword )
271
+ found = found + count * 2
272
+ end
273
+ end
274
+ if found > 0 then
275
+ local points = (# menudata .favorites - i ) / 5 + found
276
+ server .points = points
277
+ table.insert (search_result , server )
278
+ end
279
+ end
280
+ if # search_result > 0 then
281
+ table.sort (search_result , function (a , b )
282
+ return a .points > b .points
283
+ end )
284
+ menudata .search_result = search_result
285
+ local first_server = search_result [1 ]
286
+ core .setting_set (" address" , first_server .address )
287
+ core .setting_set (" remote_port" , first_server .port )
288
+ end
289
+ return true
290
+ end
291
+
202
292
if (fields .btn_mp_connect or fields .key_enter ) and fields .te_address and fields .te_port then
203
293
gamedata .playername = fields .te_name
204
294
gamedata .password = fields .te_pwd
205
295
gamedata .address = fields .te_address
206
296
gamedata .port = fields .te_port
207
297
gamedata .selected_world = 0
208
298
local fav_idx = core .get_table_index (" favourites" )
209
- local fav = menudata . favorites [fav_idx ]
299
+ local fav = serverlist [fav_idx ]
210
300
211
- if fav_idx and fav_idx <= # menudata . favorites and
301
+ if fav_idx and fav_idx <= # serverlist and
212
302
fav .address == fields .te_address and
213
303
fav .port == fields .te_port then
214
304
0 commit comments