diff --git a/src/sbbs3/getmsg.cpp b/src/sbbs3/getmsg.cpp index df7b2d3251a8c59672b91ef232f42cb7b4eea31d..b1eb882f6df2d3d8cf71c5366bad7afcf89575a1 100644 --- a/src/sbbs3/getmsg.cpp +++ b/src/sbbs3/getmsg.cpp @@ -150,7 +150,7 @@ void sbbs_t::show_msghdr(smbmsg_t* msg) if(msg->from_net.addr!=NULL && strchr(msg->from,'@')==NULL) bprintf(text[MsgFromNet],smb_netaddrstr(&msg->from_net,str)); } - if(msg->upvotes || msg->downvotes) + if(!(msg->hdr.attr&MSG_POLL) && (msg->upvotes || msg->downvotes)) bprintf(text[MsgVotes], msg->upvotes, msg->downvotes); bprintf(text[MsgDate] ,timestr(msg->hdr.when_written.time) @@ -182,13 +182,16 @@ ulong sbbs_t::total_votes(post_t* post) /****************************************************************************/ void sbbs_t::show_msg(smbmsg_t* msg, long mode, post_t* post) { - char* text; + char* txt; show_msghdr(msg); if(msg->hdr.type == SMB_MSG_TYPE_POLL && post != NULL) { char* answer; int longest_answer = 0; + uint16_t votes = smb_voted_already(&smb, msg->hdr.number + ,cfg.sub[smb.subnum]->misc&SUB_NAME ? useron.name : useron.alias, NET_NONE, NULL); + for(int i = 0; i < msg->total_hfields; i++) { if(msg->hfield[i].type != SMB_POLL_ANSWER) continue; @@ -203,21 +206,32 @@ void sbbs_t::show_msg(smbmsg_t* msg, long mode, post_t* post) continue; answer = (char*)msg->hfield_dat[i]; ulong total = total_votes(post); - bprintf("%2u: %-*s [%-4u %3g%%]\r\n", answers+1, longest_answer, answer, post->votes[answers] - ,total ? ((float)post->votes[answers] / total)*100.0 : 0.0); + float pct = total ? ((float)post->votes[answers] / total)*100.0F : 0.0F; + char str[128]; + int width = longest_answer; + if(width < cols/3) width = cols/3; + else if(width > cols-20) + width = cols-20; + bprintf(text[PollAnswerNumber], answers+1); + safe_snprintf(str, sizeof(str), text[PollAnswerFmt] + ,width, width, answer, post->votes[answers], pct); + backfill(str, pct); + if(votes&(1<<answers)) + bputs(text[PollAnswerChecked]); + CRLF; answers++; } return; } - if((text=smb_getmsgtxt(&smb,msg,(console&CON_RAW_IN) ? 0:GETMSGTXT_PLAIN)) != NULL) { + if((txt=smb_getmsgtxt(&smb,msg,(console&CON_RAW_IN) ? 0:GETMSGTXT_PLAIN)) != NULL) { if(!(console&CON_RAW_IN)) mode|=P_WORDWRAP; - putmsg(text, mode); - smb_freemsgtxt(text); + putmsg(txt, mode); + smb_freemsgtxt(txt); } - if((text=smb_getmsgtxt(&smb,msg,GETMSGTXT_TAIL_ONLY))!=NULL) { - putmsg(text, mode&(~P_WORDWRAP)); - smb_freemsgtxt(text); + if((txt=smb_getmsgtxt(&smb,msg,GETMSGTXT_TAIL_ONLY))!=NULL) { + putmsg(txt, mode&(~P_WORDWRAP)); + smb_freemsgtxt(txt); } } diff --git a/src/sbbs3/readmsgs.cpp b/src/sbbs3/readmsgs.cpp index 880c07feb7bab1cceff905dca740579caa7f026c..85894acb050a67cf2e9eb45101adf759ec2257a8 100644 --- a/src/sbbs3/readmsgs.cpp +++ b/src/sbbs3/readmsgs.cpp @@ -282,7 +282,7 @@ post_t * sbbs_t::loadposts(uint32_t *posts, uint subnum, ulong ptr, long mode, u break; default: for(int b=0; b < 16; b++) { - if(idx.vote&(1<<b)) + if(idx.votes&(1<<b)) post[u].votes[b]++; } } @@ -1035,18 +1035,21 @@ int sbbs_t::scanposts(uint subnum, long mode, const char *find) case 'V': /* Vote in reply to message */ { smbmsg_t vote; + const char* notice=NULL; if(cfg.sub[subnum]->misc&SUB_NOVOTING) { bputs(text[VotingNotAllowed]); domsg = false; break; } + if(smb_voted_already(&smb, msg.hdr.number ,cfg.sub[subnum]->misc&SUB_NAME ? useron.name : useron.alias, NET_NONE, NULL)) { bputs(text[VotedAlready]); domsg = false; break; } + if(useron.rest&FLAG('V')) { bputs(text[R_Voting]); domsg = false; @@ -1065,18 +1068,18 @@ int sbbs_t::scanposts(uint subnum, long mode, const char *find) domsg = false; break; } - vote.hdr.vote = (1<<i); + vote.hdr.votes = (1<<i); vote.hdr.attr = MSG_VOTE; + notice = text[PollVoteNotice]; } else { mnemonics(text[VoteMsgUpDownOrQuit]); long cmd = getkeys("UDQ", 0); if(cmd != 'U' && cmd != 'D') break; vote.hdr.attr = (cmd == 'U' ? MSG_UPVOTE : MSG_DOWNVOTE); + notice = text[vote.hdr.attr&MSG_UPVOTE ? MsgUpVoteNotice : MsgDownVoteNotice]; } vote.hdr.thread_back = msg.hdr.number; - vote.hdr.when_written.time = vote.hdr.when_imported.time = time32(NULL); - vote.hdr.when_written.zone = vote.hdr.when_imported.zone = sys_timezone(&cfg); smb_hfield_str(&vote, SENDER, (cfg.sub[subnum]->misc&SUB_NAME) ? useron.name : useron.alias); if(msg.id != NULL) @@ -1089,7 +1092,7 @@ int sbbs_t::scanposts(uint subnum, long mode, const char *find) msg_client_hfields(&vote, &client); smb_hfield_str(&vote, SENDERSERVER, startup->host_name); - if((i=votemsg(&cfg, &smb, &vote, text[vote.hdr.attr&MSG_UPVOTE ? MsgUpVoteNotice : MsgDownVoteNotice])) != SMB_SUCCESS) + if((i=votemsg(&cfg, &smb, &vote, notice)) != SMB_SUCCESS) errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error); break; diff --git a/src/sbbs3/text.h b/src/sbbs3/text.h index d1845dc526884a4ea9868d3b602d27244fe43014..2cd7550601d3ef172c1c15fedfedc96368d18219 100644 --- a/src/sbbs3/text.h +++ b/src/sbbs3/text.h @@ -830,6 +830,10 @@ enum { ,MsgVotes ,MsgUpVoteNotice ,MsgDownVoteNotice + ,PollVoteNotice + ,PollAnswerNumber + ,PollAnswerFmt + ,PollAnswerChecked ,TOTAL_TEXT }; diff --git a/src/sbbs3/text_defaults.c b/src/sbbs3/text_defaults.c index 7f04707080e5fbca325d762fbf131c7309f34b77..7e1d24405533886680410363fc19528b4d55666b 100644 --- a/src/sbbs3/text_defaults.c +++ b/src/sbbs3/text_defaults.c @@ -1301,4 +1301,10 @@ const char * const text_defaults[TOTAL_TEXT]={ ,"\x0d\x0a\x01\x6e\x01\x68\x4f\x6e\x20\x25\x73\x2c\x20\x69\x6e\x20\x01\x63\x25\x73\x20\x01\x6e\x01\x63\x25\x73\x0d\x0a\x01\x68\x01" "\x6d\x25\x73\x20\x01\x72\x44\x6f\x77\x6e\x01\x6e\x01\x6d\x2d\x76\x6f\x74\x65\x64\x20\x79\x6f\x75\x72\x20\x6d\x65\x73\x73\x61\x67" "\x65\x3a\x20\x01\x6e\x01\x68\x25\x73\x0d\x0a" + ,"\x0d\x0a\x01\x6e\x01\x68\x4f\x6e\x20\x25\x73\x2c\x20\x69\x6e\x20\x01\x63\x25\x73\x20\x01\x6e\x01\x63\x25\x73\x0d\x0a\x01\x68\x01" + "\x6d\x25\x73\x20\x76\x6f\x74\x65\x64\x20\x69\x6e\x20\x79\x6f\x75\x72\x20\x70\x6f\x6c\x6c\x3a\x20\x01\x6e\x01\x68\x25\x73\x0d\x0a" + "" + ,"\x01\x6e\x01\x63\x01\x68\x25\x32\x75\x01\x6e\x01\x63\x3a\x20" + ,"\x25\x2d\x2a\x2e\x2a\x73\x20\x5b\x25\x2d\x34\x75\x20\x25\x33\x2e\x30\x66\x25\x25\x5d" + ,"\x20\xfb" };