Repository: TootSDK/TootSDK
Pull request #233 (2023-12-27 02:02:00)

flavour check for sharkey and iceshrimp
For now, recognize iceshrimp as firefish, same as catodon (both firefish forks). Sharkey is a misskey fork but separate from firefish.

Split the trends feature into separate features for trending posts/tags/links. Firefish only supports trending posts, and sharkey only supports trending tags.


Patch:
diff --git a/Examples/swiftui-toot/SwiftUI-Toot.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Examples/swiftui-toot/SwiftUI-Toot.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index b4b920f..46b8177 100644
--- a/Examples/swiftui-toot/SwiftUI-Toot.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/Examples/swiftui-toot/SwiftUI-Toot.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -32,8 +32,8 @@
       "kind" : "remoteSourceControl",
       "location" : "https://github.com/apple/swift-collections.git",
       "state" : {
-        "revision" : "a902f1823a7ff3c9ab2fba0f992396b948eda307",
-        "version" : "1.0.5"
+        "revision" : "d029d9d39c87bed85b1c50adee7c41795261a192",
+        "version" : "1.0.6"
       }
     },
     {
diff --git a/Package.resolved b/Package.resolved
index e06759f..4b85201 100644
--- a/Package.resolved
+++ b/Package.resolved
@@ -14,8 +14,8 @@
       "kind" : "remoteSourceControl",
       "location" : "https://github.com/apple/swift-collections.git",
       "state" : {
-        "revision" : "a902f1823a7ff3c9ab2fba0f992396b948eda307",
-        "version" : "1.0.5"
+        "revision" : "d029d9d39c87bed85b1c50adee7c41795261a192",
+        "version" : "1.0.6"
       }
     },
     {
diff --git a/Package.swift b/Package.swift
index 1098f66..a04bb44 100644
--- a/Package.swift
+++ b/Package.swift
@@ -52,7 +52,11 @@ let package = Package(
                 .copy("Resources/familiar_followers_nofollowers.json"),
                 .copy("Resources/featured_tag.json"),
                 .copy("Resources/featured_tag_unused.json"),
+                .copy("Resources/instance_akkoma.json"),
+                .copy("Resources/instance_firefish_contact_removed.json"),
                 .copy("Resources/instance_friendica_nocontact.json"),
+                .copy("Resources/instance_iceshrimp_contact_removed.json"),
+                .copy("Resources/instance_sharkey_contact_removed.json"),
                 .copy("Resources/list.json"),
                 .copy("Resources/post no emojis.json"),
                 .copy("Resources/post with emojis and attachments.json"),
diff --git a/Sources/TootSDK/HTTP/Data+prettyPrintedJSONString.swift b/Sources/TootSDK/HTTP/Data+prettyPrintedJSONString.swift
index 61e0238..4b0146c 100644
--- a/Sources/TootSDK/HTTP/Data+prettyPrintedJSONString.swift
+++ b/Sources/TootSDK/HTTP/Data+prettyPrintedJSONString.swift
@@ -7,7 +7,7 @@ extension Data {
     /// NSString gives us a nice sanitized debugDescription
     var prettyPrintedJSONString: NSString? {
         guard let object = try? JSONSerialization.jsonObject(with: self, options: []),
-            let data = try? JSONSerialization.data(withJSONObject: object, options: [.prettyPrinted]),
+            let data = try? JSONSerialization.data(withJSONObject: object, options: [.prettyPrinted, .withoutEscapingSlashes]),
             let prettyPrintedString = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
         else { return nil }
 
diff --git a/Sources/TootSDK/Models/Instance.swift b/Sources/TootSDK/Models/Instance.swift
index 1a905ab..62ab3ef 100644
--- a/Sources/TootSDK/Models/Instance.swift
+++ b/Sources/TootSDK/Models/Instance.swift
@@ -207,21 +207,31 @@ extension Instance {
 
 extension Instance {
     public var flavour: TootSDKFlavour {
+        // 2.7.2 (compatible; Pleroma 2.5.0)
         if version.lowercased().contains("pleroma") {
             return .pleroma
         }
+        // 2.7.2 (compatible; Pixelfed 0.11.9)
         if version.lowercased().contains("pixelfed") {
             return .pixelfed
         }
+        // 2.8.0 (compatible; Friendica 2023.05)
         if version.lowercased().contains("friendica") {
             return .friendica
         }
+        // 2.7.2 (compatible; Akkoma 3.10.4-0-gebfb617)
         if version.lowercased().contains("akkoma") {
             return .akkoma
         }
-        if version.lowercased().contains("firefish") {
+        // 3.0.0 (compatible; Firefish 1.0.4-dev5)
+        // 4.2.1 (compatible; Iceshrimp 2023.12-pre3)
+        if version.lowercased().contains("firefish") || version.lowercased().contains("iceshrimp") {
             return .firefish
         }
+        // 3.0.0 (compatible; Sharkey 2023.12.0.beta3)
+        if version.lowercased().contains("sharkey") {
+            return .sharkey
+        }
         return .mastodon
     }
 }
diff --git a/Sources/TootSDK/Models/TootSDKFlavour.swift b/Sources/TootSDK/Models/TootSDKFlavour.swift
index dff3194..ed4ae7b 100644
--- a/Sources/TootSDK/Models/TootSDKFlavour.swift
+++ b/Sources/TootSDK/Models/TootSDKFlavour.swift
@@ -19,6 +19,9 @@ public enum TootSDKFlavour: String, Codable, Sendable, CaseIterable {
     /// Akkoma server. API Documentation can be found at https://docs.akkoma.dev/stable/development/API/differences_in_mastoapi_responses/
     case akkoma
 
-    /// Firefish server.
+    /// Firefish server. Source at https://git.joinfirefish.org/firefish/firefish
     case firefish
+
+    /// Sharkey server. Source at https://git.joinsharkey.org/Sharkey/Sharkey
+    case sharkey
 }
diff --git a/Sources/TootSDK/TootClient/TootClient+Account.swift b/Sources/TootSDK/TootClient/TootClient+Account.swift
index 553dcca..cff1207 100644
--- a/Sources/TootSDK/TootClient/TootClient+Account.swift
+++ b/Sources/TootSDK/TootClient/TootClient+Account.swift
@@ -231,5 +231,5 @@ extension TootFeature {
 
     /// Ability to edit your profile
     ///
-    public static let updateCredentials = TootFeature(supportedFlavours: [.mastodon, .akkoma, .pleroma, .pixelfed, .firefish])
+    public static let updateCredentials = TootFeature(supportedFlavours: [.mastodon, .akkoma, .pleroma, .pixelfed, .firefish, .sharkey])
 }
diff --git a/Sources/TootSDK/TootClient/TootClient+Announcements.swift b/Sources/TootSDK/TootClient/TootClient+Announcements.swift
index 9cd087f..2e89ac3 100644
--- a/Sources/TootSDK/TootClient/TootClient+Announcements.swift
+++ b/Sources/TootSDK/TootClient/TootClient+Announcements.swift
@@ -65,5 +65,5 @@ extension TootFeature {
 
     /// Ability to retrieve announcements
     ///
-    public static let announcements = TootFeature(supportedFlavours: [.mastodon, .akkoma, .pleroma, .pixelfed, .firefish])
+    public static let announcements = TootFeature(supportedFlavours: [.mastodon, .akkoma, .pleroma, .pixelfed, .firefish, .sharkey])
 }
diff --git a/Sources/TootSDK/TootClient/TootClient+Conversation.swift b/Sources/TootSDK/TootClient/TootClient+Conversation.swift
index fbb5af6..75259bf 100644
--- a/Sources/TootSDK/TootClient/TootClient+Conversation.swift
+++ b/Sources/TootSDK/TootClient/TootClient+Conversation.swift
@@ -50,5 +50,5 @@ extension TootFeature {
 
     /// Ability to retrieve conversations.
     ///
-    public static let conversations = TootFeature(supportedFlavours: [.mastodon, .pleroma, .friendica, .akkoma, .pixelfed, .firefish])
+    public static let conversations = TootFeature(supportedFlavours: [.mastodon, .pleroma, .friendica, .akkoma, .pixelfed, .firefish, .sharkey])
 }
diff --git a/Sources/TootSDK/TootClient/TootClient+DomainBlocks.swift b/Sources/TootSDK/TootClient/TootClient+DomainBlocks.swift
index 97f6d11..bfff6e0 100644
--- a/Sources/TootSDK/TootClient/TootClient+DomainBlocks.swift
+++ b/Sources/TootSDK/TootClient/TootClient+DomainBlocks.swift
@@ -131,5 +131,5 @@ extension TootFeature {
     /// Ability to block domains
     ///
     /// Not on Friendica
-    public static let domainBlocks = TootFeature(supportedFlavours: [.mastodon, .akkoma, .pleroma, .pixelfed])
+    public static let domainBlocks = TootFeature(supportedFlavours: [.mastodon, .akkoma, .pleroma, .pixelfed, .sharkey])
 }
diff --git a/Sources/TootSDK/TootClient/TootClient+FollowRequests.swift b/Sources/TootSDK/TootClient/TootClient+FollowRequests.swift
index c214613..d0d23b2 100644
--- a/Sources/TootSDK/TootClient/TootClient+FollowRequests.swift
+++ b/Sources/TootSDK/TootClient/TootClient+FollowRequests.swift
@@ -75,5 +75,5 @@ extension TootClient {
 extension TootFeature {
 
     /// Ability to view and manage follow requests.
-    public static let followRequests = TootFeature(supportedFlavours: [.mastodon, .pleroma, .pixelfed, .friendica, .akkoma, .firefish])
+    public static let followRequests = TootFeature(supportedFlavours: [.mastodon, .pleroma, .pixelfed, .friendica, .akkoma, .firefish, .sharkey])
 }
diff --git a/Sources/TootSDK/TootClient/TootClient+Lists.swift b/Sources/TootSDK/TootClient/TootClient+Lists.swift
index 39b54ae..11b739b 100644
--- a/Sources/TootSDK/TootClient/TootClient+Lists.swift
+++ b/Sources/TootSDK/TootClient/TootClient+Lists.swift
@@ -109,5 +109,5 @@ extension TootFeature {
 
     /// Ability to create lists.
     ///
-    public static let lists = TootFeature(supportedFlavours: [.mastodon, .pleroma, .friendica, .akkoma, .firefish])
+    public static let lists = TootFeature(supportedFlavours: [.mastodon, .pleroma, .friendica, .akkoma, .firefish, .sharkey])
 }
diff --git a/Sources/TootSDK/TootClient/TootClient+Suggestions.swift b/Sources/TootSDK/TootClient/TootClient+Suggestions.swift
index 167c3f4..4538d44 100644
--- a/Sources/TootSDK/TootClient/TootClient+Suggestions.swift
+++ b/Sources/TootSDK/TootClient/TootClient+Suggestions.swift
@@ -39,5 +39,5 @@ extension TootFeature {
 
     /// Ability to query and remove suggestions
     ///
-    public static let suggestions = TootFeature(supportedFlavours: [.mastodon, .firefish])
+    public static let suggestions = TootFeature(supportedFlavours: [.mastodon, .firefish, .sharkey])
 }
diff --git a/Sources/TootSDK/TootClient/TootClient+Trends.swift b/Sources/TootSDK/TootClient/TootClient+Trends.swift
index 62d98a0..62eda29 100644
--- a/Sources/TootSDK/TootClient/TootClient+Trends.swift
+++ b/Sources/TootSDK/TootClient/TootClient+Trends.swift
@@ -16,7 +16,7 @@ extension TootClient {
     ///   - offset: Skip the first n results.
     /// - Returns: Array of ``Tag``.
     public func getTrendingTags(limit: Int? = nil, offset: Int? = nil) async throws -> [Tag] {
-        try requireFeature(.trends)
+        try requireFeature(.trendingTags)
         let req = HTTPRequestBuilder {
             $0.url = getURL(["api", "v1", "trends", "tags"])
             $0.method = .get
@@ -33,7 +33,7 @@ extension TootClient {
     ///   - offset: Skip the first n results.
     /// - Returns: Array of ``Post``.
     public func getTrendingPosts(limit: Int? = nil, offset: Int? = nil) async throws -> [Post] {
-        try requireFeature(.trends)
+        try requireFeature(.trendingPosts)
         let req = HTTPRequestBuilder {
             $0.url = getURL(["api", "v1", "trends", "statuses"])
             $0.method = .get
@@ -50,7 +50,7 @@ extension TootClient {
     ///   - offset: Skip the first n results.
     /// - Returns: Array of ``TrendingLink``.
     public func getTrendingLinks(limit: Int? = nil, offset: Int? = nil) async throws -> [TrendingLink] {
-        try requireFeature(.trends)
+        try requireFeature(.trendingLinks)
         let req = HTTPRequestBuilder {
             $0.url = getURL(["api", "v1", "trends", "links"])
             $0.method = .get
@@ -63,7 +63,29 @@ extension TootClient {
 
 extension TootFeature {
 
+    @available(*, deprecated)
     /// Ability to query trends
     ///
     public static let trends = TootFeature(supportedFlavours: [.mastodon, .firefish])
 }
+
+extension TootFeature {
+
+    /// Ability to query trending posts
+    ///
+    public static let trendingPosts = TootFeature(supportedFlavours: [.mastodon, .firefish])
+}
+
+extension TootFeature {
+
+    /// Ability to query trending tags
+    ///
+    public static let trendingTags = TootFeature(supportedFlavours: [.mastodon, .sharkey])
+}
+
+extension TootFeature {
+
+    /// Ability to query trending links
+    ///
+    public static let trendingLinks = TootFeature(supportedFlavours: [.mastodon])
+}


Test patch:
diff --git a/Tests/TootSDKTests/FlavourTests.swift b/Tests/TootSDKTests/FlavourTests.swift
index bb40beb..8582104 100644
--- a/Tests/TootSDKTests/FlavourTests.swift
+++ b/Tests/TootSDKTests/FlavourTests.swift
@@ -21,4 +21,29 @@ final class FlavourTests: XCTestCase {
         let instance = try localObject(Instance.self, "pixelfed")
         XCTAssertEqual(instance.flavour, .pixelfed)
     }
+    
+    func testDetectsFriendica() throws {
+        let instance = try localObject(Instance.self, "instance_friendica_nocontact")
+        XCTAssertEqual(instance.flavour, .friendica)
+    }
+    
+    func testDetectsAkkoma() throws {
+        let instance = try localObject(Instance.self, "instance_akkoma")
+        XCTAssertEqual(instance.flavour, .akkoma)
+    }
+    
+    func testDetectsFirefish() throws {
+        let instance = try localObject(Instance.self, "instance_firefish_contact_removed")
+        XCTAssertEqual(instance.flavour, .firefish)
+    }
+    
+    func testDetectsIceshrimpAsFirefish() throws {
+        let instance = try localObject(Instance.self, "instance_iceshrimp_contact_removed")
+        XCTAssertEqual(instance.flavour, .firefish)
+    }
+    
+    func testDetectsSharkey() throws {
+        let instance = try localObject(Instance.self, "instance_sharkey_contact_removed")
+        XCTAssertEqual(instance.flavour, .sharkey)
+    }
 }
diff --git a/Tests/TootSDKTests/Resources/instance_akkoma.json b/Tests/TootSDKTests/Resources/instance_akkoma.json
new file mode 100644
index 0000000..b8ca335
--- /dev/null
+++ b/Tests/TootSDKTests/Resources/instance_akkoma.json
@@ -0,0 +1,81 @@
+{
+  "poll_limits" : {
+    "max_options" : 20,
+    "min_expiration" : 0,
+    "max_option_chars" : 200,
+    "max_expiration" : 31536000
+  },
+  "thumbnail" : "https://social.thisworksonmycomputer.local/images/akkoma-banner.jpg",
+  "banner_upload_limit" : 4000000,
+  "title" : "Social",
+  "description_limit" : 5000,
+  "background_upload_limit" : 4000000,
+  "pleroma" : {
+    "stats" : {
+      "mau" : 5
+    },
+    "vapid_public_key" : "BNIq9QDO4zehtRBzVRqR-f-FqlSaj7HFwUZ9ykZ_47cKokHv9kqyHnT8vqdCe4IfUVX0NbKhlAwhnAaxRAQKodc",
+    "metadata" : {
+      "account_activation_required" : true,
+      "fields_limits" : {
+        "name_length" : 512,
+        "value_length" : 2048,
+        "max_fields" : 10,
+        "max_remote_fields" : 20
+      },
+      "features" : [
+        "pleroma_api",
+        "akkoma_api",
+        "mastodon_api",
+        "mastodon_api_streaming",
+        "polls",
+        "v2_suggestions",
+        "pleroma_explicit_addressing",
+        "shareable_emoji_packs",
+        "multifetch",
+        "pleroma:api/v1/notifications:include_types_filter",
+        "quote_posting",
+        "editing",
+        "bubble_timeline",
+        "pleroma_emoji_reactions",
+        "exposable_reactions",
+        "profile_directory",
+        "custom_emoji_reactions",
+        "pleroma:get:main/ostatus"
+      ],
+      "privileged_staff" : false,
+      "post_formats" : [
+        "text/plain",
+        "text/html",
+        "text/markdown",
+        "text/bbcode",
+        "text/x.misskeymarkdown"
+      ],
+      "federation" : {
+        "enabled" : true
+      }
+    }
+  },
+  "registrations" : true,
+  "approval_required" : true,
+  "background_image" : "https://social.thisworksonmycomputer.local/images/background.jpg",
+  "upload_limit" : 16000000,
+  "version" : "2.7.2 (compatible; Akkoma 3.10.4-0-gebfb617)",
+  "uri" : "https://social.thisworksonmycomputer.local",
+  "max_toot_chars" : 5000,
+  "email" : "toot@social.thisworksonmycomputer.local",
+  "urls" : {
+    "streaming_api" : "wss://social.thisworksonmycomputer.local"
+  },
+  "stats" : {
+    "user_count" : 5,
+    "remote_user_count" : 71062,
+    "domain_count" : 5844,
+    "status_count" : 16
+  },
+  "languages" : [
+    "en"
+  ],
+  "avatar_upload_limit" : 2000000,
+  "description" : "Akkoma: The cooler fediverse server"
+}
diff --git a/Tests/TootSDKTests/Resources/instance_firefish_contact_removed.json b/Tests/TootSDKTests/Resources/instance_firefish_contact_removed.json
new file mode 100644
index 0000000..3259371
--- /dev/null
+++ b/Tests/TootSDKTests/Resources/instance_firefish_contact_removed.json
@@ -0,0 +1,96 @@
+
+{
+  "description" : "A generic Calckey server for anyone to use.",
+  "languages" : [
+
+  ],
+  "stats" : {
+    "domain_count" : 14891,
+    "user_count" : 413642,
+    "status_count" : 21920403
+  },
+  "version" : "3.0.0 (compatible; Firefish 1.0.5-dev20)",
+  "uri" : "https://social.thisworksonmycomputer.local",
+  "short_description" : "A generic Calckey server for anyone to use.",
+  "invites_enabled" : true,
+  "rules" : [
+
+  ],
+  "configuration" : {
+    "statuses" : {
+      "max_media_attachments" : 16,
+      "characters_reserved_per_url" : 21,
+      "max_characters" : 3000
+    },
+    "reactions" : {
+      "max_reactions" : 1
+    },
+    "polls" : {
+      "max_expiration" : 2629746,
+      "min_expiration" : 50,
+      "max_characters_per_option" : 50,
+      "max_options" : 10
+    },
+    "accounts" : {
+      "max_featured_tags" : 20
+    },
+    "media_attachments" : {
+      "image_matrix_limit" : 16777216,
+      "supported_mime_types" : [
+        "image/png",
+        "image/gif",
+        "image/jpeg",
+        "image/webp",
+        "image/apng",
+        "image/bmp",
+        "image/tiff",
+        "image/x-icon",
+        "image/avif",
+        "audio/opus",
+        "video/ogg",
+        "audio/ogg",
+        "application/ogg",
+        "video/quicktime",
+        "video/mp4",
+        "video/vnd.avi",
+        "audio/mp4",
+        "video/x-m4v",
+        "audio/x-m4a",
+        "video/3gpp",
+        "video/3gpp2",
+        "video/3gp2",
+        "audio/3gpp",
+        "audio/3gpp2",
+        "audio/3gp2",
+        "video/mpeg",
+        "audio/mpeg",
+        "video/webm",
+        "audio/webm",
+        "audio/aac",
+        "audio/x-flac",
+        "audio/flac",
+        "audio/vnd.wave",
+        "audio/mod",
+        "audio/x-mod",
+        "audio/s3m",
+        "audio/x-s3m",
+        "audio/xm",
+        "audio/x-xm",
+        "audio/it",
+        "audio/x-it"
+      ],
+      "video_frame_rate_limit" : 60,
+      "video_size_limit" : 41943040,
+      "video_matrix_limit" : 2304000,
+      "image_size_limit" : 10485760
+    }
+  },
+  "title" : "Calckey.world",
+  "urls" : {
+    "streaming_api" : "wss://social.thisworksonmycomputer.local/streaming"
+  },
+  "approval_required" : false,
+  "thumbnail" : "https://social.thisworksonmycomputer.local/Header.png",
+  "email" : "info@social.thisworksonmycomputer.local",
+  "registrations" : true
+}
diff --git a/Tests/TootSDKTests/Resources/instance_iceshrimp_contact_removed.json b/Tests/TootSDKTests/Resources/instance_iceshrimp_contact_removed.json
new file mode 100644
index 0000000..0875016
--- /dev/null
+++ b/Tests/TootSDKTests/Resources/instance_iceshrimp_contact_removed.json
@@ -0,0 +1,92 @@
+{
+  "description" : "A general iceshrimp instance, free for everyone to use",
+  "languages" : [
+
+  ],
+  "stats" : {
+    "domain_count" : 13278,
+    "user_count" : 72,
+    "status_count" : 3994
+  },
+  "version" : "4.2.1 (compatible; Iceshrimp 2023.12.1)",
+  "uri" : "iceshrimp.social",
+  "short_description" : "A general iceshrimp instance, free for everyone to",
+  "invites_enabled" : false,
+  "rules" : [
+
+  ],
+  "configuration" : {
+    "statuses" : {
+      "max_media_attachments" : 16,
+      "supported_mime_types" : [
+        "text/x.misskeymarkdown"
+      ],
+      "max_characters" : 6000,
+      "characters_reserved_per_url" : 23
+    },
+    "reactions" : {
+      "max_reactions" : 1
+    },
+    "polls" : {
+      "max_expiration" : 2629746,
+      "min_expiration" : 50,
+      "max_characters_per_option" : 50,
+      "max_options" : 10
+    },
+    "accounts" : {
+      "max_featured_tags" : 20
+    },
+    "media_attachments" : {
+      "image_matrix_limit" : 16777216,
+      "supported_mime_types" : [
+        "image/png",
+        "image/gif",
+        "image/jpeg",
+        "image/webp",
+        "image/apng",
+        "image/bmp",
+        "image/tiff",
+        "image/x-icon",
+        "image/avif",
+        "audio/opus",
+        "video/ogg",
+        "audio/ogg",
+        "application/ogg",
+        "video/quicktime",
+        "video/mp4",
+        "video/vnd.avi",
+        "audio/mp4",
+        "video/x-m4v",
+        "audio/x-m4a",
+        "video/3gpp",
+        "video/3gpp2",
+        "video/3gp2",
+        "audio/3gpp",
+        "audio/3gpp2",
+        "audio/3gp2",
+        "video/mpeg",
+        "audio/mpeg",
+        "video/webm",
+        "audio/webm",
+        "audio/aac",
+        "audio/x-flac",
+        "audio/flac",
+        "audio/vnd.wave"
+      ],
+      "video_matrix_limit" : 2304000,
+      "video_size_limit" : 41943040,
+      "video_frame_limit" : 60,
+      "image_size_limit" : 10485760
+    }
+  },
+  "title" : "Social",
+  "urls" : {
+
+    "streaming_api" : "wss://social.thisworksonmycomputer.local"
+  },
+  "approval_required" : false,
+  "max_toot_chars" : 6000,
+  "thumbnail" : "/static-assets/transparent.png",
+  "email" : "contact@social.thisworksonmycomputer.local",
+  "registrations" : true
+}
diff --git a/Tests/TootSDKTests/Resources/instance_sharkey_contact_removed.json b/Tests/TootSDKTests/Resources/instance_sharkey_contact_removed.json
new file mode 100644
index 0000000..db25790
--- /dev/null
+++ b/Tests/TootSDKTests/Resources/instance_sharkey_contact_removed.json
@@ -0,0 +1,83 @@
+{
+  "description" : "A general-purpose Sharkey instance, open for everyone. Small, personal, running on dedicated hardware.",
+  "languages" : [
+
+  ],
+  "stats" : {
+    "domain_count" : 229440,
+    "user_count" : 179,
+    "status_count" : 46109
+  },
+  "version" : "3.0.0 (compatible; Sharkey 2024.1.0.beta1)",
+  "uri" : "https://plasmatrap.com",
+  "short_description" : "A general-purpose Sharkey instance, open for everyone. Small, personal, running on dedicated hardware.",
+  "invites_enabled" : true,
+  "rules" : [
+
+  ],
+  "configuration" : {
+    "statuses" : {
+      "max_media_attachments" : 16,
+      "characters_reserved_per_url" : 22,
+      "max_characters" : 3000
+    },
+    "reactions" : {
+      "max_reactions" : 1
+    },
+    "polls" : {
+      "max_expiration" : 2629746,
+      "min_expiration" : 50,
+      "max_characters_per_option" : 50,
+      "max_options" : 10
+    },
+    "accounts" : {
+      "max_featured_tags" : 20
+    },
+    "media_attachments" : {
+      "image_matrix_limit" : 16777216,
+      "supported_mime_types" : [
+        "image/png",
+        "image/gif",
+        "image/jpeg",
+        "image/webp",
+        "image/avif",
+        "image/apng",
+        "image/bmp",
+        "image/tiff",
+        "image/x-icon",
+        "audio/opus",
+        "video/ogg",
+        "audio/ogg",
+        "application/ogg",
+        "video/quicktime",
+        "video/mp4",
+        "audio/mp4",
+        "video/x-m4v",
+        "audio/x-m4a",
+        "video/3gpp",
+        "video/3gpp2",
+        "video/mpeg",
+        "audio/mpeg",
+        "video/webm",
+        "audio/webm",
+        "audio/aac",
+        "audio/flac",
+        "audio/wav",
+        "audio/x-flac",
+        "audio/vnd.wave"
+      ],
+      "video_frame_rate_limit" : 60,
+      "video_size_limit" : 41943040,
+      "video_matrix_limit" : 2304000,
+      "image_size_limit" : 10485760
+    }
+  },
+  "title" : "Social",
+  "urls" : {
+    "streaming_api" : "wss://social.thisworksonmycomputer.local/streaming"
+  },
+  "approval_required" : false,
+  "thumbnail" : "https://social.thisworksonmycomputer.local/background.webp",
+  "email" : "contact@social.thisworksonmycomputer.local",
+  "registrations" : true
+}