· 4 years ago · Jun 05, 2021, 06:02 PM
1local tArgs, gUser, gRepo, gPath, gBranch = {...}, nil, nil, "", "main"
2local usage = [[
3 github <user> <repo> [path] [remote path] [branch]
4 Remote path defaults to the root of the repo.
5 Path defaults to the download folder.
6 Branch defaults to main.
7 If you want to leave an option empty use a dot.
8 Example: github johnsmith hello-world . foo
9 Everything inside the directory foo will be
10 downloaded to downloads/hello-world/.
11 ]]
12local blackList = [[
13@blacklistedfile
14]]
15
16local title = "Github Repo Downloader"
17local fileList = {dirs={},files={}}
18local x , y = term.getSize()
19
20-- GUI
21function printTitle()
22 local line = 2
23 term.setCursorPos(1,line)
24 for i = 2, x, 1 do write("-") end
25 term.setCursorPos((x-title:len())/2,line+1)
26 print(title)
27 for i = 2, x, 1 do write("-") end
28end
29
30function writeCenter( str )
31 term.clear()
32 printTitle()
33 term.setCursorPos((x-str:len())/2-1,y/2-1)
34 for i = -1, str:len(), 1 do write("-") end
35 term.setCursorPos((x-str:len())/2-1,y/2)
36 print("|"..str.."|")
37 term.setCursorPos((x-str:len())/2-1,y/2+1)
38 for i = -1, str:len(), 1 do write("-") end
39end
40
41function printUsage()
42 local str = "Press space key to continue"
43 term.clear()
44 printTitle()
45 term.setCursorPos(1,y/2-4)
46 print(usage)
47 term.setCursorPos((x-str:len())/2,y/2+7)
48 print(str)
49 while true do
50 local event, param1 = os.pullEvent("key")
51 if param1 == 57 then
52 sleep(0)
53 break
54 end
55 end
56 term.clear()
57 term.setCursorPos(1,1)
58end
59
60-- Download File
61function downloadFile( path, url, name )
62 writeCenter("Downloading File: "..name)
63 dirPath = path:gmatch('([%w%_%.% %-%+%,%;%:%*%#%=%/]+)/'..name..'$')()
64 if dirPath ~= nil and not fs.isDir(dirPath) then fs.makeDir(dirPath) end
65 local content = http.get(url)
66 local file = fs.open(path,"w")
67 file.write(content.readAll())
68 file.close()
69end
70
71-- Get Directory Contents
72function getGithubContents( path )
73 local pType, pPath, pName, checkPath = {}, {}, {}, {}
74 local response = http.get("https://api.github.com/repos/"..gUser.."/"..gRepo.."/contents/"..path.."/?ref="..gBranch)
75 if response then
76 response = response.readAll()
77 if response ~= nil then
78 for str in response:gmatch('"type":"(%w+)"') do table.insert(pType, str) end
79 for str in response:gmatch('"path":"([^\"]+)"') do table.insert(pPath, str) end
80 for str in response:gmatch('"name":"([^\"]+)"') do table.insert(pName, str) end
81 end
82 else
83 writeCenter( "Error: Can't resolve URL" )
84 sleep(2)
85 term.clear()
86 term.setCursorPos(1,1)
87 error()
88 end
89 return pType, pPath, pName
90end
91
92-- Blacklist Function
93function isBlackListed( path )
94 if blackList:gmatch("@"..path)() ~= nil then
95 return true
96 end
97end
98
99-- Download Manager
100function downloadManager( path )
101 local fType, fPath, fName = getGithubContents( path )
102 for i,data in pairs(fType) do
103 if data == "file" then
104 checkPath = http.get("https://raw.github.com/"..gUser.."/"..gRepo.."/"..gBranch.."/"..fPath[i])
105 if checkPath == nil then
106
107 fPath[i] = fPath[i].."/"..fName[i]
108 end
109 local path = "downloads/"..gRepo.."/"..fPath[i]
110 if gPath ~= "" then path = gPath.."/"..gRepo.."/"..fPath[i] end
111 if not fileList.files[path] and not isBlackListed(fPath[i]) then
112 fileList.files[path] = {"https://raw.github.com/"..gUser.."/"..gRepo.."/"..gBranch.."/"..fPath[i],fName[i]}
113 end
114 end
115 end
116 for i, data in pairs(fType) do
117 if data == "dir" then
118 local path = "downloads/"..gRepo.."/"..fPath[i]
119 if gPath ~= "" then path = gPath.."/"..gRepo.."/"..fPath[i] end
120 if not fileList.dirs[path] then
121 writeCenter("Listing directory: "..fName[i])
122 fileList.dirs[path] = {"https://raw.github.com/"..gUser.."/"..gRepo.."/"..gBranch.."/"..fPath[i],fName[i]}
123 downloadManager( fPath[i] )
124 end
125 end
126 end
127end
128
129-- Main Function
130function main( path )
131 writeCenter("Connecting to Github")
132 downloadManager(path)
133 for i, data in pairs(fileList.files) do
134 downloadFile( i, data[1], data[2] )
135 end
136 writeCenter("Download completed")
137 sleep(2,5)
138 term.clear()
139 term.setCursorPos(1,1)
140end
141
142-- Parse User Input
143function parseInput( user, repo , dldir, path, branch )
144 if path == nil then path = "" end
145 if branch ~= nil then gBranch = branch end
146 if repo == nil then printUsage()
147 else
148 gUser = user
149 gRepo = repo
150 if dldir ~= nil then gPath = dldir end
151 main( path )
152 end
153end
154
155if not http then
156 writeCenter("You need to enable the HTTP API!")
157 sleep(3)
158 term.clear()
159 term.setCursorPos(1,1)
160else
161 for i=1, 5, 1 do
162 if tArgs[i] == "." then tArgs[i] = nil end
163 end
164 parseInput( tArgs[1], tArgs[2], tArgs[3], tArgs[4], tArgs[5] )
165end