pongo / fatmotorbot Goto Github PK
View Code? Open in Web Editor NEWБот для telegram чата по похудению
License: MIT License
Бот для telegram чата по похудению
License: MIT License
Для расчета имт нужны вес, пол и рост.
если пользователь вызывает /weight, а у него не указаны инфо, то в конце ответа абзац сообщает об этом (реализация /info в #8):
Для расчета ИМТ не хватает данных. Укажи их при помощи /info
Если данные есть, то в конце сообщения отдельный абзац про текущий имт. Значение, краткое объяснение. И сколько кг нужно скинуть / набрать до перехода к следующему "уровню".
ИМТ: xx.xx — у тебя здоровый вес. Твоя граница здорового веса: от xx до yy кг. А идеальный вес: xx кг.
http://cmpmos.ru/vychislenie-indeksa-massy-tela-onlajn/
https://www.msdmanuals.com/medical-calculators/BodyMassIndex-ru.htm
https://calcus.ru/calculator-imt
https://calculator-imt.com/
https://herbalife.ru/calculator-bmi/
http://diet.neolove.ru/calc/ideal_ves_imt/
https://just-fit.ru/kalkuljator-imt
https://cont.ws/@fkmrf123/835024
https://www.infoniac.ru/news/Tablica-pravil-nogo-vesa-Kakoi-vash-DEAL-NY-ves.html
http://people.maths.ox.ac.uk/trefethen/bmi_calc.html
http://www.grandars.ru/college/medicina/indeksy-massy-tela.html
https://beachschool.ru/sovety/harvard-formula-body-mass-index/
https://woman.rambler.ru/health/41421648-formula-idealnogo-vesa-dlya-zhenschin-i-muzhchin/
/info
без параметров
Если данные указаны — показывает их.
Если не указаны — пишет:
Укажи свои данные командой: /info <пол> <рост>, где:
<пол> — м или ж
<рост> — 185Пример: /info ж 164
/info с параметрами
Сохранил твои данные: женщина, 155 см.
Не могу разобрать твои каракули. Пиши точно как я указал.
Типа как с весом, но имт. Но не уверен, нужна ли вообще
Я вижу два варианта EAV схемы для нашей базы. (ну, это не совсем eav...)
1. Вариант с одной таблицей:
2. Две таблицы:
Нужно создать две таблицы, наполнить их солидным количеством данных и сравнить время выполнения запросов:
Не забыть про индексы.
Я ожидаю, что второй вариант будет быстрее, возможно будет занимать меньше памяти.
Но он же сложнее в использовании:
Например, InfoUseCase разделить на: GetInfoUseCase, SetInfoUseCase.
https://stryker-mutator.io автоматически изменяет код, чтобы проверить, упали ли тесты (а они должны падать).
У него есть разные мутаторы:
// striker.conf.js
/**
* @type {import('@stryker-mutator/api/core').StrykerOptions}
*/
module.exports = {
mutator: 'typescript',
packageManager: 'npm',
reporters: ['html', 'clear-text', 'progress'],
testRunner: 'mocha',
transpilers: ['typescript'],
testFramework: 'mocha',
coverageAnalysis: 'perTest',
tsconfigFile: 'tsconfig.json',
mutate: [
//'dist/src/**/*.js',
'src/**/*.ts',
'!src/**/*.d.ts',
],
files: [
//'dist/**/*.*',
'*',
'package.json',
'{src,test}/**/*.ts',
],
mochaOptions: {
spec: ['dist/test/nodb/**/*.test.js'],
extension: ["js"],
require: [],
},
};
у меня используется module-alias, но вот беда — страйкер ни в какую не хочет с ними работать. есть два пути:
"compilerOptions": { "plugins": [{ "transform": "@zerollup/ts-transform-paths" }] }
. запуск или через ts-patch, или через ttcs (нужно будет npm run build изменить)."stryker_run": "cross-env NODE_PATH=dist stryker run"
не знаю который путь лучше. вроде оба работают.
Весь процесс работы с ботом:
Тесты контроллеров: сделать хэндлер публичным методом и отправлять туда dto команды, мокнув телегу.
Тестировать на реальной базе или мокнутой?
если, не знаю, size === 0
, то вызывать addCategories()
Line 24 in 96b8db2
main()
.then(() => console.log('done'))
.catch(console.error);
fatmotorbot/src/shared/utils/result.ts
Line 43 in 0a9e2c8
заменить на type OksOfT<T extends unknown[]> = { [P in keyof T]: T[P] extends Result<infer U> ? Ok<U> : never };
type OksOfT<T extends unknown[]> = { [P in keyof T]: T[P] extends Result<infer U> ? Ok<U> : never };
type ValuesOf<T extends unknown[]> = { [P in keyof T]: T[P] extends Ok<infer U> ? U : never };
function comb2<T1, T2>(results: [Result<T1>, Result<T2>]) {
for (const result of results) {
if (result.isErr) return result;
}
const oks = results as OksOfT<typeof results>;
const values = oks.map(x => x.value);
return ok(values as ValuesOf<typeof oks>);
}
посмотреть как типизирован Promise.all https://github.com/microsoft/TypeScript/blob/master/lib/lib.es2015.promise.d.ts
кажется рабочее Playground Link
type OksTupleOfT<T extends Result<unknown>[]> = { [P in keyof T]: T[P] extends Result<infer O, infer _> ? O : never }
type ErrsUnionOfT<T extends Result<unknown>[]> = T extends Array<infer R> ? R extends Err<infer E> ? E : never : never
function combine<T extends Result<unknown>[]>(...results: T): Result<OksTupleOfT<T>, ErrsUnionOfT<T>> {
for (const result of results) {
if (result.isErr) return result as Err<ErrsUnionOfT<T>>;
}
return ok((results as Ok<unknown>[]).map(x => x.value) as OksTupleOfT<T>);
}
Сначала укажите свой вес и пол: /info ...
Теперь вы можете добавлять свой вес: /weight 45
Узнать текущий вес можно командой /weight или /w
следить за сигналом завершения работы.
Твой вес: 77.9 кг. [м 175]
ИМТ: 25 — у тебя избыточный вес. Тебе нужно набрать 1 кг до здорового веса, который для тебя от 62.33 до 77.91 кг. А твой идеальный вес: 69 кг.
Полноценный или спарклайн?
https://bl.ocks.org/mbostock/4b66c0d9be9a0d56484e
https://observablehq.com/@harrystevens/directly-labelling-lines
https://www.d3-graph-gallery.com/line
https://github.com/d3/d3/wiki/Tutorials
sparklines
https://www.essycode.com/posts/create-sparkline-charts-d3/
https://bl.ocks.org/mph006/20f76a764fd5ed2ff37f
https://jarrettmeyer.com/2018/07/17/sparklines-in-d3
https://github.com/DKirwan/reusable-d3-sparkline
http://dataviztalk.blogspot.com/search/label/Tufte
http://dataviztalk.blogspot.com/2016/01/how-to-make-tuftes-discrete-sparklines.html
https://s3.amazonaws.com/edwardtufte.com/sparkline_twitter.png
http://interventions.onlinejacc.org/content/8/8/1018
https://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR
google images: d3 sparklines
http://plottablejs.org/examples/baseball/
https://williaster.github.io/data-ui/?selectedKind=sparkline&selectedStory=Kitchen%20sink&full=0&addons=0&stories=1&panelRight=0
https://lepisma.xyz/tufte.js/
const sorted: MeasuresFromOldestToNewest = [...previous].reverse()
Заодно можно переименовать тот проект
данные генерить в том же формате как слоник возвращает (массив жсонов). фейкер использовать?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.