Skip to content
Snippets Groups Projects
atcodes.cpp 60.8 KiB
Newer Older
	if(!strcmp(sp,"MSG_FROM_NAME") && current_msg != nullptr) {
		if(current_msg->hdr.attr&MSG_ANONYMOUS && !SYSOP)
			return(text[Anonymous]);
		if(pmode != NULL)
			*pmode |= (current_msg->hdr.auxattr & MSG_HFIELDS_UTF8);
		return current_msg_from == nullptr ? current_msg->from : current_msg_from;
	if(!strcmp(sp,"MSG_FROM_FIRST") && current_msg != nullptr) {
		if(current_msg->hdr.attr&MSG_ANONYMOUS && !SYSOP)
			safe_snprintf(str, maxlen, "%s", text[Anonymous]);
		else
			safe_snprintf(str, maxlen, "%s", current_msg_from == nullptr ? current_msg->from : current_msg_from);
		if((tp = strchr(str, ' ')) != NULL)
			*tp = '\0';
		return str;
	}
	if(!strcmp(sp,"MSG_FROM_EXT") && current_msg!=NULL) {
		if(!(current_msg->hdr.attr&MSG_ANONYMOUS) || SYSOP)
			if(current_msg->from_ext!=NULL)
				return(current_msg->from_ext);
		return(nulstr);
	if(!strcmp(sp,"MSG_FROM_NET") && current_msg!=NULL) {
			&& (!(current_msg->hdr.attr&MSG_ANONYMOUS) || SYSOP))
			return(smb_netaddrstr(&current_msg->from_net,str));
	if(!strcmp(sp,"MSG_FROM_NETTYPE") && current_msg!=NULL) {
		if(current_msg->from_net.type==NET_NONE)
			return nulstr;
		return(smb_nettype((enum smb_net_type)current_msg->from_net.type));
	}
	if(!strcmp(sp,"MSG_SUBJECT") && current_msg != nullptr) {
		if(pmode != NULL)
			*pmode |= (current_msg->hdr.auxattr & MSG_HFIELDS_UTF8);
		return current_msg_subj == nullptr ? current_msg->subj : current_msg_subj;
	if(!strcmp(sp,"MSG_SUMMARY") && current_msg!=NULL)
		return(current_msg->summary==NULL ? nulstr : current_msg->summary);
	if(!strcmp(sp,"MSG_TAGS") && current_msg!=NULL)
		return(current_msg->tags==NULL ? nulstr : current_msg->tags);
	if(!strcmp(sp,"MSG_DATE") && current_msg!=NULL)
		return(timestr(smb_time(current_msg->hdr.when_written)));
	if(!strcmp(sp,"MSG_DATE_UTC") && current_msg!=NULL)
		return(timestr(smb_time(current_msg->hdr.when_written) - (smb_tzutc(current_msg->hdr.when_written.zone) * 60)));
	if(!strcmp(sp,"MSG_IMP_DATE") && current_msg!=NULL)
		return(timestr(current_msg->hdr.when_imported.time));
	if(!strcmp(sp,"MSG_AGE") && current_msg!=NULL)
		return age_of_posted_item(str, maxlen
			,smb_time(current_msg->hdr.when_written) - (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_PRIVATE						? "Private  "   :nulstr
			,attr&MSG_SPAM							? "SPAM  "      :nulstr
			,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
		return(str);
	}
	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
	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);
	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);
rswindell's avatar
rswindell committed
	if(!strcmp(sp,"MSG_TOTAL_VOTES") && current_msg!=NULL) {
		safe_snprintf(str, maxlen, "%lu", (ulong)current_msg->total_votes);
rswindell's avatar
rswindell committed
		return(str);
	}
	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;
	}
	if(!strcmp(sp,"SMB_AREA")) {
		if(is_valid_subnum(smb.subnum))
			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")) {
		if(is_valid_subnum(smb.subnum))
			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(str);
	if(!strcmp(sp,"SMB_GROUP")) {
		if(is_valid_subnum(smb.subnum))
			return(cfg.grp[cfg.sub[smb.subnum]->grp]->sname);
		return(nulstr);
	if(!strcmp(sp,"SMB_GROUP_DESC")) {
		if(is_valid_subnum(smb.subnum))
			return(cfg.grp[cfg.sub[smb.subnum]->grp]->lname);
		return(nulstr);
	}
	if(!strcmp(sp,"SMB_GROUP_NUM")) {
		if(is_valid_subnum(smb.subnum))
			safe_snprintf(str,maxlen,"%u",getusrgrp(smb.subnum));
		return(str);
	if(!strcmp(sp,"SMB_SUB")) {
			return("Mail");
		else if(is_valid_subnum(smb.subnum))
			return(cfg.sub[smb.subnum]->sname);
		return(nulstr);
	if(!strcmp(sp,"SMB_SUB_DESC")) {
			return("Mail");
		else if(is_valid_subnum(smb.subnum))
			return(cfg.sub[smb.subnum]->lname);
		return(nulstr);
	if(!strcmp(sp,"SMB_SUB_CODE")) {
			return("MAIL");
		else if(is_valid_subnum(smb.subnum))
			return(cfg.sub[smb.subnum]->code);
		return(nulstr);
	if(!strcmp(sp,"SMB_SUB_NUM")) {
		if(is_valid_subnum(smb.subnum))
			safe_snprintf(str,maxlen,"%u",getusrsub(smb.subnum));
		return(str);
		safe_snprintf(str,maxlen,"%lu", (ulong)smb.msgs);
		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);
		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);
	/* Currently viewed file */
	if(current_file != NULL) {
		if(is_valid_dirnum(current_file->dir)) {
			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_FTP_PATH") == 0) {
				getfilevpath(&cfg, current_file, str, maxlen);
				return str;
			}
			if(strcmp(sp, "FILE_WEB_PATH") == 0) {
				char* p = "";
				if(cfg.dir[current_file->dir]->vpath[0] == '\0') {
					p = startup->web_file_vpath_prefix;
					if(*p == '/')
						++p;
				}
				safe_snprintf(str, maxlen, "%s%s", p, getfilevpath(&cfg, current_file, tmp, sizeof tmp));
				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)
		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);
		if(strcmp(sp, "FILE_DATE") == 0)
			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);
char* sbbs_t::expand_atcodes(const char* src, char* buf, size_t size, const smbmsg_t* msg)
	const smbmsg_t* saved_msg{current_msg};
	if (msg != NULL)
		current_msg = msg;
	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);