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 |