URL-адреса Mastodon с указанием экземпляра

автор vadim


В Списки и люди на Mastodon я показал, как я добавлял список колонка к следующий вкладку браузера Mastodon, который я создаю. Это был шаг к более простому и мощному управлению списками. Это позволяет мне видеть, включены ли люди, за которыми я следую, в списки, и решать, кто должен быть в списке (или, возможно, в другом списке).

Сегодня, когда я начал всерьез использовать эту новую возможность, я обнаружил новую проблему. Чтобы назначить кого-то в список или изменить назначение списка, я щелкнул ссылку в account_url столбец, чтобы открыть профиль этого человека в веб-приложении Mastodon. Это было нормально для учетных записей на моем домашнем сервере, мастодонт.социальный. URL-адрес учетной записи, такой как https://mastodon.social/@burningbird Шелли Пауэрс, приводит меня к профилю Шелли на моем домашнем сервере, где доступен менеджер списков.

Но если я слежу за кем-то в другом месте, например, с Уордом Каннингемом на https://mastodon.radio/@k9ox, URL-адрес учетной записи приведет меня к профилю Уорда на том сервере, где менеджер списков недоступен. Чтобы добавить Уорда в список, мне пришлось захватить URL-адрес его учетной записи, вставить его в поле поиска в веб-приложении моего домашнего сервера, а затем щелкнуть полученную ссылку: https://mastodon.social/@k9ox@mastodon.radio. .

Это очень быстро устарело, поэтому я поправил следующий вкладку, чтобы отобразить последний вариант URL-адреса, который я буду называть URL-адресом с указанием экземпляра.

Steampipe предоставляет несколько способов сделать эту настройку. Как пользователь информационной панели, вы можете использовать функции регулярных выражений Postgres для выполнения преобразования в SQL-запросе, управляющем представлением. Но лучше не надо. Гораздо лучше, если плагин сделает это за вас, поэтому SQL может просто ссылаться на столбец с именем instance_qualified_url.

Я выбрал последний подход. Как автор плагина Steampipe, вы хотите максимально упростить жизнь пользователям плагина. Когда вы являетесь автором и плагина, и приборной панели, как я в данном случае, вы можете наслаждаться прекрасным циклом. По мере развития информационной панели вы находите способы улучшить подключаемый модуль, что приводит к более широкому использованию информационной панели, что предлагает дополнительные возможности для улучшения подключаемого модуля. Мне очень понравилось совместное развитие этих двух компонентов!

Добавление нового столбца в таблицу Steampipe

Чтобы внести изменение, я расширил структуру, определяющую столбцы таблиц, сопоставленных с API учетной записи Mastodon. Плагин Steampipe определяет столбцы, используя список подобных структур.

...,
{
	Name:        "url",
	Type:        proto.ColumnType_STRING,
	Description: "URL for the account.",
},
...,

Эта структура говорит: «Когда имя поля верхнего уровня в ответе API URL-адресскажите Steampipe создать столбец базы данных с таким именем и типом Postgres text».

Вы также можете преобразовать значения в ответах API, чтобы создать новые столбцы, которые не отображаются в ответах API. Вот структура, которую я добавил для этого случая.

...,
{	
	Name:        "instance_qualified_account_url",
	Type:        proto.ColumnType_STRING,
	Description: "Account URL prefixed with my instance.",
	Transform:   transform.FromValue().Transform(instanceQualifiedAccountUrl),
},
...

Тот говорит: «Отправьте ответ API на функцию преобразования instanceQualifiedAccountUrlи использовать его результат в качестве значения столбца.

Вот функция.

func instanceQualifiedAccountUrl(ctx context.Context, input *transform.TransformData) (interface{}, error) {
	url := input.Value.(*mastodon.Status).Account.URL
	qualifiedUrl := qualifiedUrl(ctx, url)
	return qualifiedUrl, nil
}

Он делегирует реальную работу другой функции.

func qualifiedUrl(ctx context.Context, url string) string {
	plugin.Logger(ctx).Debug("instanceQualifiedUrl", "server", homeServer, "url", url)
	re := regexp.MustCompile(`https://([^/]+)/@(.+)`)
	matches := re.FindStringSubmatch(url)
	if len(matches) == 0 {
		return url
	}
	person := matches[1]
	server := matches[2]
	qualifiedUrl := fmt.Sprintf("%s/@%s@%s", homeServer, server, person)
	plugin.Logger(ctx).Debug("instanceQualifiedUrl", "qualifiedUrl", qualifiedUrl)
	schemelessHomeServer := strings.ReplaceAll(homeServer, "https://", "")
	qualifiedUrl = strings.ReplaceAll(qualifiedUrl, "@"+schemelessHomeServer, "")
	plugin.Logger(ctx).Debug("qualifiedUrl", "qualifiedUrl", qualifiedUrl)
	return qualifiedUrl
}

