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 }