세라봇 & Web

수동학습 소스 (FileStream) 본문

카톡봇 프로그래밍/소스

수동학습 소스 (FileStream)

Kkyuya 2020. 9. 20. 20:36
+ 설명 : 봇에게 학습내용을 적어서 학습시키는 소스
- 명령어 -> 할말 -> 대답할말 순서로 간단히 학습가능
- 학습목록 출력
- 학습내용 선택삭제
- 학습내용 전부삭제
  (해쉬코드가 없는 유저는 자신의 학습내용만 삭제)
- 학습내용 검색가능
  (작성자, 할말, 대답할말 기준 각각 검색가능)
@ 사용방법

1. 채팅내용파일이 저장될 경로를 수정하고 컴파일 해주세요.

(본문의 한글경로 수정을 추천합니다)

2. 채팅창에 ..hash 를 입력하여 나온 해시코드를 복사하세요.
(해시코드 적용 후 해시코드 명령어 라인은 주석처리 해주세요)
3. 복사한 해시코드를 소스에 넣으세요.
4. 명령어부분들을 자신이 쓸 명령어로 바꾸고 컴파일 해주세요.

5. 채팅창에 ..수동학습설치 를 입력하세요.

(파일생성 완료 메시지가 뜨면 성공!)

6. 설정한 학습시작 명령어를 입력하고 사용.

(최초 설치 시 저장기능이 꺼진상태입니다)

 

/*
- 2020. 09. 20 - https://kkyuya.tistory.com
- 세팅값의 데이타경로를 가장먼저 수정해주세요
- 최초 1회 설치명령어(..수동학습설치) 작동 필수
*/
//-----------------------
//  고정값 (변경금지)
//-----------------------
const li= "\n---------------------------------------------\n"; //문단경계선
const more ="\u200b".repeat(500); //..더보기
const FS = FileStream; //파일스트림 단축
var word='';
var step=[];
var a=[], b=[], c=[], user=[];

//-------------------------
//   세팅값 (반드시 수정)
//-------------------------
const myHash=[해시코드넣는곳]; //해시코드 (모를 경우 카톡에 "..hash" 명령어를 입력하여 확인
            //해시코드가 여러개일 경우 ,로 구분해서 넣음 (예: [123456,456789])
const path = "/sdcard/메신저봇폴더/Bots/스크립트네임/Data/data.txt"; //데이타 경로

//----------------------
//        명령어
//----------------------
// (변경해서 쓰기를 권장)
const help='..수동학습' // 수동학습 도움말 출력
const start='..학습' // 수동학습 시작
const cancel='..취소' // 수동학습 취소 (학습중일때만 작동함)
const list='..학습목록' // 학습목록 출력
const del='..학습삭제 ' // 학습삭제 명령 접두어
const allDel='..학습초기화' // 자신의 학습내용 모두 삭제 (해시코드를 넣은사람이 사용 시 모든학습내용 삭제)
const Q='..학습Q ' // 학습목록 Q에 해당하는내용 검색 명령 접두어
const A='..학습A ' // 학습목록 A에 해당하는내용 검색 명령 접두어
const N='..학습이름 ' // 작성자의 이름 검색 명령 접두어


