직접 MBTI를 검사하는 봇은 아니고, 외부 사이트 등에서 mbti를 검사하고서 그 결과를 등록한 뒤, 디스코드 구성원들과 궁합을 보는 봇이다.
인터넷에 떠돌아 다니는 MBTI 궁합 차트를 기반으로 했다.
물론 아무런 근거 없는 궁합이기 때문에 재미로만 보자.
명령어별 기능
mbti
명령어 모음 (help 명령어와 동일)
1. mbti 검사
MBTI를 검사할 수 있는 링크를 출력한다.
2. mbti 보기 [MBTI]
MBTI 유형을 입력해주면, 해당 유형의 내용을 볼 수 있는 링크를 출력한다.
3. mbti 등록 [MBTI]
자신의 MBTI 유형을 등록한다. (기존에 등록했어도 덮어쓰기 가능.)
4. mbti 등록현황
mbti 등록 현황을 출력한다.
5. mbti 궁합 @A @B
@자리에 원하는 사람을 언급해주면 된다.
@A만 언급하면 A와 나 자신의 궁합 결과를 출력한다.
@A @B 모두 언급해주면, @A와 @B의 궁합 결과를 표시해준다.
개발환경 : UBUNTU 18.04.3
개발언어: NODE JS V12
모듈 : discord.js v12
텍스트 에디터: ATOM (편하신거 사용하시면 됩니다.)
봇 생성하는 것은 아래 포스트를 보고 오자.
https://mandu-mandu.tistory.com/385?category=693080
일단 위 궁합표를 배열로 만들었다. (노가다다 노가다...)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//16가지 mbti 유형
const mbti = new Array("INFP","ENFP","INFJ","ENFJ", "INTJ", "ENTJ", "INTP", "ENTP", "ISFP", "ESFP", "ISTP", "ESTP", "ISFJ", "ESFJ", "ISTJ", "ESTJ");
//Relation : A, B, C, D, F
var mbtiR = new Array(16);
mbtiR[0] = ["A"];
mbtiR[1] = ["A", "A"];
mbtiR[2] = ["A", "B", "A"];
mbtiR[3] = ["B", "A", "A", "A"];
mbtiR[4] = ["A", "B", "A", "A", "A"];
mbtiR[5] = ["B", "A", "A", "A", "A", "A"];
mbtiR[6] = ["A", "A", "A", "A", "A", "B", "A"];
mbtiR[7] = ["A", "A", "B", "A", "B", "A", "A", "A"];
mbtiR[8] = ["F", "F", "F", "B", "C", "C", "C", "C", "D"];
mbtiR[9] = ["F", "F", "F", "F", "C", "C", "C", "C", "D", "D"];
mbtiR[10] = ["F", "F", "F", "F", "C", "C", "C", "C", "D", "D", "D"];
mbtiR[11] = ["F", "F", "F", "F", "C", "C", "C", "C", "D", "D", "D", "D"];
mbtiR[12] = ["F", "F", "F", "F", "D", "C", "D", "D", "C", "B", "C", "B", "A"];
mbtiR[13] = ["F", "F", "F", "F", "D", "C", "D", "D", "B", "C", "B", "C", "A", "A"];
mbtiR[14] = ["F", "F", "F", "F", "D", "C", "D", "D", "C", "B", "C", "B", "A", "A", "A"];
mbtiR[15] = ["F", "F", "F", "F", "D", "C", "B", "D", "B", "C", "B", "C", "A", "A", "A", "A"];
|
cs |
A, B, C, D, F 5단계이며, 위 표 기준으로 A가 파랑, F가 빨강이다.
이제 명령어 별로 6가지의 기능을 구현해야 하는데, 1번과 2번은 단술 입출력이기 때문에 아래 포스트를 보고 구현이 가능하다.
https://mandu-mandu.tistory.com/385?category=693080
https://mandu-mandu.tistory.com/386?category=693080
3번 4번 5번의 핵심 기능은 동일하다.
배열을 하나 만들어서
유저의 id (고유값), username, mbti 유형값을 받아서 저장하고
json으로 만들어서 외부 파일에 저장해둔다.
저장된 유저의 mbti값을 가져와서 궁합 값을 출력해주면 된다.
간단하다.
봇의 핵심인 3번과 5번 명령에 해당되는 코드:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
if (msg.content.startsWith('mbti 등록 ')) {
var reg_mbti = msg.content.split(' ');
//type
var type = 16;
var input_mbti = reg_mbti[2].toUpperCase();
for(var i=0; i<16; i++) {
if (mbti[i] == input_mbti) {
type = i;
break;
}
}
if(type == 16){
msg.channel.send("실패!");
}else {
//json to Array
var data = fs.readFileSync('./user_list.json', 'utf8');
var user_list_arr = JSON.parse(data);
//search
var j = -1;
for(var k=0; k<user_list_arr.length; k++) {
if (user_list_arr[k].user_id == msg.member.user.id) {
j = k;
break;
}
}
//patch or push
if (j == -1) {
var user_list = new Object();
user_list.user_id = msg.member.user.id;
user_list.username = msg.member.user.username;
user_list.mbti = type;
user_list_arr.push(user_list);
} else {
user_list_arr[j].username = msg.member.user.username;
user_list_arr[j].mbti = type;
}
//Array to json
data = JSON.stringify(user_list_arr);
fs.writeFileSync('./user_list.json', data, 'utf8');
msg.channel.send("성공!");
}
}
if (msg.content.startsWith('mbti 궁합')) {
var comp_mbti = msg.content.split(' ');
//json to Array
var data = fs.readFileSync('./user_list.json', 'utf8');
var user_list_arr = JSON.parse(data);
//search user 1
var user_1 = "";
if (comp_mbti[2] === undefined) {
user_1 = "";
} else {
user_1 = comp_mbti[2].replace(/[^0-9]/g,'');
}
var user1type = 16;
var user1name = "";
for(var k=0; k<user_list_arr.length; k++) {
if (user_list_arr[k].user_id == user_1) {
user1type = user_list_arr[k].mbti;
user1name = user_list_arr[k].username;
break;
}
}
//search user 2
var user_2 = "";
if (comp_mbti[3] === undefined) {
user_2 = msg.member.user.id;
} else if (comp_mbti[3] == "") {
comp_mbti[3] = comp_mbti[4]; //중간에 띄어쓰기가 한 번 더 들어간 경우에도 정상적인 처리를 위해서
user_2 = comp_mbti[3].replace(/[^0-9]/g,'');
} else {
user_2 = comp_mbti[3].replace(/[^0-9]/g,'');
}
var user2type = 16;
var user2name = "";
for(var k=0; k<user_list_arr.length; k++) {
if (user_list_arr[k].user_id == user_2) {
user2type = user_list_arr[k].mbti;
user2name = user_list_arr[k].username;
break;
}
}
//result
if (user1type == 16 || user2type == 16) {
msg.channel.send(noresultEmbed);
} else{
if (user2type > user1type) {
[user1type, user2type] = [user2type, user1type];
}
var result = mbtiR[user1type][user2type];
var explain_text1 = " 와(과) ";
var explain_text2 = " 의 궁합";
var resultEmbed = new Discord.MessageEmbed()
.setColor('#0099FF')
.setTitle(user1name.concat(explain_text1,user2name,explain_text2))
.addField('결과', result, true)
.setFooter('Powered by node.js Made by M4ndU', '');
msg.channel.send(resultEmbed);
}
}
|
cs |
실행
user_list.json 파일을 하나 만들어두고 봇을 실행해야한다.
실행 후에 오류나면 아래 글에서 해결법을 찾아보자. 아래 글에도 없다면 구글링!
https://mandu-mandu.tistory.com/381
'Project > Programming' 카테고리의 다른 글
[Node.js] 야찌/야추/요트 게임 디스코드 봇 (1) | 2020.08.13 |
---|---|
Node.js로 디스코드 봇 만들기(2) - 노래/사진/상태/삭제 (17) | 2020.04.21 |
Node.js로 디스코드 봇 만들기(1) - 봇 생성부터 테스트까지 (2) | 2020.04.21 |
[batch] 배치파일로 악성코드 만들기 (0) | 2020.01.19 |
[PHP] 네이버 카페 글 파싱하기 (0) | 2019.12.27 |