Index: Cargo.lock ================================================================== --- Cargo.lock +++ Cargo.lock @@ -258,13 +258,13 @@ "zeroize", ] [[package]] name = "aws-lc-sys" -version = "0.39.0" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" +checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" dependencies = [ "cc", "cmake", "dunce", "fs_extra", @@ -352,13 +352,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.57" +version = "1.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" dependencies = [ "find-msvc-tools", "jobserver", "libc", "shlex", @@ -396,13 +396,13 @@ "windows-link", ] [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] [[package]] @@ -1404,14 +1404,16 @@ "libc", ] [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "cc4c90f45aa2e6eacbe8645f77fdea542ac97a494bcd117a67df9ff4d611f995" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] [[package]] @@ -1538,13 +1540,13 @@ "simd-adler32", ] [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", "windows-sys 0.61.2", ] @@ -2068,13 +2070,13 @@ "url", ] [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2390,13 +2392,13 @@ "rand_core 0.6.4", ] [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3142,13 +3144,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "6523d69017b7633e396a89c5efab138161ed5aafcbc8d3e5c5a42ae38f50495a" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", @@ -3155,37 +3157,33 @@ "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "2d1faf851e778dfa54db7cd438b70758eba9755cb47403f3496edd7c8fc212f0" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "4e3a6c758eb2f701ed3d052ff5737f5bfe6614326ea7f3bbac7156192dc32e67" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "921de2737904886b52bcbb237301552d05969a6f9c40d261eb0533c8b055fedf" dependencies = [ "bumpalo", "proc-macro2", "quote", "syn", @@ -3192,13 +3190,13 @@ "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "a93e946af942b58934c604527337bad9ae33ba1d5c6900bbb41c2c07c2364a93" dependencies = [ "unicode-ident", ] [[package]] @@ -3214,13 +3212,13 @@ "web-sys", ] [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "84cde8507f4d7cfcb1185b8cb5890c494ffea65edbe1ba82cfd63661c805ed94" dependencies = [ "js-sys", "wasm-bindgen", ] Index: src/command.rs ================================================================== --- src/command.rs +++ src/command.rs @@ -53,11 +53,11 @@ pub async fn test (core: &Core, msg: &Message) -> Result<()> { let sender: i64 = msg.sender.get_user_id() .stack_err("Ignoring unreal users.")?.into(); let feeds = core.get_feeds(sender).await.stack()?; let kb = get_kb(&Callback::list("", 0), feeds).await.stack()?; - core.tg.send(MyMessage::html_to_kb(format!("List of feeds owned by {:?}:", msg.sender), msg.chat.get_id(), kb)).await.stack()?; + core.tg.send(MyMessage::html_to_kb(format!("List of feeds owned by {:?}:", msg.sender.get_user_username()), msg.chat.get_id(), kb)).await.stack()?; Ok(()) } /// Handle channel-management commands that operate on a single numeric source ID. /// @@ -82,12 +82,13 @@ "/check" => core.check(number, false, None).await .context("Channel check failed.")?.into(), "/clean" => conn.clean(number, sender).await.stack()?, "/enable" => conn.enable(number, sender).await.stack()?.into(), "/delete" => { + let res = conn.delete(number, sender).await.stack()?; core.rm_feed(sender.into(), &number).await.stack()?; - conn.delete(number, sender).await.stack()? + res } "/disable" => conn.disable(number, sender).await.stack()?.into(), _ => bail!("Command {command} {words:?} not handled."), }, } Index: src/core.rs ================================================================== --- src/core.rs +++ src/core.rs @@ -361,14 +361,14 @@ Ok(reply.join("\n\n")) } /// Returns current cached list of feed for requested user, or loads data from database pub async fn get_feeds (&self, owner: i64) -> Result>>> { - let mut conn = self.db.begin().await.stack()?; let mut feeds = self.feeds.lock_arc().await; Ok(match feeds.get(&owner) { None => { + let mut conn = self.db.begin().await.stack()?; let feed_list = conn.get_feeds(owner).await.stack()?; let mut map = HashMap::new(); for feed in feed_list { map.insert(feed.source_id, feed.channel); }; @@ -390,10 +390,12 @@ feed.insert(source_id, channel); } else { inserted = false; } } + // in case insert failed - we miss the entry we needed to expand, reload everything from + // database if !inserted { self.get_feeds(owner).await.stack()?; } Ok(()) } @@ -407,10 +409,11 @@ let mut feed = feed.lock_arc().await; feed.remove(source_id); dropped = true; } } + // in case we failed to found feed we need to remove - just reload everything from database if !dropped { self.get_feeds(owner).await.stack()?; } Ok(()) } Index: src/sql.rs ================================================================== --- src/sql.rs +++ src/sql.rs @@ -234,10 +234,11 @@ .bind(id.into()) .execute(&mut *self.0).await.stack()?; Ok(()) } + #[allow(clippy::too_many_arguments)] // XXX at least for now… pub async fn update (&mut self, update: Option, channel: &str, channel_id: i64, url: &str, iv_hash: Option<&str>, url_re: Option<&str>, owner: I) -> Result<&str> where I: Into { match match update { Some(id) => { sqlx::query("update rsstg_source set channel_id = $2, url = $3, iv_hash = $4, owner = $5, channel = $6, url_re = $7 where source_id = $1") Index: src/tg_bot.rs ================================================================== --- src/tg_bot.rs +++ src/tg_bot.rs @@ -72,31 +72,52 @@ (page * 5, 5 + page * 5) } else { (0, 6) }; let mut i = 0; - for (id, name) in feeds.iter() { - if i < start { continue } - if i > end { break } - i += 1; - kb.push(vec![ - InlineKeyboardButton::for_callback_data( - format!("{}. {}", id, name), - Callback::list("xxx", *page).to_string()), // XXX edit - ]) - } if name.is_empty() { - // no name - reverting to pages, any unknown number means last page - kb.push(vec![ - InlineKeyboardButton::for_callback_data("1", - Callback::list("xxx", 0).to_string()), - ]) + for (id, name) in feeds.iter() { + if i < start { continue } + if i > end { break } + i += 1; + kb.push(vec![ + InlineKeyboardButton::for_callback_data( + format!("{}. {}", id, name), + Callback::list("xxx", *page).to_string()), // XXX edit + ]); + } } else { - kb.push(vec![ - InlineKeyboardButton::for_callback_data("1", - Callback::list("xxx", 0).to_string()), - ]) + let mut found = false; + let mut first_page = None; + for (id, feed_name) in feeds.iter() { + if name == feed_name { + found = true; + } + i += 1; + kb.push(vec![ + InlineKeyboardButton::for_callback_data( + format!("{}. {}", id, feed_name), + Callback::list("xxx", *page).to_string()), // XXX edit + ]); + if i > end { + // page complete, if found we got the right page, if not - reset and + // continue. + if found { + break + } else { + if first_page.is_none() { + first_page = Some(kb); + } + kb = vec![]; + i = 0 + } + } + } + if !found { + // name not found, showing first page + kb = first_page.unwrap_or_default(); + } } if long { kb.push(vec![ InlineKeyboardButton::for_callback_data("<<", Callback::list("", if *page == 0 { *page } else { page - 1 } ).to_string()),