1 module server.server;
2 
3 import std.socket : Socket, Address, SocketType, ProtocolType;
4 import client.client : ButterflyClient;
5 import std.file : mkdir, exists, isDir;
6 import server.listener : ButterflyListener;
7 import std.stdio : writeln;
8 import std.string : cmp;
9 import gogga;
10 
11 public final class ButterflyServer
12 {
13     /**
14     * TODO: Later implement listeners so that we can
15     * bind to multiple sockets.
16     */
17     private ButterflyListener[] listeners;
18 
19     /**
20     * Socket to listen for incoming connections on
21     */
22     private Socket serverSocket;
23 
24     /**
25     * Whether or not the server is active
26     */
27     private bool active = true;
28 
29     this(ButterflyListener[] listeners)
30     {
31         /**
32         * Create the needed directories (if not already present)
33         */
34         directoryCheck();
35 
36         /**
37         * Set all the listeners
38         */
39         this.listeners = listeners;
40 
41         /**
42         * Set the server of all listeners to this server
43         */
44         foreach(ButterflyListener listener; listeners)
45         {
46             listener.setServer(this);
47         }
48     }
49 
50     private void directoryCheck()
51     {
52         /* TODO: Create the `mailboxes/` directory, if it does not exist */
53 
54         /* Check to make sure there is n FS node at `mailboxes` */
55         if(exists("mailboxes"))
56         {
57             /* Make sure it is a directory */
58             if(isDir("mailboxes"))
59             {
60 
61             }
62             else
63             {
64                 /* TODO: Error handling */
65             }
66         }
67         else
68         {
69             /* Create the `mailboxes` directory */
70             mkdir("mailboxes");
71         }  
72 
73         /* Check to make sure there is an FS node at `accounts/` */
74         if(exists("accounts"))
75         {
76             /* Make sure it is a directory */
77             if(isDir("accounts"))
78             {
79 
80             }
81             else
82             {
83                 /* TODO: Error handling */
84             }
85         }
86         else
87         {
88             /* Create the `accounts` directory */
89             mkdir("accounts");
90         }  
91     }
92 
93     public void run()
94     {
95         /* Start the listeners */
96         foreach(ButterflyListener listener; listeners)
97         {
98             gprintln("Starting listener \"" ~ listener.getName() ~"\" ...");
99             gprintln("Listener is using configuration: "~listener.getConfig().toPrettyString());
100             listener.start();
101             gprintln("Listener \"" ~ listener.getName() ~ "\" started");
102         }
103     }
104 
105     public bool isLocalDomain(string domain)
106     {
107         /**
108         * Loop through each listener and check if the requested domain
109         * appears in one of them.
110         */ 
111         foreach(ButterflyListener listener; listeners)
112         {
113             if(cmp(listener.getDomain(), domain) == 0)
114             {
115                 return true;
116             }
117         }
118 
119         return false;
120     }
121 
122 }