From 925fc404357e345d2c5e73af73a85716ab041690 Mon Sep 17 00:00:00 2001 From: Daniel Sockwell Date: Wed, 29 Apr 2020 16:05:57 -0400 Subject: [PATCH] Testing for Event parsing --- src/response/event/checked_event.rs | 3 + src/response/event/checked_event/account.rs | 64 +++++----- src/response/event/checked_event/status.rs | 56 ++++----- .../event/checked_event/status/application.rs | 12 +- .../event/checked_event/status/attachment.rs | 22 ++-- .../event/checked_event/status/card.rs | 30 ++--- .../event/checked_event/status/poll.rs | 28 ++--- src/response/event/checked_event/tag.rs | 14 +-- src/response/event/checked_event/test.rs | 41 ++++++ src/response/redis/msg/test.rs | 8 +- test_data/event_001.rs | 118 ++++++++++++++++++ test_data/event_002.rs | 100 +++++++++++++++ .../msg.event_txt_001.txt | 0 .../msg.event_txt_002.txt | 0 .../msg.event_txt_003.txt | 0 .../msg.event_txt_004.txt | 0 .../msg.event_txt_005.txt | 0 .../msg.event_txt_006.txt | 0 .../redis_input_001.resp | 14 +-- .../redis_input_002.resp | 14 +-- .../redis_input_003.resp | 14 +-- .../redis_input_004.resp | 14 +-- .../redis_input_005.resp | 14 +-- .../redis_input_006.resp | 14 +-- 24 files changed, 420 insertions(+), 160 deletions(-) create mode 100644 src/response/event/checked_event/test.rs create mode 100644 test_data/event_001.rs create mode 100644 test_data/event_002.rs rename src/response/redis/msg/test_output/001.txt => test_data/msg.event_txt_001.txt (100%) rename src/response/redis/msg/test_output/002.txt => test_data/msg.event_txt_002.txt (100%) rename src/response/redis/msg/test_output/003.txt => test_data/msg.event_txt_003.txt (100%) rename src/response/redis/msg/test_output/004.txt => test_data/msg.event_txt_004.txt (100%) rename src/response/redis/msg/test_output/005.txt => test_data/msg.event_txt_005.txt (100%) rename src/response/redis/msg/test_output/006.txt => test_data/msg.event_txt_006.txt (100%) rename src/response/redis/msg/test_input/001.resp => test_data/redis_input_001.resp (99%) rename src/response/redis/msg/test_input/002.resp => test_data/redis_input_002.resp (99%) rename src/response/redis/msg/test_input/003.resp => test_data/redis_input_003.resp (99%) rename src/response/redis/msg/test_input/004.resp => test_data/redis_input_004.resp (92%) rename src/response/redis/msg/test_input/005.resp => test_data/redis_input_005.resp (99%) rename src/response/redis/msg/test_input/006.resp => test_data/redis_input_006.resp (99%) diff --git a/src/response/event/checked_event.rs b/src/response/event/checked_event.rs index 5176534..25278ca 100644 --- a/src/response/event/checked_event.rs +++ b/src/response/event/checked_event.rs @@ -35,3 +35,6 @@ pub enum CheckedEvent { AnnouncementDelete { payload: String }, Conversation { payload: Conversation, queued_at: Option }, } + +#[cfg(test)] +mod test; diff --git a/src/response/event/checked_event/account.rs b/src/response/event/checked_event/account.rs index 53b670e..b9a6344 100644 --- a/src/response/event/checked_event/account.rs +++ b/src/response/event/checked_event/account.rs @@ -6,45 +6,45 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub(super) struct Account { pub id: Id, - username: String, + pub(super) username: String, pub acct: String, - url: String, - display_name: String, - note: String, - avatar: String, - avatar_static: String, - header: String, - header_static: String, - locked: bool, - emojis: Vec, - discoverable: Option, // Shouldn't be option? - created_at: String, - statuses_count: i64, - followers_count: i64, - following_count: i64, - moved: Option, - fields: Option>, - bot: Option, - source: Option, - group: Option, // undocumented - last_status_at: Option, // undocumented + pub(super) url: String, + pub(super) display_name: String, + pub(super) note: String, + pub(super) avatar: String, + pub(super) avatar_static: String, + pub(super) header: String, + pub(super) header_static: String, + pub(super) locked: bool, + pub(super) emojis: Vec, + pub(super) discoverable: Option, // Shouldn't be option? + pub(super) created_at: String, + pub(super) statuses_count: i64, + pub(super) followers_count: i64, + pub(super) following_count: i64, + pub(super) moved: Option, + pub(super) fields: Option>, + pub(super) bot: Option, + pub(super) source: Option, + pub(super) group: Option, // undocumented + pub(super) last_status_at: Option, // undocumented } #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -struct Field { - name: String, - value: String, - verified_at: Option, +pub(super) struct Field { + pub(super) name: String, + pub(super) value: String, + pub(super) verified_at: Option, } #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -struct Source { - note: String, - fields: Vec, - privacy: Option, - sensitive: bool, - language: String, - follow_requests_count: i64, +pub(super) struct Source { + pub(super) note: String, + pub(super) fields: Vec, + pub(super) privacy: Option, + pub(super) sensitive: bool, + pub(super) language: String, + pub(super) follow_requests_count: i64, } diff --git a/src/response/event/checked_event/status.rs b/src/response/event/checked_event/status.rs index ea1655c..71773d2 100644 --- a/src/response/event/checked_event/status.rs +++ b/src/response/event/checked_event/status.rs @@ -22,37 +22,37 @@ use std::string::String; #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub struct Status { - id: Id, - uri: String, - created_at: String, - account: Account, - content: String, - visibility: Visibility, - sensitive: bool, - spoiler_text: String, - media_attachments: Vec, - application: Option, // Should be non-optional? - mentions: Vec, - tags: Vec, - emojis: Vec, - reblogs_count: i64, - favourites_count: i64, - replies_count: i64, - url: Option, - in_reply_to_id: Option, - in_reply_to_account_id: Option, - reblog: Option>, - poll: Option, - card: Option, + pub(super) id: Id, + pub(super) uri: String, + pub(super) created_at: String, + pub(super) account: Account, + pub(super) content: String, + pub(super) visibility: Visibility, + pub(super) sensitive: bool, + pub(super) spoiler_text: String, + pub(super) media_attachments: Vec, + pub(super) application: Option, // Should be non-optional? + pub(super) mentions: Vec, + pub(super) tags: Vec, + pub(super) emojis: Vec, + pub(super) reblogs_count: i64, + pub(super) favourites_count: i64, + pub(super) replies_count: i64, + pub(super) url: Option, + pub(super) in_reply_to_id: Option, + pub(super) in_reply_to_account_id: Option, + pub(super) reblog: Option>, + pub(super) poll: Option, + pub(super) card: Option, pub(crate) language: Option, - text: Option, + pub(super) text: Option, // ↓↓↓ Only for authorized users - favourited: Option, - reblogged: Option, - muted: Option, - bookmarked: Option, - pinned: Option, + pub(super) favourited: Option, + pub(super) reblogged: Option, + pub(super) muted: Option, + pub(super) bookmarked: Option, + pub(super) pinned: Option, } impl Payload for Status { diff --git a/src/response/event/checked_event/status/application.rs b/src/response/event/checked_event/status/application.rs index 0688056..2407b00 100644 --- a/src/response/event/checked_event/status/application.rs +++ b/src/response/event/checked_event/status/application.rs @@ -2,10 +2,10 @@ use serde::{Deserialize, Serialize}; #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -pub(super) struct Application { - name: String, - website: Option, - vapid_key: Option, - client_id: Option, - client_secret: Option, +pub(in super::super) struct Application { + pub(super) name: String, + pub(super) website: Option, + pub(super) vapid_key: Option, + pub(super) client_id: Option, + pub(super) client_secret: Option, } diff --git a/src/response/event/checked_event/status/attachment.rs b/src/response/event/checked_event/status/attachment.rs index 8e2eed0..c4d4265 100644 --- a/src/response/event/checked_event/status/attachment.rs +++ b/src/response/event/checked_event/status/attachment.rs @@ -2,21 +2,21 @@ use serde::{Deserialize, Serialize}; #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -pub(super) struct Attachment { - id: String, - r#type: AttachmentType, - url: String, - preview_url: String, - remote_url: Option, - text_url: Option, - meta: Option, - description: Option, - blurhash: Option, +pub(in super::super) struct Attachment { + pub(super) id: String, + pub(super) r#type: AttachmentType, + pub(super) url: String, + pub(super) preview_url: String, + pub(super) remote_url: Option, + pub(super) text_url: Option, + pub(super) meta: Option, + pub(super) description: Option, + pub(super) blurhash: Option, } #[serde(rename_all = "lowercase", deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -enum AttachmentType { +pub(super) enum AttachmentType { Unknown, Image, Gifv, diff --git a/src/response/event/checked_event/status/card.rs b/src/response/event/checked_event/status/card.rs index 5cec657..5bbcabf 100644 --- a/src/response/event/checked_event/status/card.rs +++ b/src/response/event/checked_event/status/card.rs @@ -2,25 +2,25 @@ use serde::{Deserialize, Serialize}; #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -pub(super) struct Card { - url: String, - title: String, - description: String, - r#type: CardType, - author_name: Option, - author_url: Option, - provider_name: Option, - provider_url: Option, - html: Option, - width: Option, - height: Option, - image: Option, - embed_url: Option, +pub(in super::super) struct Card { + pub(super) url: String, + pub(super) title: String, + pub(super) description: String, + pub(super) r#type: CardType, + pub(super) author_name: Option, + pub(super) author_url: Option, + pub(super) provider_name: Option, + pub(super) provider_url: Option, + pub(super) html: Option, + pub(super) width: Option, + pub(super) height: Option, + pub(super) image: Option, + pub(super) embed_url: Option, } #[serde(rename_all = "lowercase", deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -enum CardType { +pub(super) enum CardType { Link, Photo, Video, diff --git a/src/response/event/checked_event/status/poll.rs b/src/response/event/checked_event/status/poll.rs index 3c99915..47d018c 100644 --- a/src/response/event/checked_event/status/poll.rs +++ b/src/response/event/checked_event/status/poll.rs @@ -3,22 +3,22 @@ use serde::{Deserialize, Serialize}; #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -pub(super) struct Poll { - id: String, - expires_at: String, - expired: bool, - multiple: bool, - votes_count: i64, - voters_count: Option, - voted: Option, - own_votes: Option>, - options: Vec, - emojis: Vec, +pub(in super::super) struct Poll { + pub(super) id: String, + pub(super) expires_at: String, + pub(super) expired: bool, + pub(super) multiple: bool, + pub(super) votes_count: i64, + pub(super) voters_count: Option, + pub(super) voted: Option, + pub(super) own_votes: Option>, + pub(super) options: Vec, + pub(super) emojis: Vec, } #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -struct PollOptions { - title: String, - votes_count: Option, +pub(super) struct PollOptions { + pub(super) title: String, + pub(super) votes_count: Option, } diff --git a/src/response/event/checked_event/tag.rs b/src/response/event/checked_event/tag.rs index bae5a65..1b39626 100644 --- a/src/response/event/checked_event/tag.rs +++ b/src/response/event/checked_event/tag.rs @@ -3,15 +3,15 @@ use serde::{Deserialize, Serialize}; #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] pub(super) struct Tag { - name: String, - url: String, - history: Option>, + pub(super) name: String, + pub(super) url: String, + pub(super) history: Option>, } #[serde(deny_unknown_fields)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -struct History { - day: String, - uses: String, - accounts: String, +pub(super) struct History { + pub(super) day: String, + pub(super) uses: String, + pub(super) accounts: String, } diff --git a/src/response/event/checked_event/test.rs b/src/response/event/checked_event/test.rs new file mode 100644 index 0000000..c961e3e --- /dev/null +++ b/src/response/event/checked_event/test.rs @@ -0,0 +1,41 @@ +use super::{super::*, *}; +use checked_event::{ + account::{Account, Field}, + tag::Tag, + visibility::Visibility::*, + CheckedEvent::*, + *, +}; +use std::fs; + +#[test] +fn parse_redis_msg_to_event() -> Result<(), Box> { + let mut test_num = 1; + + let output = vec![ + include!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/test_data/event_001.rs" + )), + include!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/test_data/event_002.rs" + )), + ]; + + while let (Ok(input), Some(output)) = ( + fs::read_to_string(format!("test_data/msg.event_txt_{:03}.txt", test_num)), + output.get(test_num - 1), + ) { + println!("parsing `{:03}.resp`", test_num); + test_num += 1; + + let event = Event::try_from(input)?; + println!("{:#?}", event); + + assert_eq!(&event, output); + } + assert!(test_num > 1); + + Ok(()) +} diff --git a/src/response/redis/msg/test.rs b/src/response/redis/msg/test.rs index 9233c31..1a5aeee 100644 --- a/src/response/redis/msg/test.rs +++ b/src/response/redis/msg/test.rs @@ -58,13 +58,10 @@ fn parse_redis_msg() -> Result<(), RedisParseErr> { #[test] fn parse_long_redis_msg() -> Result<(), Box> { - let pwd = path::Path::new(file!()).parent().expect("TEST"); - let mut test_num = 1; - while let (Ok(input), Ok(output)) = ( - fs::read_to_string(format!("{}/test_input/{:03}.resp", pwd.display(), test_num)), - fs::read_to_string(format!("{}/test_output/{:03}.txt", pwd.display(), test_num)), + fs::read_to_string(format!("test_data/redis_input_{:03}.resp", test_num)), + fs::read_to_string(format!("test_data/msg.event_txt_{:03}.txt", test_num)), ) { println!("parsing `{:03}.resp`", test_num); test_num += 1; @@ -82,6 +79,7 @@ fn parse_long_redis_msg() -> Result<(), Box> { assert_eq!(r_msg.timeline_txt, "timeline:public"); } + assert!(test_num > 1); Ok(()) } diff --git a/test_data/event_001.rs b/test_data/event_001.rs new file mode 100644 index 0000000..55da8ce --- /dev/null +++ b/test_data/event_001.rs @@ -0,0 +1,118 @@ +Event::TypeSafe( + Update { + payload: Status { + id: Id(102775370117886890), + uri: "https://mastodon.host/users/federationbot/statuses/102775346916917099".to_string(), + created_at: "2019-09-11T18:42:19.000Z".to_string(), + account: Account { + id: Id(78), + username: "federationbot".to_string(), + acct: "federationbot@mastodon.host".to_string(), + url: "https://mastodon.host/@federationbot".to_string(), + display_name: "Federation Bot".to_string(), + note: "

