Compare commits

..

No commits in common. "51f769690961208a86ea3b35fa0f6b176faa89ed" and "72fc6cb9f875ec5eca64e66bf2bfffbddaeaf80c" have entirely different histories.

3 changed files with 19 additions and 25 deletions

14
Cargo.lock generated
View file

@ -918,9 +918,9 @@ dependencies = [
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.5.8" version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f"
dependencies = [ dependencies = [
"bitflags", "bitflags",
] ]
@ -1115,18 +1115,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.216" version = "1.0.215"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.216" version = "1.0.215"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1229,7 +1229,7 @@ dependencies = [
[[package]] [[package]]
name = "sticker-usage-analyzer" name = "sticker-usage-analyzer"
version = "1.0.1" version = "1.0.0"
dependencies = [ dependencies = [
"chrono", "chrono",
"maud", "maud",

View file

@ -1,6 +1,6 @@
[package] [package]
name = "sticker-usage-analyzer" name = "sticker-usage-analyzer"
version = "1.0.1" version = "1.0.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]

View file

@ -3,7 +3,6 @@ use rocket::{Rocket,Build,launch,get,routes,fs::{FileServer}};
use std::{fs::OpenOptions, io::BufReader, collections::HashMap}; use std::{fs::OpenOptions, io::BufReader, collections::HashMap};
use chrono::prelude::*; use chrono::prelude::*;
const TELEGRAM_TIMESTAMP_FORMAT: &str = "%FT%X";
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
@ -19,19 +18,17 @@ enum MediaType {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
struct ScoredChatMessage { struct ScoredChatMessage {
pub chat_message: ChatMessage, pub chat_message: ChatMessage,
pub last_used: NaiveDateTime, pub last_used: i64,
pub times: u32 pub times: u32
} }
impl TryFrom<ChatMessage> for ScoredChatMessage { impl From<ChatMessage> for ScoredChatMessage {
type Error = chrono::format::ParseError; fn from(item: ChatMessage) -> ScoredChatMessage {
ScoredChatMessage {
fn try_from(value: ChatMessage) -> Result<Self, Self::Error> { chat_message: item.clone(),
Ok(ScoredChatMessage { last_used: item.date_unixtime.parse().expect("Could not parse date_unixtime"),
chat_message: value.clone(),
last_used: NaiveDateTime::parse_from_str(&value.date, TELEGRAM_TIMESTAMP_FORMAT)?,
times: 1 times: 1
}) }
} }
} }
@ -40,7 +37,7 @@ impl From<ScoredChatMessage> for Markup {
fn from(item: ScoredChatMessage) -> Markup { fn from(item: ScoredChatMessage) -> Markup {
if let Some(mime_type) = &item.chat_message.mime_type { if let Some(mime_type) = &item.chat_message.mime_type {
let message_file = item.chat_message.file.expect("No sticker file"); let message_file = item.chat_message.file.expect("No sticker file");
let message_date = item.last_used; let message_date = DateTime::from_timestamp(item.last_used, 0).expect("Could not parse items");
match mime_type.as_str() { match mime_type.as_str() {
"image/webp" => { "image/webp" => {
return html! { return html! {
@ -87,8 +84,7 @@ struct ChatMessage {
pub media_type: Option<MediaType>, pub media_type: Option<MediaType>,
pub mime_type: Option<String>, pub mime_type: Option<String>,
pub file: Option<String>, pub file: Option<String>,
pub date_unixtime: String, pub date_unixtime: String
pub date: String
} }
@ -117,10 +113,8 @@ fn index() -> Markup {
.filter(|m| matches!(m.media_type, Some(MediaType::Sticker))) .filter(|m| matches!(m.media_type, Some(MediaType::Sticker)))
.fold(HashMap::new(), |mut acc: HashMap<String, ScoredChatMessage>, message| { .fold(HashMap::new(), |mut acc: HashMap<String, ScoredChatMessage>, message| {
if let Some(ref file) = message.file { if let Some(ref file) = message.file {
let message_date = NaiveDateTime::parse_from_str(&message.date, TELEGRAM_TIMESTAMP_FORMAT) let message_date = (&message.date_unixtime).parse().expect("Could not parse date_unixtime");
.expect("Could not parse date"); let entry = acc.entry(file.to_owned()).or_insert_with(|| ScoredChatMessage::from(message));
let entry = acc.entry(file.to_owned()).or_insert_with(|| ScoredChatMessage::try_from(message)
.expect("Could not parse date"));
entry.last_used = entry.last_used.max(message_date); entry.last_used = entry.last_used.max(message_date);
entry.times += 1; entry.times += 1;
} }