added minitel chat I guess
This commit is contained in:
parent
2fa3af5170
commit
230a04f59f
110
minitel-chat/chat.lua
Normal file
110
minitel-chat/chat.lua
Normal file
@ -0,0 +1,110 @@
|
||||
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)
|
94
minitel-chat/chatd.lua
Normal file
94
minitel-chat/chatd.lua
Normal file
@ -0,0 +1,94 @@
|
||||
local net = require "net"
|
||||
local event = require "event"
|
||||
local syslog = require "syslog"
|
||||
local serial = require "serialization"
|
||||
|
||||
local cfgfile = "/etc/chatd.cfg"
|
||||
local clients = {}
|
||||
local cfg = {}
|
||||
cfg.port = 194
|
||||
cfg.topic = "Welcome to the "..os.getenv("HOSTNAME").." chat server."
|
||||
local timer = false
|
||||
|
||||
local function saveconfig()
|
||||
local f = io.open(cfgfile,"wb")
|
||||
if f then
|
||||
f:write(serial.serialize(cfg))
|
||||
f:close()
|
||||
end
|
||||
end
|
||||
local function loadconfig()
|
||||
local f = io.open(cfgfile,"rb")
|
||||
if f then
|
||||
local newcfg = serial.unserialize(f:read("*a"))
|
||||
f:close()
|
||||
for k,v in pairs(newcfg) do
|
||||
cfg[k] = v
|
||||
end
|
||||
else
|
||||
saveconfig()
|
||||
end
|
||||
end
|
||||
|
||||
local function log(msg,level)
|
||||
syslog(msg,level,"chatd")
|
||||
end
|
||||
|
||||
local function sendToAll(data)
|
||||
for k,v in pairs(clients) do
|
||||
v:write(data)
|
||||
end
|
||||
end
|
||||
local function formatLine(...)
|
||||
local tA = {...}
|
||||
return string.format("%s"..("\t%s"):rep(#tA-1).."\n", ...)
|
||||
end
|
||||
|
||||
local function clientLoop()
|
||||
for sn, socket in pairs(clients) do
|
||||
local line = socket.rbuffer:match("(.+)\n")
|
||||
if line then
|
||||
socket:read(line:len()+1)
|
||||
local tCmd = {}
|
||||
for w in line:gmatch("[^\t]+") do
|
||||
tCmd[#tCmd+1] = w
|
||||
end
|
||||
if tCmd[1] == "nick" then
|
||||
if socket.nick then
|
||||
sendToAll(formatLine("nick",socket.nick,tCmd[2]))
|
||||
else
|
||||
log(tostring(socket.addr)..":"..tostring(socket.port).." connected as "..tCmd[2])
|
||||
socket:write(formatLine("topic",cfg.topic))
|
||||
sendToAll(formatLine("join",tCmd[2]))
|
||||
end
|
||||
socket.nick = tCmd[2]
|
||||
elseif tCmd[1] == "msg" and socket.nick then
|
||||
sendToAll(formatLine("msg",socket.nick,tCmd[2]))
|
||||
end
|
||||
end
|
||||
if socket.state ~= "open" then
|
||||
log(tostring(socket.addr)..":"..tostring(socket.port).." ("..tostring(socket.nick)..") quit")
|
||||
clients[sn] = nil
|
||||
if socket.nick then
|
||||
sendToAll(formatLine("quit",socket.nick))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function handleSocket(s)
|
||||
clients[tostring(s.addr)..":"..tostring(s.port)] = s
|
||||
end
|
||||
|
||||
function start()
|
||||
loadconfig()
|
||||
net.flisten(cfg.port,handleSocket)
|
||||
timer = event.timer(1,clientLoop,math.huge)
|
||||
end
|
||||
function stop()
|
||||
event.ignore("net_msg",handleSocket)
|
||||
event.cancel(timer)
|
||||
for k,v in pairs(clients) do
|
||||
v:close()
|
||||
end
|
||||
end
|
27
programs.cfg
Normal file
27
programs.cfg
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
["minitel-chat"] = {
|
||||
files = {
|
||||
["master/minitel-chat/chat.lua"] = "/bin",
|
||||
},
|
||||
dependencies = {
|
||||
["minitel"] = "",
|
||||
},
|
||||
name = "Minitel Chat",
|
||||
description = "Exceedingly dumb chat client",
|
||||
authors = "Izaya",
|
||||
repo = "tree/master/"
|
||||
},
|
||||
["minitel-chatd"] = {
|
||||
files = {
|
||||
["master/minitel-chat/chatd.lua"] = "//etc/rc.d",
|
||||
},
|
||||
dependencies = {
|
||||
["minitel"] = "",
|
||||
["libsyslog"] = "",
|
||||
},
|
||||
name = "Minitel Chat (Server)",
|
||||
description = "Exceedingly dumb chat server",
|
||||
authors = "Izaya",
|
||||
repo = "tree/master/"
|
||||
},
|
||||
}
|
Loading…
Reference in New Issue
Block a user