게시판 검색 기능 추가하기

2007.04.12 13:01

그리움 조회 수:170 추천:49

제 목 : [패치] 게시판의 검색기능 추가 찬성 : 0 반대 : 0
올린이 : croaky (서민철 ) 읽음 : 27 날짜 : 99/09/02 22:59
------------------------------------------------------------------------------
이 패치는 게시판에서 글쓴 사람의 아이디나 제목의 특정단어로 검색하여
결과물을 보여주도록 해주는 패치입니다.
물론, 이전에 제가 공개한 패치들처럼 이미 소스에 많은 수정을 한 사람들을
위해서, 패치로 만들지 않고, 고치는 방법을 적습니다.

아래의 코드에 대한 저작권은 본인에게 있으며, 상업적 목적의 머드에서는
사용할수 없습니다. 무료 운영중인 머드에서 사용시, 자유롭게 사용할수 있으나,
아래의 코드로 인해 발생되는 문제에 대해서 제가 반드시 답변을 한다거나
책임을 지지는 않습니다.

1999년 9월 2일.
서민철

-----------------------------------------------------------
Wicked Angel.. Network Programmer, Game Designer
E-Mail Address : croaky@frog.sarang.net croaky@nownuri.net
Home Page : http://frog.sarang.net/
-----------------------------------------------------------


1. mstruct.h

typedef struct extra { /* Extra (non-saved) player fields */
   char tempstr[4][80];
   char talksend[20];
   char lastcommand[80];
/* 여기서부터 추가 */
   char boardsearch[255];
   int searchflag;
/* 여기까지 */
   ctag *first_charm;
   etag *first_ignore;
} extra;


2. board.c

int look_board(ply_ptr,cmnd)
creature *ply_ptr;
cmd *cmnd;
{
   room *rom_ptr;
   object *obj_ptr;
   int fd;
/* 아래를 추가한다. */
   int len;
/* 여기까지 */
              
/* 중략 */

       F_SET(ply_ptr, PNOBRD);
       board_obj[fd]=obj_ptr;

/* 여기부터 추가 */
       if(cmnd->num < 2) {
           Ply[fd].extr->searchflag = 0;
           Ply[fd].extr->boardsearch[0] = 0;
       }
       else if(cmnd->num == 3 && !strcmp(cmnd->str[1], "이름")) {
           Ply[fd].extr->searchflag = 2;
           sprintf(Ply[fd].extr->boardsearch, "%s", cmnd->str[2]);
       }
       else {
           len = cut_command(cmnd->fullstr);
           cmnd->fullstr[255] = 0;

           Ply[fd].extr->searchflag = 1;
           sprintf(Ply[fd].extr->boardsearch, "%s", cmnd->fullstr);
       }
/* 여기까지 */

       list_board(fd, 0, "");
       F_CLR(ply_ptr, PNOBRD);

       return DOPROMPT;
}

/* 하략 */

---
검색 방법의 설정 - 이름 또는 제목의 단어 검색

3. command2.c
              
