SHOW:
|
|
- or go back to the newest paste.
1 | -- ORIGINAL PROGRAM BY MIDNIGHTAS -- | |
2 | -- MODIFIED BY X3ME03 AKA hiperbolt -- | |
3 | ||
4 | os.loadAPI("disk/json") | |
5 | ||
6 | w, h = term.getSize() | |
7 | ||
8 | -- limitRead: Source by remiX on the ComputerCraft forums. | |
9 | function limitRead(nLimit, specialChars, replaceChar) | |
10 | term.setCursorBlink(true) | |
11 | local cX, cY = term.getCursorPos() | |
12 | local rString = "" | |
13 | if replaceChar == "" then replaceChar = nil end | |
14 | repeat | |
15 | local event, p1 = os.pullEvent() | |
16 | if event == "char" then | |
17 | -- Character event | |
18 | if #rString + 1 <= nLimit then | |
19 | if string.match(p1, "%W") and specialChars == false then | |
20 | p1 = "" | |
21 | end | |
22 | rString = rString .. p1 | |
23 | write(replaceChar or p1) | |
24 | end | |
25 | elseif event == "key" and p1 == keys.backspace and #rString >= 1 then | |
26 | -- Backspace | |
27 | rString = string.sub(rString, 1, #rString-1) | |
28 | xPos, yPos = term.getCursorPos() | |
29 | if xPos > 1 then | |
30 | term.setCursorPos(xPos - 1, yPos) | |
31 | write(" ") | |
32 | term.setCursorPos(xPos - 1, yPos) | |
33 | else | |
34 | if #rString ~= 0 then | |
35 | term.setCursorPos(w, yPos - 1) | |
36 | write(" ") | |
37 | term.setCursorPos(w, yPos - 1) | |
38 | end | |
39 | end | |
40 | end | |
41 | until event == "key" and p1 == keys.enter and #rString > 0 | |
42 | term.setCursorBlink(false) | |
43 | print() -- Skip to the next line after clicking enter. | |
44 | return rString | |
45 | end | |
46 | ||
47 | function printCenter(text, y, offset) | |
48 | offset = offset or 0 | |
49 | local x = math.floor(w - string.len(text)) / 2 + offset | |
50 | term.setCursorPos(x, y) | |
51 | print(text) | |
52 | return x | |
53 | end | |
54 | ||
55 | function drawLogo() | |
56 | - | printCenter(" _____ _ _ _ ", 3) |
56 | + | printCenter("Twitrix Mailing Software", 3) |
57 | - | printCenter(" |_ _| (_) | (_)", 4) |
57 | + | |
58 | - | printCenter(" | |_ ___| |_ _ __ ", 5) |
58 | + | |
59 | - | printCenter(" | \ \ /\ / / | __| '__| \ \/ /", 6) |
59 | + | |
60 | - | printCenter(" | |\ V V /| | |_| | | |> <", 7) |
60 | + | |
61 | - | printCenter(" \_/ \_/\_/ |_|\__|_| |_/_/\_\", 8) |
61 | + | |
62 | term.clear() | |
63 | end | |
64 | ||
65 | username = nil | |
66 | password = nil | |
67 | ||
68 | -- States: -1 = register; 0 = menu; 1 = login; 2 = send; 3 = read page; 4 = read message; | |
69 | state = 0 | |
70 | menuOption = 0 | |
71 | ||
72 | readPage = 1 | |
73 | mails = nil | |
74 | selectedMail = nil | |
75 | ||
76 | function drawMenu() | |
77 | drawLogo() | |
78 | term.setBackgroundColor(colors.orange) | |
79 | term.setTextColor(colors.black) | |
80 | if password ~= nil then | |
81 | if menuOption == 0 then | |
82 | term.setBackgroundColor(colors.lightGray) | |
83 | end | |
84 | btnSendX = printCenter("[ SEND ]", h / 2 + 3) | |
85 | term.setBackgroundColor(colors.orange) | |
86 | if menuOption == 1 then | |
87 | term.setBackgroundColor(colors.lightGray) | |
88 | end | |
89 | btnReadX = printCenter("[ READ ]", h / 2 + 4) | |
90 | term.setBackgroundColor(colors.orange) | |
91 | if menuOption == 2 then | |
92 | term.setBackgroundColor(colors.lightGray) | |
93 | end | |
94 | btnExitX = printCenter("[ EXIT ]", h / 2 + 5) | |
95 | term.setBackgroundColor(colors.orange) | |
96 | else | |
97 | if menuOption == 0 then | |
98 | term.setBackgroundColor(colors.lightGray) | |
99 | end | |
100 | btnSendX = printCenter("[ SIGN IN ]", h / 2 + 3) | |
101 | term.setBackgroundColor(colors.orange) | |
102 | if menuOption == 1 then | |
103 | term.setBackgroundColor(colors.lightGray) | |
104 | end | |
105 | btnReadX = printCenter("[ SIGN UP ]", h / 2 + 4) | |
106 | term.setBackgroundColor(colors.orange) | |
107 | if menuOption == 2 then | |
108 | term.setBackgroundColor(colors.lightGray) | |
109 | end | |
110 | btnReadX = printCenter("[ EXIT ]", h / 2 + 5) | |
111 | term.setBackgroundColor(colors.orange) | |
112 | end | |
113 | end | |
114 | ||
115 | function drawLabel() | |
116 | term.setBackgroundColor(colors.lightGray) | |
117 | term.setCursorPos(1, 1) | |
118 | term.clearLine() | |
119 | printCenter("CRAFTMAIL CLIENT", 1) | |
120 | term.setBackgroundColor(colors.red) | |
121 | term.setTextColor(colors.black) | |
122 | term.setCursorPos(w,1) | |
123 | write("X") | |
124 | end | |
125 | ||
126 | function drawState(id) | |
127 | if id == 2 then | |
128 | term.setBackgroundColor(colors.orange) | |
129 | term.setTextColor(colors.black) | |
130 | term.setCursorPos(w / 2 - 5, 6) | |
131 | write("RECIPIENT:") | |
132 | paintutils.drawFilledBox(w / 2 - 5, 7, w / 2 + 5, 7, colors.lightGray) | |
133 | term.setCursorPos(w / 2 - 5, 8) | |
134 | term.setBackgroundColor(colors.orange) | |
135 | write("SUBJECT:") | |
136 | paintutils.drawFilledBox(w / 2 - 10, 9, w / 2 + 10, 9, colors.lightGray) | |
137 | term.setCursorPos(1, 10) | |
138 | term.setBackgroundColor(colors.orange) | |
139 | write("MESSAGE (MULTILINE NOT SUPPORTED):") | |
140 | term.setCursorPos(1, 11) | |
141 | elseif id == 1 then | |
142 | drawLogo() | |
143 | paintutils.drawFilledBox(w / 2 - 5, h - 6, w / 2 + 5, h - 6, colors.lightGray) | |
144 | elseif id == -1 then | |
145 | drawLogo() | |
146 | elseif id == 3 then | |
147 | line = 3 | |
148 | term.setBackgroundColor(colors.orange) | |
149 | term.setTextColor(colors.black) | |
150 | term.setCursorPos(1, 1) | |
151 | term.clearLine() | |
152 | write("BACK - BACKSPACE | SCROLL = LEFT & RIGHT ARROWS") | |
153 | term.setBackgroundColor(colors.lightGray) | |
154 | for i = readPage * 8 - 8, readPage * 8, 1 do | |
155 | local v = mails[i + 1] | |
156 | if v ~= nil then | |
157 | term.setCursorPos(1, line) | |
158 | term.clearLine() | |
159 | print(v[2] .. " - " .. string.sub(v[5], 0, w / 2)) | |
160 | line = line + 1 | |
161 | end | |
162 | end | |
163 | term.setBackgroundColor(colors.orange) | |
164 | term.setCursorPos(1, h) | |
165 | write(readPage .. "/" .. math.floor(table.getn(mails) / 8) + 1) | |
166 | elseif id == 4 then | |
167 | local v = mails[selectedMail + 1] | |
168 | term.setCursorPos(1, 1) | |
169 | term.setBackgroundColor(colors.orange) | |
170 | term.setTextColor(colors.black) | |
171 | print("Press BACKSPACE to leave."); | |
172 | print("Mail ID: " .. v[1]) | |
173 | print("From: " .. v[2]) | |
174 | print() | |
175 | print(v[4]) | |
176 | print(string.sub("----------------------------------------------------------------------------", 0, w)) | |
177 | print(v[5]) | |
178 | end | |
179 | end | |
180 | ||
181 | function draw() | |
182 | drawBackground() | |
183 | if state == 0 then | |
184 | drawMenu() | |
185 | else | |
186 | drawState(state) | |
187 | end | |
188 | end | |
189 | ||
190 | drawBackground() | |
191 | drawMenu() | |
192 | ||
193 | while true do | |
194 | local event, param1, param2, param3 = os.pullEvent() | |
195 | if event == "key" then | |
196 | if state == 0 then | |
197 | if param1 == keys.down then | |
198 | if menuOption == 0 then | |
199 | menuOption = 1 | |
200 | elseif menuOption == 1 then | |
201 | menuOption = 2 | |
202 | end | |
203 | drawMenu() | |
204 | elseif param1 == keys.up then | |
205 | if menuOption == 2 then | |
206 | menuOption = 1 | |
207 | elseif menuOption == 1 then | |
208 | menuOption = 0 | |
209 | end | |
210 | drawMenu() | |
211 | elseif param1 == keys.enter then | |
212 | if menuOption == 2 then | |
213 | break | |
214 | end | |
215 | if password ~= nil then | |
216 | if menuOption == 0 then | |
217 | state = 2 | |
218 | draw() | |
219 | term.setCursorPos(w / 2 - 5, 7) | |
220 | term.setBackgroundColor(colors.lightGray) | |
221 | local recipient = limitRead(10, false) | |
222 | term.setCursorPos(w / 2 - 10, 9) | |
223 | local subject = limitRead(20, true) | |
224 | term.setCursorPos(1, 11) | |
225 | term.setBackgroundColor(colors.orange) | |
226 | local message = limitRead((h - 11) * w, true) | |
227 | term.setBackgroundColor(colors.orange) | |
228 | term.clear() | |
229 | printCenter("Accessing remote database", h / 2) | |
230 | local page = http.get("http://midnightasapi.vapr.cc/?request=mail&username=" .. username .. "&password=" .. textutils.urlEncode(password) .. "&recipient=" .. recipient .. "&subject=" .. textutils.urlEncode(subject) .. "&message=" .. textutils.urlEncode(message)) | |
231 | local pageContent = page.readAll() | |
232 | if string.find(pageContent, "1") then | |
233 | printCenter("Mail sent", h / 2 + 1) | |
234 | elseif string.find(pageContent, "0") then | |
235 | printCenter("Error found", h / 2 + 1) | |
236 | end | |
237 | printCenter("Press any key to continue", h / 2 + 2) | |
238 | os.pullEvent("key") | |
239 | state = 0 | |
240 | draw() | |
241 | elseif menuOption == 1 then | |
242 | term.setBackgroundColor(colors.orange) | |
243 | term.clear() | |
244 | printCenter("Accessing remote database", h / 2) | |
245 | local page = http.get("http://midnightasapi.vapr.cc/?request=read&username=" .. username .. "&password=" .. textutils.urlEncode(password)) | |
246 | mails = {} | |
247 | local obj = json.decode(page.readAll()) | |
248 | for k in pairs(obj) do | |
249 | local v = obj[k] | |
250 | table.insert(mails, obj[k]) | |
251 | end | |
252 | printCenter("Request successful", h / 2 + 1) | |
253 | printCenter("Press any key to continue", h / 2 + 2) | |
254 | os.pullEvent("key") | |
255 | state = 3 | |
256 | draw() | |
257 | end | |
258 | else | |
259 | if menuOption == 0 then | |
260 | state = 1 | |
261 | draw() | |
262 | term.setCursorPos(w / 2 - 5, h - 7) | |
263 | term.setBackgroundColor(colors.orange) | |
264 | term.setTextColor(colors.black) | |
265 | write("USERNAME:") | |
266 | term.setBackgroundColor(colors.lightGray) | |
267 | term.setCursorPos(w / 2 - 5, h - 6) | |
268 | local newUsername = limitRead(10, false) | |
269 | term.setBackgroundColor(colors.orange) | |
270 | term.setCursorPos(w / 2 - 5, h - 5) | |
271 | write("PASSWORD:") | |
272 | paintutils.drawFilledBox(w / 2 - 5, h - 4, w / 2 + 5, h - 4, colors.lightGray) | |
273 | term.setBackgroundColor(colors.lightGray) | |
274 | term.setCursorPos(w / 2 - 5, h - 4) | |
275 | newPassword = limitRead(10, true, "*") | |
276 | term.setBackgroundColor(colors.orange) | |
277 | term.clear() | |
278 | printCenter("Accessing remote database", h / 2) | |
279 | local page = http.get("http://midnightasapi.vapr.cc/?request=login&username=" .. newUsername .. "&password=" .. textutils.urlEncode(newPassword)) | |
280 | local pageContent = page.readAll() | |
281 | if string.find(pageContent, "1") then | |
282 | printCenter("Request successful", h / 2 + 1) | |
283 | username = newUsername | |
284 | password = newPassword | |
285 | elseif string.find(pageContent, "0") then | |
286 | printCenter("Invalid credentials", h / 2 + 1) | |
287 | end | |
288 | printCenter("Press any key to continue", h / 2 + 2) | |
289 | os.pullEvent("key") | |
290 | state = 0 | |
291 | draw() | |
292 | elseif menuOption == 1 then | |
293 | state = -1 | |
294 | draw() | |
295 | paintutils.drawFilledBox(w / 2 - 5, h - 6, w / 2 + 5, h - 6, colors.lightGray) | |
296 | term.setBackgroundColor(colors.orange) | |
297 | term.setTextColor(colors.black) | |
298 | term.setCursorPos(w / 2 - 5, h - 7) | |
299 | write("USERNAME:") | |
300 | term.setBackgroundColor(colors.lightGray) | |
301 | term.setCursorPos(w / 2 - 5, h - 6) | |
302 | local newUsername = limitRead(10, false) | |
303 | term.setBackgroundColor(colors.orange) | |
304 | term.setCursorPos(w / 2 - 5, h - 5) | |
305 | write("PASSWORD:") | |
306 | paintutils.drawFilledBox(w / 2 - 5, h - 4, w / 2 + 5, h - 4, colors.lightGray) | |
307 | term.setBackgroundColor(colors.lightGray) | |
308 | term.setCursorPos(w / 2 - 5, h - 4) | |
309 | local newPassword = limitRead(10, true, "*") | |
310 | term.setBackgroundColor(colors.orange) | |
311 | term.clear() | |
312 | printCenter("Accessing remote database", h / 2) | |
313 | local page = http.get("http://midnightasapi.vapr.cc/?request=register&username=" .. newUsername .. "&password=" .. textutils.urlEncode(newPassword)) | |
314 | local pageContent = page.readAll() | |
315 | if string.find(pageContent, "1") then | |
316 | printCenter("Registration successful", h / 2 + 1) | |
317 | elseif string.find(pageContent, "0") then | |
318 | printCenter("Username already is registered", h / 2 + 1) | |
319 | elseif string.find(pageContent, "2") then | |
320 | printCenter("Using hacked client, cancelling registration.", h / 2 + 1) | |
321 | end | |
322 | printCenter("Press any key to continue", h / 2 + 2) | |
323 | os.pullEvent("key") | |
324 | state = 0 | |
325 | draw() | |
326 | end | |
327 | end | |
328 | end | |
329 | elseif state == 3 then | |
330 | if param1 == keys.backspace then | |
331 | state = 0 | |
332 | draw() | |
333 | elseif param1 == keys.left then | |
334 | if readPage > 1 then | |
335 | readPage = readPage - 1 | |
336 | end | |
337 | elseif param1 == keys.right then | |
338 | if readPage < math.floor(table.getn(mails) / 8) + 1 then | |
339 | readPage = readPage + 1 | |
340 | end | |
341 | end | |
342 | elseif state == 4 then | |
343 | if param1 == keys.backspace then | |
344 | state = 3 | |
345 | draw() | |
346 | elseif param1 == keys.delete then | |
347 | term.setBackgroundColor(colors.orange) | |
348 | term.clear() | |
349 | printCenter("Accessing remote database", h / 2) | |
350 | local page = http.get("http://midnightasapi.vapr.cc/?request=deletemail&username=" .. username .. "&password=" .. textutils.urlEncode(password) .. "&id=" .. mails[selectedMail + 1][1]) | |
351 | local pageContent = page.readAll() | |
352 | if string.find(pageContent, "1") then | |
353 | printCenter("Mail deleted", h / 2 + 1) | |
354 | elseif string.find(pageContent, "0") then | |
355 | printCenter("Failed to delete mail.", h / 2 + 1) | |
356 | end | |
357 | printCenter("Press any key to continue", h / 2 + 2) | |
358 | os.pullEvent("key") | |
359 | state = 0 | |
360 | draw() | |
361 | end | |
362 | end | |
363 | elseif event == "mouse_click" then | |
364 | if state == 3 then | |
365 | if param3 >= 3 and param3 <= 11 then | |
366 | selectedMail = (8 * readPage) - 8 + param3 - 3 | |
367 | if mails[selectedMail + 1] ~= nil then | |
368 | state = 4 | |
369 | draw() | |
370 | end | |
371 | end | |
372 | end | |
373 | end | |
374 | end | |
375 | term.setBackgroundColor(colors.black) | |
376 | term.setTextColor(colors.yellow) | |
377 | term.clear() | |
378 | term.setCursorPos(1, 1) | |
379 | print("Thank you for using CraftMail service.") | |
380 | print("Project by Midnightas") |