diff --git a/freechat-client/package-lock.json b/freechat-client/package-lock.json index aa0d497..cc0c01b 100644 --- a/freechat-client/package-lock.json +++ b/freechat-client/package-lock.json @@ -259,14 +259,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "bufferutil": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", - "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", - "requires": { - "node-gyp-build": "^4.2.0" - } - }, "cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -330,19 +322,11 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" }, @@ -350,7 +334,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -445,16 +430,6 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -462,25 +437,6 @@ "dev": true, "optional": true }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -488,21 +444,6 @@ "dev": true, "optional": true }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" - } - } - }, "extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -645,11 +586,6 @@ "dev": true, "optional": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -826,16 +762,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node-gyp-build": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", - "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" - }, "normalize-url": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", @@ -1070,11 +996,6 @@ "dev": true, "optional": true }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", @@ -1088,14 +1009,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, "typescript": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", @@ -1116,42 +1029,21 @@ "prepend-http": "^2.0.0" } }, - "utf-8-validate": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz", - "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==", - "requires": { - "node-gyp-build": "^4.2.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "websocket": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.33.tgz", - "integrity": "sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA==", - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + "ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" }, "yallist": { "version": "4.0.0", diff --git a/freechat-client/package.json b/freechat-client/package.json index bbe1458..397776a 100644 --- a/freechat-client/package.json +++ b/freechat-client/package.json @@ -16,7 +16,7 @@ "jsonwebtoken": "^8.5.1", "popper.js": "^1.16.1", "typescript": "^4.2.3", - "websocket": "^1.0.33" + "ws": "^7.4.4" }, "devDependencies": { "electron": "^7.3.3" diff --git a/tui/src/cache.rs b/tui/src/cache.rs index 9d31957..9df99ae 100644 --- a/tui/src/cache.rs +++ b/tui/src/cache.rs @@ -16,16 +16,11 @@ use crate::api_types::Channel; use crate::net; use crate::command::Command; use crate::config::{ConfigFile, ServerConfig}; -use tokio_tungstenite::connect_async; -use futures::StreamExt; use std::collections::HashMap; use crate::api_types as api; type ChannelMeta = Channel; -async fn nop() { -} - struct ChannelCache { pub meta: ChannelMeta, pub messages: Vec @@ -67,17 +62,6 @@ impl Cache { } } - pub fn find_serv(&self, portion: String) -> Option<(String, u64)> { - let item = self.servers.iter() - .find(|(url, _)| url.contains(portion.as_str())); - - if let Some((url, cache)) = item { - Some((url.clone(), cache.meta.user.id)) - } else { - None - } - } - pub async fn switch_channel(&mut self, id: u64) -> Command { if let None = self.active_server { return Command::Failure("No active server set!".into()) @@ -99,48 +83,29 @@ impl Cache { } - fn new_message(&mut self, msg: api::Message, url: String, chan_id: u64) { + pub fn set_jwt(&mut self, url: &str, jwt: &str) -> bool { + let mut set = false; + for (surl, serv) in self.servers.iter_mut() { + if url == surl { + serv.meta.user.jwt = Some(jwt.into()); + set = true; + } + }; + return set; + } + + fn _new_message(&mut self, msg: api::Message, url: String, chan_id: u64) { self.servers.get_mut(&url).unwrap() .channels.get_mut(&chan_id).unwrap() .messages.push(msg); } - pub async fn switch_server(&mut self, host: &str) -> (Command, Option) { - // TODO: clean this func to be less ugly/easier to read - let mut found = false; - let mut err_msg = String::from("Nothing found"); - let mut fresh_token: Option = None; - for (url, meta) in self.servers.iter_mut() { - if url.contains(host) { - let id = meta.meta.user.id; - let secret = &meta.meta.user.secret; - found = match net::login(url, id, secret).await { - Ok(jwt) => { - fresh_token = Some(jwt.clone()); - meta.meta.user.jwt = Some(jwt); - self.active_server = Some(meta.meta.clone()); - self.active_text = None; - true - }, - Err(e) => { - err_msg = match e.is_status() { - true => format!("{:?}", e.status().unwrap()), - false => format!("Issue connecting to server") - }; - meta.meta.user.jwt = None; - false - } - }; - meta.meta.user.jwt = Some(String::from("asdf")); - break + pub fn set_active(&mut self, url: &str) { + for (surl, serv) in self.servers.iter() { + if url == surl { + self.active_server = Some(serv.meta.clone()); } } - - if found { - (Command::Text(format!("logged in - /lc to list to list channels")), fresh_token) - } else { - (Command::Failure(err_msg), None) - } } pub async fn send_message(&self, msg: &str) -> Command { @@ -156,7 +121,7 @@ impl Cache { Err(_) => Command::Failure("Couldn't send text message".into()) } } - Command::Text("yes".into()) + Command::Text("No active channel".into()) } pub fn list_hosts(&self) -> Command { diff --git a/tui/src/config.rs b/tui/src/config.rs index 1849131..452a63d 100644 --- a/tui/src/config.rs +++ b/tui/src/config.rs @@ -43,6 +43,16 @@ impl ConfigFile { Ok(()) } + + pub fn find_login_data(&self, url_portion: &str) -> Option<(u64, String, String)> { + let mut found: Option<(u64, String, String)> = None; + for serv in self.servers.iter() { + if serv.server.url.contains(url_portion) { + found = Some((serv.user.id, serv.user.secret.clone(), serv.server.url.clone())) + } + } + return found; + } } diff --git a/tui/src/main.rs b/tui/src/main.rs index 5a44878..44c9ac6 100644 --- a/tui/src/main.rs +++ b/tui/src/main.rs @@ -37,8 +37,7 @@ struct App { /// Current input mode input_mode: InputMode, /// History of recorded messages - messages: Mutex>, - cache: Cache + messages: Vec, } impl App { @@ -54,8 +53,7 @@ impl App { App { input: String::new(), input_mode: InputMode::Normal, - messages: Mutex::new(init_commands), - cache + messages: init_commands, } } } @@ -113,6 +111,7 @@ async fn main() -> Result<(), Box> { // Create default app state let mut app = App::new(&config); + let cache: Mutex = Mutex::new(Cache::from(&config)); loop { // Draw UI @@ -157,7 +156,7 @@ async fn main() -> Result<(), Box> { f.render_widget(input, chunks[1]); let mut lines: Vec = Vec::new(); - let msgs = app.messages.lock().unwrap(); + let msgs = &app.messages; for cmd in msgs.iter().rev() { &lines.push(cmd.styled()); } @@ -219,27 +218,32 @@ async fn main() -> Result<(), Box> { let raw: String = app.input.drain(..).collect(); let trimmed = raw.trim(); - // ensure that we don't bother with empty input + // TODO: flattten me mommy if trimmed.len() != 0 { let cmd = Command::from(trimmed); - app.messages.lock().unwrap().push(match cmd { + app.messages.push(match cmd { // only for networked commands do we need to touch cache Command::Channel(id) => { - app.cache.switch_channel(id).await + cache.lock().unwrap().switch_channel(id).await }, Command::Server(url_portion) => { - if let Some((url, id)) = app.cache.find_serv(url_portion) { - let (cmd, jwt) = app.cache.switch_server(url.as_str()).await; - let url = net::ws_url(url.as_str(), jwt); - // maybe hook some message passing listener here? - cmd + if let Some((id, secret, url)) = config.find_login_data(&url_portion) { + match net::login(&url, id, &secret).await { + Ok(jwt) => if cache.lock().unwrap().set_jwt(&url, &jwt) { + cache.lock().unwrap().set_active(&url); + Command::Text("[Tell shock to make this ux not suck btw] /lc to fetch/update channels".into()) + } else { + Command::Failure("Token could not be set".into()) + }, + Err(_) => Command::Failure(format!("Unable to login to {}", url)) + } } else { Command::Failure("No server found".into()) } }, - Command::Message(msg) => app.cache.send_message(&msg).await, - Command::ListHost => app.cache.list_hosts(), - Command::ListChannel => app.cache.list_channels().await, + Command::Message(msg) => cache.lock().unwrap().send_message(&msg).await, + Command::ListHost => cache.lock().unwrap().list_hosts(), + Command::ListChannel => cache.lock().unwrap().list_channels().await, _ => cmd }); } diff --git a/tui/src/net.rs b/tui/src/net.rs index 8188e99..5b31608 100644 --- a/tui/src/net.rs +++ b/tui/src/net.rs @@ -61,3 +61,4 @@ pub fn ws_url(base: &str, jwt: Option) -> String { let _ = url.set_scheme("ws"); url.to_string() } +