Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local internet = require("internet")
- local json = require("json")
- local robot = require("robot")
- local tty = require("tty")
- local computer = require("computer")
- local navigation = require("component").navigation
- print("Токен бота:")
- local botToken = io.read()
- print("Айди чата:")
- local chatID = io.read()
- tty.clear()
- print("Программа удалённого управления роботом\nактивирована.")
- print(" ")
- print("Логи:")
- local moving = false
- local startX, startY, startZ
- local lastUpdateId = 0
- local initialX, initialY, initialZ = 0, 0, 0
- local currentX, currentY, currentZ = initialX, initialY, initialZ
- local targetX, targetY, targetZ = nil, nil, nil
- local function telegramGET(chatid, text)
- local url = "https://api.telegram.org/bot" .. botToken .. "/sendMessage"
- local requestBody = "chat_id=" .. chatID .. "&text=" .. text
- local response = ""
- local handle, err = internet.request(url, requestBody)
- if not handle then
- return "Error: " .. (err or "unknown error")
- end
- for chunk in handle do
- response = response .. chunk
- end
- return response
- end
- -- Функция для получения текущих координат робота
- local function getCurrentCoordinates()
- local x, y, z = navigation.getPosition()
- return x, y, z
- end
- -- Обновление координат при движении
- local function updateCoordinates()
- currentX, currentY, currentZ = getCurrentCoordinates()
- end
- -- Функция перемещения к указанным координатам
- local function moveToCoordinates(x, y, z)
- local targetX = tonumber(x)
- local targetY = tonumber(y)
- local targetZ = tonumber(z)
- if not (targetX and targetY and targetZ) then
- telegramGET(chatID, "Invalid target coordinates.")
- return
- end
- moving = true
- while moving and (currentX ~= targetX or currentY ~= targetY or currentZ ~= targetZ) do
- updateCoordinates()
- if currentX < targetX then
- if not robot.forward() then
- robot.swing()
- robot.forward()
- end
- elseif currentX > targetX then
- robot.turnAround()
- if not robot.forward() then
- robot.swing()
- robot.forward()
- end
- robot.turnAround()
- end
- if currentY < targetY then
- if not robot.up() then
- robot.swingUp()
- robot.up()
- end
- elseif currentY > targetY then
- if not robot.down() then
- robot.swingDown()
- robot.down()
- end
- end
- if currentZ < targetZ then
- if not robot.forward() then
- robot.swing()
- robot.forward()
- end
- elseif currentZ > targetZ then
- robot.turnAround()
- if not robot.forward() then
- robot.swing()
- robot.forward()
- end
- robot.turnAround()
- end
- end
- if currentX == targetX and currentY == targetY and currentZ == targetZ then
- telegramGET(chatID, "Reached target coordinates.")
- else
- telegramGET(chatID, "Movement stopped.")
- end
- end
- local function getPowerLevel()
- local energy = computer.energy()
- local maxEnergy = computer.maxEnergy()
- return (energy / maxEnergy) * 100
- end
- local function processTelegramMessage(message)
- local command = message.text
- -- Обёртка для выполнения команды с обработкой ошибок
- local function executeCommand(command)
- local status, err = pcall(function()
- -- Проверка на команду /say
- if command:sub(1, 5) == "/say " then
- local textToSay = command:sub(6) -- Убираем команду /say из текста
- if textToSay and textToSay ~= "" then
- print(textToSay) -- Выводим текст на экран робота
- telegramGET(message.chat.id, "Message displayed: " .. textToSay)
- else
- telegramGET(message.chat.id, "Please provide a message to display.")
- end
- return -- Завершаем выполнение функции, чтобы не отправлять сообщение об ошибке
- end
- -- Проверка на команду /repeat
- if command:sub(1, 8) == "/repeat " then
- local _, _, repeatCommand, timesStr = command:find("/repeat (%S+) (%d+)")
- if repeatCommand and timesStr then
- local times = tonumber(timesStr)
- if times then
- for i = 1, times do
- executeCommand("/" .. repeatCommand)
- end
- telegramGET(message.chat.id, "Repeated command: " .. repeatCommand .. " " .. times .. " times")
- else
- telegramGET(message.chat.id, "Invalid number of times specified.")
- end
- else
- telegramGET(message.chat.id, "Invalid repeat command format. Use /repeat <command> <times>.")
- end
- return -- Завершаем выполнение функции, чтобы не отправлять сообщение об ошибке
- end
- -- Проверка на команду /execute
- if command:sub(1, 9) == "/execute " then
- local codeToExecute = command:sub(10) -- Убираем команду /execute из текста
- local func, loadErr = load(codeToExecute)
- if not func then
- telegramGET(message.chat.id, "Error loading code: " .. loadErr)
- return
- end
- local executeStatus, executeResult = pcall(func)
- if executeStatus then
- telegramGET(message.chat.id, "Execution result: " .. tostring(executeResult))
- else
- telegramGET(message.chat.id, "Error executing code: " .. executeResult)
- end
- return
- end
- -- Обработка команды /goto
- if command:sub(1, 5) == "/goto" then
- local params = command:sub(6):match("%s*(.+)")
- local x, y, z = params:match("(-?%d+)%s+(-?%d+)%s+(-?%d+)")
- if x and y and z then
- moveToCoordinates(x, y, z)
- else
- telegramGET(message.chat.id, "Invalid parameters for /goto command.")
- end
- return
- end
- -- Проверка на команду /forward
- if command == "/forward" then
- robot.forward()
- updateCoordinates("forward")
- telegramGET(chatID, "Moving forward!")
- return
- end
- -- Проверка на команду /back
- if command == "/back" then
- robot.back()
- updateCoordinates("back")
- telegramGET(chatID, "Moving back!")
- return
- end
- -- Проверка на команду /turnleft
- if command == "/turnleft" then
- robot.turnLeft()
- telegramGET(chatID, "Turning left!")
- return
- end
- -- Проверка на команду /turnright
- if command == "/turnright" then
- robot.turnRight()
- telegramGET(chatID, "Turning right!")
- return
- end
- -- Проверка на команду /up
- if command == "/up" then
- robot.up()
- updateCoordinates("up")
- telegramGET(chatID, "Moving up!")
- return
- end
- -- Проверка на команду /down
- if command == "/down" then
- robot.down()
- updateCoordinates("down")
- telegramGET(chatID, "Moving down!")
- return
- end
- -- Проверка на команду /use
- if command == "/use" then
- robot.use()
- telegramGET(chatID, "Use")
- return
- end
- -- Проверка на команду /swing
- if command == "/swing" then
- robot.swing()
- telegramGET(chatID, "Swing", robot.swing())
- return
- end
- -- Проверка на команду /swingup
- if command == "/swingup" then
- robot.swingUp()
- telegramGET(chatID, "SwingUp", robot.swingUp())
- return
- end
- -- Проверка на команду /beep
- if command == "/beep" then
- computer.beep(1000, 0.2)
- telegramGET(chatID, "Beep!")
- return
- end
- -- Проверка на команду /power
- if command == "/power" then
- local powerLevel = getPowerLevel()
- telegramGET(chatID, "Power: " .. string.format("%.2f", powerLevel) .. "%")
- return
- end
- -- Проверка на команду /stop
- if command == "/stop" then
- moving = false
- telegramGET(chatID, "Stop!")
- return
- end
- -- Проверка на команду /goback
- if command == "/goback" then
- moving = false
- if startX and startY and startZ then
- moveToCoordinates(startX, startY, startZ)
- else
- telegramGET(chatID, "No start coordinates set.")
- end
- return
- end
- end)
- if not status then
- telegramGET(message.chat.id, "Error executing command: " .. err)
- end
- end
- -- Выполнение команды с обработкой ошибок
- executeCommand(command)
- end
- local function getUpdates()
- local url = "https://api.telegram.org/bot" .. botToken .. "/getUpdates?offset=" .. (lastUpdateId + 1)
- local response = ""
- local handle, err = internet.request(url)
- if not handle then
- print("Error fetching updates: " .. (err or "unknown error"))
- return
- end
- for chunk in handle do
- response = response .. chunk
- end
- local data = json.decode(response)
- if data.ok then
- local latestUpdate = data.result[#data.result] -- Получаем последнее обновление
- if latestUpdate then
- lastUpdateId = latestUpdate.update_id -- Обновляем идентификатор последнего обновления
- processTelegramMessage(latestUpdate.message)
- end
- else
- print("Error fetching updates: " .. (data.description or "unknown error"))
- end
- end
- -- Цикл для постоянного получения обновлений от Telegram
- while true do
- getUpdates()
- os.sleep(1) -- Пауза между проверками обновлений, чтобы не нагружать систему
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement