Система дебага с возможностью отправить отчет об ошибке лично мне

This commit is contained in:
Igor Timofeev
2016-07-11 13:46:14 +03:00
parent 3ef4739bf0
commit 8dbb0e98d7
4 changed files with 300 additions and 264 deletions

View File

@@ -1183,148 +1183,6 @@ function ecs.inputText(x, y, limit, cheBiloVvedeno, background, foreground, just
end
end
--Функция парсинга сообщения об ошибке. Конвертирует из строки в массив и переводит на русский.
function ecs.parseErrorMessage(error, translate)
local parsedError = {}
--ПОИСК ЭНТЕРОВ
local starting, ending, searchFrom = nil, nil, 1
for i = 1, unicode.len(error) do
starting, ending = string.find(error, "\n", searchFrom)
if starting then
table.insert(parsedError, unicode.sub(error, searchFrom, starting - 1))
searchFrom = ending + 1
else
break
end
end
--На всякий случай, если сообщение об ошибке без энтеров вообще, т.е. однострочное
if #parsedError == 0 and error ~= "" and error ~= nil and error ~= " " then
table.insert(parsedError, error)
end
--Замена /r/n и табсов
for i = 1, #parsedError do
parsedError[i] = string.gsub(parsedError[i], "\r\n", "\n")
parsedError[i] = string.gsub(parsedError[i], " ", " ")
end
if translate then
for i = 1, #parsedError do
parsedError[i] = string.gsub(parsedError[i], "interrupted", "Выполнение программы прервано пользователем")
parsedError[i] = string.gsub(parsedError[i], " got ", " получена ")
parsedError[i] = string.gsub(parsedError[i], " expected,", " ожидается,")
parsedError[i] = string.gsub(parsedError[i], "bad argument #", "Неверный аргумент #")
parsedError[i] = string.gsub(parsedError[i], "stack traceback", "Отслеживание ошибки")
parsedError[i] = string.gsub(parsedError[i], "tail calls", "Дочерние вызовы")
parsedError[i] = string.gsub(parsedError[i], "in function", "в функции")
parsedError[i] = string.gsub(parsedError[i], "in main chunk", "в основной программе")
parsedError[i] = string.gsub(parsedError[i], "unexpected symbol near", "неожиданный символ рядом с")
parsedError[i] = string.gsub(parsedError[i], "attempt to index", "пытаюсь получить значение индекса массива")
parsedError[i] = string.gsub(parsedError[i], "attempt to get length of", "не удается получить длину")
parsedError[i] = string.gsub(parsedError[i], ": ", ", ")
parsedError[i] = string.gsub(parsedError[i], " module ", " модуль ")
parsedError[i] = string.gsub(parsedError[i], "not found", "не найден")
parsedError[i] = string.gsub(parsedError[i], "no field package.preload", "не найдена библиотека")
parsedError[i] = string.gsub(parsedError[i], "no file", "нет файла")
parsedError[i] = string.gsub(parsedError[i], "local", "локальной")
parsedError[i] = string.gsub(parsedError[i], "global", "глобальной")
parsedError[i] = string.gsub(parsedError[i], "no primary", "не найден компонент")
parsedError[i] = string.gsub(parsedError[i], "available", "в доступе")
parsedError[i] = string.gsub(parsedError[i], "attempt to concatenate", "не могу присоединить")
parsedError[i] = string.gsub(parsedError[i], "a nil value", "переменная равна nil")
end
end
starting, ending = nil, nil
return parsedError
end
--Отображение сообщения об ошибке компиляции скрипта в красивом окошке.
function ecs.displayCompileMessage(y, reason, translate, withAnimation)
local xSize, ySize = gpu.getResolution()
--Переводим причину в массив
reason = ecs.parseErrorMessage(reason, translate)
--Получаем ширину и высоту окошка
local width = math.floor(xSize * 7 / 10)
local textWidth = width - 11
reason = ecs.stringWrap(reason, textWidth)
local height = #reason + 6
--Просчет вот этой хуйни, аааахаахах
local difference = ySize - (height + y)
if difference < 0 then
for i = 1, (math.abs(difference) + 1) do
table.remove(reason, #reason)
end
table.insert(reason, "")
height = #reason + 6
end
local x = math.floor(xSize / 2 - width / 2)
--Иконочка воскл знака на красном фоне
local errorImage = {
{{0xff0000,0xffffff,"#"},{0xff0000,0xffffff,"#"},{0xff0000,0xffffff," "},{0xff0000,0xffffff,"#"},{0xff0000,0xffffff,"#"}},
{{0xff0000,0xffffff,"#"},{0xff0000,0xffffff," "},{0xff0000,0xffffff,"!"},{0xff0000,0xffffff," "},{0xff0000,0xffffff,"#"}},
{{0xff0000,0xffffff," "},{0xff0000,0xffffff," "},{0xff0000,0xffffff," "},{0xff0000,0xffffff," "},{0xff0000,0xffffff," "}}
}
--Запоминаем, че было отображено
local oldPixels
local function drawCompileMessage(y)
ecs.square(x, y, width, height, ecs.windowColors.background)
ecs.windowShadow(x, y, width, height)
--Рисуем воскл знак
ecs.drawCustomImage(x + 2, y + 1, errorImage)
--Рисуем текст
local yPos = y + 1
local xPos = x + 9
gpu.setBackground(ecs.windowColors.background)
ecs.colorText(xPos, yPos, ecs.windowColors.usualText, "Код ошибки:")
yPos = yPos + 2
gpu.setForeground( 0xcc0000 )
for i = 1, #reason do
gpu.set(xPos, yPos, reason[i])
yPos = yPos + 1
end
yPos = yPos + 1
ecs.colorText(xPos, yPos, ecs.windowColors.usualText, ecs.stringLimit("end", "Нажмите любую клавишу, чтобы продолжить", textWidth))
end
--Типа анимация, ога
if withAnimation then
oldPixels = ecs.rememberOldPixels(x, 1, x + width + 1, height + 1)
for i = -height, 1, 1 do
drawCompileMessage(i)
os.sleep(0.01)
end
else
oldPixels = ecs.rememberOldPixels(x, y, x + width + 1, y + height)
drawCompileMessage(y)
end
--Пикаем звуком кароч
for i = 1, 3 do
computer.beep(1000)
end
--Ждем сам знаешь чего
ecs.wait()
--Рисуем, че было нарисовано
ecs.drawOldPixels(oldPixels)
end
--Спросить, заменять ли файл (если таковой уже имеется)
function ecs.askForReplaceFile(path, includeForAllButton)
local cyka = {