Hello, I am mastodon.host official semi bot.

Follow me if you want to have some updates on the view \ + of the fediverse from here ( I only post unlisted ).

I also randomly boost one of my followers toot \ + every hour !

If you don\'t feel confortable with me following you, tell me: unfollow and I\'ll do it \ + :)

If you want me to follow you, just tell me follow !

If you want automatic follow for new \ + users on your instance and you are an instance admin, contact me !

\ +

Other commands are private :)

".to_string(), + avatar: "https://instance.codesections.com/system/accounts/avatars/000/000/078/original/d9e2be5398629cf8.jpeg\ + ?1568127863".to_string(), + avatar_static: "https://instance.codesections.com/system/accounts/avatars/000/000/078/original/d9e2be5398629cf8\ + .jpeg?1568127863".to_string(), + header: "https://instance.codesections.com/headers/original/missing.png".to_string(), + header_static: "https://instance.codesections.com/headers/original/missing.png".to_string(), + locked: + false, + emojis: [].to_vec(), + discoverable: None, + created_at: "2019-09-10T15:04:25.559Z".to_string(), + statuses_count: 50554, + followers_count: 16636, + following_count: 179532, + moved: None, + fields: Some( + [ Field { + name: "More stats".to_string(), + value: "\ + https://mastodon.host/stats.html\ + ".to_string(), + verified_at: None + }, + Field { + name: "More infos".to_string(), + value: "\ + https://mastodon.host/about/more\ + ".to_string(), + verified_at: None + }, + Field { + name: "Owner/Friend".to_string(), + value: "@gled".to_string(), + verified_at: None + } + ].to_vec() + ), + bot: Some(false), + source: None, + group: None, + last_status_at: None + }, + content: "

