Giter VIP home page Giter VIP logo

bot's Introduction

Echo-bot

Haskell CI

Project Description:

Echo-bot for messagers

  • Resends user's message to user;
  • Allows the user to choose number of bot replies;
  • Using Sqlite3 as DB for store user settings;
  • Supports 2 api:
    • telegram;
    • vk (supported Version 5.5);
  • Supports 4 levels of logging:
    • error-level(default): show only error messages;
    • warning-level: show only error and warning messages;
    • info-level: show info, error and warning messages;
    • debug-level: show even more details than info-level;

Installation:

You may clone GitHub repository

git clone https://github.com/LyuPo7/bot.git

How to use?

  1. Setup data/config.json (for example see config-json-file: 'data/config_tele.json' for Telegram and 'data/config_vk.json' for Vk)

    • "api_settings"
      • "bot_api": must be one of ["vk", "telegram"];
      • "bot_token": token for vk/telegram bot;
      • "bot_initial_reply_number": will be used as initial reply number for any new chat;
      • "bot_question": quetion in reply to /repeat command;
      • "bot_description": message in reply to /help command;
    • "logger_settings"
      • "verbocity": level of logging - must be one of ["debug", "info", "warning", "error"];
  2. Since bot use Sqlite3 You'll need check if you have installed Sqlite3 in your system (if not - use):

      $ sudo apt-get update -y && sudo apt-get install sqlite3 libsqlite3-dev -y
  3. Build project using stack:

      $ stack build
  4. Run project using stack:

      $ stack exec bot-exe

    For more information see asciinema below:

Project pattern

bot's People

Contributors

lyupo7 avatar

Watchers

 avatar

bot's Issues

код стайл

Здесь несколько моментов

  1. В коде в некоторых местах происходит смешение кэмэл-кейса и нижнего подчеркивания - лучше придерживаться одного стиля: для внутренних сущностей - кэмэлКейс, для джейсонов - подчеркивания.
  2. именования сущностей: нет необходимости дублировать имя даты внутри самой даты: если дата называется Attachment , не нужно поля этой даты начинать с attach_ , достаточно просто type , ну или если слово зарезервировано, то что-то иное придумать
  3. комментарии: лучше избегать дублирующих код комментариев - то, для чего нужна сущность, должно быть понятно из ее имени, а не из комментария. Тем более странно, когда комментарий почти полностью дублирует имя сущности

Снимок экрана от 2021-11-08 16-07-45

Проверка орфографии

В именах функций и переменных допускаются только английские слова или общепринятые сокращения в camelCase. Например hconfig лучше исправить на hConfig. Также есть некоторые ошибки и опечатки в коде - verbocity, Unsuccessfull и т. д.

Если у тебя vscode, то там есть удобное расширение code spell checker для проверки орфографии.

Форматирование

Не пойму, какой форматтер у тебя используется. В src есть fourmolu.yaml, но используется не он. Количество пробелов в некоторых файлах равно 4.
Нужно использовать ormolu и количество пробелов 2

Работоспособность

Билдится успешно, телеграмовский бот работает без вопросов. ВК бот - надо указать в ридми используемую версию ВК АПИ, там у разных версий отличаются формы респонсов.

организация типов

модуль Bot.Vk.Parser.Data :

  • дублирую коммент с Attachment лучше использовать тип сумму, а не произведение: аттачмент может быть только одним из вышеперечисленных типов (а не может содержать сразу несколько ), это логически определение типа суммы (а не произведения)
  • список имеет поддержку нулевого значения - пустой список, нет необходимости оборачивать список в монаду Maybe

Снимок экрана от 2021-11-08 16-25-08

Класс Worker

Можешь объяснить предназначение класса Worker
class (MonadThrow m, Monad m) => Worker m api where
который имеет только один инстанс
instance (MonadThrow m, Monad m) => Worker m BotApi.Api where

Архитектура

на данный момент весь бот по архитектуре лежит на одном уровне: для каждого мессенджера пишется и запускается свой бот. Это довольно непрактичный подход:

  • во-первых, при появлении нового мессенджера придется целиком почти писать для него программу
  • во-вторых, появляется большое количество дублирующего кода
  • в-третьих, при попытке внести изменения в бизнес-логику придется менять каждый случай отдельно
  • в-четвертых, покрывать тестами придется каждого бота отдельно
    Более грамотно построенная архитектура подразумевает вынесение бизнес-логики на абстрактный уровень, а задачей имплементации для мессенджера является подстановка конкретных имплементаций и значений в эту логику.

Импорты

Привет) Не везде используются списки импорта. Нужно использовать либо списки импорта, либо квалифицированные. Например, в тестах лучше написать import qualified.

import TestBot.Tele.GenData as GD

Если ты используешь hls в vscode, то он сам предлагает сделать списки импорта где нужно

Синонимы типов

Синонимы типов

type UserId = Integer
type ChatId = Integer

не добавляют безопасности коду, то есть мы можем вместо UserId всегда подставить ChatId. И вместе с тем, это уменьшает понимание, так как проверяющий не знает, что ChatId это не какой-то специфический тип, а просто Int.
Рекомендуется (на твое усмотрение) сделать newtype обертки, например
newtype UpdateId = UpdateId Int deriving newtype (Show, FromJSON, ToJSON, Convert, Num, Read, Ord, Eq)
механизм дерайва позволяет с ними работать, как с обычными типами, взамен мы получаем типобезопасность и никакого оверхеда в реалтайме

билд

Люба, привет!
Первый вопрос по поводу билда - не билдится ни один из проектов - валится при попытке поставить пакет HDBC. Если в проекте есть зависимости, которые нужно устанавливать отдельно, процедура установки должна быть описана в ридми

Дублирование кода

Вот яркий пример, функция makeRequest явно имеет одинаковую структуру для обоих ботов. Значит ее нужно вынести в общий код, а какие-то специфические куски оставить в соответствующих модулях
https://github.com/LyuPo7/bot/blob/master/src/Bot/Api/Tele/Request/Requests.hs#L157
https://github.com/LyuPo7/bot/blob/master/src/Bot/Api/Vk/Request/Requests.hs#L222

Функции setHelpMessage и setStartMessage в Bot.Api.Tele.Request.Requests выглядят как абсолютно одинаковые.
Функции withHandleIO для Bot.Api.Vk.Parser.Parser Bot.Api.Tele.Parser.Parser тоже одинаковые.

Во многих случаях можно вынести общую логику отдельно и избавиться от дублирования кода

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.