Jump to content
Korean Random
GPCracker

WoT Script Terminal - отладка Python скриптов для WoT в Sublime Text 3.

Recommended Posts

WoT Script Terminal - отладка Python скриптов для WoT в Sublime Text 3.

post-21078-0-58176100-1448985665.png
Автор: GPCracker
Версия клиента: 0.9.12

Описание:
WoT Script Terminal предназначен для запуска и отладки Python скриптов для World of Tanks. Состоит из двух частей - серверной, являющейся модом для World of Tanks, и клиентской, плагина для Sublime Text 3. Коммуникация между компонентами осуществляется посредством TCP Stream Socket.
Важно:
Приложение находится в стадии разработки, поэтому не исключены различные ошибки и баги.
Как это работает:
Серверная часть принимает от клиентской скрипт, выполняет его, перехватывает логи и передает их на клиент. Клиентов может быть несколько, в таком случае любой может запускать скрипт в своем потоке, а логи будут получать все. Также возможно удаленное подключение с другого компьютера. Скрипты из редактора в WoT передаются простейшими пакетами, логи из WoT в Sublime Text - в открытом виде, т.е. текстом. Это позволяет использовать утилиты типа netcat для получения логов (однако попытка что-либо отправить приведет к ошибке). При отправке и получении логов используется построчная буферизация и чтение.
Установка:
Установка стандартная. Мод распаковать в папку с игрой, загрузчики скачиваются отдельно, если они вам необходимы. Плагин необходимо скопировать в папку 'Installed Packages', её расположение может быть различным в зависимости от операционной системы. Соответствующие инструкции Вы можете найти на форуме Sublime Text.
Настройка:
Плагин настраивается стандартным для Sublime Text 3 образом, через файлы конфигурации. Эти файлы могут быть открыты для редактирования вручную или через соответствующие пункты меню. Переключатели некоторых настроек вынесены в отдельные пункты меню.
Как скачать:
Стабильные версии вы можете скачать на GitHub (releases) в собранном виде. Версию, нахоящуюся в разработке или тестировании необходимо скачивать в виде исходников и собирать самостоятельно. Для сборки проекта необходимо запустить buildIt.py WoT-совместимым Python. В результате сборки в директории release появляются два файла - архив со скриптами для WoT (мод) и упакованный плагин для Sublime Text 3.
Замечания автора:
Разработка плагина ведется на *nix системе, отладка сервера осуществляется через Python-консоль. На Windows тестируется только WoT-зависимый код. Поэтому в dev-версиях не исключены ошибки связанные с особенностями Windows.
Исходники: GitHub (code)
Бинарники: GitHub (releases)
FAQ:

Файлы

Папка lib: общие файлы, используемые клиентом и сервером, WoT-независимый код.
Папка wot: код запуска сервера и перехвата логов BigWorld.
Папка plugin: код плагина и код запуска клиента, файлы настроек плагина.

"Настройка плагина"

Добавить пункты в меню, горячие клавиши на действия и т.д. можно отредактировав соответствующие файлы в папке Packages/User. Все эти действия являются стандартными для Sublime Text 3 и подробно расписаны на форуме. Список публичных команд можно посмотреть в файлах конфигурации плагина, скачав исходники или непосредственно в репозитории. Для выполнения этих действий не требуется пересобирать плагин.

"Что такое локали и save_locals"

Каждый скрипт выполняется в некоторой среде. Builtin-функции globals() и locals() возвращают текущую среду выполения. Все создаваемы скриптом переменные сохраняются в словарях (mapping-объектах) среды выполнения скрипта. Это поведение подробно расписано в документации к Python. Каждый клиент при подключении получает свою среду для выполения передаваемых им скриптов. Это предотвращает коллизии, когда несколько клиентов используют одинаковые имена переменных, при этом создаваемые одним клиентом переменные другому не видны. При переподключении клиент получает чистую среду, т.е. теряет доступ ко всем созданным им переменным. Для предотвращения подобного явления каждый клиент при запуске (инициализация плагина, запуск Sublime Text) генерирует уникальный идентификатор (UUID), который при активации функции save_locals передается на сервер, при этом его среда сохраняется под этим идентификатором. При переподключении с этим же UUID клиент получает доступ к сохраненной среде. В таком случае сброс среды происходит при перезапуске клиента (Sublime Text) или сервера (WoT), либо при ручной очистке вызовом globals().clear().

"За что отвечает функция fetch_logs"

Запуск сервера происходит сразу после запуска WoT, однако подключение к нему клиента происходит позже. За это время в логе появляются важные сообщения о результатах загрузки модов и т.д. Сервер буферизует лог, что позволяет любому клиенту в любое время получить логи за все время работы сервера. Параметр отвечает за автоматическое выполнение одноименной функции при подключении к серверу. Тем не менее, ее можно запустить вручную в любое время.

"Удаленное подключение"

Для удаленного подключения к WoT необходимо изменить настройки сервера таким образом, чтобы он принимал подключения с нужного интерфейса. По умолчанию он слушает только localhost (127.0.0.1), это сделано из соображений безопасности. Изменив адрес сервера на IP нужного интерфейса, или оставив в качестве адреса пустую строку, можно добавить необходимый, или все доступные интерфейсы в список прослушиваемых. Подробнее можно прочитать в документации к Python socket, т.к. адрес и порт сервера передаются напрямую в параметры серверного сокета.

Благодарности:
За помощь в разработке и тестировании автор выражает благодарность: <место зарезервировано>

Предложения и пожелания (чего добавить/удалить/исправить):
<место зарезервировано>
Edited by GPCracker
  • Upvote 10
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Вспомнилось: Лавры известности Nero не дают покоя многим

 

Sublime3 еще не пробовал(Total: USD $70), поэтому хочется скриншотов)

 

Пытался я за PyCharm спросить(может кто-то проверит с WoT-Python'ом)...

 

без Orion теперь можно?

Если не считать, что без Ориона всегда было можно)))

Обфускатор и протекор Ориона есть и останется только в Орионе(ни разу не пользовался ими).

 

на *nix системе

Какой именно? Интересно же)

 

@GPCracker, Ваш энтузиазм в XVM бы направить)

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

И чем он мощнее Notepad'а?

на python пишешь?на нем можно писать плагины для Sublime. Так Sublime с ними адский комбайн

 

 

Интересно узнать про #pragma once, она есть в гайдлайнах по C++?

http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards  pragma против include guards

Edited by BrainRegress

Share this post


Link to post

Short link
Share on other sites

на нем можно писать плагины для Sublime

Ну ок! Убедил. Плагины быстрее писать на Python, чем на C++ Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

Sublime3 еще не пробовал(Total: USD $70), поэтому хочется скриншотов)

Эээ я под Debian запилил

sudo apt-get install sublime-text
И все. Никаких USD.

Под винду танцев поболе, но тоже робит. Ибо WoT-код с нее тестил. Правил файлик через sublime и с него же тестил одновременно)))

Edited by GPCracker
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

И все. Никаких USD.

Но...

Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use.

Потом вылезет окошко, нежданно...

Share this post


Link to post

Short link
Share on other sites

Потом вылезет окошко, нежданно...

Не знаю. У меня ничего не вылазило. Да и ключики валяются в инете. А лицуха по сути дает тебе красивую надпись в эбаут. Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites
Установка:
Установка стандартная. Мод распаковать в папку с игрой, загрузчики скачиваются отдельно, если они вам необходимы. Плагин необходимо скопировать в папку 'Installed Packages', её расположение может быть различным в зависимости от операционной системы. Соответствующие инструкции Вы можете найти на форуме Sublime Text.
Настройка:
Плагин настраивается стандартным для Sublime Text 3 образом, через файлы конфигурации. Эти файлы могут быть открыты для редактирования вручную или через соответствующие пункты меню. Переключатели некоторых настроек вынесены в отдельные пункты меню.

Будьте добры, распишите более подробно эти пункты. Заранее благодарен.

Share this post


Link to post

Short link
Share on other sites

Будьте добры, распишите более подробно эти пункты. Заранее благодарен.

