commit d4b070754a2c5021aef8a10077d6870c243a0e48 Author: Er2 Date: Wed Mar 2 19:51:55 2022 +0300 init diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..45e7f1d --- /dev/null +++ b/main.lua @@ -0,0 +1,100 @@ +local socket = require 'socket' +local tcp = socket.bind('*', 8080) +tcp:settimeout(0) + +motd = { + ' __ ' , + ' ___________/__\\___________ ', + ' / _ _ -__ - ___ - \\', + ' \\__________________________/', + ' | | ' , + ' | | ' , + ' _____| |______ ' , + ' ___| | | |___ ' , + ' | | | | | | ' , + '___|___|____/____\\_____|___|___', + '', + ' Welcome to Er2Chat!', + ' You need to login to continue', +} + +local cls = {} +local tmp = {} + +local function get(v) + v.buf = v.buf or '' + local l, err + while not err do + l, err = v.cli:receive(1) + if l == '\r' or l == '\n' then + if v.le then v.cli:send '\r\n' end + l, v.buf = v.buf, nil + break + elseif l == '\127' + then v.cli:send '\008' + v.buf = v.buf:sub(1, -2) + elseif l then + v.buf = v.buf.. l + if v.le then v.cli:send(l) end + end + end + return l, err +end + +while true do + local cli = tcp:accept() + if cli then + cli:settimeout(0) + if (cli:receive() or ''):match 'GET /.* HTTP.*' + then cli:send('HTTP/1.1 200 OK\r\n\r\nPlease use telnet to use this service.') + cli:close() + else cli:send(table.concat(motd, '\r\n')..'\r\n') + table.insert(tmp, { + cli = cli, + st = 0, + }) + end + end + for k, v in pairs(tmp) do + if v.reads then -- nothing + elseif v.st == 0 then v.cli:send('Do you need input echo? [YNQ] ') + elseif v.st == 1 then v.cli:send('Username: ') + elseif v.st == 2 then v.cli:send('Password: ') + elseif v.st == 3 then v.cli:send('Welcome, '.. v.user ..'!\r\n') + for _, w in pairs(cls) do + w.cli:send('\r\n-- '.. v.user ..' joined --\r\n') + end + v.st, v.reads = nil, nil + table.remove(tmp, k) + table.insert(cls, v) + end + if v.st then v.reads = true + local l, err = get(v) + if err == 'timeout' then -- nothing + elseif err then table.remove(tmp, k) + elseif (l or ''):match '^%s*$' then v.reads = false + elseif v.st == 0 then v.st, v.reads = 1, false + if l:match 'y' + then v.le = true; v.cli:send(l.. '\r\n') + elseif l:match 'q' + then v.cli:close(); table.remove(tmp, k) + end + elseif v.st == 1 then v.st, v.user, v.reads = 3, l:match '^%S+', false + elseif v.st == 2 then v.st, v.reads = 1, false + end + end + end + for k, v in pairs(cls) do + local l, err = get(v) + if l == '/leave' then v.cli:close(); err = 'closed' + end + if err and err ~= 'timeout' then table.remove(cls, k) end + for j, w in pairs(cls) do + if err and err ~= 'timeout' + then w.cli:send('\r\n-- '.. v.user ..' leaved --\r\n') + elseif (l or ''):match '^%s*$' then -- nothing + elseif k ~= j then w.cli:send('\r\n'.. v.user ..': '.. l ..'\r\n') + end + end + end +end diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..b6488b3 --- /dev/null +++ b/readme.md @@ -0,0 +1,37 @@ +``` + __ + ___________/__\___________ + / _ _ -__ - ___ - \ + \__________________________/ + | | + | | + _____| |______ + ___| | | |___ + | | | | | | +___|___|____/____\_____|___|___ + + Welcome to Er2Chat! + You need to login to continue +Do you need input echo? [YNQ] +``` + +--- + +This is yet another telnet chat. + +This server supports both clients with \r, \n and \r\n newline. +(This means it supports `nc/telnet` and Android `ConnectBot` client) + +Server currently is very simple and stupid, but can be improved. + +# Running + +To run this server, you need: + +- **Lua** (from 5.1, supports luajit) + +- **LuaSocket** (or **LuaSec**). + `# luarocks install luasocket` + +To start now, just type: +`$ lua main.lua`