Advertisement
Ewgeniy

Remote Control

Jun 26th, 2024 (edited)
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.67 KB | None | 0 0
  1. local internet = require("internet")
  2. local json = require("json")
  3. local robot = require("robot")
  4. local tty = require("tty")
  5. local computer = require("computer")
  6. local navigation = require("component").navigation
  7.  
  8. print("Токен бота:")
  9. local botToken = io.read()
  10. print("Айди чата:")
  11. local chatID = io.read()
  12.  
  13. tty.clear()
  14. print("Программа удалённого управления роботом\nактивирована.")
  15. print(" ")
  16. print("Логи:")
  17.  
  18. local moving = false
  19. local startX, startY, startZ
  20.  
  21. local lastUpdateId = 0
  22. local initialX, initialY, initialZ = 0, 0, 0
  23. local currentX, currentY, currentZ = initialX, initialY, initialZ
  24. local targetX, targetY, targetZ = nil, nil, nil
  25.  
  26. local function telegramGET(chatid, text)
  27.     local url = "https://api.telegram.org/bot" .. botToken .. "/sendMessage"
  28.     local requestBody = "chat_id=" .. chatID .. "&text=" .. text
  29.  
  30.     local response = ""
  31.     local handle, err = internet.request(url, requestBody)
  32.     if not handle then
  33.         return "Error: " .. (err or "unknown error")
  34.     end
  35.  
  36.     for chunk in handle do
  37.         response = response .. chunk
  38.     end
  39.  
  40.     return response
  41. end
  42.  
  43. -- Функция для получения текущих координат робота
  44. local function getCurrentCoordinates()
  45.     local x, y, z = navigation.getPosition()
  46.     return x, y, z
  47. end
  48. -- Обновление координат при движении
  49. local function updateCoordinates()
  50.     currentX, currentY, currentZ = getCurrentCoordinates()
  51. end
  52.  
  53. -- Функция перемещения к указанным координатам
  54. local function moveToCoordinates(x, y, z)
  55.     local targetX = tonumber(x)
  56.     local targetY = tonumber(y)
  57.     local targetZ = tonumber(z)
  58.  
  59.     if not (targetX and targetY and targetZ) then
  60.         telegramGET(chatID, "Invalid target coordinates.")
  61.         return
  62.     end
  63.  
  64.     moving = true
  65.     while moving and (currentX ~= targetX or currentY ~= targetY or currentZ ~= targetZ) do
  66.         updateCoordinates()
  67.  
  68.         if currentX < targetX then
  69.             if not robot.forward() then
  70.                 robot.swing()
  71.                 robot.forward()
  72.             end
  73.         elseif currentX > targetX then
  74.             robot.turnAround()
  75.             if not robot.forward() then
  76.                 robot.swing()
  77.                 robot.forward()
  78.             end
  79.             robot.turnAround()
  80.         end
  81.  
  82.         if currentY < targetY then
  83.             if not robot.up() then
  84.                 robot.swingUp()
  85.                 robot.up()
  86.             end
  87.         elseif currentY > targetY then
  88.             if not robot.down() then
  89.                 robot.swingDown()
  90.                 robot.down()
  91.             end
  92.         end
  93.  
  94.         if currentZ < targetZ then
  95.             if not robot.forward() then
  96.                 robot.swing()
  97.                 robot.forward()
  98.             end
  99.         elseif currentZ > targetZ then
  100.             robot.turnAround()
  101.             if not robot.forward() then
  102.                 robot.swing()
  103.                 robot.forward()
  104.             end
  105.             robot.turnAround()
  106.         end
  107.     end
  108.  
  109.     if currentX == targetX and currentY == targetY and currentZ == targetZ then
  110.         telegramGET(chatID, "Reached target coordinates.")
  111.     else
  112.         telegramGET(chatID, "Movement stopped.")
  113.     end
  114. end
  115.  
  116.  
  117. local function getPowerLevel()
  118.     local energy = computer.energy()
  119.     local maxEnergy = computer.maxEnergy()
  120.     return (energy / maxEnergy) * 100
  121. end
  122.  
  123. local function processTelegramMessage(message)
  124.     local command = message.text
  125.  
  126.     -- Обёртка для выполнения команды с обработкой ошибок
  127.     local function executeCommand(command)
  128.         local status, err = pcall(function()
  129.             -- Проверка на команду /say
  130.             if command:sub(1, 5) == "/say " then
  131.                 local textToSay = command:sub(6)  -- Убираем команду /say из текста
  132.                 if textToSay and textToSay ~= "" then
  133.                     print(textToSay)  -- Выводим текст на экран робота
  134.                     telegramGET(message.chat.id, "Message displayed: " .. textToSay)
  135.                 else
  136.                     telegramGET(message.chat.id, "Please provide a message to display.")
  137.                 end
  138.                 return  -- Завершаем выполнение функции, чтобы не отправлять сообщение об ошибке
  139.             end
  140.  
  141.             -- Проверка на команду /repeat
  142.             if command:sub(1, 8) == "/repeat " then
  143.                 local _, _, repeatCommand, timesStr = command:find("/repeat (%S+) (%d+)")
  144.                 if repeatCommand and timesStr then
  145.                     local times = tonumber(timesStr)
  146.                     if times then
  147.                         for i = 1, times do
  148.                             executeCommand("/" .. repeatCommand)
  149.                         end
  150.                         telegramGET(message.chat.id, "Repeated command: " .. repeatCommand .. " " .. times .. " times")
  151.                     else
  152.                         telegramGET(message.chat.id, "Invalid number of times specified.")
  153.                     end
  154.                 else
  155.                     telegramGET(message.chat.id, "Invalid repeat command format. Use /repeat <command> <times>.")
  156.                 end
  157.                 return  -- Завершаем выполнение функции, чтобы не отправлять сообщение об ошибке
  158.             end
  159.  
  160.             -- Проверка на команду /execute
  161.             if command:sub(1, 9) == "/execute " then
  162.                 local codeToExecute = command:sub(10)  -- Убираем команду /execute из текста
  163.                 local func, loadErr = load(codeToExecute)
  164.                 if not func then
  165.                     telegramGET(message.chat.id, "Error loading code: " .. loadErr)
  166.                     return
  167.                 end
  168.                 local executeStatus, executeResult = pcall(func)
  169.                 if executeStatus then
  170.                     telegramGET(message.chat.id, "Execution result: " .. tostring(executeResult))
  171.                 else
  172.                     telegramGET(message.chat.id, "Error executing code: " .. executeResult)
  173.                 end
  174.                 return
  175.             end
  176.  
  177.               -- Обработка команды /goto
  178.             if command:sub(1, 5) == "/goto" then
  179.                 local params = command:sub(6):match("%s*(.+)")
  180.                 local x, y, z = params:match("(-?%d+)%s+(-?%d+)%s+(-?%d+)")
  181.                 if x and y and z then
  182.                     moveToCoordinates(x, y, z)
  183.                 else
  184.                     telegramGET(message.chat.id, "Invalid parameters for /goto command.")
  185.                 end
  186.                 return
  187.             end
  188.             -- Проверка на команду /forward
  189.             if command == "/forward" then
  190.                 robot.forward()
  191.                 updateCoordinates("forward")
  192.                 telegramGET(chatID, "Moving forward!")
  193.                 return
  194.             end
  195.  
  196.             -- Проверка на команду /back
  197.             if command == "/back" then
  198.                 robot.back()
  199.                 updateCoordinates("back")
  200.                 telegramGET(chatID, "Moving back!")
  201.                 return
  202.             end
  203.  
  204.             -- Проверка на команду /turnleft
  205.             if command == "/turnleft" then
  206.                 robot.turnLeft()
  207.                 telegramGET(chatID, "Turning left!")
  208.                 return
  209.             end
  210.  
  211.             -- Проверка на команду /turnright
  212.             if command == "/turnright" then
  213.                 robot.turnRight()
  214.                 telegramGET(chatID, "Turning right!")
  215.                 return
  216.             end
  217.  
  218.             -- Проверка на команду /up
  219.             if command == "/up" then
  220.                 robot.up()
  221.                 updateCoordinates("up")
  222.                 telegramGET(chatID, "Moving up!")
  223.                 return
  224.             end
  225.  
  226.             -- Проверка на команду /down
  227.             if command == "/down" then
  228.                 robot.down()
  229.                 updateCoordinates("down")
  230.                 telegramGET(chatID, "Moving down!")
  231.                 return
  232.             end
  233.  
  234.             -- Проверка на команду /use
  235.             if command == "/use" then
  236.                 robot.use()
  237.                 telegramGET(chatID, "Use")
  238.                 return
  239.             end
  240.  
  241.             -- Проверка на команду /swing
  242.             if command == "/swing" then
  243.                 robot.swing()
  244.                 telegramGET(chatID, "Swing", robot.swing())
  245.                 return
  246.             end
  247.  
  248.             -- Проверка на команду /swingup
  249.             if command == "/swingup" then
  250.                 robot.swingUp()
  251.                 telegramGET(chatID, "SwingUp", robot.swingUp())
  252.                 return
  253.             end
  254.  
  255.             -- Проверка на команду /beep
  256.             if command == "/beep" then
  257.                 computer.beep(1000, 0.2)
  258.                 telegramGET(chatID, "Beep!")
  259.                 return
  260.             end
  261.  
  262.             -- Проверка на команду /power
  263.             if command == "/power" then
  264.                 local powerLevel = getPowerLevel()
  265.                 telegramGET(chatID, "Power: " .. string.format("%.2f", powerLevel) .. "%")
  266.                 return
  267.             end
  268.  
  269.             -- Проверка на команду /stop
  270.             if command == "/stop" then
  271.                 moving = false
  272.                 telegramGET(chatID, "Stop!")
  273.                 return
  274.             end
  275.  
  276.             -- Проверка на команду /goback
  277.             if command == "/goback" then
  278.                 moving = false
  279.                 if startX and startY and startZ then
  280.                     moveToCoordinates(startX, startY, startZ)
  281.                 else
  282.                     telegramGET(chatID, "No start coordinates set.")
  283.                 end
  284.                 return
  285.             end
  286.         end)
  287.         if not status then
  288.             telegramGET(message.chat.id, "Error executing command: " .. err)
  289.         end
  290.     end
  291.  
  292.     -- Выполнение команды с обработкой ошибок
  293.     executeCommand(command)
  294. end
  295.  
  296. local function getUpdates()
  297.     local url = "https://api.telegram.org/bot" .. botToken .. "/getUpdates?offset=" .. (lastUpdateId + 1)
  298.  
  299.     local response = ""
  300.     local handle, err = internet.request(url)
  301.     if not handle then
  302.         print("Error fetching updates: " .. (err or "unknown error"))
  303.         return
  304.     end
  305.  
  306.     for chunk in handle do
  307.         response = response .. chunk
  308.     end
  309.  
  310.     local data = json.decode(response)
  311.     if data.ok then
  312.         local latestUpdate = data.result[#data.result]  -- Получаем последнее обновление
  313.         if latestUpdate then
  314.             lastUpdateId = latestUpdate.update_id  -- Обновляем идентификатор последнего обновления
  315.             processTelegramMessage(latestUpdate.message)
  316.         end
  317.     else
  318.         print("Error fetching updates: " .. (data.description or "unknown error"))
  319.     end
  320. end
  321.  
  322. -- Цикл для постоянного получения обновлений от Telegram
  323. while true do
  324.     getUpdates()
  325.     os.sleep(1)  -- Пауза между проверками обновлений, чтобы не нагружать систему
  326. end
  327.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement