게시판 검색 기능 추가하기

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. 제목의 특정단어로 검색
  [게시판 '특정단어' 봐] 예) 게시판 줄임말 봐
  ['특정단어' 게시판] 예) 줄임말 게시판


홈지기 "그륨"
번호 제목 글쓴이 날짜 조회 수
57 도배방지 그리움 2007.04.12 222
56 그룹경험치 소스 그리움 2007.04.12 220
55 패거리전쟁중 "휴전" 그리움 2007.04.12 220
54 직업 추가하기 그리움 2007.04.12 218
53 자동으로 돈줍기 소스 그리움 2007.04.12 213
52 경매는 이렇게 그리움 2007.04.12 213
51 어디 그리움 2007.04.12 211
50 무한에서 안시 넣는 방법 그리움 2007.04.12 210
49 방설명 지우기 그리움 2007.04.12 209
48 특수 아이템 만들기 그리움 2007.04.12 209
47 복권 소스 그리움 2007.04.12 207
46 혼자 말하는 몹 그리움 2007.04.12 206
45 자동 이벤트 그리움 2007.04.12 204
44 낮과 밤이 되면 어둡고 환하게 그리움 2007.04.12 203
43 귀환장소 변경 소스 #1 그리움 2007.04.12 202
42 개량형 우체국 그리움 2007.04.12 202
41 주문추가 소스 그리움 2007.04.12 201
40 출구모양 개량 소스 그리움 2007.04.12 201
39 자동수련 소스 그리움 2007.04.12 201
38 잡담 안시 사용하기 그리움 2007.04.12 200


XE Login