Почему? Для двух разных наборов определений столбцов требуется одно и то же преобразование. instanceQualifiedAccountUrl работает с ответами Account API. Но URL-адреса учетной записи также появляются в API статуса, который управляет просмотрами временной шкалы. Они используют другую функцию преобразования, instanceQualifiedStatusUrlчтобы выполнить такое же преобразование для другого ответа API.

От URL-адресов учетной записи к URL-адресам статуса

instanceQualifiedAccountUrl колонка решила исходную проблему. Я смог снять шляпу автора плагина, надеть шляпу автора панели инструментов и ссылаться на URL-адреса учетных записей как URL-адреса с указанием экземпляра на всех вкладках, которые их отображают. Любая такая ссылка теперь ведет к профилю, который я рассматриваю через призму мастодонт.социальный и это позволяет мне напрямую использовать диспетчер списков веб-приложения, без громоздкой процедуры копирования/вставки/поиска.

Однако мой счастливый танец длился недолго. Вновь почувствовав трудности с копированием/вставкой/поиском, я понял, что это все еще происходит, когда я пытаюсь ответить на элементы, которые появляются на временной шкале. Вот недавний пример: https://techpolicy.social/@mnot/109610641523489182.

Это URL-адрес, отображаемый на панели инструментов. Когда я нажимаю на нее, я попадаю на сервер Марка и могу просмотреть элемент, но если я попытаюсь ответить, я столкнусь с ужасной операцией копирования/вставки/поиска.

Без проблем! Я буду использовать подобное преобразование! Не так быстро. Я могу сформировать URL-адрес, например https://mastodon.social/@mnot@techpolicy.social/109610641523489182, но он никуда не денется.

Если я выполняю операцию копирования/вставки/поиска, я попадаю на похожий, но другой URL-адрес: https://mastodon.social/@mnot@techpolicy.social/109610641692667630. Он имеет ту же структуру, но другой идентификатор инструмента. Этот URL-адрес также отображается на домашней временной шкале веб-приложения, поэтому я могу отвечать прямо из этого представления.

Я не в своей тарелке, поэтому закончу призывом о помощи. Имеет смысл, что домашний сервер назначит свой собственный идентификатор элементу, полученному с внешнего сервера, и что веб-приложение будет использовать этот идентификатор. Но я не вижу способа получить этот идентификатор непосредственно из API. Я подозреваю, что его можно получить с помощью поиска, но выполнение этого для каждого элемента на временной шкале быстро исчерпает ограниченный бюджет на запросы API (всего 300 запросов каждые пять минут).

Итак, Ленивый Мастодон, я просто застрял здесь, или есть способ преобразовать внешние URL-адреса статуса в URL-адреса статуса, относящиеся к экземпляру?

Обновление: решено!

Пообщавшись с Яри Пеннаненом, я еще раз взглянул и понял, что нужный идентификатор все-таки был доступен в ответе API, просто я им не пользовался (фейспалм). И на самом деле есть две разновидности ID — одна для оригинальных инструментов, другая для бустов. Здесь добавляются столбцы для обоих случаев, а также настройка, позволяющая использовать их здесь.

Вот результат.

полный URL-адрес экземпляра IDG

Спасибо, что была моей резиновой уткой, Яри! URL-адреса инструментов и реблогов с указанием экземпляра делают эту панель инструментов намного более полезной.

Эта серия:

  1. Автономность, размер пакета, трение, разветвление и скорость
  2. Mastodon, Steampipe и RSS
  3. Просмотр федиверса
  4. Терминал Bloomberg для Mastodon
  5. Создайте свой собственный Mastodon UX
  6. Списки и люди на Mastodon
  7. Сколько людей в моей ленте Mastodon также написали сегодня в Твиттере?
  8. URL-адреса Mastodon с указанием экземпляра
  9. Графики взаимоотношений мастодонтов
  10. Работа со списками мастодонтов
  11. Изображения считаются вредными (иногда)
  12. Картирование более широкой федеральной сети
  13. Протоколы, API и соглашения
  14. Новости в федерации
  15. Сопоставление людей и тегов в Mastodon
  16. Визуализация модерации сервера Mastodon
  17. Сроки Mastodon для команд
  18. Плагин Mastodon теперь доступен на Steampipe Hub.

Related Posts

Оставить комментарий