diff --git a/expcore/external.lua b/expcore/external.lua index 3a54b195..26751fa0 100644 --- a/expcore/external.lua +++ b/expcore/external.lua @@ -30,13 +30,13 @@ end) @treturn boolean If the external data is valid, if false you should not call any other methods from External @usage-- Check that external data is valid -if not External.validate() then +if not External.valid() then -- error code here end ]] -function External.validate() - if ext ~= nil and var ~= nil then +function External.valid() + if ext ~= nil and ext == global.ext then return true elseif global.ext ~= nil then ext = global.ext @@ -54,7 +54,7 @@ local servers = External.get_servers() ]] function External.get_servers() - assert(ext, 'No external data was found, use External.validate() to ensure external data exists.') + assert(ext, 'No external data was found, use External.valid() to ensure external data exists.') return assert(ext.servers, 'No server list was found, please ensure that the external service is running') end @@ -67,7 +67,7 @@ local servers = External.get_servers_filtered(public) ]] function External.get_servers_filtered(search) - assert(ext, 'No external data was found, use External.validate() to ensure external data exists.') + assert(ext, 'No external data was found, use External.valid() to ensure external data exists.') local servers = assert(ext.servers, 'No server list was found, please ensure that the external service is running') local found_servers = {} search = search:lower() @@ -79,14 +79,14 @@ function External.get_servers_filtered(search) end --[[-- Gets the details of the current server -@treturn table The details for the current server +@treturn table The details of the current server @usage-- Get the details of the current server local server = External.get_current_server() ]] function External.get_current_server() - assert(ext, 'No external data was found, use External.validate() to ensure external data exists.') + assert(ext, 'No external data was found, use External.valid() to ensure external data exists.') local servers = assert(ext.servers, 'No server list was found, please ensure that the external service is running') local server_id = assert(ext.current, 'No current id was found, please ensure that the external service is running') return servers[server_id] @@ -101,7 +101,7 @@ local server = External.get_server_details('eu-01') ]] function External.get_server_details(server_id) - assert(ext, 'No external data was found, use External.validate() to ensure external data exists.') + assert(ext, 'No external data was found, use External.valid() to ensure external data exists.') local servers = assert(ext.servers, 'No server list was found, please ensure that the external service is running') return servers[server_id] end @@ -115,8 +115,8 @@ local status = External.get_server_status('eu-01') ]] function External.get_server_status(server_id) - assert(var, 'No external data was found, use External.validate() to ensure external data exists.') - local servers = assert(ext.status, 'No server status was found, please ensure that the external service is running') + assert(var, 'No external data was found, use External.valid() to ensure external data exists.') + local servers = assert(var.status, 'No server status was found, please ensure that the external service is running') return servers[server_id] end @@ -126,7 +126,7 @@ local server_ups = External.get_server_ups() ]] function External.get_server_ups() - assert(var, 'No external data was found, use External.validate() to ensure external data exists.') + assert(var, 'No external data was found, use External.valid() to ensure external data exists.') return assert(var.server_ups, 'No server ups was found, please ensure that the external service is running') end @@ -143,14 +143,14 @@ External.request_connection(player, 'eu-01', true) ]] function External.request_connection(player, server_id, self_requested) - assert(ext, 'No external data was found, use External.validate() to ensure external data exists.') + assert(ext, 'No external data was found, use External.valid() to ensure external data exists.') local servers = assert(ext.servers, 'No server list was found, please ensure that the external service is running') local server = servers[server_id] or { address = server_id, name = 'Unknown Server', description = 'This server is not ran by us, please check the address of the server.' } local message = 'Please press the connect button below to join.' - if not self_requested then message = 'You have been asked to switch to a different server. '..message end + if not self_requested then message = 'You have been asked to switch to a different server.\n'..message end player.connect_to_server{ address = server.address, - name = '\n[color=orange]'..server.name..'[/color]\n', + name = '\n[color=orange][font=heading-1]'..server.name..'[/font][/color]\n', description = server.description..'\n'..message } end diff --git a/locale/en/gui.cfg b/locale/en/gui.cfg index 3305c3fc..59c58b7e 100644 --- a/locale/en/gui.cfg +++ b/locale/en/gui.cfg @@ -146,6 +146,11 @@ servers-7=S7 Event servers-d7=This is our event server, we try to run events at least once per week. servers-8=S8 T̷-̶s̶-̴:̷ servers-d8=N̵o̴ ̶o̷-̶e̵ ̴k̸n̷-̶w̵s̸ ̴w̷h̷a̶-̶ ̷h̴a̴p̷p̴e̷n̷s̸ ̷o̶n̴ ̷t̶h̴-̶s̶ ̷s̷e̶r̸v̸e̴r̷,̶ ̸i̸t̴ ̷m̶-̸g̴h̶t̷ ̸n̸-̶t̵ ̷e̴v̸e̸n̶t̷ ̵-̷x̴i̵s̶t̸.̸ +servers-connect-Offline=Server is currently offline +servers-connect-Version=Server is on a different version: __1__ +servers-connect-Password=Server requires a password +servers-connect-Modded=Server requires mods to be downloaded +servers-connect-Online=Server is online servers-external=External Links servers-open-in-browser=Open in your browser backers-tab=Backers diff --git a/modules/commands/interface.lua b/modules/commands/interface.lua index 9b73be17..41d2942d 100644 --- a/modules/commands/interface.lua +++ b/modules/commands/interface.lua @@ -5,25 +5,23 @@ local Commands = require 'expcore.commands' --- @dep expcore.commands local Global = require 'utils.global' --- @dep utils.global -local Common = require 'expcore.common' --- @dep expcore.common -- modules that are loaded into the interface env to be accessed local interface_modules = { - ['Game']='utils.game', - ['_C']=Common, - ['Commands']=Commands, - ['output']=Common.player_return, - ['Group']='expcore.permission_groups', - ['Roles']='expcore.roles', - ['Gui']='expcore.gui', - ['Async']='expcore.async', - ['Datastore']='expcore.datastore' + ['Commands'] = Commands, + ['output'] = _C.player_return, + ['Group'] = 'expcore.permission_groups', + ['Roles'] = 'expcore.roles', + ['Gui'] = 'expcore.gui', + ['Async'] = 'expcore.async', + ['Datastore'] = 'expcore.datastore', + ['External'] = 'expcore.external' } -- loads all the modules given in the above table for key, value in pairs(interface_modules) do if type(value) == 'string' then - interface_modules[key] = Common.opt_require(value) + interface_modules[key] = _C.opt_require(value) end end diff --git a/modules/gui/readme.lua b/modules/gui/readme.lua index 8938aedb..b74d4a0b 100644 --- a/modules/gui/readme.lua +++ b/modules/gui/readme.lua @@ -4,12 +4,12 @@ @alias readme ]] +local Event = require 'utils.event' --- @dep utils.event local Gui = require 'expcore.gui' --- @dep expcore.gui local Roles = require 'expcore.roles' --- @dep expcore.roles local Commands = require 'expcore.commands' --- @dep expcore.commands local PlayerData = require 'expcore.player_data' --- @dep expcore.player_data -local Event = require 'utils.event' --- @dep utils.event -local Game = require 'utils.game' --- @dep utils.game +local External = require 'expcore.external' --- @dep expcore.external local format_time = _C.format_time --- @dep expcore.common local format_number = require('util').format_number --- @dep util @@ -18,9 +18,9 @@ local function Tab(caption, tooltip, element_define) tabs[#tabs+1] = {caption, tooltip, element_define} end -local frame_width = 595 -- controls width of top descritions +local frame_width = 595 -- controls width of top descriptions local title_width = 270 -- controls the centering of the titles -local scroll_hieght = 275 -- controls the height of the scrolls +local scroll_height = 275 -- controls the height of the scrolls --- Sub content area used within the content areas -- @element sub_content @@ -70,15 +70,52 @@ Gui.element{ } :style{ padding = {1, 3}, - maximal_height = scroll_hieght, + maximal_height = scroll_height, horizontally_stretchable = true, } +--- Used to connect to servers in server list +-- @element join_server +local join_server = +Gui.element(function(event_trigger, parent, server_id, wrong_version) + local status = wrong_version and 'Version' or External.get_server_status(server_id) or 'Offline' + local flow = parent.add{ name = server_id, type = 'flow' } + local button = flow.add{ + name = event_trigger, + type = 'sprite-button', + sprite = 'utility/circuit_network_panel_white', --- network panel white, warning white, download white + hovered_sprite = 'utility/circuit_network_panel_black', --- network panel black, warning black, download black + tooltip = {'readme.servers-connect-'..status, wrong_version} + } + + if status == 'Offline' then + button.enabled = false + button.sprite = 'utility/circuit_network_panel_black' + elseif status == 'Version' then + button.enabled = false + button.sprite = 'utility/shuffle' + elseif status == 'Password' then + button.sprite = 'utility/warning_white' + button.hovered_sprite = 'utility/warning' + elseif status == 'Modded' then + button.sprite = 'utility/downloading_white' + button.hovered_sprite = 'utility/downloading' + end + + return button +end) +:style(Gui.sprite_style(20, -1)) +:on_click(function(player, element, _) + local server_id = element.parent.name + External.request_connection(player, server_id, true) +end) + --- Content area for the welcome tab -- @element welcome_content Tab({'readme.welcome-tab'}, {'readme.welcome-tooltip'}, Gui.element(function(_, parent) - local server_details = global.server_details or { name='ExpGaming S0 - Local', description='Failed to load description: disconnected from sync api.', reset_time='Non Set', branch='Unknown'} + local server_details = { name='ExpGaming S0 - Local', welcome='Failed to load description: disconnected from external api.', reset_time='Non Set', branch='Unknown'} + if External.valid() then server_details = External.get_current_server() end local container = parent.add{ type='flow', direction='vertical' } local player = Gui.get_player_from_element(parent) @@ -91,7 +128,7 @@ Gui.element(function(_, parent) -- Add the title and description to the top flow Gui.title_label(top_vertical_flow, 62, 'Welcome to '..server_details.name) - Gui.centered_label(top_vertical_flow, 380, server_details.description) + Gui.centered_label(top_vertical_flow, 380, server_details.welcome) Gui.bar(container) -- Get the names of the roles the player has @@ -124,7 +161,7 @@ Gui.element(function(_, parent) container.add{ type='flow' } -- Add a table for the rules - local rules = Gui.scroll_table(container, scroll_hieght, 1) + local rules = Gui.scroll_table(container, scroll_height, 1) rules.style = 'bordered_table' rules.style.cell_padding = 4 @@ -150,7 +187,7 @@ Gui.element(function(_, parent) container.add{ type='flow' } -- Add a table for the commands - local commands = Gui.scroll_table(container, scroll_hieght, 2) + local commands = Gui.scroll_table(container, scroll_height, 2) commands.style = 'bordered_table' commands.style.cell_padding = 0 @@ -177,13 +214,23 @@ Gui.element(function(_, parent) -- Draw the scroll local scroll_pane = title_table_scroll(container) - scroll_pane.style.maximal_height = scroll_hieght + 20 -- the text is a bit shorter + scroll_pane.style.maximal_height = scroll_height + 20 -- the text is a bit shorter -- Add the factorio servers - local factorio_servers = title_table(scroll_pane, 225, {'readme.servers-factorio'}, 2) - for i = 1, 8 do - Gui.centered_label(factorio_servers, 110, {'readme.servers-'..i}) - Gui.centered_label(factorio_servers, 460, {'readme.servers-d'..i}) + if External.valid() then + local factorio_servers = title_table(scroll_pane, 225, {'readme.servers-factorio'}, 3) + local current_version = External.get_current_server().version + for server_id, server in pairs(External.get_servers()) do + Gui.centered_label(factorio_servers, 110, server.short_name) + Gui.centered_label(factorio_servers, 436, server.description) + join_server(factorio_servers, server_id, current_version ~= server.version and server.version) + end + else + local factorio_servers = title_table(scroll_pane, 225, {'readme.servers-factorio'}, 2) + for i = 1, 8 do + Gui.centered_label(factorio_servers, 110, {'readme.servers-'..i}) + Gui.centered_label(factorio_servers, 460, {'readme.servers-d'..i}) + end end -- Add the external links @@ -418,7 +465,7 @@ end) --- When a player joins the game for the first time show this gui Event.add(defines.events.on_player_created, function(event) - local player = Game.get_player_by_index(event.player_index) + local player = game.players[event.player_index] local element = readme(player.gui.center) element.pane.selected_tab_index = 1 player.opened = element @@ -426,7 +473,7 @@ end) --- When a player joins clear center unless the player has something open Event.add(defines.events.on_player_joined_game, function(event) - local player = Game.get_player_by_index(event.player_index) + local player = game.players[event.player_index] if not player.opened then player.gui.center.clear() end @@ -434,7 +481,7 @@ end) --- When a player respawns clear center unless the player has something open Event.add(defines.events.on_player_respawned, function(event) - local player = Game.get_player_by_index(event.player_index) + local player = game.players[event.player_index] if not player.opened then player.gui.center.clear() end diff --git a/modules/gui/server-ups.lua b/modules/gui/server-ups.lua index edb4793b..798ac45e 100644 --- a/modules/gui/server-ups.lua +++ b/modules/gui/server-ups.lua @@ -7,6 +7,7 @@ local Gui = require 'expcore.gui' --- @dep expcore.gui local Event = require 'utils.event' --- @dep utils.event local Commands = require 'expcore.commands' --- @dep expcore.commands +local External = require 'expcore.external' --- @dep expcore.external --- Stores the visible state of server ups local PlayerData = require 'expcore.player_data' --- @dep expcore.player_data @@ -42,7 +43,8 @@ Commands.new_command('server-ups', 'Toggle the server UPS display') :add_alias('sups', 'ups') :register(function(player) local label = player.gui.screen[server_ups.name] - if not global.ext or not global.ext.server_ups then + if not External.valid() then + label.visible = false return Commands.error{'expcom-server-ups.no-ext'} end label.visible = not label.visible @@ -69,8 +71,8 @@ end) -- Update the caption for all online players Event.on_nth_tick(60, function() - if global.ext and global.ext.server_ups then - local caption = 'SUPS = '..global.ext.server_ups + if External.valid() then + local caption = 'SUPS = '..External.get_server_ups() for _, player in pairs(game.connected_players) do player.gui.screen[server_ups.name].caption = caption end