diff --git a/Applications/Pastebin.lua b/Applications/Pastebin.lua new file mode 100644 index 00000000..bd9143f2 --- /dev/null +++ b/Applications/Pastebin.lua @@ -0,0 +1,378 @@ +local component = require("component") +local event = require("event") +local term = require("term") +local unicode = require("unicode") +local ecs = require("ECSAPI") +local fs = require("filesystem") +local shell = require("shell") +local internet = require("internet") +local context = require("context") +local xml = require("xmlParser") +local config = require("config") +-- local computer = require("computer") +-- local keyboard = require("keyboard") +-- local image = require("image") + +local gpu = component.gpu + +--//replace 1,3,12,11,13,7,16,15,14,582,56,73,166,165,21,167,168,228,229,10,11 0 + +-------------------------------------------------------------------------------------------------------------------------- + +local xSize, ySize = gpu.getResolution() +local centerX, centerY = math.floor(xSize / 2), math.floor(ySize / 2) + +local username = nil +local password = nil + +local userkey = nil +local devKey = "e98db6da803203282d172156bc46137c" +local pastebin_url = nil + +local isNotLoggedIn = true + +local pathToConfig = "System/Pastebin/Login.cfg" + +--МАССИВ СО ВСЕМИ ПАСТАМИ С ПАСТЕБИНА +local MyMassivWithPastes = {} +local drawPastesFrom = 1 + +-------------------------------------------------------------------------------------------------------------------------- + +-- --ЗАГРУЗИТЬ ФАЙЛ С ПАСТЕБИНА +-- local function get(pasteId, filename) +-- local f, reason = io.open(filename, "w") +-- if not f then +-- io.stderr:write("Failed opening file for writing: " .. reason) +-- return +-- end + +-- --io.write("Downloading from pastebin.com... ") +-- local url = "http://pastebin.com/raw.php?i=" .. pasteId +-- local result, response = pcall(internet.request, url) +-- if result then +-- --io.write("success.\n") +-- for chunk in response do +-- --if not options.k then +-- string.gsub(chunk, "\r\n", "\n") +-- --end +-- f:write(chunk) +-- end + +-- f:close() +-- --io.write("Saved data to " .. filename .. "\n") +-- else +-- --io.write("failed.\n") +-- f:close() +-- fs.remove(filename) +-- io.stderr:write("HTTP request failed: " .. response .. "\n") +-- end +-- end + +-- This makes a string safe for being used in a URL. +local function encode(code) + if code then + code = string.gsub(code, "([^%w ])", function (c) + return string.format("%%%02X", string.byte(c)) + end) + code = string.gsub(code, " ", "+") + end + return code +end + +-- --ЗАПУСТИТЬ ПРОЖКУ +-- local function run(pasteId, ...) +-- local tmpFile = os.tmpname() +-- get(pasteId, tmpFile) + +-- ecs.prepareToExit() + +-- local success, reason = shell.execute(tmpFile, nil, ...) +-- ecs.prepareToExit() +-- if not success then +-- print("Ошибка при выполнении программы. Причина:") +-- print(" ") +-- print(reason) +-- else +-- print("Программа выполена успешно! Нажмите любую клавишу, чтобы продолжить.") +-- end +-- fs.remove(tmpFile) + +-- event.pull("key_down") + +-- end + +-- --ЗАГРУЗИТЬ ФАЙЛ НА ПАСТЕБИН +-- local function put() +-- local file = fs.open(filename,"r") +-- local sName = fs.getName( filename ) +-- local sText = file.readAll() +-- file.close() + +-- local devKey = "0ec2eb25b6166c0c27a394ae118ad829" +-- local response = http.post( +-- "http://pastebin.com/api/api_post.php", +-- "api_option=paste&".. +-- "api_dev_key="..devKey.."&".. +-- "api_user_key="..userkey.."&".. +-- "api_paste_private=0&".. +-- "api_paste_format=lua&".. +-- "api_paste_name="..textutils.urlEncode(sName).."&".. +-- "api_paste_code="..textutils.urlEncode(sText) +-- ) + +-- if response then +-- local sResponse = response.readAll() +-- response.close() +-- local sCode = string.match( sResponse, "[^/]+$" ) +-- return sCode +-- else +-- return false +-- end +-- end + +--ЗАЛОГИНИТЬСЯ В АККАУНТ +local function loginToAccount(username, password) + + --print("Логинюсь в пастебине... ") + local result, response = pcall(internet.request, + "http://pastebin.com/api/api_login.php", + "api_dev_key="..devKey.. + "&api_user_name="..username.. + "&api_user_password="..password + ) + + if result then + --print("Запрос на пастебин пришел!") + local info = "" + for chunk in response do + info = info .. chunk + end + if string.match(info, "^Bad API request, ") then + --io.write(info) + return false, info + --ЕСЛИ ВСЕ ЗАЕБОК + else + --print("Получен юзеркей!") + userKey = info + --print("Вот так оно выглядит: "..info) + return true + end + else + --print("Хуйня произошла. Либо URL неверный, либо пастебин недоступен.\n") + --io.stderr:write(response) + return false, response + end + +end + +--ЗАГРУЗКА СПИСКА ФАЙЛОВ +local function getFileListFromPastebin(countOfFilesToShow) + local result, response = pcall(internet.request, + "http://pastebin.com/api/api_post.php", + "api_dev_key="..devKey.. + "&api_user_key="..userKey.. + "&api_results_limit="..countOfFilesToShow.. + "&api_option=list" + ) + + --КИНУТЬ ОШИБКУ, ЕСЛИ ЧЕТ НЕ ТАК + if not result then io.stderr:write( response ) end + + --ПРОЧИТАТЬ ОТВЕТ С СЕРВЕРА ПАСТЕБИНА + local info = "" + for chunk in response do + info = info .. chunk + end + + --РАСПАСИТЬ ХМЛ + local x = xml.collect(info) + + --ЗАХУЯРИТЬ МАССИВ С ПАСТАМИ + MyMassivWithPastes = {} + for pasteID = 1, #x do + MyMassivWithPastes[pasteID]={} + MyMassivWithPastes[pasteID]["paste_key"] = x[pasteID][1][1] + MyMassivWithPastes[pasteID]["paste_date"] = x[pasteID][2][1] + MyMassivWithPastes[pasteID]["paste_title"] = x[pasteID][3][1] + MyMassivWithPastes[pasteID]["paste_size"] = x[pasteID][4][1] + MyMassivWithPastes[pasteID]["paste_expire_date"] = x[pasteID][5][1] + MyMassivWithPastes[pasteID]["paste_private"] = x[pasteID][6][1] + MyMassivWithPastes[pasteID]["paste_format_long"] = x[pasteID][7][1] + MyMassivWithPastes[pasteID]["paste_format_short"] = x[pasteID][8][1] + MyMassivWithPastes[pasteID]["paste_url"] = x[pasteID][9][1] + MyMassivWithPastes[pasteID]["paste_hits"] = x[pasteID][10][1] + end +end + +local function convertUnixTime(time) + local govno = time + 62167144220 + local year = math.floor(govno/31556926) + local ostatok = govno % 31556926 + local month = math.ceil(ostatok/2629743) + ostatok = ostatok % 2629743 + local day = math.ceil(ostatok/86400)+2 + return day,month,year +end + +local xPos, yPos +local widthTitle +local widthOthers +local xDate +local xDownloads +local xSyntax + +local function displayPaste(i, background) + --Нарисовать цветной кружочек + local color = ecs.colors.green + if tonumber(MyMassivWithPastes[i]["paste_private"]) == 1 then + color = ecs.colors.red + end + ecs.colorText(xPos, yPos, color, "●") + color = nil + + --Нарисовать имя пасты + ecs.colorText(xPos + 2, yPos, 0x000000, ecs.stringLimit("end", MyMassivWithPastes[i]["paste_title"], widthTitle - 3)) + + --Нарисовать дату пасты + local day, month, year = convertUnixTime(tonumber(MyMassivWithPastes[i]["paste_date"])) + gpu.set(xDate, yPos, day.."."..month.."."..year) + + --Нарисовать Хитсы + gpu.set(xDownloads, yPos, MyMassivWithPastes[i]["paste_hits"]) + + --Нарисовать формат + gpu.set(xSyntax, yPos, MyMassivWithPastes[i]["paste_format_long"]) +end + +--Нарисовать пасты +local function displayPastes(from, to) + + --Стартовые коорды + xPos, yPos = 2, 6 + + --Размеры таблицы + widthTitle = math.floor((xSize - 2) / 2) + widthOthers = math.floor((xSize - 2 - widthTitle) / 3) + xDate = xPos + widthTitle + xDownloads = xDate + widthOthers + xSyntax = xDownloads + widthOthers + + --Цвет фона на нужный сразу + gpu.setBackground(0xffffff) + + --Стартовая инфотаблица - ну, имя там, размер, дата и прочее + ecs.colorText(xPos, yPos, 0x990000, "Имя") + gpu.set(xDate, yPos, "Дата") + gpu.set(xDownloads, yPos, "Скачиваний") + gpu.set(xSyntax, yPos, "Синтакс") + + ecs.colorText(1, yPos + 1, 0x990000, string.rep("─", xSize - 2)) + yPos = yPos + 2 + + --Все пасты рисуем + for i = from, to do + + displayPaste(i, 0xffffff) + + --Нарисовать разделитель + ecs.colorText(1, yPos + 1, 0x999999, string.rep("─", xSize - 2)) + + yPos = yPos + 2 + end +end + +local function getRandomCifri(length) + local cifri = "" + for i = 1, length do + cifri = cifri .. tostring(math.random(0, 1)) + end + return cifri +end + +local function drawTopBar() + local tabColor1 = 0x103258 + local tabColor2 = 0x034879 + local tabTextColor = 0xffffff + + --Полосочки + ecs.square(1, 1, xSize, 1, tabColor1) + + gpu.setBackground(tabColor2) + gpu.setForeground( 0x023a61 ) + gpu.fill(1, 2, xSize, 3, "⁕") + + ecs.square(1, 5, xSize, 1, tabColor1) + + --Листочек + local sheetWidth = 6 + gpu.setForeground(0x000000) + gpu.setBackground(0xffffff) + + gpu.set(2, 2, getRandomCifri(sheetWidth)) + gpu.set(3, 3, getRandomCifri(sheetWidth)) + gpu.set(4, 4, getRandomCifri(sheetWidth)) + + --Надписи всякие + ecs.colorTextWithBack(2, 1, tabTextColor - 0x333333, tabColor1, "#1 paste tool since 2002") + ecs.colorTextWithBack(11, 3, tabTextColor, tabColor2, "PASTEBIN") + +end + +local function inputPassword() + local massiv = ecs.input("auto", "auto", 20, "Войти в Pastebin", {"input", "Логин", ""}, {"input", "Пароль", ""}) + username = massiv[1] + password = massiv[2] +end + +local function analyseConfig() + if fs.exists(pathToConfig) then + local massiv = config.readAll(pathToConfig) + username = massiv.username + password = massiv.password + massiv = nil + else + fs.makeDirectory(fs.path(pathToConfig)) + inputPassword() + config.write(pathToConfig, "username", username) + config.write(pathToConfig, "password", password) + end +end + +local function waitForSuccessLogin() + while true do + + analyseConfig() + local success, reason = loginToAccount(username, password) + + if success then + break + else + if string.match(reason, "^Bad API request, ") then + reason = string.sub(reason, 18, -1) + end + + if reason == "invalid login" then fs.remove(pathToConfig); ecs.error("Неверное сочетание логин/пароль!") end + end + + end +end + +local function drawAll() + ecs.clearScreen(0xffffff) + drawTopBar() +end + + +-------------------------------------------------------------------------------------------------------------------------- + +drawAll() +waitForSuccessLogin() + +getFileListFromPastebin(10) + +displayPastes(1, 10) + +event.pull("key_down") + +--------------------------------------------------------------------------------------------------------------------------