use serde::{Deserialize, Serialize}; use std::collections::HashMap; use teloxide::prelude::*; #[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 recieved."); 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(); // Not working, and also the wikipedia API is so fast its not necessary. // bot.send_chat_action(msg.chat.id,teloxide::types::ChatAction::FindLocation).await?; 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?; } } None => { log::info!("Something other than a location recived."); bot.send_message(msg.chat.id, "Send a location to see nearby places that have a wikipedia page!").await?; } }; Ok(()) }) .await; }