diff --git a/dist/ansis/logoff.ans b/dist/ansis/logoff.ans index 68bb9bf..5570abd 100644 Binary files a/dist/ansis/logoff.ans and b/dist/ansis/logoff.ans differ diff --git a/dist/ansis/mainmenu.ans b/dist/ansis/mainmenu.ans index dabf0cf..8d0f1a4 100644 Binary files a/dist/ansis/mainmenu.ans and b/dist/ansis/mainmenu.ans differ diff --git a/dist/menus/logoff.mnu b/dist/menus/logoff.mnu index 920d937..d8b1698 100644 --- a/dist/menus/logoff.mnu +++ b/dist/menus/logoff.mnu @@ -6,3 +6,6 @@ COMMAND LOGOFF HOTKEY N COMMAND PREVMENU + +HOTKEY F +COMMAND SENDFEEDBACK diff --git a/dist/menus/main.mnu b/dist/menus/main.mnu index cda75ff..dd47711 100644 --- a/dist/menus/main.mnu +++ b/dist/menus/main.mnu @@ -43,3 +43,6 @@ COMMAND SENDNODEMSG HOTKEY G COMMAND SUBMENU DATA logoff + +HOTKEY F +COMMAND SENDFEEDBACK diff --git a/docs/docs/guide/menus.md b/docs/docs/guide/menus.md index 66b7096..5ca93a8 100644 --- a/docs/docs/guide/menus.md +++ b/docs/docs/guide/menus.md @@ -128,4 +128,6 @@ Finally, an optional SECLEVEL command indicates the required security level for **GENWWWURLS** Generate and show WWW urls for the tagged files for web download. -**NLBROWSER** Browse the nodelist for the current conference. \ No newline at end of file +**NLBROWSER** Browse the nodelist for the current conference. + +**SENDFEEDBACK** Send feedback to the Sysop. diff --git a/src/bbs.h b/src/bbs.h index 92a6538..179092c 100644 --- a/src/bbs.h +++ b/src/bbs.h @@ -315,6 +315,7 @@ extern void chat_system(struct user_record *user); extern int mail_getemailcount(struct user_record *user); extern void send_email(struct user_record *user); extern void list_emails(struct user_record *user); +extern void commit_email(char *recipient, char *subject, char *msg); extern void download_zmodem(struct user_record *user, char *filename); extern void settings_menu(struct user_record *user); diff --git a/src/email.c b/src/email.c index 5acd42e..06b30b7 100644 --- a/src/email.c +++ b/src/email.c @@ -7,6 +7,7 @@ #include "bbs.h" extern struct bbs_config conf; +extern struct user_record *gUser; struct email_msg { int id; @@ -17,15 +18,12 @@ struct email_msg { char *body; }; -void send_email(struct user_record *user) { - char buffer[256]; +void commit_email(char *recipient, char *subject, char *msg) { + char buffer[PATH_MAX]; sqlite3 *db; - sqlite3_stmt *res; - int rc; - char *recipient; - char *subject; - char *msg; - char *csql = "CREATE TABLE IF NOT EXISTS email (" + sqlite3_stmt *res; + int rc; + char *csql = "CREATE TABLE IF NOT EXISTS email (" "id INTEGER PRIMARY KEY," "sender TEXT COLLATE NOCASE," "recipient TEXT COLLATE NOCASE," @@ -33,8 +31,57 @@ void send_email(struct user_record *user) { "body TEXT," "date INTEGER," "seen INTEGER);"; - char *isql = "INSERT INTO email (sender, recipient, subject, body, date, seen) VALUES(?, ?, ?, ?, ?, 0)"; - char *err_msg = 0; + char *isql = "INSERT INTO email (sender, recipient, subject, body, date, seen) VALUES(?, ?, ?, ?, ?, 0)"; + char *err_msg = 0; + + snprintf(buffer, PATH_MAX, "%s/email.sq3", conf.bbs_path); + + rc = sqlite3_open(buffer, &db); + + if (rc != SQLITE_OK) { + dolog("Cannot open database: %s", sqlite3_errmsg(db)); + return; + } + sqlite3_busy_timeout(db, 5000); + + rc = sqlite3_exec(db, csql, 0, 0, &err_msg); + if (rc != SQLITE_OK ) { + + dolog("SQL error: %s", err_msg); + + sqlite3_free(err_msg); + sqlite3_close(db); + + return; + } + + rc = sqlite3_prepare_v2(db, isql, -1, &res, 0); + + if (rc == SQLITE_OK) { + sqlite3_bind_text(res, 1, gUser->loginname, -1, 0); + sqlite3_bind_text(res, 2, recipient, -1, 0); + sqlite3_bind_text(res, 3, subject, -1, 0); + sqlite3_bind_text(res, 4, msg, -1, 0); + sqlite3_bind_int(res, 5, time(NULL)); + } else { + dolog("Failed to execute statement: %s", sqlite3_errmsg(db)); + sqlite3_finalize(res); + sqlite3_close(db); + return; + } + sqlite3_step(res); + + sqlite3_finalize(res); + sqlite3_close(db); +} + +void send_email(struct user_record *user) { + char buffer[26]; + + char *recipient; + char *subject; + char *msg; + s_printf(get_string(54)); s_readstring(buffer, 16); @@ -62,48 +109,7 @@ void send_email(struct user_record *user) { msg = external_editor(user, user->loginname, recipient, NULL, 0, NULL, subject, 1, 0); if (msg != NULL) { - sprintf(buffer, "%s/email.sq3", conf.bbs_path); - - rc = sqlite3_open(buffer, &db); - - if (rc != SQLITE_OK) { - dolog("Cannot open database: %s", sqlite3_errmsg(db)); - sqlite3_close(db); - - exit(1); - } - sqlite3_busy_timeout(db, 5000); - - rc = sqlite3_exec(db, csql, 0, 0, &err_msg); - if (rc != SQLITE_OK ) { - - dolog("SQL error: %s", err_msg); - - sqlite3_free(err_msg); - sqlite3_close(db); - - return; - } - - rc = sqlite3_prepare_v2(db, isql, -1, &res, 0); - - if (rc == SQLITE_OK) { - sqlite3_bind_text(res, 1, user->loginname, -1, 0); - sqlite3_bind_text(res, 2, recipient, -1, 0); - sqlite3_bind_text(res, 3, subject, -1, 0); - sqlite3_bind_text(res, 4, msg, -1, 0); - sqlite3_bind_int(res, 5, time(NULL)); - } else { - dolog("Failed to execute statement: %s", sqlite3_errmsg(db)); - sqlite3_finalize(res); - sqlite3_close(db); - s_printf("\r\nNo such email\r\n"); - return; - } - sqlite3_step(res); - - sqlite3_finalize(res); - sqlite3_close(db); + commit_email(recipient, subject, msg); free(msg); } free(subject); diff --git a/src/menus.c b/src/menus.c index f2ba1d9..68dc8c6 100644 --- a/src/menus.c +++ b/src/menus.c @@ -56,6 +56,7 @@ #define MENU_DISPTXTFILEPAUSE 46 #define MENU_GENWWWURLS 47 #define MENU_NLBROWSER 48 +#define MENU_SENDFEEDBACK 49 extern struct bbs_config conf; extern struct user_record *gUser; @@ -87,6 +88,7 @@ int menu_system(char *menufile) { char c; int clearscreen = 0; char confirm; + char *msg; dolog("%s is loading menu: %s", gUser->loginname, menufile); @@ -221,6 +223,8 @@ int menu_system(char *menufile) { menu[menu_items-1]->command = MENU_GENWWWURLS; } else if (strncasecmp(&buffer[8], "NLBROWSER", 9) == 0) { menu[menu_items-1]->command = MENU_NLBROWSER; + } else if (strncasecmp(&buffer[8], "SENDFEEDBACK", 12) == 0) { + menu[menu_items-1]->command = MENU_SENDFEEDBACK; } } else if (strncasecmp(buffer, "SECLEVEL", 8) == 0) { menu[menu_items-1]->seclevel = atoi(&buffer[9]); @@ -564,6 +568,16 @@ int menu_system(char *menufile) { case MENU_NLBROWSER: nl_browser(); break; + case MENU_SENDFEEDBACK: + if (check_user(conf.sysop_name)) { + break; + } + msg = external_editor(gUser, conf.sysop_name, gUser->loginname, NULL, 0, NULL, "Feedback", 1, 0); + if (msg != NULL) { + commit_email(conf.sysop_name, "Feedback", msg); + free(msg); + } + break; default: break; }