mirror of
https://framagit.org/veretcle/scootaloo.git
synced 2025-07-20 17:11:19 +02:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
31aea7e1a6 | ||
![]() |
851f95d516 | ||
![]() |
ffb9522ce2 | ||
![]() |
b6df8c6230 |
13
README.md
13
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
|
||||
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
|
||||
## 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]
|
||||
## Consumer/Access key for Twitter (can be generated at https://developer.twitter.com/en/apps)
|
||||
|
@@ -36,6 +36,8 @@ pub struct ScootalooConfig {
|
||||
pub db_path: String,
|
||||
pub cache_path: String,
|
||||
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
|
||||
|
18
src/lib.rs
18
src/lib.rs
@@ -22,6 +22,7 @@ use state::{read_state, write_state, TweetToToot};
|
||||
use elefren::{prelude::*, status_builder::StatusBuilder, Language};
|
||||
use futures::StreamExt;
|
||||
use log::info;
|
||||
use regex::Regex;
|
||||
use rusqlite::Connection;
|
||||
use std::{collections::HashMap, sync::Arc};
|
||||
use tokio::{spawn, sync::Mutex};
|
||||
@@ -58,6 +59,14 @@ pub async fn run(config: Config) {
|
||||
})
|
||||
.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())
|
||||
.map(|mastodon_config| {
|
||||
// calculate Twitter page size
|
||||
@@ -68,6 +77,8 @@ pub async fn run(config: Config) {
|
||||
// create temporary value for each task
|
||||
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 task_conn = conn.clone();
|
||||
|
||||
@@ -108,7 +119,12 @@ pub async fn run(config: Config) {
|
||||
drop(lconn);
|
||||
|
||||
// build basic status by just yielding text and dereferencing contained urls
|
||||
let mut status_text = build_basic_status(tweet, &scootaloo_mentions);
|
||||
let mut status_text = build_basic_status(
|
||||
tweet,
|
||||
&scootaloo_mentions,
|
||||
&display_url_re,
|
||||
&scootaloo_alt_services,
|
||||
);
|
||||
|
||||
// building associative media list
|
||||
let (media_url, status_medias) =
|
||||
|
@@ -1,4 +1,33 @@
|
||||
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]
|
||||
fn test_page_size() {
|
||||
|
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