SHOW:
|
|
- or go back to the newest paste.
1 | - | chatbox = peripheral.find("chatbox") |
1 | + | -- pastebin get cKmEV1HC pschat |
2 | chatbox = peripheral.find("chatbox_admin") | |
3 | if not chatbox then | |
4 | chatbox = peripheral.find("chatbox") | |
5 | if not chatbox then | |
6 | chatbox = peripheral.find("chat_box") | |
7 | if not chatbox then | |
8 | chatbox = peripheral.find("chatBox") | |
9 | if not chatbox then | |
10 | error("Chatbox required, go get one.") | |
11 | - | local channel = "main" |
11 | + | |
12 | end | |
13 | end | |
14 | end | |
15 | name = "chatboxuser" | |
16 | term.clear() | |
17 | --[[Changelog: 1.4: Added Notification sound. | |
18 | 1.5: Added Join/Leave message. | |
19 | 3.0 now on App Engine! | |
20 | ]]-- | |
21 | --Credit Jesusthekiller for color formatting | |
22 | ||
23 | local split = function(str, pat) local t = {} local fpat = "(.-)"..pat local last_end = 1 local s, e, cap = str:find(fpat, 1) if not s then return {str} end while s do if s ~= 1 or cap ~= "" then table.insert(t,cap) end last_end = e+1 s, e, cap = str:find(fpat, last_end) end if last_end <= #str then cap = str:sub(last_end) table.insert(t, cap) end return t end | |
24 | ||
25 | if not inputMessage then | |
26 | inputMessage = "nil" | |
27 | inputName = "nil" | |
28 | inputSide = "nil" | |
29 | end | |
30 | ||
31 | justStarted = true | |
32 | isRestart=false | |
33 | local channel = "main_chatbox" | |
34 | ||
35 | local trimColor=function(str) | |
36 | str=string.gsub(str,"%#.","") | |
37 | str=string.gsub(str,"%$.","") | |
38 | return str | |
39 | end | |
40 | ||
41 | local history={} | |
42 | ||
43 | local update,colorRead,play,clear,receive,send,processCommand,post,updateDisplay | |
44 | local cprint,cwrite,toCode,cCode,clear,sb,st,sc | |
45 | function sc(x, y) | |
46 | term.setCursorPos(x, y) | |
47 | end | |
48 | ||
49 | function clear(move) | |
50 | sb(colors.black) | |
51 | term.clear() | |
52 | if move ~= false then sc(1,1) end | |
53 | end | |
54 | ||
55 | function sb(color) | |
56 | term.setBackgroundColor(color) | |
57 | end | |
58 | ||
59 | function st(color) | |
60 | term.setTextColor(color) | |
61 | end | |
62 | ||
63 | function cCode(h) | |
64 | if term.isColor() and term.isColor then | |
65 | return 2 ^ (tonumber(h, 16) or 0) | |
66 | else | |
67 | if h == "f" then | |
68 | return colors.black | |
69 | else | |
70 | return colors.white | |
71 | end | |
72 | end | |
73 | end | |
74 | ||
75 | function toCode(n) | |
76 | return string.format('%x', n) | |
77 | end | |
78 | ||
79 | function cwrite(text) | |
80 | text = tostring(text) | |
81 | ||
82 | local i = 0 | |
83 | while true do | |
84 | i = i + 1 | |
85 | if i > #text then break end | |
86 | ||
87 | local c = text:sub(i, i) | |
88 | ||
89 | if c == "\\" then | |
90 | if text:sub(i+1, i+1) == "&" then | |
91 | write("&") | |
92 | i = i + 1 | |
93 | elseif text:sub(i+1, i+1) == "$" then | |
94 | write("$") | |
95 | i = i + 1 | |
96 | else | |
97 | write(c) | |
98 | end | |
99 | elseif c == "#" then | |
100 | st(cCode(text:sub(i+1, i+1))) | |
101 | i = i + 1 | |
102 | elseif c == "$" then | |
103 | sb(cCode(text:sub(i+1, i+1))) | |
104 | i = i + 1 | |
105 | else | |
106 | write(c) | |
107 | end | |
108 | end | |
109 | ||
110 | return | |
111 | end | |
112 | ||
113 | function cprint(text) | |
114 | return cwrite(tostring(text).."\n") | |
115 | end | |
116 | ||
117 | function colorRead( _sReplaceChar, _tHistory ) | |
118 | term.setCursorBlink( true ) | |
119 | ||
120 | local sLine = "" | |
121 | local nHistoryPos = nil | |
122 | local nPos = 0 | |
123 | if _sReplaceChar then | |
124 | _sReplaceChar = string.sub( _sReplaceChar, 1, 1 ) | |
125 | end | |
126 | ||
127 | local w, h = term.getSize() | |
128 | local sx, sy = term.getCursorPos() | |
129 | ||
130 | local function redraw( _sCustomReplaceChar ) | |
131 | local nScroll = 0 | |
132 | if sx + nPos >= w then | |
133 | nScroll = (sx + nPos) - w | |
134 | end | |
135 | ||
136 | term.setCursorPos( sx, sy ) | |
137 | local sReplace = _sCustomReplaceChar or _sReplaceChar | |
138 | if sReplace then | |
139 | cwrite( string.rep(sReplace, string.len(sLine) - nScroll) ) | |
140 | else | |
141 | cwrite( string.sub( sLine, nScroll + 1 ) ) | |
142 | end | |
143 | term.setCursorPos( sx + nPos - (#sLine-#trimColor(sLine)) - nScroll, sy ) | |
144 | end | |
145 | ||
146 | while true do | |
147 | local sEvent, param = os.pullEvent() | |
148 | if sEvent == "char" then | |
149 | sLine = string.sub( sLine, 1, nPos ) .. param .. string.sub( sLine, nPos + 1 ) | |
150 | nPos = nPos + 1 | |
151 | redraw() | |
152 | ||
153 | elseif sEvent == "key" then | |
154 | if param == keys.enter then | |
155 | -- Enter | |
156 | break | |
157 | ||
158 | elseif param == keys.left then | |
159 | -- Left | |
160 | if nPos > #sLine-#trimColor(sLine) then | |
161 | nPos = nPos - 1 | |
162 | redraw() | |
163 | end | |
164 | ||
165 | elseif param == keys.right then | |
166 | -- Right | |
167 | if nPos < #sLine then | |
168 | nPos = nPos + 1 | |
169 | redraw() | |
170 | end | |
171 | ||
172 | elseif param == keys.up or param == keys.down then | |
173 | -- Up or down | |
174 | if _tHistory then | |
175 | redraw(" "); | |
176 | if param == keys.up then | |
177 | -- Up | |
178 | if nHistoryPos == nil then | |
179 | if #_tHistory > 0 then | |
180 | nHistoryPos = #_tHistory | |
181 | end | |
182 | elseif nHistoryPos > 1 then | |
183 | nHistoryPos = nHistoryPos - 1 | |
184 | end | |
185 | else | |
186 | -- Down | |
187 | if nHistoryPos == #_tHistory then | |
188 | nHistoryPos = nil | |
189 | elseif nHistoryPos ~= nil then | |
190 | nHistoryPos = nHistoryPos + 1 | |
191 | end | |
192 | end | |
193 | ||
194 | if nHistoryPos then | |
195 | sLine = _tHistory[nHistoryPos] | |
196 | nPos = string.len( sLine ) | |
197 | else | |
198 | sLine = "" | |
199 | nPos = 0 | |
200 | end | |
201 | redraw() | |
202 | end | |
203 | elseif param == keys.backspace then | |
204 | -- Backspace | |
205 | if nPos > 0 then | |
206 | redraw(" "); | |
207 | sLine = string.sub( sLine, 1, nPos - 1 ) .. string.sub( sLine, nPos + 1 ) | |
208 | nPos = nPos - 1 | |
209 | redraw() | |
210 | end | |
211 | elseif param == keys.home then | |
212 | -- Home | |
213 | nPos = 0 | |
214 | redraw() | |
215 | elseif param == keys.delete then | |
216 | if nPos < string.len(sLine) then | |
217 | redraw(" "); | |
218 | sLine = string.sub( sLine, 1, nPos ) .. string.sub( sLine, nPos + 2 ) | |
219 | - | name = ... |
219 | + | |
220 | end | |
221 | elseif param == keys["end"] then | |
222 | -- End | |
223 | nPos = string.len(sLine) | |
224 | redraw() | |
225 | end | |
226 | end | |
227 | end | |
228 | ||
229 | term.setCursorBlink( false ) | |
230 | term.setCursorPos( w + 1, sy ) | |
231 | print() | |
232 | ||
233 | return sLine | |
234 | end | |
235 | ||
236 | local postLink,getLink | |
237 | postLink="http://http-chat-serv.appspot.com/post" | |
238 | getLink="http://http-chat-serv.appspot.com/get" | |
239 | updateLink = "https://raw.github.com/MudkipTheEpic/chatHTTP/master/Client" | |
240 | currentProgram = shell.getRunningProgram() | |
241 | --name = ... | |
242 | screenX, screenY = term.getSize() | |
243 | screenY = screenY-2 | |
244 | version = "3.0" | |
245 | data = {} | |
246 | if not fs.exists("/.chatData") then | |
247 | fs.makeDir("/.chatData") | |
248 | end | |
249 | if fs.exists("/.chatData/data") then | |
250 | file = fs.open("/.chatData/data", "r") | |
251 | data.file = file.readAll() | |
252 | password = data.file | |
253 | file.close() | |
254 | else | |
255 | password = "guest" | |
256 | end | |
257 | local function centerWrite(text, ny) | |
258 | if type(text) == "table" then for _, v in pairs(text) do centerPrint(v) end | |
259 | else | |
260 | local x, y = term.getCursorPos() | |
261 | local w, h = term.getSize() | |
262 | term.setCursorPos(w/2 - text:len()/2 + (#text % 2 == 0 and 1 or 0), ny or y) | |
263 | cwrite(text) | |
264 | end | |
265 | end | |
266 | ||
267 | function updateDisplay(txt) | |
268 | term.setCursorPos(1, screenY) | |
269 | term.clearLine() | |
270 | centerWrite(txt) | |
271 | end | |
272 | ||
273 | local post=function(txt,txt2) txt=txt2 or txt return http.get(postLink,{usr = trimColor(name), data = txt, chan = channel}) end | |
274 | local cmdpost=function(txt,txt2) txt=txt2 or txt return http.get(postLink,{usr = trimColor(name), cmd=txt, pass=password}) end | |
275 | ||
276 | local commandTable={ | |
277 | update=function() return update() end; | |
278 | version=function() | |
279 | return updateDisplay("Version: "..version) | |
280 | end; | |
281 | exit=function(...) local l if #{...}>0 then l=" ["..table.concat({...}," ").."]" else l="" end post(name.."#0$f left the room."..l) return error(nil,3) end; | |
282 | me=function(...) | |
283 | local str=table.concat({...}," ") | |
284 | return post("*"..name.."#0$f "..str) | |
285 | end; | |
286 | nick=function(newNick) | |
287 | if not newNick or newNick=="" then updateDisplay("Please supply a nickname.") return nil end | |
288 | post(name.."#0$f has changed nick to "..newNick) | |
289 | name=newNick | |
290 | return newNick | |
291 | end; | |
292 | ping=function() | |
293 | updateDisplay(split(cmdpost("ping").readAll(), "\n")[2]) | |
294 | end; | |
295 | server=function(...) | |
296 | local args = {...} | |
297 | sendstr = table.concat(args, " ") | |
298 | return updateDisplay(split(cmdpost(sendstr).readAll(), "\n")[2]) | |
299 | end; | |
300 | swapServ=function(...) | |
301 | local args = {...} | |
302 | local sendstr = "mvserv "..table.concat(args, " ") | |
303 | return updateDisplay(split(cmdpost(sendstr).readAll(), "\n")[2]) | |
304 | end; | |
305 | swapChannel=function(channel) | |
306 | local sendstr = "chanc "..channel | |
307 | return updateDisplay(split(cmdpost(sendstr).readAll(), "\n")[2]) | |
308 | end; | |
309 | } | |
310 | ||
311 | ServCmdTbl = { | |
312 | mvserv = function(NewServ) | |
313 | post(name.."#0$f has left this server") | |
314 | postLink="http://"..NewServ[3] | |
315 | getLink="http://"..NewServ[4] | |
316 | post(name.."#0$f has joined this server") | |
317 | end; | |
318 | cc = function(ChannelData) | |
319 | post(name.."#0$f has left this channel") | |
320 | channel = ChannelData[3] | |
321 | post(name.."#0$f has joined this channel") | |
322 | end; | |
323 | } | |
324 | ||
325 | function ProcServCmd(str) | |
326 | local data2 = split(str, "\n") | |
327 | str2 = data2[#data2] | |
328 | if str2:sub(1,10) == "servercmd;" then | |
329 | local strT = split(str2, ";") | |
330 | for k,v in pairs(ServCmdTbl) do | |
331 | if "servercmd;"..k == strT[1]..";"..strT[2] then | |
332 | cmd = strT[2] | |
333 | ServCmdTbl[cmd](strT) | |
334 | return false | |
335 | end | |
336 | end | |
337 | return true | |
338 | end | |
339 | return true | |
340 | end | |
341 | ||
342 | function processCommand(str) | |
343 | if str:sub(1,1)=="/" then | |
344 | local strT=split(str," ") | |
345 | for k,v in pairs(commandTable) do | |
346 | if "/"..k==strT[1] then | |
347 | return commandTable[strT[1]:sub(2)] | |
348 | end | |
349 | end | |
350 | return 4 | |
351 | end | |
352 | return false | |
353 | end | |
354 | --cake | |
355 | function update() | |
356 | updateContent = http.get(updateLink) | |
357 | updateContent = updateContent.readAll() | |
358 | file = fs.open(currentProgram, "r") | |
359 | fileContent = file.readAll() | |
360 | file.close() | |
361 | if fileContent == updateContent then | |
362 | term.setCursorPos(1, screenY) | |
363 | write(currentProgram.." is up to date!") | |
364 | else | |
365 | term.setCursorPos(1, screenY) | |
366 | write("New update available! Installing now...") | |
367 | sleep(1) | |
368 | file = fs.open(currentProgram, "w") | |
369 | file.write(updateContent) | |
370 | file.close() | |
371 | term.setCursorPos(1, screenY) | |
372 | term.clearLine() | |
373 | write("Done! Restarting "..currentProgram.." now!") | |
374 | isRestart=true | |
375 | commandTable["exit"]("Updating client...") | |
376 | end | |
377 | ||
378 | end | |
379 | --test | |
380 | function play() | |
381 | redstone.setOutput("back", true) | |
382 | sleep(0.1) | |
383 | redstone.setOutput("back", false) | |
384 | - | get = http.get(getLink, {usr= name, slines=10, chan = channel}) |
384 | + | |
385 | - | get = get.readAll() |
385 | + | |
386 | - | tget = get |
386 | + | |
387 | redstone.setOutput("back",false) | |
388 | sleep(0.05) | |
389 | redstone.setOutput("back",true) | |
390 | sleep(0.1) | |
391 | redstone.setOutput("back",false) | |
392 | end | |
393 | ||
394 | function clearY(fromY, toY) | |
395 | - | if string.find(get, "#4") then |
395 | + | |
396 | - | lastmsg = string.sub(tget, (#tget-string.find(string.reverse(tget), "4#")+2), #get) |
396 | + | |
397 | - | chatbox.say(lastmsg) |
397 | + | |
398 | - | end |
398 | + | |
399 | term.clearLine() | |
400 | fromY = fromY+1 | |
401 | until fromY >= toY | |
402 | - | play() |
402 | + | |
403 | ||
404 | function receive() | |
405 | while true do | |
406 | - | sleep(2) |
406 | + | get = http.get(getLink, {usr= name, slines=1, chan = channel}) |
407 | lastget = http.get(getLink, {usr= name, slines=1, chan = channel}) | |
408 | if not get then error("Lost connection to server...") end | |
409 | get = get.readAll() | |
410 | lastget = lastget.readAll() | |
411 | tget = get | |
412 | - | --[[ |
412 | + | |
413 | - | term.setCursorPos(1, screenY+1) |
413 | + | |
414 | - | cwrite(name..": ") |
414 | + | |
415 | if dop == true then | |
416 | xOld, yOld = term.getCursorPos() | |
417 | - | input = colorRead(nil,history) |
417 | + | |
418 | - | table.insert(history,input) |
418 | + | |
419 | - | l=processCommand(input) |
419 | + | |
420 | - | if l==4 then updateDisplay("Unknown command.") |
420 | + | -- if string.find(get, "#4") then |
421 | - | elseif l then l(select(2,unpack(split(input," ")))) |
421 | + | -- lastmsg = string.gsub(string.sub(lastget, (#lastget-string.find(string.reverse(lastget), "4#")+2), #lastget), "#0$f", "", 1) |
422 | - | else |
422 | + | lastmsg = string.gsub(lastget,"\\(.)","%1") |
423 | - | post(name.."#0$f: "..input) |
423 | + | if (lastmsg ~= "<"..inputName.."> "..inputMessage) and (justStarted == false) then |
424 | - | end |
424 | + | chatbox.say(lastmsg) |
425 | - | |
425 | + | end |
426 | - | clearY(screenY+1, screenY+2) |
426 | + | justStarted = false |
427 | - | --]] |
427 | + | --end |
428 | - | event, side, name, message = os.pullEvent("chat_message") |
428 | + | |
429 | - | post("<"..name.."> "..message) |
429 | + | |
430 | term.setCursorPos(xOld, yOld) | |
431 | term.setBackgroundColor(colors.black) | |
432 | term.setTextColor(colors.white) | |
433 | - | --[[ |
433 | + | |
434 | sleep(1) | |
435 | - | term.setCursorPos(1, screenY+1) |
435 | + | |
436 | - | if not name then |
436 | + | |
437 | - | write("Please enter a name: ") |
437 | + | |
438 | - | nameInput = colorRead() |
438 | + | |
439 | - | if nameInput == "" or nameInput == nil then |
439 | + | |
440 | - | name = "User"..tostring(math.random(1, 999) |
440 | + | event, inputSide, inputName, inputMessage = os.pullEvent("chat_message") |
441 | - | )else |
441 | + | post("<"..inputName.."> "..inputMessage) |
442 | - | name = nameInput |
442 | + | |
443 | end | |
444 | ||
445 | clearY(screenY+1, screenY+3) | |
446 | - | post(name.."#0$f joined the room!") |
446 | + | |
447 | - | --]] |
447 | + | get = http.get(getLink, {usr = name, slines=1, chan = channel}) |
448 | get = get.readAll() | |
449 | get = getOld | |
450 | - | write("/exit to exit, /update to update.") |
450 | + | |
451 | - | get = http.get(getLink, {usr = name, slines=10, chan = channel}) |
451 | + | |
452 | if isRestart then return shell.run(currentProgram,name) | |
453 | end |