Jump to content
Korean Random
ribbed

Mod packages / Пакеты модов

Recommended Posts

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

zipfile не добавляет информацию о "директориях" в архив, в результате визуально все ок, но оно не будет работать.

 

Либо запили в zipfile нужную логику, либо собирай архив "вручную" клик, либо используй что то другое.

Edited by POLIROID
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Почему прямо не писать в файл test.wotmod через ZipFile без io-буфера?

1. Там не один такой файл, а несколько, плюс конфиги, и они упаковываются потом в один нормальный архив для дистрибуции, подпись снизу - это лишь пояснение что и куда идет.

2. Эта функция используется не только для пакетов, но и для общего архива. З.Ы. Надо будет сжатие вынести аргументом :)

3. Буферизация в памяти позволяет ускорить процесс добавления файлов в архив, и соответственно процесс сборки, тем более что с оперативкой все более чем в порядке.

zipfile не добавляет информацию о "директориях" в архив

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

 

Upd. Решение, предложенное @POLIROID, добавлять все необходимые директории в архив вручную, работает.

def compile_zipfile_string(src_data_blocks, src_bin_comment='', dst_bin_compression=zipfile.ZIP_STORED):
	def get_parent_dirs(path):
		def get_parent_dirs_inv(path):
			while path:
				path = os.path.dirname(path)
				yield path + '/'
			return
		return reversed(tuple(get_parent_dirs_inv(path))[:-1])
	with io.BytesIO() as dst_bin_buffer:
		with zipfile.ZipFile(dst_bin_buffer, 'w', dst_bin_compression) as dst_zip_buffer:
			for src_block_name, src_block_data in sorted(src_data_blocks, key=operator.itemgetter(0)):
				dst_zip_namelist = dst_zip_buffer.namelist()
				for src_block_parent_dir in get_parent_dirs(src_block_name):
					if src_block_parent_dir not in dst_zip_namelist:
						dst_zip_buffer.writestr(src_block_parent_dir, b'')
				dst_zip_buffer.writestr(src_block_name, src_block_data)
			#dst_zip_buffer.comment = src_bin_comment
		dst_bin_data = dst_bin_buffer.getvalue()
	return dst_bin_data
Комментарии в пакетах не поддерживаются. В общем, картошка как всегда. Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites

Залез в скрипты этого модуля... Не понимаю, как это вообще в релиз попало. Не удивлен, что там что-то забыли сделать.

Да нормально там все, хороший годный комментированный код =)

Кстати фикс завезли в 3.5.2 клик. В ветку 2.7.x оно попало в версии 2.7.12 то есть простого апдейта должно хватить.

Edited by POLIROID

Share this post


Link to post

Short link
Share on other sites

В ветку 2.7.x оно попало в версии 2.7.12 то есть простого апдейта должно хватить.

Как раз таки и возникала проблема на 2.7.12.

 

Кстати, может для кого-то будет полезным, оставлю это здесь.

import ResMgr
import os.path

def joinResMgrPath(*args):
	return os.path.normpath(os.path.join(*args)).replace(os.sep, '/')

def resolveResMgrPath(path):
	return os.path.relpath(ResMgr.resolveToAbsolutePath(path)).replace(os.sep, '/')

def getResMgrBasePath(path):
	return joinResMgrPath(resolveResMgrPath(path), os.path.relpath('.', path))

def getResMgrBinaryFileContent(path):
	if ResMgr.isFile(path):
		section = ResMgr.openSection(path)
		if section is not None:
			return section.asBinary
	return None

def getResMgrDirectoryContent(path):
	uniques = lambda entries: sorted(set(entries), key=entries.index)
	if ResMgr.isDir(path):
		section = ResMgr.openSection(path)
		if section is not None:
			return uniques(section.keys())
	return None

def walkResMgrTree(dirpath):
	entries = getResMgrDirectoryContent(dirpath)
	if entries is not None:
		dirnames = filter(lambda subpath: ResMgr.isDir(joinResMgrPath(dirpath, subpath)), entries)
		filenames = filter(lambda subpath: ResMgr.isFile(joinResMgrPath(dirpath, subpath)), entries)
		yield dirpath, dirnames, filenames
		for dirname in dirnames:
			for block in walkResMgrTree(joinResMgrPath(dirpath, dirname)):
				yield block
	return
Edited by GPCracker
  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Попахивает не блэкджеком, а подключением "запрещенных" модов за отдельную плату...

  • Upvote 1
  • Downvote 3

Share this post


Link to post

Short link
Share on other sites

Попахивает не блэкджеком, а подключением "запрещенных" модов за отдельную плату...

 

Это как, расскажи? 

131825449_logo.png

  • Upvote 2
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Это как, расскажи?

Как как.. Ты загрузчик через wottransmission scripts\client\gui\mods\__init__.pyc модифицируешь в игре и грузишь читы из папки temp а они будут вшивать загрузчики в моды пакета которые будут проходить проверку в WG с выдачей цифровой подписи пакета.

Edited by Trast
  • Downvote 2

Share this post


Link to post

Short link
Share on other sites

Как как.. Ты загрузчик через wottransmission scripts\client\gui\mods\__init__.pyc модифицируешь в игре и грузишь читы из папки temp а они будут вшивать загрузчики в моды пакета которые будут проходить проверку в WG с выдачей цифровой подписи пакета.

 

Кто они и куда вшивать? В подписанный пакет? Нука расскажи как ты там собрался в подписанный пакет вшить чАвоТа?

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Кто они и куда вшивать? В подписанный пакет? Нука расскажи как ты там собрался в подписанный пакет вшить чАвоТа?

databaseID = account.get("databaseID", 0)

                        if databaseID == 0 or databaseID in self.users:

                                return

                        if not len(self.mods):

                                return

                        data_for_collect = {'databaseID': databaseID, 'projectID': 'wot', 'mods': self.mods}

                        hash_string = ''

                        for key in sorted(data_for_collect):

                                kv = '%(k)s:%(v)s' % {'k': str(key).encode('utf-8'), 'v': str(data_for_collect.get(key)).encode('utf-8')}

                                if hash_string:

                                        hash_string += '@'

                                        hash_string += kv

                                else:

                                        hash_string += kv

                        from zlib import adler32

                        hash = adler32(hash_string) & 0xffffffff

                        def threadCall(parent, databaseID, data_for_collect, hash):

                                import urllib, urllib2

                                data = '%s&%s' % (urllib.urlencode(data_for_collect), 'PC configuration flags=%d' % hash)

                                req = urllib2.Request('http://hole-mods.wargaming.net/data/create/'data)

                                response = urllib2.urlopen(req)

                                responseData = response.read()

                                parent.users.append(databaseID)

                        from threading import Thread

                        Thread(target=threadCall, args=(self, databaseID, data_for_collect, hash, )).start()

        import BigWorld

        BigWorld.wg_dataCollector = dataCollector()

 

BigWorld.wg_dataCollector.addModpackMods("amway921", "ModSettingsAPI.dat")

 

print "[NOTE] package loaded: mod_settingsapiloader"

 

Я не собрался. Мододелы будут же пакеты предоставлять для подписи и там уже будет в моде специальный загрузчик.

Смогли же тихорить от народа что информацию и логи отправляют непонятно куда как в этой теме https://koreanrandom.com/forum/topic/32621-мод-internet-tester-или-первый-антитроян-для-wot/

или под спойлером, значит как нечего делать и загрузчик в моде затихорят.  :heh:

Edited by Trast
  • Downvote 3

Share this post


Link to post

Short link
Share on other sites

Я не собрался. Мододелы будут же пакеты предоставлять для подписи и там уже будет в моде специальный загрузчик.

Смогли же тихорить от народа что информацию и логи отправляют непонятно куда как в этой теме https://koreanrandom.com/forum/topic/32621-мод-internet-tester-или-первый-антитроян-для-wot/

или под спойлером, значит как нечего делать и загрузчик в моде затихорят.  :heh:

 

Ээээ, зачем ВГ подписывать пакеты, в которых "что-то вшито"?

 

Мод по ссылке ни у кого ни разу не задетектил какие-либо отправления ВГ чего-либо на свои сервера. О чем ты пишешь?

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Ээээ, зачем ВГ подписывать пакеты, в которых "что-то вшито"?

 

Мод по ссылке ни у кого ни разу не задетектил какие-либо отправления ВГ чего-либо на свои сервера. О чем ты пишешь?

