Advertisement
efrim

Miner Server 1.0 for Warpdrive 1.6.2

Oct 4th, 2013
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.64 KB | None | 0 0
  1. --------------------------------------------------
  2. -- Сервер для оравы шахтерских лазеров из кросоварпа.
  3. -- Ставится в кабине шахтерской платформы
  4. -- и подключается сетевыми кабелями к компьютерам,
  5. -- стоящим у лазеров. На те компьютеры
  6. -- нужно поставить клиентскую программу.
  7. -- И то, и то нужно поставить в autostart.
  8. --
  9. -- (c) Efrim
  10. -- skype: gods_pee
  11. -- 05.10.2013
  12. --------------------------------------------------
  13.  
  14.  
  15. NETWORK_SIDE = "bottom" -- Сторона, к которой подключен модем
  16. DATA_FILE = "miners.dat" -- Файл для сохранения данных
  17. TEMP_FILE = "miners.temp" -- Временное хранилище
  18. TIMEOUTS_MAX = 3 -- Максимальное количество таймаутов в сетевом общении
  19. TIMEOUT = 1 -- Время таймаута
  20. REFRESH_PERIOD = 1 -- Период обновления экрана
  21.  
  22. --------------------------------------------------
  23.  
  24. nTotal = -1
  25. nOnline = -1
  26. nLowEnergy = -1
  27. nMining = -1
  28. nQuarry = -1
  29. nStopped = -1
  30. maxLayer = -1
  31. minLayer = -1
  32.  
  33.  
  34. --------------------------------------------------
  35.  
  36.     -- Массив данных о майнерах:
  37.     -- 1 - ID
  38.     -- 2 - 'state'
  39.     -- 3 - 'energy'
  40.     -- 4 - 'currentLayer'
  41.     -- 5 - 'mined'
  42.     -- 6 - 'total'
  43.     -- 7 - online
  44.  
  45. miners = {}
  46. for i = 1, 81 do
  47.     miners[i] = {}
  48.  
  49.     for j = 1, 7 do
  50.         miners[i][j] = 0 -- Fill the values here
  51.     end
  52. end
  53.  
  54. --------------------------------------------------
  55. -- Графическая часть
  56. --------------------------------------------------
  57.  
  58. function DisplayStats()
  59.     term.clear()
  60.     term.setCursorPos(1, 1)
  61.     print("__ Lasers __")
  62.     print("Online / Total: " .. nOnline .. " / " .. nTotal)
  63.     print("Stopped / Mining / Quarry: " .. nStopped .. " / " .. nMining .. " / " .. nQuarry)
  64.     print("Max / Min layer: " .. maxLayer .. " / " .. minLayer)
  65.     print("With low energy: " .. nLowEnergy)
  66.     print("")
  67.     print("Press C to type a command")
  68.     return 0
  69. end
  70.  
  71. function SubmitCommand()
  72.     print("")
  73.     print("Enter command")
  74.     sleep(1/10)
  75.     print("> ")
  76.     local input = read()
  77.     return input
  78. end
  79.  
  80. function ExecuteCommand(command)
  81.     if command == "help" then
  82.         PrintHelp()
  83.         SubmitCommand()
  84.     elseif command == "reinit" then
  85.         rednet.broadcast(command)
  86.         sleep(1/3)
  87.         rednet.broadcast(command)
  88.         sleep(1/3)
  89.         rednet.broadcast(command)
  90.         sleep(1/3)
  91.         InitializeNetwork()
  92.         DisplayStats()
  93.     else
  94.         rednet.broadcast(command)
  95.         DisplayStats()
  96.     end
  97.     return 0
  98. end
  99.  
  100. function PrintHelp()
  101.     print("help")
  102.     print("start")
  103.     print("quarry")
  104.     print("stop")
  105.     print("restart")
  106.     print("reinit")
  107.     print("offset --layers")
  108.     print("update --pastebin")
  109.     print("")
  110.     return 0
  111. end
  112.  
  113. --------------------------------------------------
  114. -- Инициализация
  115. --------------------------------------------------
  116.  
  117. function InitializeNetwork()
  118.     if not rednet.isOpen(NETWORK_SIDE) then
  119.         rednet.open(NETWORK_SIDE)
  120.     end
  121.  
  122.     nTotal = 0
  123.     local nTimeouts = 0
  124.  
  125.     term.clear()
  126.     term.setCursorPos(1,1)
  127.     print("Initializing...")
  128.  
  129.     while nTimeouts <= TIMEOUTS_MAX do
  130.         sleep(1/4)
  131.         rednet.broadcast("Server is here")
  132.  
  133.         local receivedID, receivedMessage, _ = rednet.receive(TIMEOUT)
  134.  
  135.         print(receivedID)
  136.  
  137.         if receivedID == nil then
  138.             nTimeouts = nTimeouts + 1
  139.             print("Timeout.")
  140.         else
  141.             print("Received message.")
  142.             local _, _, minerIDstr = string.find(receivedMessage, "Miner (%d+) is here")
  143.             minerID = tonumber(minerIDstr)
  144.             if receivedID == minerID then
  145.                 AddMiner(minerID)
  146.                 nTimeouts = 0
  147.                 rednet.send(minerID, "Gotcha")
  148.                 print("Miner " .. nTotal .. " initialized.")
  149.             end
  150.         end
  151.     end
  152.  
  153.     print("Initialized total " .. nTotal .. " miners.")
  154.  
  155.     SaveMinersTableToFile()
  156.  
  157.     return 0
  158. end
  159.  
  160. function AddMiner(minerID)
  161.     nTotal = nTotal + 1
  162.     miners[nTotal][1] = minerID
  163.     miners[nTotal][7] = 1
  164. end
  165.  
  166. --------------------------------------------------
  167. -- Общение с имеющимися майнерами
  168. --------------------------------------------------
  169.  
  170. function UpdateMiner(minerN) -- Обновление статуса майнера
  171.     local timeouts = 0
  172.     local minerID = miners[minerN][1]
  173.  
  174.     while timeouts <= TIMEOUTS_MAX do
  175.         CommandMiner(minerN, "statusrequest")
  176.         local receivedID, receivedMessage, _ = rednet.receive(TIMEOUT)
  177.  
  178.         if receivedID == minerID then
  179.             local state = textutils.unserialize(receivedMessage)
  180.  
  181.             miners[minerN][2] = state[1]
  182.             miners[minerN][3] = state[2]
  183.             miners[minerN][4] = state[3]
  184.             miners[minerN][5] = state[4]
  185.             miners[minerN][6] = state[5]
  186.             miners[minerN][7] = 1
  187.  
  188.             return 0
  189.         end
  190.  
  191.         timeouts = timeouts + 1 -- Если дошли до этого места, то таймаут
  192.     end
  193.     miners[minerN][7] = 0 -- Если дошли до этого места, то майнер в оффлайне
  194.     return 1
  195. end
  196.  
  197. function UpdateAllMiners() -- Обновление статусов всех майнеров
  198.     for i = 1, nTotal do
  199.         UpdateMiner(i)
  200.     end
  201.  
  202.     return 0
  203. end
  204.  
  205. function CommandMiner(minerN, action)
  206.     local minerID = miners[minerN][1]
  207.  
  208.     rednet.send(minerID, action)
  209.  
  210.     return 0
  211. end
  212.  
  213. function CommandAllMiners(action)
  214.  
  215.     rednet.broadcast(action)
  216.  
  217.     return 0
  218. end
  219.  
  220. --------------------------------------------------
  221. -- Пересчет статистики
  222. --------------------------------------------------
  223.  
  224. function RecalculateStatistics ()
  225.     nOnline = 0
  226.     nLowEnergy = 0
  227.     nMining = 0
  228.     nQuarry = 0
  229.     nStopped = 0
  230.     maxLayer = 0
  231.     minLayer = 256
  232.  
  233.     for i = 1, nTotal do
  234.         -- nOnline
  235.         nOnline = nOnline + miners[i][7]
  236.         -- nLowEnergyTemp
  237.         if miners[i][3] <= 50000 then
  238.             nLowEnergy = nLowEnergy + 1
  239.         end
  240.         -- nMiningTemp, nQuarryTemp, nStoppedTemp
  241.         if miners[i][2] == "not mining" then
  242.             nStopped = nStopped + 1
  243.         elseif miners[i][2] == "mining" then
  244.             nMining = nMining + 1
  245.         elseif miners[i][2] == "mining %(quarry mode%)" then
  246.             nQuarry = nQuarry + 1
  247.         end
  248.         -- maxLayerTemp
  249.         maxLayer = math.max(maxLayer, miners[i][4])
  250.         minLayer = math.min(minLayer, miners[i][4])
  251.     end
  252.  
  253.     return 0
  254. end
  255.  
  256. --------------------------------------------------
  257. -- Сохранение и загрузка
  258. --------------------------------------------------
  259.  
  260. function SaveMinersTableToFile()
  261.     local file = fs.open(TEMP_FILE, "w")
  262.     file.writeLine(textutils.serialize(miners))
  263.     file.writeLine(nTotal)
  264.     file.close()
  265.  
  266.     fs.delete(DATA_FILE)
  267.     fs.move(TEMP_FILE, DATA_FILE)
  268.  
  269.     return 0
  270. end
  271.  
  272. function LoadMinersTableFromFile()
  273.     local file = fs.open(DATA_FILE, "r")
  274.     miners = textutils.unserialize(file.readLine())
  275.     nTotal = tonumber(file.readLine())
  276.     file.close()
  277.  
  278.     return 0
  279. end
  280.  
  281. --------------------------------------------------
  282. -- Главный луп
  283. --------------------------------------------------
  284.  
  285. function main()
  286.     if not rednet.isOpen(NETWORK_SIDE) then
  287.         print("Opening networking...")
  288.         rednet.open(NETWORK_SIDE)
  289.     end
  290.  
  291.     if fs.exists(DATA_FILE) then
  292.         print("Loading previous data...")
  293.         LoadMinersTableFromFile()
  294.     else
  295.         print("Initializing...")
  296.         InitializeNetwork()
  297.     end
  298.  
  299.     while true do
  300.         UpdateAllMiners()
  301.         RecalculateStatistics()
  302.         DisplayStats()
  303.         SaveMinersTableToFile()
  304.  
  305.         local timeout = os.startTimer(REFRESH_PERIOD)
  306.         while true do
  307.             event = {os.pullEvent()}
  308.             if event[1] == "key" and event[2] == 46 then
  309.                 local command = SubmitCommand()
  310.                 ExecuteCommand(command)
  311.                 timeout = os.startTimer(REFRESH_PERIOD)
  312.             elseif event[1] == "timer" and event[2] == timeout then
  313.                 break
  314.             end
  315.         end
  316.     end
  317. end
  318.  
  319. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement