Jump to content
Korean Random
GPCracker

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

Recommended Posts

это как?

примерно так

\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda

Share this post


Link to post

Short link
Share on other sites

 

примерно так

\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda

это потому что терминал кодировку не читает, а так то все норм (в орионе так же)

Edited by Ekspoint

Share this post


Link to post

Short link
Share on other sites

кодировка такая у меня

это потому что терминал кодировку не читает, а так то все норм (в орионе так же)

насколько удалось нагуглить, у питона вообще отдельные заморочки с кодировками, отличными от UTF-8 ? @GPCracker добавить в терминал реально или сложно? Edited by Kapany3uk

Share this post


Link to post

Short link
Share on other sites

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

Да, виноваты кодировки. Но юникод в терминале работает. Все по порядку, чтобы все поняли, в чем тут косяк и как делать не надо.

Лог файл пишется игрой в кодировке utf-8. Об этом написано в самом верху лога.

/------------------------------------------------------------------------------------------\
BigWorld WorldOfTanks 2.8.0 (compiled at 02:17:39 Mar 22 2016) starting on 04/15/16 19:20:49

INFO: [Config] Command line: C:/Games/World_of_Tanks/WorldOfTanks.exe C:\Games\World_of_Tanks\w_20160311_0146_france-F28_105_leFH18B2_07_lakeville.wotreplay
INFO: [Config] Default encoding set to utf-8
Открываем лог в Sublime и смотрим кодировку. Текст на русском, который написан в логе, закодирован в Windows-1251, а не UTF-8. Она и определяется как кодировка лога. В ней все видно нормально, текст читаем.

"Скрин 1"

post-21078-0-48158300-1460743151_thumb.jpg

Далее переключаем кодировку на UTF-8 (как должно быть) и вместо русских символов, как и ожидалось, видим знаки вопроса. Так видит этот лог перехватчик "терминала". Он не умеет определять кодировки г**на в логах, он считает что лог в кодировке UTF-8, т.к. разрабы игры его так определили.

"Скрин 2"

post-21078-0-25954800-1460743156_thumb.jpg

Теперь сделаем еще более веселую вещь - откроем этот файл в HEX. Найдем там нужное место, я его выделил.

"Скрин 3"

post-21078-0-29654500-1460743160_thumb.jpg

Длина 0х15==21, т.е. выделение заканчивается аккурат перед первой русской буквой в строке, а ее позиция в строке 21 ("[iNFO] " - это добавляет движок игры и притом только в лог в файле, в перехваченных логах этого нет, поэтому оно и не считается).

Следующий за выделением байт - 0xCA - как раз первая русская буква в строке.

Traceback (most recent call last):
    File "terminal/server.py", line 67, in __callmethod__
UnicodeDecodeError: 'utf8' codec can't decode byte 0xca in position 21: invalid continuation byte

Думаю теперь все поняли, откуда что взялось.

 

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

"Вот, кстати, бородатый пример с хабра"

самая жесть, когда у вас команда многонациональная...

 

var sousDomaine = sld + tld;

var sousDomaineDlina = sousDomaine.length;

 

Хех, «смешенье языков: французского с нижегородским» — тот самый случай.

 

А раз уж разрабы и добавили поддержку локализованных сообщений в логе, выставив там кодировку UTF-8 (кстати, оптимальное решение в том плане, что на UTF-8 можно закодировать любую локализацию), то ее нужно соблюдать, а не кодировать текст в свободной форме. Лог - это, *****, текстовый файл, а никак не бинарный, он должен быть единообразен в плане кодировки. Если каждый начнет использовать свою - ничего хорошего не выйдет.

 

Вообще, от локализации много проблем... Только вы начинаете использовать что-либо кроме латиницы, сразу вылезает проблема с кодировками и процессом кодирования. Это в питоне все нормально реализовано. Такое встречается далеко не во всех языках программирования. Хотя разные типы для текстовых и бинарных строк догадались запилить только в 3.х Python, однако.

Хотелка: Автоконнект к клиенту после его запуска.

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

Именно поэтому и запилена буферизация логов - чтобы логи сразу после старта тоже было видно.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

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

Именно поэтому и запилена буферизация логов - чтобы логи сразу после старта тоже было видно.

 

А если сигнал какой слать клиенту о том, что сервак запустился? 100500 раз запускать клиент (во время отладки модов, и так уже как мог упростил для себя это), а потом еще и тыкать чтоб оно законнектилось - больно.

Edited by IzeBerg

Share this post


Link to post

Short link
Share on other sites

А если сигнал какой слать клиенту о том, что сервак запустился?

С сигналом проблематично, не позволяет система организации соединения. Максимум можно сделать dead-loop, т.е. периодично "долбиться" на нужный адрес/порт, но непонятно пока, как оно себя поведет... Или как вариант что-то типа port-scan, но на питоне такое вряд ли получится запилить. Будет время - подумаю.

 

Если прям так реально напрягает, попробуй запустить это в консоли Sublime.

D:\\autoconnect.py

## exec(open("D:\\autoconnect.py").read())

import time, threading

def connect_loop():
	while True:
		window.run_command("script_terminal_connect")
		time.sleep(5.0)

thread = threading.Thread(target=connect_loop, name='connect_loop')
thread.daemon = True
thread.start()
Скрипт будет просто методично раз в 5 сек. пытаться подключиться. Костыль конечно, но вроде работает.

Share this post


Link to post

Short link
Share on other sites

С сигналом проблематично, не позволяет система организации соединения. Максимум можно сделать dead-loop, т.е. периодично "долбиться" на нужный адрес/порт, но непонятно пока, как оно себя поведет... Или как вариант что-то типа port-scan, но на питоне такое вряд ли получится запилить. Будет время - подумаю.

 

Если прям так реально напрягает, попробуй запустить это в консоли Sublime.

D:\\autoconnect.py

## exec(open("D:\\autoconnect.py").read())

import time, threading

def connect_loop():
	while True:
		window.run_command("script_terminal_connect")
		time.sleep(5.0)

thread = threading.Thread(target=connect_loop, name='connect_loop')
thread.daemon = True
thread.start()
Скрипт будет просто методично раз в 5 сек. пытаться подключиться. Костыль конечно, но вроде работает.

 

Как вариант:

Запускать на Sublime сервер временный и слушать первое соединение, как только сервер на клиенте загрузится - клиент отстучит в Sublime и тот подконнектится к клиенту.

Хотя это тот еще костыль.

Edited by IzeBerg

Share this post


Link to post

Short link
Share on other sites

Запускать на Sublime сервер временный и слушать первое соединение, как только сервер на клиенте загрузится - клиент отстучит в Sublime и тот подконнектится к клиенту. Хотя это тот еще костыль.

Это не только костыль. Это еще нарушает логику системы. Все равно что к тебе будет гугл или яндекс коннектиться. Обычно именно ты к ним коннектишься. К тому же сетевая структура такова, что обратные коннекты не всегда возможны. Как пример - появление пассивного режима FTP. Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites

Удалось выбить немного времени под моды.

В связи с упаковкой скриптов картохи в архив, старые файловые хуки не работают, так как не могут прочитать оригинальные файлы.

Все остальное в полном порядке. Для восстановления работоспособности необходимо добавить код чтения файлов из архива... или распаковать скрипты.

Исправления в принципе уже есть, залью в репо после тестирования.

"Как вариант временного фикса, (для тех, кто в теме)"

# *************************
# Loading original module
# *************************
import os, marshal
#original_file = os.path.normpath(os.path.join('res/', __file__)).replace(os.sep, '/')
original_file = os.path.normpath(os.path.join(__file__)).replace(os.sep, '/')
#if not os.path.isfile(original_file):
#	raise IOError('Original file could not be found. Module loading impossible.')
###
import zipfile
with zipfile.ZipFile('./res/packages/scripts.pkg', 'r') as f:
	exec marshal.loads(f.read(original_file)[8:]) in target_globals
#with open(original_file, 'rb') as f:
#	exec marshal.loads(f.read()[8:]) in target_globals
Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites

Там есть тема под Notepad++?