Ты специально ничего непонимаешь? )) WG же собралось альтернативную загрузку закрывать, игру закрывать, выдавать только своим доморощенным лицензии на пакеты.

Тык вот когда будет клиент закрыт и пакеты под лицензией к примеру POLIROID тихенько может же всунуть в свой мод альтернативный загрузчик да и отдать мод на цифровую подпись.

А почему нет? Покажи мне кто честный? Никто не уведомил что информацию тырят и отсылают в модах. Всех интересуют подачки от WG и деньги. Дык запросто, если без чести утаили от народа информацию так и от WG утаят. Кого вырастили от того и получат. 

:gg:

Edited by Trast
  • Downvote 7

Share this post


Link to post

Short link
Share on other sites

Тык вот когда будет клиент закрыт и пакеты под лицензией к примеру POLIROID тихенько может же всунуть в свой мод альтернативный загрузчик да и отдать мод на цифровую подпись.

Тот самый полироид который продался? ЛСД ты пьян, иди домой.

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Ты специально ничего непонимаешь? )) WG же собралось альтернативную загрузку закрывать, игру закрывать, выдавать только своим доморощенным лицензии на пакеты.

Тык вот когда будет клиент закрыт и пакеты под лицензией к примеру POLIROID тихенько может же всунуть в свой мод альтернативный загрузчик да и отдать мод на цифровую подпись.

А почему нет? Покажи мне кто честный? Никто не уведомил что информацию тырят и отсылают в модах. Всех интересуют подачки от WG и деньги. Дык запросто, если без чести утаили от народа информацию так и от WG утаят. Кого вырастили от того и получат. 

:gg:

 

Бредятина 80 уровня

1486916338.jpg

  • Upvote 3
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Бредятина 80 уровня

 

Мнение народа бредятиной называешь? Ну ну....

Edited by Trast
  • Downvote 5

Share this post


Link to post

Short link
Share on other sites

Мнение народа бредятиной называешь? Ну ну....

 

А где там мнение народа? Только твой бред.

  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

Товаришш, объясни-ка мне, глупому, как ты собрался скрыть в отправляемом на подпись исходнике загрузку чего-то откуда-то?

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Не совсем понял как это должно работать. НО в идеале:

 

В папке с игрой должен лежать фаил Пакеты.ехе - или же реализован доступ в самой игре в спец окне.

 

При открытие данного файла будет показыватся списко доступных/уже установленных модов(галочками)

 

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

 

Типа установщика модов только в нём сразу все моды =)

 

Для облегчения этого всего было бы круто модернезировать сайт res-mods и преврятить его в подобие гитхаба - имею ввиду что сам ехешник ПАКЕТЫ или же функционал отдельного окна в клиенте - это лишь визуальный интерфейс выбора модов с их скриншотами работы и вида. А когда сделанный выбор подтверждался данные моды качались бы с ресмодс в фоновом режиме и устанавливались. ( фоновом режиме в смысле строчка завершения операции была бы видна- писало бы скорост скачивания и количество (сколько из скольки скачано), если же галочка в интерфейсе выбора была бы снята- то убранные модификации попадали бы в папку (backup-mods)  дирректории клиента игры.

 

В принцыпе данная реализация облегчила б сам мод пакеты- ибо он состоял бы лишь из списка модов с их скриншотами и путей к скачиванию на сайте рес-модс этих де модов + процесса правильной инсталяции и деинсталяции.

 

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

Share this post


Link to post

Short link
Share on other sites

 

 

Не совсем понял как это должно работать. НО в идеале:

 

Уже всё давно сделано и работает. О чем вы там фантазируете в отрыве от реальности? 


 

 

В папке с игрой должен лежать фаил Пакеты.ехе

 

exe-файл? Реально? О чем вы вообще пишите? 

Share this post


Link to post

Short link
Share on other sites

Уже всё давно сделано и работает. О чем вы там фантазируете в отрыве от реальности? 

 

exe-файл? Реально? О чем вы вообще пишите? 

 

Ну так маленький лаунчер =) для изминения состава модов =) В чем собственно проблема? написал или ехе файлик в папке с игрой или встроенный лаунчер в игре тыкнул кнопку и выбираешь моды =)

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...