- PVSM.RU - https://www.pvsm.ru -

Я играю в Heroes of Might and Magic со времен царя Гороха королевы Ламанды, и за это время накопилось такое количество карт для 3-х Героев, что я решил их как-то упорядочить и структурировать.
Цели были следующие:
Скриншоты кликабельные

Полный каталог карт
[1]
Работа с фильтрами. Здесь я отсортировал карты, в которые я не играл, версии SOD (The Shadow of Death), кодировка ascii, размер Extra Large, на картах есть подземелье, уровень сложности Impossible. Зеленая иконка — для загрузки карты из каталога на локальный компьютер.
[2]
Работа с картой, если нажать на иконку с ручкой. В модальном окне все очевидно и видно, когда я последний раз играл в эту карту.
[3]
Попытка загрузки карты, которая уже есть в каталоге.

И введите команду:
ifconfig
Увидите текущий IP.
А с помощью команды:
nmtui
Можно его зафиксировать, чтобы он не менялся, настроив статику.
Вбиваем этот адрес в браузер и попадем в органайзер со всеми картами, как на скриншотах.
Все это «хозяйство» написано на python3.
В качестве фреймворка выбрал Flask [6].
База данных: MongoDB.
Фронтенд: bootstrap3 и DataTables [7]
Парсить карту Heroes III можно с помощь стандартных python модулей: gzip и struct. Модуль gzip распаковывает файл, так как он хранится в сжатом виде. Модуль struct предлагает функцию unpack() для работы с форматами двоичных записей переменной длины, а функция calcsize возвращает размер структуры. Код «I» для четырех байтовых без знаковых чисел. Код "<" обозначает, что числа стандартного размера и байты записаны в порядке «сначала младший» (little-endian).
Нижеследующий код получает версию Героев у файла с именем Zyconia.h3m
>>> h3m_versions = {0x0E: "RoE", 0x15: "AB", 0x1C: "SoD", 0x33: "WoG"}
>>> import gzip
>>> import struct
>>> h3m_data = gzip.open('Zyconia.h3m')
>>> def r(s):
... return struct.unpack(s, h3m_data.read(struct.calcsize(s)))
...
>>> print(h3m_versions[r("<I")[0]])
RoE
Полный код парсера можно посмотреть на гитхабе.
Используя работу с двоичными данными я добрался до следующих данных:
Уникальный идентификатор для каждой карты (файла) посчитал обычным md5.
tmp = res['Version'] + res['underground'] + res['mapsize'] + res['name'].lower() + res['difficulty']
res['_id'] = hashlib.md5(str(tmp).encode('utf-8')).hexdigest()
Засунул в md5-хэш все данные, кроме описания, потому что в описание карты иногда добавляют название сайта, откуда ее скачали, и получится дубль, это одна из причин, почему нельзя просто взять и посчитать хэш сумму у файла с картой для проверки на уникальность.
Ссылка на гитхаб [8]
Автор: pcdesign
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/279976
Ссылки в тексте:
[1] Image: https://habrastorage.org/webt/ra/uy/tn/rauytnnyymolrsxxv95em1dzkhq.png
[2] Image: https://habrastorage.org/webt/ro/7k/ye/ro7kye3xazhnqjffzyq_ew_vivu.png
[3] Image: https://habrastorage.org/webt/re/-h/rw/re-hrw57pmdu3erwav25mydkpec.png
[4] Скачать с Dropbox 4,69GB: https://www.dropbox.com/s/mfswd8qas1yznvu/heroes3organaizer.zip
[5] VMware Workstation Player: https://www.vmware.com/products/workstation-player.html
[6] Flask: https://habr.com/post/346306/
[7] DataTables: https://datatables.net
[8] Ссылка на гитхаб: https://github.com/Alexmod/heroes3manager-maps
[9] Источник: https://habr.com/post/353484/?utm_campaign=353484
Нажмите здесь для печати.