Ну как ставится мод для WoT - думаю понятно. Где какие загрузчики положить и на каких версиях (там в зависимости от коммита) думаю разберешься сам. Тем более, это отладчик для разработки Python модов, думаю если ты собираешься их писать, наверняка понимаешь, как оно работает))). Как ставить плагины для ST - тоже ничего сложного. Просто закинуть файлик плагина (ну у него прямо расширение файла само за себя говорит) в папочку "%appdata%\Sublime Text 3\Installed Packages", если на винде. На линуксах тоже ничего сложного, путь сходу не напишу, но есть одноименная папка... В ~/.config/ вроде. Иногда даже без перезапуска ST подгружается.

Что касаемо настройки - у ST есть файлы конфигурации. Подробнее можно прочитать на форуме ST... Да и вообще на многих ресурсах это расписано. Нужные файлики открываются по клику через меню, формат JSON. Там и хоткеи можно поставить, и настройки поменять. Ничего необычного или специфичного. В том и прикол ST. Все пилотируется привычным образом. Там даже настройки плагина через API ST читаются)))

Приложение в стадии разработки, сейчас правда занят другими проектами, но есть список функционала для реализации и список чего пофиксить. По той же причине писать доки пока рановато. И по этой же самой причине собирается все пока руками. Релиз (собранный проект, бинарники) будут когда допилю до стабильного и достаточно функционального состояния.

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

 

И по этой же самой причине собирается все пока руками. Релиз (собранный проект, бинарники) будут когда допилю до стабильного и достаточно функционального состояния.

 

Разобрался, запустил, работаю :)

Из исходников на гит собрал WoTScriptTerminal.sublime-package, закинул в "Sublime Text 3\Data\Installed Packages" и вуаля всё пашет.

В остальном ровно то что я и просил однажды на Орионе, и за что Вам огромное спасибо, что идея все же реализовалась, слияние нотепада с редактором, Ваше воплощение то что как раз и хотелось видеть в редакторе, даже лучше, это много-вкладочность, соответственно в одном приложении есть возможность запуска нескольких скриптов и редакция их!

Несколько пожеланий...

Добавьте пожалуйста выгрузку скрипта в терминале. Или объясните как правильно делать релоад. На "лету" я так понимаю пока нет возможности реализации?

И второе, это Increase и Decrease Indent.

Share this post


Link to post

Short link
Share on other sites

Добавьте пожалуйста выгрузку скрипта в терминале. Или объясните как правильно делать релоад.

Перезагрузку файла с диска? Самой команды я не нашел, но есть хитрый трюк. Закрываешь файл, потом выбираешь Open Recent/Reopen closed file.

Возможно я неправильно понял вопрос. Если так - можно чутка по-подробнее.

И второе, это Increase и Decrease Indent.

View/Indentation.

Share this post


Link to post

Short link
Share on other sites

Перезагрузку файла с диска? Самой команды я не нашел, но есть хитрый трюк. Закрываешь файл, потом выбираешь Open Recent/Reopen closed file.

Возможно я неправильно понял вопрос. Если так - можно чутка по-подробнее.

View/Indentation.

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

P.S. А в редакторе есть на подобие как в нотепаде плагин компаре?

Share this post


Link to post

Short link
Share on other sites

P.S. А в редакторе есть на подобие как в нотепаде плагин компаре?

Compare вряд ли, но есть генераторы diff. У ST есть нативная поддержка формата, что прикольно при работе с Git. Ставишь себе Package Control руками, все остальное ставится из репо через него (ну еще кроме моего плагина, он тоже ставится руками).

А вообще из плагинов у меня стоит FileDiffs (про который ты спросил), JSONLint (ошибки показывает, те же конфиги ST править), Show Character Code (код символа) и TrailingSpaces (пробельные символы в конце строки, Git их не любит). Насчет тем и остального пока не заморачивался.

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

