diff options
| -rwxr-xr-x | telem.lua | 250 | 
1 files changed, 250 insertions, 0 deletions
| diff --git a/telem.lua b/telem.lua new file mode 100755 index 0000000..d5c985b --- /dev/null +++ b/telem.lua @@ -0,0 +1,250 @@ +#!/usr/bin/lua5.2 + +io = require("io") +os = require("os") +lfs = require("lfs") +string = require("string") +table = require("table") + +bad_topics = {} +bad_topics["."] = true +bad_topics[".."] = true +bad_topics["topic"] = true + +current_board = "" +current_thread_index = nil + +function cat_file(filename) +	io.input(filename) +	welcome = io.read("*all") +	io.input(io.stdin) +	io.write(welcome) +end + +function show_welcome() +	cat_file("/var/bbs/docs/welcome") +end + +function show_prompt() +	io.write("["..current_board.."] COMMAND :> ") +end + +function getchar() +	local char +	os.execute("/bin/stty -icanon") +	char = io.read(1) +	os.execute("/bin/stty icanon") +	return char +end + +function get_threads(board) +	local threads = {} +	for topic in lfs.dir("/var/bbs/boards/"..board) do +		if bad_topics[topic] == nil then +			thread = {} +			thread.filename = topic +			thread.directory = "/var/bbs/boards/"..board.."/"..topic +			_, _, timestamp, thread.author = string.find(topic, "(%d+)-(%a+)") +			thread.timestamp = tonumber(timestamp) + +			io.input(thread.directory.."/original") +			io.read("*line") +			thread.subject = io.read("*line") +			_, _, thread.subject = string.find(thread.subject, "%[SUBJECT%] (.+)") +			io.input(io.stdin) + +			posts = get_posts(thread) +			thread.post_count = #posts +			thread.updated = 0 +			for _, post in ipairs(posts) do +				if post.timestamp > thread.updated then +					thread.updated = post.timestamp +				end +			end +			table.insert(threads, thread) +			 +		end +	end +	table.sort(threads, function(x,y) return x.updated > y.updated end) +	return threads +end + +function get_posts(thread) +	local posts = {} +	for reply in lfs.dir(thread.directory) do +		if string.sub(reply, 1,1) ~= "." then +			post = {} +			post.filename = thread.directory .. "/" .. reply +			if reply == "original" then +				post.author = thread.author +				post.timestamp = thread.timestamp +			else +				_, _, timestamp, post.author = string.find(reply, "(%d+)-(%a+)") +				post.timestamp = tonumber(timestamp) +			end +			table.insert(posts, post) +		end +	end +	table.sort(posts, function(x,y) return x.timestamp < y.timestamp end) +	return posts +end + +function do_go() +	print("Which board?") +	board = string.upper(io.read()) +	-- TODO: display list of boards only if no board entered +	if board == "" then +		do_list() +	elseif boards[board] == nil then +		print("No such board") +	else +		current_board = board +	end +end + +function do_help() +	cat_file("/var/bbs/docs/help") +end + +function do_help2() +	cat_file("/var/bbs/docs/help2") +end + +function do_list() +	for _,b in pairs(board_names) do +		posts = -3 -- Don't want to count "topic" file or "." or ".." +		for topic in lfs.dir("/var/bbs/boards/"..b) do +			posts = posts +1 +		end +		print(string.format("%s    [%d posts]", b, posts)) +	end +end + +function do_messages() +	if current_board == "" then +		print("Not at any board") +	else +		threads = get_threads(current_board) +		for i, thread in ipairs(threads) do +			print(tostring(i), os.date("%x %H:%M", thread.timestamp), thread.author, thread.subject) +--, tostring(thread.post_count)) +		end +	end +	current_thread_index = threads +end + +-- Type stuff below + +function do_type_first() +	current_thread_index = 1 +	do_type_show_post(current_thread_index) +	print(string.format("Viewing post %d of %d in thread", current_thread_index, #current_thread_posts)) +end + +function do_type_next() +	if current_thread_index ~= #current_thread_posts then +		current_thread_index = current_thread_index + 1 +	end +	do_type_show_post(current_thread_index) +	print(string.format("Viewing post %d of %d in thread", current_thread_index, #current_thread_posts)) +end + +function do_type_prev() +	if current_thread_index ~= 1 then +		current_thread_index = current_thread_index - 1 +	end +	do_type_show_post(current_thread_index) +	print(string.format("Viewing post %d of %d in thread", current_thread_index, #current_thread_posts)) +end + +function do_type_reply() +end + +type_dispatch = {} +type_dispatch["f"] = do_type_first +type_dispatch["n"] = do_type_next +type_dispatch["p"] = do_type_prev +type_dispatch["d"] = function() return end + +function do_type() +	print("Which thread?") +	local thread_id = string.upper(io.read()) +	thread = current_thread_index[tonumber(thread_id)] +	print("I've been asked to type the thread: " .. thread.subject) +	current_thread_posts = get_posts(thread) +	current_thread_index = #current_thread_posts +	do_type_show_post(current_thread_index) +	print(string.format("Viewing post %d of %d in thread", current_thread_index, #current_thread_posts)) +--	for i, post in ipairs(posts) do +--		print(tostring(i), os.date("%x %H:%M", post.timestamp), post.author) +		--cat_file(post.filename) +--	end +	repeat +		show_type_prompt() +		c = getchar() +		io.write("\n") +		if type_dispatch[c] == nil then +			print("Eh?") +		else	 +			type_dispatch[c]() +		end +	until c == "d" +end + +function show_type_prompt() +	io.write("type prompt ([f]irst, [n]ext, [p]rev, [d]one)>") +end + +function do_type_show_post(index) +	local post = current_thread_posts[index] +	cat_file(post.filename) +end + +function do_quit() +	print("Goodbye!") +end + +function do_rules() +	cat_file("/var/bbs/docs/rules") +end + +function do_stub() +	print("Stub!") +end + +-- MAIN PROGRAM BODY BELOW + +show_welcome() + +boards, board_names = {}, {} +for board in lfs.dir("/var/bbs/boards") do +	if string.sub(board, 1, 1) ~= "." then +		boards[board] = true +		table.insert(board_names, board) +	end +end +table.sort(board_names) +message_index = {} + +-- Build dispatch table mapping chars to functions +dispatch = {} +dispatch["h"] = do_help +dispatch["g"] = do_go +dispatch["l"] = do_list +dispatch["m"] = do_messages +dispatch["q"] = do_quit +dispatch["t"] = do_type +dispatch["?"] = do_help2 +dispatch["!"] = do_rules + +-- Infinite loop of command dispatch +repeat +	show_prompt() +	c = getchar() +	io.write("\n") +	if dispatch[c] == nil then +		print("What?") +	else	 +		dispatch[c]() +	end +until c == "q" | 
