1 module smsapi_d_client.sms;
2 
3 class SmsapiClient
4 {
5 	string host, username, passwordHash;
6 
7 	static SmsapiClient createSmsapiPl(string username, string passwordHash)
8 	{
9 		return new SmsapiClient("https://api.smsapi.pl", username, passwordHash);
10 	}
11 
12 	static SmsapiClient createSmsapiPlAlternative(string username, string passwordHash)
13 	{
14 		return new SmsapiClient("https://api2.smsapi.pl", username, passwordHash);
15 	}
16 
17 	static SmsapiClient createSmsapiCom(string username, string passwordHash)
18 	{
19 		return new SmsapiClient("https://api.smsapi.com", username, passwordHash);
20 	}
21 
22 	static SmsapiClient createSmsapiComAlternative(string username, string passwordHash)
23 	{
24 		return new SmsapiClient("https://api2.smsapi.com", username, passwordHash);
25 	}
26 
27 	this(string host, string username, string passwordHash)
28 	{
29         this.host = host;
30         this.username = username;
31         this.passwordHash = passwordHash;
32 	}
33 
34 	SmsSender createSmsSender()
35 	{
36 		return new SmsSender(host, username, passwordHash);
37 	}
38 }
39 
40 class SmsSender
41 {
42     import std.datetime: SysTime;
43     import std.array: join;
44 
45 	private {
46 		immutable string host;
47 	    string[string] query;
48 	}
49 
50 	this(string host, string username, string passwordHash)
51 	{
52 		this.host = host;
53 
54 		query["username"] = username;
55 		query["password"] = passwordHash;
56 	}
57 
58 	SmsSender flash()
59 	{
60 	    query["flash"] = "1";
61 
62 		return this;
63 	}
64 
65 	SmsSender test()
66 	{
67 	    query["test"] = "1";
68 
69 		return this;
70 	}
71 
72 	SmsSender details()
73 	{
74 	    query["details"] = "1";
75 
76 		return this;
77 	}
78 
79 	SmsSender idx(string idx)
80 	{
81         query["idx"] = idx;
82 
83 		return this;
84 	}
85 
86 	SmsSender checkIdx()
87 	{
88         query["check_idx"] = "1";
89 
90 		return this;
91 	}
92 
93 	SmsSender date(SysTime date)
94 	{
95         query["date"] = date.toISOExtString;
96 
97 		return this;
98 	}
99 
100 	SmsSender dateValidate()
101 	{
102         query["date_validate"] = "1";
103 
104 		return this;
105 	}
106 
107 	SmsSender expirationDate(SysTime expirationDate)
108 	{
109         query["expiration_date"] = expirationDate.toISOExtString;
110 
111 		return this;
112 	}
113 
114 	SmsSender from(string from)
115 	{
116         query["from"] = from;
117 
118 		return this;
119 	}
120 
121 	SmsSender udh(string udh)
122 	{
123         query["udh"] = udh;
124         query["datacoding"] = "bin";
125 
126 		return this;
127 	}
128 
129 	SmsSender discountGroup(string discountGroup)
130 	{
131         query["discount_group"] = discountGroup;
132 
133 		return this;
134 	}
135 
136 	SmsSender partnerId(string partnerId)
137 	{
138         query["partner_id"] = partnerId;
139 
140 		return this;
141 	}
142 
143 	SmsSender parameters(string[] param1, string[] param2, string[] param3, string[] param4)
144 	{
145         query["param1"] = param1.join("|");
146         query["param2"] = param2.join("|");
147         query["param3"] = param3.join("|");
148         query["param4"] = param4.join("|");
149 
150 		return this;
151 	}
152 
153 	SmsSender message(string message)
154 	{
155         query["message"] = message;
156 
157 		return this;
158 	}
159 
160 	SmsSender noUnicode()
161 	{
162         query["nounicode"] = "1";
163 
164 		return this;
165 	}
166 
167 	SmsSender normalize()
168 	{
169         query["normalize"] = "1";
170 
171 		return this;
172 	}
173 
174 	SmsSender skipForeign()
175 	{
176         query["skip_foreign"] = "1";
177 
178 		return this;
179 	}
180 
181 	SmsSender allowDuplicates()
182 	{
183         query["allow_duplicates"] = "1";
184 
185 		return this;
186 	}
187 
188 	SmsSender to(string[] to)
189 	{
190         query["to"] = to.join(",");
191 
192 		return this;
193 	}
194 
195 	SmsSender notifyUrl(string notifyUrl)
196 	{
197         query["notify_url"] = notifyUrl;
198 
199 		return this;
200 	}
201 
202 	SmsSender group(string group)
203 	{
204         query["group"] = group;
205 
206 		return this;
207 	}
208 
209 	SmsSender maxParts(ubyte maxParts)
210 	{
211 	    import std.conv: text;
212 
213         query["max_parts"] = maxParts.text;
214 
215 		return this;
216 	}
217 
218 	SmsSender encoding(string encoding)
219 	{
220         query["encoding"] = encoding;
221 
222 		return this;
223 	}
224 
225 	char[] send()
226 	{
227         import std.net.curl: get;
228 
229 		string queryString = "json=1";
230 		foreach (string name, string value; query) {
231 			queryString ~= "&" ~ name ~ "=" ~ value;
232 		}
233 
234 		return get(host ~ "/sms.do?" ~ queryString);
235 	}
236 }
237 
238 unittest
239 {
240     import std.stdio: writeln;
241 
242     SmsapiClient client = SmsapiClient.createSmsapiPl("email", "password");
243     SmsSender sender = client.createSmsSender;
244 
245     char[] output = sender
246         .test()
247         .to(["790216004"])
248         .message("test")
249         .send();
250 
251     writeln(output);
252 }