Fitter —  сшиватель API/Website's.  Большое обновление

273c698e686578d407efdb079c8c42d8.png

Добрый вечер всем!

С момента выхода предидущей статьи про Fitter прошла достаточно много времени и в связи с этим я хотел поделиться обновлениями, которые были сделаны.

Итак, что появилось:

  1. Написано, какое-никакое README.md, которое регулярно пополняется фишками.

  2. Добавлена возможность использования как библиотека для go

  3.  Добавлена поддержка плагинов на go.

  4. Добавлена поддержка прокси для коннекторов (server/playwright)

  5. Добавлена возможность отправки обновлений в console (stdout)/telegram/http/redis

  6. Убрано огромное дуплицирование кода с помощью generic

  7. Добавлена возможность скачивать файлы

  8. Добавлена возможность делать вычисляемые поля и благодаря этому можно делать супер связки конфигураций (об этом ниже)

  9. Добавлено возможность создавать reference (можно кэшировать данные и переиспользовать их) и инжектить переменные среды

  10. Добавлена возможность делать fallback на любые поля если оно пустое.

Напоследок хотелось бы показать пример конфигурации которую делал для друга. И так его задача с сохранением орфографии:

1. ну сначала нужно получить все позиции юзера https://docs.saucerswap.finance/v/developer/saucerswap-v2/liquidity-operations/get-user-positions
2. потом все пулы https://docs.saucerswap.finance/v/developer/saucerswap-v2/liquidity-operations/fetch-all-pools
3. и потом заметчить позиции юзера с пулами что бы определить какие позици вне диапазона пула

И так что получилось:

{
  "references": {
    "AllPoolRef": {
      "expire": "60",
      "connector_config": {
        "response_type": "json",
        "url": "https://api.saucerswap.finance/v2/pools/",
        "server_config": {
          "method": "GET"
        }
      },
      "model": {
        "array_config": {
          "item_config": {
            "fields": {
              "tokenA": {
                "base_field": {
                  "type": "string",
                  "path": "tokenA.symbol"
                }
              },
              "tokenB": {
                "base_field": {
                  "type": "string",
                  "path": "tokenB.symbol"
                }
              }
            }
          }
        }
      }
    },
    "AccountIdRef": {
      "connector_config": {
        "response_type": "json",
        "static_config": {
          "value": "{{{FromEnv=USER_ID}}}"
        }
      },
      "model": {
        "base_field": {
          "type": "string"
        }
      }
    }
  },
  "items": [
    {
      "name": "user-position",
      "connector_config": {
        "response_type": "json",
        "url": "https://api.saucerswap.finance/V2/nfts/{{{RefName=AccountIdRef}}}/positions",
        "server_config": {
          "method": "GET"
        }
      },
      "model": {
        "array_config": {
          "item_config": {
            "fields": {
              "position": {
                "base_field": {
                  "type": "object",
                  "generated": {
                    "formatted": {
                      "template": "tokenA={{{tokenA.symbol}}} tokenB={{{tokenB.symbol}}}"
                    }
                  }
                }
              },
              "value": {
                "base_field": {
                  "type": "object",
                  "path": "",
                  "generated": {
                    "calculated": {
                      "type": "boolean",
                      "expression": "any(fromJSON('{{{RefName=AllPoolRef}}}'), {.tokenA == '{{{tokenA.symbol}}}' && .tokenB == '{{{tokenB.symbol}}}'})"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "trigger_config": {
        "scheduler_trigger": {
          "interval": 10
        }
      },
      "notifier_config": {
        "expression": "any(fRes, {.value == true})",
        "telegram_bot": {
          "token": "{{{FromEnv=TELEGRAM_TOKEN}}}",
          "users_id": [],
          "pretty": true
        }
      }
    }
  ]
}

Тут есть два параметра из среды:

  1. TELEGRAM_TOKEN — строка 95

  2. USER_ID — строка 37

Все что надо было сделать другу это запустить Fitter и добавить в конфиг ID юзеров для нотификации (строка 95):

TELEGRAM_TOKEN=xxx USER_ID=xxx ./fitter --path=./config.json

Расскажу что тут происходит:

  1. Создаем Reference (строка 3) на все пулы и кэшируем на 10 секунд (строка 4). Мы берем и создаем массив с двумя полями (символы двух токенов из пулов)

  2. Создаем Reference (строка 33) на AccountId, это будет просто строка

  3. Мы создаем item для мониторинга каждые 10 секунд (строка 88) который берет данные с сервера с inject account Id (строка 52), который представляет из себя массив обьектов с двумя полями. Первое позиция (строка 66) — это шаблонная строка с inject результата. Второе это результат проверки содержится ли токены юзера в пуле из Reference (пункт первый) типа boolean.

  4. Дальше мы уведомляем если какое нибудь из полей имеет значение true (строка 93)

  5. Получаем в телегу уведомление:

Result for: user-position

[
 {
  "position": "tokenA=USDC tokenB=USDC[hts]",
  "value": true
 },
 {
  "value": false,
  "position": "tokenA=USDC tokenB=USDT"
 }
]

PS: false значения можно было игнорировать, но не стал.

Спасибо за внимание, продолжаю работать на проектом!

GitHub — PxyUp/fitter: New way for collect information from the API’s/Websites

github.com

© Habrahabr.ru