Igor Timofeev ddc8ba107c aefaefaef
2016-03-31 09:16:10 +03:00

864 lines
31 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---------------------------------------------------- Библиотеки ----------------------------------------------------------------
local internet = require("internet")
local json = require("json")
local serialization = require("serialization")
local event = require("event")
local ecs = require("ECSAPI")
local fs = require("filesystem")
local buffer = require("doubleBuffering")
local context = require("context")
local image = require("image")
local unicode = require("unicode")
local component = require("component")
local computer = require("computer")
---------------------------------------------------- Константы ----------------------------------------------------------------
local VKAPIVersion = "5.50"
local colors = {
leftBar = 0x262626,
leftBarAlternative = 0x383838,
leftBarText = 0xFFFFFF,
leftBarSelection = 0x00A8FF,
leftBarSelectionText = 0xFFFFFF,
scrollBar = 0xCCCCCC,
scrollBarPipe = 0x666666,
mainZone = 0xFFFFFF,
senderCloudColor = 0x3392FF,
senderCloudTextColor = 0xFFFFFF,
yourCloudColor = 0x55BBFF,
yourCloudTextColor = 0xFFFFFF,
systemMessageColor = 0x555555,
dateTime = 0x777777,
loginGUIBackground = 0x002440,
topBar = 0x002440,
topBarText = 0xFFFFFF,
statusBar = 0x262626,
statusBarText = 0xAAAAAA,
audioPlayButton = 0x002440,
audioPlayButtonText = 0xFFFFFF,
messageInputBarColor = 0xEEEEEE,
messageInputBarTextBackgroundColor = 0xFFFFFF,
messsageInputBarTextColor = 0x262626,
}
local leftBarHeight = buffer.screen.height - 9
local leftBarWidth = math.floor(buffer.screen.width * 0.17)
local topBarHeight = 3
local mainZoneWidth = buffer.screen.width - leftBarWidth
local mainZoneHeight = buffer.screen.height - topBarHeight - 1
local mainZoneX = leftBarWidth + 1
local mainZoneY = topBarHeight + 1
local cloudWidth = math.floor(mainZoneWidth * 0.7)
-------------------------------------------------------------------------------------------------------------------------------
local VKLogoImagePath = "MineOS/Applications/VK.app/Resources/VKLogo.pic"
-- local leftBarElements = {"Новости", "Друзья", "Сообщения", "Настройки", "Выход"}
local leftBarElements = { "Сообщения", "Аудиозаписи", "Группы", "Выход" }
local currentLeftBarElement = 1
local personalInfo
local access_token
local whatIsOnScreen
local countOfDialogsToLoadFromServer = 10
local countOfAudioToLoadFromServer = 10
local countOfMessagesToLoadFromServer = 10
local dialogToShowFrom = 1
local audioToShowFrom = 1
local messageToShowFrom = 1
local dialogScrollSpeed = 5
local audioScrollSpeed = 5
local messagesScrollSpeed = 5
local currentMessagesPeerID, currentMessagesAvatarText, currentMessagesFullName
local dialogPreviewTextLimit = mainZoneWidth - 15
---------------------------------------------------- Веб-часть ----------------------------------------------------------------
--Объекты
local obj = {}
local function newObj(class, name, ...)
obj[class] = obj[class] or {}
obj[class][name] = {...}
end
--Дебаг-функция на сохранение говна в файл, МАЛО ЛИ ЧО
local function saveToFile(stro4ka)
local file = io.open("test.lua", "w")
file:write(stro4ka)
file:close()
end
--Модифицированная функция интернет-запросов, стандартная фу-фу-фу, ошибка на ошибке и HTTP Response Error погоняет!
--Заметка: переписать на компонетное API, в рот ебал автора либы. Хм, велосипеды?
local function request(url)
local data = ""
--Выполняем запрос на подключение
local success, response = pcall(internet.request, url)
--Если все ок, то делаем чтение из response, иначе выдаем ошибку, че не так с подключением
--(скорее всего, ошибка будет связана с отстутствием инета или неверными URL, которые ТЫ, СУКА, лично и вбиваешь в код)
if success then
while true do
--Делаем запрос на чтение из response
local success, reason = pcall(response)
--Если все ок, то идем дальше, иначе кидаем ошибку
--(скорее всего, это будет серверная ошибка, неверный пасс там, 404, бла-бла)
if success then
--Если конец response не достигнут, то записываем в data все, что пришло с сервака, иначе по съебкам!
if reason then
data = data .. reason
else
break
end
else
return false, reason
end
end
--Если все охуенно, то возвращаем true и преобразованный JSON-ответ в таблицу Lua
return true, json:decode(data)
else
return false, response
end
end
--Отправляем запрос на авторизацию по логину и паролю
local function getLoginDataRequest(username, password)
local url = "https://oauth.vk.com/token?grant_type=password&client_id=3697615&client_secret=AlVXZFMUqyrnABp8ncuU&username=" .. username .. "&password=" .. password .. "&v=" .. VKAPIVersion
return request(url)
end
--Запрос к методам VK API
local function VKAPIRequest(method, ... )
local arguments = { ... }
local stringArguments = ""
local url = "https://api.vk.com/method/" .. method .. "?" .. table.concat(arguments, "&") .. "&access_token=" .. access_token .. "&v=" .. VKAPIVersion
return request(url)
end
--Запрос на получение списка диалогов
local function getDialogsRequest(fromDialog, count)
return VKAPIRequest("messages.getDialogs", "offset=" .. fromDialog, "count=" .. count, "preview_length=" .. dialogPreviewTextLimit)
end
--Запрос на получение списка диалогов
local function getMessagesRequest(peerID, fromMessage, count)
return VKAPIRequest("messages.getHistory", "offset=" .. fromMessage, "count=" .. count, "peer_id=" .. peerID)
end
--Запрос на получение списка музычки
local function getAudioRequest(id, fromAudio, count)
return VKAPIRequest("audio.get", "offset=" .. fromAudio, "count=" .. count, "owner_id=" .. id, "need_user=1")
end
--Эта хуйня делает строку охуенной путем замены говна на конфетку
local function optimizeStringForURLSending(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 optimizeStringForWrongSymbols(s)
--Удаляем некорректные символы
s = string.gsub(s, " ", " ")
s = string.gsub(s, "\r\n", "\n")
s = string.gsub(s, "\n", "")
--Заменяем "широкие" двухпиксельные символы на знак вопроса
local massiv = {}
for i = 1, unicode.len(s) do
massiv[i] = unicode.sub(s, i, i)
if unicode.isWide(massiv[i]) then massiv[i] = "?" end
end
--Возвращаем оптимизрованную строку
return table.concat(massiv)
end
local function convertIDtoPeerID(whatIsThisID, ID)
if whatIsThisID == "user" then
return ID
elseif whatIsThisID == "chat" then
return (2000000000 + ID)
elseif whatIsThisID == "group" then
return -ID
end
end
local function getPeerIDFromMessageArray(messageArray)
local peerID
--Если это чат
if messageArray.users_count then
peerID = convertIDtoPeerID("chat", messageArray.chat_id)
--Или если это диалог с группой какой-то
elseif messageArray.user_id < 0 then
peerID = convertIDtoPeerID("group", messageArray.user_id)
--Или если просто какой-то сталкер-одиночка
else
peerID = convertIDtoPeerID("user", messageArray.user_id)
end
return peerID
end
--Запрос на отправку сообщения указанному пидору
local function sendMessageRequest(peerID, message)
--Делаем строчку не пидорской
message = optimizeStringForURLSending(message)
return VKAPIRequest("messages.send", "peer_id=" .. peerID, "message=" .. message)
end
local function usersInformationRequest(...)
return VKAPIRequest("users.get", "user_ids=" .. table.concat({...}, ","), "fields=city,bdate,online,status,last_seen,followers_count")
end
---------------------------------------------------- GUI-часть ----------------------------------------------------------------
local function createAvatarHashColor(hash)
return math.abs(hash % 0xFFFFFF)
end
local function drawAvatar(x, y, user_id, text)
local avatarColor = createAvatarHashColor(user_id)
local textColor = avatarColor > 8388607 and 0x000000 or 0xFFFFFF
buffer.square(x, y, 6, 3, avatarColor, textColor, " ")
buffer.text(x + 2, y + 1, textColor, unicode.upper(text))
end
--Проверка клика в определенную область по "объекту". Кому на хуй вссалось ООП?
local function clickedAtZone(x, y, zone)
if x >= zone[1] and y >= zone[2] and x <= zone[3] and y <= zone[4] then
return true
end
return false
end
--Интерфейс логина в аккаунт ВК, постараюсь сделать пографонистей
--Хотя хах! Кого я обманываю, ага
local function loginGUI(startUsername, startPassword)
local background = 0x002440
local buttonColor = 0x666DFF
local textColor = 0x262626
local username, password = startUsername or "E-Mail или номер телефона", startPassword or "Пароль"
local textFieldWidth = 50
local textFieldHeight = 3
local x, y = math.floor(buffer.screen.width / 2 - textFieldWidth / 2), math.floor(buffer.screen.height / 2 - 3)
local obj = {}
obj.username = {x, y, x + textFieldWidth - 1, y + 2}; y = y + textFieldHeight + 1
obj.password = {x, y, x + textFieldWidth - 1, y + 2}; y = y + textFieldHeight + 1
obj.button = {x, y, x + textFieldWidth - 1, y + 2}
local VKLogoImage = image.load(VKLogoImagePath)
local function draw()
buffer.clear(colors.loginGUIBackground)
buffer.image(x + 5, obj.username[2] - 15, VKLogoImage)
buffer.square(x, obj.username[2], textFieldWidth, 3, 0xFFFFFF, 0x000000, " ")
buffer.square(x, obj.password[2], textFieldWidth, 3, 0xFFFFFF, 0x000000, " ")
buffer.text(x + 1, obj.username[2] + 1, textColor, ecs.stringLimit("end", username, textFieldWidth - 2))
buffer.text(x + 1, obj.password[2] + 1, textColor, ecs.stringLimit("end", string.rep("", unicode.len(password)), textFieldWidth - 2))
buffer.button(x, obj.button[2], textFieldWidth, textFieldHeight, buttonColor, 0xFFFFFF, "Войти")
buffer.draw()
end
while true do
draw()
local e = {event.pull()}
if e[1] == "touch" then
if clickedAtZone(e[3], e[4], obj.username) then
username = ""
username = ecs.inputText(x + 1, obj.username[2] + 1, textFieldWidth - 2, username, 0xFFFFFF, 0x262626) or ""
elseif clickedAtZone(e[3], e[4], obj.password) then
password = ""
password = ecs.inputText(x + 1, obj.password[2] + 1, textFieldWidth - 2, password, 0xFFFFFF, 0x262626, false, "*") or ""
elseif clickedAtZone(e[3], e[4], obj.button) then
buffer.button(x, obj.button[2], textFieldWidth, textFieldHeight, 0xFFFFFF, buttonColor, "Войти")
buffer.draw()
os.sleep(0.2)
draw()
local success, loginData = getLoginDataRequest(username, password)
if success then
return loginData
else
ecs.error("Неверный пароль!" .. tostring(loginData))
end
end
end
end
end
---------------------------------------------------- GUI для взаимодействия с VK API ----------------------------------------------
local function drawPersonalAvatar(x, y)
drawAvatar(x, y, personalInfo.id, unicode.sub(personalInfo.first_name, 1, 1) .. unicode.sub(personalInfo.last_name, 1, 1))
end
local function status(text)
buffer.square(mainZoneX, buffer.screen.height, mainZoneWidth, 1, colors.statusBar)
buffer.text(mainZoneX + 1, buffer.screen.height, colors.statusBarText, text)
buffer.draw()
end
local function drawTopBar(text)
buffer.square(mainZoneX, 1, mainZoneWidth, 3, colors.topBar)
local x = math.floor(mainZoneX + mainZoneWidth / 2 - unicode.len(text) / 2 - 1)
buffer.text(x, 2, colors.topBarText, text)
end
--Рисуем главную зону
local function clearGUIZone()
buffer.square(mainZoneX, mainZoneY, mainZoneWidth, mainZoneHeight, colors.mainZone)
end
local function drawEmptyCloud(x, y, cloudWidth, cloudHeight, cloudColor, fromYou)
local upperPixel = ""
local lowerPixel = ""
--Рисуем финтифлюшечки
if not fromYou then
buffer.set(x, y - cloudHeight + 2, colors.mainZone, cloudColor, upperPixel)
buffer.set(x + 1, y - cloudHeight + 2, cloudColor, 0xFFFFFF, " ")
x = x + 2
else
buffer.set(x + cloudWidth + 3, y - cloudHeight + 2, colors.mainZone, cloudColor, upperPixel)
buffer.set(x + cloudWidth + 2, y - cloudHeight + 2, cloudColor, 0xFFFFFF, " ")
end
--Заполняшечки
buffer.square(x + 1, y - cloudHeight + 1, cloudWidth, cloudHeight, cloudColor, 0xFFFFFF, " ")
buffer.square(x, y - cloudHeight + 2, cloudWidth + 2, cloudHeight - 2, cloudColor, 0xFFFFFF, " ")
--Сгругленные краешки
buffer.set(x, y - cloudHeight + 1, colors.mainZone, cloudColor, lowerPixel)
buffer.set(x + cloudWidth + 1, y - cloudHeight + 1, colors.mainZone, cloudColor, lowerPixel)
buffer.set(x, y, colors.mainZone, cloudColor, upperPixel)
buffer.set(x + cloudWidth + 1, y, colors.mainZone, cloudColor, upperPixel)
return y - cloudHeight + 1
end
local function stringWrap(text, limit)
local strings = {}
local textLength = unicode.len(text)
local subFrom = 1
while subFrom <= textLength do
table.insert(strings, unicode.sub(text, subFrom, subFrom + limit - 1))
subFrom = subFrom + limit
end
return strings
end
local function drawTextCloud(x, y, cloudColor, textColor, fromYou, text)
local y = drawEmptyCloud(x, y, cloudWidth, #text + 2, cloudColor, fromYou)
x = fromYou and x + 2 or x + 4
for i = 1, #text do
buffer.text(x, y + i, textColor, text[i])
end
return y
end
local function getAttachments(messageArray)
local text = "Вложения: "
for j = 1, #messageArray.attachments do
if messageArray.attachments[j].type == "sticker" then
text = text .. "стикер, "
elseif messageArray.attachments[j].type == "photo" then
text = text .. "фото, "
elseif messageArray.attachments[j].type == "video" then
text = text .. "видео, "
elseif messageArray.attachments[j].type == "audio" then
text = text .. "аудио, "
elseif messageArray.attachments[j].type == "wall" then
text = text .. "запись на стене, "
end
end
text = unicode.sub(text, 1, -3)
return text
end
local function drawMessageInputBar(currentText)
local x, y = mainZoneX, buffer.screen.height - 5
obj.messageInputBar = { x, y, x + mainZoneWidth - 7, y + 2}
buffer.square(x, y, mainZoneWidth, 5, colors.messageInputBarColor)
buffer.square(x + 2, y + 1, mainZoneWidth - 4, 3, colors.messageInputBarTextBackgroundColor)
buffer.text(x + 4, y + 2, colors.messsageInputBarTextColor, ecs.stringLimit("start", currentText or "Введите сообщение", mainZoneWidth - 8))
end
local function getUserNamesFromMessagesArray(messagesArray)
local usersToGetNames = {}
for i = 1, #messagesArray do
if messagesArray[i].user_id and messagesArray[i].user_id > 0 then
table.insert(usersToGetNames, messagesArray[i].user_id)
end
end
local success, usersData = usersInformationRequest(table.unpack(usersToGetNames))
if success and usersData.response then
for i = 1, #messagesArray do
if messagesArray[i].user_id and messagesArray[i].user_id > 0 then
for j = 1, #usersData.response do
if usersData.response[j].id == messagesArray[i].user_id then
messagesArray[i].first_name = usersData.response[j].first_name
messagesArray[i].last_name = usersData.response[j].last_name
end
end
end
end
end
return messagesArray
end
local function messagesGUI()
local success, messages = getMessagesRequest(currentMessagesPeerID, messageToShowFrom - 1, countOfMessagesToLoadFromServer)
if success and messages.response then
whatIsOnScreen = "messages"
if currentMessagesPeerID > 2000000000 then
status("Загружаю имена пользователей из переписки (актуально для конференций)")
messages.response.items = getUserNamesFromMessagesArray(messages.response.items)
end
clearGUIZone()
drawTopBar("Диалог с \"" .. currentMessagesFullName .. "\"")
saveToFile(serialization.serialize(messages))
buffer.setDrawLimit(mainZoneX, mainZoneY, mainZoneWidth, mainZoneHeight)
local y = buffer.screen.height - 7
local xSender = mainZoneX + 2
local xYou = buffer.screen.width - 7
for i = 1, #messages.response.items do
local messageTextArray = {}
if messages.response.items[i].body ~= "" then table.insert(messageTextArray, optimizeStringForWrongSymbols(messages.response.items[i].body)) end
if messages.response.items[i].fwd_messages then table.insert(messageTextArray, "Пересланные сообщения") end
if messages.response.items[i].attachments then table.insert(messageTextArray, getAttachments(messages.response.items[i])) end
messageTextArray = ecs.stringWrap(messageTextArray, cloudWidth - 4)
local peerID = getPeerIDFromMessageArray(messages.response.items[i])
--Делаем дату пиздатой
-- messages.response.items[i].date = os.date("%d.%m.%y в %X", messages.response.items[i].date)
messages.response.items[i].date = os.date("%H:%M", messages.response.items[i].date)
if messages.response.items[i].out == 1 then
y = drawTextCloud(xYou - cloudWidth - 6, y, colors.yourCloudColor, colors.yourCloudTextColor, true, messageTextArray)
drawPersonalAvatar(xYou, y)
buffer.text(xYou - cloudWidth - unicode.len(messages.response.items[i].date) - 8, y + 1, colors.dateTime, messages.response.items[i].date)
else
y = drawTextCloud(xSender + 8, y, colors.senderCloudColor, colors.senderCloudTextColor, false, messageTextArray)
drawAvatar(xSender, y, peerID, messages.response.items[i].first_name and (unicode.sub(messages.response.items[i].first_name, 1, 1) .. unicode.sub(messages.response.items[i].last_name, 1, 1)) or currentMessagesAvatarText)
buffer.text(xSender + cloudWidth + 14, y + 1, colors.dateTime, messages.response.items[i].date)
end
y = y - 2
end
local currentText
drawMessageInputBar(currentText)
status("История переписки загружена, ожидаю ввода сообщения")
buffer.resetDrawLimit()
-- buffer.draw()
end
end
--У-у-у, господи, какие же уроды! Вроде такое охуенное вк апи, а пиздец!
--Крч, эта функция получает имена юзеров по их айдишникам и загоняет их
--в массив вместо title.
--Собсна, нахуя? ДА ПОТОМУ ЧТО dialogs возвращают только ID юзеров с историей
--сообщений, а не их имя. Ну, а имена КОНФ нормас пишутся. Что за бред?
--Идите на хуйЙ!!!!!! КОСТЫЛЕЕБСТВО
local function getUserNamesFromDialogArray(dialogs)
local usersToGetNames = {}
for i = 1, #dialogs.response.items do
if dialogs.response.items[i].message.user_id and dialogs.response.items[i].message.user_id > 0 then
table.insert(usersToGetNames, dialogs.response.items[i].message.user_id)
end
end
local success, usersData = usersInformationRequest(table.unpack(usersToGetNames))
if success and usersData.response then
for i = 1, #dialogs.response.items do
if not dialogs.response.items[i].message.chat_id then
for j = 1, #usersData.response do
if usersData.response[j].id == dialogs.response.items[i].message.user_id then
dialogs.response.items[i].message.title = usersData.response[j].first_name .. " " .. usersData.response[j].last_name
end
end
end
end
end
return dialogs
end
local function drawDialog(y, dialogBackground, avatarID, avatarText, text1, text2, text3)
--Рисуем подложку под диалог нужного цвета
buffer.square(mainZoneX, y, mainZoneWidth, 5, dialogBackground)
--Рисуем аватарку, чо уж
drawAvatar(mainZoneX + 2, y + 1, avatarID, avatarText)
--Пишем все, что нужно
y = y + 1
if text1 then buffer.text(mainZoneX + 10, y, 0x000000, text1); y = y + 1 end
if text2 then buffer.text(mainZoneX + 10, y, 0x555555, text2); y = y + 1 end
if text3 then buffer.text(mainZoneX + 10, y, 0x666666, text3); y = y + 1 end
end
local function dialogsGUI()
local success, dialogs = getDialogsRequest(dialogToShowFrom - 1, countOfDialogsToLoadFromServer)
if success and dialogs.response then
-- saveToFile(serialization.serialize(dialogs))
whatIsOnScreen = "dialogs"
obj.dialogList = {}
clearGUIZone()
drawTopBar("Сообщения")
buffer.draw()
--НУ ТЫ ПОНЯЛ, АГА
status("Получаю имена пользователей по ID")
dialogs = getUserNamesFromDialogArray(dialogs)
local y = mainZoneY
local avatarText = ""
local peerID
local color
for i = 1, #dialogs.response.items do
--Ебемся с цветами
if dialogs.response.items[i].unread then
if i % 2 == 0 then
color = 0xCCDBFF
else
color = 0xCCDBFF
end
else
if i % 2 == 0 then
color = 0xEEEEEE
else
color = 0xFFFFFF
end
end
--Рисуем пиздюлинку, показывающую кол-во непрочитанных сообщений
if dialogs.response.items[i].unread and dialogs.response.items[i].unread ~= 0 then
local cyka = tostring(dialogs.response.items[i].unread)
local cykaWidth = unicode.len(cyka) + 2
local cykaX = buffer.screen.width - cykaWidth - 4
buffer.square(cykaX, y + 2, cykaWidth, 1, ecs.colors.blue)
buffer.text(cykaX + 1, y + 2, 0xFFFFFF, cyka)
end
avatarText = unicode.sub(dialogs.response.items[i].message.title, 1, 2)
peerID = getPeerIDFromMessageArray(dialogs.response.items[i].message)
--Ебля с текстом диалога
local text1 = dialogs.response.items[i].message.title
local text2
local text3
--Если это банальное сообщение
if dialogs.response.items[i].message.body and dialogs.response.items[i].message.body ~= "" then
text2 = optimizeStringForWrongSymbols(dialogs.response.items[i].message.body)
end
--Если есть какие-либо пересланные сообщения, то
if dialogs.response.items[i].message.fwd_messages then
text3 = "Пересланные сообщения"
--Если есть какие-либо вложения, то
elseif dialogs.response.items[i].message.attachments then
text3 = getAttachments(dialogs.response.items[i].message)
end
--Рисуем диалог
drawDialog(y, color, peerID, avatarText, text1, text2, text3)
newObj("dialogList", i, mainZoneX, y, mainZoneX + mainZoneWidth - 1, y + 4, peerID, avatarText, text1, text2, text3)
y = y + 5
end
end
status("Список диалогов получен")
end
local function audioGUI(ID)
local success, audios = getAudioRequest(ID, audioToShowFrom - 1, countOfAudioToLoadFromServer)
if success and audios.response then
whatIsOnScreen = "audio"
obj.audio = {}
clearGUIZone()
drawTopBar("Аудиозаписи " .. audios.response.items[1].name_gen)
local y = mainZoneY
local color
for i = 2, #audios.response.items do
color = 0xFFFFFF
if i % 2 == 0 then color = 0xEEEEEE end
buffer.square(mainZoneX, y, mainZoneWidth, 5, color)
buffer.button(mainZoneX + 2, y + 1, 5, 3, colors.audioPlayButton, colors.audioPlayButtonText, "")
newObj("audio", i, mainZoneX + 2, y + 1, mainZoneX + 7, y + 3, audios.response.items[i].url)
local x = mainZoneX + 9
buffer.text(x, y + 1, colors.audioPlayButton, audios.response.items[i].artist)
x = x + unicode.len(audios.response.items[i].artist)
buffer.text(x, y + 1, 0x000000, " - " .. audios.response.items[i].title)
x = mainZoneX + 9
local hours = string.format("%02.f", math.floor(audios.response.items[i].duration / 3600))
local minutes = string.format("%02.f", math.floor(audios.response.items[i].duration / 60 - (hours * 60)))
local seconds = string.format("%02.f", math.floor(audios.response.items[i].duration - hours * 3600 - minutes * 60))
buffer.text(x, y + 2, 0x555555, "Длительность: " .. hours .. ":" .. minutes .. ":" .. seconds)
y = y + 5
end
end
end
--Главное ГУИ с левтбаром и прочим
local function mainGUI()
--Подложка под элементы
buffer.square(1, 1, leftBarWidth, buffer.screen.height, colors.leftBar, 0xFFFFFF, " ")
if personalInfo then
drawPersonalAvatar(3, 2)
buffer.text(11, 3, 0xFFFFFF, ecs.stringLimit("end", personalInfo.first_name .. " " .. personalInfo.last_name, leftBarWidth - 11))
end
--Элементы
obj.leftBar = {}
local y, color = 6
for i = 1, #leftBarElements do
color = colors.leftBarAlternative
if i % 2 == 0 then color = colors.leftBar end
if i == currentLeftBarElement then color = colors.leftBarSelection end
newObj("leftBar", i, 1, y, leftBarWidth, y + 2)
buffer.square(1, y, leftBarWidth, 3, color, 0xFFFFFF, " ")
y = y + 1
buffer.text(3, y, colors.leftBarText, ecs.stringLimit("end", leftBarElements[i], leftBarWidth - 4))
y = y + 2
end
if leftBarElements[currentLeftBarElement] == "Сообщения" then
status("Получаю список диалогов")
messageToShowFrom = 1
dialogToShowFrom = 1
dialogsGUI()
elseif leftBarElements[currentLeftBarElement] == "Аудиозаписи" then
status("Получаю список аудозаписей")
audioToShowFrom = 1
audioGUI(personalInfo.id)
end
buffer.draw()
end
---------------------------------------------------- Старт скрипта ----------------------------------------------------------------
--Инициализируем библиотеку двойного буффера
--Эх, что бы я делал, если б не накодил ее? 0.2 фпс на GPU мертвеца!
buffer.start()
--Активируем форму логина
local loginData = loginGUI("igor_timofeev@me.com", "13131313")
access_token = loginData.access_token
--Получаем персональные данные
_, personalInfo = usersInformationRequest(loginData.user_id)
personalInfo = personalInfo.response[1]
--Активируем главное GUI
clearGUIZone()
mainGUI()
while true do
local e = {event.pull()}
if e[1] == "touch" then
if whatIsOnScreen == "audio" then
for key in pairs(obj.audio) do
if clickedAtZone(e[3], e[4], obj.audio[key]) then
buffer.button(obj.audio[key][1], obj.audio[key][2], 5, 3, 0x66FF80, colors.audioPlayButton, "")
buffer.draw()
os.sleep(0.2)
buffer.button(obj.audio[key][1], obj.audio[key][2], 5, 3, colors.audioPlayButton, colors.audioPlayButtonText, "")
buffer.draw()
if component.isAvailable("openfm_radio") then
component.openfm_radio.stop()
component.openfm_radio.setURL(obj.audio[key][5])
component.openfm_radio.start()
else
ecs.error("Эта функция доступна только при наличии установленного мода OpenFM, добавляющего полноценное интернет-радио")
end
break
end
end
end
if whatIsOnScreen == "dialogs" then
for key in pairs(obj.dialogList) do
if clickedAtZone(e[3], e[4], obj.dialogList[key]) then
drawDialog(obj.dialogList[key][2], 0xFF8888, obj.dialogList[key][5], obj.dialogList[key][6], obj.dialogList[key][7], obj.dialogList[key][8], obj.dialogList[key][9])
buffer.draw()
os.sleep(0.2)
status("Загружаю переписку с пользователем " .. obj.dialogList[key][7])
currentMessagesPeerID = obj.dialogList[key][5]
currentMessagesAvatarText = obj.dialogList[key][6]
currentMessagesFullName = obj.dialogList[key][7]
messagesGUI()
break
end
end
end
if whatIsOnScreen == "messages" then
if clickedAtZone(e[3], e[4], obj.messageInputBar) then
drawMessageInputBar(" ")
buffer.draw()
local newText = ecs.inputText(obj.messageInputBar[1] + 4, obj.messageInputBar[2] + 2, obj.messageInputBar[3] - obj.messageInputBar[1], "", colors.messageInputBarTextBackgroundColor, colors.messsageInputBarTextColor)
if newText and newText ~= " " then
computer.beep(1700)
status("Отправляю сообщение пользователю")
sendMessageRequest(currentMessagesPeerID, newText .. " (отправлено с OpenComputers)")
status("Обновляю историю переписки")
messageToShowFrom = 1
messagesGUI()
end
drawMessageInputBar(" ")
end
end
for key in pairs(obj.leftBar) do
if clickedAtZone(e[3], e[4], obj.leftBar[key]) then
-- ecs.error("Кликнули на лефт бар ээлемент")
currentLeftBarElement = key
mainGUI()
if leftBarElements[currentLeftBarElement] == "Выход" then
os.sleep(0.3)
buffer.clear(0x262626)
ecs.prepareToExit()
return
end
break
end
end
elseif e[1] == "scroll" then
if e[5] == 1 then
if whatIsOnScreen == "dialogs" then
dialogToShowFrom = dialogToShowFrom - dialogScrollSpeed
if dialogToShowFrom < 1 then dialogToShowFrom = 1 end
status("Прокручиваю диалоги, отправляю запрос на сервер")
dialogsGUI()
buffer.draw()
elseif whatIsOnScreen == "messages" then
messageToShowFrom = messageToShowFrom + messagesScrollSpeed
status("Прокручиваю сообщения, отправляю запрос на сервер")
messagesGUI()
buffer.draw()
elseif whatIsOnScreen == "audio" then
audioToShowFrom = audioToShowFrom - audioScrollSpeed
if audioToShowFrom < 1 then audioToShowFrom = 1 end
status("Прокручиваю аудозаписи, отправляю запрос на сервер")
audioGUI(personalInfo.id)
buffer.draw()
end
else
if whatIsOnScreen == "dialogs" then
dialogToShowFrom = dialogToShowFrom + dialogScrollSpeed
status("Прокручиваю диалоги, отправляю запрос на сервер")
dialogsGUI()
buffer.draw()
elseif whatIsOnScreen == "messages" then
messageToShowFrom = messageToShowFrom - messagesScrollSpeed
if messageToShowFrom < 1 then messageToShowFrom = 1 end
status("Прокручиваю сообщения, отправляю запрос на сервер")
messagesGUI()
buffer.draw()
elseif whatIsOnScreen == "audio" then
audioToShowFrom = audioToShowFrom + audioScrollSpeed
status("Прокручиваю аудозаписи, отправляю запрос на сервер")
audioGUI(personalInfo.id)
buffer.draw()
end
end
end
end
-- local success, dialogs = getDialogsRequest(0, 5)
-- saveToFile(serialization.serialize(dialogs))
-- sendMessageRequest(dialogs.response.items[2], "тестовое сообщение, отправлено через OpenComputers VK Client by Игорь, епта")