Я понял. Тут есть один важный момент. Как мне не раз раньше говорили, пирог нужно есть по кускам. И код дебажить тоже нужно по кускам, а не все сразу. Для отладки кусков кода никакая выгрузка обычно не нужна. Тем более если работаешь с классами - заводишь реплей, ставишь на паузу, создаешь в отладчике экземпляр класса, пинаешь его аккуратно руками, смотришь, чтобы все было ок, а уже потом только вешаешь хуки и все остальное.

Прикол весь в том, что локальная среда будет перегружена при след. запуске скрипта, старые значения переменных будут удалены, но вот ссылки на объекты скрипта искать по всему питону игры (в принципе можно запустить вообще на любом питоне (не в плане версии), я тесты через консоль гоняю, если мне конкретно танки не нужны) не самая крутая идея, потому что нативных способов поиска ссылок на объекты не предусмотрено, а хук выгрузить может только тот, кто его туда загружал, и то при условии, что следом кто еще хук не впилил, ибо нужно найти ссылку на свою функцию, а неизвестно кто и куда ее скоммуниздить успел, и подменить ее на функцию-оригинал, т.е. изначальный вариант перед хуком, нетривиальная задача, короче. Иными словами, хук проще сделать с флагом активности, чем выдирать его оттуда, а поскольку функция еще и immutable объект... Задача явно нетривиальная. В принципе форматнуть локальную среду можно вызвав globals().clear(). Но на внешние ссылки (хуки и т.д.) это никак не повлияет. Хотя почистит все локальные переменные.

Подытожу немного. Нормальным образом полностью выгрузить модуль невозможно, из-за сложности поиска ссылок на него и восстановления состояния до импорта модуля. Особая проблема - это хуки. Поэтому пытаться сделать то, что ты предлагаешь, не совсем правильное решение. Правильнее будет вообще не прибегать к таким методам отладки. Изначально нужно правильно писать код. Чтобы большая его часть могла отлаживаться вообще без танков, половина от остатка - тестируется в ручном режиме через отладчик, а в автоматическом остатке чтобы в принципе было нечего дебажить. Не, есть конечно моменты, когда вне танков запустить не вариант, иногда даже в реплее не вариант, приходится методично создавать треню на маскимальные 30 минут с твинком..., но отлаживать код кусками в ручном режиме можно почти всегда. Надеюсь, я понятно объяснил суть вопроса.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
Я понял. Тут есть один важный момент. Как мне не раз раньше говорили, пирог нужно есть по кускам. И код дебажить тоже нужно по кускам, а не все сразу. Для отладки кусков кода никакая выгрузка обычно не нужна. Тем более если работаешь с классами - заводишь реплей, ставишь на паузу, создаешь в отладчике экземпляр класса, пинаешь его аккуратно руками, смотришь, чтобы все было ок, а уже потом только вешаешь хуки и все остальное. Прикол весь в том, что локальная среда будет перегружена при след. запуске скрипта, старые значения переменных будут удалены, но вот ссылки на объекты скрипта искать по всему питону игры (в принципе можно запустить вообще на любом питоне (не в плане версии), я тесты через консоль гоняю, если мне конкретно танки не нужны) не самая крутая идея, потому что нативных способов поиска ссылок на объекты не предусмотрено, а хук выгрузить может только тот, кто его туда загружал, и то при условии, что следом кто еще хук не впилил, ибо нужно найти ссылку на свою функцию, а неизвестно кто и куда ее скоммуниздить успел, и подменить ее на функцию-оригинал, т.е. изначальный вариант перед хуком, нетривиальная задача, короче. Иными словами, хук проще сделать с флагом активности, чем выдирать его оттуда, а поскольку функция еще и immutable объект... Задача явно нетривиальная. В принципе форматнуть локальную среду можно вызвав globals().clear(). Но на внешние ссылки (хуки и т.д.) это никак не повлияет. Хотя почистит все локальные переменные. Подытожу немного. Нормальным образом полностью выгрузить модуль невозможно, из-за сложности поиска ссылок на него и восстановления состояния до импорта модуля. Особая проблема - это хуки. Поэтому пытаться сделать то, что ты предлагаешь, не совсем правильное решение. Правильнее будет вообще не прибегать к таким методам отладки. Изначально нужно правильно писать код. Чтобы большая его часть могла отлаживаться вообще без танков, половина от остатка - тестируется в ручном режиме через отладчик, а в автоматическом остатке чтобы в принципе было нечего дебажить. Не, есть конечно моменты, когда вне танков запустить не вариант, иногда даже в реплее не вариант, приходится методично создавать треню на маскимальные 30 минут с твинком..., но отлаживать код кусками в ручном режиме можно почти всегда. Надеюсь, я понятно объяснил суть вопроса.

 

