Git Product home page Git Product logo

fasttyping's Introduction

image-alt-name

Continuous Integration License: MIT GitHub commit activity

Тренажер печати с возможностью соревновательной игры

О проекте

FASTYTPIGN - клиент-серверное приложение, позволяющее вам попрактиковаться в печати, измерить WPM и посоревноваться с друзьями в быстром наборе текстов.

Зависимости

  • В данном проекте для клиента используется Qt версии не меньше 6. Разработка и тестирование производились на Qt 6.2.0.
  • Для севера, в свою очередь, потребуется Boost.
  • Также для сервера потребуется libpqxx.
  • Последней зависимостью является nlohmann/json.

Установка

Установщик

Для установки клиента можно использовать комплектный установщик (Linux)

Ручная установка

git clone https://github.com/khbminus/fastTyping.git
mkdir build
cd build
cmake .. -DBUILD_ALL=ON -DBUILD_CLIENT=OFF -DBUILD_SERVER=OFF # в зависимости от того, что вы хотите собрать назначив флаги 
make server
make client
make install # опционально

Необходимые для работы файлы

Для запуска и корректной работы клиента в рабочей директории с проектом должны находиться файлы раскладок: qwerty.json , colemak.json, dvorak.json.

Для корректной работы сервера требуется также собрать и выполнить цель dictionaries-interface, которая инициализирует словари. Все текстовые словари должны находиться в рабочей папке в dicts/, а DLL-словари просто в корневой папке.

fasttyping's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

hello-zoka

fasttyping's Issues

Улучшить хранение пароля

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

CI/CD

  • Добавить проверку на компилируемость клиента
  • ... сервера
  • clang-tidy
  • cppcheck
  • Deploy

[plan] Виджет клавиатуры

Реализовать 87 (105?) лейблов для отображения клавиатуры.

  • Квадратики с текстом
  • Отображение клавиш
  • Отображение нажатий
  • Покраска по пальцам
  • Подсказка следующего символа
  • Разные раскладки

Ошибки на клиенте

Необходимо добавить какие-нибудь message box с сообщением об ошибках для клиента. Я могу заняться эти параллельно с работой с сетью (тем более, что пока обрабатываемые ошибки могут появиться только там)

Прогресс-бар

Сделать прогресс-бар, отображающий процесс гонки.

  • Сделать QML виджет с placeholder данными.
  • Сделать поддержку прогресса с сервера (с точной работой для одного игрока)
  • Сделать поддержку мультиплеера
  • Сделать красивое...

Улучшить окружение на сервере

Мне очень не нравится, что на сервере сейчас сервис работает от рута + постгресе не задан юзер. Надо будет исправить это

  • Изменить окружение на сервере
  • Добавить возможность изменять имя пользователя/пароль для БД на сервере, возможно уметь задавать порт.

Потенциальные ошибки на сервере

