DaikiKaminari

PseudoGraphana

Jul 15th, 2020 (edited)
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.94 KB | None | 0 0
  1. -- version 1.1
  2. --- INIT ---
  3. local function loadAPIs()
  4.   if not fs.exists("lib/datetime") then
  5.     error("[lib/datetime] file not found.")
  6.   end
  7.   os.loadAPI("lib/datetime")
  8.   datetime.init()
  9.   if not fs.exists("lib/objectJSON") then
  10.     error("[lib/objectJSON] file not found")
  11.   end
  12.   os.loadAPI("lib/objectJSON")
  13.   objectJSON.init()
  14. end
  15.  
  16. --- UTILS ----
  17. local function split(inputstr, sep)
  18.   if sep == nil then sep = "%s" end
  19.   local t={}
  20.   for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
  21.     table.insert(t, str)
  22.   end
  23.   return t
  24. end
  25.  
  26. -- merge an array split from p-q, q-r
  27. local function merge(A, p, q, r)
  28.     local n1 = q-p+1
  29.     local n2 = r-q
  30.     local left = {}
  31.     local right = {}
  32.    
  33.     for i=1, n1 do
  34.         left[i] = A[p+i-1]
  35.     end
  36.     for i=1, n2 do
  37.         right[i] = A[q+i]
  38.     end
  39.    
  40.     left[n1+1] = math.huge
  41.     right[n2+1] = math.huge
  42.    
  43.     local i=1
  44.     local j=1
  45.    
  46.     for k=p, r do
  47.         if left[i]<=right[j] then
  48.             A[k] = left[i]
  49.             i=i+1
  50.         else
  51.             A[k] = right[j]
  52.             j=j+1
  53.         end
  54.     end
  55. end
  56.  
  57. -- main mergesort algorithm
  58. local function mergeSort(A, p, r)
  59.   if p == nil then
  60.     p = 1
  61.   end
  62.   if r == nil then
  63.     r = #A
  64.   end
  65.     if p < r then
  66.         local q = math.floor((p + r)/2)
  67.         mergeSort(A, p, q)
  68.         mergeSort(A, q+1, r)
  69.         merge(A, p, q, r)
  70.     end
  71. end
  72.  
  73. --- FUNCTION ---
  74. local function getPlayers()
  75.   while true do
  76.     local players = objectJSON.decodeFromFile("players")
  77.     local obj = objectJSON.decodeHTTP("http://api.mineaurion.com/v1/serveurs")
  78.     if obj == nil or next(obj) == nil then
  79.       return nil
  80.     end
  81.     for _,v in pairs(obj) do
  82.       if v["info"] == "Infinity" then
  83.         if type(v["joueurs"]) ~= "table" then
  84.           return nil
  85.         end
  86.         local date = datetime.getDatetime2()
  87.         if date == nil then
  88.           print("Was not able to get the date.")
  89.           return nil
  90.         end
  91.         local date_str = date["year"] .. "/" .. date["month"] .. "/" .. date["day"] ..
  92.         " - " .. date["hour"] .. ":" .. date["min"]
  93.         for _,p in pairs(v["joueurs"]) do players[p] = date_str end
  94.         objectJSON.encodeAndSavePretty("players", players)
  95.       end
  96.     end
  97.     sleep(60)
  98.   end
  99. end
  100.  
  101. local function getTime(datetime)
  102.   local date = split(datetime, " - ")[1]
  103.   local time = split(datetime, " - ")[3]
  104.   local year = split(date, "/")[1]
  105.   local month = split(date, "/")[2]
  106.   local day = split(date, "/")[3]
  107.   local hour = split(time, ":")[1]
  108.   local min = split(time, ":")[2]
  109.   return tonumber(year .. month .. day .. hour .. min)
  110. end
  111.  
  112. local function getSortedPlayers(players)
  113.   local keyTimePlayers = {}
  114.   for p,t in pairs(players) do
  115.     local player = {["name"] = p, ["lastCo"] = t}
  116.     keyTimePlayers[getTime(t)] = player
  117.   end
  118.  
  119.   local keys = {}
  120.   for timeID,player in pairs(keyTimePlayers) do
  121.     table.insert(keys, timeID)
  122.   end
  123.  
  124.   mergeSort(keys)
  125.   local sortedPlayers = {}
  126.   for _,timeID in ipairs(keys) do
  127.     table.insert(sortedPlayers, keyTimePlayers[timeID])
  128.   end
  129.  
  130.   return sortedPlayers
  131. end
  132.  
  133. local function printPlayers()
  134.   local players = objectJSON.decodeFromFile("players")
  135.   local mon = peripheral.find("monitor")
  136.   if mon ~= nil then
  137.     term.redirect(mon)
  138.   end
  139.   local _,y = term.getSize()
  140.   term.clear()
  141.   local n = 0
  142.  
  143.   for _,player in ipairs(getSortedPlayers(players)) do
  144.     local escape = " "
  145.     for i=0,(20 - string.len(player.name)) do
  146.       escape = escape .. " "
  147.     end
  148.     if n < y - 1 then
  149.       print(player.name .. escape .. player.lastCo)
  150.       n = n + 1
  151.     else
  152.       print("Press enter to continue...")
  153.       io.read()
  154.       n = 0
  155.       term.clear()
  156.     end
  157.   end
  158. end
  159.  
  160. local function getRedstone()
  161.   while true do
  162.     for _,v in pairs(redstone.getSides()) do
  163.       if redstone.getInput(v) then
  164.         printPlayers()
  165.       end
  166.     end
  167.     sleep(1)
  168.   end
  169. end
  170.  
  171.  
  172. --- MAIN ---
  173. local function main()
  174.   loadAPIs()
  175.   while true do
  176.     parallel.waitForAny(getRedstone, getPlayers)
  177.     sleep(0)
  178.   end
  179. end
  180.  
  181. main()
Add Comment
Please, Sign In to add comment