Giter VIP home page Giter VIP logo

trial-bot-all's People

Contributors

unam3 avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

trial-bot-all's Issues

Разделить стейт и статическое окружение

Сейчас Config телеги (который, вообще-то стейт)

data Config =
  Config
    { tokenSection :: TokenSection
    , helpMessage :: HelpMessage
    , repeatMessage :: RepeatMessage
    , numberOfRepeats :: NumberOfRepeats
    , numberOfRepeatsMap :: NumberOfRepeatsMap
    }

содержит в себе два типа полей: статические, которые не меняются во время выполнения: repeatMessage, helpMessage, tokenSection, NumberOfRepeats. И динамический numbersOfRepeatsMap. Совмещать в одном типе данных две разные штуки -- стейт и статическое окружение не стоит, если в этом нет необходимости.

Обычно для хранения окружения используют ReaderT, а для состояния либо StateT либо в ридер кладут MVar, TVar или IORef, но можно и просто передавать аргументом ф-ии

Тоже самое относится к "конфигу" вк

Повысить читабельность кода

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

Для уменьшения сложности есть следующие подходы:

  1. Разделяй большую функцию на функции поменьше. Итоговая проблема которую решала функция разделится при этом на более мелкие проблемы и читающему код станет легче поскольку в голове в каждый момент чтения можно будет держать меньше информации. Это вообще классический принцип, он помогает не только понимать программы, но и в принципе их писать, я думаю ты о нем слышал, есть даже на вики статья.
  2. Нужно постараться сделать так чтобы у каждой функции была одна зона ответственности, чтобы у нее была одна четкая цель. Тоже стандартный термин для этого применяется - связность.
  3. Используй стандартные паттерны проектирования вместо того чтобы заново их реализовывать самому. Например, для обработки списков есть функции filter, map, foldr (есть также для списков с эффектами аналоги). Не стоит использовать рекурсию, а вместо этого лучше выразить то же через стандартные функции. Поскольку каждый их встречал и использовал, читающему будет легче понять смысл функции. Заметил подобный код в Telegram.HandleUpdates.handleUpdates.
  4. Уменьшить вложенность кода. Каждый дополнительный уровень приводит к тому, что при чтении необходимо помнить все вложенные конструкции вверх по "стеку".

VK longpolling

Из дока

В ответ на запрос сервер может вернуть одну из ошибок:
{"failed":1,"ts":30}
{"failed":2}
{"failed":3}
"failed":1 — история событий устарела или была частично утеряна, приложение может получать события далее, используя новое значение ts из ответа.
"failed":2 — истекло время действия ключа, нужно заново получить key методом groups.getLongPollServer.
"failed":3 — информация утрачена, нужно запросить новые key и ts методом groups.getLongPollServer.
Обратите внимание, объекты в сообщении об ошибке могут содержат поля, не описанные в документации. Их необходимо игнорировать и не пытаться обработать.

По хорошему эти кейсы надо обрабатывать

Compilation failure

wixe@thinkpad /tmp/trial-bot-all$ stack build --fast

Error: While constructing the build plan, the following exceptions we

In the dependencies for trial-bot-all-0.1.0.0:
    bytestring-0.10.10.1 from stack configuration does not match ==0.
                         is 0.10.10.0)
needed since trial-bot-all is a build target.

Some different approaches to resolving this:

  * Set 'allow-newer: true'
    in /home/wixe/.stack/config.yaml to ignore all version constraint

  * Recommended action: try adding the following to your extra-deps i

- bytestring-0.10.10.0@sha256:6031d86e4fd6419ad2ea05ecc008188dd64ed6c

Plan construction failed.

Обработка ошибок

  • Использование нетотальных ф-ий (тех которые могут вывалится с рантайм ошибкой) крайне желательно избегать. В коде достаточно много используется fromJust. В случае init, head лучше использовать деконструкцию списка
  • В целом отсутствует обработка ошибок. Если выпадет ексепшн по любому поводу у всего приложения большие шансы закрашиться. Для обработки ошибок можно использовать разные подходы: ExceptT, catch/try, явный возврат Maybe/Just. Каждую ошибку хорошо бы логгировать в собственном логгере с уровнем error

Обработка всех сообщений в тг

[Tg] Only latest text message (from updates) will be processed.

Если будет большая нагрузка на бота, за раз будет получаться много сообщений от разных пользователей и 90% будет просто игнорироваться. Надо пофиксить чтобы каждое сообщение обрабатывалось

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.