Кто тут такие сложные моды пишет? Обычного пробега по модулям с проверкой атрибутов должно хватать. Смотри wottranssmision.zip/module.py/rebuild_module

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Подытожу немного. Нормальным образом полностью выгрузить модуль невозможно, из-за сложности поиска ссылок на него и восстановления состояния до импорта модуля. Особая проблема - это хуки. Поэтому пытаться сделать то, что ты предлагаешь, не совсем правильное решение. Правильнее будет вообще не прибегать к таким методам отладки. Изначально нужно правильно писать код. Чтобы большая его часть могла отлаживаться вообще без танков, половина от остатка - тестируется в ручном режиме через отладчик, а в автоматическом остатке чтобы в принципе было нечего дебажить.

 

Спасибо за разъяснения, в целом всё понятно.

 

UPD.

 

File - Open Recent - Reopen closed file

Этот способ отличненько работает :)

Share this post


Link to post

Short link
Share on other sites

Кто тут такие сложные моды пишет? Обычного пробега по модулям с проверкой атрибутов должно хватать. Смотри wottranssmision.zip/module.py/rebuild_module

Я как-бы этот файл уже смотрел. Для человека, который знает, как оно работает, в деталях, чтобы учитывать особенности при использовании этого, такое обычно уже не особо интересно, ибо скилл в дебаге уже на нормальном уровне, да и тестирование ведется параллельно с разработкой, т.е. написал класс - протестировал класс, ибо это по времени займет меньше, чем потом отладка низкоуровневого бага на топовом уровне. А в конечной сборке обычно со 2-3 раза стартует нормально. Плюс часть хуков ставится на такие методы, которые запускаются при старте боя, и перегрузка модуля тут не поможет, все равно придется перезапускать реплей = клиент. А для человека который не шарит в алгоритме работы этой штуки и является по сути новичком, есть весьма нехилые шансы наткнуться на особенности кода сего хитрого финта и полдня искать баг Шредингера.

А вообще я не сторонник решений типа "так сойдет". Если делать, то делать надо нормально, чтоб без "дыр" и "подводных камней". Тем более что с зачисткой хуков та еще проблема.

ИМХО, объяснять потом народу особенности пилотирования данной штуки, все равно что учить юнгу управлять линкором в заминированном фарватере.

И насчет сложных модов... Посмотри код AAS 0.1.0, код XVM, к примеру... Там вообще хуки ставятся через декораторы и оригиналы сохраняются явно не глобальными переменными модулей.

Фича хоть и интересная, но довольно нестабильная и имеет достаточно сложный для понимания алгоритм работы. Изначально думал над реализацией чего-то подобного... Но точно не в таком виде. Только если через нативный для питона поиск ссылок на объекты, т.е. без каких-либо переборов неймспейсов модулей и т.д. Никакой инфы по этому поводу мне найти не удалось.

File - Open Recent - Reopen closed file Этот способ отличненько работает :)

Плагины на ST пишутся на чистом питоне 3.Х, точную версию можно получить нажав Ctrl+~ (появляется питон-консоль) и набрав god import sys; print sys.version;.

Ничего сложного там нет по сути. Так что можешь спокойно себе запилить плагин с кнопкой на релоад... Если он прям сильно нужен)) Хотя ИМХО проще назначить пару хоткеев, если их там нет (в чем сильно сомневаюсь) на закрытие и открытие последнего файла.

 

З.Ы. Надо будет запилить файлик автономного старта, чтоб без танков можно было юзать... Старт простого питона всяко быстрее))

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.

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...