Newer
Older
, current_msg->hdr.when_written.time - (smb_tzutc(current_msg->hdr.when_written.zone) * 60));
if(!strcmp(sp,"MSG_TIMEZONE") && current_msg!=NULL)
return(smb_zonestr(current_msg->hdr.when_written.zone,NULL));
if(!strcmp(sp,"MSG_IMP_TIMEZONE") && current_msg!=NULL)
return(smb_zonestr(current_msg->hdr.when_imported.zone,NULL));
if(!strcmp(sp,"MSG_ATTR") && current_msg!=NULL) {
uint16_t attr = current_msg->hdr.attr;
uint16_t poll = attr&MSG_POLL_VOTE_MASK;
uint32_t auxattr = current_msg->hdr.auxattr;
/* Synchronized with show_msgattr(): */
safe_snprintf(str,maxlen,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
,attr&MSG_READ ? "Read " :nulstr
,attr&MSG_DELETE ? "Deleted " :nulstr
,attr&MSG_KILLREAD ? "Kill " :nulstr
,attr&MSG_ANONYMOUS ? "Anonymous " :nulstr
,attr&MSG_LOCKED ? "Locked " :nulstr
,attr&MSG_PERMANENT ? "Permanent " :nulstr
,attr&MSG_MODERATED ? "Moderated " :nulstr
,attr&MSG_VALIDATED ? "Validated " :nulstr
,attr&MSG_REPLIED ? "Replied " :nulstr
,attr&MSG_NOREPLY ? "NoReply " :nulstr
,poll == MSG_POLL ? "Poll " :nulstr
,poll == MSG_POLL && auxattr&POLL_CLOSED ? "(Closed) " :nulstr
if(!strcmp(sp,"MSG_AUXATTR") && current_msg!=NULL) {
safe_snprintf(str,maxlen,"%s%s%s%s%s%s%s"
,current_msg->hdr.auxattr&MSG_FILEREQUEST ? "FileRequest " :nulstr
,current_msg->hdr.auxattr&MSG_FILEATTACH ? "FileAttach " :nulstr
,current_msg->hdr.auxattr&MSG_MIMEATTACH ? "MimeAttach " :nulstr
,current_msg->hdr.auxattr&MSG_KILLFILE ? "KillFile " :nulstr
,current_msg->hdr.auxattr&MSG_RECEIPTREQ ? "ReceiptReq " :nulstr
,current_msg->hdr.auxattr&MSG_CONFIRMREQ ? "ConfirmReq " :nulstr
,current_msg->hdr.auxattr&MSG_NODISP ? "DontDisplay " :nulstr
);
return(str);
}
if(!strcmp(sp,"MSG_NETATTR") && current_msg!=NULL) {
safe_snprintf(str,maxlen,"%s%s%s%s%s%s%s%s"
,current_msg->hdr.netattr&NETMSG_LOCAL ? "Local " :nulstr
,current_msg->hdr.netattr&NETMSG_INTRANSIT ? "InTransit " :nulstr
,current_msg->hdr.netattr&NETMSG_SENT ? "Sent " :nulstr
,current_msg->hdr.netattr&NETMSG_KILLSENT ? "KillSent " :nulstr
,current_msg->hdr.netattr&NETMSG_HOLD ? "Hold " :nulstr
,current_msg->hdr.netattr&NETMSG_CRASH ? "Crash " :nulstr
,current_msg->hdr.netattr&NETMSG_IMMEDIATE ? "Immediate " :nulstr
,current_msg->hdr.netattr&NETMSG_DIRECT ? "Direct " :nulstr
);
return(str);
}
if(!strcmp(sp,"MSG_ID") && current_msg!=NULL)
return(current_msg->id==NULL ? nulstr : current_msg->id);
if(!strcmp(sp,"MSG_REPLY_ID") && current_msg!=NULL)
return(current_msg->reply_id==NULL ? nulstr : current_msg->reply_id);
if(!strcmp(sp,"MSG_NUM") && current_msg!=NULL) {
safe_snprintf(str,maxlen,"%lu", (ulong)current_msg->hdr.number);
return(str);
}
if(!strcmp(sp,"MSG_SCORE") && current_msg!=NULL) {
safe_snprintf(str, maxlen, "%ld", (long)current_msg->upvotes - (long)current_msg->downvotes);
return(str);
}
if(!strcmp(sp,"MSG_UPVOTES") && current_msg!=NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->upvotes);
return(str);
}
if(!strcmp(sp,"MSG_DOWNVOTES") && current_msg!=NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->downvotes);
if(!strcmp(sp,"MSG_TOTAL_VOTES") && current_msg!=NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->total_votes);
if(!strcmp(sp,"MSG_VOTED"))
return (current_msg != NULL && current_msg->user_voted) ? text[PollAnswerChecked] : nulstr;
if(!strcmp(sp,"MSG_UPVOTED"))
return (current_msg != NULL && current_msg->user_voted == 1) ? text[PollAnswerChecked] : nulstr;
if(!strcmp(sp,"MSG_DOWNVOTED"))
return (current_msg != NULL && current_msg->user_voted == 2) ? text[PollAnswerChecked] : nulstr;
if(strcmp(sp, "MSG_THREAD_ID") == 0 && current_msg != NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->hdr.thread_id);
return str;
}
if(strcmp(sp, "MSG_THREAD_BACK") == 0 && current_msg != NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->hdr.thread_back);
return str;
}
if(strcmp(sp, "MSG_THREAD_NEXT") == 0 && current_msg != NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->hdr.thread_next);
return str;
}
if(strcmp(sp, "MSG_THREAD_FIRST") == 0 && current_msg != NULL) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->hdr.thread_first);
return str;
}
safe_snprintf(str,maxlen,"%s %s"
,cfg.grp[cfg.sub[smb.subnum]->grp]->sname
,cfg.sub[smb.subnum]->sname);
else
strncpy(str, "Email", maxlen);
return(str);
}
if(!strcmp(sp,"SMB_AREA_DESC")) {
safe_snprintf(str,maxlen,"%s %s"
,cfg.grp[cfg.sub[smb.subnum]->grp]->lname
,cfg.sub[smb.subnum]->lname);
else
strncpy(str, "Personal Email", maxlen);
return(cfg.grp[cfg.sub[smb.subnum]->grp]->sname);
return(nulstr);
return(cfg.grp[cfg.sub[smb.subnum]->grp]->lname);
return(nulstr);
}
if(!strcmp(sp,"SMB_GROUP_NUM")) {
safe_snprintf(str,maxlen,"%u",getusrgrp(smb.subnum));
if(smb.subnum==INVALID_SUB)
return(cfg.sub[smb.subnum]->sname);
return(nulstr);
if(smb.subnum==INVALID_SUB)
return(cfg.sub[smb.subnum]->lname);
return(nulstr);
if(smb.subnum==INVALID_SUB)
return(cfg.sub[smb.subnum]->code);
return(nulstr);
safe_snprintf(str,maxlen,"%u",getusrsub(smb.subnum));
if(!strcmp(sp,"SMB_MSGS")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.msgs);
return(str);
}
if(!strcmp(sp,"SMB_CURMSG")) {
safe_snprintf(str,maxlen,"%lu", (ulong)(smb.curmsg+1));
return(str);
}
if(!strcmp(sp,"SMB_LAST_MSG")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.status.last_msg);
return(str);
}
if(!strcmp(sp,"SMB_MAX_MSGS")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.status.max_msgs);
return(str);
}
if(!strcmp(sp,"SMB_MAX_CRCS")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.status.max_crcs);
return(str);
}
if(!strcmp(sp,"SMB_MAX_AGE")) {
safe_snprintf(str,maxlen,"%hu",smb.status.max_age);
return(str);
}
if(!strcmp(sp,"SMB_TOTAL_MSGS")) {
safe_snprintf(str,maxlen,"%lu", (ulong)smb.status.total_msgs);
return(str);
}
/* Currently viewed file */
if(current_file != NULL) {
if(is_valid_dirnum(current_file->dir)) {
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
if(strcmp(sp, "FILE_AREA") == 0) {
safe_snprintf(str, maxlen, "%s %s"
,cfg.lib[cfg.dir[current_file->dir]->lib]->sname
,cfg.dir[current_file->dir]->sname);
return str;
}
if(strcmp(sp, "FILE_AREA_DESC") == 0) {
safe_snprintf(str, maxlen, "%s %s"
,cfg.lib[cfg.dir[current_file->dir]->lib]->lname
,cfg.dir[current_file->dir]->lname);
return str;
}
if(strcmp(sp, "FILE_LIB") == 0)
return cfg.lib[cfg.dir[current_file->dir]->lib]->sname;
if(strcmp(sp, "FILE_LIB_DESC") == 0)
return cfg.lib[cfg.dir[current_file->dir]->lib]->lname;
if(strcmp(sp, "FILE_LIB_NUM") == 0) {
safe_snprintf(str, maxlen, "%u", getusrlib(current_file->dir));
return str;
}
if(strcmp(sp, "FILE_DIR") == 0)
return cfg.dir[current_file->dir]->sname;
if(strcmp(sp, "FILE_DIR_DESC") == 0)
return cfg.dir[current_file->dir]->lname;
if(strcmp(sp, "FILE_DIR_CODE") == 0)
return cfg.dir[current_file->dir]->code;
if(strcmp(sp, "FILE_DIR_NUM") == 0) {
safe_snprintf(str, maxlen, "%u", getusrdir(current_file->dir));
return str;
}
}
if(strcmp(sp, "FILE_NAME") == 0)
return current_file->name;
if(strcmp(sp, "FILE_DESC") == 0)
return current_file->desc;
if(strcmp(sp, "FILE_TAGS") == 0)
return current_file->tags;
if(strcmp(sp, "FILE_UPLOADER") == 0)
return current_file->from;
if(strcmp(sp, "FILE_SIZE") == 0) {
safe_snprintf(str, maxlen, "%ld", (long)current_file->size);
return str;
}
if(strcmp(sp, "FILE_CREDITS") == 0) {
safe_snprintf(str, maxlen, "%" PRIu64, current_file->cost);
return str;
}
if(strcmp(sp, "FILE_TIME") == 0)
return timestr(current_file->time);
if(strcmp(sp, "FILE_TIME_ULED") == 0)
return timestr(current_file->hdr.when_imported.time);
if(strcmp(sp, "FILE_TIME_DLED") == 0)
return timestr(current_file->hdr.last_downloaded);
return datestr(current_file->time);
if(strcmp(sp, "FILE_DATE_ULED") == 0)
return datestr(current_file->hdr.when_imported.time);
if(strcmp(sp, "FILE_DATE_DLED") == 0)
return datestr(current_file->hdr.last_downloaded);
if(strcmp(sp, "FILE_TIMES_DLED") == 0) {
safe_snprintf(str, maxlen, "%lu", (ulong)current_file->hdr.times_downloaded);
return get_text(sp);

Rob Swindell
committed
char* sbbs_t::expand_atcodes(const char* src, char* buf, size_t size, const smbmsg_t* msg)

Rob Swindell
committed
{
char* dst = buf;
char* end = dst + (size - 1);
const smbmsg_t* saved_msg{current_msg};

Rob Swindell
committed
if (msg != NULL)
current_msg = msg;

Rob Swindell
committed
while (*src != '\0' && dst < end) {
if (*src == '@') {
char str[32];
SAFECOPY(str, src + 1);
char* at = strchr(str, '@');
const char* sp = strchr(str, ' ');
if (at != NULL && (sp == NULL || sp > at)) {
char tmp[128];
*at = '\0';
src += strlen(str) + 2;
const char* p = formatted_atcode(str, tmp, sizeof tmp);
if(p != NULL)
dst += strlcpy(dst, p, end - dst);

Rob Swindell
committed
continue;
}
}
*(dst++) = *(src++);
}
if(dst > end)
dst = end;

Rob Swindell
committed
*dst = '\0';
current_msg = saved_msg;

Rob Swindell
committed
return buf;
}