В Списки и люди на 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-адреса инструментов и реблогов с указанием экземпляра делают эту панель инструментов намного более полезной.
Эта серия:
- Автономность, размер пакета, трение, разветвление и скорость
- Mastodon, Steampipe и RSS
- Просмотр федиверса
- Терминал Bloomberg для Mastodon
- Создайте свой собственный Mastodon UX
- Списки и люди на Mastodon
- Сколько людей в моей ленте Mastodon также написали сегодня в Твиттере?
- URL-адреса Mastodon с указанием экземпляра
- Графики взаимоотношений мастодонтов
- Работа со списками мастодонтов
- Изображения считаются вредными (иногда)
- Картирование более широкой федеральной сети
- Протоколы, API и соглашения
- Новости в федерации
- Сопоставление людей и тегов в Mastodon
- Визуализация модерации сервера Mastodon
- Сроки Mastodon для команд
- Плагин Mastodon теперь доступен на Steampipe Hub.