111 lines
2.6 KiB
Lua
111 lines
2.6 KiB
Lua
|
local term = require "term"
|
||
|
local event = require "event"
|
||
|
local process = require "process"
|
||
|
local net = require "net"
|
||
|
local computer = require "computer"
|
||
|
local gpu = term.gpu()
|
||
|
|
||
|
local tArgs = {...}
|
||
|
local server, port = (tArgs[1]:match("(.+):%d+") or tArgs[1]), (tonumber(tArgs[1]:match(".+:(%d+)")) or 194)
|
||
|
local nick = tArgs[2]
|
||
|
local x, y = gpu.getResolution()
|
||
|
local colours = {"37","31","32","34"}
|
||
|
local run = true
|
||
|
local s = false
|
||
|
local ow = process.info().data.window
|
||
|
local nw = term.internal.open(0,0,x,y-1)
|
||
|
term.bind(term.gpu(), nw)
|
||
|
|
||
|
term.clear()
|
||
|
|
||
|
local function gncolour(nick)
|
||
|
local n = 0
|
||
|
for c in nick:gmatch(".") do
|
||
|
n = n + c:byte()
|
||
|
end
|
||
|
n = (n % #colours) + 1
|
||
|
return colours[n]
|
||
|
end
|
||
|
local function colourize(nick)
|
||
|
return "\27["..gncolour(nick).."m"..nick.."\27[0m"
|
||
|
end
|
||
|
|
||
|
local function formatLine(...)
|
||
|
local tA = {...}
|
||
|
return string.format("%s"..("\t%s"):rep(#tA-1).."\n", ...)
|
||
|
end
|
||
|
|
||
|
local function linemsg(message)
|
||
|
process.info().data.window = nw
|
||
|
gpu.copy(1,2,x,y-2,0,-1)
|
||
|
local ox, oy = term.getCursor()
|
||
|
term.setCursor(1,y-1)
|
||
|
term.clearLine()
|
||
|
io.write(message)
|
||
|
term.setCursor(ox,oy)
|
||
|
process.info().data.window = ow
|
||
|
end
|
||
|
local function handlemsg(nick,message)
|
||
|
linemsg("<"..colourize(nick).."> "..message)
|
||
|
end
|
||
|
|
||
|
function connect()
|
||
|
linemsg("Connecting to "..server..":"..tostring(port))
|
||
|
s = net.open(server,port)
|
||
|
linemsg("Connected! Sending nick...")
|
||
|
s:write("nick\t"..nick.."\n")
|
||
|
end
|
||
|
|
||
|
connect()
|
||
|
|
||
|
local function readLoop()
|
||
|
local line = s.rbuffer:match("(.-)\n")
|
||
|
local tCmd = {}
|
||
|
for w in line:gmatch("[^\t]+") do
|
||
|
tCmd[#tCmd+1] = w
|
||
|
end
|
||
|
s:read(line:len()+1)
|
||
|
if tCmd[1] == "msg" and tCmd[2] and tCmd[3] then
|
||
|
handlemsg(tCmd[2], tCmd[3])
|
||
|
elseif tCmd[1] == "topic" then
|
||
|
linemsg("Topic: "..tCmd[2])
|
||
|
elseif tCmd[1] == "nick" then
|
||
|
linemsg(colourize(tCmd[2]).." changed nick to " .. colourize(tCmd[3]))
|
||
|
elseif tCmd[1] == "quit" then
|
||
|
linemsg(colourize(tCmd[2]) .. " has quit.")
|
||
|
elseif tCmd[1] == "join" then
|
||
|
linemsg(colourize(tCmd[2]) .. " has joined.")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local timer = event.timer(0.5,readLoop,math.huge)
|
||
|
|
||
|
while run do
|
||
|
io.write("\27["..tostring(y)..";1H["..nick.."] ")
|
||
|
msg = term.read({},false):sub(1,-2)
|
||
|
term.clearLine()
|
||
|
if msg:sub(1,1) == "/" then
|
||
|
local cmd = msg:sub(2)
|
||
|
local tCmd = {}
|
||
|
for w in cmd:gmatch("%S+") do
|
||
|
tCmd[#tCmd+1] = w
|
||
|
end
|
||
|
if tCmd[1] == "quit" then
|
||
|
linemsg("Disconnecting from server...")
|
||
|
s:close()
|
||
|
run = false
|
||
|
elseif tCmd[1] == "nick" then
|
||
|
nick = tCmd[2]
|
||
|
s:write(formatLine("nick",nick))
|
||
|
end
|
||
|
else
|
||
|
s:write(formatLine("msg",msg))
|
||
|
end
|
||
|
if s.state ~= "open" then
|
||
|
linemsg("Disconnected from server, exiting")
|
||
|
run = false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
event.cancel(timer)
|