Skip to content
Snippets Groups Projects
Commit 0b6bc179 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Add user_t.mail (in JS, user.mail_settings) to remember mail preferences

Right now, the only preference is reverse mail listings (oldest first
or newest first). These settings are only used when reading "your mail",
not any other kind of mail reading.

bbs.read_mail() now returns the user-adjusted loadmail_mode value and
this allows us to determine the user's preferences and save them after
this function/method is called. A readmail_mod can now return a number
(other than 0) and that will be used as the return value of this method.

sbbs_t::readmail() now does the adjustment of the passed lm_mode before
calling any installed readmail_mod, so if for example, deleted message
viewing is enabled by the sysop, those LM_* flags might be set now in
the argument to the readmail_mod, wherase they never would before.

There is not yet any way for the sysop to set a new user's default
mail_settings, they'll just default to 0 for now.

email_sec.js will get some adjustments to use/store the
user.mail_settings next.
parent 067c4006
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
......@@ -2716,9 +2716,11 @@ js_readmail(JSContext *cx, uintN argc, jsval *arglist)
}
rc=JS_SUSPENDREQUEST(cx);
sbbs->readmail(usernumber, readwhich, lm_mode);
int result = sbbs->readmail(usernumber, readwhich, lm_mode);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(result));
return(JS_TRUE);
}
......@@ -4556,9 +4558,9 @@ static jsSyncMethodSpec js_bbs_functions[] = {
,JSDOCSTR("display the logon list (optionally passing arguments to the logon list module)")
,310
},
{"read_mail", js_readmail, 0, JSTYPE_VOID, JSDOCSTR("[which=<tt>MAIL_YOUR</tt>] [,user_number=<i>current</i>] [,loadmail_mode=<tt>0</tt>]")
{"read_mail", js_readmail, 0, JSTYPE_NUMBER, JSDOCSTR("[which=<tt>MAIL_YOUR</tt>] [,user_number=<i>current</i>] [,loadmail_mode=<tt>0</tt>]")
,JSDOCSTR("read private e-mail"
"(see <tt>MAIL_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>which</i> values)")
"(see <tt>MAIL_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>which</i> values), returns user-modified loadmail_mode value")
,310
},
{"email", js_email, 1, JSTYPE_BOOLEAN, JSDOCSTR("to_user_number [,mode=<tt>WM_EMAIL</tt>] [,top=<i>none</i>] [,subject=<i>none</i>] [,object reply_header]")
......
......@@ -94,7 +94,7 @@ enum {
,USER_PROP_ROWS
,USER_PROP_COLS
,USER_PROP_SEX
,USER_PROP_MISC
,USER_PROP_MISC
,USER_PROP_LEECH
,USER_PROP_CURSUB
,USER_PROP_CURDIR
......@@ -105,6 +105,7 @@ enum {
,USER_PROP_QWK
,USER_PROP_TMPEXT
,USER_PROP_CHAT
,USER_PROP_MAIL
,USER_PROP_NS_TIME
,USER_PROP_PROT
,USER_PROP_LOGONTIME
......@@ -359,6 +360,9 @@ static JSBool js_user_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
case USER_PROP_CHAT:
val=p->user->chat;
break;
case USER_PROP_MAIL:
val = p->user->mail;
break;
case USER_PROP_NS_TIME:
val=p->user->ns_time;
break;
......@@ -602,6 +606,15 @@ static JSBool js_user_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict,
putuserchat(scfg, p->user->number, p->user->chat = val);
rc=JS_SUSPENDREQUEST(cx);
break;
case USER_PROP_MAIL:
JS_RESUMEREQUEST(cx, rc);
if(!JS_ValueToECMAUint32(cx,*vp,&val)) {
free(str);
return JS_FALSE;
}
putusermail(scfg, p->user->number, p->user->mail = val);
rc=JS_SUSPENDREQUEST(cx);
break;
case USER_PROP_TMPEXT:
SAFECOPY(p->user->tmpext,str);
putuserstr(scfg, p->user->number, USER_TMPEXT, str);
......@@ -810,6 +823,7 @@ static jsSyncPropertySpec js_user_properties[] = {
{ "settings" ,USER_PROP_MISC ,USER_PROP_FLAGS, 310},
{ "qwk_settings" ,USER_PROP_QWK ,USER_PROP_FLAGS, 310},
{ "chat_settings" ,USER_PROP_CHAT ,USER_PROP_FLAGS, 310},
{ "mail_settings" ,USER_PROP_MAIL ,USER_PROP_FLAGS, 320},
{ "temp_file_ext" ,USER_PROP_TMPEXT ,USER_PROP_FLAGS, 310},
{ "new_file_time" ,USER_PROP_NS_TIME ,USER_PROP_FLAGS, 311},
{ "newscan_date" ,USER_PROP_NS_TIME ,0, /* Alias */ 310},
......@@ -856,6 +870,7 @@ static char* user_prop_desc[] = {
,"settings bitfield - see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
,"QWK packet settings bitfield - see <tt>QWK_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
,"chat settings bitfield - see <tt>CHAT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
,"mail settings bitfield - see <tt>MAIL_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
,"temporary file type (extension)"
,"new file scan date/time (time_t format)"
,"file transfer protocol (command key)"
......
......@@ -562,8 +562,13 @@ bool sbbs_t::logon()
rioctl(IOSM|ABORT); /* Turn abort ability on */
if(text[ReadYourMailNowQ][0] && mailw) {
if((mailw == mailr && !noyes(text[ReadYourMailNowQ]))
|| (mailw != mailr && yesno(text[ReadYourMailNowQ])))
readmail(useron.number,MAIL_YOUR);
|| (mailw != mailr && yesno(text[ReadYourMailNowQ]))) {
uint32_t user_mail = useron.mail & ~MAIL_LM_MODE;
int result = readmail(useron.number, MAIL_YOUR, useron.mail & MAIL_LM_MODE);
user_mail |= result & MAIL_LM_MODE;
if(user_mail != useron.mail)
putusermail(&cfg, useron.number, useron.mail = user_mail);
}
}
if(usrgrps && useron.misc&ASK_NSCAN && text[NScanAllGrpsQ][0] && yesno(text[NScanAllGrpsQ]))
scanallsubs(SCAN_NEW);
......
......@@ -39,7 +39,7 @@ static char mail_listing_flag(smbmsg_t* msg)
/****************************************************************************/
/* Reads mail waiting for usernumber. */
/****************************************************************************/
void sbbs_t::readmail(uint usernumber, int which, int lm_mode)
int sbbs_t::readmail(uint usernumber, int which, int lm_mode)
{
char str[256],str2[256],done=0,domsg=1
,*p;
......@@ -48,7 +48,7 @@ void sbbs_t::readmail(uint usernumber, int which, int lm_mode)
uint32_t u,v;
int mismatches=0,act;
int unum;
int l,last_mode;
int l,last_mode;
uint last;
bool replied;
mail_t *mail;
......@@ -63,26 +63,30 @@ void sbbs_t::readmail(uint usernumber, int which, int lm_mode)
act=NODE_RMAL;
action=act;
lm_mode &= ~(LM_NOSPAM | LM_SPAMONLY | LM_INCDEL);
if(cfg.sys_misc&SM_SYSVDELM && (SYSOP || cfg.sys_misc&SM_USRVDELM))
lm_mode |= LM_INCDEL;
if(cfg.readmail_mod[0] && !readmail_inside) {
char cmdline[256];
readmail_inside = true;
safe_snprintf(cmdline, sizeof(cmdline), "%s %d %u %u", cfg.readmail_mod, which, usernumber, lm_mode);
exec_bin(cmdline, &main_csi);
int result = exec_bin(cmdline, &main_csi);
readmail_inside = false;
return;
return result;
}
if(which==MAIL_SENT && useron.rest&FLAG('K')) {
bputs(text[R_ReadSentMail]);
return;
return lm_mode;
}
msg.total_hfields=0; /* init to NULL, cause not allocated yet */
if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
errormsg(WHERE,ERR_OPEN,"MAIL",i);
return;
return lm_mode;
}
SAFEPRINTF(smb.file,"%smail",cfg.data_dir);
smb.retry_time=cfg.smb_retry_time;
......@@ -90,11 +94,9 @@ void sbbs_t::readmail(uint usernumber, int which, int lm_mode)
if((i=smb_open(&smb))!=0) {
smb_stack(&smb,SMB_STACK_POP);
errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error);
return;
return lm_mode;
}
if(cfg.sys_misc&SM_SYSVDELM && (SYSOP || cfg.sys_misc&SM_USRVDELM))
lm_mode |= LM_INCDEL;
mail=loadmail(&smb,&smb.msgs,usernumber,which,lm_mode);
last_mode = lm_mode;
if(!smb.msgs) {
......@@ -106,7 +108,7 @@ void sbbs_t::readmail(uint usernumber, int which, int lm_mode)
bprintf(text[NoMailWaiting], lm_mode&LM_UNREAD ? "un-read mail" : "mail");
smb_close(&smb);
smb_stack(&smb,SMB_STACK_POP);
return;
return lm_mode;
}
last=smb.status.last_msg;
......@@ -150,7 +152,7 @@ void sbbs_t::readmail(uint usernumber, int which, int lm_mode)
free(mail);
smb_close(&smb);
smb_stack(&smb,SMB_STACK_POP);
return;
return lm_mode;
}
else
smb.curmsg=l;
......@@ -801,6 +803,8 @@ void sbbs_t::readmail(uint usernumber, int which, int lm_mode)
smb_close(&smb);
smb_stack(&smb,SMB_STACK_POP);
current_msg=NULL;
return lm_mode;
}
int sbbs_t::searchmail(mail_t *mail, int start, int msgs, int which, const char *search, const char* order)
......
......@@ -802,9 +802,9 @@ public:
void download_msg_attachments(smb_t*, smbmsg_t*, bool del);
/* readmail.cpp */
void readmail(uint usernumber, int which, int lm_mode = 0);
int readmail(uint usernumber, int which, int lm_mode = 0);
bool readmail_inside = false;
int searchmail(mail_t*, int start, int msgss, int which, const char *search, const char* order);
int searchmail(mail_t*, int start, int msgss, int which, const char *search, const char* order);
/* bulkmail.cpp */
bool bulkmail(uchar *ar);
......
......@@ -463,6 +463,9 @@ typedef enum { /* Values for xtrn_t.event */
#define CHAT_DEFAULT CHAT_SPLITP
// Bits in user.mail
#define MAIL_LM_MODE (LM_REVERSE)
#define INVALID_DIR ((uint)-1) /* Invalid directory value */
#define INVALID_SUB ((uint)-1) /* Invalid sub-board value */
......@@ -948,7 +951,8 @@ typedef struct { /* Users information */
uint32_t misc, /* Misc. bits - ANSI, Deleted etc. */
qwk, /* QWK settings */
chat, /* Chat defaults */
chat, /* Chat settings */
mail, /* Mail setttings */
flags1, /* Flag set #1 */
flags2, /* Flag set #2 */
flags3, /* Flag set #3 */
......
......@@ -408,6 +408,7 @@ int parseuserdat(scfg_t* cfg, char *userdat, user_t *user, char* field[])
user->misc = (uint32_t)strtoul(field[USER_MISC], NULL, 16);
user->qwk = (uint32_t)strtoul(field[USER_QWK], NULL, 16);
user->chat = (uint32_t)strtoul(field[USER_CHAT], NULL, 16);
user->mail = (uint32_t)strtoul(field[USER_MAIL], NULL, 16);
user->rows = strtoul(field[USER_ROWS], NULL, 0);
user->cols = strtoul(field[USER_COLS], NULL, 0);
......@@ -679,6 +680,7 @@ BOOL format_userdat(scfg_t* cfg, user_t* user, char userdat[])
"%u\t" // USER_TEXTRA
"%s\t" // USER_EXPIRE
"%u\t" // USER_LEECH
"%x\t" // USER_MAIL
,user->number
,user->alias
,user->name
......@@ -741,6 +743,7 @@ BOOL format_userdat(scfg_t* cfg, user_t* user, char userdat[])
,user->textra
,expire
,(uint)user->leech
,user->mail
);
if(len > USER_RECORD_LEN || len < 0) // truncated?
return FALSE;
......@@ -2370,6 +2373,11 @@ uint32_t getuserchat(scfg_t* cfg, int usernumber)
return getuserhex32(cfg, usernumber, USER_CHAT);
}
uint32_t getusermail(scfg_t* cfg, int usernumber)
{
return getuserhex32(cfg, usernumber, USER_MAIL);
}
uint32_t getuserqwk(scfg_t* cfg, int usernumber)
{
return getuserhex32(cfg, usernumber, USER_QWK);
......@@ -2466,6 +2474,11 @@ int putuserchat(scfg_t* cfg, int usernumber, uint32_t value)
return putuserhex32(cfg, usernumber, USER_CHAT, value);
}
int putusermail(scfg_t* cfg, int usernumber, uint32_t value)
{
return putuserhex32(cfg, usernumber, USER_MAIL, value);
}
int putuserqwk(scfg_t* cfg, int usernumber, uint32_t value)
{
return putuserhex32(cfg, usernumber, USER_QWK, value);
......
......@@ -95,6 +95,7 @@ DLLEXPORT BOOL chk_ar(scfg_t*, uchar* str, user_t*, client_t*); /* checks access
DLLEXPORT uint32_t getusermisc(scfg_t*, int usernumber);
DLLEXPORT uint32_t getuserchat(scfg_t*, int usernumber);
DLLEXPORT uint32_t getusermail(scfg_t*, int usernumber);
DLLEXPORT uint32_t getuserqwk(scfg_t*, int usernumber);
DLLEXPORT uint32_t getuserflags(scfg_t*, int usernumber, enum user_field);
DLLEXPORT uint32_t getuserhex32(scfg_t*, int usernumber, enum user_field);
......@@ -109,6 +110,7 @@ DLLEXPORT int putuserdec32(scfg_t*, int usernumber, enum user_field, uint32_t va
DLLEXPORT int putuserdec64(scfg_t*, int usernumber, enum user_field, uint64_t value);
DLLEXPORT int putusermisc(scfg_t*, int usernumber, uint32_t value);
DLLEXPORT int putuserchat(scfg_t*, int usernumber, uint32_t value);
DLLEXPORT int putusermail(scfg_t*, int usernumber, uint32_t value);
DLLEXPORT int putuserqwk(scfg_t*, int usernumber, uint32_t value);
DLLEXPORT uint64_t adjustuserval(scfg_t*, int usernumber, enum user_field, int64_t value);
DLLEXPORT BOOL writeuserfields(scfg_t*, char* field[], int file);
......
......@@ -100,6 +100,9 @@ enum user_field {
USER_EXPIRE,
USER_LEECH,
// Misc
USER_MAIL,
// Last:
USER_FIELD_COUNT
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment