217 lines
4.5 KiB
C
217 lines
4.5 KiB
C
#include <sys/utsname.h>
|
|
#include "bbs.h"
|
|
#include "lua/lua.h"
|
|
#include "lua/lauxlib.h"
|
|
|
|
extern int mynode;
|
|
extern struct bbs_config conf;
|
|
|
|
extern struct user_record *gUser;
|
|
|
|
int l_bbsWString(lua_State *L) {
|
|
char *str = (char *)lua_tostring(L, -1);
|
|
|
|
s_printf("%s", str);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int l_bbsRString(lua_State *L) {
|
|
char buffer[256];
|
|
int len = lua_tonumber(L, -1);
|
|
|
|
if (len > 256) {
|
|
len = 256;
|
|
}
|
|
|
|
s_readstring(buffer, len);
|
|
|
|
lua_pushstring(L, buffer);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int l_bbsRChar(lua_State *L) {
|
|
char c;
|
|
|
|
c = s_getc();
|
|
|
|
lua_pushlstring(L, &c, 1);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int l_bbsDisplayAnsiPause(lua_State *L) {
|
|
char *str = (char *)lua_tostring(L, -1);
|
|
char buffer[256];
|
|
|
|
sprintf(buffer, "%s/%s.ans", conf.ansi_path, str);
|
|
|
|
s_displayansi_pause(buffer, 1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int l_bbsDisplayAnsi(lua_State *L) {
|
|
char *str = (char *)lua_tostring(L, -1);
|
|
|
|
s_displayansi(str);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int l_bbsVersion(lua_State *L) {
|
|
char buffer[64];
|
|
snprintf(buffer, 64, "Magicka BBS v%d.%d (%s)", VERSION_MAJOR, VERSION_MINOR, VERSION_STR);
|
|
|
|
lua_pushstring(L, buffer);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int l_bbsNode(lua_State *L) {
|
|
lua_pushnumber(L, mynode);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int l_bbsReadLast10(lua_State *L) {
|
|
int offset = lua_tonumber(L, -1);
|
|
struct last10_callers l10;
|
|
FILE *fptr;
|
|
|
|
fptr = fopen("last10.dat", "rb");
|
|
if (!fptr) {
|
|
return 0;
|
|
}
|
|
fseek(fptr, offset * sizeof(struct last10_callers), SEEK_SET);
|
|
if (fread(&l10, sizeof(struct last10_callers), 1, fptr) == 0) {
|
|
return 0;
|
|
}
|
|
fclose(fptr);
|
|
|
|
lua_pushstring(L, l10.name);
|
|
lua_pushstring(L, l10.location);
|
|
lua_pushnumber(L, l10.time);
|
|
|
|
return 3;
|
|
}
|
|
|
|
int l_bbsGetEmailCount(lua_State *L) {
|
|
lua_pushnumber(L, mail_getemailcount(gUser));
|
|
|
|
return 1;
|
|
}
|
|
|
|
int l_bbsMailScan(lua_State *L) {
|
|
mail_scan(gUser);
|
|
return 0;
|
|
}
|
|
|
|
int l_bbsRunDoor(lua_State *L) {
|
|
char *cmd = (char *)lua_tostring(L, 1);
|
|
int stdio = lua_toboolean(L, 2);
|
|
char *codepage = (char *)lua_tostring(L, 3);
|
|
rundoor(gUser, cmd, stdio, codepage);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int l_bbsTimeLeft(lua_State *L) {
|
|
lua_pushnumber(L, gUser->timeleft);
|
|
|
|
return 1;
|
|
}
|
|
|
|
int l_bbsDisplayAutoMsg(lua_State *L) {
|
|
automessage_display();
|
|
return 0;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
int l_getBBSInfo(lua_State *L) {
|
|
struct utsname name;
|
|
|
|
uname(&name);
|
|
|
|
lua_pushstring(L, conf.bbs_name);
|
|
lua_pushstring(L, conf.sysop_name);
|
|
lua_pushstring(L, name.sysname);
|
|
lua_pushstring(L, name.machine);
|
|
|
|
return 4;
|
|
}
|
|
|
|
void lua_push_cfunctions(lua_State *L) {
|
|
lua_pushcfunction(L, l_bbsWString);
|
|
lua_setglobal(L, "bbs_write_string");
|
|
lua_pushcfunction(L, l_bbsRString);
|
|
lua_setglobal(L, "bbs_read_string");
|
|
lua_pushcfunction(L, l_bbsDisplayAnsiPause);
|
|
lua_setglobal(L, "bbs_display_ansi_pause");
|
|
lua_pushcfunction(L, l_bbsDisplayAnsi);
|
|
lua_setglobal(L, "bbs_display_ansi");
|
|
lua_pushcfunction(L, l_bbsRChar);
|
|
lua_setglobal(L, "bbs_read_char");
|
|
lua_pushcfunction(L, l_bbsVersion);
|
|
lua_setglobal(L, "bbs_version");
|
|
lua_pushcfunction(L, l_bbsNode);
|
|
lua_setglobal(L, "bbs_node");
|
|
lua_pushcfunction(L, l_bbsReadLast10);
|
|
lua_setglobal(L, "bbs_read_last10");
|
|
lua_pushcfunction(L, l_bbsGetEmailCount);
|
|
lua_setglobal(L, "bbs_get_emailcount");
|
|
lua_pushcfunction(L, l_bbsMailScan);
|
|
lua_setglobal(L, "bbs_mail_scan");
|
|
lua_pushcfunction(L, l_bbsRunDoor);
|
|
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");
|
|
lua_pushcfunction(L, l_bbsDisplayAutoMsg);
|
|
lua_setglobal(L, "bbs_display_automsg");
|
|
lua_pushcfunction(L, l_getBBSInfo);
|
|
lua_setglobal(L, "bbs_get_info");
|
|
}
|
|
|
|
void do_lua_script(char *script) {
|
|
lua_State *L;
|
|
char buffer[PATH_MAX];
|
|
|
|
if (script == NULL) {
|
|
return;
|
|
}
|
|
|
|
if (script[0] == '/') {
|
|
snprintf(buffer, PATH_MAX, "%s.lua", script);
|
|
} else {
|
|
snprintf(buffer, PATH_MAX, "%s/%s.lua", conf.script_path, script);
|
|
}
|
|
|
|
L = luaL_newstate();
|
|
luaL_openlibs(L);
|
|
lua_push_cfunctions(L);
|
|
luaL_dofile(L, buffer);
|
|
lua_close(L);
|
|
}
|