/[LeafOK_CVS]/lbbs/src/article_post.c
ViewVC logotype

Diff of /lbbs/src/article_post.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.24 by sysadm, Wed Jul 2 04:17:33 2025 UTC Revision 1.33 by sysadm, Fri Oct 17 01:25:08 2025 UTC
# Line 52  int article_post(const SECTION_LIST *p_s Line 52  int article_post(const SECTION_LIST *p_s
52          int content_display_length;          int content_display_length;
53          char nickname_f[BBS_nickname_max_len * 2 + 1];          char nickname_f[BBS_nickname_max_len * 2 + 1];
54          int sign_id = 0;          int sign_id = 0;
55            int reply_note = 1;
56          long len;          long len;
57          int ch;          int ch;
58          char *p, *q;          char *p, *q;
# Line 89  int article_post(const SECTION_LIST *p_s Line 90  int article_post(const SECTION_LIST *p_s
90          {          {
91                  clearscr();                  clearscr();
92                  moveto(21, 1);                  moveto(21, 1);
93                  prints("发表文章于 %s[%s] 讨论区,类型: %s", p_section->stitle, p_section->sname, (p_article_new->transship ? "转载" : "原创"));                  prints("发表文章于 %s[%s] 讨论区,类型: %s,回复通知:%s",
94                               p_section->stitle, p_section->sname,
95                               (p_article_new->transship ? "转载" : "原创"),
96                               (reply_note ? "开启" : "关闭"));
97                  moveto(22, 1);                  moveto(22, 1);
98                  prints("标题: %s", (p_article_new->title[0] == '\0' ? "[无]" : p_article_new->title));                  prints("标题: %s", (p_article_new->title[0] == '\0' ? "[无]" : p_article_new->title));
99                  moveto(23, 1);                  moveto(23, 1);
# Line 100  int article_post(const SECTION_LIST *p_s Line 104  int article_post(const SECTION_LIST *p_s
104                          prints("    按0~3选签名档(0表示不使用)");                          prints("    按0~3选签名档(0表示不使用)");
105    
106                          moveto(24, 1);                          moveto(24, 1);
107                          prints("T改标题, C取消, Z设为转载, Y设为原创, Enter继续: ");                          prints("T改标题, C取消, Z设为%s, N%s, Enter继续: ",
108                                       (p_article_new->transship ? "原创" : "转载"),
109                                       (reply_note ? "关闭回复通知" : "开启回复通知"));
110                          iflush();                          iflush();
111                          ch = 0;                          ch = 0;
112                  }                  }
# Line 113  int article_post(const SECTION_LIST *p_s Line 119  int article_post(const SECTION_LIST *p_s
119                          case KEY_TIMEOUT:                          case KEY_TIMEOUT:
120                                  goto cleanup;                                  goto cleanup;
121                          case CR:                          case CR:
                                 igetch_reset();  
122                                  break;                                  break;
123                          case 'T':                          case 'T':
124                                  moveto(24, 1);                                  len = get_data(24, 1, "标题: ", title_input, sizeof(title_input), TITLE_INPUT_MAX_LEN);
                                 clrtoeol();  
                                 len = get_data(24, 1, "标题: ", title_input, sizeof(title_input), TITLE_INPUT_MAX_LEN, DOECHO);  
125                                  for (p = title_input; *p == ' '; p++)                                  for (p = title_input; *p == ' '; p++)
126                                          ;                                          ;
127                                  for (q = title_input + len; q > p && *(q - 1) == ' '; q--)                                  for (q = title_input + len; q > p && *(q - 1) == ' '; q--)
# Line 138  int article_post(const SECTION_LIST *p_s Line 141  int article_post(const SECTION_LIST *p_s
141                                  prints("取消...");                                  prints("取消...");
142                                  press_any_key();                                  press_any_key();
143                                  goto cleanup;                                  goto cleanup;
                         case 'Y':  
                                 p_article_new->transship = 0;  
                                 break;  
144                          case 'Z':                          case 'Z':
145                                  p_article_new->transship = 1;                                  p_article_new->transship = (p_article_new->transship ? 0 : 1);
146                                    break;
147                            case 'N':
148                                    reply_note = (reply_note ? 0 : 1);
149                                  break;                                  break;
150                          case '0':                          case '0':
151                          case '1':                          case '1':
# Line 179  int article_post(const SECTION_LIST *p_s Line 182  int article_post(const SECTION_LIST *p_s
182                                  case KEY_TIMEOUT:                                  case KEY_TIMEOUT:
183                                          goto cleanup;                                          goto cleanup;
184                                  case CR:                                  case CR:
                                         igetch_reset();  
