mirror of
https://framagit.org/veretcle/scootaloo.git
synced 2025-07-21 09:31:19 +02:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
31aea7e1a6 | ||
![]() |
851f95d516 | ||
![]() |
ffb9522ce2 | ||
![]() |
b6df8c6230 | ||
![]() |
9227850c99 | ||
![]() |
64d72ea69d | ||
![]() |
9dd6ab8370 | ||
![]() |
4679578101 | ||
![]() |
2501d5990f | ||
![]() |
cb36730151 | ||
![]() |
a9942fad5c | ||
![]() |
522d4e3ea5 | ||
![]() |
91e3cd04a0 | ||
![]() |
87a7574d42 | ||
![]() |
18e8b9d306 | ||
![]() |
1e9c768a74 | ||
![]() |
83a133bb86 |
3
Cargo.lock
generated
3
Cargo.lock
generated
@@ -2103,7 +2103,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scootaloo"
|
name = "scootaloo"
|
||||||
version = "0.9.4"
|
version = "0.11.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap",
|
"clap",
|
||||||
@@ -2113,6 +2113,7 @@ dependencies = [
|
|||||||
"html-escape",
|
"html-escape",
|
||||||
"log",
|
"log",
|
||||||
"mime",
|
"mime",
|
||||||
|
"regex",
|
||||||
"reqwest 0.11.12",
|
"reqwest 0.11.12",
|
||||||
"rusqlite",
|
"rusqlite",
|
||||||
"serde",
|
"serde",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "scootaloo"
|
name = "scootaloo"
|
||||||
version = "0.9.4"
|
version = "0.11.0"
|
||||||
authors = ["VC <veretcle+framagit@mateu.be>"]
|
authors = ["VC <veretcle+framagit@mateu.be>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
@@ -8,6 +8,7 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = "^0.4"
|
chrono = "^0.4"
|
||||||
|
regex = "^1"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
toml = "^0.5"
|
toml = "^0.5"
|
||||||
clap = "^4"
|
clap = "^4"
|
||||||
|
16
README.md
16
README.md
@@ -19,6 +19,19 @@ First up, create a configuration file (default path is `/usr/local/etc/scootaloo
|
|||||||
db_path = "/var/lib/scootaloo/scootaloo.sqlite" ## file containing the SQLite Tweet corresponding Toot DB, must be writeable
|
db_path = "/var/lib/scootaloo/scootaloo.sqlite" ## file containing the SQLite Tweet corresponding Toot DB, must be writeable
|
||||||
cache_path = "/tmp/scootaloo" ## a dir where the temporary files will be download, must be writeable
|
cache_path = "/tmp/scootaloo" ## a dir where the temporary files will be download, must be writeable
|
||||||
rate_limiting = 4 ## optional, default 4, number of accounts handled simultaneously
|
rate_limiting = 4 ## optional, default 4, number of accounts handled simultaneously
|
||||||
|
## optional, this should be omitted the majority of the time
|
||||||
|
## sometimes, twitter try to use french inclusive writting, but instead of using `·` (median point), they’re using `.`
|
||||||
|
## this makes twitter interpret it as a URL, which is wrong
|
||||||
|
## this parameter allows you to catch such URLs and apply the `display_url` (i.e. `tout.es`) instead of the `expanded_url` (i.e. `http://tout.es`)
|
||||||
|
## in those particular cases
|
||||||
|
## (!) use with caution, it might have some undesired effects
|
||||||
|
show_url_as_display_url_for = "^http(s)://(.+)\\.es$"
|
||||||
|
## optional, this allows you to replace the host for popular services such as YouTube of Twitter, or any other
|
||||||
|
## with their more freely accessible equivalent
|
||||||
|
[scootaloo.alternative_services_for]
|
||||||
|
"tamere.lol" = "tonpere.mdr" ## quotes are necessary for both parameters
|
||||||
|
"you.pi" = "you.pla"
|
||||||
|
"www.you.pi" = "you.pla" ## this is an exact match, so you’ll need to lay out all the possibilities
|
||||||
|
|
||||||
[twitter]
|
[twitter]
|
||||||
## Consumer/Access key for Twitter (can be generated at https://developer.twitter.com/en/apps)
|
## Consumer/Access key for Twitter (can be generated at https://developer.twitter.com/en/apps)
|
||||||
@@ -47,7 +60,8 @@ This will give you the end of the TOML file. It will look like this:
|
|||||||
|
|
||||||
```toml
|
```toml
|
||||||
[mastodon.nintendojofr] ## account
|
[mastodon.nintendojofr] ## account
|
||||||
twitter_screen_name="NintendojoFR" ## User Timeline to copy
|
twitter_screen_name = "NintendojoFR" ## User Timeline to copy
|
||||||
|
mastodon_screen_name = "nintendojofr" ## optional, Mastodon account name used for smart mentions
|
||||||
base = "https://m.nintendojo.fr"
|
base = "https://m.nintendojo.fr"
|
||||||
client_id = "MYCLIENTID"
|
client_id = "MYCLIENTID"
|
||||||
client_secret = "MYCLIENTSECRET"
|
client_secret = "MYCLIENTSECRET"
|
||||||
|
@@ -22,6 +22,7 @@ pub struct TwitterConfig {
|
|||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct MastodonConfig {
|
pub struct MastodonConfig {
|
||||||
pub twitter_screen_name: String,
|
pub twitter_screen_name: String,
|
||||||
|
pub mastodon_screen_name: Option<String>,
|
||||||
pub twitter_page_size: Option<i32>,
|
pub twitter_page_size: Option<i32>,
|
||||||
pub base: String,
|
pub base: String,
|
||||||
pub client_id: String,
|
pub client_id: String,
|
||||||
@@ -35,6 +36,8 @@ pub struct ScootalooConfig {
|
|||||||
pub db_path: String,
|
pub db_path: String,
|
||||||
pub cache_path: String,
|
pub cache_path: String,
|
||||||
pub rate_limit: Option<usize>,
|
pub rate_limit: Option<usize>,
|
||||||
|
pub show_url_as_display_url_for: Option<String>,
|
||||||
|
pub alternative_services_for: Option<HashMap<String, String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses the TOML file into a Config Struct
|
/// Parses the TOML file into a Config Struct
|
||||||
|
37
src/lib.rs
37
src/lib.rs
@@ -22,8 +22,9 @@ use state::{read_state, write_state, TweetToToot};
|
|||||||
use elefren::{prelude::*, status_builder::StatusBuilder, Language};
|
use elefren::{prelude::*, status_builder::StatusBuilder, Language};
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
use log::info;
|
use log::info;
|
||||||
|
use regex::Regex;
|
||||||
use rusqlite::Connection;
|
use rusqlite::Connection;
|
||||||
use std::sync::Arc;
|
use std::{collections::HashMap, sync::Arc};
|
||||||
use tokio::{spawn, sync::Mutex};
|
use tokio::{spawn, sync::Mutex};
|
||||||
|
|
||||||
const DEFAULT_RATE_LIMIT: usize = 4;
|
const DEFAULT_RATE_LIMIT: usize = 4;
|
||||||
@@ -42,6 +43,30 @@ pub async fn run(config: Config) {
|
|||||||
}),
|
}),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
let scootaloo_mentions: HashMap<String, String> = config
|
||||||
|
.mastodon
|
||||||
|
.values()
|
||||||
|
.filter(|s| s.mastodon_screen_name.is_some())
|
||||||
|
.map(|s| {
|
||||||
|
(
|
||||||
|
format!("@{}", s.twitter_screen_name),
|
||||||
|
format!(
|
||||||
|
"@{}@{}",
|
||||||
|
s.mastodon_screen_name.as_ref().unwrap(),
|
||||||
|
s.base.split('/').last().unwrap()
|
||||||
|
),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let display_url_re = config
|
||||||
|
.scootaloo
|
||||||
|
.show_url_as_display_url_for
|
||||||
|
.as_ref()
|
||||||
|
.map(|r|
|
||||||
|
// we want to panic in case the RE is not valid
|
||||||
|
Regex::new(r).unwrap());
|
||||||
|
|
||||||
let mut stream = futures::stream::iter(config.mastodon.into_values())
|
let mut stream = futures::stream::iter(config.mastodon.into_values())
|
||||||
.map(|mastodon_config| {
|
.map(|mastodon_config| {
|
||||||
// calculate Twitter page size
|
// calculate Twitter page size
|
||||||
@@ -51,6 +76,9 @@ pub async fn run(config: Config) {
|
|||||||
|
|
||||||
// create temporary value for each task
|
// create temporary value for each task
|
||||||
let scootaloo_cache_path = config.scootaloo.cache_path.clone();
|
let scootaloo_cache_path = config.scootaloo.cache_path.clone();
|
||||||
|
let scootaloo_mentions = scootaloo_mentions.clone();
|
||||||
|
let scootaloo_alt_services = config.scootaloo.alternative_services_for.clone();
|
||||||
|
let display_url_re = display_url_re.clone();
|
||||||
let token = get_oauth2_token(&config.twitter);
|
let token = get_oauth2_token(&config.twitter);
|
||||||
let task_conn = conn.clone();
|
let task_conn = conn.clone();
|
||||||
|
|
||||||
@@ -91,7 +119,12 @@ pub async fn run(config: Config) {
|
|||||||
drop(lconn);
|
drop(lconn);
|
||||||
|
|
||||||
// build basic status by just yielding text and dereferencing contained urls
|
// build basic status by just yielding text and dereferencing contained urls
|
||||||
let mut status_text = build_basic_status(tweet);
|
let mut status_text = build_basic_status(
|
||||||
|
tweet,
|
||||||
|
&scootaloo_mentions,
|
||||||
|
&display_url_re,
|
||||||
|
&scootaloo_alt_services,
|
||||||
|
);
|
||||||
|
|
||||||
// building associative media list
|
// building associative media list
|
||||||
let (media_url, status_medias) =
|
let (media_url, status_medias) =
|
||||||
|
130
src/mastodon.rs
130
src/mastodon.rs
@@ -4,8 +4,9 @@ use egg_mode::{
|
|||||||
entities::{MentionEntity, UrlEntity},
|
entities::{MentionEntity, UrlEntity},
|
||||||
tweet::Tweet,
|
tweet::Tweet,
|
||||||
};
|
};
|
||||||
use elefren::{apps::App, prelude::*, scopes::Scopes};
|
use elefren::{apps::App, prelude::*, scopes::Read, scopes::Scopes, scopes::Write};
|
||||||
use html_escape::decode_html_entities;
|
use html_escape::decode_html_entities;
|
||||||
|
use regex::Regex;
|
||||||
use std::{borrow::Cow, collections::HashMap, io::stdin};
|
use std::{borrow::Cow, collections::HashMap, io::stdin};
|
||||||
|
|
||||||
/// Decodes the Twitter mention to something that will make sense once Twitter has joined the
|
/// Decodes the Twitter mention to something that will make sense once Twitter has joined the
|
||||||
@@ -22,14 +23,34 @@ fn twitter_mentions(ums: &[MentionEntity]) -> HashMap<String, String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Decodes urls from UrlEntities
|
/// Decodes urls from UrlEntities
|
||||||
fn decode_urls(urls: &[UrlEntity]) -> HashMap<String, String> {
|
fn decode_urls(
|
||||||
|
urls: &[UrlEntity],
|
||||||
|
re: &Option<Regex>,
|
||||||
|
alt_urls: &Option<HashMap<String, String>>,
|
||||||
|
) -> HashMap<String, String> {
|
||||||
urls.iter()
|
urls.iter()
|
||||||
.filter(|s| s.expanded_url.is_some())
|
.filter(|s| s.expanded_url.is_some())
|
||||||
.map(|s| {
|
.map(|s| {
|
||||||
(
|
(s.url.to_owned(), {
|
||||||
s.url.to_owned(),
|
let mut def = s.expanded_url.as_deref().unwrap().to_owned();
|
||||||
s.expanded_url.as_deref().unwrap().to_owned(),
|
|
||||||
)
|
if let Some(a) = &alt_urls {
|
||||||
|
for (url_source, url_destination) in a {
|
||||||
|
def = def.replace(
|
||||||
|
&format!("https://{}", url_source),
|
||||||
|
&format!("https://{}", url_destination),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(r) = &re {
|
||||||
|
if r.is_match(s.expanded_url.as_deref().unwrap()) {
|
||||||
|
def = s.display_url.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def
|
||||||
|
})
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
@@ -48,14 +69,23 @@ pub fn get_mastodon_token(masto: &MastodonConfig) -> Mastodon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Builds toot text from tweet
|
/// Builds toot text from tweet
|
||||||
pub fn build_basic_status(tweet: &Tweet) -> String {
|
pub fn build_basic_status(
|
||||||
|
tweet: &Tweet,
|
||||||
|
mentions: &HashMap<String, String>,
|
||||||
|
url_regex_filter: &Option<Regex>,
|
||||||
|
url_alt_services: &Option<HashMap<String, String>>,
|
||||||
|
) -> String {
|
||||||
let mut toot = tweet.text.to_owned();
|
let mut toot = tweet.text.to_owned();
|
||||||
|
|
||||||
for decoded_url in decode_urls(&tweet.entities.urls) {
|
for decoded_url in decode_urls(&tweet.entities.urls, url_regex_filter, url_alt_services) {
|
||||||
toot = toot.replace(&decoded_url.0, &decoded_url.1);
|
toot = toot.replace(&decoded_url.0, &decoded_url.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for decoded_mention in twitter_mentions(&tweet.entities.user_mentions) {
|
for decoded_mention in twitter_mentions(&tweet.entities.user_mentions)
|
||||||
|
.into_iter()
|
||||||
|
.chain(mentions.to_owned())
|
||||||
|
.collect::<HashMap<String, String>>()
|
||||||
|
{
|
||||||
toot = toot.replace(&decoded_mention.0, &decoded_mention.1);
|
toot = toot.replace(&decoded_mention.0, &decoded_mention.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +100,12 @@ pub fn register(host: &str, screen_name: &str) {
|
|||||||
builder
|
builder
|
||||||
.client_name(Cow::from(env!("CARGO_PKG_NAME").to_string()))
|
.client_name(Cow::from(env!("CARGO_PKG_NAME").to_string()))
|
||||||
.redirect_uris(Cow::from("urn:ietf:wg:oauth:2.0:oob".to_string()))
|
.redirect_uris(Cow::from("urn:ietf:wg:oauth:2.0:oob".to_string()))
|
||||||
.scopes(Scopes::write_all())
|
.scopes(
|
||||||
|
Scopes::write(Write::Accounts)
|
||||||
|
.and(Scopes::write(Write::Media))
|
||||||
|
.and(Scopes::write(Write::Statuses))
|
||||||
|
.and(Scopes::read(Read::Accounts)),
|
||||||
|
)
|
||||||
.website(Cow::from(
|
.website(Cow::from(
|
||||||
"https://framagit.org/veretcle/scootaloo".to_string(),
|
"https://framagit.org/veretcle/scootaloo".to_string(),
|
||||||
));
|
));
|
||||||
@@ -99,13 +134,19 @@ pub fn register(host: &str, screen_name: &str) {
|
|||||||
|
|
||||||
let toml = toml::to_string(&*mastodon).unwrap();
|
let toml = toml::to_string(&*mastodon).unwrap();
|
||||||
|
|
||||||
|
let current_account = mastodon
|
||||||
|
.verify_credentials()
|
||||||
|
.expect("Unable to access account information!");
|
||||||
|
|
||||||
println!(
|
println!(
|
||||||
"Please insert the following block at the end of your configuration file:
|
"Please insert the following block at the end of your configuration file:
|
||||||
[mastodon.{}]
|
[mastodon.{}]
|
||||||
twitter_screen_name = \"{}\"
|
twitter_screen_name = \"{}\"
|
||||||
|
mastodon_screen_name = \"{}\"
|
||||||
{}",
|
{}",
|
||||||
screen_name.to_lowercase(),
|
screen_name.to_lowercase(),
|
||||||
screen_name,
|
screen_name,
|
||||||
|
current_account.username,
|
||||||
toml
|
toml
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -155,15 +196,51 @@ mod tests {
|
|||||||
url: "https://t.me/tamerelol".to_string(),
|
url: "https://t.me/tamerelol".to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let twitter_urls = vec![url_entity1, url_entity2];
|
let wrong_url_entity = UrlEntity {
|
||||||
|
display_url: "invité.es".to_string(),
|
||||||
|
expanded_url: Some("http://xn--invit-fsa.es".to_string()),
|
||||||
|
range: (85, 108),
|
||||||
|
url: "https://t.co/WAUgnpHLmo".to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
let mut expected_urls = HashMap::new();
|
let rewritten_url_entity = UrlEntity {
|
||||||
expected_urls.insert(
|
display_url: "youtu.be/w5TrSaoYmZ8".to_string(),
|
||||||
"https://t.me/tamerelol".to_string(),
|
expanded_url: Some("https://youtu.be/w5TrSaoYmZ8".to_string()),
|
||||||
"https://www.nintendojo.fr/dojobar".to_string(),
|
range: (0, 23),
|
||||||
);
|
url: "https://t.co/fUVYXuF7tg".to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
let decoded_urls = decode_urls(&twitter_urls);
|
let re = Regex::new("(.+)\\.es$").ok();
|
||||||
|
|
||||||
|
let alt: HashMap<String, String> = HashMap::from([
|
||||||
|
("youtube.com".to_string(), "invidio.us".to_string()),
|
||||||
|
("youtu.be".to_string(), "invidio.us".to_string()),
|
||||||
|
("www.youtube.com".to_string(), "invidio.us".to_string()),
|
||||||
|
]);
|
||||||
|
|
||||||
|
let twitter_urls = vec![
|
||||||
|
url_entity1,
|
||||||
|
url_entity2,
|
||||||
|
wrong_url_entity,
|
||||||
|
rewritten_url_entity,
|
||||||
|
];
|
||||||
|
|
||||||
|
let expected_urls = HashMap::from([
|
||||||
|
(
|
||||||
|
"https://t.me/tamerelol".to_string(),
|
||||||
|
"https://www.nintendojo.fr/dojobar".to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"https://t.co/WAUgnpHLmo".to_string(),
|
||||||
|
"invité.es".to_string(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"https://t.co/fUVYXuF7tg".to_string(),
|
||||||
|
"https://invidio.us/w5TrSaoYmZ8".to_string(),
|
||||||
|
),
|
||||||
|
]);
|
||||||
|
|
||||||
|
let decoded_urls = decode_urls(&twitter_urls, &re, &Some(alt));
|
||||||
|
|
||||||
assert_eq!(expected_urls, decoded_urls);
|
assert_eq!(expected_urls, decoded_urls);
|
||||||
}
|
}
|
||||||
@@ -192,7 +269,13 @@ mod tests {
|
|||||||
range: (80, 95),
|
range: (80, 95),
|
||||||
name: "Nintendo France".to_string(),
|
name: "Nintendo France".to_string(),
|
||||||
screen_name: "NintendoFrance".to_string(),
|
screen_name: "NintendoFrance".to_string(),
|
||||||
}
|
},
|
||||||
|
MentionEntity {
|
||||||
|
id: 999999999,
|
||||||
|
range: (80, 95),
|
||||||
|
name: "Willy Wonka".to_string(),
|
||||||
|
screen_name: "WillyWonka".to_string(),
|
||||||
|
},
|
||||||
],
|
],
|
||||||
media: None,
|
media: None,
|
||||||
},
|
},
|
||||||
@@ -213,7 +296,7 @@ mod tests {
|
|||||||
retweeted: None,
|
retweeted: None,
|
||||||
retweeted_status: None,
|
retweeted_status: None,
|
||||||
source: None,
|
source: None,
|
||||||
text: "Mother 1 & 2 sur le NES/SNES online !\nDispo maintenant. cc @NintendoFrance https://t.co/zXw0FfX2Nt".to_string(),
|
text: "Mother 1 & 2 sur le NES/SNES online !\nDispo maintenant. cc @NintendoFrance @WillyWonka https://t.co/zXw0FfX2Nt".to_string(),
|
||||||
truncated: false,
|
truncated: false,
|
||||||
user: None,
|
user: None,
|
||||||
withheld_copyright: false,
|
withheld_copyright: false,
|
||||||
@@ -221,8 +304,13 @@ mod tests {
|
|||||||
withheld_scope: None,
|
withheld_scope: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let t_out = build_basic_status(&t);
|
let s: HashMap<String, String> = HashMap::from([(
|
||||||
|
"@WillyWonka".to_string(),
|
||||||
|
"@WillyWonka@chocolatefactory.org".to_string(),
|
||||||
|
)]);
|
||||||
|
|
||||||
assert_eq!(&t_out, "Mother 1 & 2 sur le NES/SNES online !\nDispo maintenant. cc @NintendoFrance@twitter.com https://www.youtube.com/watch?v=w5TrSaoYmZ8");
|
let t_out = build_basic_status(&t, &s, &None, &None);
|
||||||
|
|
||||||
|
assert_eq!(&t_out, "Mother 1 & 2 sur le NES/SNES online !\nDispo maintenant. cc @NintendoFrance@twitter.com @WillyWonka@chocolatefactory.org https://www.youtube.com/watch?v=w5TrSaoYmZ8");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,33 @@
|
|||||||
use scootaloo::parse_toml;
|
use scootaloo::parse_toml;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_alt_services() {
|
||||||
|
let toml = parse_toml("tests/no_test_alt_services.toml");
|
||||||
|
assert_eq!(toml.scootaloo.alternative_services_for, None);
|
||||||
|
|
||||||
|
let toml = parse_toml("tests/test_alt_services.toml");
|
||||||
|
assert_eq!(
|
||||||
|
toml.scootaloo.alternative_services_for,
|
||||||
|
Some(HashMap::from([
|
||||||
|
("tamere.lol".to_string(), "tonpere.mdr".to_string()),
|
||||||
|
("you.pi".to_string(), "you.pla".to_string())
|
||||||
|
]))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_re_display() {
|
||||||
|
let toml = parse_toml("tests/no_show_url_as_display_url_for.toml");
|
||||||
|
assert_eq!(toml.scootaloo.show_url_as_display_url_for, None);
|
||||||
|
|
||||||
|
let toml = parse_toml("tests/show_url_as_display_url_for.toml");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
toml.scootaloo.show_url_as_display_url_for,
|
||||||
|
Some("^(.+)\\.es$".to_string())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_page_size() {
|
fn test_page_size() {
|
||||||
@@ -52,6 +81,29 @@ fn test_parse_good_toml_rate_limit() {
|
|||||||
assert_eq!(parse_good_toml.scootaloo.rate_limit, Some(69 as usize));
|
assert_eq!(parse_good_toml.scootaloo.rate_limit, Some(69 as usize));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_good_toml_mastodon_screen_name() {
|
||||||
|
let parse_good_toml = parse_toml("tests/good_test_mastodon_screen_name.toml");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_good_toml
|
||||||
|
.mastodon
|
||||||
|
.get("0")
|
||||||
|
.unwrap()
|
||||||
|
.mastodon_screen_name,
|
||||||
|
Some("tarace".to_string())
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
parse_good_toml
|
||||||
|
.mastodon
|
||||||
|
.get("1")
|
||||||
|
.unwrap()
|
||||||
|
.mastodon_screen_name,
|
||||||
|
None
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_good_toml() {
|
fn test_parse_good_toml() {
|
||||||
let parse_good_toml = parse_toml("tests/good_test.toml");
|
let parse_good_toml = parse_toml("tests/good_test.toml");
|
||||||
|
28
tests/good_test_mastodon_screen_name.toml
Normal file
28
tests/good_test_mastodon_screen_name.toml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
[scootaloo]
|
||||||
|
|
||||||
|
db_path="/var/random/scootaloo.sqlite"
|
||||||
|
cache_path="/tmp/scootaloo"
|
||||||
|
|
||||||
|
[twitter]
|
||||||
|
consumer_key="rand consumer key"
|
||||||
|
consumer_secret="secret"
|
||||||
|
access_key="rand access key"
|
||||||
|
access_secret="super secret"
|
||||||
|
|
||||||
|
[mastodon]
|
||||||
|
[mastodon.0]
|
||||||
|
twitter_screen_name="tamerelol"
|
||||||
|
mastodon_screen_name="tarace"
|
||||||
|
base = "https://m.nintendojo.fr"
|
||||||
|
client_id = "rand client id"
|
||||||
|
client_secret = "secret"
|
||||||
|
redirect = "urn:ietf:wg:oauth:2.0:oob"
|
||||||
|
token = "super secret"
|
||||||
|
|
||||||
|
[mastodon.1]
|
||||||
|
twitter_screen_name="tamerelol"
|
||||||
|
base = "https://m.nintendojo.fr"
|
||||||
|
client_id = "rand client id"
|
||||||
|
client_secret = "secret"
|
||||||
|
redirect = "urn:ietf:wg:oauth:2.0:oob"
|
||||||
|
token = "super secret"
|
19
tests/no_show_url_as_display_url_for.toml
Normal file
19
tests/no_show_url_as_display_url_for.toml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
[scootaloo]
|
||||||
|
|
||||||
|
db_path="/var/random/scootaloo.sqlite"
|
||||||
|
cache_path="/tmp/scootaloo"
|
||||||
|
|
||||||
|
[twitter]
|
||||||
|
consumer_key="rand consumer key"
|
||||||
|
consumer_secret="secret"
|
||||||
|
access_key="rand access key"
|
||||||
|
access_secret="super secret"
|
||||||
|
|
||||||
|
[mastodon]
|
||||||
|
[mastodon.tamerelol]
|
||||||
|
twitter_screen_name="tamerelol"
|
||||||
|
base = "https://m.nintendojo.fr"
|
||||||
|
client_id = "rand client id"
|
||||||
|
client_secret = "secret"
|
||||||
|
redirect = "urn:ietf:wg:oauth:2.0:oob"
|
||||||
|
token = "super secret"
|
19
tests/no_test_alt_services.toml
Normal file
19
tests/no_test_alt_services.toml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
[scootaloo]
|
||||||
|
|
||||||
|
db_path="/var/random/scootaloo.sqlite"
|
||||||
|
cache_path="/tmp/scootaloo"
|
||||||
|
|
||||||
|
[twitter]
|
||||||
|
consumer_key="rand consumer key"
|
||||||
|
consumer_secret="secret"
|
||||||
|
access_key="rand access key"
|
||||||
|
access_secret="super secret"
|
||||||
|
|
||||||
|
[mastodon]
|
||||||
|
[mastodon.tamerelol]
|
||||||
|
twitter_screen_name="tamerelol"
|
||||||
|
base = "https://m.nintendojo.fr"
|
||||||
|
client_id = "rand client id"
|
||||||
|
client_secret = "secret"
|
||||||
|
redirect = "urn:ietf:wg:oauth:2.0:oob"
|
||||||
|
token = "super secret"
|
20
tests/show_url_as_display_url_for.toml
Normal file
20
tests/show_url_as_display_url_for.toml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[scootaloo]
|
||||||
|
|
||||||
|
db_path="/var/random/scootaloo.sqlite"
|
||||||
|
cache_path="/tmp/scootaloo"
|
||||||
|
show_url_as_display_url_for = "^(.+)\\.es$"
|
||||||
|
|
||||||
|
[twitter]
|
||||||
|
consumer_key="rand consumer key"
|
||||||
|
consumer_secret="secret"
|
||||||
|
access_key="rand access key"
|
||||||
|
access_secret="super secret"
|
||||||
|
|
||||||
|
[mastodon]
|
||||||
|
[mastodon.tamerelol]
|
||||||
|
twitter_screen_name="tamerelol"
|
||||||
|
base = "https://m.nintendojo.fr"
|
||||||
|
client_id = "rand client id"
|
||||||
|
client_secret = "secret"
|
||||||
|
redirect = "urn:ietf:wg:oauth:2.0:oob"
|
||||||
|
token = "super secret"
|
22
tests/test_alt_services.toml
Normal file
22
tests/test_alt_services.toml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
[scootaloo]
|
||||||
|
|
||||||
|
db_path="/var/random/scootaloo.sqlite"
|
||||||
|
cache_path="/tmp/scootaloo"
|
||||||
|
[scootaloo.alternative_services_for]
|
||||||
|
"tamere.lol" = "tonpere.mdr"
|
||||||
|
"you.pi" = "you.pla"
|
||||||
|
|
||||||
|
[twitter]
|
||||||
|
consumer_key="rand consumer key"
|
||||||
|
consumer_secret="secret"
|
||||||
|
access_key="rand access key"
|
||||||
|
access_secret="super secret"
|
||||||
|
|
||||||
|
[mastodon]
|
||||||
|
[mastodon.tamerelol]
|
||||||
|
twitter_screen_name="tamerelol"
|
||||||
|
base = "https://m.nintendojo.fr"
|
||||||
|
client_id = "rand client id"
|
||||||
|
client_secret = "secret"
|
||||||
|
redirect = "urn:ietf:wg:oauth:2.0:oob"
|
||||||
|
token = "super secret"
|
Reference in New Issue
Block a user