Trending tags:
#neverforget
\ + #4styles
#newpipe\ +
#uber
#mercredifiction\ +

".to_string(), + visibility: Unlisted, + sensitive: false, + spoiler_text: "".to_string(), + media_attachments: [].to_vec(), + application: None, + mentions: [].to_vec(), + tags: [ + Tag { + name: "4styles".to_string(), + url: "https://instance.codesections.com/tags/4styles".to_string(), + history: None + }, + Tag { name: "neverforget".to_string(), + url: "https://instance.codesections.com/tags/neverforget".to_string(), + history: None + }, + Tag { name: "mercredifiction".to_string(), + url: "https://instance.codesections.com/tags/mercredifiction".to_string(), + history: None + }, + Tag { name: "uber".to_string(), + url: "https://instance.codesections.com/tags/uber".to_string(), + history: None + }, + Tag { name: "newpipe".to_string(), + url: "https://instance.codesections.com/tags/newpipe".to_string(), + history: None + } + ].to_vec(), + emojis: [].to_vec(), + reblogs_count: 0, + favourites_count: 0, + replies_count: 0, + url: Some("https://mastodon.host/@federationbot/102775346916917099".to_string()), + in_reply_to_id: None, + in_reply_to_account_id: None, + reblog: None, + poll: None, + card: None, + language: Some("en".to_string()), + text: None, + favourited: Some(false), + reblogged: Some(false), + muted: Some(false), + bookmarked: None, + pinned: None + }, + queued_at: Some(1568227693541) }) \ No newline at end of file diff --git a/test_data/event_002.rs b/test_data/event_002.rs new file mode 100644 index 0000000..3d30fd4 --- /dev/null +++ b/test_data/event_002.rs @@ -0,0 +1,100 @@ +Event::TypeSafe( + Update { + payload: Status { + id: Id( + 104072549781970698, + ), + uri: "https://newsbots.eu/users/aljazeera_english/statuses/104072549673971025".to_string(), + created_at: "2020-04-27T20:58:02.000Z".to_string(), + account: Account { + id: Id( + 1852, + ), + username: "aljazeera_english".to_string(), + acct: "aljazeera_english@newsbots.eu".to_string(), + url: "https://newsbots.eu/@aljazeera_english".to_string(), + display_name: "Al Jazeera English".to_string(), + note: "

