/imaginarium-bot

VK Bot for Vezdekod hackathon (archived from 2022)

Primary LanguagePython

Это архив Вездекода 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 выглядят примерно так: team Поясню самое важное:

  • 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. Стоит отметить, что использование своих альбомов гораздо быстрее, чем любого из локальных источников.