Можно поискать, я тоже копался поначалу... как по мне, да, есть некоторый дискомфорт при переходе, однако даже оригинальная тема ST куда приятнее. Лично я особо не заморачиваюсь, мне и на стоковой норм. Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites

Лично я особо не заморачиваюсь, мне и на стоковой норм.

Это реальная проблема.

У меня не очень яркий дисплей для темной темы :(

Share this post


Link to post

Short link
Share on other sites

У меня не очень яркий дисплей для темной темы :(

А мне белый по глазам как-то слишком сильно бьет, особенно в вечернее время...

Если тебе нужна просто белая тема - там таких наверняка вагон.

Ставишь PackageControl, через него все находишь. Там ЕМНИП есть даже какая-то превьюшка для тем, динамически подменяет в реалтайме при скроллинге по списку.

Share this post


Link to post

Short link
Share on other sites

@GPCracker, а может и правда пересесть на сублим...

Там есть тема под Notepad++?

есть тема под npp, даже две. Искать надо на сайте "онлайн редактирования тем" для ST (если не нагуглишь, вечером кину ссылку, сейчас не у компа)

Единственное, что меня выбешивает на ST это регулярные сбои bar-а в котором проекты/папки и тормоза (а иногда и вылеты) при многострочном редактировании/выделении...

Npp в этом отношении стабильнее (имхо)

 

upd тут выкладывал ссылку на тему npp в ST3

Edited by Kapany3uk

Share this post


Link to post

Short link
Share on other sites

Приветствую! Такая вот проблема... Ошибки в терминал не все летят, то есть в логе они присутствуют, а в терминале тю-тю. Как это может быть?

Share this post


Link to post

Short link
Share on other sites

Приветствую! Такая вот проблема... Ошибки в терминал не все летят, то есть в логе они присутствуют, а в терминале тю-тю. Как это может быть?

Не ну я не Ванга, так что давай пример, что отваливается, будем смотреть.

И еще. Если ошибку дает C-код, то перехват на уровне питона невозможен. А хавать лог-файл бесполезно - он флашится с определенным интервалом, и получается местами довольно существенная задержка между событием и логом.

Несколько первых сообщений чисто технически съесть нельзя - они выводятся до запуска питона C-ной частью.

Share this post


Link to post

Short link
Share on other sites

Не ну я не Ванга, так что давай пример, что отваливается, будем смотреть.

И еще. Если ошибку дает C-код, то перехват на уровне питона невозможен. А хавать лог-файл бесполезно - он флашится с определенным интервалом, и получается местами довольно существенная задержка между событием и логом.

Несколько первых сообщений чисто технически съесть нельзя - они выводятся до запуска питона C-ной частью.

По подробней расскажу...

допустим есть ошибка в коде, при вызове команды в мире, в терминале не пишет ошибку, а в python.log появляется при этом без проблем, я не говорю о старте клиента, когда не возможен перехват, ну или он запоздалый, а тогда когда уже в трене или  в бою.

 

P.S. хотелка...

Возможно ли при коннекте чтоб в терминал копировался весь текст питон лога?  Так в теории можно увидеть то что в трансмитер не попало... Это как раз по этому "Несколько первых сообщений чисто технически съесть нельзя - они выводятся до запуска питона C-ной частью."

Edited by akey

Share this post


Link to post

Short link
Share on other sites

допустим есть ошибка в коде, при вызове команды в мире, в терминале не пишет ошибку, а в python.log появляется при этом без проблем, я не говорю о старте клиента, когда не возможен перехват, ну или он запоздалый, а тогда когда уже в трене или  в бою.

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

Возможно ли при коннекте чтоб в терминал копировался весь текст питон лога?  Так в теории можно увидеть то что в трансмитер не попало... Это как раз по этому "Несколько первых сообщений чисто технически съесть нельзя - они выводятся до запуска питона C-ной частью."

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

Получение данных из файла python.log - задача абсолютно нетривиальная. Ибо опять напомню что flush python.log дело такое... Без подкопа под C-часть игры /костылей вряд ли получится. А под C копать... Так это по сути сразу перехват туда переводить.

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

Вообще вывод логов у картофана вещь такая... странная малость. Зачем-то часть логов выводят из питона через сишный интерфейс.

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