Это архив Вездекода 2022. Оригинальный репозиторий был скрыт. Пожалуйста, учтите, что это не production-ready решение, а всего лишь часть соответствующего задания на марафоне.
Imaginarium Game
Реализация игры "Имаджинариум" в формате чат-бота на VK API.
Установка
Ранее на Linux имелись специфические баги, связанные с кодировкой текста подсказок, из-за чего много чего ломалось. После фикса таких проблем вроде нет, поэтому я вношу Linux в список поддерживаемых устройств.
Поддерживаемые ОС
- Windows 7+
- Linux
Специфические зависимости
- MongoDB v3.0+
- Python 3.6+
- python modules
Процесс установки
Windows, Linux:
git clone https://github.com/nightadmin/imaginarium-game
cd imaginarium-game
Далее в конфиге config.json правим id паблика, токен паблика для longpoll, а также токен пользователя с правами photos. В поле allowed можно вписать свой id, и вы получите доступ к некоторым админским командам (например, я сделал удобную утилиту для собственной настройки меток на картинках для задания на 20 баллов). В исполняемых файлах имеет смысл добавить
import os
os.chdir("path/to/bot")
, чтобы не иметь проблем с чтением файлов (относительные адреса директорий) Теперь нужно установить и запустить MongoDB.
Linux (debian-based):
sudo apt install mongodb-org
Запуск через service init system (например, systemd) или просто:
mongod --port 3001 &
Windows: Требуется вручную установить MongoDB и добавить путь к файлу mongod.exe в PATH.
mongod --port 3001 &
Осталось подтянуть python-модули:
pip3 install pymongo
pip3 install vk_api
Можно запускать!
python3 main.py
Что это такое
Это бот с возможностью создавать свои команды, добавлять туда людей по инвайт-коду, исключать конкретных людей и разформировывать команду. В команде можно смотреть результаты участников, при этом результаты удаленных участников не удаляются, а помечаются плашкой "исключен", что позволяет видеть полную статистику. Есть одиночная игра (вызывается командой на баллы) с выбором источника картинок (заданный датасет, этот же датасет с нашими подписями, которые мы заставили расставлять фронтендера прошлой ночью и альбом VK). Выдается 5 картинок (в коде можно менять количество), и одно ключевое слово (гарантируется, что оно применимо только к одному изображению). Задача - отгадать и нажать на номер картинки. За правильный ответ дают 3 балла. PS! Все это работает и в мультиплеере! Также технически все готово к реализации игры с ведущим (на это даже можно найти ссылки в документах БД), но сделать все до конца я не успел.
Команды
- старт - выдать 5 случайных картинок из дефолтного датасета
- начать\хелп\помощь - приветственное сообщение
- на баллы - запуск одиночной игры на баллы с выбором источника
- создать команду [имя] (необязательный параметр) - создание команды и показ инвайт-кода
- присоединиться к [инвайт] - присоединиться к команде
- покинуть команду - все очевидно
- расформировать команду - удалить команду и кикнуть всех ее участников.
Утилита для переразметки
- настройка подписей локальных изображений - собственно, старт процесса. Бот проигнорует команду от человека, которого нет в allowed-листе конфига
- <...> - остальные команды висят на кнопочках Есть возможность пойти и отдохнуть пару часиков - бот хранит админские сессии и их прогресс в базе данных.
Как это работает?
Архитектура БД
Есть две коллекции - teams и teams_values (в MongoDB она users).
Оюъекты teams выглядят примерно так:
Поясню самое важное:
- game_state - текущее состояние игры. Там есть поле active - начата ли игра, а также users_state - перечисление всех когда-либо бывших людей в этой команде и их очки.
- personal - является ли игра одиночной. В частности, чтобы покинуть одиночную игру не требуется предупреждения.
- source (default, another, remote) - источник картинок. Если remote, то есть дополнительное поле с ссылкой на альбом.
- mode - тип игры (oneplayer, multiplayer, multiplayer+) - собственно, одиночная игра, мультиплеер или мультиплеер с ведущим. Вы могли заметить, что задание на 10 баллов (команда "старт") не реализована в виде игры - потому что она была создана гораздо раньше teams-коллекции да и просто неуместна в виде документа команды - коллекция команд была создана для учета очков, а тут их нет. Объекты teams_values это технические документы, которые соответствуют каждой команде или игроку и указывают, какие изображения исключены из списков - это список индексов в 1 задании и строки вида photo-123_456 в последующих. Они быстро вычитаются благодаря использованию множеств set.
Залитие своих датасетов и переразметка
Все изображения лежат в ./images/ и обязательно имеют автоматически инкрементированные имена с расширением .jpg. В этой папке лежат файлы words.txt и another_wordlist.txt. Они имеют вид:
1.jpg lorem ipsum dolor sit amet
2.jpg вездекод марафон вк
Между именем файла и ключевыми словами стоит символ \t, а между словами - пробел!
В файле words.txt в кодировке Win-1251 есть стандартные подписи ко всем файлам, доступные как источник default.
Файл another_wordlist.txt может наполняться через встроенную утилиту, производя собственную разметку фотографий. Эти подписи доступны как источник another.
Требуется, чтобы в файле источника все фотографии были размечены хотя бы одним ключевым словом, иначе работоспособность функции, использующей данный источник, не гарантируется.
Источник remote, ссылка на альбом VK
Альбом должен быть открытым и иметь количество фотографий с подписями не менее 5. Стоит отметить, что использование своих альбомов гораздо быстрее, чем любого из локальных источников.