Skip to content

Commit

Permalink
Add popularity as a search parameter
Browse files Browse the repository at this point in the history
This is related to the upvotes and downvotes that the puzzle has
in lichess.
  • Loading branch information
brianch committed Mar 21, 2024
1 parent 571a7ea commit a74d269
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 9 deletions.
1 change: 1 addition & 0 deletions settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"export_pgs": 50,
"last_min_rating": 0,
"last_max_rating": 1000,
"last_min_popularity": 0,
"last_theme": "All",
"last_opening": "Any",
"last_variation": {
Expand Down
2 changes: 2 additions & 0 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ pub struct OfflinePuzzlesConfig {
pub export_pgs: i32,
pub last_min_rating: i32,
pub last_max_rating: i32,
pub last_min_popularity: i32,
pub last_theme: TacticalThemes,
pub last_opening: Openings,
pub last_variation: Variation,
Expand All @@ -64,6 +65,7 @@ impl ::std::default::Default for OfflinePuzzlesConfig {
export_pgs: 50,
last_min_rating: 0,
last_max_rating: 1000,
last_min_popularity: 0,
last_theme: TacticalThemes::All,
last_opening: Openings::Any,
last_variation: Variation::ANY,
Expand Down
6 changes: 5 additions & 1 deletion src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ pub fn establish_connection() -> SqliteConnection {
.unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
}

pub fn get_favorites(min_rating: i32, max_rating: i32, theme: TacticalThemes, opening: Openings, variation: Variation, op_side: Option<OpeningSide>, result_limit: usize) -> Option<Vec<Puzzle>> {
pub fn get_favorites(min_rating: i32, max_rating: i32, min_popularity: i32, theme: TacticalThemes, opening: Openings, variation: Variation, op_side: Option<OpeningSide>, result_limit: usize) -> Option<Vec<Puzzle>> {
let mut conn = establish_connection();
let results;
let theme_filter = String::from("%") + theme.get_tag_name() + "%";
let limit = result_limit as i64;
if opening == Openings::Any {
results = favs
.filter(rating.between(min_rating, max_rating))
.filter(popularity.ge(min_popularity))
.filter(themes.like(theme_filter))
.limit(limit)
.load::<Puzzle>(&mut conn);
Expand All @@ -44,6 +45,7 @@ pub fn get_favorites(min_rating: i32, max_rating: i32, theme: TacticalThemes, op
if side == OpeningSide::White {
results = favs
.filter(rating.between(min_rating, max_rating))
.filter(popularity.ge(min_popularity))
.filter(themes.like(theme_filter))
.filter(opening_filter)
.filter(game_url.like("%black%"))
Expand All @@ -52,6 +54,7 @@ pub fn get_favorites(min_rating: i32, max_rating: i32, theme: TacticalThemes, op
} else if side == OpeningSide::Black {
results = favs
.filter(rating.between(min_rating, max_rating))
.filter(popularity.ge(min_popularity))
.filter(themes.like(theme_filter))
.filter(opening_filter)
.filter(game_url.not_like("%black%"))
Expand All @@ -60,6 +63,7 @@ pub fn get_favorites(min_rating: i32, max_rating: i32, theme: TacticalThemes, op
} else {
results = favs
.filter(rating.between(min_rating, max_rating))
.filter(popularity.ge(min_popularity))
.filter(themes.like(theme_filter))
.filter(opening_filter)
.limit(limit)
Expand Down
36 changes: 28 additions & 8 deletions src/search_tab.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use openings::{Openings, Variation};
pub enum SearchMesssage {
SliderMinRatingChanged(i32),
SliderMaxRatingChanged(i32),
SliderMinPopularityChanged(i32),
SelectTheme(PickListWrapper<TacticalThemes>),
SelectOpening(PickListWrapper<Openings>),
SelectVariation(PickListWrapper<Variation>),
Expand Down Expand Up @@ -207,6 +208,7 @@ pub struct SearchTab {
pub opening_side: Option<OpeningSide>,
slider_min_rating_value: i32,
slider_max_rating_value: i32,
slider_min_popularity: i32,
pub piece_theme_promotion: styles::PieceTheme,
pub piece_to_promote_to: Piece,

Expand All @@ -225,6 +227,7 @@ impl SearchTab {
opening_side: config::SETTINGS.last_opening_side,
slider_min_rating_value: config::SETTINGS.last_min_rating,
slider_max_rating_value: config::SETTINGS.last_max_rating,
slider_min_popularity: config::SETTINGS.last_min_popularity,
piece_theme_promotion: config::SETTINGS.piece_theme,
piece_to_promote_to: Piece::Queen,
show_searching_msg: false,
Expand All @@ -242,6 +245,9 @@ impl SearchTab {
} SearchMesssage::SliderMaxRatingChanged(new_value) => {
self.slider_max_rating_value = new_value;
Command::none()
} SearchMesssage::SliderMinPopularityChanged(new_value) => {
self.slider_min_popularity = new_value;
Command::none()
} SearchMesssage::SelectTheme(new_theme) => {
self.theme = new_theme;
Command::none()
Expand All @@ -261,20 +267,20 @@ impl SearchTab {
} SearchMesssage::ClickSearch => {
self.show_searching_msg = true;
SearchTab::save_search_settings(self.slider_min_rating_value,
self.slider_max_rating_value, self.theme.item,
self.slider_max_rating_value, self.slider_min_popularity, self.theme.item,
self.opening.item, self.variation.item.clone(), self.opening_side);

let config = load_config();
if self.base == Some(SearchBase::Favorites) {
Command::perform(
SearchTab::search_favs(self.slider_min_rating_value,
self.slider_max_rating_value,
self.slider_max_rating_value, self.slider_min_popularity,
self.theme.item, self.opening.item, self.variation.item.clone(),
self.opening_side, config.search_results_limit), Message::LoadPuzzle)
} else {
Command::perform(
SearchTab::search(self.slider_min_rating_value,
self.slider_max_rating_value,
self.slider_max_rating_value, self.slider_min_popularity,
self.theme.item, self.opening.item, self.variation.item.clone(),
self.opening_side, config.search_results_limit), Message::LoadPuzzle)
}
Expand All @@ -285,13 +291,14 @@ impl SearchTab {
}
}

pub fn save_search_settings(min_rating: i32, max_rating: i32, theme: TacticalThemes, opening: Openings, variation: Variation, op_side: Option<OpeningSide>) {
pub fn save_search_settings(min_rating: i32, max_rating: i32, min_popularity: i32, theme: TacticalThemes, opening: Openings, variation: Variation, op_side: Option<OpeningSide>) {
let file = std::fs::File::open("settings.json");
if let Ok(file) = file {
let buf_reader = BufReader::new(file);
if let Ok(mut config) = serde_json::from_reader::<std::io::BufReader<std::fs::File>, config::OfflinePuzzlesConfig>(buf_reader) {
config.last_min_rating = min_rating;
config.last_max_rating = max_rating;
config.last_min_popularity = min_popularity;
config.last_theme = theme;
config.last_opening = opening;
config.last_variation = variation;
Expand All @@ -307,11 +314,11 @@ impl SearchTab {
}
}

pub async fn search_favs(min_rating: i32, max_rating: i32, theme: TacticalThemes, opening: Openings, variation:Variation, op_side: Option<OpeningSide>, result_limit: usize) -> Option<Vec<config::Puzzle>> {
db::get_favorites(min_rating, max_rating, theme, opening, variation, op_side, result_limit)
pub async fn search_favs(min_rating: i32, max_rating: i32, min_popularity: i32, theme: TacticalThemes, opening: Openings, variation:Variation, op_side: Option<OpeningSide>, result_limit: usize) -> Option<Vec<config::Puzzle>> {
db::get_favorites(min_rating, max_rating, min_popularity, theme, opening, variation, op_side, result_limit)
}

pub async fn search(min_rating: i32, max_rating: i32, theme: TacticalThemes, opening: Openings, variation: Variation, op_side: Option<OpeningSide>, result_limit: usize) -> Option<Vec<config::Puzzle>> {
pub async fn search(min_rating: i32, max_rating: i32, min_popularity: i32, theme: TacticalThemes, opening: Openings, variation: Variation, op_side: Option<OpeningSide>, result_limit: usize) -> Option<Vec<config::Puzzle>> {
let mut puzzles: Vec<config::Puzzle> = Vec::new();

let reader = csv::ReaderBuilder::new()
Expand Down Expand Up @@ -339,6 +346,7 @@ impl SearchTab {
if let Ok(record) = result {
if record.opening.contains(opening_tag) &&
record.rating >= min_rating && record.rating <= max_rating &&
record.popularity >= min_popularity &&
record.themes.contains(theme.get_tag_name()) {
puzzles.push(record);
}
Expand All @@ -353,6 +361,7 @@ impl SearchTab {
if record.opening.contains(opening_tag) &&
!record.game_url.contains("black") &&
record.rating >= min_rating && record.rating <= max_rating &&
record.popularity >= min_popularity &&
record.themes.contains(theme.get_tag_name()) {
puzzles.push(record);
}
Expand All @@ -367,6 +376,7 @@ impl SearchTab {
if record.opening.contains(opening_tag) &&
record.game_url.contains("black") &&
record.rating >= min_rating && record.rating <= max_rating &&
record.popularity >= min_popularity &&
record.themes.contains(theme.get_tag_name()) {
puzzles.push(record);
}
Expand All @@ -381,6 +391,7 @@ impl SearchTab {
for result in reader.deserialize::<config::Puzzle>() {
if let Ok(record) = result {
if record.rating >= min_rating && record.rating <= max_rating &&
record.popularity >= min_popularity &&
record.themes.contains(theme.get_tag_name()) {
puzzles.push(record);
}
Expand Down Expand Up @@ -433,6 +444,15 @@ impl Tab for SearchTab {
),
Text::new(self.slider_max_rating_value.to_string())
].width(Length::Fill),
row![
Text::new(lang::tr(&self.lang, "min_popularity")),
Slider::new(
-100..=100,
self.slider_min_popularity,
SearchMesssage::SliderMinPopularityChanged,
),
Text::new(self.slider_min_popularity.to_string())
].width(Length::Fill),
Text::new(lang::tr(&self.lang, "theme_label")),
PickList::new(
PickListWrapper::get_themes(self.lang),
Expand All @@ -450,7 +470,7 @@ impl Tab for SearchTab {
PickListWrapper::get_variations(self.lang, Some(&self.opening.item)),
Some(self.variation.clone()),
SearchMesssage::SelectVariation
)
),
].padding([0, 0, 30, 0]).spacing(10).align_items(Alignment::Center);

if self.opening.item != Openings::Any {
Expand Down
1 change: 1 addition & 0 deletions src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ impl SettingsTab {
export_pgs: self.export_pgs.parse().unwrap(),
last_min_rating: self.saved_configs.last_min_rating,
last_max_rating: self.saved_configs.last_max_rating,
last_min_popularity: self.saved_configs.last_min_popularity,
last_theme: self.saved_configs.last_theme,
last_opening: self.saved_configs.last_opening,
last_variation: self.saved_configs.last_variation.clone(),
Expand Down
1 change: 1 addition & 0 deletions translations/en-US/ocp.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ lichess_db = Lichess DB
my_favories = My Favorites
min_rating = Min. Rating:{" "}
max_rating = Max. Rating:{" "}
min_popularity = Popularity (-100 to 100):{" "}
theme_label = Tactics theme:
in_opening = In the opening:
in_the_variation = Variation:
Expand Down
1 change: 1 addition & 0 deletions translations/es/ocp.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ lichess_db = Base de datos de Lichess
my_favories = Mis favoritos
min_rating = Rating Min.:{" "}
max_rating = Rating Max.:{" "}
min_popularity = Popularidad (de -100 a 100):{" "}
theme_label = Tema táctico:
in_opening = En la apertura:
in_the_variation = Variante:
Expand Down
1 change: 1 addition & 0 deletions translations/fr/ocp.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ lichess_db = BdD Lichess
my_favories = Mes favoris
min_rating = Classement minimal:{" "}
max_rating = Classement maximal:{" "}
min_popularity = Popularity (-100 to 100):{" "}
theme_label = Thème tactique:
in_opening = Issu de l'ouverture:
in_the_variation = Avec la variante:
Expand Down
1 change: 1 addition & 0 deletions translations/pt-BR/ocp.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ lichess_db = Banco de Dados do Lichess
my_favories = Meus Favoritos
min_rating = Rating Min.:{" "}
max_rating = Rating Máx.:{" "}
min_popularity = Popularidade (de -100 a 100):{" "}
theme_label = Tema Tático:
in_opening = Na Abertura:
in_the_variation = Variante:
Expand Down

0 comments on commit a74d269

Please sign in to comment.