From 14575b95d2ab7cf8f237622184ef133d324b5ed0 Mon Sep 17 00:00:00 2001 From: kyutaze <215492008+kyutaze@users.noreply.github.com> Date: Tue, 6 Jan 2026 15:26:26 +0900 Subject: [PATCH] feat: add poster name to message file naming and implement members request --- src/http/members.rs | 18 ++++++++++++++++++ src/http/mod.rs | 1 + src/message/file.rs | 4 ++-- src/message/saver.rs | 26 +++++++++++++++++++------- 4 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 src/http/members.rs diff --git a/src/http/members.rs b/src/http/members.rs new file mode 100644 index 0000000..22c61a4 --- /dev/null +++ b/src/http/members.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; +use crate::{errors::*, http::client::SHNClient}; + +const PATH: &str = "/v2/groups"; +const PATH2: &str = "/members"; + +#[derive(Serialize, Deserialize, Debug)] +pub struct Members { + pub id: u32, + pub name: String, +} + +pub fn request(client: C, access_token: &String, group_id: &u32) -> Result> { + let path = format!("{}/{}{}", PATH, group_id, PATH2); + let access_token = String::from(access_token); + + client.get_request::>(path.as_str(), &access_token, None, false) +} diff --git a/src/http/mod.rs b/src/http/mod.rs index e9bda4e..dcf98f1 100644 --- a/src/http/mod.rs +++ b/src/http/mod.rs @@ -4,3 +4,4 @@ pub mod groups; pub mod tags; pub mod timeline; pub mod past_messages; +pub mod members; diff --git a/src/message/file.rs b/src/message/file.rs index 1af6cfc..7089dd8 100644 --- a/src/message/file.rs +++ b/src/message/file.rs @@ -106,14 +106,14 @@ pub trait SaveToFile { fn save(&self) -> Result<()>; } -pub fn file_name<'a>(seq_id: &u32, media: &u32, date: &str) -> Result { +pub fn file_name<'a>(seq_id: &u32, media: &u32, date: &str, poster_name: &str) -> Result { let parse_result = NaiveDateTime::parse_from_str(date, "%Y-%m-%dT%H:%M:%SZ"); if let Err(_e) = parse_result { return Err(format!("Parse error. date: {}", date).into()); } let date = parse_result .unwrap() .format("%Y%m%d%H%M%S") .to_string(); - Ok(format!("{}_{}_{}", seq_id, media, &date)) + Ok(format!("{}_{}_{}_{}", seq_id, media, &date, poster_name)) } fn save_text(member_dir_buf: &PathBuf, filename: &String, talk: &Option) -> Result<()> { diff --git a/src/message/saver.rs b/src/message/saver.rs index 7bad544..a46a401 100644 --- a/src/message/saver.rs +++ b/src/message/saver.rs @@ -1,5 +1,6 @@ use std::fs; use std::path::{PathBuf}; +use std::collections::HashMap; use rayon::prelude::*; use regex::Regex; @@ -84,10 +85,14 @@ impl<'b, C: SHNClient> Saver<'b, C> { None => self.latest_date(&id_dates)? }; + // メンバー一覧を取得し、IDと名前のマップを作成 + let members = http::members::request(self.config.client.clone(), &self.config.access_token, &member_identifier.id)?; + let members_map: HashMap = members.into_iter().map(|m| (m.id, m.name)).collect(); + // 購読開始から24時間前までに配信されたメッセージを保存する let past_messages = http::past_messages::request(self.config.client.clone(), &self.config.access_token, &member_identifier.id)?; for message in &past_messages.messages { - self.save_message(&message, &id_dates, &member_dir_buf)? + self.save_message(&message, &id_dates, &member_dir_buf, &members_map)? }; let mut count = http::timeline::DEFAULT_COUNT; @@ -110,7 +115,7 @@ impl<'b, C: SHNClient> Saver<'b, C> { // メッセージを取得するAPIを叩くと複数件のメッセージを取得出来る // そのメッセージを1件ずつ処理するためのループ for message in &timeline.messages { - self.save_message(&message, &id_dates, &member_dir_buf)? + self.save_message(&message, &id_dates, &member_dir_buf, &members_map)? }; // 最新のメッセージまで保存し終わったら終了する @@ -142,17 +147,24 @@ impl<'b, C: SHNClient> Saver<'b, C> { message: &TimelineMessages, id_dates: &Vec, member_dir_buf: &PathBuf, + members_map: &HashMap, ) -> Result<()> { // 既に保存済のファイルはAPIリクエストしない&上書き保存せずスルー if id_dates.iter().map(|id_date| id_date.id).collect::>().contains(&message.id) { return Ok(()); } + + let poster_name = match message.member_id { + Some(id) => members_map.get(&id).map(|s| s.as_str()).unwrap_or(""), + None => "" + }; + match message.messages_type.as_str() { "text" => { if !self.config.kind.contains(&Kind::Text) { return Ok(()); } let message_file_text = Text::new( member_dir_buf, - message::file::file_name(&message.id, &0, &message.updated_at)?, + message::file::file_name(&message.id, &0, &message.updated_at, poster_name)?, &message.text, ); message_file_text.save()? @@ -161,7 +173,7 @@ impl<'b, C: SHNClient> Saver<'b, C> { if !self.config.kind.contains(&Kind::Picture) { return Ok(()); } let message_file_picture = Picture::new( member_dir_buf, - message::file::file_name(&message.id, &1, &message.updated_at)?, + message::file::file_name(&message.id, &1, &message.updated_at, poster_name)?, &message.text, &message.file, ); @@ -171,7 +183,7 @@ impl<'b, C: SHNClient> Saver<'b, C> { if !self.config.kind.contains(&Kind::Video) { return Ok(()); } let message_file_video = Video::new( member_dir_buf, - message::file::file_name(&message.id, &2, &message.updated_at)?, + message::file::file_name(&message.id, &2, &message.updated_at, poster_name)?, &message.file, ); message_file_video.save()? @@ -180,7 +192,7 @@ impl<'b, C: SHNClient> Saver<'b, C> { if !self.config.kind.contains(&Kind::Voice) { return Ok(()); } let message_file_voice = Voice::new( member_dir_buf, - message::file::file_name(&message.id, &3, &message.updated_at)?, + message::file::file_name(&message.id, &3, &message.updated_at, poster_name)?, &message.file, ); message_file_voice.save()? @@ -190,7 +202,7 @@ impl<'b, C: SHNClient> Saver<'b, C> { if !self.config.kind.contains(&Kind::Link) { return Ok(()); } let message_file_text = Text::new( member_dir_buf, - message::file::file_name(&message.id, &4, &message.updated_at)?, + message::file::file_name(&message.id, &4, &message.updated_at, poster_name)?, &message.text, ); message_file_text.save()?