diff --git a/Applications/IRCClient/IRCAppWindow.cpp b/Applications/IRCClient/IRCAppWindow.cpp index 05fa68dd6da..61d36415133 100644 --- a/Applications/IRCClient/IRCAppWindow.cpp +++ b/Applications/IRCClient/IRCAppWindow.cpp @@ -49,8 +49,8 @@ IRCAppWindow& IRCAppWindow::the() return *s_the; } -IRCAppWindow::IRCAppWindow() - : m_client(IRCClient::construct()) +IRCAppWindow::IRCAppWindow(String server, int port) + : m_client(IRCClient::construct(server, port)) { ASSERT(!s_the); s_the = this; diff --git a/Applications/IRCClient/IRCAppWindow.h b/Applications/IRCClient/IRCAppWindow.h index 2faedf0cf0d..241955af419 100644 --- a/Applications/IRCClient/IRCAppWindow.h +++ b/Applications/IRCClient/IRCAppWindow.h @@ -41,7 +41,7 @@ public: void set_active_window(IRCWindow&); private: - IRCAppWindow(); + IRCAppWindow(String server, int port); void setup_client(); void setup_actions(); diff --git a/Applications/IRCClient/IRCClient.cpp b/Applications/IRCClient/IRCClient.cpp index 4963e28aad7..a052009e71d 100644 --- a/Applications/IRCClient/IRCClient.cpp +++ b/Applications/IRCClient/IRCClient.cpp @@ -67,7 +67,7 @@ enum IRCNumeric { ERR_NICKNAMEINUSE = 433, }; -IRCClient::IRCClient() +IRCClient::IRCClient(String server, int port) : m_nickname("seren1ty") , m_client_window_list_model(IRCWindowListModel::create(*this)) , m_log(IRCLogBuffer::create()) @@ -76,8 +76,14 @@ IRCClient::IRCClient() struct passwd* user_pw = getpwuid(getuid()); m_socket = Core::TCPSocket::construct(this); m_nickname = m_config->read_entry("User", "Nickname", String::format("%s_seren1ty", user_pw->pw_name)); - m_hostname = m_config->read_entry("Connection", "Server", ""); - m_port = m_config->read_num_entry("Connection", "Port", 6667); + + if (server.is_empty()) { + m_hostname = m_config->read_entry("Connection", "Server", ""); + m_port = m_config->read_num_entry("Connection", "Port", 6667); + } else { + m_hostname = server; + m_port = port ? port : 6667; + } m_show_join_part_messages = m_config->read_bool_entry("Messaging", "ShowJoinPartMessages", 1); m_show_nick_change_messages = m_config->read_bool_entry("Messaging", "ShowNickChangeMessages", 1); diff --git a/Applications/IRCClient/IRCClient.h b/Applications/IRCClient/IRCClient.h index c8fb15c9e49..663d8bace67 100644 --- a/Applications/IRCClient/IRCClient.h +++ b/Applications/IRCClient/IRCClient.h @@ -138,7 +138,7 @@ public: void add_server_message(const String&, Color = Color::Black); private: - IRCClient(); + IRCClient(String server, int port); struct Message { String prefix; diff --git a/Applications/IRCClient/main.cpp b/Applications/IRCClient/main.cpp index 3ae27f77d6b..10cb9d7e39b 100644 --- a/Applications/IRCClient/main.cpp +++ b/Applications/IRCClient/main.cpp @@ -32,7 +32,7 @@ int main(int argc, char** argv) { - if (pledge("stdio inet dns unix shared_buffer cpath rpath fattr", nullptr) < 0) { + if (pledge("stdio inet dns unix shared_buffer cpath rpath fattr wpath cpath", nullptr) < 0) { perror("pledge"); return 1; } @@ -44,12 +44,35 @@ int main(int argc, char** argv) GUI::Application app(argc, argv); - if (pledge("stdio inet dns unix shared_buffer rpath", nullptr) < 0) { + if (pledge("stdio inet dns unix shared_buffer rpath wpath cpath", nullptr) < 0) { perror("pledge"); return 1; } - auto app_window = IRCAppWindow::construct(); + URL url = ""; + if (app.args().size() >= 1) { + url = URL::create_with_url_or_path(app.args()[0]); + + if (url.protocol().to_lowercase() == "ircs") { + fprintf(stderr, "Secure IRC over SSL/TLS (ircs) is not supported\n"); + return 1; + } + + if (url.protocol().to_lowercase() != "irc") { + fprintf(stderr, "Unsupported protocol\n"); + return 1; + } + + if (url.host().is_empty()) { + fprintf(stderr, "Invalid URL\n"); + return 1; + } + + if (!url.port() || url.port() == 80) + url.set_port(6667); + } + + auto app_window = IRCAppWindow::construct(url.host(), url.port()); app_window->show(); return app.exec(); }