int look(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
   room *rom_ptr;
   room *new_rom;
   object *obj_ptr;
   object *bnk_ptr;
   creature *crt_ptr;
   exit_ *ext_ptr;
   char file[80];
   char str[2048];
   int fd, n, match=0;
/* 여기부터 추가 */
   int i, len, spaces=0;
/* 여기까지 */

/* 중략 */

   if(obj_ptr) {

       if(obj_ptr->special==SP_BOARD) {
           board_obj[fd]=obj_ptr;
                              
/* 여기서부터 추가 */
           if(cmnd->num < 3) {
               Ply[fd].extr->searchflag = 0;
               Ply[fd].extr->boardsearch[0] = 0;
           }
           else if(cmnd->num == 4 && !strcmp(cmnd->str[2], "이름")) {
               Ply[fd].extr->searchflag = 2;
               sprintf(Ply[fd].extr->boardsearch, "%s", cmnd->str[3]);
           }
           else {
               len = cut_command(cmnd->fullstr);
               for(i=0; i< len && i<256; i++) {
                   if(cmnd->fullstr[i] == ' ' && cmnd->fullstr[i+1] != ' ') {
                       spaces++;
                       break;
                   }
               }
               cmnd->fullstr[255] = 0;

               if(spaces < 1 || strlen(&cmnd->fullstr[i+1]) < 1) {
                   Ply[fd].extr->searchflag = 0;
                   Ply[fd].extr->boardsearch[0] = 0;
               }
               else {
                   Ply[fd].extr->searchflag = 1;
                   sprintf(Ply[fd].extr->boardsearch, "%s",
                           &cmnd->fullstr[i+1]);
               }
           }
/* 여기까지 추가 */

           list_board(fd,0,"");
           return(DOPROMPT);
       }
       if(obj_ptr->special) {
           n = special_obj(ply_ptr, cmnd, SP_MAPSC);
           if(n != -2) return(MAX(n, 0));
       }

/* 하략 */

---
검색 방법의 설정 - 이름 또는 제목의 단어 검색

4. board.c

void list_board(fd, param, str)
int fd;
int param;
char *str;
{

/* 중략 */

       case 1:
           handle=board_handle[fd];
           F_CLR(Ply[fd].ply,PREADI);

           if(*str=='.') {
               print(fd,"게시물을 그만 봅니다.");
               close(handle);
               RETURN(fd, command, 1);
           }

           print(fd, "\n 번호 올린이 날짜 줄수 조회 제목\n");
           print(fd, "-------------------------------------");
           print(fd, "--------------------------------------\n");

           i=0;
           while(i<20) {
               if(board_pos[fd]                     close(handle);
                   RETURN(fd, command, 1);
               }
               board_pos[fd]-=sizeof(struct BOARD_INDEX);
               lseek(handle,board_pos[fd],SEEK_SET);
               read(handle,&board_index,sizeof(struct BOARD_INDEX));
               if(board_index.readnum<0 && Ply[fd].ply->class  
/* 여기부터 추가 */
               if(Ply[fd].extr->searchflag == 1)
                   if(!search_str(board_index.title,Ply[fd].extr->boardsearch))

                           continue;
               if(Ply[fd].extr->searchflag == 2)
                   if(strcmp(board_index.upload,Ply[fd].extr->boardsearch))
                           continue;
/* 여기까지 */

               print(fd," %4d %-12s ",board_index.num,board_index.upload);
               print(fd,"%02d/%02d ",board_index.month,board_index.day);

/* 하략 */

---
실제 검색 루틴의 추가

5. misc.c

/* 아래 부분을 추가 */
int search_str(str1, str2)
char *str1;
char *str2;
{
   int i, j=0;
   char temp[255];

   zero(temp, 255);
   clear_ansi(str1, temp);
   i = strlen(temp);

   while(str1[j] && j < i) {
       if(!strncmp(&temp[j], str2, strlen(str2))) return(1);
       j++;
   }
   return(0);
}

void clear_ansi(str, temp)
char *str;
char *temp;
{
   int i, j=0, k=0;

   temp[0] = 0;

   i = strlen(str);

   while(str[j] && j < i) {
       if(str[j] == '{') {
           if(str[j+1] && color_cmp(&str[j+1])) {
               j += 3;
               continue;
           }
       }
       else if(str[j] == '}') {
           j++;
           continue;
       }

       temp[k] = str[j];
       k++;
       j++;
   }
   temp[k+1] = 0;

   return;
}

---
단어 검색 루틴의 추가 -- 안시를 체크해서 단어를 찾음
이 루틴의 추가후, mextern.h 에 위의 두 함수를 정의해주십시요.

---
사용법 :
게시판의 리스트를 보는 방법은 무한에서는 2가지 방법이 있습니다.
[게시판] 명령과 [게시판 봐] 명령의 두가지 방법이며, 위에 2,3번에서
각각에 대해서 패치를 적용시켰습니다.

1. 글쓴이의 아이디로 검색
  [게시판 이름 '사용자명' 봐] 예) 게시판 이름 크로키 봐
  [이름 '사용자명' 게시판] 예) 이름 크로키 게시판

2. 제목의 특정단어로 검색
  [게시판 '특정단어' 봐] 예) 게시판 줄임말 봐
  ['특정단어' 게시판] 예) 줄임말 게시판


홈지기 "그륨"


XE Login