mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2026-01-17 08:32:39 +01:00
Create Pastebin.lua
This commit is contained in:
parent
38b1dc5616
commit
8931a0e970
378
Applications/Pastebin.lua
Normal file
378
Applications/Pastebin.lua
Normal file
@ -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")
|
||||
|
||||
--------------------------------------------------------------------------------------------------------------------------
|
||||
Loading…
x
Reference in New Issue
Block a user