Breaking news and ongoing coverage from around the world.

• unofficial •

".to_string(), + avatar: "https://instance.codesections.com/system/accounts/avatars/000/001/852/original/6377f39416193690.jpeg?1584742113".to_string(), + avatar_static: "https://instance.codesections.com/system/accounts/avatars/000/001/852/original/6377f39416193690.jpeg?1584742113".to_string(), + header: "https://instance.codesections.com/system/accounts/headers/000/001/852/original/f582c7deb0ec14ac.jpeg?1584742114".to_string(), + header_static: "https://instance.codesections.com/system/accounts/headers/000/001/852/original/f582c7deb0ec14ac.jpeg?1584742114".to_string(), + locked: false, + emojis: [].to_vec(), + discoverable: Some( + true, + ), + created_at: "2020-03-20T22:08:35.417Z".to_string(), + statuses_count: 26018, + followers_count: 915, + following_count: 1, + moved: None, + fields: Some( + [ + Field { + name: "📍".to_string(), + value: "Doha, Qatar".to_string(), + verified_at: None, + }, + Field { + name: "🔗".to_string(), + value: "https://www.aljazeera.com".to_string(), + verified_at: None, + }, + ].to_vec(), + ), + bot: Some( + true, + ), + source: None, + group: Some( + false, + ), + last_status_at: Some( + "2020-04-27".to_string(), + ), + }, + content: "

**Far-right governor defies Rome, lifts Venice lockdown early**

\"Veneto\'s governor, Luca Zaia, of the far-rght League party, says keeping restrictions in place risks \'social conflict\'.\"

https://www.aljazeera.com/news/2020/04/governor-defies-rome-lifts-venice-lockdown-early-200427171844336.html

#news #bot

".to_string(), + visibility: Public, + sensitive: false, + spoiler_text: "".to_string(), + media_attachments: [].to_vec(), + application: None, + mentions: [].to_vec(), + tags: [ + Tag { + name: "news".to_string(), + url: "https://instance.codesections.com/tags/news".to_string(), + history: None, + }, + Tag { + name: "bot".to_string(), + url: "https://instance.codesections.com/tags/bot".to_string(), + history: None, + }, + ].to_vec(), + emojis: [].to_vec(), + reblogs_count: 0, + favourites_count: 0, + replies_count: 0, + url: Some( + "https://newsbots.eu/@aljazeera_english/104072549673971025".to_string(), + ), + in_reply_to_id: None, + in_reply_to_account_id: None, + reblog: None, + poll: None, + card: None, + language: Some( + "en".to_string(), + ), + text: None, + favourited: None, + reblogged: None, + muted: None, + bookmarked: None, + pinned: None, + }, + queued_at: None, + }, +) \ No newline at end of file diff --git a/src/response/redis/msg/test_output/001.txt b/test_data/msg.event_txt_001.txt similarity index 100% rename from src/response/redis/msg/test_output/001.txt rename to test_data/msg.event_txt_001.txt diff --git a/src/response/redis/msg/test_output/002.txt b/test_data/msg.event_txt_002.txt similarity index 100% rename from src/response/redis/msg/test_output/002.txt rename to test_data/msg.event_txt_002.txt diff --git a/src/response/redis/msg/test_output/003.txt b/test_data/msg.event_txt_003.txt similarity index 100% rename from src/response/redis/msg/test_output/003.txt rename to test_data/msg.event_txt_003.txt diff --git a/src/response/redis/msg/test_output/004.txt b/test_data/msg.event_txt_004.txt similarity index 100% rename from src/response/redis/msg/test_output/004.txt rename to test_data/msg.event_txt_004.txt diff --git a/src/response/redis/msg/test_output/005.txt b/test_data/msg.event_txt_005.txt similarity index 100% rename from src/response/redis/msg/test_output/005.txt rename to test_data/msg.event_txt_005.txt diff --git a/src/response/redis/msg/test_output/006.txt b/test_data/msg.event_txt_006.txt similarity index 100% rename from src/response/redis/msg/test_output/006.txt rename to test_data/msg.event_txt_006.txt diff --git a/src/response/redis/msg/test_input/001.resp b/test_data/redis_input_001.resp similarity index 99% rename from src/response/redis/msg/test_input/001.resp rename to test_data/redis_input_001.resp index 9ff7eac..19beb72 100644 --- a/src/response/redis/msg/test_input/001.resp +++ b/test_data/redis_input_001.resp @@ -1,7 +1,7 @@ -*3 -$7 -message -$15 -timeline:public -$3790 -{"event":"update","payload":{"id":"102775370117886890","created_at":"2019-09-11T18:42:19.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"unlisted","language":"en","uri":"https://mastodon.host/users/federationbot/statuses/102775346916917099","url":"https://mastodon.host/@federationbot/102775346916917099","replies_count":0,"reblogs_count":0,"favourites_count":0,"favourited":false,"reblogged":false,"muted":false,"content":"

Trending tags:
#neverforget
#4styles
#newpipe
#uber
#mercredifiction

