use serde::{Deserialize, Serialize}; use std::collections::HashMap; use teloxide::prelude::*; use teloxide::types::{ButtonRequest, KeyboardButton, KeyboardMarkup}; #[derive(Debug, Deserialize, Serialize)] pub struct PageInfo { pageid: usize, ns: usize, title: String, contentmodel: String, pagelanguage: String, pagelanguagehtmlcode: String, pagelanguagedir: String, touched: String, lastrevid: usize, length: usize, } #[derive(Debug, Deserialize, Serialize)] pub struct GeoSearch { pageid: usize, ns: usize, title: String, lat: f64, lon: f64, dist: f32, primary: Option, } #[derive(Debug, Deserialize, Serialize)] pub struct Query { geosearch: Option>, pages: Option>, } #[derive(Debug, Deserialize, Serialize)] pub struct Root { batchcomplete: bool, query: Query, } #[tokio::main] async fn main() { pretty_env_logger::init(); log::info!("Starting Wiki Locations Bot"); let bot = Bot::from_env(); teloxide::repl(bot, |bot: Bot, msg: Message| async move { log::info!("Message received."); let location_button = KeyboardButton { text: "Nearby Articles".to_string(), request: Some(ButtonRequest::Location), }; let location_button_markup = KeyboardMarkup::new([[location_button]]) .one_time_keyboard(true) .resize_keyboard(true); match msg.location() { Some(user_location) => { log::info!("Location received."); bot.send_message(msg.chat.id, "Searching for nearby locations...").await?; let nearby_locations = ureq::get(&format!( "https://en.wikipedia.org/w/api.php?action=query&format=json&list=geosearch&formatversion=2&gscoord={}|{}&gsradius=10000&gslimit=5", user_location.latitude, user_location.longitude )) .call() .unwrap() .into_json::() .unwrap() .query .geosearch .unwrap(); for location in nearby_locations { bot.send_location(msg.chat.id, location.lat, location.lon).await?; let url = teloxide::utils::markdown::link(&format!("http://en.wikipedia.org/?curid={}", location.pageid), &location.title); let bold_url = teloxide::utils::markdown::bold(&url); bot.send_message(msg.chat.id, bold_url) .parse_mode(teloxide::types::ParseMode::MarkdownV2) .await?; } bot.send_message(msg.chat.id, "Send a location to see nearby places that have a wikipedia page!") .reply_markup(location_button_markup) .await?; } None => { log::info!("Something other than a location received."); bot.send_message(msg.chat.id, "Send a location to see nearby places that have a wikipedia page!") .reply_markup(location_button_markup) .await?; } }; Ok(()) }) .await; }