Prompts/Menus can now be handled by lua
This commit is contained in:
parent
83eee32306
commit
f3d8ea9d71
2
bbs.c
2
bbs.c
@ -13,6 +13,7 @@
|
|||||||
#include "inih/ini.h"
|
#include "inih/ini.h"
|
||||||
#include "bbs.h"
|
#include "bbs.h"
|
||||||
#include "lua/lua.h"
|
#include "lua/lua.h"
|
||||||
|
#include "lua/lualib.h"
|
||||||
#include "lua/lauxlib.h"
|
#include "lua/lauxlib.h"
|
||||||
|
|
||||||
int mynode;
|
int mynode;
|
||||||
@ -836,6 +837,7 @@ void runbbs(int socket, char *config_path) {
|
|||||||
luaL_openlibs(L);
|
luaL_openlibs(L);
|
||||||
lua_push_cfunctions(L);
|
lua_push_cfunctions(L);
|
||||||
luaL_dofile(L, buffer);
|
luaL_dofile(L, buffer);
|
||||||
|
lua_close(L);
|
||||||
do_internal_login = 0;
|
do_internal_login = 0;
|
||||||
} else {
|
} else {
|
||||||
do_internal_login = 1;
|
do_internal_login = 1;
|
||||||
|
49
doors.c
49
doors.c
@ -16,6 +16,9 @@
|
|||||||
# include <libutil.h>
|
# include <libutil.h>
|
||||||
#endif
|
#endif
|
||||||
#include "bbs.h"
|
#include "bbs.h"
|
||||||
|
#include "lua/lua.h"
|
||||||
|
#include "lua/lualib.h"
|
||||||
|
#include "lua/lauxlib.h"
|
||||||
|
|
||||||
extern struct bbs_config conf;
|
extern struct bbs_config conf;
|
||||||
extern int mynode;
|
extern int mynode;
|
||||||
@ -234,16 +237,56 @@ int door_menu(int socket, struct user_record *user) {
|
|||||||
int doquit = 0;
|
int doquit = 0;
|
||||||
int dodoors = 0;
|
int dodoors = 0;
|
||||||
char prompt[128];
|
char prompt[128];
|
||||||
|
char buffer[256];
|
||||||
int i;
|
int i;
|
||||||
char c;
|
char c;
|
||||||
|
struct stat s;
|
||||||
|
int do_internal_menu = 0;
|
||||||
|
char *lRet;
|
||||||
|
lua_State *L;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if (conf.script_path != NULL) {
|
||||||
|
sprintf(buffer, "%s/doors.lua", conf.script_path);
|
||||||
|
if (stat(buffer, &s) == 0) {
|
||||||
|
L = luaL_newstate();
|
||||||
|
luaL_openlibs(L);
|
||||||
|
lua_push_cfunctions(L);
|
||||||
|
luaL_loadfile(L, buffer);
|
||||||
|
do_internal_menu = 0;
|
||||||
|
result = lua_pcall(L, 0, 1, 0);
|
||||||
|
if (result) {
|
||||||
|
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
|
||||||
while (!dodoors) {
|
while (!dodoors) {
|
||||||
|
if (do_internal_menu == 1) {
|
||||||
s_displayansi(socket, "doors");
|
s_displayansi(socket, "doors");
|
||||||
|
|
||||||
sprintf(prompt, "\e[0m\r\nTL: %dm :> ", user->timeleft);
|
sprintf(prompt, "\e[0m\r\nTL: %dm :> ", user->timeleft);
|
||||||
s_putstring(socket, prompt);
|
s_putstring(socket, prompt);
|
||||||
|
|
||||||
c = s_getc(socket);
|
c = s_getc(socket);
|
||||||
|
} else {
|
||||||
|
lua_getglobal(L, "menu");
|
||||||
|
result = lua_pcall(L, 0, 1, 0);
|
||||||
|
if (result) {
|
||||||
|
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
|
||||||
|
do_internal_menu = 1;
|
||||||
|
lua_close(L);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lRet = (char *)lua_tostring(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
c = lRet[0];
|
||||||
|
}
|
||||||
switch(tolower(c)) {
|
switch(tolower(c)) {
|
||||||
case 'q':
|
case 'q':
|
||||||
dodoors = 1;
|
dodoors = 1;
|
||||||
@ -272,6 +315,8 @@ int door_menu(int socket, struct user_record *user) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (do_internal_menu == 0) {
|
||||||
|
lua_close(L);
|
||||||
|
}
|
||||||
return doquit;
|
return doquit;
|
||||||
}
|
}
|
||||||
|
46
files.c
46
files.c
@ -9,7 +9,9 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "Xmodem/zmodem.h"
|
#include "Xmodem/zmodem.h"
|
||||||
#include "bbs.h"
|
#include "bbs.h"
|
||||||
|
#include "lua/lua.h"
|
||||||
|
#include "lua/lualib.h"
|
||||||
|
#include "lua/lauxlib.h"
|
||||||
extern struct bbs_config conf;
|
extern struct bbs_config conf;
|
||||||
|
|
||||||
static int doCancel = 0;
|
static int doCancel = 0;
|
||||||
@ -585,14 +587,53 @@ int file_menu(int socket, struct user_record *user) {
|
|||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
char prompt[256];
|
char prompt[256];
|
||||||
|
struct stat s;
|
||||||
|
int do_internal_menu = 0;
|
||||||
|
char *lRet;
|
||||||
|
lua_State *L;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if (conf.script_path != NULL) {
|
||||||
|
sprintf(prompt, "%s/filemenu.lua", conf.script_path);
|
||||||
|
if (stat(prompt, &s) == 0) {
|
||||||
|
L = luaL_newstate();
|
||||||
|
luaL_openlibs(L);
|
||||||
|
lua_push_cfunctions(L);
|
||||||
|
luaL_loadfile(L, prompt);
|
||||||
|
do_internal_menu = 0;
|
||||||
|
result = lua_pcall(L, 0, 1, 0);
|
||||||
|
if (result) {
|
||||||
|
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
|
||||||
while (!dofiles) {
|
while (!dofiles) {
|
||||||
|
if (do_internal_menu == 1) {
|
||||||
s_displayansi(socket, "filemenu");
|
s_displayansi(socket, "filemenu");
|
||||||
|
|
||||||
sprintf(prompt, "\e[0m\r\nDir: (%d) %s\r\nSub: (%d) %s\r\nTL: %dm :> ", user->cur_file_dir, conf.file_directories[user->cur_file_dir]->name, user->cur_file_sub, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->name, user->timeleft);
|
sprintf(prompt, "\e[0m\r\nDir: (%d) %s\r\nSub: (%d) %s\r\nTL: %dm :> ", user->cur_file_dir, conf.file_directories[user->cur_file_dir]->name, user->cur_file_sub, conf.file_directories[user->cur_file_dir]->file_subs[user->cur_file_sub]->name, user->timeleft);
|
||||||
s_putstring(socket, prompt);
|
s_putstring(socket, prompt);
|
||||||
|
|
||||||
c = s_getc(socket);
|
c = s_getc(socket);
|
||||||
|
} else {
|
||||||
|
lua_getglobal(L, "menu");
|
||||||
|
result = lua_pcall(L, 0, 1, 0);
|
||||||
|
if (result) {
|
||||||
|
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
|
||||||
|
do_internal_menu = 1;
|
||||||
|
lua_close(L);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lRet = (char *)lua_tostring(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
c = lRet[0];
|
||||||
|
}
|
||||||
switch(tolower(c)) {
|
switch(tolower(c)) {
|
||||||
case 'i':
|
case 'i':
|
||||||
{
|
{
|
||||||
@ -734,5 +775,8 @@ int file_menu(int socket, struct user_record *user) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (do_internal_menu == 0) {
|
||||||
|
lua_close(L);
|
||||||
|
}
|
||||||
return doquit;
|
return doquit;
|
||||||
}
|
}
|
||||||
|
30
lua_glue.c
30
lua_glue.c
@ -106,6 +106,30 @@ int l_bbsRunDoor(lua_State *L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int l_bbsTimeLeft(lua_State *L) {
|
||||||
|
lua_pushnumber(L, gUser->timeleft);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int l_getMailAreaInfo(lua_State *L) {
|
||||||
|
lua_pushnumber(L, gUser->cur_mail_conf);
|
||||||
|
lua_pushstring(L, conf.mail_conferences[gUser->cur_mail_conf]->name);
|
||||||
|
lua_pushnumber(L, gUser->cur_mail_area);
|
||||||
|
lua_pushstring(L, conf.mail_conferences[gUser->cur_mail_conf]->mail_areas[gUser->cur_mail_area]->name);
|
||||||
|
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
int l_getFileAreaInfo(lua_State *L) {
|
||||||
|
lua_pushnumber(L, gUser->cur_file_dir);
|
||||||
|
lua_pushstring(L, conf.file_directories[gUser->cur_file_dir]->name);
|
||||||
|
lua_pushnumber(L, gUser->cur_file_sub);
|
||||||
|
lua_pushstring(L, conf.file_directories[gUser->cur_file_dir]->file_subs[gUser->cur_file_sub]->name);
|
||||||
|
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
void lua_push_cfunctions(lua_State *L) {
|
void lua_push_cfunctions(lua_State *L) {
|
||||||
lua_pushcfunction(L, l_bbsWString);
|
lua_pushcfunction(L, l_bbsWString);
|
||||||
lua_setglobal(L, "bbs_write_string");
|
lua_setglobal(L, "bbs_write_string");
|
||||||
@ -127,4 +151,10 @@ void lua_push_cfunctions(lua_State *L) {
|
|||||||
lua_setglobal(L, "bbs_mail_scan");
|
lua_setglobal(L, "bbs_mail_scan");
|
||||||
lua_pushcfunction(L, l_bbsRunDoor);
|
lua_pushcfunction(L, l_bbsRunDoor);
|
||||||
lua_setglobal(L, "bbs_run_door");
|
lua_setglobal(L, "bbs_run_door");
|
||||||
|
lua_pushcfunction(L, l_bbsTimeLeft);
|
||||||
|
lua_setglobal(L, "bbs_time_left");
|
||||||
|
lua_pushcfunction(L, l_getMailAreaInfo);
|
||||||
|
lua_setglobal(L, "bbs_cur_mailarea_info");
|
||||||
|
lua_pushcfunction(L, l_getFileAreaInfo);
|
||||||
|
lua_setglobal(L, "bbs_cur_filearea_info");
|
||||||
}
|
}
|
||||||
|
47
mail_menu.c
47
mail_menu.c
@ -7,6 +7,9 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include "jamlib/jam.h"
|
#include "jamlib/jam.h"
|
||||||
#include "bbs.h"
|
#include "bbs.h"
|
||||||
|
#include "lua/lua.h"
|
||||||
|
#include "lua/lualib.h"
|
||||||
|
#include "lua/lauxlib.h"
|
||||||
|
|
||||||
extern struct bbs_config conf;
|
extern struct bbs_config conf;
|
||||||
extern int mynode;
|
extern int mynode;
|
||||||
@ -1080,8 +1083,34 @@ int mail_menu(int socket, struct user_record *user) {
|
|||||||
char *dest_addr;
|
char *dest_addr;
|
||||||
int to_us;
|
int to_us;
|
||||||
int wwiv_to;
|
int wwiv_to;
|
||||||
|
struct stat s;
|
||||||
|
int do_internal_menu = 0;
|
||||||
|
char *lRet;
|
||||||
|
lua_State *L;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if (conf.script_path != NULL) {
|
||||||
|
sprintf(buffer, "%s/mailmenu.lua", conf.script_path);
|
||||||
|
if (stat(buffer, &s) == 0) {
|
||||||
|
L = luaL_newstate();
|
||||||
|
luaL_openlibs(L);
|
||||||
|
lua_push_cfunctions(L);
|
||||||
|
luaL_loadfile(L, buffer);
|
||||||
|
do_internal_menu = 0;
|
||||||
|
result = lua_pcall(L, 0, 1, 0);
|
||||||
|
if (result) {
|
||||||
|
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
|
||||||
while (!domail) {
|
while (!domail) {
|
||||||
|
if (do_internal_menu == 1) {
|
||||||
s_displayansi(socket, "mailmenu");
|
s_displayansi(socket, "mailmenu");
|
||||||
|
|
||||||
|
|
||||||
@ -1089,7 +1118,19 @@ int mail_menu(int socket, struct user_record *user) {
|
|||||||
s_putstring(socket, prompt);
|
s_putstring(socket, prompt);
|
||||||
|
|
||||||
c = s_getc(socket);
|
c = s_getc(socket);
|
||||||
|
} else {
|
||||||
|
lua_getglobal(L, "menu");
|
||||||
|
result = lua_pcall(L, 0, 1, 0);
|
||||||
|
if (result) {
|
||||||
|
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
|
||||||
|
do_internal_menu = 1;
|
||||||
|
lua_close(L);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lRet = (char *)lua_tostring(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
c = lRet[0];
|
||||||
|
}
|
||||||
switch(tolower(c)) {
|
switch(tolower(c)) {
|
||||||
case 'p':
|
case 'p':
|
||||||
{
|
{
|
||||||
@ -1556,7 +1597,9 @@ int mail_menu(int socket, struct user_record *user) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (do_internal_menu == 0) {
|
||||||
|
lua_close(L);
|
||||||
|
}
|
||||||
return doquit;
|
return doquit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
46
main_menu.c
46
main_menu.c
@ -4,6 +4,9 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include "bbs.h"
|
#include "bbs.h"
|
||||||
|
#include "lua/lua.h"
|
||||||
|
#include "lua/lualib.h"
|
||||||
|
#include "lua/lauxlib.h"
|
||||||
|
|
||||||
extern struct bbs_config conf;
|
extern struct bbs_config conf;
|
||||||
|
|
||||||
@ -14,7 +17,34 @@ void main_menu(int socket, struct user_record *user) {
|
|||||||
char buffer[256];
|
char buffer[256];
|
||||||
int i;
|
int i;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
|
int do_internal_menu = 0;
|
||||||
|
char *lRet;
|
||||||
|
lua_State *L;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
if (conf.script_path != NULL) {
|
||||||
|
sprintf(buffer, "%s/mainmenu.lua", conf.script_path);
|
||||||
|
if (stat(buffer, &s) == 0) {
|
||||||
|
L = luaL_newstate();
|
||||||
|
luaL_openlibs(L);
|
||||||
|
lua_push_cfunctions(L);
|
||||||
|
luaL_loadfile(L, buffer);
|
||||||
|
do_internal_menu = 0;
|
||||||
|
result = lua_pcall(L, 0, 1, 0);
|
||||||
|
if (result) {
|
||||||
|
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_internal_menu = 1;
|
||||||
|
}
|
||||||
|
|
||||||
while (!doquit) {
|
while (!doquit) {
|
||||||
|
|
||||||
|
if (do_internal_menu == 1) {
|
||||||
s_displayansi(socket, "mainmenu");
|
s_displayansi(socket, "mainmenu");
|
||||||
|
|
||||||
|
|
||||||
@ -22,6 +52,19 @@ void main_menu(int socket, struct user_record *user) {
|
|||||||
s_putstring(socket, prompt);
|
s_putstring(socket, prompt);
|
||||||
|
|
||||||
c = s_getc(socket);
|
c = s_getc(socket);
|
||||||
|
} else {
|
||||||
|
lua_getglobal(L, "menu");
|
||||||
|
result = lua_pcall(L, 0, 1, 0);
|
||||||
|
if (result) {
|
||||||
|
fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
|
||||||
|
do_internal_menu = 1;
|
||||||
|
lua_close(L);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lRet = (char *)lua_tostring(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
c = lRet[0];
|
||||||
|
}
|
||||||
|
|
||||||
switch(tolower(c)) {
|
switch(tolower(c)) {
|
||||||
case 'a':
|
case 'a':
|
||||||
@ -126,4 +169,7 @@ void main_menu(int socket, struct user_record *user) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (do_internal_menu == 0) {
|
||||||
|
lua_close(L);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
20
scripts_examples/doors.lua
Normal file
20
scripts_examples/doors.lua
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
function menu()
|
||||||
|
-- display menu ansi
|
||||||
|
bbs_display_ansi("doors");
|
||||||
|
|
||||||
|
|
||||||
|
-- display prompt
|
||||||
|
bbs_write_string("\r\n\027[0m(LUA) TL: " .. string.format("%d", bbs_time_left()) .. "m > ");
|
||||||
|
|
||||||
|
|
||||||
|
-- read char entered
|
||||||
|
cmd = bbs_read_char();
|
||||||
|
|
||||||
|
-- do stuff if you want
|
||||||
|
|
||||||
|
|
||||||
|
-- return the char entered
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
end
|
24
scripts_examples/filemenu.lua
Normal file
24
scripts_examples/filemenu.lua
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
function menu()
|
||||||
|
-- display menu ansi
|
||||||
|
bbs_display_ansi("filemenu");
|
||||||
|
|
||||||
|
|
||||||
|
-- display prompt
|
||||||
|
local dir_no;
|
||||||
|
local dir_name;
|
||||||
|
local sub_no;
|
||||||
|
local sub_name;
|
||||||
|
|
||||||
|
dir_no, dir_name, sub_no, sub_name = bbs_cur_filearea_info();
|
||||||
|
bbs_write_string(string.format("\r\n\027[0mDir: (%d) %s\r\nSub: (%d) %s\r\n(LUA) TL: %dm > ", dir_no, dir_name, sub_no, sub_name, bbs_time_left()));
|
||||||
|
|
||||||
|
-- read char entered
|
||||||
|
cmd = bbs_read_char();
|
||||||
|
|
||||||
|
-- do stuff if you want
|
||||||
|
|
||||||
|
|
||||||
|
-- return the char entered
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
end
|
24
scripts_examples/mailmenu.lua
Normal file
24
scripts_examples/mailmenu.lua
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
function menu()
|
||||||
|
-- display menu ansi
|
||||||
|
bbs_display_ansi("mailmenu");
|
||||||
|
|
||||||
|
|
||||||
|
-- display prompt
|
||||||
|
local conf_no;
|
||||||
|
local conf_name;
|
||||||
|
local area_no;
|
||||||
|
local area_name;
|
||||||
|
|
||||||
|
conf_no, conf_name, area_no, area_name = bbs_cur_mailarea_info();
|
||||||
|
bbs_write_string(string.format("\r\n\027[0mConf: (%d) %s\r\nArea: (%d) %s\r\n(LUA) TL: %dm > ", conf_no, conf_name, area_no, area_name, bbs_time_left()));
|
||||||
|
|
||||||
|
-- read char entered
|
||||||
|
cmd = bbs_read_char();
|
||||||
|
|
||||||
|
-- do stuff if you want
|
||||||
|
|
||||||
|
|
||||||
|
-- return the char entered
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
end
|
20
scripts_examples/mainmenu.lua
Normal file
20
scripts_examples/mainmenu.lua
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
function menu()
|
||||||
|
-- display menu ansi
|
||||||
|
bbs_display_ansi("mainmenu");
|
||||||
|
|
||||||
|
|
||||||
|
-- display prompt
|
||||||
|
bbs_write_string("\r\n\027[0m(LUA) TL: " .. string.format("%d", bbs_time_left()) .. "m > ");
|
||||||
|
|
||||||
|
|
||||||
|
-- read char entered
|
||||||
|
cmd = bbs_read_char();
|
||||||
|
|
||||||
|
-- do stuff if you want
|
||||||
|
|
||||||
|
|
||||||
|
-- return the char entered
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
end
|
Reference in New Issue
Block a user