diff --git a/README.md b/README.md index 91a7b39..3f6a0a0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,123 @@ -# utility-belt +# my utility belt -Набор различных полезных инструментов и утилит, которые могут пригодиться в повседневной работе. Актуально для RetailCRM. \ No newline at end of file +Набор различных полезных инструментов и утилит, которые могут пригодиться в повседневной работе и которые помогают лично мне. Описанное здесь обычно не присутствует публично где-то еще (т.е. это не список вида "https://regex101.com - полезный сайт для теста регулярок"). Список будет дополняться по мере необходимости. Актуально для RetailCRM. + +## Зеркало GitHub компании + +Зеркало публичных репозиториев компании на GitHub. Содержит ТОЛЬКО публичные репозитории, обновляется автоматически. Может помочь если GitHub лежит или если GitHub начнет банить аккаунты, которые ему не нравятся. +- [Ссылка](https://gitea.neur0tx.site/RetailCRM) + +## Быстрое меню + +Простейший скрипт на bash, который позволяет вывести удобную менюшку для повседневных действий вроде копирования пароля техподдержки или перехода в свою тестовую систему. Совместимо с Argos в Gnome, можно допилить и для работы в macOS с xbar (у меня пока руки не дошли, к сожалению). +Установка: +1. Устанавливаем [Argos](https://extensions.gnome.org/extension/1176/argos/). Иногда он не работает и нужно ставить с github версию. +2. +```sh +mkdir -p ~/.config/argos && curl -o ~/.config/argos/menu.+.sh https://gitea.neur0tx.site/Neur0toxine/utility-belt/raw/branch/master/menu.+.sh +``` + +Обязательные зависимости: `jq zenity`, `xclip` или `wl-copy`, `xargs inotify curl jq bash` +Дополнительные зависимости (без них связанные пункты меню просто ничего не делают): +- `flameshot` +- `peek` +- `simplescreenrecorder` +- `wmctrl` +- `xdotool` + +Код скрипта страшноват т.к. мне достаточно было чтобы оно просто как-то работало. + +## Раскукоживатель скриншотеров + +Автоматически редиректит ссылки нескольких популярных скриншот-сервисов на прямую ссылку на картинку. Ставится через [Violentmonkey](https://violentmonkey.github.io) или любое другое расширение для юзерскриптов. Поддерживает Joxi, Monosnap, Nimbus, Lightshot, ibb.co, scr.sh. Цель проста - не видеть рекламу и прочую бесполезную шелуху на странице скриншот-сервисов. +- [Ссылка на установку](/Neur0toxine/utility-belt/raw/branch/master/screenshot-unwrap.user.js) + +## Редирект ссылок Mattermost в приложение + +Mattermost может "забывать" о том, что ссылки нужно редиректить в приложение. В таком случае вместо перехода в приложение открывается страница с кнопкой SSO или сам Mattermost в браузере (если уже залогинены). Юзерскрипт автоматически редиректит такие ссылки в приложение. Ставится через [Violentmonkey](https://violentmonkey.github.io) или любое другое расширение для юзерскриптов. +- [Ссылка на установку](/Neur0toxine/utility-belt/raw/branch/master/screenshot-unwrap.user.js) + +В дистрибутивах Linux может сразу не работать. Лечится так: +```sh +# mattermost-desktop.desktop должен лежать в /usr/share/applications и содержать строчку MimeType=x-scheme-handler/mattermost; +xdg-mime default mattermost-desktop.desktop x-scheme-handler/mattermost +``` + +Если Mattermost ставили из Flatpak - удаляйте и ставьте нативный. Flatpak-версия работает кривовато т.к. толком не поддерживается и собирается энтузиастами. + +## Используем RNNoise (нейронковый шумодав) в Linux + +ВНИМАНИЕ: нижеуказанные действия могут оставить вашу систему **без звука**, будьте ПРЕДЕЛЬНО аккуратны. + +1. Удаляем PulseAudio по инструкции для вашего дистрибутива. Этот шаг пропускаем если уже используется Pipewire (если в выводе `ps aux | grep pipewire` есть `/usr/bin/pipewire`). Устанавливаем PipeWire по инструкции вашего дистрибутива. [Инструкция для Ubuntu / Debian](https://pipewire-debian.github.io/pipewire-debian/). +2. Ставим [EasyEffects](https://github.com/wwmm/easyeffects) из репозиториев вашего дистрибутива или Flatpak ([инструкция](https://ubuntuhandbook.org/index.php/2021/09/easyeffects-audio-effects-to-pipewire/)). Перезагружаемся. +3. В EasyEffects переходим на "Вход" > "Эффекты" > "Добавить эффекты". Отсюда добавляем "Подавление шума" и "Эхоподавление". + +После этих действий для подавления шума будет использоваться RNNoise и качества звука улучшится _значительно_. + +## pock + +Маленькая библиотека на PHP, которая позволяет мокать запросы, сделанные из API-клиентов, использующих PSR-18 совместимый http-клиент. Похожа на [gock](https://github.com/h2non/gock) (аналог для ноды - [nook](https://github.com/node-nock/nock) и для питона [pook](https://github.com/h2non/pook)). Код простой и очень сильно покрыт тестами. Используется в некоторых боевых проектах в тестах т.к. [api-client-php](https://github.com/retailcrm/api-client-php) использует PSR-18. +- [Ссылка](https://packagist.org/packages/neur0toxine/pock) +- [Код на GitHub](https://github.com/Neur0toxine/pock) + +## Локальный мок-сервер для метрик Zabbix + +Простейший мок Zabbix Server, который принимает Zabbix-пакет с метриками и выводит их содержимое. Пока что размер пакета ограничен кибибайтом (попозже поправлю это если понадобится, PR приветствуются). Используется очень просто в докеризированных приложениях: +```yaml +# Представим, что это docker-compose.yml +services: + zabbix: + image: "neur0toxine/zabbix-metrics-mock:latest" +``` +после чего можно смело указывать `zabbix` как хост Zabbix Server и наблюдать метрики в stdout. + +- [Ссылка](https://hub.docker.com/r/neur0toxine/zabbix-metrics-mock) +- [Код на GitHub](https://github.com/Neur0toxine/zabbix-metrics-mock) + +## Локальная альтернатива webhook.site + +Приложение собирается через go build. Запускается с адресом для прослушивания примерно так: +```sh +./main ":8080" +``` +Любой входящий http-запрос выведется в stdout с цветами и всем содержимым. +- [Код на GitHub](https://github.com/Neur0toxine/whprintf) + +В дальнейшем работать с этой штукой будет попроще. + +## Образы Go + +Используются в транспортах и содержат ряд полезных утилит. +- [Ссылка](https://hub.docker.com/r/neur0toxine/golang-alpine) +- [Код на GitHub](https://github.com/Neur0toxine/docker-golang-alpine) + +## Образы NodeJS + +Основаны на [этих образах](https://hub.docker.com/r/timbru31/node-alpine-git). Добавлены зависимости, которые позволяют проще собирать бинарники в CI и локально (например, помогает с sass). +- [Ссылка](https://hub.docker.com/r/neur0toxine/node-alpine-git-gyp) +- [Код на GitHub](https://github.com/Neur0toxine/docker-node-alpine-git-gyp) + +## Для транспортов + +## Вспомогательное приложение для отчетов & пакетных операций для транспортов + +Приложение содержит набор команд, которые позволяют выполнять пакетные операции навроде: +- генерации отчетов с верификацией систем / API-ключей / etc; +- пакетной смены настроек соединений или аккаунтов. +Предоставляется только в виде кода т.к. часто требуется добавить какую-нибудь свою команду для обработки данных или массовых операций. Приложение предоставляет небольшой "фреймворк" для облегчения этого действия, в частности, для простого написания генераторов отчетов из исходных csv-данных. Отчеты при этом генерируются конкуррентным образом (по возможности в несколько потоков). + +Абсолютно все команды можно увидеть запустив приложение без аргументов. Любая команда с аргументом `help` опишет зачем она нужна и как ей пользоваться. Приложение собирается через `make` (нужен Go 1.18 и выше локально). + +- [Код на GitHub](https://github.com/Neur0toxine/transport-reports) + +### Простейший мок-сервер для WhatsApp On-Premises API + +Умеет принимать вебхук с сообщением и слать статус доставки в ответ. Настраивается через маршрут `/mock`. Требует сборки и запуска локально. Удобной обвязки нет, понять как настроить можно по `server.go`. +- [Код на GitHub](https://github.com/Neur0toxine/waba-coreapp-mock) + +### Бот для тестов быстрых ответов в транспортах + +Инструкция по сборке в readme. Бот сам регается в системе. При запуске бинарник укажет обязательные переменные окружения, необязательные можно посмотреть в `main.go`. + +- [Код на GitHub](https://github.com/Neur0toxine/simla-bot-quickreplies-test) \ No newline at end of file diff --git a/mattermost-deeplinking.user.js b/mattermost-deeplinking.user.js new file mode 100644 index 0000000..2af4410 --- /dev/null +++ b/mattermost-deeplinking.user.js @@ -0,0 +1,16 @@ +// ==UserScript== +// @name RetailCRM Mattermost App Deeplinking +// @namespace ooga-booga +// @include /^https?\:\/\/mattermost\.retailcrm\.tech\/login\?redirect_to\=.+/ +// @include /^https?\:\/\/mattermost\.retailcrm\.tech\/simlacom\-retailcrm\/pl.+/ +// @grant none +// @version 1.0 +// @author - +// @description Автоматический редирект ссылок Mattermost в приложение. Скрипт нужен т.к. веб-версия часто сбрасывается к открытию в браузере вместо приложения. +// ==/UserScript== +if (location.pathname === '/login') { + location.assign('mattermost://mattermost.retailcrm.tech' + decodeURIComponent(location.search.substr(13))) + } else { + location.assign('mattermost://mattermost.retailcrm.tech' + location.pathname) + } + \ No newline at end of file diff --git a/menu.+.sh b/menu.+.sh new file mode 100755 index 0000000..0f49979 --- /dev/null +++ b/menu.+.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash + +CONFIG_DIR="$HOME/.config/retailcrm-menu" +TP_EMAILS_FILE="$CONFIG_DIR/tech-support-emails" +TP_PASS_FILE="$CONFIG_DIR/tech-support-password" +TEST_SYSTEM_CREDENTIALS_FILE="$CONFIG_DIR/test-system-credentials" + +mkdir -p "$CONFIG_DIR" + +copytext () { + if [ "$XDG_SESSION_TYPE" == "x11" ]; then + xclip -selection clipboard <&0 + else + wl-copy <&0 + fi +} + +if [ "$1" == "to-clipboard" ]; then + copytext <&0 + exit +fi + +if [ "$1" == "tech-password" ]; then + if [ "$2" == "update" ]; then + NEW_PASSWORD=$(zenity --forms --title="Обновление пароля техподдержки" --text="Введите пароль техподдержки" --add-entry="Пароль техподдержки") + if [ $? == 0 ]; then + echo "$NEW_PASSWORD" > "$TP_PASS_FILE" + notify-send -h int:transient:1 -u normal -t 1000 -i dialog-password "Пароль техподдержки обновлён" + fi + fi + if [ "$2" == "copy" ]; then + < "$TP_PASS_FILE" tr -d '\n' | copytext + notify-send -h int:transient:1 -u normal -t 1000 -i dialog-password "Пароль техподдержки скопирован" + fi + exit +fi + +if [ "$1" == "testsystem" ]; then + if [ "$2" == "update" ]; then + NEW_CREDENTIALS=$(zenity --forms --title="Обновление доступов тестовой системы" --text="Введите доступы к тестовой системе" --add-entry="API URL" --add-entry="API-ключ") + if [ $? == 0 ]; then + echo "$NEW_CREDENTIALS|$(curl -fsSL $(echo $NEW_CREDENTIALS | cut -d'|' -f1 | tr -d '\n')/api/system-info | jq -j '.technicalUrl')" > "$TEST_SYSTEM_CREDENTIALS_FILE" + notify-send -h int:transient:1 -u normal -t 1000 -i dialog-password "Данные тестовой системы обновлены" + fi + fi + if [ "$2" == "open-url" ]; then + < "$TEST_SYSTEM_CREDENTIALS_FILE" cut -d'|' -f1 | tr -d '\n' | xargs xdg-open + fi + if [ "$2" == "copy-url" ]; then + < "$TEST_SYSTEM_CREDENTIALS_FILE" cut -d'|' -f1 | tr -d '\n' | copytext + notify-send -h int:transient:1 -u normal -t 1000 -i dialog-password "API URL тестовой системы скопирован" + fi + if [ "$2" == "copy-tech-url" ]; then + < "$TEST_SYSTEM_CREDENTIALS_FILE" cut -d'|' -f3 | tr -d '\n' | copytext + notify-send -h int:transient:1 -u normal -t 1000 -i dialog-password "Технический API URL тестовой системы скопирован" + fi + if [ "$2" == "copy-key" ]; then + < "$TEST_SYSTEM_CREDENTIALS_FILE" cut -d'|' -f2 | tr -d '\n' | copytext + notify-send -h int:transient:1 -u normal -t 1000 -i dialog-password "API-ключ тестовой системы скопирован" + fi + exit +fi + +if [ "$1" == "emails-update" ]; then + curl -sSfL https://infra-data.retailcrm.tech/crm-domains.json | jq -r '.domains[].domain' | sed -e s/^/mail@/ > "$TP_EMAILS_FILE" + notify-send -h int:transient:1 -u normal -t 1000 -i mail-unread "Почтовые адреса техподдержки обновлены" + exit +fi + +echo " |iconName=system-help" +echo "---" + +echo "Логин техподдержки | iconName=avatar-default" +if [[ -f "$TP_EMAILS_FILE" ]]; then + while IFS="" read -r p || [ -n "$p" ] + do + printf '%s%s | iconName=mail-unread bash='"'"'echo %s | %s && notify-send -h int:transient:1 -u normal -t 1000 -i mail-unread "%s скопировано"'"'"' terminal=false\n' "--" "$p" "$p" "$0 to-clipboard" "$p" + done < "$TP_EMAILS_FILE" +else + echo "--Список пуст, обновите" +fi +echo "--Обновить | iconName=view-refresh bash='$0 emails-update' terminal=false" + +echo "Пароль техподдержки | iconName=dialog-password" +echo "--Скопировать | iconName=edit-copy bash='$0 tech-password copy' terminal=false" +echo "--Обновить | iconName=view-refresh bash='$0 tech-password update' terminal=false" + +echo "Доступы в тестовую CRM | iconName=user-info" +echo "--Открыть систему | iconName=emblem-web bash='$0 testsystem open-url' terminal=false" +echo "--API URL | iconName=system-lock-screen bash='$0 testsystem copy-url' terminal=false" +echo "--Технический API URL | iconName=system-lock-screen bash='$0 testsystem copy-tech-url' terminal=false" +echo "--API-ключ | iconName=emblem-system bash='$0 testsystem copy-key' terminal=false" +echo "--Обновить | iconName=view-refresh bash='$0 testsystem update' terminal=false" + +echo "--" + +echo "Запись с экрана | iconName=video-display" +echo "--Скриншот | iconName=image-x-generic bash='sleep 0.3 && flameshot gui' terminal=false" +echo "--GIF с экрана | iconName=video-display bash='peek' terminal=false" +echo "--Видео с экрана | iconName=simplescreenrecorder bash='simplescreenrecorder' terminal=false" + +echo "Изменить размер окна на 1920x1080 | iconName=view-fullscreen bash='wmctrl -i -r \`xdotool getwindowfocus\` -e 0,0,0,1920,1080' terminal=false" +echo "Изменить размер окна на 2560x1440 | iconName=view-fullscreen bash='wmctrl -i -r \`xdotool getactivewindow\` -e 0,0,0,2560,1440' terminal=false" diff --git a/screenshot-unwrap.user.js b/screenshot-unwrap.user.js new file mode 100644 index 0000000..024448e --- /dev/null +++ b/screenshot-unwrap.user.js @@ -0,0 +1,37 @@ +// ==UserScript== +// @name Full image from screenshoters +// @namespace Neur0toxine +// @license MIT +// @include /^https?:\/\/prnt\.sc\/[\w\-]+$/ +// @include /^https?:\/\/skr\.sh\/\w+$/ +// @include /^https?:\/\/ibb\.co\/\w+$/ +// @include /^https?:\/\/monosnap\.com\/file\/\w+$/ +// @include /^https?:\/\/nimbusweb\.me\/nimbus\-screenshots\/\w+$/ +// @include /^https?:\/\/joxi\.ru\/\w+$/ +// @exclude /^https?:\/\/joxi\.ru\/\w+\.jpg$/ +// @grant none +// @version 0.4 +// @author Neur0toxine +// @description Opens the image itself while opening different screenshot services (you won't see their bloated webpages). +// ==/UserScript== +switch (location.host) { + case 'prnt.sc': + location.assign(document.querySelector('.no-click.screenshot-image').src); + break; + case 'skr.sh': + location.assign(document.getElementById('screenshot-image').src); + break; + case 'joxi.ru': + location.assign(location.href + '.' + document.querySelector('.tile-preview > img').src.split('.').pop()); + break; + case 'ibb.co': + location.assign(document.querySelector('#image-viewer-container > img').src); + break; + case 'monosnap.com': + location.assign(`https://api.monosnap.com/file/download?id=${location.pathname.replace('/file/', '')}`); + break; + case 'nimbusweb.me': + location.assign(document.querySelector('nns-note > .nns-adds-wrapper > .wrapper > .note-content > nns-note-text img').src); + break; + } + \ No newline at end of file