荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (pq), 信区: InstallBBS
标  题: [转载] Re: 请教定制讨论区的制作(转寄)
发信站: 荔园晨风BBS站 (Thu Nov 29 11:27:02 2001), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@bbs.pku.edu.cn 所发表 】
发信人: georgehill (Richard Qiu), 信区: BBSDev
标  题: Re: 请教定制讨论区的制作
发信站: 北大未名站 (2001年11月28日22:32:47 星期三), 站内信件

发信人: deardragon (老农), 信区: BBSdev
标  题: Re: 老农能不能把个人收藏夹的功能的具体实现说说
发信站: 快意灌水站 (2000年11月13日20:22:11 星期一), 站内信件

在 boards.c 中,
加 #define GOOD_BRC_NUM    20         // 最多有 20 个个人定制版面
struct goodboard {
   char ID[GOOD_BRC_NUM][BRC_STRLEN];
   int  num;
} GoodBrd;
添加函数
void GoodBrds()  // 菜单的调用函数
{
        if(!strcmp(currentuser.userid,"guest")) return;
        GoodBrd.num = 9999;
        boardprefix = NULL;
        choose_board(1);
}
int inGoodBrds(char *bname) // 判断版面是否是订阅版面
{
   int i;
   for ( i = 0; i < GoodBrd.num && i< GOOD_BRC_NUM; i ++ )
      if ( !strcmp(bname, GoodBrd.ID[i])) return i+1;
   return 0;
}

void load_GoodBrd() //从文件中获取订阅版面,填充数据结构 GoodBrd
{
   int i;
   char fname[STRLEN];
   FILE *fp;

   GoodBrd.num = 0;
   setuserfile(fname,".goodbrd");
   if( ( fp = fopen(fname,"r")) ) {
        for ( i = 0; i< GOOD_BRC_NUM ; i++)
           if(fscanf(fp, "%s\n", GoodBrd.ID[i]) != EOF){
              if( getbnum(GoodBrd.ID[i]) )GoodBrd.num ++;
           } else break;
        fclose(fp);
   }
   if (GoodBrd.num == 0) {
      GoodBrd.num ++;
      if(getbcache(DEFAULTBOARD))strcpy(GoodBrd.ID[0],DEFAULTBOARD);
      else strcpy(GoodBrd.ID[0],currboard);
   }
}
void save_GoodBrd() // 保存用户订阅的版面
{
   int i;
   FILE *fp;
   char fname[STRLEN];

   if( GoodBrd.num <= 0 ) {
      GoodBrd.num = 1;
      if(getbcache(DEFAULTBOARD))strcpy(GoodBrd.ID[0],DEFAULTBOARD);
      else strcpy(GoodBrd.ID[0],currboard);
   }
   setuserfile(fname,".goodbrd");
   if( (fp = fopen(fname,"wb+")) != NULL) {
      for (i=0; i< GoodBrd.num; i++)
         fprintf(fp, "%s\n", GoodBrd.ID[i]);
      fclose(fp);
   }
}
需要修改 load_boards() 函数
int
load_boards()
{
   struct shortfile *bptr;
   struct newpostdata *ptr;
   int     n, addto = 0, goodbrd = 0;
   resolve_boards();
   if (zapbuf == NULL) {
      load_zapbuf();
   }
   brdnum = 0;
   if( GoodBrd.num == 9999 ) { // 强制 load 订阅版面
      load_GoodBrd();
      goodbrd = 1;  // 表示处于阅读定制版面状态
   }
   for (n = 0; n < numboards; n++) {
      bptr = &bcache[n];
      if(!(bptr->filename[0]))continue; /* 隐藏被删除的版面 */
      if ( goodbrd == 0){ // 如果不是阅读定制版面,则 ...
         if (!(bptr->level & PERM_POSTMASK) && !HAS_PERM(bptr->level)
            && !(bptr->level & PERM_NOZAP))  continue;
         if (boardprefix != NULL &&
             strchr(boardprefix, bptr->title[0])==NULL&&boardprefix[0] != '*')
                continue;
         if (boardprefix != NULL && boardprefix[0] == '*') {
            if (!strstr(bptr->title, "●") && !strstr(bptr->title, "⊙")
                && bptr--title[0] != '*') continue;
         }
         if (boardprefix == NULL && bptr->title[0] == '*') continue;
         addto = yank_flag || zapbuf[n] != 0 || (bptr->level & PERM_NOZAP);
      } else addto = inGoodBrds(bptr->filename); //否则判断是否是订阅的版面
      if ( addto ) {  // addto 标志该版面应该可以阅读
         ptr = &nbrd[brdnum++];
         ptr->name = bptr->filename;
         ptr->title = bptr->title;
         ptr->BM = bptr->BM;
         ptr->flag = bptr->flag | ((bptr->level & PERM_NOZAP) ? NOZAP_FLAG :
0);
 ptr->pos = n;
         ptr->total = -1;
         ptr->zap = (zapbuf[n] == 0);
         if (bptr->level & PERM_POSTMASK)
            ptr->status = 'p';
         else if (bptr->level & PERM_NOZAP)
            ptr->status = 'z';
         else if (ptr->flag & NOREPLY_FLAG)
            ptr->status = 'x';
         else if ((bptr->level & ~PERM_POSTMASK) != 0)
            ptr->status = 'r';
         else
            ptr->status = ' ';
      }
   }
   if (brdnum == 0 && !yank_flag && boardprefix == NULL) {
      if(goodbrd) { // 如果处于定制版面中,但没有任何版面的话,则刷新
         GoodBrd.num = 0;
         save_GoodBrd();
         GoodBrd.num = 9999;
      }
      brdnum = -1;
      yank_flag = 1;
      return -1;
   }
   return 0;
}

在 choose_board(newflag) 函数中添加 a 和 d 模块
   case 'a':
      if( GoodBrd.num >= GOOD_BRC_NUM) {
         presskeyfor("个人热门版数已经达上限(20)",t_lines - 1);
      } else if ( GoodBrd.num ) {
         int pos;
         char  bname[STRLEN];
         struct boardheader fh;
         if(gettheboardname(1,"输入讨论区名 (按空白键自动搜寻): ",
            &pos, &fh, bname)) {
            if( !inGoodBrds(bname) ) {
               strcpy(GoodBrd.ID[GoodBrd.num ++],bname);
               save_GoodBrd();
               GoodBrd.num = 9999;
               brdnum = -1;
               break;
            }
         }
         page = -1;
      }
      break;
   case 'd':
      if ( GoodBrd.num ){
         int i, pos;
         char ans[5];
         sprintf(genbuf,"要把 %s 从收藏夹中去掉?[Y/n]",nbrd[num].name);
         getdata(t_lines-1,0,genbuf,ans, 2,DOECHO, YEA);
         if(ans[0]=='n'||ans[0]=='N'){
            page = -1;
            break;
         }
         pos = inGoodBrds(nbrd[num].name);
         for(i = pos-1; i< GoodBrd.num-1; i++)
            strcpy(GoodBrd.ID[i],GoodBrd.ID[i+1]);
         GoodBrd.num --;
         save_GoodBrd();
         GoodBrd.num = 9999;
         brdnum = -1;
      }
      break;
相关变动:
在 EGroup(...) 等函数中加入 GoodBrd.num = 0; ,可以用 GoodBrd 作关键字
在 boards.c 文件中搜索。

--
※ 来源:·北大未名站 bbs.pku.edu.cn·[FROM: 210.39.3.50]
--
※ 转寄:·北大未名站 bbs.pku.edu.cn·[FROM: 210.39.3.50]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店