View difference between Paste ID: cKmEV1HC and AHxrKyJz
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