Add import-emoji command
This commit is contained in:
parent
b958b8fb4c
commit
e8500b982b
9 changed files with 81 additions and 9 deletions
|
@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Save sizes of media attachments and other files to database.
|
- Save sizes of media attachments and other files to database.
|
||||||
|
- Added `import-emoji` command.
|
||||||
|
|
||||||
### Security
|
### Security
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,12 @@ Delete empty remote profiles:
|
||||||
mitractl delete-empty-profiles 100
|
mitractl delete-empty-profiles 100
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Import custom emoji from another instance:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mitractl import-emoji emojiname example.org
|
||||||
|
```
|
||||||
|
|
||||||
Generate ethereum address:
|
Generate ethereum address:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
|
|
@ -1,20 +1,16 @@
|
||||||
use ammonia::clean_text;
|
use ammonia::clean_text;
|
||||||
use chrono::{DateTime, NaiveDateTime, Utc};
|
|
||||||
|
|
||||||
use crate::activitypub::identifiers::{local_actor_id, local_object_id};
|
use crate::activitypub::identifiers::{local_actor_id, local_object_id};
|
||||||
use crate::config::Instance;
|
use crate::config::Instance;
|
||||||
use crate::models::posts::types::Post;
|
use crate::models::posts::types::Post;
|
||||||
use crate::models::profiles::types::DbActorProfile;
|
use crate::models::profiles::types::DbActorProfile;
|
||||||
use crate::utils::html::clean_html_all;
|
use crate::utils::{
|
||||||
|
datetime::get_min_datetime,
|
||||||
|
html::clean_html_all,
|
||||||
|
};
|
||||||
|
|
||||||
const ENTRY_TITLE_MAX_LENGTH: usize = 75;
|
const ENTRY_TITLE_MAX_LENGTH: usize = 75;
|
||||||
|
|
||||||
fn get_min_datetime() -> DateTime<Utc> {
|
|
||||||
let native = NaiveDateTime::from_timestamp_opt(0, 0)
|
|
||||||
.expect("0 should be a valid argument");
|
|
||||||
DateTime::from_utc(native, Utc)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_entry(
|
fn make_entry(
|
||||||
instance_url: &str,
|
instance_url: &str,
|
||||||
post: &Post,
|
post: &Post,
|
||||||
|
|
|
@ -34,6 +34,7 @@ async fn main() {
|
||||||
SubCommand::DeleteUnusedAttachments(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::DeleteUnusedAttachments(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::DeleteOrphanedFiles(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::DeleteOrphanedFiles(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::DeleteEmptyProfiles(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::DeleteEmptyProfiles(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
|
SubCommand::ImportEmoji(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::UpdateCurrentBlock(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::UpdateCurrentBlock(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::ResetSubscriptions(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::ResetSubscriptions(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::CreateMoneroWallet(cmd) => cmd.execute(&config).await.unwrap(),
|
SubCommand::CreateMoneroWallet(cmd) => cmd.execute(&config).await.unwrap(),
|
||||||
|
|
44
src/cli.rs
44
src/cli.rs
|
@ -19,7 +19,12 @@ use crate::ethereum::{
|
||||||
use crate::models::{
|
use crate::models::{
|
||||||
attachments::queries::delete_unused_attachments,
|
attachments::queries::delete_unused_attachments,
|
||||||
cleanup::find_orphaned_files,
|
cleanup::find_orphaned_files,
|
||||||
emojis::queries::delete_emoji,
|
emojis::queries::{
|
||||||
|
create_emoji,
|
||||||
|
delete_emoji,
|
||||||
|
get_emoji_by_name_and_hostname,
|
||||||
|
},
|
||||||
|
emojis::validators::EMOJI_LOCAL_MAX_SIZE,
|
||||||
oauth::queries::delete_oauth_tokens,
|
oauth::queries::delete_oauth_tokens,
|
||||||
posts::queries::{delete_post, find_extraneous_posts, get_post_by_id},
|
posts::queries::{delete_post, find_extraneous_posts, get_post_by_id},
|
||||||
profiles::queries::{
|
profiles::queries::{
|
||||||
|
@ -45,6 +50,7 @@ use crate::utils::{
|
||||||
generate_rsa_key,
|
generate_rsa_key,
|
||||||
serialize_private_key,
|
serialize_private_key,
|
||||||
},
|
},
|
||||||
|
datetime::get_min_datetime,
|
||||||
files::remove_files,
|
files::remove_files,
|
||||||
passwords::hash_password,
|
passwords::hash_password,
|
||||||
};
|
};
|
||||||
|
@ -72,6 +78,7 @@ pub enum SubCommand {
|
||||||
DeleteUnusedAttachments(DeleteUnusedAttachments),
|
DeleteUnusedAttachments(DeleteUnusedAttachments),
|
||||||
DeleteOrphanedFiles(DeleteOrphanedFiles),
|
DeleteOrphanedFiles(DeleteOrphanedFiles),
|
||||||
DeleteEmptyProfiles(DeleteEmptyProfiles),
|
DeleteEmptyProfiles(DeleteEmptyProfiles),
|
||||||
|
ImportEmoji(ImportEmoji),
|
||||||
UpdateCurrentBlock(UpdateCurrentBlock),
|
UpdateCurrentBlock(UpdateCurrentBlock),
|
||||||
ResetSubscriptions(ResetSubscriptions),
|
ResetSubscriptions(ResetSubscriptions),
|
||||||
CreateMoneroWallet(CreateMoneroWallet),
|
CreateMoneroWallet(CreateMoneroWallet),
|
||||||
|
@ -373,6 +380,41 @@ impl DeleteEmptyProfiles {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Import custom emoji from another instance
|
||||||
|
#[derive(Parser)]
|
||||||
|
pub struct ImportEmoji {
|
||||||
|
emoji_name: String,
|
||||||
|
hostname: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ImportEmoji {
|
||||||
|
pub async fn execute(
|
||||||
|
&self,
|
||||||
|
_config: &Config,
|
||||||
|
db_client: &impl DatabaseClient,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let emoji = get_emoji_by_name_and_hostname(
|
||||||
|
db_client,
|
||||||
|
&self.emoji_name,
|
||||||
|
&self.hostname,
|
||||||
|
).await?;
|
||||||
|
if emoji.image.file_size > EMOJI_LOCAL_MAX_SIZE {
|
||||||
|
println!("emoji is too big");
|
||||||
|
return Ok(());
|
||||||
|
};
|
||||||
|
create_emoji(
|
||||||
|
db_client,
|
||||||
|
&emoji.emoji_name,
|
||||||
|
None,
|
||||||
|
emoji.image,
|
||||||
|
None,
|
||||||
|
&get_min_datetime(),
|
||||||
|
).await?;
|
||||||
|
println!("added emoji to local collection");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Update blockchain synchronization starting block
|
/// Update blockchain synchronization starting block
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
pub struct UpdateCurrentBlock {
|
pub struct UpdateCurrentBlock {
|
||||||
|
|
|
@ -76,6 +76,23 @@ pub async fn update_emoji(
|
||||||
Ok(emoji)
|
Ok(emoji)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn get_emoji_by_name_and_hostname(
|
||||||
|
db_client: &impl DatabaseClient,
|
||||||
|
emoji_name: &str,
|
||||||
|
hostname: &str,
|
||||||
|
) -> Result<DbEmoji, DatabaseError> {
|
||||||
|
let maybe_row = db_client.query_opt(
|
||||||
|
"
|
||||||
|
SELECT emoji
|
||||||
|
FROM emoji WHERE emoji_name = $1 AND hostname = $2
|
||||||
|
",
|
||||||
|
&[&emoji_name, &hostname],
|
||||||
|
).await?;
|
||||||
|
let row = maybe_row.ok_or(DatabaseError::NotFound("emoji"))?;
|
||||||
|
let emoji = row.try_get("emoji")?;
|
||||||
|
Ok(emoji)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn get_emoji_by_remote_object_id(
|
pub async fn get_emoji_by_remote_object_id(
|
||||||
db_client: &impl DatabaseClient,
|
db_client: &impl DatabaseClient,
|
||||||
object_id: &str,
|
object_id: &str,
|
||||||
|
|
|
@ -4,6 +4,7 @@ use crate::errors::ValidationError;
|
||||||
|
|
||||||
const EMOJI_NAME_RE: &str = r"^[\w.]+$";
|
const EMOJI_NAME_RE: &str = r"^[\w.]+$";
|
||||||
pub const EMOJI_MAX_SIZE: usize = 250 * 1000; // 250 kB
|
pub const EMOJI_MAX_SIZE: usize = 250 * 1000; // 250 kB
|
||||||
|
pub const EMOJI_LOCAL_MAX_SIZE: usize = 50 * 1000; // 50 kB
|
||||||
pub const EMOJI_MEDIA_TYPES: [&str; 2] = [
|
pub const EMOJI_MEDIA_TYPES: [&str; 2] = [
|
||||||
"image/gif",
|
"image/gif",
|
||||||
"image/png",
|
"image/png",
|
||||||
|
|
7
src/utils/datetime.rs
Normal file
7
src/utils/datetime.rs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
use chrono::{DateTime, NaiveDateTime, Utc};
|
||||||
|
|
||||||
|
pub fn get_min_datetime() -> DateTime<Utc> {
|
||||||
|
let native = NaiveDateTime::from_timestamp_opt(0, 0)
|
||||||
|
.expect("0 should be a valid argument");
|
||||||
|
DateTime::from_utc(native, Utc)
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ pub mod caip2;
|
||||||
pub mod canonicalization;
|
pub mod canonicalization;
|
||||||
pub mod crypto_rsa;
|
pub mod crypto_rsa;
|
||||||
pub mod currencies;
|
pub mod currencies;
|
||||||
|
pub mod datetime;
|
||||||
pub mod files;
|
pub mod files;
|
||||||
pub mod html;
|
pub mod html;
|
||||||
pub mod id;
|
pub mod id;
|
||||||
|
|
Loading…
Reference in a new issue