1 module neocitiesd; 2 3 import requests; 4 import std.json; 5 import std.stdio; 6 import std.typecons; 7 8 struct Neocities 9 { 10 string username; 11 string password; 12 private enum URL = "https://neocities.org/api/"; 13 14 this(string user, string pass) 15 { 16 username = user; 17 password = pass; 18 } 19 20 auto info() { 21 return makeRequest("info", null); 22 } 23 24 auto list() { 25 return makeRequest("list", null); 26 } 27 28 auto upload(string[] files) { 29 // Arrange form for POST request 30 MultipartForm form; 31 foreach (string f; files) 32 { 33 auto file = File(f, "rb"); 34 form.add(formData(file.name, file, ["filename":file.name])); 35 } 36 return makeRequest("upload", form); 37 } 38 39 auto remove(string[] files) { 40 // Arrange arguments for POST request 41 alias KeyValue = Tuple!(string, "key", string, "value"); 42 KeyValue[] toBeDeleted; 43 foreach (string f; files) 44 { 45 toBeDeleted ~= KeyValue("filenames[]", f); 46 } 47 return makeRequest("delete", toBeDeleted); 48 } 49 50 private auto makeRequest(T)(string urlExtension, T payload) { 51 auto rq = Request(); 52 rq.authenticator = new BasicAuthentication(username, password); 53 Response rs; 54 if (urlExtension == "upload" || urlExtension == "delete") 55 { 56 rs = rq.post(URL ~ urlExtension, payload); 57 } 58 else if (urlExtension == "info" || urlExtension == "list") 59 { 60 rs = rq.get(URL ~ urlExtension); 61 } 62 auto responseValues = parseJSON(cast(string)rs.responseBody.data); 63 responseValues["code"] = rs.code; 64 return responseValues; 65 } 66 }