","reblog":null,"account":{"id":"78","username":"federationbot","acct":"federationbot@mastodon.host","display_name":"Federation Bot","locked":false,"bot":false,"created_at":"2019-09-10T15:04:25.559Z","note":"

Hello, I am mastodon.host official semi bot.

Follow me if you want to have some updates on the view of the fediverse from here ( I only post unlisted ).

I also randomly boost one of my followers toot every hour !

If you don't feel confortable with me following you, tell me: unfollow and I'll do it :)

If you want me to follow you, just tell me follow !

If you want automatic follow for new users on your instance and you are an instance admin, contact me !

Other commands are private :)

","url":"https://mastodon.host/@federationbot","avatar":"https://instance.codesections.com/system/accounts/avatars/000/000/078/original/d9e2be5398629cf8.jpeg?1568127863","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/000/078/original/d9e2be5398629cf8.jpeg?1568127863","header":"https://instance.codesections.com/headers/original/missing.png","header_static":"https://instance.codesections.com/headers/original/missing.png","followers_count":16636,"following_count":179532,"statuses_count":50554,"emojis":[],"fields":[{"name":"More stats","value":"https://mastodon.host/stats.html","verified_at":null},{"name":"More infos","value":"https://mastodon.host/about/more","verified_at":null},{"name":"Owner/Friend","value":"@gled","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"4styles","url":"https://instance.codesections.com/tags/4styles"},{"name":"neverforget","url":"https://instance.codesections.com/tags/neverforget"},{"name":"mercredifiction","url":"https://instance.codesections.com/tags/mercredifiction"},{"name":"uber","url":"https://instance.codesections.com/tags/uber"},{"name":"newpipe","url":"https://instance.codesections.com/tags/newpipe"}],"emojis":[],"card":null,"poll":null},"queued_at":1568227693541} +*3 +$7 +message +$15 +timeline:public +$3790 +{"event":"update","payload":{"id":"102775370117886890","created_at":"2019-09-11T18:42:19.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"unlisted","language":"en","uri":"https://mastodon.host/users/federationbot/statuses/102775346916917099","url":"https://mastodon.host/@federationbot/102775346916917099","replies_count":0,"reblogs_count":0,"favourites_count":0,"favourited":false,"reblogged":false,"muted":false,"content":"

Trending tags:
#neverforget
#4styles
#newpipe
#uber
#mercredifiction

","reblog":null,"account":{"id":"78","username":"federationbot","acct":"federationbot@mastodon.host","display_name":"Federation Bot","locked":false,"bot":false,"created_at":"2019-09-10T15:04:25.559Z","note":"

Hello, I am mastodon.host official semi bot.

Follow me if you want to have some updates on the view of the fediverse from here ( I only post unlisted ).

I also randomly boost one of my followers toot every hour !

If you don't feel confortable with me following you, tell me: unfollow and I'll do it :)

If you want me to follow you, just tell me follow !

If you want automatic follow for new users on your instance and you are an instance admin, contact me !

Other commands are private :)

","url":"https://mastodon.host/@federationbot","avatar":"https://instance.codesections.com/system/accounts/avatars/000/000/078/original/d9e2be5398629cf8.jpeg?1568127863","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/000/078/original/d9e2be5398629cf8.jpeg?1568127863","header":"https://instance.codesections.com/headers/original/missing.png","header_static":"https://instance.codesections.com/headers/original/missing.png","followers_count":16636,"following_count":179532,"statuses_count":50554,"emojis":[],"fields":[{"name":"More stats","value":"https://mastodon.host/stats.html","verified_at":null},{"name":"More infos","value":"https://mastodon.host/about/more","verified_at":null},{"name":"Owner/Friend","value":"@gled","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"4styles","url":"https://instance.codesections.com/tags/4styles"},{"name":"neverforget","url":"https://instance.codesections.com/tags/neverforget"},{"name":"mercredifiction","url":"https://instance.codesections.com/tags/mercredifiction"},{"name":"uber","url":"https://instance.codesections.com/tags/uber"},{"name":"newpipe","url":"https://instance.codesections.com/tags/newpipe"}],"emojis":[],"card":null,"poll":null},"queued_at":1568227693541} diff --git a/src/response/redis/msg/test_input/002.resp b/test_data/redis_input_002.resp similarity index 99% rename from src/response/redis/msg/test_input/002.resp rename to test_data/redis_input_002.resp index 56f0d96..b37cf6f 100644 --- a/src/response/redis/msg/test_input/002.resp +++ b/test_data/redis_input_002.resp @@ -1,7 +1,7 @@ -*3 -$7 -message -$15 -timeline:public -$2872 -{"event":"update","payload":{"id":"104072549781970698","created_at":"2020-04-27T20:58:02.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://newsbots.eu/users/aljazeera_english/statuses/104072549673971025","url":"https://newsbots.eu/@aljazeera_english/104072549673971025","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"

**Far-right governor defies Rome, lifts Venice lockdown early**

\"Veneto's governor, Luca Zaia, of the far-rght League party, says keeping restrictions in place risks 'social conflict'.\"

https://www.aljazeera.com/news/2020/04/governor-defies-rome-lifts-venice-lockdown-early-200427171844336.html

#news #bot

","reblog":null,"account":{"id":"1852","username":"aljazeera_english","acct":"aljazeera_english@newsbots.eu","display_name":"Al Jazeera English","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2020-03-20T22:08:35.417Z","note":"

Breaking news and ongoing coverage from around the world.

• unofficial •

","url":"https://newsbots.eu/@aljazeera_english","avatar":"https://instance.codesections.com/system/accounts/avatars/000/001/852/original/6377f39416193690.jpeg?1584742113","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/001/852/original/6377f39416193690.jpeg?1584742113","header":"https://instance.codesections.com/system/accounts/headers/000/001/852/original/f582c7deb0ec14ac.jpeg?1584742114","header_static":"https://instance.codesections.com/system/accounts/headers/000/001/852/original/f582c7deb0ec14ac.jpeg?1584742114","followers_count":915,"following_count":1,"statuses_count":26018,"last_status_at":"2020-04-27","emojis":[],"fields":[{"name":"📍","value":"Doha, Qatar","verified_at":null},{"name":"🔗","value":"https://www.aljazeera.com","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"news","url":"https://instance.codesections.com/tags/news"},{"name":"bot","url":"https://instance.codesections.com/tags/bot"}],"emojis":[],"card":null,"poll":null}} +*3 +$7 +message +$15 +timeline:public +$2872 +{"event":"update","payload":{"id":"104072549781970698","created_at":"2020-04-27T20:58:02.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://newsbots.eu/users/aljazeera_english/statuses/104072549673971025","url":"https://newsbots.eu/@aljazeera_english/104072549673971025","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"

**Far-right governor defies Rome, lifts Venice lockdown early**

\"Veneto's governor, Luca Zaia, of the far-rght League party, says keeping restrictions in place risks 'social conflict'.\"

https://www.aljazeera.com/news/2020/04/governor-defies-rome-lifts-venice-lockdown-early-200427171844336.html

#news #bot

","reblog":null,"account":{"id":"1852","username":"aljazeera_english","acct":"aljazeera_english@newsbots.eu","display_name":"Al Jazeera English","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2020-03-20T22:08:35.417Z","note":"

Breaking news and ongoing coverage from around the world.

• unofficial •

","url":"https://newsbots.eu/@aljazeera_english","avatar":"https://instance.codesections.com/system/accounts/avatars/000/001/852/original/6377f39416193690.jpeg?1584742113","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/001/852/original/6377f39416193690.jpeg?1584742113","header":"https://instance.codesections.com/system/accounts/headers/000/001/852/original/f582c7deb0ec14ac.jpeg?1584742114","header_static":"https://instance.codesections.com/system/accounts/headers/000/001/852/original/f582c7deb0ec14ac.jpeg?1584742114","followers_count":915,"following_count":1,"statuses_count":26018,"last_status_at":"2020-04-27","emojis":[],"fields":[{"name":"📍","value":"Doha, Qatar","verified_at":null},{"name":"🔗","value":"https://www.aljazeera.com","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"news","url":"https://instance.codesections.com/tags/news"},{"name":"bot","url":"https://instance.codesections.com/tags/bot"}],"emojis":[],"card":null,"poll":null}} diff --git a/src/response/redis/msg/test_input/003.resp b/test_data/redis_input_003.resp similarity index 99% rename from src/response/redis/msg/test_input/003.resp rename to test_data/redis_input_003.resp index 90e6831..ff0d9bd 100644 --- a/src/response/redis/msg/test_input/003.resp +++ b/test_data/redis_input_003.resp @@ -1,7 +1,7 @@ -*3 -$7 -message -$15 -timeline:public -$3018 -{"event":"update","payload":{"id":"104072557586605107","created_at":"2020-04-27T21:00:00.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://botsin.space/users/it_was_inevitable/statuses/104072557374505694","url":"https://botsin.space/@it_was_inevitable/104072557374505694","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"

I just wish to help somebody. I'm uneasy.

— Mörul Zedotmedtob, Cook

","reblog":null,"account":{"id":"2160","username":"it_was_inevitable","acct":"it_was_inevitable@botsin.space","display_name":"Sentient Dwarf Fortress","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2020-03-24T02:44:05.588Z","note":"

It was inevitable.

Real quotes from Dwarf Fortress dwarves every 5 minutes.

Too fast? Try @it_was_inevitable_slow.

#dwarffortress

","url":"https://botsin.space/@it_was_inevitable","avatar":"https://instance.codesections.com/system/accounts/avatars/000/002/160/original/9d4fb963ee23aaef.gif?1585017843","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/002/160/static/9d4fb963ee23aaef.png?1585017843","header":"https://instance.codesections.com/system/accounts/headers/000/002/160/original/d52a62c64b18cac0.png?1585017845","header_static":"https://instance.codesections.com/system/accounts/headers/000/002/160/original/d52a62c64b18cac0.png?1585017845","followers_count":384,"following_count":4,"statuses_count":171387,"last_status_at":"2020-04-27","emojis":[],"fields":[{"name":"Overseer","value":"@ben","verified_at":null},{"name":"Game","value":"http://bay12games.com/dwarves/","verified_at":null},{"name":"DFHack","value":"https://dfhack.org/bay12","verified_at":null},{"name":"Code","value":"https://git.io/fNjyH","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}} +*3 +$7 +message +$15 +timeline:public +$3018 +{"event":"update","payload":{"id":"104072557586605107","created_at":"2020-04-27T21:00:00.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://botsin.space/users/it_was_inevitable/statuses/104072557374505694","url":"https://botsin.space/@it_was_inevitable/104072557374505694","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"

I just wish to help somebody. I'm uneasy.

— Mörul Zedotmedtob, Cook

","reblog":null,"account":{"id":"2160","username":"it_was_inevitable","acct":"it_was_inevitable@botsin.space","display_name":"Sentient Dwarf Fortress","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2020-03-24T02:44:05.588Z","note":"

It was inevitable.

Real quotes from Dwarf Fortress dwarves every 5 minutes.

Too fast? Try @it_was_inevitable_slow.

#dwarffortress

","url":"https://botsin.space/@it_was_inevitable","avatar":"https://instance.codesections.com/system/accounts/avatars/000/002/160/original/9d4fb963ee23aaef.gif?1585017843","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/002/160/static/9d4fb963ee23aaef.png?1585017843","header":"https://instance.codesections.com/system/accounts/headers/000/002/160/original/d52a62c64b18cac0.png?1585017845","header_static":"https://instance.codesections.com/system/accounts/headers/000/002/160/original/d52a62c64b18cac0.png?1585017845","followers_count":384,"following_count":4,"statuses_count":171387,"last_status_at":"2020-04-27","emojis":[],"fields":[{"name":"Overseer","value":"@ben","verified_at":null},{"name":"Game","value":"http://bay12games.com/dwarves/","verified_at":null},{"name":"DFHack","value":"https://dfhack.org/bay12","verified_at":null},{"name":"Code","value":"https://git.io/fNjyH","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":null}} diff --git a/src/response/redis/msg/test_input/004.resp b/test_data/redis_input_004.resp similarity index 92% rename from src/response/redis/msg/test_input/004.resp rename to test_data/redis_input_004.resp index ec178ea..4b9f978 100644 --- a/src/response/redis/msg/test_input/004.resp +++ b/test_data/redis_input_004.resp @@ -1,7 +1,7 @@ -*3 -$7 -message -$15 -timeline:public -$49 -{"event":"delete","payload":"104061222412800865"} +*3 +$7 +message +$15 +timeline:public +$49 +{"event":"delete","payload":"104061222412800865"} diff --git a/src/response/redis/msg/test_input/005.resp b/test_data/redis_input_005.resp similarity index 99% rename from src/response/redis/msg/test_input/005.resp rename to test_data/redis_input_005.resp index 52214be..47abc62 100644 --- a/src/response/redis/msg/test_input/005.resp +++ b/test_data/redis_input_005.resp @@ -1,7 +1,7 @@ -*3 -$7 -message -$15 -timeline:public -$4199 -{"event":"update","payload":{"id":"104072561966487967","created_at":"2020-04-27T21:01:05.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":true,"spoiler_text":"","visibility":"public","language":"es","uri":"https://newsbots.eu/users/telesur_es/statuses/104072561638766292","url":"https://newsbots.eu/@telesur_es/104072561638766292","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"

Autoridades internacionales de la #FórmulaUno decidieron suspender el Gran Premio de #Francia, que se celebraría el próximo 28 de junio

Ante esta decisión, la primera parada del Campeonato del Mundo será el Gran Premio de Austria https://www.telesurtv.net/news/suspendido-gran-premio-francia-formula-uno-covid-20200427-0011.html 

","reblog":null,"account":{"id":"720","username":"telesur_es","acct":"telesur_es@newsbots.eu","display_name":"teleSUR TV (Extraoficial)","locked":false,"bot":true,"discoverable":false,"group":false,"created_at":"2020-03-13T11:08:17.249Z","note":"

Con más 40 corresponsales en el mundo, alzamos nuestra voz donde otros medios callan. teleSUR es la señal informativa de América Latina

","url":"https://newsbots.eu/@telesur_es","avatar":"https://instance.codesections.com/system/accounts/avatars/000/000/720/original/57b77baa5d424d0c.jpeg?1584097695","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/000/720/original/57b77baa5d424d0c.jpeg?1584097695","header":"https://instance.codesections.com/headers/original/missing.png","header_static":"https://instance.codesections.com/headers/original/missing.png","followers_count":898,"following_count":0,"statuses_count":40648,"last_status_at":"2020-04-27","emojis":[],"fields":[{"name":"Fuente","value":"https://twitter.com/telesurtv","verified_at":null},{"name":"En inglés","value":"@telesur_en","verified_at":null},{"name":"Operador","value":"@felix","verified_at":null},{"name":"Codigo","value":"https://yerbamate.dev/nutomic/tootbot","verified_at":null}]},"media_attachments":[{"id":"13283","type":"image","url":"https://instance.codesections.com/system/media_attachments/files/000/013/283/original/0d148b189319d632.jpeg?1588021269","preview_url":"https://instance.codesections.com/system/media_attachments/files/000/013/283/small/0d148b189319d632.jpeg?1588021269","remote_url":"https://newsbots.eu/system/media_attachments/files/000/199/561/original/8f1042130e797306.jpeg","text_url":null,"meta":{"original":{"width":600,"height":338,"size":"600x338","aspect":1.7751479289940828},"small":{"width":533,"height":300,"size":"533x300","aspect":1.7766666666666666}},"description":null,"blurhash":"U9Dcs{QU4mTGu2VFWAkpDinl%2%LxZ%Lxuxu"}],"mentions":[],"tags":[{"name":"FórmulaUno","url":"https://instance.codesections.com/tags/F%C3%B3rmulaUno"},{"name":"francia","url":"https://instance.codesections.com/tags/francia"}],"emojis":[],"card":null,"poll":null}} +*3 +$7 +message +$15 +timeline:public +$4199 +{"event":"update","payload":{"id":"104072561966487967","created_at":"2020-04-27T21:01:05.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":true,"spoiler_text":"","visibility":"public","language":"es","uri":"https://newsbots.eu/users/telesur_es/statuses/104072561638766292","url":"https://newsbots.eu/@telesur_es/104072561638766292","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"

Autoridades internacionales de la #FórmulaUno decidieron suspender el Gran Premio de #Francia, que se celebraría el próximo 28 de junio

Ante esta decisión, la primera parada del Campeonato del Mundo será el Gran Premio de Austria https://www.telesurtv.net/news/suspendido-gran-premio-francia-formula-uno-covid-20200427-0011.html 

","reblog":null,"account":{"id":"720","username":"telesur_es","acct":"telesur_es@newsbots.eu","display_name":"teleSUR TV (Extraoficial)","locked":false,"bot":true,"discoverable":false,"group":false,"created_at":"2020-03-13T11:08:17.249Z","note":"

Con más 40 corresponsales en el mundo, alzamos nuestra voz donde otros medios callan. teleSUR es la señal informativa de América Latina

