diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2e8824fe..76bdee2c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -24,6 +24,1111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 55633f45..19feb1cd 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -387,6 +387,7 @@ "settings_debug_clearFeedCache": "Clear feed cache", "settings_debug_clearTags": "Clear user tags", "settings_debug_clearOauth": "Clear Oauth identifiers", + "settings_debug_clearInstancesCache": "Clear federated instances cache", "settings_debug_log": "Log", "profiles": "Profiles", "profile_switch": "Switch profiles", diff --git a/lib/src/api/search.dart b/lib/src/api/search.dart index 39d8eda6..2ed6651f 100644 --- a/lib/src/api/search.dart +++ b/lib/src/api/search.dart @@ -1,7 +1,14 @@ +import 'package:extended_image/extended_image.dart'; import 'package:interstellar/src/api/client.dart'; import 'package:interstellar/src/controller/server.dart'; +import 'package:interstellar/src/models/comment.dart'; +import 'package:interstellar/src/models/community.dart'; +import 'package:interstellar/src/models/feed.dart'; +import 'package:interstellar/src/models/post.dart'; import 'package:interstellar/src/models/search.dart'; +import 'package:interstellar/src/models/user.dart'; import 'package:interstellar/src/screens/explore/explore_screen.dart'; +import 'package:interstellar/src/utils/utils.dart'; class APISearch { APISearch(this.client); @@ -17,7 +24,7 @@ class APISearch { }) async { switch (client.software) { case ServerSoftware.mbin: - const path = '/search'; + const path = '/search/v2'; final response = await client.get( path, @@ -98,4 +105,79 @@ class APISearch { ); } } + + Future resolveObject(String search) async { + try { + switch (client.software) { + case ServerSoftware.mbin: + const path = '/search/v2'; + + final response = await client.get( + path, + queryParams: {'q': search, 'onlyAP': 'true'}, + ); + + // get first of the ap objects found. + return SearchListModel.fromMbin(response.bodyJson).items.firstOrNull; + + case ServerSoftware.lemmy: + const path = '/resolve_object'; + + final response = await client.get(path, queryParams: {'q': search}); + + final json = response.bodyJson; + if (json['comment'] != null) { + return CommentModel.fromLemmy( + json['comment']! as JsonMap, + langCodeIdPairs: await client.languageCodeIdPairs(), + ); + } else if (json['post'] != null) { + return PostModel.fromLemmy( + json['post']! as JsonMap, + langCodeIdPairs: await client.languageCodeIdPairs(), + ); + } else if (json['community'] != null) { + return DetailedCommunityModel.fromLemmy( + json['community']! as JsonMap, + ); + } else if (json['person'] != null) { + return DetailedUserModel.fromLemmy(json['person']! as JsonMap); + } + return null; + + case ServerSoftware.piefed: + const path = '/resolve_object'; + + final response = await client.get(path, queryParams: {'q': search}); + + final json = response.bodyJson; + if (json['comment'] != null) { + return CommentModel.fromPiefed( + json['comment']! as JsonMap, + langCodeIdPairs: await client.languageCodeIdPairs(), + ); + } else if (json['post'] != null) { + return PostModel.fromPiefed( + json['post']! as JsonMap, + langCodeIdPairs: await client.languageCodeIdPairs(), + ); + } else if (json['community'] != null) { + return DetailedCommunityModel.fromPiefed( + json['community']! as JsonMap, + ); + } else if (json['person'] != null) { + return DetailedUserModel.fromPiefed(json['person']! as JsonMap); + } else if (json['feed'] != null) { + return FeedModel.fromPiefed(json['feed']! as JsonMap); + } + return null; + } + } on ClientException catch (e) { + if (e.message.contains('No object found') || + e.message.contains('couldnt_find_object')) { + return null; + } + rethrow; + } + } } diff --git a/lib/src/app.dart b/lib/src/app.dart index 6188c714..40ed97fc 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -1,12 +1,18 @@ import 'package:dynamic_color/dynamic_color.dart'; import 'package:flex_color_scheme/flex_color_scheme.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localized_locales/flutter_localized_locales.dart'; import 'package:interstellar/l10n/app_localizations.dart'; import 'package:interstellar/src/controller/controller.dart'; import 'package:interstellar/src/controller/router.dart'; +import 'package:interstellar/src/models/comment.dart'; +import 'package:interstellar/src/models/community.dart'; +import 'package:interstellar/src/models/post.dart'; +import 'package:interstellar/src/models/user.dart'; import 'package:interstellar/src/screens/account/notification/notification_count_controller.dart'; import 'package:interstellar/src/utils/globals.dart'; +import 'package:interstellar/src/utils/instances.dart'; import 'package:interstellar/src/utils/utils.dart'; import 'package:intl/locale.dart' as intl_locale; import 'package:provider/provider.dart'; @@ -45,7 +51,46 @@ class App extends StatelessWidget { textScaler: TextScaler.linear(ac.profile.globalTextScale), ), child: MaterialApp.router( - routerConfig: router.config(), + routerConfig: router.config( + deepLinkTransformer: (link) async { + final knownInstance = knownInstances[link.host]; + if (knownInstance == null) return SynchronousFuture(link); + + // Ensure item is federated to current instance. + final item = await ac.api.search.resolveObject( + link.toString(), + ); + + if (item == null) { + scaffoldMessengerKey.currentState?.showSnackBar( + const SnackBar( + content: Text('Failed to open link.'), + showCloseIcon: true, + ), + ); + } + + // Construct interstellar compatible uri. + final newUri = switch (item) { + final PostModel p => Uri.parse( + '/${ac.instanceHost}/c/${p.community.name}/${p.type == PostType.thread ? 'thread' : 'microblog'}/${p.id}', + ), + final CommentModel c => Uri.parse( + '/${ac.instanceHost}/comment/${c.id}', + ), + final DetailedUserModel u => Uri.parse( + '/${ac.instanceHost}/u/${u.name}', + ), + final DetailedCommunityModel c => Uri.parse( + '/${ac.instanceHost}/c/${c.name}', + ), + Object() => link, + null => link, + }; + + return SynchronousFuture(newUri); + }, + ), restorationScopeId: 'app', localizationsDelegates: const [ ...AppLocalizations.localizationsDelegates, diff --git a/lib/src/controller/controller.dart b/lib/src/controller/controller.dart index 8defa1e1..5a143334 100644 --- a/lib/src/controller/controller.dart +++ b/lib/src/controller/controller.dart @@ -287,6 +287,7 @@ class AppController with ChangeNotifier { _defaultDownloadsDir = await getDefaultDownloadDir(); await _updateAPI(); + logger.i('Finished init'); } @@ -595,7 +596,7 @@ class AppController with ChangeNotifier { await switchAccounts(key, force: forceSwitch); } else { // The following is already done when switchAccounts is run, so only needed without switchAccounts. - _updateAPI(); + await _updateAPI(); notifyListeners(); } diff --git a/lib/src/models/post.dart b/lib/src/models/post.dart index 3048884d..1f61c7e5 100644 --- a/lib/src/models/post.dart +++ b/lib/src/models/post.dart @@ -210,7 +210,7 @@ abstract class PostModel with _$PostModel { JsonMap json, { required List<(String, int)> langCodeIdPairs, }) { - final postView = json['post_view']! as JsonMap; + final postView = json['post_view'] as JsonMap? ?? json; final lemmyPost = postView['post']! as JsonMap; final lemmyCounts = postView['counts'] as JsonMap?; diff --git a/lib/src/models/search.dart b/lib/src/models/search.dart index d5a57947..a53f483e 100644 --- a/lib/src/models/search.dart +++ b/lib/src/models/search.dart @@ -18,32 +18,55 @@ abstract class SearchListModel with _$SearchListModel { factory SearchListModel.fromMbin(Map json) { final items = []; - for (final actor in json['apActors']) { - final type = actor['type']; - if (type == 'user') { - items.add(DetailedUserModel.fromMbin(actor['object'] as JsonMap)); - } else if (type == 'magazine') { - items.add(DetailedCommunityModel.fromMbin(actor['object'] as JsonMap)); + final itemsJson = json['items']! as List; + final apResultsJson = json['apResults']! as List; + + for (final itemJson in itemsJson) { + if (itemJson['entry'] != null) { + items.add(PostModel.fromMbinEntry(itemJson['entry'] as JsonMap)); } - } - for (final item in json['apObjects']) { - final itemType = item['itemType']; - if (itemType == 'entry') { - items.add(PostModel.fromMbinEntry(item as JsonMap)); - } else if (itemType == 'post') { - items.add(PostModel.fromMbinPost(item as JsonMap)); - } else if (itemType == 'entry_comment' || itemType == 'post_comment') { - items.add(CommentModel.fromMbin(item as JsonMap)); + if (itemJson['entryComment'] != null) { + items.add(CommentModel.fromMbin(itemJson['entryComment'] as JsonMap)); + } + if (itemJson['post'] != null) { + items.add(PostModel.fromMbinPost(itemJson['post'] as JsonMap)); + } + if (itemJson['postComment'] != null) { + items.add(CommentModel.fromMbin(itemJson['postComment'] as JsonMap)); + } + if (itemJson['magazine'] != null) { + items.add( + DetailedCommunityModel.fromMbin(itemJson['magazine'] as JsonMap), + ); + } + if (itemJson['user'] != null) { + items.add(DetailedUserModel.fromMbin(itemJson['user'] as JsonMap)); } } - for (final item in json['items']) { - final itemType = item['itemType']; - if (itemType == 'entry') { - items.add(PostModel.fromMbinEntry(item as JsonMap)); - } else if (itemType == 'post') { - items.add(PostModel.fromMbinPost(item as JsonMap)); - } else if (itemType == 'entry_comment' || itemType == 'post_comment') { - items.add(CommentModel.fromMbin(item as JsonMap)); + for (final apResultJson in apResultsJson) { + if (apResultJson['entry'] != null) { + items.add(PostModel.fromMbinEntry(apResultJson['entry'] as JsonMap)); + } + if (apResultJson['entryComment'] != null) { + items.add( + CommentModel.fromMbin(apResultJson['entryComment'] as JsonMap), + ); + } + if (apResultJson['post'] != null) { + items.add(PostModel.fromMbinPost(apResultJson['post'] as JsonMap)); + } + if (apResultJson['postComment'] != null) { + items.add( + CommentModel.fromMbin(apResultJson['postComment'] as JsonMap), + ); + } + if (apResultJson['magazine'] != null) { + items.add( + DetailedCommunityModel.fromMbin(apResultJson['magazine'] as JsonMap), + ); + } + if (apResultJson['user'] != null) { + items.add(DetailedUserModel.fromMbin(apResultJson['user'] as JsonMap)); } } diff --git a/lib/src/utils/ap_urls.dart b/lib/src/utils/ap_urls.dart index 0120d4e4..5f58cc40 100644 --- a/lib/src/utils/ap_urls.dart +++ b/lib/src/utils/ap_urls.dart @@ -1,11 +1,14 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:interstellar/src/controller/controller.dart'; +import 'package:interstellar/src/controller/router.gr.dart'; import 'package:interstellar/src/controller/server.dart'; import 'package:interstellar/src/models/comment.dart'; import 'package:interstellar/src/models/community.dart'; import 'package:interstellar/src/models/feed.dart'; import 'package:interstellar/src/models/post.dart'; import 'package:interstellar/src/models/user.dart'; +import 'package:interstellar/src/screens/feed/post_page.dart'; import 'package:interstellar/src/utils/utils.dart'; import 'package:provider/provider.dart'; @@ -103,3 +106,32 @@ List genFeedUrls(BuildContext context, FeedModel feed) { ?apUrl, ]; } + +Future navigateApObject(BuildContext context, String apId) async { + final ac = context.read(); + + final object = await ac.api.search.resolveObject(apId); + if (object == null || !context.mounted) return false; + + switch (object) { + case final CommentModel i: + context.router.push( + PostCommentRoute(postType: i.postType, commentId: i.id), + ); + case final PostModel i: + pushPostPage( + context, + communityName: i.community.name, + postId: i.id, + postType: i.type, + initData: i, + ); + case final DetailedCommunityModel i: + context.router.push(CommunityRoute(communityName: i.name, initData: i)); + case final DetailedUserModel i: + context.router.push(UserRoute(username: i.name, initData: i)); + case final FeedModel i: + context.router.push(FeedRoute(feedName: i.name)); + } + return true; +} diff --git a/lib/src/utils/instances.dart b/lib/src/utils/instances.dart new file mode 100644 index 00000000..ad14f1ba --- /dev/null +++ b/lib/src/utils/instances.dart @@ -0,0 +1,1096 @@ +import 'package:interstellar/src/controller/server.dart'; + +const Map knownInstances = { + 'agora.energieincomune.com': ServerSoftware.mbin, + 'bin.pivox.net': ServerSoftware.mbin, + 'fedia.io': ServerSoftware.mbin, + 'fedi.livi.fans': ServerSoftware.mbin, + 'ferment.site': ServerSoftware.mbin, + 'gehirneimer.de': ServerSoftware.mbin, + 'incremental.social': ServerSoftware.mbin, + 'kbin.earth': ServerSoftware.mbin, + 'kbin.melroy.org': ServerSoftware.mbin, + 'k.fe.derate.me': ServerSoftware.mbin, + 'mbin.cocopoops.com': ServerSoftware.mbin, + 'mbin.level5.dev': ServerSoftware.mbin, + 'mbin.potato-guy.space': ServerSoftware.mbin, + 'moist.catsweat.com': ServerSoftware.mbin, + 'rimworld.gallery': ServerSoftware.mbin, + 'socialnetworks.rodeo': ServerSoftware.mbin, + 'thebrainbin.org': ServerSoftware.mbin, + + 'alquimidia.cc': ServerSoftware.piefed, + 'anarchist.nexus': ServerSoftware.piefed, + 'animaignota.com': ServerSoftware.piefed, + 'bookwyr.me': ServerSoftware.piefed, + 'cafe.coffee-break.cc': ServerSoftware.piefed, + 'cake.kobel.fyi': ServerSoftware.piefed, + 'cie.mortebrume.eu': ServerSoftware.piefed, + 'crust.piefed.social': ServerSoftware.piefed, + 'das-eck.haus': ServerSoftware.piefed, + 'devel.silesia.social': ServerSoftware.piefed, + 'discuss.amicia.net': ServerSoftware.piefed, + 'discuss.familie-will.at': ServerSoftware.piefed, + 'ero.ani.social': ServerSoftware.piefed, + 'feddit.com': ServerSoftware.piefed, + 'feddit.fr': ServerSoftware.piefed, + 'feddit.mauve.haus': ServerSoftware.piefed, + 'feddit.online': ServerSoftware.piefed, + 'fedi.fsfans.club': ServerSoftware.piefed, + 'fedinsfw.app': ServerSoftware.piefed, + 'fedi.ur-mom.gay': ServerSoftware.piefed, + 'forum.sf-informatique.fr': ServerSoftware.piefed, + 'geostationary.orbiting.observer': ServerSoftware.piefed, + 'humansare.social': ServerSoftware.piefed, + 'hyper2.wandzeitung.xyz': ServerSoftware.piefed, + 'itsawonder.icu': ServerSoftware.piefed, + 'jolly-piefed.jomandoa.net': ServerSoftware.piefed, + 'kopitalk.net': ServerSoftware.piefed, + 'lonestarpiefed.duckdns.org': ServerSoftware.piefed, + 'meowing.twink.men': ServerSoftware.piefed, + 'multiverse.soulism.net': ServerSoftware.piefed, + 'news.erebion.eu': ServerSoftware.piefed, + 'news.heathenlab.net': ServerSoftware.piefed, + 'nord.pub': ServerSoftware.piefed, + 'palaver.p3x.de': ServerSoftware.piefed, + 'peachpie.theatl.social': ServerSoftware.piefed, + 'pf.a3a2.uk': ServerSoftware.piefed, + 'pf.korako.me': ServerSoftware.piefed, + 'p.hobo.social': ServerSoftware.piefed, + 'pie.dasneuland.de': ServerSoftware.piefed, + 'pie.eyeofthestorm.place': ServerSoftware.piefed, + 'piefed.0x0c.link': ServerSoftware.piefed, + 'piefed.alphapuggle.dev': ServerSoftware.piefed, + 'piefed.blahaj.zone': ServerSoftware.piefed, + 'piefed.ca': ServerSoftware.piefed, + 'piefed.crash.cx': ServerSoftware.piefed, + 'piefed.dk': ServerSoftware.piefed, + 'piefed.ee': ServerSoftware.piefed, + 'piefed.eurocomsocial.de': ServerSoftware.piefed, + 'piefed.fan': ServerSoftware.piefed, + 'piefed.flauschbereich.de': ServerSoftware.piefed, + 'piefed.foxden.party': ServerSoftware.piefed, + 'piefed.grant.rip': ServerSoftware.piefed, + 'piefed.inwoodnexus.nyc': ServerSoftware.piefed, + 'piefed.iridescent.nz': ServerSoftware.piefed, + 'piefed.jeena.net': ServerSoftware.piefed, + 'piefed.keyboardvagabond.com': ServerSoftware.piefed, + 'piefed.lerman-development.com': ServerSoftware.piefed, + 'piefed.marud.fr': ServerSoftware.piefed, + 'piefed.muxika.org': ServerSoftware.piefed, + 'piefed.nl': ServerSoftware.piefed, + 'piefed.nullspace.lol': ServerSoftware.piefed, + 'piefed.ombreport.info': ServerSoftware.piefed, + 'piefed.projetretro.io': ServerSoftware.piefed, + 'piefed.sekretaerbaer.net': ServerSoftware.piefed, + 'piefed.socdojo.com': ServerSoftware.piefed, + 'piefed.social': ServerSoftware.piefed, + 'piefed.sysctl.io': ServerSoftware.piefed, + 'piefed.wjs018.xyz': ServerSoftware.piefed, + 'piefed.world': ServerSoftware.piefed, + 'piefed.zeromedia.vip': ServerSoftware.piefed, + 'piefeed.com': ServerSoftware.piefed, + 'pie.gravitywell.xyz': ServerSoftware.piefed, + 'pie.ohpossum.ooo': ServerSoftware.piefed, + 'pie.zerojay.com': ServerSoftware.piefed, + 'pylova-test.anarchistflotilla.org': ServerSoftware.piefed, + 'queer.irish': ServerSoftware.piefed, + 'quokk.au': ServerSoftware.piefed, + 'rentadrunk.org': ServerSoftware.piefed, + 'retrofed.com': ServerSoftware.piefed, + 'seksi.jatai.de': ServerSoftware.piefed, + 'silesia.social': ServerSoftware.piefed, + 'social.doomprepper.com': ServerSoftware.piefed, + 'social.ozymandias.club': ServerSoftware.piefed, + 'stable.wjs018.xyz': ServerSoftware.piefed, + 'tarte.nuage-libre.fr': ServerSoftware.piefed, + 'wetshav.ing': ServerSoftware.piefed, + 'wiresandlights.me': ServerSoftware.piefed, + + '0xdd.org.ru': ServerSoftware.lemmy, + 'academy.garden': ServerSoftware.lemmy, + 'adultswim.fan': ServerSoftware.lemmy, + 'aggregatet.org': ServerSoftware.lemmy, + 'alien.top': ServerSoftware.lemmy, + 'altgag.net': ServerSoftware.lemmy, + 'altmedia.house': ServerSoftware.lemmy, + 'ani.social': ServerSoftware.lemmy, + 'api-dev.rabotaem.app': ServerSoftware.lemmy, + 'ascy.mooo.com': ServerSoftware.lemmy, + 'awful.systems': ServerSoftware.lemmy, + 'badatbeing.social': ServerSoftware.lemmy, + 'baraza.africa': ServerSoftware.lemmy, + 'bdl.owu.one': ServerSoftware.lemmy, + 'beehaw.org': ServerSoftware.lemmy, + 'belfry.rip': ServerSoftware.lemmy, + 'belgae.social': ServerSoftware.lemmy, + 'blockchained.world': ServerSoftware.lemmy, + 'bodli.mven.nl': ServerSoftware.lemmy, + 'bohemian.social': ServerSoftware.lemmy, + 'bolha.forum': ServerSoftware.lemmy, + 'breakfast.haus': ServerSoftware.lemmy, + 'campfyre.nickwebster.dev': ServerSoftware.lemmy, + 'chachara.club': ServerSoftware.lemmy, + 'champserver.net': ServerSoftware.lemmy, + 'chinese.lol': ServerSoftware.lemmy, + 'civilloquy.com': ServerSoftware.lemmy, + 'collapse.cat': ServerSoftware.lemmy, + 'communick.news': ServerSoftware.lemmy, + 'corndog.social': ServerSoftware.lemmy, + 'crazypeople.online': ServerSoftware.lemmy, + 'dev.lemmy.world': ServerSoftware.lemmy, + 'diggita.com': ServerSoftware.lemmy, + 'digipres.cafe': ServerSoftware.lemmy, + 'discover.deltanauten.de': ServerSoftware.lemmy, + 'discuss.hadan.social': ServerSoftware.lemmy, + 'discuss.icewind.me': ServerSoftware.lemmy, + 'discuss.jacen.moe': ServerSoftware.lemmy, + 'discuss.mschae23.de': ServerSoftware.lemmy, + 'discuss.online': ServerSoftware.lemmy, + 'discuss.tchncs.de': ServerSoftware.lemmy, + 'downonthestreet.eu': ServerSoftware.lemmy, + 'ds9.lemmy.ml': ServerSoftware.lemmy, + 'dubvee.org': ServerSoftware.lemmy, + 'dullsters.net': ServerSoftware.lemmy, + 'enterprise.lemmy.ml': ServerSoftware.lemmy, + 'esc.ozar.dev': ServerSoftware.lemmy, + 'europe.pub': ServerSoftware.lemmy, + 'eventfrontier.com': ServerSoftware.lemmy, + 'eviltoast.org': ServerSoftware.lemmy, + 'expats.zone': ServerSoftware.lemmy, + 'fanaticus.social': ServerSoftware.lemmy, + 'fasheng.ing': ServerSoftware.lemmy, + 'feddit.bg': ServerSoftware.lemmy, + 'feddit.cl': ServerSoftware.lemmy, + 'feddit.dk': ServerSoftware.lemmy, + 'feddit.it': ServerSoftware.lemmy, + 'feddit.nl': ServerSoftware.lemmy, + 'feddit.nu': ServerSoftware.lemmy, + 'feddit.org': ServerSoftware.lemmy, + 'feddit.rocks': ServerSoftware.lemmy, + 'feddit.uk': ServerSoftware.lemmy, + 'fed.dyne.org': ServerSoftware.lemmy, + 'feditown.com': ServerSoftware.lemmy, + 'fenmou.cyou': ServerSoftware.lemmy, + 'fjdk.uk': ServerSoftware.lemmy, + 'foros.fediverso.gal': ServerSoftware.lemmy, + 'forum.ayom.media': ServerSoftware.lemmy, + 'forum.digitaleautonomie.org': ServerSoftware.lemmy, + 'forum.guncadindex.com': ServerSoftware.lemmy, + 'forums.chippytea.uk': ServerSoftware.lemmy, + 'forums.rereading.space': ServerSoftware.lemmy, + 'forum.storstad.net': ServerSoftware.lemmy, + 'fosscad.io': ServerSoftware.lemmy, + 'fstab.sh': ServerSoftware.lemmy, + 'futurology.today': ServerSoftware.lemmy, + 'gearhead.town': ServerSoftware.lemmy, + 'giesing.dev': ServerSoftware.lemmy, + 'gioia.news': ServerSoftware.lemmy, + 'gonzo.markets': ServerSoftware.lemmy, + 'go.ontomy.tv': ServerSoftware.lemmy, + 'gregtech.eu': ServerSoftware.lemmy, + 'group.lt': ServerSoftware.lemmy, + 'hackertalks.com': ServerSoftware.lemmy, + 'hackerz.world': ServerSoftware.lemmy, + 'hackingne.ws': ServerSoftware.lemmy, + 'hacknest.diy': ServerSoftware.lemmy, + 'halubilo.social': ServerSoftware.lemmy, + 'hardpass.lol': ServerSoftware.lemmy, + 'hardware.watch': ServerSoftware.lemmy, + 'healthy.community': ServerSoftware.lemmy, + 'helpos.ca': ServerSoftware.lemmy, + 'hexbear.net': ServerSoftware.lemmy, + 'hikki.team': ServerSoftware.lemmy, + 'hilariouschaos.com': ServerSoftware.lemmy, + 'hobbit.world': ServerSoftware.lemmy, + 'hoihoi.superboi.eu.org': ServerSoftware.lemmy, + 'indiehackers.space': ServerSoftware.lemmy, + 'indie-ver.se': ServerSoftware.lemmy, + 'info.prou.be': ServerSoftware.lemmy, + 'infosec.pub': ServerSoftware.lemmy, + 'isawthat.fyi': ServerSoftware.lemmy, + 'jlai.lu': ServerSoftware.lemmy, + 'kakera.kintsugi.moe': ServerSoftware.lemmy, + 'kbin.thicknahalf.com': ServerSoftware.lemmy, + 'kitty.ly': ServerSoftware.lemmy, + 'lazysoci.al': ServerSoftware.lemmy, + 'l.cypherworld.net': ServerSoftware.lemmy, + 'leaf.dance': ServerSoftware.lemmy, + 'lef.li': ServerSoftware.lemmy, + 'lem.afiz.org': ServerSoftware.lemmy, + 'lem.cochrun.xyz': ServerSoftware.lemmy, + 'lemdro.id': ServerSoftware.lemmy, + 'lem.free.as': ServerSoftware.lemmy, + 'leminal.space': ServerSoftware.lemmy, + 'lemming.megumin.org': ServerSoftware.lemmy, + 'lemmit.nyc.what.if.ua': ServerSoftware.lemmy, + 'lemmit.online': ServerSoftware.lemmy, + 'lemmus.org': ServerSoftware.lemmy, + 'lemmy.0upti.me': ServerSoftware.lemmy, + 'lemmy.100010101.xyz': ServerSoftware.lemmy, + 'lemmy.1095.me': ServerSoftware.lemmy, + 'lemmy.14042003.xyz': ServerSoftware.lemmy, + 'lemmy.30p87.de': ServerSoftware.lemmy, + 'lemmy.4d2.org': ServerSoftware.lemmy, + 'lemmy.8bitar.io': ServerSoftware.lemmy, + 'lemmy.8th.world': ServerSoftware.lemmy, + 'lemmy.963.pm': ServerSoftware.lemmy, + 'lemmy.absolutesix.com': ServerSoftware.lemmy, + 'lemmy.activitypub.academy': ServerSoftware.lemmy, + 'lemmy.ahall.se': ServerSoftware.lemmy, + 'lemmy.almostadatacenter.social': ServerSoftware.lemmy, + 'lemmy.amethyst.name': ServerSoftware.lemmy, + 'lemmy.amxl.com': ServerSoftware.lemmy, + 'lemmy.ananace.dev': ServerSoftware.lemmy, + 'lemmy.anhanga.com.br': ServerSoftware.lemmy, + 'lemmy.ansico.dk': ServerSoftware.lemmy, + 'lemmy-api.ten4ward.social': ServerSoftware.lemmy, + 'lemmy.asc6.org': ServerSoftware.lemmy, + 'lemmy.asudox.dev': ServerSoftware.lemmy, + 'lemmy.az.social': ServerSoftware.lemmy, + 'lemmy.baie.me': ServerSoftware.lemmy, + 'lemmy.balamb.fr': ServerSoftware.lemmy, + 'lemmy.beagle.quest': ServerSoftware.lemmy, + 'lemmy.belegost.net': ServerSoftware.lemmy, + 'lemmy.beru.co': ServerSoftware.lemmy, + 'lemmy.bestiver.se': ServerSoftware.lemmy, + 'lemmy.billiam.net': ServerSoftware.lemmy, + 'lemmy.blackeco.com': ServerSoftware.lemmy, + 'lemmy.blahaj.zone': ServerSoftware.lemmy, + 'lemmy.bleh.au': ServerSoftware.lemmy, + 'lemmy.blueberryicetea.com': ServerSoftware.lemmy, + 'lemmy.bmck.au': ServerSoftware.lemmy, + 'lemmy.bosio.info': ServerSoftware.lemmy, + 'lemmy.brandslisten.com': ServerSoftware.lemmy, + 'lemmy.brdsnest.net': ServerSoftware.lemmy, + 'lemmy.brief.guru': ServerSoftware.lemmy, + 'lemmy.browntown.dev': ServerSoftware.lemmy, + 'lemmy.ca': ServerSoftware.lemmy, + 'lemmy.cafe': ServerSoftware.lemmy, + 'lemmy.caliban.io': ServerSoftware.lemmy, + 'lemmy.canthonyscott.io': ServerSoftware.lemmy, + 'lemmy.carl.id': ServerSoftware.lemmy, + 'lemmy.ch3n2k.com': ServerSoftware.lemmy, + 'lemmychan.org': ServerSoftware.lemmy, + 'lemmy.circenn.win': ServerSoftware.lemmy, + 'lemmy.civl.cc': ServerSoftware.lemmy, + 'lemmy.cmoser.eu': ServerSoftware.lemmy, + 'lemmy.coupou.fr': ServerSoftware.lemmy, + 'lemmy.cringecollective.io': ServerSoftware.lemmy, + 'lemmy.criticalbasics.xyz': ServerSoftware.lemmy, + 'lemmy.cronyakatsuki.xyz': ServerSoftware.lemmy, + 'lemmy.cryonex.net': ServerSoftware.lemmy, + 'lemmy.ctrlq.dev': ServerSoftware.lemmy, + 'lemmy.cultimean.group': ServerSoftware.lemmy, + 'lemmy.curiana.net': ServerSoftware.lemmy, + 'lemmy.cyberia9.org': ServerSoftware.lemmy, + 'lemmy.darkc0de.one': ServerSoftware.lemmy, + 'lemmy.darvit.nl': ServerSoftware.lemmy, + 'lemmy.dbzer0.com': ServerSoftware.lemmy, + 'lemmy.deadca.de': ServerSoftware.lemmy, + 'lemmy.decronym.xyz': ServerSoftware.lemmy, + 'lemmy.deedium.nl': ServerSoftware.lemmy, + 'lemmy.devr.cc': ServerSoftware.lemmy, + 'lemmy.digitalcharon.in': ServerSoftware.lemmy, + 'lemmy.digitalfall.net': ServerSoftware.lemmy, + 'lemmy.dorfrollenspiel.de': ServerSoftware.lemmy, + 'lemmy.dougiepeart.co.uk': ServerSoftware.lemmy, + 'lemmy.draktis.com': ServerSoftware.lemmy, + 'lemmy.drath.ru': ServerSoftware.lemmy, + 'lemmy.duckpond.social': ServerSoftware.lemmy, + 'lemmy.durstig.online': ServerSoftware.lemmy, + 'lemmy.eirides.net': ServerSoftware.lemmy, + 'lemmy.eknz.org': ServerSoftware.lemmy, + 'lemmy.electricmonk.io': ServerSoftware.lemmy, + 'lemmy.encryptionin.space': ServerSoftware.lemmy, + 'lemmy.eurocomsocial.de': ServerSoftware.lemmy, + 'lemmy.eus': ServerSoftware.lemmy, + 'lemmy.evangineer.net': ServerSoftware.lemmy, + 'lemmy.fait.ch': ServerSoftware.lemmy, + 'lemmy.federate.cc': ServerSoftware.lemmy, + 'lemmy.federate.lol': ServerSoftware.lemmy, + 'lemmy.fedifun.eu': ServerSoftware.lemmy, + 'lemmy.fedi.ovh': ServerSoftware.lemmy, + 'lemmy.fediverse.jp': ServerSoftware.lemmy, + 'lemmy.fedi.zutto.fi': ServerSoftware.lemmy, + 'lemmy.fiftyfifty.one': ServerSoftware.lemmy, + 'lemmy.fromshado.ws': ServerSoftware.lemmy, + 'lemmy.frozeninferno.xyz': ServerSoftware.lemmy, + 'lemmy.funami.tech': ServerSoftware.lemmy, + 'lemmy.gay.amsterdam': ServerSoftware.lemmy, + 'lemmy.glasgow.social': ServerSoftware.lemmy, + 'lemmy.glue.io': ServerSoftware.lemmy, + 'lemmygrad.ml': ServerSoftware.lemmy, + 'lemmy.grey.fail': ServerSoftware.lemmy, + 'lemmy.grey.ooo': ServerSoftware.lemmy, + 'lemmy.grys.it': ServerSoftware.lemmy, + 'lemmy.hangdaan.com': ServerSoftware.lemmy, + 'lemmy.helios42.de': ServerSoftware.lemmy, + 'lemmy.helvetet.eu': ServerSoftware.lemmy, + 'lemmy.hkserv.space': ServerSoftware.lemmy, + 'lemmy.hogru.ch': ServerSoftware.lemmy, + 'lemmy.horwood.cloud': ServerSoftware.lemmy, + 'lemmy.hostux.net': ServerSoftware.lemmy, + 'lemmy.igl.ooo': ServerSoftware.lemmy, + 'lemmy.imagisphe.re': ServerSoftware.lemmy, + 'lemmy.inbutts.lol': ServerSoftware.lemmy, + 'lemmy.itsmy.social': ServerSoftware.lemmy, + 'lemmy.jacaranda.club': ServerSoftware.lemmy, + 'lemmy.jann.dev': ServerSoftware.lemmy, + 'lemmy.jaypg.pw': ServerSoftware.lemmy, + 'lemmy.jelliefrontier.net': ServerSoftware.lemmy, + 'lemmy.jhjacobs.nl': ServerSoftware.lemmy, + 'lemmy.jodoktus.com': ServerSoftware.lemmy, + 'lemmy.johnnei.org': ServerSoftware.lemmy, + 'lemmy.johnsonsystems.org': ServerSoftware.lemmy, + 'lemmy.k2pk.com': ServerSoftware.lemmy, + 'lemmy.karolwos.com': ServerSoftware.lemmy, + 'lemmy.keimai.space': ServerSoftware.lemmy, + 'lemmy.keniir.wtf': ServerSoftware.lemmy, + 'lemmy.killtime.online': ServerSoftware.lemmy, + 'lemmy.klein.ruhr': ServerSoftware.lemmy, + 'lemmy.kmoneyserver.com': ServerSoftware.lemmy, + 'lemmy.ktegl.es': ServerSoftware.lemmy, + 'lemmy.kzkr.xyz': ServerSoftware.lemmy, + 'lemmy.labfox.fr': ServerSoftware.lemmy, + 'lemmy.lacasabien.space': ServerSoftware.lemmy, + 'lemmy.laitinlok.com': ServerSoftware.lemmy, + 'lemmy.lama-corp.space': ServerSoftware.lemmy, + 'lemmyland.com': ServerSoftware.lemmy, + 'lemmy.lantian.pub': ServerSoftware.lemmy, + 'lemmy.lidstah.info': ServerSoftware.lemmy, + 'lemmy.liebeleu.de': ServerSoftware.lemmy, + 'lemmy.linden.social': ServerSoftware.lemmy, + 'lemmylink.com': ServerSoftware.lemmy, + 'lemmy.linuxuserspace.show': ServerSoftware.lemmy, + 'lemmy.lqx.net': ServerSoftware.lemmy, + 'lemmy.lt': ServerSoftware.lemmy, + 'lemmy.lundgrensjostrom.com': ServerSoftware.lemmy, + 'lemmy.lupiverse.com': ServerSoftware.lemmy, + 'lemmy.lynas.ca': ServerSoftware.lemmy, + 'lemmy.makearmy.io': ServerSoftware.lemmy, + 'lemmy.manganiello.tech': ServerSoftware.lemmy, + 'lemmy.mariusdavid.fr': ServerSoftware.lemmy, + 'lemmy.masto.community': ServerSoftware.lemmy, + 'lemmy.mats.ooo': ServerSoftware.lemmy, + 'lemmy.maxynetwork.it': ServerSoftware.lemmy, + 'lemmy.mayer.rocks': ServerSoftware.lemmy, + 'lemmy.mbl.social': ServerSoftware.lemmy, + 'lemmy.mebitek.com': ServerSoftware.lemmy, + 'lemmy.mengsk.org': ServerSoftware.lemmy, + 'lemmy.mesnumeriques.fr': ServerSoftware.lemmy, + 'lemmy.michaelsasser.org': ServerSoftware.lemmy, + 'lemmy.minecloud.ro': ServerSoftware.lemmy, + 'lemmy.minigubben.se': ServerSoftware.lemmy, + 'lemmy.mio19.uk': ServerSoftware.lemmy, + 'lemmy.mistyreverie.org': ServerSoftware.lemmy, + 'lemmy.mixdown.ca': ServerSoftware.lemmy, + 'lemmy.ml': ServerSoftware.lemmy, + 'lemmy.mlaga97.space': ServerSoftware.lemmy, + 'lemmy.mods4ever.com': ServerSoftware.lemmy, + 'lemmy.monster': ServerSoftware.lemmy, + 'lemmy.moocloud.party': ServerSoftware.lemmy, + 'lemmy.moonling.nl': ServerSoftware.lemmy, + 'lemmy.mrm.one': ServerSoftware.lemmy, + 'lemmy.mrpostman.ch': ServerSoftware.lemmy, + 'lemmy.muffalings.com': ServerSoftware.lemmy, + 'lemmy.my-box.dev': ServerSoftware.lemmy, + 'lemmy.myjhdiy.net': ServerSoftware.lemmy, + 'lemmy.myserv.one': ServerSoftware.lemmy, + 'lemmy.nahsi.dev': ServerSoftware.lemmy, + 'lemmynal.space': ServerSoftware.lemmy, + 'lemmy.nekusoul.de': ServerSoftware.lemmy, + 'lemmy.neondystopia.world': ServerSoftware.lemmy, + 'lemmy.net.au': ServerSoftware.lemmy, + 'lemmy.netpaws.cc': ServerSoftware.lemmy, + 'lemmy.nexus': ServerSoftware.lemmy, + 'lemmy.nocturnal.garden': ServerSoftware.lemmy, + 'lemmy.nope.ly': ServerSoftware.lemmy, + 'lemmy.norbipeti.eu': ServerSoftware.lemmy, + 'lemmy.notclickable.com': ServerSoftware.lemmy, + 'lemmy.nothavingthis.co.uk': ServerSoftware.lemmy, + 'lemmy.notmy.cloud': ServerSoftware.lemmy, + 'lemmy.nrdblg.de': ServerSoftware.lemmy, + 'lemmynsfw.com': ServerSoftware.lemmy, + 'lemmy.nu31.space': ServerSoftware.lemmy, + 'lemmy.nube-gran.de': ServerSoftware.lemmy, + 'lemmy.nx.dedyn.io': ServerSoftware.lemmy, + 'lemmy.nz': ServerSoftware.lemmy, + 'lemmy.obscuro.be': ServerSoftware.lemmy, + 'lemmy.ohaa.xyz': ServerSoftware.lemmy, + 'lemmyoh.io': ServerSoftware.lemmy, + 'lemmy.okr765.com': ServerSoftware.lemmy, + 'lemmy.one': ServerSoftware.lemmy, + 'lemmy.onlylans.io': ServerSoftware.lemmy, + 'lemmy.openitco.de': ServerSoftware.lemmy, + 'lemmy.parodia.dev': ServerSoftware.lemmy, + 'lemmy.pe1uca.dev': ServerSoftware.lemmy, + 'lemmy.permisuan.com': ServerSoftware.lemmy, + 'lemmy.photon-grove.net': ServerSoftware.lemmy, + 'lemmy.pixelpassport.studio': ServerSoftware.lemmy, + 'lemmy.poudlar.do': ServerSoftware.lemmy, + 'lemmy.pt': ServerSoftware.lemmy, + 'lemmy.radio': ServerSoftware.lemmy, + 'lemmy.rochegmr.com': ServerSoftware.lemmy, + 'lemmy.runesmite.com': ServerSoftware.lemmy, + 'lemmy.sador.me': ServerSoftware.lemmy, + 'lemmy.scam-mail.me': ServerSoftware.lemmy, + 'lemmy.science.social': ServerSoftware.lemmy, + 'lemmy.sdf.org': ServerSoftware.lemmy, + 'lemmy.seattlelunarsociety.org': ServerSoftware.lemmy, + 'lemmy.secnd.me': ServerSoftware.lemmy, + 'lemmy.securitycafe.ca': ServerSoftware.lemmy, + 'lemmy.self-hosted.site': ServerSoftware.lemmy, + 'lemmy.selina.diy': ServerSoftware.lemmy, + 'lemmy.services.coupou.fr': ServerSoftware.lemmy, + 'lemmy.sgfault.com': ServerSoftware.lemmy, + 'lemmy.shiny-task.com': ServerSoftware.lemmy, + 'lemmy.sietch.online': ServerSoftware.lemmy, + 'lemmy.skoops.social': ServerSoftware.lemmy, + 'lemmy.skyjake.fi': ServerSoftware.lemmy, + 'lemmy.ssba.com': ServerSoftware.lemmy, + 'lemmy.stage.anoxinon.de': ServerSoftware.lemmy, + 'lemmy.staphup.nl': ServerSoftware.lemmy, + 'lemmy.starbase80.dev': ServerSoftware.lemmy, + 'lemmy.starlightkel.xyz': ServerSoftware.lemmy, + 'lemmy.stefanoprenna.com': ServerSoftware.lemmy, + 'lemmy.strausfuenf.de': ServerSoftware.lemmy, + 'lemmy.technowizardry.net': ServerSoftware.lemmy, + 'lemmy.tespia.org': ServerSoftware.lemmy, + 'lemmy.tevtra.com': ServerSoftware.lemmy, + 'lemmy.tgxn.net': ServerSoftware.lemmy, + 'lemmy.thewooskeys.com': ServerSoftware.lemmy, + 'lemmy.tobyvin.dev': ServerSoftware.lemmy, + 'lemmy.today': ServerSoftware.lemmy, + 'lemmy.tomkoreny.com': ServerSoftware.lemmy, + 'lemmy.t-rg.ws': ServerSoftware.lemmy, + 'lemmy.tserts.com': ServerSoftware.lemmy, + 'lemmy.ubergeek77.chat': ServerSoftware.lemmy, + 'lemmy.uhhoh.com': ServerSoftware.lemmy, + 'lemmy.umucat.day': ServerSoftware.lemmy, + 'lemmy.unboiled.info': ServerSoftware.lemmy, + 'lemmy.uninsane.org': ServerSoftware.lemmy, + 'lemmy.unryzer.eu': ServerSoftware.lemmy, + 'lemmy.vg': ServerSoftware.lemmy, + 'lemmy.world': ServerSoftware.lemmy, + 'lemmy.xeviousx.eu': ServerSoftware.lemmy, + 'lemmy.xoynq.com': ServerSoftware.lemmy, + 'lemmy.zhukov.al': ServerSoftware.lemmy, + 'lemmy.zimage.com': ServerSoftware.lemmy, + 'lemmy.zip': ServerSoftware.lemmy, + 'lemmy.zwanenburg.info': ServerSoftware.lemmy, + 'lem.ph3j.com': ServerSoftware.lemmy, + 'lem.serkozh.me': ServerSoftware.lemmy, + 'lem.trashbrain.org': ServerSoftware.lemmy, + 'lemy.lol': ServerSoftware.lemmy, + 'lemy.nl': ServerSoftware.lemmy, + 'le.poxiao-labs.work': ServerSoftware.lemmy, + 'level-up.zone': ServerSoftware.lemmy, + 'l.hostux.net': ServerSoftware.lemmy, + 'libretechni.ca': ServerSoftware.lemmy, + 'links.communitarium.org': ServerSoftware.lemmy, + 'links.nadia.moe': ServerSoftware.lemmy, + 'links.openriver.net': ServerSoftware.lemmy, + 'linz.city': ServerSoftware.lemmy, + 'literature.cafe': ServerSoftware.lemmy, + 'l.mathers.fr': ServerSoftware.lemmy, + 'lm.boing.icu': ServerSoftware.lemmy, + 'l.mchome.net': ServerSoftware.lemmy, + 'lm.inu.is': ServerSoftware.lemmy, + 'lm.mlfh.org': ServerSoftware.lemmy, + 'lm.preferlinux.de': ServerSoftware.lemmy, + 'lmy.ndu.wtf': ServerSoftware.lemmy, + 'lmy.sagf.io': ServerSoftware.lemmy, + 'l.posterdati.it': ServerSoftware.lemmy, + 'l.roofo.cc': ServerSoftware.lemmy, + 'lsmu.schmurian.xyz': ServerSoftware.lemmy, + 'l.sw0.com': ServerSoftware.lemmy, + 'lt.harding.dev': ServerSoftware.lemmy, + 'l.tta.wtf': ServerSoftware.lemmy, + 'l.twipped.social': ServerSoftware.lemmy, + 'maga.place': ServerSoftware.lemmy, + 'making.awful.systems': ServerSoftware.lemmy, + 'mander.xyz': ServerSoftware.lemmy, + 'maple.social': ServerSoftware.lemmy, + 'martinlm.mypi.co': ServerSoftware.lemmy, + 'matchpoint.zone': ServerSoftware.lemmy, + 'metacritics.zone': ServerSoftware.lemmy, + 'metapowers.org': ServerSoftware.lemmy, + 'midwest.social': ServerSoftware.lemmy, + 'monero.you': ServerSoftware.lemmy, + 'mouse.chitanda.moe': ServerSoftware.lemmy, + 'mtgzone.com': ServerSoftware.lemmy, + 'mujico.org': ServerSoftware.lemmy, + 'natur.23.nu': ServerSoftware.lemmy, + 'nba.space': ServerSoftware.lemmy, + 'news.abolish.capital': ServerSoftware.lemmy, + 'news.girolab.foo': ServerSoftware.lemmy, + 'nfl.community': ServerSoftware.lemmy, + 'nodesphere.site': ServerSoftware.lemmy, + 'no.lastname.nz': ServerSoftware.lemmy, + 'notizie.bida.im': ServerSoftware.lemmy, + 'odin.lanofthedead.xyz': ServerSoftware.lemmy, + 'orcas.enjoying.yachts': ServerSoftware.lemmy, + 'overctrl.dbzer0.com': ServerSoftware.lemmy, + 'parenti.sh': ServerSoftware.lemmy, + 'party.lumanesence.co.uk': ServerSoftware.lemmy, + 'pawb.social': ServerSoftware.lemmy, + 'philosophy.cafe': ServerSoftware.lemmy, + 'piefed.diffrint.org': ServerSoftware.lemmy, + 'poptalk.scrubbles.tech': ServerSoftware.lemmy, + 'portal.codyslemmyworld.com': ServerSoftware.lemmy, + 'poweruser.forum': ServerSoftware.lemmy, + 'programming.dev': ServerSoftware.lemmy, + 'providence.werewolf.lat': ServerSoftware.lemmy, + 'r3dnvmbr.xyz': ServerSoftware.lemmy, + 'rblind.com': ServerSoftware.lemmy, + 'realbitcoin.cash': ServerSoftware.lemmy, + 'reddit.kokomo.cloud': ServerSoftware.lemmy, + 'reddthat.com': ServerSoftware.lemmy, + 'retrolemmy.com': ServerSoftware.lemmy, + 'riskeratspizza.com': ServerSoftware.lemmy, + 'r.nf': ServerSoftware.lemmy, + 'roanoke.social': ServerSoftware.lemmy, + 'rollenspiel.forum': ServerSoftware.lemmy, + 'sammich.es': ServerSoftware.lemmy, + 'sappho.social': ServerSoftware.lemmy, + 'scribe.disroot.org': ServerSoftware.lemmy, + 'selfhosted.forum': ServerSoftware.lemmy, + 'sfw.community': ServerSoftware.lemmy, + 'sha1.nl': ServerSoftware.lemmy, + 'sh.itjust.works': ServerSoftware.lemmy, + 'shredderfood.net': ServerSoftware.lemmy, + 'slangenettet.pyjam.as': ServerSoftware.lemmy, + 'slevin.horse': ServerSoftware.lemmy, + 'slrpnk.net': ServerSoftware.lemmy, + 'soccer.forum': ServerSoftware.lemmy, + 'social.ggbox.fr': ServerSoftware.lemmy, + 'social.jears.at': ServerSoftware.lemmy, + 'social.nerdhouse.io': ServerSoftware.lemmy, + 'social.p80.se': ServerSoftware.lemmy, + 'social.sour.is': ServerSoftware.lemmy, + 'social.srx.digital': ServerSoftware.lemmy, + 'sopuli.xyz': ServerSoftware.lemmy, + 'spare.botegirl.parts': ServerSoftware.lemmy, + 'spgrn.com': ServerSoftware.lemmy, + 'startrek.website': ServerSoftware.lemmy, + 'style.land': ServerSoftware.lemmy, + 'sub.community': ServerSoftware.lemmy, + 'sublem.com': ServerSoftware.lemmy, + 'sub.wetshaving.social': ServerSoftware.lemmy, + 'supernova.place': ServerSoftware.lemmy, + 'suppo.fi': ServerSoftware.lemmy, + 'swg-empire.de': ServerSoftware.lemmy, + 'szmer.info': ServerSoftware.lemmy, + 'tabi.gay': ServerSoftware.lemmy, + 'tech.pr0n.pl': ServerSoftware.lemmy, + 'test2.lealternative.net': ServerSoftware.lemmy, + 'thelemmy.club': ServerSoftware.lemmy, + 'thinktank.brainstormes.org': ServerSoftware.lemmy, + 'timeperiods.fr': ServerSoftware.lemmy, + 'timesink.p3nguin.org': ServerSoftware.lemmy, + 'tkohhh.social': ServerSoftware.lemmy, + 'toast.ooo': ServerSoftware.lemmy, + 'ttrpg.network': ServerSoftware.lemmy, + 'tucson.social': ServerSoftware.lemmy, + 'ukfli.uk': ServerSoftware.lemmy, + 'unreachable.cloud': ServerSoftware.lemmy, + 'upvote.au': ServerSoftware.lemmy, + 'vargar.org': ServerSoftware.lemmy, + 'vger.social': ServerSoftware.lemmy, + 'viewfinder.pro': ServerSoftware.lemmy, + 'voyager.lemmy.ml': ServerSoftware.lemmy, + 'whatcom.social': ServerSoftware.lemmy, + 'wired.bluemarch.art': ServerSoftware.lemmy, + 'yall.theatl.social': ServerSoftware.lemmy, + 'zegheteens.nl': ServerSoftware.lemmy, + + '101010.pl': ServerSoftware.mbin, + '1234.as': ServerSoftware.mbin, + '2137.social': ServerSoftware.mbin, + '23.social': ServerSoftware.mbin, + '4bear.com': ServerSoftware.mbin, + '9kb.me': ServerSoftware.mbin, + 'abdl.link': ServerSoftware.mbin, + 'academiccloud.social': ServerSoftware.mbin, + 'activitypub.academy': ServerSoftware.mbin, + 'aethy.com': ServerSoftware.mbin, + 'akamdon.com': ServerSoftware.mbin, + 'alive.bar': ServerSoftware.mbin, + 'androiddev.social': ServerSoftware.mbin, + 'archaeo.social': ServerSoftware.mbin, + 'atornblad.se': ServerSoftware.mbin, + 'aus.social': ServerSoftware.mbin, + 'babka.social': ServerSoftware.mbin, + 'bahn.social': ServerSoftware.mbin, + 'baraag.net': ServerSoftware.mbin, + 'bark.lgbt': ServerSoftware.mbin, + 'beige.party': ServerSoftware.mbin, + 'berlin.social': ServerSoftware.mbin, + 'best-friends.chat': ServerSoftware.mbin, + 'better.boston': ServerSoftware.mbin, + 'bgme.me': ServerSoftware.mbin, + 'bildung.social': ServerSoftware.mbin, + 'biplus.date': ServerSoftware.mbin, + 'bitbang.social': ServerSoftware.mbin, + 'blimps.xyz': ServerSoftware.mbin, + 'blorbo.social': ServerSoftware.mbin, + 'bolha.us': ServerSoftware.mbin, + 'bonn.social': ServerSoftware.mbin, + 'brettspiel.space': ServerSoftware.mbin, + 'bsd.network': ServerSoftware.mbin, + 'burma.social': ServerSoftware.mbin, + 'burningboard.net': ServerSoftware.mbin, + 'bzh.social': ServerSoftware.mbin, + 'c7.io': ServerSoftware.mbin, + 'cathode.church': ServerSoftware.mbin, + 'channel.org': ServerSoftware.mbin, + 'chaosfem.tw': ServerSoftware.mbin, + 'chaos.social': ServerSoftware.mbin, + 'chitter.xyz': ServerSoftware.mbin, + 'ciberlandia.pt': ServerSoftware.mbin, + 'c.im': ServerSoftware.mbin, + 'climatejustice.social': ServerSoftware.mbin, + 'cloudisland.nz': ServerSoftware.mbin, + 'col.social': ServerSoftware.mbin, + 'computerfairi.es': ServerSoftware.mbin, + 'corteximplant.com': ServerSoftware.mbin, + 'cosocial.ca': ServerSoftware.mbin, + 'crazylab.online': ServerSoftware.mbin, + 'critter.cafe': ServerSoftware.mbin, + 'cubhub.social': ServerSoftware.mbin, + 'cultur.social': ServerSoftware.mbin, + 'cupoftea.social': ServerSoftware.mbin, + 'cyberplace.social': ServerSoftware.mbin, + 'cyberpunk.lol': ServerSoftware.mbin, + 'defcon.social': ServerSoftware.mbin, + 'det.social': ServerSoftware.mbin, + 'dice.camp': ServerSoftware.mbin, + 'digitalcourage.social': ServerSoftware.mbin, + 'disabled.social': ServerSoftware.mbin, + 'discuss.systems': ServerSoftware.mbin, + 'dizl.de': ServerSoftware.mbin, + 'dju.social': ServerSoftware.mbin, + 'dmv.community': ServerSoftware.mbin, + 'dobbs.town': ServerSoftware.mbin, + 'donphan.social': ServerSoftware.mbin, + 'dotnet.social': ServerSoftware.mbin, + 'dragon-fly.club': ServerSoftware.mbin, + 'dragonscave.space': ServerSoftware.mbin, + 'dresden.network': ServerSoftware.mbin, + 'dtp-mstdn.jp': ServerSoftware.mbin, + 'ecoevo.social': ServerSoftware.mbin, + 'econtwitter.net': ServerSoftware.mbin, + 'eldritch.cafe': ServerSoftware.mbin, + 'en.osm.town': ServerSoftware.mbin, + 'equestria.social': ServerSoftware.mbin, + 'esperanto.masto.host': ServerSoftware.mbin, + 'eupolicy.social': ServerSoftware.mbin, + 'expressional.social': ServerSoftware.mbin, + 'fairy.id': ServerSoftware.mbin, + 'famichiki.jp': ServerSoftware.mbin, + 'fandom.ink': ServerSoftware.mbin, + 'federatedfandom.net': ServerSoftware.mbin, + 'fedi.at': ServerSoftware.mbin, + 'fedifreu.de': ServerSoftware.mbin, + 'fedigroups.social': ServerSoftware.mbin, + 'fedihum.org': ServerSoftware.mbin, + 'fediscience.org': ServerSoftware.mbin, + 'ffxiv-mastodon.com': ServerSoftware.mbin, + 'findout.media': ServerSoftware.mbin, + 'fisting.social': ServerSoftware.mbin, + 'flipboard.social': ServerSoftware.mbin, + 'floss.social': ServerSoftware.mbin, + 'fnordon.de': ServerSoftware.mbin, + 'forume-u52257.vm.elestio.app': ServerSoftware.mbin, + 'fosstodon.org': ServerSoftware.mbin, + 'framapiaf.org': ServerSoftware.mbin, + 'freeatlantis.com': ServerSoftware.mbin, + 'freeradical.zone': ServerSoftware.mbin, + 'freiburg.social': ServerSoftware.mbin, + 'frikiverse.zone': ServerSoftware.mbin, + 'front-end.social': ServerSoftware.mbin, + 'functional.cafe': ServerSoftware.mbin, + 'fur.lgbt': ServerSoftware.mbin, + 'furries.club': ServerSoftware.mbin, + 'furry.engineer': ServerSoftware.mbin, + 'g0v.social': ServerSoftware.mbin, + 'gamepad.club': ServerSoftware.mbin, + 'gardenstate.social': ServerSoftware.mbin, + 'gaygeek.social': ServerSoftware.mbin, + 'genomic.social': ServerSoftware.mbin, + 'girlcock.club': ServerSoftware.mbin, + 'glammr.us': ServerSoftware.mbin, + 'glasgow.social': ServerSoftware.mbin, + 'graphics.social': ServerSoftware.mbin, + 'graz.social': ServerSoftware.mbin, + 'gruene.social': ServerSoftware.mbin, + 'gulp.cafe': ServerSoftware.mbin, + 'h4.io': ServerSoftware.mbin, + 'hachyderm.io': ServerSoftware.mbin, + 'handon.club': ServerSoftware.mbin, + 'hci.social': ServerSoftware.mbin, + 'heads.social': ServerSoftware.mbin, + 'hear-me.social': ServerSoftware.mbin, + 'helvede.net': ServerSoftware.mbin, + 'hessen.social': ServerSoftware.mbin, + 'hispagatos.space': ServerSoftware.mbin, + 'hkust.social': ServerSoftware.mbin, + 'hostux.social': ServerSoftware.mbin, + 'humano.social': ServerSoftware.mbin, + 'hunters.zone': ServerSoftware.mbin, + 'icosahedron.website': ServerSoftware.mbin, + 'icosahedron.website.': ServerSoftware.mbin, + 'ieji.de': ServerSoftware.mbin, + 'ika.queloud.net': ServerSoftware.mbin, + 'imastodon.net': ServerSoftware.mbin, + 'india.goonj.xyz': ServerSoftware.mbin, + 'indieapps.space': ServerSoftware.mbin, + 'indieweb.social': ServerSoftware.mbin, + 'infosec.exchange': ServerSoftware.mbin, + 'ioc.exchange': ServerSoftware.mbin, + 'iosdev.space': ServerSoftware.mbin, + 'is.nota.live': ServerSoftware.mbin, + 'jawns.club': ServerSoftware.mbin, + 'jorts.horse': ServerSoftware.mbin, + 'journa.host': ServerSoftware.mbin, + 'kafeneio.social': ServerSoftware.mbin, + 'kanoa.de': ServerSoftware.mbin, + 'kemonodon.club': ServerSoftware.mbin, + 'kind.social': ServerSoftware.mbin, + 'kinkycats.org': ServerSoftware.mbin, + 'kirakiratter.com': ServerSoftware.mbin, + 'kolektiva.social': ServerSoftware.mbin, + 'layer8.space': ServerSoftware.mbin, + 'leicester.chat': ServerSoftware.mbin, + 'lgbtqia.space': ServerSoftware.mbin, + 'library.love': ServerSoftware.mbin, + 'libretooth.gr': ServerSoftware.mbin, + 'lile.cl': ServerSoftware.mbin, + 'link.baai.ac.cn': ServerSoftware.mbin, + 'linuxrocks.online': ServerSoftware.mbin, + 'literatur.social': ServerSoftware.mbin, + 'livellosegreto.it': ServerSoftware.mbin, + 'ludosphere.fr': ServerSoftware.mbin, + 'macaw.social': ServerSoftware.mbin, + 'machteburch.social': ServerSoftware.mbin, + 'macrofurs.social': ServerSoftware.mbin, + 'm.ai6yr.org': ServerSoftware.mbin, + 'mainz.social': ServerSoftware.mbin, + 'mamot.fr': ServerSoftware.mbin, + 'mamutovo.cz': ServerSoftware.mbin, + 'mapstodon.space': ServerSoftware.mbin, + 'mapsupport.de': ServerSoftware.mbin, + 'mast.dragon-fly.club': ServerSoftware.mbin, + 'mast.hpc.social': ServerSoftware.mbin, + 'mast.lat': ServerSoftware.mbin, + 'mast.lt': ServerSoftware.mbin, + 'mas.to': ServerSoftware.mbin, + 'masto.ai': ServerSoftware.mbin, + 'mastoart.social': ServerSoftware.mbin, + 'mastobate.social': ServerSoftware.mbin, + 'masto.bg': ServerSoftware.mbin, + 'masto.bike': ServerSoftware.mbin, + 'mastodon.acm.org': ServerSoftware.mbin, + 'mastodonapp.uk': ServerSoftware.mbin, + 'mastodon.art': ServerSoftware.mbin, + 'mastodon.au': ServerSoftware.mbin, + 'mastodon-belgium.be': ServerSoftware.mbin, + 'mastodon.berlin': ServerSoftware.mbin, + 'mastodon.bida.im': ServerSoftware.mbin, + 'mastodon.bsd.cafe': ServerSoftware.mbin, + 'mastodon.cloud': ServerSoftware.mbin, + 'mastodon.coffee': ServerSoftware.mbin, + 'mastodon.com.pl': ServerSoftware.mbin, + 'mastodon.compositecomputer.club': ServerSoftware.mbin, + 'mastodon.com.tr': ServerSoftware.mbin, + 'mastodonczech.cz': ServerSoftware.mbin, + 'mastodon.de': ServerSoftware.mbin, + 'mastodon.design': ServerSoftware.mbin, + 'mastodon.energy': ServerSoftware.mbin, + 'mastodon.eus': ServerSoftware.mbin, + 'mastodon.forume.org': ServerSoftware.mbin, + 'mastodon.fun': ServerSoftware.mbin, + 'mastodon.gal': ServerSoftware.mbin, + 'mastodon.gamedev.place': ServerSoftware.mbin, + 'mastodon.gougere.fr': ServerSoftware.mbin, + 'mastodon.green': ServerSoftware.mbin, + 'mastodon.hams.social': ServerSoftware.mbin, + 'mastodon.hypnoguys.com': ServerSoftware.mbin, + 'mastodon.ie': ServerSoftware.mbin, + 'mastodon.la': ServerSoftware.mbin, + 'mastodon.london': ServerSoftware.mbin, + 'mastodon.me.uk': ServerSoftware.mbin, + 'mastodon.mim-libre.fr': ServerSoftware.mbin, + 'mastodon.ml': ServerSoftware.mbin, + 'mastodon.nl': ServerSoftware.mbin, + 'mastodon.nu': ServerSoftware.mbin, + 'mastodon.nz': ServerSoftware.mbin, + 'mastodon.online': ServerSoftware.mbin, + 'mastodon.org.uk': ServerSoftware.mbin, + 'mastodon.pnpde.social': ServerSoftware.mbin, + 'mastodon.radio': ServerSoftware.mbin, + 'mastodon.scot': ServerSoftware.mbin, + 'mastodon.sdf.org': ServerSoftware.mbin, + 'mastodon.social': ServerSoftware.mbin, + 'mastodonsweden.se': ServerSoftware.mbin, + 'mastodon-swiss.org': ServerSoftware.mbin, + 'mastodont.cat': ServerSoftware.mbin, + 'mastodontech.de': ServerSoftware.mbin, + 'mastodon.tetaneutral.net': ServerSoftware.mbin, + 'mastodon.top': ServerSoftware.mbin, + 'mastodontti.fi': ServerSoftware.mbin, + 'mastodon.uno': ServerSoftware.mbin, + 'mastodon.uy': ServerSoftware.mbin, + 'mastodon.world': ServerSoftware.mbin, + 'mastodon.xyz': ServerSoftware.mbin, + 'mastodon.zaclys.com': ServerSoftware.mbin, + 'masto.es': ServerSoftware.mbin, + 'masto.hackers.town': ServerSoftware.mbin, + 'masto.nu': ServerSoftware.mbin, + 'masto.nyc': ServerSoftware.mbin, + 'mastoot.fr': ServerSoftware.mbin, + 'masto.pt': ServerSoftware.mbin, + 'mastorol.es': ServerSoftware.mbin, + 'mastox.eu': ServerSoftware.mbin, + 'mastoxiv.page': ServerSoftware.mbin, + 'masto.yttrx.com': ServerSoftware.mbin, + 'mathstodon.xyz': ServerSoftware.mbin, + 'matx.eus': ServerSoftware.mbin, + 'm.cmx.im': ServerSoftware.mbin, + 'me.dm': ServerSoftware.mbin, + 'mementomori.social': ServerSoftware.mbin, + 'mendeddrum.org': ServerSoftware.mbin, + 'me.ns.ci': ServerSoftware.mbin, + 'mental.social': ServerSoftware.mbin, + 'meow.social': ServerSoftware.mbin, + 'merovingian.club': ServerSoftware.mbin, + 'mesmerized.online': ServerSoftware.mbin, + 'metalhead.club': ServerSoftware.mbin, + 'mindly.social': ServerSoftware.mbin, + 'mo-me.social': ServerSoftware.mbin, + 'mona.do': ServerSoftware.mbin, + 'monado.ren': ServerSoftware.mbin, + 'moresci.sale': ServerSoftware.mbin, + 'm.otter.homes': ServerSoftware.mbin, + 'mountains.social': ServerSoftware.mbin, + 'mstdn.beer': ServerSoftware.mbin, + 'mstdn.business': ServerSoftware.mbin, + 'mstdn.ca': ServerSoftware.mbin, + 'mstdn.dk': ServerSoftware.mbin, + 'mstdn.games': ServerSoftware.mbin, + 'mstdn.io': ServerSoftware.mbin, + 'mstdn.jp': ServerSoftware.mbin, + 'mstdn.kemono-friends.info': ServerSoftware.mbin, + 'mstdn.maud.io': ServerSoftware.mbin, + 'mstdn.mx': ServerSoftware.mbin, + 'mstdn.nere9.help': ServerSoftware.mbin, + 'mstdn.party': ServerSoftware.mbin, + 'mstdn.plus': ServerSoftware.mbin, + 'mstdn.science': ServerSoftware.mbin, + 'mstdn.social': ServerSoftware.mbin, + 'mstdn.tokyocameraclub.com': ServerSoftware.mbin, + 'mstdn.y-zu.org': ServerSoftware.mbin, + 'muenchen.social': ServerSoftware.mbin, + 'muenster.im': ServerSoftware.mbin, + 'muri.network': ServerSoftware.mbin, + 'musician.social': ServerSoftware.mbin, + 'musicians.today': ServerSoftware.mbin, + 'musicworld.social': ServerSoftware.mbin, + 'mustard.blog': ServerSoftware.mbin, + 'neopaquita.es': ServerSoftware.mbin, + 'nerdculture.de': ServerSoftware.mbin, + 'neurodifferent.me': ServerSoftware.mbin, + 'neuromatch.social': ServerSoftware.mbin, + 'newsie.social': ServerSoftware.mbin, + 'noauthority.social': ServerSoftware.mbin, + 'noc.social': ServerSoftware.mbin, + 'nofan.xyz': ServerSoftware.mbin, + 'norden.social': ServerSoftware.mbin, + 'nrw.social': ServerSoftware.mbin, + 'o3o.ca': ServerSoftware.mbin, + 'occm.cc': ServerSoftware.mbin, + 'occom.masto.host': ServerSoftware.mbin, + 'oc.todon.fr': ServerSoftware.mbin, + 'ohai.social': ServerSoftware.mbin, + 'oldbytes.space': ServerSoftware.mbin, + 'opalstack.social': ServerSoftware.mbin, + 'openbiblio.social': ServerSoftware.mbin, + 'organica.social': ServerSoftware.mbin, + 'oslo.town': ServerSoftware.mbin, + 'osna.social': ServerSoftware.mbin, + 'otadon.com': ServerSoftware.mbin, + 'owo.cafe': ServerSoftware.mbin, + 'pawb.fun': ServerSoftware.mbin, + 'pawoo.net': ServerSoftware.mbin, + 'pdx.social': ServerSoftware.mbin, + 'penfount.social': ServerSoftware.mbin, + 'peoplemaking.games': ServerSoftware.mbin, + 'photog.social': ServerSoftware.mbin, + 'phpc.social': ServerSoftware.mbin, + 'piaille.fr': ServerSoftware.mbin, + 'pkm.social': ServerSoftware.mbin, + 'planet.moe': ServerSoftware.mbin, + 'plush.city': ServerSoftware.mbin, + 'pnw.zone': ServerSoftware.mbin, + 'podcastindex.social': ServerSoftware.mbin, + 'podcasts.social': ServerSoftware.mbin, + 'pokemon.mastportal.info': ServerSoftware.mbin, + 'poliversity.it': ServerSoftware.mbin, + 'pone.social': ServerSoftware.mbin, + 'ponies.social': ServerSoftware.mbin, + 'pouet.chapril.org': ServerSoftware.mbin, + 'privacysafe.social': ServerSoftware.mbin, + 'pubeurope.com': ServerSoftware.mbin, + 'pullopen.xyz': ServerSoftware.mbin, + 'punkstodon.de': ServerSoftware.mbin, + 'puntarella.party': ServerSoftware.mbin, + 'qdon.space': ServerSoftware.mbin, + 'qlub.social': ServerSoftware.mbin, + 'qugo.tr': ServerSoftware.mbin, + 'quokka.city': ServerSoftware.mbin, + 'radikal.social': ServerSoftware.mbin, + 'ramen-fsm.eu.org': ServerSoftware.mbin, + 'ravenation.club': ServerSoftware.mbin, + 'rebel.ar': ServerSoftware.mbin, + 'respublicae.eu': ServerSoftware.mbin, + 'retirenow.top': ServerSoftware.mbin, + 'retro.pizza': ServerSoftware.mbin, + 'rheinneckar.social': ServerSoftware.mbin, + 'rhetos.net': ServerSoftware.mbin, + 'rivals.space': ServerSoftware.mbin, + 'rngm-zakaecommu.fedicity.net': ServerSoftware.mbin, + 'rollenspiel.social': ServerSoftware.mbin, + 'ro-mastodon.puyo.jp': ServerSoftware.mbin, + 'rpvortex.online': ServerSoftware.mbin, + 'rss-mstdn.studiofreesia.com': ServerSoftware.mbin, + 'rubber.social': ServerSoftware.mbin, + 'ruby.social': ServerSoftware.mbin, + 'ruhr.social': ServerSoftware.mbin, + 'sakurajima.moe': ServerSoftware.mbin, + 'scholar.social': ServerSoftware.mbin, + 'scicomm.xyz': ServerSoftware.mbin, + 'sciences.social': ServerSoftware.mbin, + 'seaofog.com': ServerSoftware.mbin, + 'sfba.social': ServerSoftware.mbin, + 'shakedown.social': ServerSoftware.mbin, + 'shelter.moe': ServerSoftware.mbin, + 'shrike.club': ServerSoftware.mbin, + 'sigmoid.social': ServerSoftware.mbin, + 'snabelen.no': ServerSoftware.mbin, + 'socel.net': ServerSoftware.mbin, + 'social.anoxinon.de': ServerSoftware.mbin, + 'social.bau-ha.us': ServerSoftware.mbin, + 'social.bau-ha.us.': ServerSoftware.mbin, + 'social.cologne': ServerSoftware.mbin, + 'social.coop': ServerSoftware.mbin, + 'social.darc.de': ServerSoftware.mbin, + 'social.edu.nl': ServerSoftware.mbin, + 'sociale.network': ServerSoftware.mbin, + 'social.goonj.xyz': ServerSoftware.mbin, + 'social.laoapp.la': ServerSoftware.mbin, + 'social.librem.one': ServerSoftware.mbin, + 'social.linux.pizza': ServerSoftware.mbin, + 'social.lol': ServerSoftware.mbin, + 'social.politicaconciencia.org': ServerSoftware.mbin, + 'social.prepedia.org': ServerSoftware.mbin, + 'social.roadfm.fr': ServerSoftware.mbin, + 'social.sciences.re': ServerSoftware.mbin, + 'social.spejset.org': ServerSoftware.mbin, + 'social.tchncs.de': ServerSoftware.mbin, + 'social.thej.in': ServerSoftware.mbin, + 'social.treehouse.systems': ServerSoftware.mbin, + 'social.y-gallery.net': ServerSoftware.mbin, + 'spore.social': ServerSoftware.mbin, + 'stranger.social': ServerSoftware.mbin, + 'sueden.social': ServerSoftware.mbin, + 'sunny.garden': ServerSoftware.mbin, + 'swiss.social': ServerSoftware.mbin, + 'tabletop.social': ServerSoftware.mbin, + 'tacobelllabs.net': ServerSoftware.mbin, + 'tchafia.be': ServerSoftware.mbin, + 'tea.codes': ServerSoftware.mbin, + 'techhub.social': ServerSoftware.mbin, + 'tech.lgbt': ServerSoftware.mbin, + 'tenforward.social': ServerSoftware.mbin, + 'theblower.au': ServerSoftware.mbin, + 'thecanadian.social': ServerSoftware.mbin, + 'theforkiverse.com': ServerSoftware.mbin, + 'thicc.horse': ServerSoftware.mbin, + 'thu.closed.social': ServerSoftware.mbin, + 'tilde.zone': ServerSoftware.mbin, + 'tkz.one': ServerSoftware.mbin, + 'tldr.nettime.org': ServerSoftware.mbin, + 'toad.social': ServerSoftware.mbin, + 'todon.eu': ServerSoftware.mbin, + 'todon.nl': ServerSoftware.mbin, + 'todon.ploud.fr': ServerSoftware.mbin, + 'tooot.im': ServerSoftware.mbin, + 'toot.aquilenet.fr': ServerSoftware.mbin, + 'toot.berlin': ServerSoftware.mbin, + 'toot.blue': ServerSoftware.mbin, + 'toot.cafe': ServerSoftware.mbin, + 'toot.cat': ServerSoftware.mbin, + 'toot.community': ServerSoftware.mbin, + 'tooting.ch': ServerSoftware.mbin, + 'toot.io': ServerSoftware.mbin, + 'toot.kif.rocks': ServerSoftware.mbin, + 'toot.lv': ServerSoftware.mbin, + 'toot.portes-imaginaire.org': ServerSoftware.mbin, + 'toot.si': ServerSoftware.mbin, + 'toot.wales': ServerSoftware.mbin, + 'town.voyager.blue': ServerSoftware.mbin, + 'transfur.social': ServerSoftware.mbin, + 'troet.cafe': ServerSoftware.mbin, + 'trpg.cloud': ServerSoftware.mbin, + 'trpg-o.xyz': ServerSoftware.mbin, + 'truthsocial.co.in': ServerSoftware.mbin, + 'tty0.social': ServerSoftware.mbin, + 'tuiter.rocks': ServerSoftware.mbin, + 'tweesecake.social': ServerSoftware.mbin, + 'twit.social': ServerSoftware.mbin, + 'twiukraine.com': ServerSoftware.mbin, + 'types.pl': ServerSoftware.mbin, + 'typo.social': ServerSoftware.mbin, + 'ukadon.shillest.net': ServerSoftware.mbin, + 'union.place': ServerSoftware.mbin, + 'universeodon.com': ServerSoftware.mbin, + 'unnerv.jp': ServerSoftware.mbin, + 'unredacted.social': ServerSoftware.mbin, + 'unstable.icu': ServerSoftware.mbin, + 'urbanists.social': ServerSoftware.mbin, + 'uri.life': ServerSoftware.mbin, + 'ursal.zone': ServerSoftware.mbin, + 'urusai.social': ServerSoftware.mbin, + 'utopia.cool': ServerSoftware.mbin, + 'veganism.social': ServerSoftware.mbin, + 'vis.social': ServerSoftware.mbin, + 'vkl.world': ServerSoftware.mbin, + 'vocalodon.net': ServerSoftware.mbin, + 'vt.social': ServerSoftware.mbin, + 'waag.social': ServerSoftware.mbin, + 'wandering.shop': ServerSoftware.mbin, + 'wehavecookies.social': ServerSoftware.mbin, + 'wetdry.world': ServerSoftware.mbin, + 'wien.rocks': ServerSoftware.mbin, + 'wikis.world': ServerSoftware.mbin, + 'wisskomm.social': ServerSoftware.mbin, + 'witter.cz': ServerSoftware.mbin, + 'wobbl.xyz': ServerSoftware.mbin, + 'woof.group': ServerSoftware.mbin, + 'woof.tech': ServerSoftware.mbin, + 'writing.exchange': ServerSoftware.mbin, + 'www.blimps.xyz': ServerSoftware.mbin, + 'www.kanoa.de': ServerSoftware.mbin, + 'wxw.moe': ServerSoftware.mbin, + 'xarxa.cloud': ServerSoftware.mbin, + 'xoxo.zone': ServerSoftware.mbin, + 'yakyudon.net': ServerSoftware.mbin, + 'yiff.life': ServerSoftware.mbin, + 'yttrx.com': ServerSoftware.mbin, + 'zeroes.ca': ServerSoftware.mbin, + 'zirk.us': ServerSoftware.mbin, + 'zohup.vip': ServerSoftware.mbin, + 'zpravobot.news': ServerSoftware.mbin, + 'zug.network': ServerSoftware.mbin, +}; diff --git a/lib/src/widgets/markdown/markdown.dart b/lib/src/widgets/markdown/markdown.dart index 9a0e638a..52651afa 100644 --- a/lib/src/widgets/markdown/markdown.dart +++ b/lib/src/widgets/markdown/markdown.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart' as mdf; import 'package:interstellar/src/models/image.dart'; +import 'package:interstellar/src/utils/ap_urls.dart'; import 'package:interstellar/src/widgets/image.dart'; import 'package:interstellar/src/widgets/markdown/markdown_config_share.dart'; import 'package:interstellar/src/widgets/markdown/markdown_mention.dart'; @@ -9,6 +10,7 @@ import 'package:interstellar/src/widgets/markdown/markdown_subscript_superscript import 'package:interstellar/src/widgets/markdown/markdown_video.dart'; import 'package:interstellar/src/widgets/open_webpage.dart'; import 'package:interstellar/src/widgets/video.dart'; +import 'package:interstellar/src/utils/instances.dart'; class Markdown extends StatelessWidget { const Markdown( @@ -41,6 +43,12 @@ class Markdown extends StatelessWidget { ), onTapLink: (text, href, title) async { if (href != null) { + final isKnownInstance = knownInstances[Uri.parse(href).host]; + if (!context.mounted) return; + if (isKnownInstance != null) { + if (await navigateApObject(context, href)) return; + } + if (!context.mounted) return; openWebpageSecondary(context, Uri.parse(href)); } }, diff --git a/scripts/fetch_instances.sh b/scripts/fetch_instances.sh new file mode 100755 index 00000000..b15f0307 --- /dev/null +++ b/scripts/fetch_instances.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +# Copied from https://github.com/thunder-app/thunder/blob/develop/.github/workflows/instances.yml + +curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"lemmy\") {domain}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | .domain' | sort | uniq -i > lemmy_instances.txt +curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"piefed\") {domain}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | .domain' | sort | uniq -i > piefed_instances.txt +curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"mbin\") {domain}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | .domain' | sort | uniq -i > mbin_instances.txt + +# Theres a lot more mastodon instances so only include those with certain active user count. +curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"mastodon\") {domain active_users_monthly}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | select(.active_users_monthly > 100) | .domain' | sort | uniq -i > mastodon_instances.txt + +cat lemmy_instances.txt piefed_instances.txt mbin_instances.txt mastodon_instances.txt | sort | uniq -i > instances.txt + +cat << EOF > lib/src/utils/instances.dart +import 'package:interstellar/src/controller/server.dart'; +const Map knownInstances = { +$(awk '{ print " \047"$0"\047: ServerSoftware.mbin," }' mbin_instances.txt) + +$(awk '{ print " \047"$0"\047: ServerSoftware.piefed," }' piefed_instances.txt) + +$(awk '{ print " \047"$0"\047: ServerSoftware.lemmy," }' lemmy_instances.txt) + +$(awk '{ print " \047"$0"\047: ServerSoftware.mbin," }' mastodon_instances.txt) +}; +EOF + +# Put the instances in the Android manifest file +manifestInstances="$(awk '{ print " " }' instances.txt)" +inSection=false +while IFS= read -r line; do + if [[ $line == *"#AUTO_GEN_INSTANCE_LIST_DO_NOT_TOUCH#"* ]]; then + inSection=true + fi + + if [[ $line == *"#INSTANCE_LIST_END#"* ]]; then + echo "$manifestInstances" >> android/app/src/main/AndroidManifest-new.xml + inSection=false + fi + + if [[ $line == *"android:host"* ]]; then + if [ "$inSection" = true ]; then + continue + fi + fi + + echo "$line" >> android/app/src/main/AndroidManifest-new.xml +done < android/app/src/main/AndroidManifest.xml +mv android/app/src/main/AndroidManifest-new.xml android/app/src/main/AndroidManifest.xml + +rm instances.txt lemmy_instances.txt piefed_instances.txt mbin_instances.txt mastodon_instances.txt