diff --git a/lib/application_manager/tasks/importer.rb b/lib/application_manager/tasks/importer.rb
index f727205..8f4549b 100644
--- a/lib/application_manager/tasks/importer.rb
+++ b/lib/application_manager/tasks/importer.rb
@@ -8,7 +8,7 @@ class W3DHub
end
def execute_task
- path = ask_file
+ path = W3DHub.ask_file
unless File.exist?(path) && !File.directory?(path)
fail!("File #{path.inspect} does not exist or is a directory")
@@ -21,30 +21,6 @@ class W3DHub
true
end
-
- def ask_file(title: "Open File", filter: "*game*.exe")
- if W3DHub.unix?
- # search for command
- cmds = %w{ zenity matedialog qarma kdialog }
-
- command = cmds.find do |cmd|
- cmd if system("which #{cmd}")
- end
-
- path = case File.basename(command)
- when "zenity", "matedialog", "qarma"
- `#{command} --file-selection --title "#{title}" --file-filter "#{filter}"`
- when "kdialog"
- `#{command} --title "#{title}" --getopenfilename . "#{filter}"`
- else
- raise "No known command found for system file selection dialog!"
- end
-
- path.strip
- else
- raise NotImplementedError
- end
- end
end
end
end
diff --git a/lib/asterisk/config.rb b/lib/asterisk/config.rb
new file mode 100644
index 0000000..77ce2fc
--- /dev/null
+++ b/lib/asterisk/config.rb
@@ -0,0 +1,83 @@
+class W3DHub
+ class Asterisk
+ class Config
+ CONFIG_PATH = "#{GAME_ROOT_PATH}/data/asterisk.json"
+
+ attr_reader :settings, :server_profiles, :games, :irc_profiles
+
+ def initialize
+ @config = nil
+
+ save_new_config unless load_config
+ load_config unless @config
+ end
+
+ def save_new_config
+ hash = {
+ settings: {
+ theme: :default,
+
+ server_profile: "",
+ game: "",
+ launch_arguments: "",
+ irc_profile: "None",
+
+ nickname: "",
+ password: "",
+ server_hostname: "",
+ server_port: "",
+
+ preload_app: "",
+ enable_preload_app: false,
+
+ post_launch_app: "",
+ enable_post_launch_app: false,
+ },
+
+ server_profiles: [],
+
+ games: [],
+
+ irc_profiles: []
+ }
+
+ save_config(hash)
+ end
+
+ def load_config
+ return false unless File.exist?(CONFIG_PATH)
+
+ begin
+ hash = JSON.parse(File.read(CONFIG_PATH), symbolize_names: true)
+
+ @config ||= {}
+
+ @config[:settings] = @settings = Settings.new(hash[:settings])
+
+ @config[:server_profiles] = @server_profiles = []
+ hash[:server_profiles].each { |profile| @server_profiles << ServerProfile.new(profile) }
+
+ @config[:games] = @games = []
+ hash[:games].each { |game| @games << Game.new(game) }
+
+ @config[:irc_profiles] = @irc_profiles = []
+ hash[:irc_profiles].each { |profile| @irc_profiles << IRCProfile.new(profile) }
+
+ rescue JSON::ParserError
+ puts "Config corrupted"
+
+ false
+ end
+ end
+
+ def hard_reset!
+ save_new_config
+ load_config
+ end
+
+ def save_config(config = @config)
+ File.write(CONFIG_PATH, config.to_json)
+ end
+ end
+ end
+end
diff --git a/lib/asterisk/game.rb b/lib/asterisk/game.rb
new file mode 100644
index 0000000..c935aa8
--- /dev/null
+++ b/lib/asterisk/game.rb
@@ -0,0 +1,21 @@
+class W3DHub
+ class Asterisk
+ class Game
+ attr_accessor :title, :path
+
+ def initialize(hash = nil)
+ return unless hash
+
+ @title = hash[:title]
+ @path = hash[:path]
+ end
+
+ def to_json(options)
+ {
+ title: @title,
+ path: @path
+ }.to_json(options)
+ end
+ end
+ end
+end
diff --git a/lib/asterisk/irc_profile.rb b/lib/asterisk/irc_profile.rb
new file mode 100644
index 0000000..fa8f30c
--- /dev/null
+++ b/lib/asterisk/irc_profile.rb
@@ -0,0 +1,29 @@
+class W3DHub
+ class Asterisk
+ class IRCProfile
+ attr_accessor :name, :nickname, :password, :server_hostname, :server_port, :server_bot
+
+ def initialize(hash = nil)
+ return unless hash
+
+ @name = hash[:name]
+ @nickname = hash[:nickname]
+ @password = hash[:password]
+ @server_hostname = hash[:server_hostname]
+ @server_port = hash[:server_port]
+ @server_bot = hash[:server_bot]
+ end
+
+ def to_json(options)
+ {
+ name: @name,
+ nickname: @nickname,
+ password: @password,
+ server_hostname: @server_hostname,
+ server_port: @server_port,
+ server_bot: @server_bot
+ }.to_json(options)
+ end
+ end
+ end
+end
diff --git a/lib/asterisk/server_profile.rb b/lib/asterisk/server_profile.rb
new file mode 100644
index 0000000..b3c5f3a
--- /dev/null
+++ b/lib/asterisk/server_profile.rb
@@ -0,0 +1,38 @@
+class W3DHub
+ class Asterisk
+ class ServerProfile
+ attr_accessor :name, :nickname, :password,
+ :game, :launch_arguments,
+ :server_profile, :server_hostname, :server_port,
+ :irc_profile
+
+ def initialize(hash = nil)
+ return unless hash
+
+ @name = hash[:name]
+ @nickname = hash[:nickname]
+ @password = hash[:password]
+ @server_profile = hash[:server_profile]
+ @server_hostname = hash[:server_hostname]
+ @server_port = hash[:server_port]
+ @game = hash[:game]
+ @launch_arguments = hash[:launch_arguments]
+ @irc_profile = hash[:irc_profile]
+ end
+
+ def to_json(options)
+ {
+ name: @name,
+ nickname: @nickname,
+ password: @password,
+ server_profile: @server_profile,
+ server_hostname: @server_hostname,
+ server_port: @server_port,
+ game_title: @game_title,
+ launch_arguments: @launch_arguments,
+ irc_profile: @irc_profile
+ }.to_json(options)
+ end
+ end
+ end
+end
diff --git a/lib/asterisk/settings.rb b/lib/asterisk/settings.rb
new file mode 100644
index 0000000..2f5a9f3
--- /dev/null
+++ b/lib/asterisk/settings.rb
@@ -0,0 +1,26 @@
+class W3DHub
+ class Asterisk
+ class Settings
+ attr_accessor :theme, :preload_app, :enable_preload_app, :post_launch_app, :enable_post_launch_app
+
+ def initialize(hash)
+ @theme = hash[:theme].to_sym
+
+ @preload_app = hash[:preload_app]
+ @enable_preload_app = hash[:enable_preload_app]
+ @post_launch_app = hash[:post_launch_app]
+ @enable_post_launch_app = hash[:enable_post_launch_app]
+ end
+
+ def to_json(options)
+ {
+ theme: @theme,
+ preload_app: @preload_app,
+ enable_preload_app: @enable_preload_app,
+ post_launch_app: @post_launch_app,
+ enable_post_launch_app: @enable_post_launch_app
+ }.to_json(options)
+ end
+ end
+ end
+end
diff --git a/lib/asterisk/states/game_form.rb b/lib/asterisk/states/game_form.rb
new file mode 100644
index 0000000..4b48984
--- /dev/null
+++ b/lib/asterisk/states/game_form.rb
@@ -0,0 +1,102 @@
+class W3DHub
+ class Asterisk
+ class States
+ class GameForm < CyberarmEngine::GuiState
+ def setup
+ @game = @options[:editing]
+
+ theme W3DHub::THEME
+
+ background 0xee_444444
+
+ stack(width: 1.0, height: 1.0, margin: 256, background: 0xee_222222) do
+ # Title bar
+ flow(width: 1.0, height: 32, padding: 8) do
+ background 0x88_000000
+
+ # image "#{GAME_ROOT_PATH}/media/ui_icons/export.png", width: 32, align: :center, color: 0xaa_ffffff
+
+ # tagline "#{I18n.t(:"server_browser.direct_connect")}", fill: true, text_align: :center
+ tagline @game ? "Update Game" : "Add Game", width: 1.0, text_align: :center
+ end
+
+ stack(width: 1.0, fill: true, padding_left: 8, padding_right: 8) do
+ stack(width: 1.0, height: 60) do
+ para "Game or Mod Title:"
+ @game_title = edit_line "#{@game&.title}", width: 1.0
+ end
+
+ stack(width: 1.0, height: 60) do
+ para "Path to Executable:"
+
+ flow(width: 1.0) do
+ @game_path = edit_line "#{@game&.path}", width: 0.749
+ button "Browse...", width: 0.25, enabled: W3DHub.unix?, tip: W3DHub.unix? ? "Browse for game executable" : "Not available on Windows" do
+ path = W3DHub.ask_file
+ @game_path.value = path if !path.empty? && File.exist?(path)
+ end
+ end
+ end
+
+ flow(fill: true)
+
+ flow(width: 1.0, margin_top: 8, height: 40, padding_bottom: 8) do
+ button "Cancel", fill: true, margin_right: 4 do
+ pop_state
+ end
+
+ flow(fill: true)
+
+ @save_button = button "Save", fill: true, margin_left: 4, enabled: false do
+ pop_state
+ @options[:save_callback].call(
+ @game,
+ @game_path.value,
+ @game_title.value
+ )
+ end
+ end
+ end
+ end
+ end
+
+ def draw
+ previous_state&.draw
+
+ Gosu.flush
+
+ super
+ end
+
+ def update
+ super
+
+ @save_button.enabled = valid?
+ end
+
+ def close
+ pop_state
+ end
+
+ def button_down(id)
+ super
+
+ case id
+ when Gosu::KB_ESCAPE
+ pop_state
+ end
+ end
+
+ def valid?
+ existing_game = W3DHub::Store[:asterisk_config].games.find { |g| g.title == @game_title.value }
+ existing_game = nil if existing_game == @game
+
+ @game_title.value.length.positive? &&
+ @game_path.value.length.positive? &&
+ File.exist?(@game_path.value) &&
+ !existing_game
+ end
+ end
+ end
+ end
+end
diff --git a/lib/asterisk/states/irc_profile_form.rb b/lib/asterisk/states/irc_profile_form.rb
new file mode 100644
index 0000000..614f4f8
--- /dev/null
+++ b/lib/asterisk/states/irc_profile_form.rb
@@ -0,0 +1,117 @@
+class W3DHub
+ class Asterisk
+ class States
+ class IRCProfileForm < CyberarmEngine::GuiState
+ def setup
+ @profile = @options[:editing]
+
+ theme W3DHub::THEME
+
+ background 0xcc_000000
+
+ stack(width: 1.0, height: 248, margin: 48, padding: 16) do
+ caption @game ? "Update IRC Profile" : "Add IRC Profile", width: 1.0, text_align: :center
+
+ stack(width: 1.0, height: 60) do
+ flow(width: 1.0, height: 1.0) do
+ stack(width: 0.6, height: 1.0) do
+ para "IRC Nickname:"
+ @irc_nickname = edit_line "#{@profile&.nickname}", width: 1.0
+ end
+
+ stack(width: 0.4, height: 1.0) do
+ para "IRC Password:"
+ @irc_password = edit_line "#{@profile ? Base64.strict_decode64(@profile.password) : ''}", width: 1.0#, type: :password
+ end
+ end
+ end
+
+ stack(width: 1.0, height: 60) do
+ flow(width: 1.0, height: 1.0) do
+ stack(width: 0.75, height: 1.0) do
+ para "IRC Server IP or Hostname:"
+ @irc_hostname = edit_line "#{@profile&.server_hostname}", width: 1.0
+ end
+
+ stack(width: 0.249, height: 1.0) do
+ para "IRC Port:"
+ @irc_port = edit_line "#{@profile&.server_port || '6667'}", width: 1.0
+ end
+ end
+ end
+
+ stack(width: 1.0, height: 60) do
+ para "IRC Bot Name:"
+ @irc_bot = edit_line "#{@profile&.server_bot}", width: 1.0
+ end
+
+ flow(width: 1.0, margin_top: 8) do
+ button "Cancel", width: 0.5, margin_right: 4 do
+ pop_state
+ end
+
+ @save_button = button "Save", width: 0.5, margin_left: 4, enabled: false do
+ pop_state
+ @options[:save_callback].call(
+ @profile,
+ @irc_nickname.value,
+ @irc_password.value,
+ @irc_hostname.value,
+ @irc_port.value,
+ @irc_bot.value
+ )
+ end
+ end
+ end
+ end
+
+ # def draw
+ # previous_state&.draw
+
+ # Gosu.flush
+
+ # super
+ # end
+
+ def update
+ super
+
+ @save_button.enabled = valid?
+ end
+
+ def close
+ pop_state
+ end
+
+ def button_down(id)
+ super
+
+ case id
+ when Gosu::KB_ESCAPE
+ pop_state
+ end
+ end
+
+ def valid?
+ generated_name = IRCProfileForm.generate_profile_name(
+ @irc_nickname.value,
+ @irc_hostname.value,
+ @irc_port.value,
+ @irc_bot.value
+ )
+ existing_profile = W3DHub::Store[:asterisk_config].irc_profiles.find { |profile| profile.name == generated_name }
+
+ @irc_nickname.value.length.positive? &&
+ @irc_password.value.length.positive? && # May be optional?
+ @irc_hostname.value.length.positive? &&
+ @irc_port.value.length.positive? &&
+ @irc_bot.value.length.positive?
+ end
+
+ def self.generate_profile_name(nickname, hostname, port, bot)
+ "#{bot}@#{hostname}:#{port} as #{nickname}"
+ end
+ end
+ end
+ end
+end
diff --git a/lib/asterisk/states/server_profile_form.rb b/lib/asterisk/states/server_profile_form.rb
new file mode 100644
index 0000000..c16f3a7
--- /dev/null
+++ b/lib/asterisk/states/server_profile_form.rb
@@ -0,0 +1,76 @@
+class W3DHub
+ class Asterisk
+ class States
+ class ServerProfileForm < CyberarmEngine::GuiState
+ def setup
+ @server_profile = @options[:editing]
+
+ theme W3DHub::THEME
+
+ background 0xee_444444
+
+ stack(width: 1.0, height: 1.0, margin: 256, background: 0xee_222222) do
+ # Title bar
+ flow(width: 1.0, height: 32, padding: 8) do
+ background 0x88_000000
+
+ # image "#{GAME_ROOT_PATH}/media/ui_icons/export.png", width: 32, align: :center, color: 0xaa_ffffff
+
+ # tagline "#{I18n.t(:"server_browser.direct_connect")}", fill: true, text_align: :center
+ tagline @server_profile ? "Update Server Profile" : "Add Server Profile", width: 1.0, text_align: :center
+ end
+
+ stack(width: 1.0, fill: true, padding_left: 8, padding_right: 8) do
+ stack(width: 1.0, height: 65) do
+ para "Server Profile Name:"
+ @server_name = edit_line "#{@server_profile&.name}", width: 1.0
+ @server_name.subscribe(:changed) do |label|
+ @save_button.enabled = label.value.length.positive?
+ end
+ end
+
+ flow(fill: true)
+
+ flow(width: 1.0, height: 40, padding_bottom: 8) do
+ button "Cancel", fill: true, margin_right: 4 do
+ pop_state
+ end
+
+ flow(fill: true)
+
+ @save_button = button "Save", fill: true, margin_left: 4 do
+ pop_state
+ @options[:save_callback].call(
+ @server_profile,
+ @server_name.value
+ )
+ end
+ end
+ end
+ end
+ end
+
+ def draw
+ previous_state&.draw
+
+ Gosu.flush
+
+ super
+ end
+
+ def close
+ pop_state
+ end
+
+ def button_down(id)
+ super
+
+ case id
+ when Gosu::KB_ESCAPE
+ pop_state
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/common.rb b/lib/common.rb
index fcd04ab..fe6a7b7 100644
--- a/lib/common.rb
+++ b/lib/common.rb
@@ -43,4 +43,28 @@ class W3DHub
def self.home_directory
File.expand_path("~")
end
+
+ def self.ask_file(title: "Open File", filter: "*game*.exe")
+ if W3DHub.unix?
+ # search for command
+ cmds = %w{ zenity matedialog qarma kdialog }
+
+ command = cmds.find do |cmd|
+ cmd if system("which #{cmd}")
+ end
+
+ path = case File.basename(command)
+ when "zenity", "matedialog", "qarma"
+ `#{command} --file-selection --title "#{title}" --file-filter "#{filter}"`
+ when "kdialog"
+ `#{command} --title "#{title}" --getopenfilename . "#{filter}"`
+ else
+ raise "No known command found for system file selection dialog!"
+ end
+
+ path.strip
+ else
+ raise NotImplementedError
+ end
+ end
end
diff --git a/lib/states/direct_connect_dialog.rb b/lib/states/direct_connect_dialog.rb
index 0494dc8..89806fc 100644
--- a/lib/states/direct_connect_dialog.rb
+++ b/lib/states/direct_connect_dialog.rb
@@ -3,6 +3,7 @@ class W3DHub
class DirectConnectDialog < CyberarmEngine::GuiState
def setup
window.show_cursor = true
+ W3DHub::Store[:asterisk_config] ||= Asterisk::Config.new
theme(W3DHub::THEME)
@@ -23,28 +24,28 @@ class W3DHub
para "Server profiles", text_align: :center, width: 1.0
flow(width: 1.0, fill: true) do
- list = [""] # window.config.server_profiles.count.positive? ? window.config.server_profiles.map { |pf| pf.name }.insert(0, "") : [""]
+ list = W3DHub::Store[:asterisk_config].server_profiles.count.positive? ? W3DHub::Store[:asterisk_config].server_profiles.map { |pf| pf.name }.insert(0, "") : [""]
@server_profiles_list = list_box items: list, fill: true, height: 1.0
@server_profiles_list.subscribe(:changed) do |list|
list.items.delete("") if list.value != ""
- profile = window.config.server_profiles.find { |pf| pf.name == list.value }
- populate_from_server_profile(profile ? profile : window.config.settings)
+ profile = W3DHub::Store[:asterisk_config].server_profiles.find { |pf| pf.name == list.value }
+ populate_from_server_profile(profile ? profile : W3DHub::Store[:asterisk_config].settings)
valid_for_multiplayer?
end
button get_image("#{GAME_ROOT_PATH}/media/ui_icons/plus.png"), image_height: 1.0, tip: "Create new profile" do
- push_state(ServerProfileForm, save_callback: method(:save_server_profile))
+ push_state(Asterisk::States::ServerProfileForm, save_callback: method(:save_server_profile))
end
@server_delete_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/minus.png"), image_height: 1.0, tip: "Remove selected profile" do
push_state(ConfirmDialog, message: "Purge server profile")
end
- @server_edit_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/gear.png"), image_height: 1.0, tip: "Edit and save selected profile" do
- push_state(ServerProfileForm, editing: window.config.server_profiles.find { |pf| pf.name == @server_profiles_list.value }, save_callback: method(:save_server_profile))
+ @server_edit_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/save.png"), image_height: 1.0, tip: "Edit and save selected profile" do
+ push_state(Asterisk::States::ServerProfileForm, editing: W3DHub::Store[:asterisk_config].server_profiles.find { |pf| pf.name == @server_profiles_list.value }, save_callback: method(:save_server_profile))
end
end
end
@@ -98,7 +99,7 @@ class W3DHub
para "Game or Mod:"
flow(width: 1.0, fill: true) do
- list = [""] # window.config.games.count.positive? ? window.config.games.map { |g| g.title } : [""]
+ list = W3DHub::Store[:asterisk_config].games.count.positive? ? W3DHub::Store[:asterisk_config].games.map { |g| g.title } : [""]
@games_list = list_box items: list, fill: true, height: 1.0
@games_list.subscribe(:changed) do |list|
@@ -110,7 +111,7 @@ class W3DHub
end
button get_image("#{GAME_ROOT_PATH}/media/ui_icons/plus.png"), image_height: 1.0, tip: "Add game" do
- push_state(GameForm, save_callback: method(:save_game))
+ push_state(Asterisk::States::GameForm, save_callback: method(:save_game))
end
@game_delete_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/minus.png"), image_height: 1.0, tip: "Remove selected game" do
@@ -118,7 +119,7 @@ class W3DHub
end
@game_edit_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/gear.png"), image_height: 1.0, tip: "Edit selected game" do
- push_state(GameForm, editing: window.config.games.find { |g| g.title == @games_list.value }, save_callback: method(:save_game))
+ push_state(Asterisk::States::GameForm, editing: W3DHub::Store[:asterisk_config].games.find { |g| g.title == @games_list.value }, save_callback: method(:save_game))
end
end
end
@@ -137,23 +138,23 @@ class W3DHub
para "IRC Profile:"
flow(width: 1.0, fill: true) do
- @irc_profiles_list = list_box items: ["None"], fill: true, height: 1.0
+ @irc_profiles_list = list_box items: ["None"], fill: true, height: 1.0, enabled: false
@irc_profiles_list.subscribe(:changed) do |list|
@changes_made = true if @server_profiles_list.value.length.positive?
valid_for_multiplayer?
end
- button get_image("#{GAME_ROOT_PATH}/media/ui_icons/plus.png"), image_height: 1.0, tip: "Add IRC profile" do
- push_state(IRCProfileForm, save_callback: method(:save_irc_profile))
+ button get_image("#{GAME_ROOT_PATH}/media/ui_icons/plus.png"), image_height: 1.0, tip: "Add IRC profile", enabled: false do
+ push_state(Asterisk::States::IRCProfileForm, save_callback: method(:save_irc_profile))
end
- @irc_delete_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/minus.png"), image_height: 1.0, tip: "Remove selected IRC profile" do
+ @irc_delete_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/minus.png"), image_height: 1.0, tip: "Remove selected IRC profile", enabled: false do
push_state(ConfirmDialog, message: "")
end
- @irc_edit_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/gear.png"), image_height: 1.0, tip: "Edit selected IRC profile" do
- push_state(IRCProfileForm, editing: window.config.irc_profiles.find { |pf| pf.name == @irc_profiles_list.value }, save_callback: method(:save_irc_profile))
+ @irc_edit_button = button get_image("#{GAME_ROOT_PATH}/media/ui_icons/gear.png"), image_height: 1.0, tip: "Edit selected IRC profile", enabled: false do
+ push_state(Asterisk::States::IRCProfileForm, editing: W3DHub::Store[:asterisk_config].irc_profiles.find { |pf| pf.name == @irc_profiles_list.value }, save_callback: method(:save_irc_profile))
end
end
end
@@ -176,13 +177,150 @@ class W3DHub
end
end
- def draw
- previous_state&.draw
+ def update
+ super
- Gosu.flush
+ if @server_profiles_list.value == ""
+ @server_delete_button.enabled = false
+ @server_edit_button.enabled = false
+ else
+ @server_delete_button.enabled = true
+ @server_edit_button.enabled = true
+ end
+
+ if @games_list.value == ""
+ @game_delete_button.enabled = false
+ @game_edit_button.enabled = false
+ else
+ @game_delete_button.enabled = true
+ @game_edit_button.enabled = true
+ end
+
+ if @irc_profiles_list.value == "None"
+ @irc_delete_button.enabled = false
+ @irc_edit_button.enabled = false
+ else
+ @irc_delete_button.enabled = true
+ @irc_edit_button.enabled = true
+ end
+ end
+
+ def draw
+ if window.current_state == self
+ previous_state&.draw
+
+ Gosu.flush
+ end
super
end
+
+ def populate_from_server_profile(profile)
+ @server_nickname.value = profile.nickname
+ @server_password.value = Base64.strict_decode64(profile.password)
+ @server_hostname.value = profile.server_hostname
+ @server_port.value = profile.server_port
+
+ @games_list.choose = profile.game if @games_list.items.find { |game| game == profile.game }
+ @launch_arguments.value = profile.launch_arguments
+
+ @irc_profiles_list.choose = profile.irc_profile if @irc_profiles_list.items.find { |irc| irc == profile.irc_profile }
+ end
+
+ def valid_for_singleplayer?
+ @single_player_button&.enabled = @games_list.value != ""
+ end
+
+ def valid_for_multiplayer?
+ @join_server_button&.enabled = @games_list.value != "" &&
+ @server_nickname.value.length.positive? &&
+ @server_hostname.value.length.positive? &&
+ @server_port.value.length.positive?
+ end
+
+ def save_server_profile(updated, name)
+ if updated
+ updated.name = name
+ updated.nickname = @server_nickname.value
+ updated.password = Base64.strict_encode64(@server_password.value)
+ updated.server_profile = @server_profiles_list.value
+ updated.server_hostname = @server_hostname.value
+ updated.server_port = @server_port.value
+ updated.game = @games_list.value
+ updated.launch_arguments = @launch_arguments.value
+ updated.irc_profile = @irc_profiles_list.value
+ else
+ profile = Asterisk::ServerProfile.new({
+ name: name,
+ nickname: @server_nickname.value,
+ password: Base64.strict_encode64(@server_password.value),
+ server_profile: @server_profiles_list.value,
+ server_hostname: @server_hostname.value,
+ server_port: @server_port.value,
+ game: @games_list.value,
+ launch_arguments: @launch_arguments.value,
+ irc_profile: @irc_profiles_list.value
+ })
+
+ W3DHub::Store[:asterisk_config].server_profiles << profile
+ end
+
+ W3DHub::Store[:asterisk_config].save_config
+
+ @server_profiles_list.items = W3DHub::Store[:asterisk_config].server_profiles.map {|profile| profile.name }
+ @server_profiles_list.items << "" if @server_profiles_list.items.empty?
+ @server_profiles_list.choose = name
+
+ @changes_made = false
+ end
+
+ def save_game(updated, path, title)
+ if updated
+ updated.path = path
+ updated.title = title
+ else
+ game = Asterisk::Game.new({
+ path: path,
+ title: title
+ })
+
+ W3DHub::Store[:asterisk_config].games << game
+ end
+
+ W3DHub::Store[:asterisk_config].save_config
+
+ @games_list.items = W3DHub::Store[:asterisk_config].games.map {|g| g.title }
+ @games_list.choose = title
+ end
+
+ def save_irc_profile(updated, nickname, password, hostname, port, bot)
+ generated_name = Asterisk::States::IRCProfileForm.generate_profile_name(nickname, hostname, port, bot)
+
+ if updated
+ updated.name = generated_name
+ updated.nickname = nickname
+ updated.password = Base64.strict_encode64(password)
+ updated.server_hostname = hostname
+ updated.server_port = port
+ updated.server_bot = bot
+ else
+ profile = Asterisk::IRCProfile.new({
+ name: generated_name,
+ nickname: nickname,
+ password: Base64.strict_encode64(password),
+ server_hostname: hostname,
+ server_port: port,
+ server_bot: bot
+ })
+
+ W3DHub::Store[:asterisk_config].irc_profiles << profile
+ end
+
+ W3DHub::Store[:asterisk_config].save_config
+
+ @irc_profiles_list.items = W3DHub::Store[:asterisk_config].irc_profiles.map {| pf| pf.name }.insert(0, "None")
+ @irc_profiles_list.choose = generated_name
+ end
end
end
end
diff --git a/w3d_hub_linux_launcher.rb b/w3d_hub_linux_launcher.rb
index 392af6a..011d1eb 100644
--- a/w3d_hub_linux_launcher.rb
+++ b/w3d_hub_linux_launcher.rb
@@ -106,6 +106,15 @@ require_relative "lib/pages/login"
require_relative "lib/pages/settings"
require_relative "lib/pages/download_manager"
+require_relative "lib/asterisk/config"
+require_relative "lib/asterisk/game"
+require_relative "lib/asterisk/irc_profile"
+require_relative "lib/asterisk/server_profile"
+require_relative "lib/asterisk/settings"
+require_relative "lib/asterisk/states/game_form"
+require_relative "lib/asterisk/states/irc_profile_form"
+require_relative "lib/asterisk/states/server_profile_form"
+
logger.info(W3DHub::LOG_TAG) { "W3D Hub Linux Launcher v#{W3DHub::VERSION}" }
Thread.new do