","url":"https://newsbots.eu/@telesur_es","avatar":"https://instance.codesections.com/system/accounts/avatars/000/000/720/original/57b77baa5d424d0c.jpeg?1584097695","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/000/720/original/57b77baa5d424d0c.jpeg?1584097695","header":"https://instance.codesections.com/headers/original/missing.png","header_static":"https://instance.codesections.com/headers/original/missing.png","followers_count":898,"following_count":0,"statuses_count":40648,"last_status_at":"2020-04-27","emojis":[],"fields":[{"name":"Fuente","value":"https://twitter.com/telesurtv","verified_at":null},{"name":"En inglés","value":"@telesur_en","verified_at":null},{"name":"Operador","value":"@felix","verified_at":null},{"name":"Codigo","value":"https://yerbamate.dev/nutomic/tootbot","verified_at":null}]},"media_attachments":[{"id":"13283","type":"image","url":"https://instance.codesections.com/system/media_attachments/files/000/013/283/original/0d148b189319d632.jpeg?1588021269","preview_url":"https://instance.codesections.com/system/media_attachments/files/000/013/283/small/0d148b189319d632.jpeg?1588021269","remote_url":"https://newsbots.eu/system/media_attachments/files/000/199/561/original/8f1042130e797306.jpeg","text_url":null,"meta":{"original":{"width":600,"height":338,"size":"600x338","aspect":1.7751479289940828},"small":{"width":533,"height":300,"size":"533x300","aspect":1.7766666666666666}},"description":null,"blurhash":"U9Dcs{QU4mTGu2VFWAkpDinl%2%LxZ%Lxuxu"}],"mentions":[],"tags":[{"name":"FórmulaUno","url":"https://instance.codesections.com/tags/F%C3%B3rmulaUno"},{"name":"francia","url":"https://instance.codesections.com/tags/francia"}],"emojis":[],"card":null,"poll":null}} diff --git a/src/response/redis/msg/test_input/006.resp b/test_data/redis_input_006.resp similarity index 99% rename from src/response/redis/msg/test_input/006.resp rename to test_data/redis_input_006.resp index eba4a4a..10065f4 100644 --- a/src/response/redis/msg/test_input/006.resp +++ b/test_data/redis_input_006.resp @@ -1,7 +1,7 @@ -*3 -$7 -message -$15 -timeline:public -$3669 -{"event":"update","payload":{"id":"104072567176319159","created_at":"2020-04-27T21:00:34.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://botsin.space/users/UnitooWebRadio/statuses/104072559646747168","url":"https://botsin.space/@UnitooWebRadio/104072559646747168","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"

🎶 #NowPlaying
War
by GoSoundtrack
Listeners: 0
https://radio.unitoo.it/public/liveradio

","reblog":null,"account":{"id":"2161","username":"UnitooWebRadio","acct":"UnitooWebRadio@botsin.space","display_name":"(BoT) Radio Unitoo","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2020-03-24T02:48:10.344Z","note":"

https://www.unitoo.it/progetti/radio/
Follow #UnitooLiveRadio
Una WebRadio Italiana che trasmette musica RoyaltyFree e che tratta tematiche inerenti al mondo del Software Libero e Open Source, Adatta ad ascoltatori di qualsiasi genere / credo / età.

","url":"https://botsin.space/@UnitooWebRadio","avatar":"https://instance.codesections.com/system/accounts/avatars/000/002/161/original/c1949ebb71a0bf25.png?1585156010","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/002/161/original/c1949ebb71a0bf25.png?1585156010","header":"https://instance.codesections.com/headers/original/missing.png","header_static":"https://instance.codesections.com/headers/original/missing.png","followers_count":13,"following_count":3,"statuses_count":9460,"last_status_at":"2020-04-27","emojis":[],"fields":[{"name":"Liberapay","value":"https://liberapay.com/UnitooWebRadio","verified_at":null},{"name":"Web Player","value":"https://radio.unitoo.it/public/liveradio","verified_at":null},{"name":"MP3 Link","value":"https://radio.unitoo.it/radio/8000/radio.mp3","verified_at":null},{"name":"Site","value":"https://www.unitoo.it/progetti/radio/","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"nowplaying","url":"https://instance.codesections.com/tags/nowplaying"}],"emojis":[],"card":null,"poll":null}} +*3 +$7 +message +$15 +timeline:public +$3669 +{"event":"update","payload":{"id":"104072567176319159","created_at":"2020-04-27T21:00:34.000Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://botsin.space/users/UnitooWebRadio/statuses/104072559646747168","url":"https://botsin.space/@UnitooWebRadio/104072559646747168","replies_count":0,"reblogs_count":0,"favourites_count":0,"content":"

🎶 #NowPlaying
War
by GoSoundtrack
Listeners: 0
https://radio.unitoo.it/public/liveradio

","reblog":null,"account":{"id":"2161","username":"UnitooWebRadio","acct":"UnitooWebRadio@botsin.space","display_name":"(BoT) Radio Unitoo","locked":false,"bot":true,"discoverable":true,"group":false,"created_at":"2020-03-24T02:48:10.344Z","note":"

https://www.unitoo.it/progetti/radio/
Follow #UnitooLiveRadio
Una WebRadio Italiana che trasmette musica RoyaltyFree e che tratta tematiche inerenti al mondo del Software Libero e Open Source, Adatta ad ascoltatori di qualsiasi genere / credo / età.

","url":"https://botsin.space/@UnitooWebRadio","avatar":"https://instance.codesections.com/system/accounts/avatars/000/002/161/original/c1949ebb71a0bf25.png?1585156010","avatar_static":"https://instance.codesections.com/system/accounts/avatars/000/002/161/original/c1949ebb71a0bf25.png?1585156010","header":"https://instance.codesections.com/headers/original/missing.png","header_static":"https://instance.codesections.com/headers/original/missing.png","followers_count":13,"following_count":3,"statuses_count":9460,"last_status_at":"2020-04-27","emojis":[],"fields":[{"name":"Liberapay","value":"https://liberapay.com/UnitooWebRadio","verified_at":null},{"name":"Web Player","value":"https://radio.unitoo.it/public/liveradio","verified_at":null},{"name":"MP3 Link","value":"https://radio.unitoo.it/radio/8000/radio.mp3","verified_at":null},{"name":"Site","value":"https://www.unitoo.it/progetti/radio/","verified_at":null}]},"media_attachments":[],"mentions":[],"tags":[{"name":"nowplaying","url":"https://instance.codesections.com/tags/nowplaying"}],"emojis":[],"card":null,"poll":null}}