function response(room, msg, sender, iGC, replier, imageDB,) {
var Hash = java.lang.String(imageDB.getProfileImage()).hashCode();

// 해시코드 출력 (사용 후 주석처리 해주세요)
if (msg=="..hash") replier.reply(Hash);

// 설치하기 (최초 1회 실행)
if(msg=='..수동학습설치'){
    let data=[]; //빈배열 생성
    let check = JSON.parse(FS.read(path)); //채팅내역파일 불러오기
    if(check==null){ //경로에 파일이 없으면
        FS.write(path, JSON.stringify(data)); //채팅내역파일에 빈배열만 담고 저장
        replier.reply("[!] 수동학습 기본파일 생성 완료!");
    } else replier.reply("[!] 이미 설치되었어요!"); //경로에 파일이 있을시 실행
}

// 도움말 출력
if(msg==help) replier.reply("💭 수동학습 도움말"+more+li+
start+' : 학습을 시작합니다\n'+
cancel+' : 학습을 취소합니다\n'+
list+' : 학습한 말을 모두 출력합니다\n'+
del+' (번호) : 목록에서 해당번호의 내용을 삭제합니다\n'+
allDel+' : 자신이 학습시킨 내용을 모두 삭제합니다\n\n'+
Q+' (검색단어) : 목록의 Q에 해당하는 내용을 검색합니다\n'+
A+' (검색단어) : 목록의 A에 해당하는 내용을 검색합니다\n'+
N+' (검색단어) : 작성자의 이름으로 검색합니다\n\n\
- 사용법\n\
   1. "'+start+'" 명령어로 수동학습 시작.\n\
   2. 봇이 반응할 말을 적습니다.\n\
   3. 봇이 대답할 말을 적습니다.\n\n\
[!] 학습삭제와 초기화는 자신이 학습시킨 내용만 지울 수 있습니다.');

// 수동학습 시작
if(msg==start){
    replier.reply("[!] 봇이 반응할 말을 입력하세요!");
    step[sender]=1;
    return;
} 

// 수동학습 step1.
if(step[sender]==1){
    if(msg){
        word=JSON.parse(FS.read(path));
        for(let i=0; i<word.length; i++){
            if(msg==word[i][0]){
                replier.reply("[!] 같은 말이 이미 있어요!\n  다른 말을 입력해 주세요!");
                return;
            }
        }
        if(msg.startsWith('..')||msg.startsWith('/')){ // 사용불가능 접두어 설정(유저가 할 말)
            replier.reply("사용할 수 없는 접두어가 포함되었어요!");
            return;
        }
        a[sender]=[msg];
        replier.reply("[!] 봇이 할 말을 입력하세요!");
        step[sender]=2;
        return;
    }
}

// 수동학습 step2.
if(step[sender]==2){
    if(msg){
        if(msg==cancel){
            step[sender]=0;
            a[sender]=[]; b[sender]=[]; c[sender]=[];
            user=[]; word='';
            replier.reply("[!] 학습을 취소했어요!");
            return;
        }
        if(msg.startsWith('..')||msg.startsWith('/')){ // 사용불가능 접두어 설정(봇이 할 말)
            replier.reply("[!] 사용할수 없는 접두어가 포함되었어요!");
            return;
        }
        word=JSON.parse(FS.read(path));
        b[sender]=[msg];
        user=[sender];
        c[sender]=[]; 
        c[sender].push(a[sender]); 
        c[sender].push(b[sender]);
        c[sender].push(user);
        word.unshift(c[sender]);
        replier.reply('• Q : '+c[sender][0]+'\n• A : '+c[sender][1]);
        FS.write(path, JSON.stringify(word));
        step[sender]=0;
        a[sender]=[]; b[sender]=[]; c[sender]=[];
        user=[];
        return;
    }
}

// 학습 취소
if(msg==calcel && step[sender]==1){
    step[sender]=0;
    a[sender]=[]; b[sender]=[]; c[sender]=[];
    user=[]; word='';
    replier.reply("[!] 학습을 취소했어요!");
    return;
}

// 리스트 출력
if(msg==list){
    word=JSON.parse(FS.read(path));
    let z='';
    for(let i=0; i<word.length; i++){
        let j=i+1;
        let x=j+'. 작성자 : '+word[i][2]+'\n   Q : '+word[i][0]+'\n   A : '+word[i][1]+'\n\n';
        z+=x;
    }
    replier.reply('💭 학습목록'+more+li+z);
}

// Q 기준 검색
if(msg.startsWith(Q)){
    word=JSON.parse(FS.read(path));
    let q=msg.substr(Q.length);
    let y=[];
    for(let i=0; i<word.length; i++){
        let j=i+1;
        if(word[i][0].some(e=>e.indexOf(q)!=-1)==true) y.push(j+'. 작성자 : '+word[i][2]+'\n   Q : '+word[i][0]+'\n   A : '+word[i][1]);
    }
    if(y.length==0) replier.reply("[!] 검색결과가 없어요!");
    else{
        let z='';
        for(let i=0; i<y.length; i++){
            let r=y[i]+'\n\n';
            z += r;
        }
        replier.reply('💭 Q. "'+q+'.." 검색결과'+more+li+z);
    }
}

// A 기준 검색
if(msg.startsWith(A)){
    word=JSON.parse(FS.read(path));
    let q=msg.substr(A.length);
    let y=[];
    for(let i=0; i<word.length; i++){
        let j=i+1;
        if(word[i][1].some(e=>e.indexOf(q)!=-1)==true) y.push(j+'. 작성자 : '+word[i][2]+'\n   Q : '+word[i][0]+'\n   A : '+word[i][1]);
    }
    if(y.length==0) replier.reply("[!] 검색결과가 없어요!");
    else{
        let z='';
        for(let i=0; i<y.length; i++){
            let r=y[i]+'\n\n';
            z += r;
        }
        replier.reply('💭 A. "'+q+'.." 검색결과'+more+li+z);
    }
}

// 작성자 기준 검색
if(msg.startsWith(N)){
    word=JSON.parse(FS.read(path));
    let q=msg.substr(N.length);
    let y=[];
    for(let i=0; i<word.length; i++){
        let j=i+1;
        if(word[i][2].some(e=>e.indexOf(q)!=-1)==true) y.push(j+'. 작성자 : '+word[i][2]+'\n   Q : '+word[i][0]+'\n   A : '+word[i][1]);
    }
    if(y.length==0) replier.reply("[!] 검색결과가 없어요!");
    else{
        let z='';
        for(let i=0; i<y.length; i++){
            let r=y[i]+'\n\n';
            z += r;
        }
        replier.reply('💭 작성자. "'+q+'.." 검색결과'+more+li+z);
    }
}

// 학습 삭제
if(msg.startsWith(del)){
    try{
    word=JSON.parse(FS.read(path));
        var no=Number(msg.substr(del.length))-1;
        if(myHash.includes(Hash)){
            replier.reply('Q. '+word[no][0]+'\nA. '+word[no][1]+'\n[!] 학습내용 삭제 완료!');
            word.splice(no,1);
        }
        else if(sender!=word[no][2]) replier.reply('[!] 자신이 작성한 것만 지울수 있어요!');
        else {
            replier.reply('Q. '+word[no][0]+'\nA. '+word[no][1]+'\n[!] 학습내용 삭제 완료!');
            word.splice(no,1);
        }
    FS.write(path, JSON.stringify(word));
    } catch(e){}
}

// 학습 초기화
if(msg==allDel){
    word=JSON.parse(FS.read(path));
    if(myHash.includes(Hash)){
        word=[];
        FS.write(path, JSONstringify(word));
        replier.reply("[!] 학습내용을 모두 삭제했어요!");
    }
    else{
        for(let i=0; i<word.length; i++){
            if(word[i][2]==sender) word.splice(i,1);
        }
        FS.write(path, JSONstringify(word));
        replier.reply("[!] "+sender+"님의 학습내용을 모두 삭제했어요!");
    }
}

// 학습내용 감지소스
word=JSON.parse(FS.read(path));
for(let i=0; i<word.length; i++){
    if(msg==word[i][0]) replier.reply(word[i][1]);
}
}

'카톡봇 프로그래밍 > 소스' 카테고리의 다른 글

낚시게임  (13) 2021.01.04
채팅내역 저장/출력 (FileStream)  (0) 2020.09.20
Comments