if (result["body"]["isFullCorrect"] == true && result["body"]["isEnd"] == true) {
- обращение к полю isEnd, которого не бывает в результате при вызове функции addNewChar (и вложенном вызове checkUnsafe). Вероятно старые падения сервера могут быть вызваны этим.

Окно ожидания не-хоста

Вместо открытия окна ожидания старта игры не у хоста ничего не происходит. Видимо проблема в том, что запрос blocking.

Связывание клиент и сервера

Нужно связать клиент и сервер: сейчас на клиенте вместо обращений на сервере стоят заглушки.

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

Интерфейс деплоя

  • добавить нормальный интерфейс и добавить в Actions
  • Поправить пути
  • Насторить БД, добавить primary key

Добавление словарей

  • Добавить возможность получать топ слов

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

  • Добавить базу данных словарей

  • Убедиться что это менеджер игр умеет получать слова на игру

Неконсистентность API для авторизации

Нужно удостовериться, что API для авторизации удовлетворяет общем требованиям к API, описать типы, возвращаемые при успешном завершении или ошибке и переименовать всё в camelCase

Улучшить окошко текста

Хочется все же получить лучше просмотр текста с выделением текущего слова + курсора + лучшей подсветкой ошибок.

Имена в getStates

Надо добавить поле userName с именем пользователя для прогресс бара.

Backspace на пустом буффере

Если нажать backspace на пустом буффере, то клиент упадет с ошибкой

terminate called after throwing an instance of 'nlohmann::detail::type_error'
  what():  [json.exception.type_error.302] type must be boolean, but is null

Лог самой игры:

qml: pressed key 16777219
qml: debug text [object Object]
qml: � Pressed
send:   "{\"body\":{},\"header\":{\"type\":\"backspace\"}}\n"
received:  "{\"body\":{\"text\":\"can't use backspace with empty buffer\"},\"header\":{\"queryType\":\"backspace\",\"type\":\"emptyBufferError\"}}"
terminate called after throwing an instance of 'nlohmann::detail::type_error'
  what():  [json.exception.type_error.302] type must be boolean, but is null

Game id

Сделать game id случайным числом, чтобы избежать нежелательных подключений

Имена игроков

Добавить отображение имен игроков в игре, чтобы было понятно кому принадлежит квадратик

Сделать README

Надо бы сделать README.md

Глобальный:

  • Краткое описание
  • зависимости
  • как устанавливать

Клиентский:

  • зависимости
  • Можно структуру (сюда надо бы схемку для работы с сокетом, но кхм)

Серверный:

  • зависимости
  • Как запускать
  • Структура таблиц

Дизайн-код

Нужно описать дизайн-код и поменять стили в соотвествии с ним.

Переезд в докер

С нормальной реализацией CI/CD возникли некоторые технические шоколадки: для сборки клиента требуется Qt6, которого нет на Ubuntu 20.04 в репозиториях. Сборка на VDS осложняется тем, что там 1 ядро, а Qt6 большое.

Поэтому было принято решение переехать в докер и пользоваться cloud-based инфраструктурой (при поддержки cavoke-project и лично @waleko)!

План:

  • Собрать базовый докер с clang/cppcheck/nlohmann-json
  • Переписать cppcheck/clang-format workflow для использования в докере
  • Переписать server-build workflow для докера.
  • Собрать докер-контейнер для клиента.
  • Сделать workflow скрипт для сборки клиента. Задача из #12
  • Деплой сервера + скрипт проверки состояния. Не в докере, а на VDS.

ComicSans

Нужно поменять шрифт на Comic Sans Mono

Честный WPM

Добавить подсчет статистики по словарю/подобрать константу на среднее кол-во букв в слову получше, чем 4
(смотри 2 TODO в game.cpp)

SSL и асинхронщина на сервере

Для частичного решения #28 надо добавить защищенное соединение, для финального решения #40 надо сделать асинхроннку. Все это задача на сервере, поэтому ишью 1.

Фикс небольших багов клавивиатуры

Елси при многократном нажатии шрифта открывается диалоговое окно залипания клавиш, клавиатура не фиксирует отжатие шифта, и оставляет буквы в верхнеи регистре + при переключении раскладок он странно реагирует.

Кнопка start

Добавить кнопку старт перед началом игры, после нажатия которой происходит обратный отсчет и игра начинается(кнопка есть только у хоста, у всех остальных надпись ждать)

Пофиксить UI

  • Кнопка join в JoinWindow очень узкая(у меня прям ужасно)
  • Кнопка return в GameWindow триггерится на пробел, если на нее нажать, но отказаться выйти

Стратегии обработки перехода между словами

На данный момент локальный менеджер игры для перехода к следующему слову (очистки строки ввода и т.д.) требует после завершения слова нажать пробел для перехода к следующему, а сервер - нет. В результате консенсус между клиентом и сервером не достигается.

Сделать возможность реплея

На монкитайпе есть можность после игры посмотреть реплей: окошко с тем же текстом, в котором просто набирается текст по тем же таймингам.

Как можно реализовать: если статистика собирается на клиенте по всем нажатиям, то можно просто бахнуть еще туда поле со временем нажатия.

Что можно посмотреть: код манкитайпа.

Раскладки

Добавить хотябы dvorak, готов заняться утром

Статистика

Нужно реализовать серверную и клиентскую поддержку статистики. Я вижу статистику как 3 отдельных системы:

  1. Глобальная статистика. То есть статистика, собранная за много игр, доступная всегда. Концептуально делится на несколько частей, не думаю, что сложнее её хранить.
    • Статистика конкретного человека. Включает в себя количество запущенных/доигранных игр. Средний wpm, лучшие результаты. Последние игры. Можно посмотреть здесь
    • Статистика по словарю. Здесь можно просто табличку (на клиенте) вида пользователь/количество запусков/средний cpm/максимальный cpm.
  2. Послематчевый анализ. Здесь понятно, что хочется: смотреть на свои ошибки (что с чем перепутали), wpm, количество ошибок, смотреть на графики за каждый момент времени, возможно реплеи (#26), смотреть как остальные доехали.

Создание словарей

Сейчас у нас есть какое-то подобие словаря в #17 и #37. Надо бы убедиться, что мы хотим держать такой формат, и, если хотим, то надо доделать создание словарей + сделать какую-то базу.

  • Понять формат хранения словарей + API использования.
  • Сделать какой-то внутренний регистр(?) в БД.
  • Модифицировать Server::createGame.
  • Протянуть эту штуку в клиент.
  • Возможно, сделать локальную загрузку словарей на клиент для оффлайн-работы (пункт со звездочкой).

Отображение ошибок при наборе текста

Сейчас после неправильно набранного символа мы запрещаем переход к следующему слову.
Те любой набранный символ кроме backspace является ошибкой, но если набрать символ, который стоит на текущей позиции курсора, то он подсвечивается без ошибки. Эта "фича" перестает работать как доходим до первого пробела. Тут как минимум неконсистентность

Вариант решения: не проверять совпал ли набранный символ с тем, что должно быть, а просто красить в префикс начиная с последней ошибки, ровно как было в парсинге ошибок в окошке с текущим набранным словом

те видимо использовать check_prefix вместо check_symbol

Работа с Unicode на сервере

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

Сделать описание API

Нужно составить список всех методов API, инвариантов и т.д. для защиты проекта и удобства написания клиента. Я создам для этого API.md в develop.

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.