Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/http/members.rs
Original file line number Diff line number Diff line change
@@ -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<C: SHNClient>(client: C, access_token: &String, group_id: &u32) -> Result<Vec<Members>> {
let path = format!("{}/{}{}", PATH, group_id, PATH2);
let access_token = String::from(access_token);

client.get_request::<Vec<Members>>(path.as_str(), &access_token, None, false)
}
1 change: 1 addition & 0 deletions src/http/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ pub mod groups;
pub mod tags;
pub mod timeline;
pub mod past_messages;
pub mod members;
4 changes: 2 additions & 2 deletions src/message/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,14 @@ pub trait SaveToFile {
fn save(&self) -> Result<()>;
}

pub fn file_name<'a>(seq_id: &u32, media: &u32, date: &str) -> Result<String> {
pub fn file_name<'a>(seq_id: &u32, media: &u32, date: &str, poster_name: &str) -> Result<String> {
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<String>) -> Result<()> {
Expand Down
26 changes: 19 additions & 7 deletions src/message/saver.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use std::fs;
use std::path::{PathBuf};
use std::collections::HashMap;

use rayon::prelude::*;
use regex::Regex;
Expand Down Expand Up @@ -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<u32, String> = 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;
Expand All @@ -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)?
};

// 最新のメッセージまで保存し終わったら終了する
Expand Down Expand Up @@ -142,17 +147,24 @@ impl<'b, C: SHNClient> Saver<'b, C> {
message: &TimelineMessages,
id_dates: &Vec<IdDate>,
member_dir_buf: &PathBuf,
members_map: &HashMap<u32, String>,
) -> Result<()> {
// 既に保存済のファイルはAPIリクエストしない&上書き保存せずスルー
if id_dates.iter().map(|id_date| id_date.id).collect::<Vec<u32>>().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()?
Expand All @@ -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,
);
Expand All @@ -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()?
Expand All @@ -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()?
Expand All @@ -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()?
Expand Down