185                                  case 'S':                                  case 'S':
186                                          break;                                          break;
187                                  case 'C':                                  case 'C':
# Line 330  int article_post(const SECTION_LIST *p_s Line 332  int article_post(const SECTION_LIST *p_s
332          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
333                           "INSERT INTO bbs(SID, TID, UID, username, nickname, title, CID, transship, "                           "INSERT INTO bbs(SID, TID, UID, username, nickname, title, CID, transship, "
334                           "sub_dt, sub_ip, reply_note, exp, last_reply_dt, icon, length) "                           "sub_dt, sub_ip, reply_note, exp, last_reply_dt, icon, length) "
335                           "VALUES(%d, 0, %d, '%s', '%s', '%s', %d, %d, NOW(), '%s', 1, %d, NOW(), 1, %d)",                           "VALUES(%d, 0, %d, '%s', '%s', '%s', %d, %d, NOW(), '%s', %d, %d, NOW(), 1, %d)",
336                           p_section->sid, BBS_priv.uid, BBS_username, nickname_f, title_f,                           p_section->sid, BBS_priv.uid, BBS_username, nickname_f, title_f,
337                           p_article_new->cid, p_article_new->transship, hostaddr_client, BBS_user_exp, content_display_length);                           p_article_new->cid, p_article_new->transship, hostaddr_client,
338                             reply_note, BBS_user_exp, content_display_length);
339    
340          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
341          {          {
# Line 424  int article_modify(const SECTION_LIST *p Line 427  int article_modify(const SECTION_LIST *p
427          char *content_f = NULL;          char *content_f = NULL;
428          long len_content;          long len_content;
429          int content_display_length;          int content_display_length;
430            int reply_note = 1;
431          int ch;          int ch;
432          long ret = 0;          long ret = 0;
433          time_t now;          time_t now;
# Line 456  int article_modify(const SECTION_LIST *p Line 460  int article_modify(const SECTION_LIST *p
460          }          }
461    
462          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
463                           "SELECT bbs_content.CID, bbs_content.content "                           "SELECT bbs_content.CID, bbs_content.content, reply_note "
464                           "FROM bbs INNER JOIN bbs_content ON bbs.CID = bbs_content.CID "                           "FROM bbs INNER JOIN bbs_content ON bbs.CID = bbs_content.CID "
465                           "WHERE bbs.AID = %d",                           "WHERE bbs.AID = %d",
466                           p_article->aid);                           p_article->aid);
# Line 500  int article_modify(const SECTION_LIST *p Line 504  int article_modify(const SECTION_LIST *p
504    
505                  free(content);                  free(content);
506                  content = NULL;                  content = NULL;
507    
508                    reply_note = atoi(row[2]);
509          }          }
510          mysql_free_result(rs);          mysql_free_result(rs);
511          rs = NULL;          rs = NULL;
# Line 511  int article_modify(const SECTION_LIST *p Line 517  int article_modify(const SECTION_LIST *p
517          {          {
518                  editor_display(p_editor_data);                  editor_display(p_editor_data);
519    
520                  clearscr();                  while (!SYS_server_exit)
                 moveto(1, 1);  
                 prints("(S)保存, (C)取消 or (E)再编辑? [S]: ");  
                 iflush();  
   
                 for (ch = 0; !SYS_server_exit; ch = igetch_t(MAX_DELAY_TIME))  
521                  {                  {
522                            clearscr();
523                            moveto(1, 1);
524                            prints("(S)保存, (C)取消, (N)%s回复通知 or (E)再编辑? [S]: ",
525                                       (reply_note ? "关闭" : "开启"));
526                            iflush();
527    
528                            ch = igetch_t(MAX_DELAY_TIME);
529                          switch (toupper(ch))                          switch (toupper(ch))
530                          {                          {
531                          case KEY_NULL:                          case KEY_NULL:
532                          case KEY_TIMEOUT:                          case KEY_TIMEOUT:
533                                  goto cleanup;                                  goto cleanup;
534                          case CR:                          case CR:
                                 igetch_reset();  
535                          case 'S':                          case 'S':
536                                  break;                                  break;
537                          case 'C':                          case 'C':
# Line 533  int article_modify(const SECTION_LIST *p Line 540  int article_modify(const SECTION_LIST *p
540                                  prints("取消...");                                  prints("取消...");
541                                  press_any_key();                                  press_any_key();
542                                  goto cleanup;                                  goto cleanup;
543                            case 'N':
544                                    reply_note = (reply_note ? 0 : 1);
545                                    continue;
546                          case 'E':                          case 'E':
547                                  break;                                  break;
548                          default: // Invalid selection                          default: // Invalid selection
# Line 643  int article_modify(const SECTION_LIST *p Line 653  int article_modify(const SECTION_LIST *p
653    
654          // Update article          // Update article
655          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
656                           "UPDATE bbs SET CID = %d, length = %d, excerption = 0 WHERE AID = %d", // Set excerption = 0 explictly in case of rare condition                           "UPDATE bbs SET CID = %d, length = %d, reply_note = %d, excerption = 0 WHERE AID = %d", // Set excerption = 0 explictly in case of rare condition
657                           p_article_new->cid, content_display_length, p_article->aid);                           p_article_new->cid, content_display_length, reply_note, p_article->aid);
658    
659          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
660          {          {
# Line 721  int article_reply(const SECTION_LIST *p_ Line 731  int article_reply(const SECTION_LIST *p_
731          int content_display_length;          int content_display_length;
732          char nickname_f[BBS_nickname_max_len * 2 + 1];          char nickname_f[BBS_nickname_max_len * 2 + 1];
733          int sign_id = 0;          int sign_id = 0;
734            int reply_note = 0;
735          long len;          long len;
736          int ch;          int ch;
737          char *p, *q;          char *p, *q;
# Line 730  int article_reply(const SECTION_LIST *p_ Line 741  int article_reply(const SECTION_LIST *p_
741          long i;          long i;
742          long ret = 0;          long ret = 0;
743          int topic_locked = 0;          int topic_locked = 0;
744            char msg[BBS_msg_max_len];
745            char msg_f[BBS_msg_max_len * 2 + 1];
746            int len_msg;
747    
748          if (p_section == NULL || p_article == NULL)          if (p_section == NULL || p_article == NULL)
749          {          {
# Line 837  int article_reply(const SECTION_LIST *p_ Line 851  int article_reply(const SECTION_LIST *p_
851                  }                  }
852    
853                  // Apply LML render to content body                  // Apply LML render to content body
854                  len = lml_plain(row[1], content_f, ARTICLE_CONTENT_MAX_LEN);                  len = lml_render(row[1], content_f, ARTICLE_CONTENT_MAX_LEN, 0);
855                  content_f[len] = '\0';                  content_f[len] = '\0';
856    
857                  // Remove control sequence                  // Remove control sequence
# Line 892  int article_reply(const SECTION_LIST *p_ Line 906  int article_reply(const SECTION_LIST *p_
906          {          {
907                  clearscr();                  clearscr();
908                  moveto(21, 1);                  moveto(21, 1);
909                  prints("回复文章于 %s[%s] 讨论区", p_section->stitle, p_section->sname);                  prints("回复文章于 %s[%s] 讨论区,回复通知:%s", p_section->stitle, p_section->sname, (reply_note ? "开启" : "关闭"));
910                  moveto(22, 1);                  moveto(22, 1);
911                  prints("标题: %s", (p_article_new->title[0] == '\0' ? "[无]" : p_article_new->title));                  prints("标题: %s", (p_article_new->title[0] == '\0' ? "[无]" : p_article_new->title));
912                  moveto(23, 1);                  moveto(23, 1);
# Line 903  int article_reply(const SECTION_LIST *p_ Line 917  int article_reply(const SECTION_LIST *p_
917                          prints("    按0~3选签名档(0表示不使用)");                          prints("    按0~3选签名档(0表示不使用)");
918    
919                          moveto(24, 1);                          moveto(24, 1);
920                          prints("T改标题, C取消, Enter继续: ");                          prints("T改标题, C取消, N%s, Enter继续: ",
921                                       (reply_note ? "关闭回复通知" : "开启回复通知"));
922                          iflush();                          iflush();
923                          ch = 0;                          ch = 0;
924                  }                  }
# Line 916  int article_reply(const SECTION_LIST *p_ Line 931  int article_reply(const SECTION_LIST *p_
931                          case KEY_TIMEOUT:                          case KEY_TIMEOUT:
932                                  goto cleanup;                                  goto cleanup;
933                          case CR:                          case CR:
                                 igetch_reset();  
934                                  break;                                  break;
935                          case 'T':                          case 'T':
936                                  moveto(24, 1);                                  len = get_data(24, 1, "标题: ", title_input, sizeof(title_input), TITLE_INPUT_MAX_LEN);
                                 clrtoeol();  
                                 len = get_data(24, 1, "标题: ", title_input, sizeof(title_input), TITLE_INPUT_MAX_LEN, DOECHO);  
937                                  for (p = title_input; *p == ' '; p++)                                  for (p = title_input; *p == ' '; p++)
938                                          ;                                          ;
939                                  for (q = title_input + len; q > p && *(q - 1) == ' '; q--)                                  for (q = title_input + len; q > p && *(q - 1) == ' '; q--)
# Line 941  int article_reply(const SECTION_LIST *p_ Line 953  int article_reply(const SECTION_LIST *p_
953                                  prints("取消...");                                  prints("取消...");
954                                  press_any_key();                                  press_any_key();
955                                  goto cleanup;                                  goto cleanup;
956                            case 'N':
957                                    reply_note = (reply_note ? 0 : 1);
958                                    break;
959                          case '0':                          case '0':
960                          case '1':                          case '1':
961                          case '2':                          case '2':
# Line 976  int article_reply(const SECTION_LIST *p_ Line 991  int article_reply(const SECTION_LIST *p_
991                                  case KEY_TIMEOUT:                                  case KEY_TIMEOUT:
992                                          goto cleanup;                                          goto cleanup;
993                                  case CR:                                  case CR:
                                         igetch_reset();  
994                                  case 'S':                                  case 'S':
995                                          break;                                          break;
996                                  case 'C':                                  case 'C':
# Line 1127  int article_reply(const SECTION_LIST *p_ Line 1141  int article_reply(const SECTION_LIST *p_
1141          snprintf(sql, sizeof(sql),          snprintf(sql, sizeof(sql),
1142                           "INSERT INTO bbs(SID, TID, UID, username, nickname, title, CID, transship, "                           "INSERT INTO bbs(SID, TID, UID, username, nickname, title, CID, transship, "
1143                           "sub_dt, sub_ip, reply_note, exp, last_reply_dt, icon, length) "                           "sub_dt, sub_ip, reply_note, exp, last_reply_dt, icon, length) "
1144                           "VALUES(%d, %d, %d, '%s', '%s', '%s', %d, 0, NOW(), '%s', 1, %d, NOW(), 1, %d)",                           "VALUES(%d, %d, %d, '%s', '%s', '%s', %d, 0, NOW(), '%s', %d, %d, NOW(), 1, %d)",
1145                           p_section->sid, (p_article->tid == 0 ? p_article->aid : p_article->tid),                           p_section->sid, (p_article->tid == 0 ? p_article->aid : p_article->tid),
1146                           BBS_priv.uid, BBS_username, nickname_f, title_f,                           BBS_priv.uid, BBS_username, nickname_f, title_f,
1147                           p_article_new->cid, hostaddr_client, BBS_user_exp, content_display_length);                           p_article_new->cid, hostaddr_client,
1148                             reply_note, BBS_user_exp, content_display_length);
1149    
1150          if (mysql_query(db, sql) != 0)          if (mysql_query(db, sql) != 0)
1151          {          {
# Line 1168  int article_reply(const SECTION_LIST *p_ Line 1183  int article_reply(const SECTION_LIST *p_
1183                  goto cleanup;                  goto cleanup;
1184          }          }
1185    
1186            // Notify the authors of the topic / article which is replyed.
1187            snprintf(sql, sizeof(sql),
1188                             "SELECT DISTINCT UID FROM bbs WHERE (AID = %d OR AID = %d) "
1189                             "AND visible AND reply_note AND UID <> %d",
1190                             p_article->tid, p_article->aid, BBS_priv.uid);
1191    
1192            if (mysql_query(db, sql) != 0)
1193            {
1194                    log_error("Read reply info error: %s\n", mysql_error(db));
1195                    ret = -1;
1196                    goto cleanup;
1197            }
1198            if ((rs = mysql_store_result(db)) == NULL)
1199            {
1200                    log_error("Get reply info failed\n");
1201                    ret = -1;
1202                    goto cleanup;
1203            }
1204    
1205            while ((row = mysql_fetch_row(rs)))
1206            {
1207                    // Send notification message
1208                    len_msg = snprintf(msg, BBS_msg_max_len,
1209                                                       "有人回复了您所发表/回复的文章,快来"
1210                                                       "[article %d]看看[/article]《%s》吧!\n",
1211                                                       p_article_new->aid, title_f);
1212    
1213                    mysql_real_escape_string(db, msg_f, msg, (unsigned long)len_msg);
1214    
1215                    snprintf(sql, sizeof(sql),
1216                                     "INSERT INTO bbs_msg(fromUID, toUID, content, send_dt, send_ip) "
1217                                     "VALUES(%d, %d, '%s', NOW(), '%s')",
1218                                     BBS_sys_id, atoi(row[0]), msg_f, hostaddr_client);
1219    
1220                    if (mysql_query(db, sql) != 0)
1221                    {
1222                            log_error("Insert msg error: %s\n", mysql_error(db));
1223                            ret = -1;
1224                            goto cleanup;
1225                    }
1226            }
1227            mysql_free_result(rs);
1228            rs = NULL;
1229    
1230          // Add exp          // Add exp
1231          if (checkpriv(&BBS_priv, p_section->sid, S_GETEXP)) // Except in test section          if (checkpriv(&BBS_priv, p_section->sid, S_GETEXP)) // Except in test section
1232          {          {


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1