From ae76794709267b9ca32d725b1f005669f1cc0503 Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Sun, 26 Feb 2023 03:23:34 +0400
Subject: [PATCH] Fixed convertion repetitions.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 src/bot/handlers/basic/currency_converter.rs | 33 +++++++++++++++-----
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/bot/handlers/basic/currency_converter.rs b/src/bot/handlers/basic/currency_converter.rs
index 76ded65..5acfc21 100644
--- a/src/bot/handlers/basic/currency_converter.rs
+++ b/src/bot/handlers/basic/currency_converter.rs
@@ -1,4 +1,7 @@
-use std::{collections::HashMap, time::Duration};
+use std::{
+    collections::{HashMap, HashSet},
+    time::Duration,
+};
 
 use grammers_client::{Client, InputMessage, Update};
 use regex::Regex;
@@ -131,6 +134,7 @@ impl Handler for CurrencyConverter {
 
         let mut calucates = Vec::new();
 
+        let mut mapped = HashSet::new();
         for capture in CUR_REGEX.captures_iter(message.text()) {
             // We parse supplied value from message
             let Some(num_value) = capture
@@ -149,25 +153,38 @@ impl Handler for CurrencyConverter {
                 .or(cur_name) else{
                     continue;
                 };
+            let fingerprint = format!("{num_value:.5} {cur_name}");
+            // Check if we already processed this value.
+            if mapped.contains(&fingerprint) {
+                continue;
+            }
+            // Add a value to not calculate it again.
+            mapped.insert(fingerprint);
+            // Now we want to know current nominal for this value.
             let Some(nominal) = valutes
+                // We search for it using cur_name.
                 .get(cur_name)
                 .and_then(|info| info.get("Nominal"))
                 .map(ToString::to_string)
                 .and_then(|value| value.as_str().parse::<f64>().ok())
+                // If the name cannot be found, we continue.
                 else{
                     continue;
                 };
-            let calculated = valutes
+            // Now we want to know multiplier.
+            let Some(multiplier) = valutes
                 .get(cur_name)
                 .and_then(|info| info.get("Value"))
                 .map(ToString::to_string)
                 .and_then(|value| value.as_str().parse::<f64>().ok())
-                .map(|multiplier| multiplier * num_value / nominal);
-            if let Some(value) = calculated {
-                calucates.push(format!(
-                    "<pre>{num_value} {cur_name} = {value:.2} RUB</pre><br>"
-                ));
-            }
+                else{
+                    continue;
+                };
+
+            calucates.push(format!(
+                "<pre>{num_value} {cur_name} = {value:.2} RUB</pre><br>",
+                value = multiplier * num_value / nominal,
+            ));
         }
 
         if !calucates.is_empty() {
-- 
GitLab