개발자에게 커피 사주기푝무위키 운영과 개발을 도와주세요
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

깐냥(r5 Blame)

r5
r5
1||<-2><tablealign=right><tablewidth=375><tablebordercolor=#FEE0D6,#FEE0D6><bgcolor=#FEE0D6,#FEE0D6><tablebgcolor=#ffffff,#2d2f34><tablecolor=#309FD8,#dddddd> {{{#!wiki style="border-bottom:5px solid #FEE0D6; margin:-5px -10px; padding:3px 5px;"
2{{{#000000 '''{{{+1 깐냥}}}'''}}}
3}}} ||
r1

(새 문서)
4||<-2><nopad> [[파일:kkan.png|width=100%]] ||
r5
5||<width=30%><colbgcolor=#FEE0D6,#FEE0D6><colcolor=#000000,#000000> '''제작''' || [[칸나]] ||
6|| '''종류''' || [[Discord]] 다기능 봇 ||
7|| '''접두사''' || `%[명령어]`[br]`/[명령어]` ||
8|| '''사용 모델''' || Gemini 3.1 Flash ||
9|| '''개발 언어''' || JavaScript[br]Python ||
10|| '''주요 기능''' || [[TETR.IO]], 체스, AI 대화, 웹 검색, V-ARCHIVE, 스타포스 ||
11|| '''푝섭 최초 가입일''' || 2026년 5월 22일 ||
12|| '''소스 코드''' || [[https://github.com/yddfhbh/kannyan|GitHub]] ||
r1

(새 문서)
13
14[목차]
15[clearfix]
16
17== 개요 ==
r5
18[[칸나]]가 제작하고 운영하는 [[Discord]] 다기능 봇.
19
20본래 [[TETR.IO]] 유저의 프로필과 전적을 조회하는 봇으로 제작되었으나, 개발 과정에서 체스 분석, 체스 퍼즐, AI 대화, 웹 검색, 리듬게임 정보 조회, 스타포스 시뮬레이터 등의 기능이 계속 추가되었다.
21
22현재는 특정 분야에 한정된 봇이라기보다 게임 정보 조회, 이미지 분석, AI 대화와 서버 편의 기능을 함께 제공하는 종합 봇에 가깝다. 특히 단순한 텍스트 출력보다 전용 이미지 카드를 적극적으로 사용하는 것이 특징이다.
23
24대부분의 기능은 Discord의 슬래시 명령어와 `%` 접두사 명령어를 함께 지원한다. 일부 명령어는 사용자의 Discord 계정과 외부 서비스 계정을 연결하여, 닉네임을 직접 입력하지 않아도 사용할 수 있다.
25
26== 개발 배경 ==
27깐냥은 처음부터 다기능 봇으로 계획된 것은 아니었다.
28
29초기 목적은 Discord에서 [[TETR.IO]] 유저의 프로필과 TETRA LEAGUE 전적을 빠르게 조회하는 것이었다. 기존의 전적 조회 사이트를 직접 열지 않고도 Discord 채널에서 결과를 확인할 수 있도록 프로필과 스탯을 이미지 카드 형태로 출력하는 기능이 먼저 만들어졌다.
30
31이후 유저 간 스탯 비교, 플레이스타일 그래프, QUICK PLAY와 40 LINES 등의 개인 기록 조회가 추가되었다. TETR.IO 외의 기능으로는 체스 레이팅 조회와 포지션 분석이 처음 추가되었으며, 이후 AI 대화, 웹 검색, V-ARCHIVE, 스타포스 시뮬레이터 등으로 기능 범위가 확대되었다.
32
33기능이 추가될 때마다 별도의 봇을 새로 만드는 대신 기존 깐냥에 기능을 통합하는 방식으로 개발되었기 때문에, 현재는 서로 성격이 다른 기능들이 하나의 봇에 함께 들어가 있다.
r4
34
35== 기능 ==
36=== TETR.IO ===
r5
37깐냥의 최초 기능이자 현재도 가장 비중이 큰 기능이다.
38
39TETR.IO API와 외부 통계 자료를 이용하여 유저의 프로필, 리그 스탯, 개인 기록과 최근 경기 결과를 조회한다. 조회 결과 대부분은 깐냥 전용 디자인이 적용된 PNG 이미지로 출력된다.
40
41==== 프로필 카드 ====
42TETR.IO 유저의 닉네임, 아바타, 배너, 국가, 레벨, 리그 등급과 주요 기록을 하나의 이미지로 출력한다.
43
44프로필에 공개된 정보가 있는 경우 계정 생성일, 플레이 시간, 승리 횟수와 각종 개인 최고 기록도 함께 표시될 수 있다. 업적이 공개된 유저는 주요 업적과 달성 상태가 카드에 포함되기도 한다.
45
46닉네임을 직접 입력할 수 있으며, TETR.IO 프로필에 Discord 계정이 연결되어 있다면 닉네임을 생략해도 본인의 계정을 자동으로 찾는다.
47
48==== 스탯 카드 ====
49TETRA LEAGUE에서 사용하는 주요 스탯을 이미지 카드로 출력한다.
50
51대표적으로 다음 수치를 표시한다.
52
53 * APM
54 * PPS
55 * VS
56 * APP
57 * DS/Second
58 * DS/Piece
59 * APP+DS/Piece
60 * VS/APM
61 * Cheese Index
62 * Garbage Efficiency
63
64APM, PPS, VS를 직접 입력하여 실제 TETR.IO 계정이 아닌 가상의 스탯 카드도 만들 수 있다.
65
66==== 플레이스타일 분석 ====
67유저의 APM, PPS와 VS를 바탕으로 플레이스타일을 그래프로 나타낸다.
68
69그래프는 다음 네 가지 성향을 기준으로 구성된다.
70
71 * '''Opener''' — 초반 빌드와 공격 전개 성향
72 * '''Plonk''' — 단발성 고화력 공격 성향
73 * '''Stride''' — 속도와 지속적인 화력 성향
74 * '''Inf DS''' — 다운스택과 생존 중심 성향
75
76여러 유저의 닉네임을 한 번에 입력하면 같은 그래프 위에 결과를 겹쳐 표시할 수 있다. APM, PPS와 VS를 직접 입력한 가상 스탯도 함께 비교할 수 있다.
77
78==== 유저 비교 ====
79두 명 이상의 유저를 입력하면 주요 스탯을 한 그래프에서 비교한다.
80
81앞의 두 유저에 대해서는 점수와 스탯을 이용한 예상 승률도 함께 표시한다. 존재하지 않는 닉네임이 입력된 경우 전체 명령을 실패시키지 않고 해당 닉네임만 제외하여 처리한다.
82
83==== 리그 및 개인 기록 ====
84TETRA LEAGUE의 최근 경기와 각 게임 모드의 개인 기록을 조회할 수 있다.
85
86지원하는 주요 기록은 다음과 같다.
87
88 * TETRA LEAGUE 최근 경기
89 * QUICK PLAY
90 * EXPERT QUICK PLAY
91 * 40 LINES
92 * BLITZ
93 * TETRA LEAGUE 랭크컷
94
95QUICK PLAY와 EXPERT QUICK PLAY는 도달 고도, 40 LINES는 완료 시간, BLITZ는 획득 점수를 중심으로 카드가 구성된다.
96
97`top`을 선택하면 최고 기록을, `recent`를 선택하면 최근 기록을 조회한다.
98
99==== 리플레이 분석 ====
100TETR.IO에서 저장한 `.ttrm` 리플레이 파일을 Discord 메시지에 첨부하면 해당 게임을 분석한다.
101
102리플레이 안의 공격량, 속도, 다운스택과 게임 진행에 따른 수치 변화를 읽어 MinoMuncher 형태의 그래프로 출력한다. 일반적인 프로필 조회와 달리 사용자가 직접 파일을 첨부해야 한다.
103
104==== 계정 자동 인식 ====
105TETR.IO 프로필에 Discord 계정이 연결되어 있는 유저는 일부 명령어에서 닉네임을 생략할 수 있다.
106
107명령어 작성자의 계정뿐 아니라 다음 대상도 자동으로 조회할 수 있다.
108
109 * Discord에서 멘션한 유저
110 * 답장한 메시지의 작성자
111 * 명령어에 직접 입력한 TETR.IO 닉네임
112
113단, 해당 유저가 TETR.IO 프로필에 Discord 계정을 연결하지 않았다면 자동 인식이 작동하지 않는다.
114
115==== 대표 명령어 ====
116||<tablewidth=100%><tablebordercolor=#FEE0D6,#555555><bgcolor=#FEE0D6,#2d2f34> '''{{{#000000,#dddddd 명령어}}}''' ||<bgcolor=#FEE0D6,#2d2f34> '''{{{#000000,#dddddd 설명}}}''' ||
r4
117|| `/테토` · `%teto` || TETR.IO 프로필 카드를 출력한다. ||
r5
118|| `/스탯` · `%ts` || TETRA LEAGUE 스탯 카드를 출력한다. ||
r4
119|| `/그래프` · `%psq` || 플레이스타일 그래프를 출력한다. ||
r5
120|| `/비교` · `%vs` || 여러 유저의 주요 스탯과 예상 승률을 비교한다. ||
121|| `/랭크컷` · `%tetr` || 현재 TETRA LEAGUE 랭크컷을 출력한다. ||
122|| `/전적` · `%tetra` || 최근 TETRA LEAGUE 경기 결과를 조회한다. ||
r4
123|| `/퀵플` · `%qp` || QUICK PLAY 기록을 조회한다. ||
r5
124|| `/익스퀵플` · `%exqp` || EXPERT QUICK PLAY 기록을 조회한다. ||
r4
125|| `/40라인` · `%40L` || 40 LINES 기록을 조회한다. ||
126|| `/블리츠` · `%blitz` || BLITZ 기록을 조회한다. ||
r5
127|| `/분석` · `%munch` || 첨부한 `.ttrm` 리플레이 파일을 분석한다. ||
r4
128
129=== 체스 ===
r5
130체스 계정의 레이팅 조회, 포지션 분석, 퍼즐과 봇 대국 등의 기능을 제공한다.
131
132==== 레이팅 조회 ====
133Chess.com과 Lichess 유저의 레이팅을 조회할 수 있다.
134
135Chess.com은 래피드, 블리츠, 불렛과 퍼즐 레이팅을 표시하며, Lichess는 래피드, 블리츠와 불렛 등의 레이팅을 표시한다.
136
137닉네임뿐 아니라 해당 사이트의 프로필 주소를 입력해도 유저를 인식할 수 있다.
138
139==== 유저 비교 및 승률 예측 ====
140두 유저의 레이팅을 비교하고 Elo 공식에 따른 예상 승률을 계산한다.
141
142실제 계정 닉네임을 입력하는 방식과 임의의 두 점수를 직접 입력하는 방식을 모두 지원한다. 계산 결과는 실제 경기 결과를 보장하는 예측이 아니라 레이팅 차이를 수학적으로 변환한 값이다.
143
144==== 체스판 이미지 분석 ====
145체스판이 포함된 이미지를 첨부하면 이미지에서 말의 위치를 인식하여 FEN으로 변환한다.
146
147이후 Stockfish를 이용해 현재 포지션을 분석하고 가장 좋은 수와 간단한 설명을 출력한다. 백과 흑 중 어느 차례인지 명령어 또는 문장으로 지정할 수 있다.
148
149다음과 같은 형태의 입력을 사용할 수 있다.
150
151{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
152체스판 이미지 첨부
153%백선
154}}}
155
156또는 다음과 같이 자연스러운 표현을 사용할 수 있다.
157
158{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
159%여기서 백은 뭘 둬야 돼?
160}}}
161
162이미지 인식에 실패한 경우에는 `%fen` 명령어로 FEN을 직접 입력할 수 있다.
163
164==== 분석 방식 ====
165체스판 이미지 인식에는 Python 기반 이미지 분석 도구가 사용되며, 인식된 포지션은 구조 검사를 거친 뒤 Stockfish로 전달된다.
166
167분석 결과는 단순히 엔진의 평가값만 출력하지 않고, 현재 차례인 색과 추천 수를 포함한 자연스러운 문장으로 정리된다.
168
169필요한 경우 여러 후보 수를 비교하지만, 일반 사용자에게는 분석 과정 전체보다 실제로 둘 만한 수를 중심으로 설명한다.
170
171==== 체스 퍼즐 ====
172매일 새로운 체스 퍼즐을 DM으로 풀 수 있는 일일 퍼즐 기능을 제공한다.
173
174사용자는 수를 직접 입력하여 퍼즐을 진행하며, 틀린 수를 두거나 포기한 경우 결과가 기록된다. 같은 날의 퍼즐은 서버 설정과 진행 상태에 따라 다시 도전할 수 없을 수도 있다.
175
176퍼즐 러시에서는 제한된 목숨 안에 여러 퍼즐을 연속으로 해결한다. 퍼즐 결과를 바탕으로 개인 레이팅과 순위표를 관리하는 기능도 제공한다.
177
178==== 봇과 대국 ====
179Discord 채팅에서 깐냥과 직접 체스를 둘 수 있다.
180
181사용자가 백과 흑 중 원하는 색을 선택하면 봇이 상대편을 맡는다. 착수는 SAN 표기를 중심으로 처리하지만, 일부 일반적인 입력 차이도 허용한다.
182
183봇은 항상 Stockfish의 1순위 수만 두는 것이 아니라 여러 후보 수 중 하나를 선택하도록 조정되어 있다. 따라서 일반적인 엔진 대국보다 수가 다소 다양하게 나타날 수 있다.
184
185==== 대표 명령어 ====
186||<tablewidth=100%><tablebordercolor=#FEE0D6,#555555><bgcolor=#FEE0D6,#2d2f34> '''{{{#000000,#dddddd 명령어}}}''' ||<bgcolor=#FEE0D6,#2d2f34> '''{{{#000000,#dddddd 설명}}}''' ||
187|| `/체닷` · `%체닷` || Chess.com 유저의 레이팅을 조회한다. ||
188|| `/리체스` · `%리체스` || Lichess 유저의 레이팅을 조회한다. ||
189|| `/체스비교` || 두 체스 유저의 레이팅과 예상 승률을 비교한다. ||
190|| `/승률예측` || 직접 입력한 두 점수로 Elo 기반 승률을 계산한다. ||
r4
191|| `%fen` || 입력한 FEN을 Stockfish로 분석한다. ||
r5
192|| `/일일퍼즐` · `%일일퍼즐` || 오늘의 체스 퍼즐을 DM으로 시작한다. ||
193|| `/라이브레이팅` || 2700chess의 실시간 상위 레이팅을 출력한다. ||
194
195=== AI 대화 ===
196등록된 `%` 명령어가 아닌 문장을 입력하면 AI 대화 기능으로 처리된다.
197
198예를 들어 다음과 같이 사용할 수 있다.
r4
199
200{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
201%오늘 할 일 정리해줘
202}}}
203
r5
204명령어와 일반 대화를 구분하기 위한 별도의 `/AI` 명령어를 매번 입력할 필요 없이, `%` 뒤에 질문을 작성하면 된다.
205
206==== 대화 맥락 ====
207AI는 현재 메시지만 확인하는 것이 아니라 상황에 따라 다음 내용도 함께 참고한다.
208
209 * 현재 채널에서 이어진 이전 대화
210 * 사용자가 답장한 메시지
211 * 메시지에서 멘션한 유저와 관련된 내용
212 * 함께 첨부된 이미지
213 * 서버에 저장된 영구 기억
214 * 최신 정보가 필요한 경우의 웹 검색 결과
215
216이를 통해 단순한 일회성 질문뿐 아니라 앞선 대화를 이어가는 형태의 질문도 처리할 수 있다.
217
218단, 기억되는 대화의 범위와 보관 기간에는 제한이 있으며 오래된 대화는 자동으로 삭제될 수 있다.
219
220==== 이미지 분석 ====
221질문과 함께 이미지를 첨부하면 이미지의 내용을 AI가 분석할 수 있다.
222
223이미지만 첨부하고 `%`를 보내거나, 이미지가 포함된 다른 메시지에 답장하면서 `%`를 보내는 방식도 지원한다.
224
225지원하는 주요 형식은 다음과 같다.
226
227 * JPEG
228 * PNG
229 * WebP
230 * HEIC
231 * HEIF
232
233한 번에 지나치게 많은 이미지나 용량이 큰 이미지는 처리되지 않을 수 있다.
234
235==== 웹 검색 ====
236최신 정보가 필요한 질문은 웹 검색 결과를 참고하여 답변한다.
237
238다음처럼 검색을 직접 요청할 수도 있다.
239
240{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
241%검색 오늘 주요 뉴스
242}}}
243
244또한 사용자가 명시적으로 검색을 요청하지 않아도 날씨, 최근 발표, 현재 가격처럼 최신 정보가 필요한 질문이라고 판단되면 자동으로 검색할 수 있다.
245
246검색 결과를 가져오지 못하거나 AI 모델 호출에 실패한 경우에는 답변이 제한되거나 검색 결과 목록만 표시될 수 있다.
247
248==== 기억 기능 ====
249채널에서 진행된 일반 대화는 일정 기간 임시 기억으로 보관된다.
250
251이와 별도로 `/가르치기` 명령어나 `기억해줘`라는 표현을 사용하면 특정 정보를 서버별 영구 기억에 저장할 수 있다.
252
253예시는 다음과 같다.
254
255{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
256%파이호크의 주 종목은 테트리스라고 기억해줘
257}}}
258
259영구 기억에는 정보를 알려준 사용자가 함께 기록된다. 이후 AI가 해당 정보를 답변에 사용하면 누가 알려준 내용인지 출처가 표시될 수 있다.
260
261영구 기억은 일반 대화 기록과 달리 자동으로 만료되지 않으므로, 잘못된 내용을 저장하지 않도록 주의할 필요가 있다.
262
263==== 사용 모델 ====
264운영 환경에서는 Gemini 계열 모델을 사용한다.
265
266기본 모델의 요청이 실패하거나 사용량 제한에 도달한 경우 다른 모델을 순서대로 시도하는 예비 처리 구조가 적용되어 있다. 이미지가 첨부된 질문은 일반 텍스트 질문과 다른 이미지 처리용 모델을 사용할 수 있다.
267
268AI가 생성한 답변은 사실과 다를 수 있으므로 중요한 정보는 별도로 확인하는 것이 권장된다.
r4
269
270=== V-ARCHIVE ===
271[[DJMAX RESPECT V]] 기록 사이트인 V-ARCHIVE와 연동되는 기능이다.
272
r5
273사용자는 자신의 V-ARCHIVE 닉네임을 Discord 계정에 저장한 뒤, 이후 명령어에서 닉네임을 생략하고 기록을 조회할 수 있다.
274
275==== 티어 카드 ====
276사용자의 상위 성과를 기준으로 B10, B30과 B50 카드를 출력한다.
277
278각 카드에는 곡명, 버튼 모드, 난이도, 점수와 정확도 등의 기록이 포함될 수 있다. 결과는 V-ARCHIVE의 데이터와 깐냥의 전용 카드 디자인을 조합하여 이미지로 출력된다.
279
280==== 곡 정보 ====
281곡 제목을 입력하면 해당 곡의 4B, 5B, 6B와 8B 난이도를 조회한다.
282
283대소문자와 일부 특수문자 차이를 보정하여 검색하며, 정확한 제목을 입력하지 않아도 유사한 곡을 찾을 수 있도록 검색 편의 기능이 적용되어 있다.
284
285일부 곡은 한국어 별칭이나 서버 내부에서 사용하는 이름으로도 검색할 수 있다.
286
287==== 개인 성과 ====
288특정 곡을 입력하면 연결된 사용자의 해당 곡 기록을 조회한다.
289
290버튼 모드별 최고 점수와 정확도, 클리어 상태 등을 확인할 수 있다.
291
292==== 대표 명령어 ====
293||<tablewidth=100%><tablebordercolor=#FEE0D6,#555555><bgcolor=#FEE0D6,#2d2f34> '''{{{#000000,#dddddd 명령어}}}''' ||<bgcolor=#FEE0D6,#2d2f34> '''{{{#000000,#dddddd 설명}}}''' ||
294|| `/브아카` || V-ARCHIVE 닉네임을 연결하거나 변경한다. ||
295|| `/b10` || 상위 10곡을 기준으로 티어 카드를 출력한다. ||
296|| `/b30` || 상위 30곡을 기준으로 티어 카드를 출력한다. ||
297|| `/b50` || 상위 50곡을 기준으로 티어 카드를 출력한다. ||
298|| `/곡정보` · `/서열표` || 곡의 버튼별 난이도를 조회한다. ||
r4
299|| `/성과` || 특정 곡의 개인 기록을 조회한다. ||
300
r5
301=== 스타포스 시뮬레이터 ===
302[[메이플스토리]]의 스타포스 강화를 Discord에서 체험할 수 있도록 만든 시뮬레이터다.
303
304사용자가 장비 레벨, 시작 스타포스와 각종 강화 조건을 설정한 뒤 버튼을 눌러 직접 강화를 진행한다.
305
306지원하는 주요 요소는 다음과 같다.
307
308 * 스타포스 성공·실패·파괴 확률
309 * 강화 단계 상승과 하락
310 * 장비 파괴
311 * 파괴 방지
312 * 찬스 타임
313 * 스타캐치
314 * 강화 비용 계산
315 * 진행 상황 저장 및 불러오기
316 * 종료 시 사용 메소와 강화 횟수 집계
317 * 개인 기록과 순위표
318
319스타캐치를 활성화하면 강화 버튼이 별도의 미니게임 버튼으로 변경되며, 사용자는 랜덤하게 지정된 버튼을 선택하여 성공 여부를 결정한다.
320
321실제 메이플스토리의 모든 시기와 이벤트 확률을 완전히 재현하는 것은 아니며, 깐냥에 적용된 확률표와 설정을 기준으로 동작한다.
322
323=== 서버 관리 및 편의 기능 ===
324게임과 AI 외에도 Discord 서버 운영에 사용할 수 있는 기능이 포함되어 있다.
325
326==== 알람 ====
327내용과 시간을 입력하면 지정한 시간이 지난 뒤 명령어 작성자를 멘션한다.
328
329최대 설정 시간과 실제 알림 가능 여부는 봇의 재시작 및 저장 방식에 따라 제한될 수 있다.
330
331==== 개념글 ====
332특정 메시지에 지정된 이모지 반응이 일정 개수 이상 달리면 해당 메시지를 개념글 채널로 전송한다.
333
334서버별로 대상 채널, 이모지와 필요한 반응 개수를 설정할 수 있다. 전송된 메시지에는 작성자, 원문 내용, 날짜와 원본 메시지로 이동하는 링크가 포함된다.
335
336==== 블랙리스트 ====
337관리자는 특정 Discord 사용자의 깐냥 이용을 제한할 수 있다.
338
339블랙리스트에 등록된 사용자는 일반 명령어와 일부 상호작용을 사용할 수 없으며, 목록의 추가·제거와 확인은 지정된 관리자만 수행할 수 있다.
340
341==== 기타 ====
r4
342 * 2700chess 실시간 레이팅 조회
r5
343 * 서버별 AI 영구 기억
344 * 최신 정보 웹 검색
345 * 일정 시간 뒤 멘션 알람
346 * 각종 게임 기록 이미지 출력
347 * 봇 상태 확인용 헬스체크
r4
348
349== 사용법 ==
r5
350=== 슬래시 명령어 ===
351Discord 채팅 입력창에 `/`를 입력하면 사용 가능한 명령어와 선택지를 화면에서 확인할 수 있다.
352
353슬래시 명령어는 닉네임, 숫자와 모드 등의 선택지를 Discord 화면에서 직접 입력할 수 있으므로 처음 사용하는 기능에 적합하다.
354
355예시는 다음과 같다.
356
357{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
358/테토 닉네임:HEBI_
359}}}
360
361=== 접두사 명령어 ===
362메시지 앞에 `%`를 붙여 명령어를 실행할 수 있다.
363
364슬래시 명령어보다 빠르게 입력할 수 있고, 답장이나 멘션과 함께 사용하기 편리하다.
365
366{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
367%teto HEBI_
368}}}
369
370일부 명령어는 닉네임을 생략하고 다음과 같이 사용할 수 있다.
371
372{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
373%teto
374}}}
375
376이 경우 깐냥은 명령어 작성자의 Discord 계정에 연결된 TETR.IO 계정을 찾는다.
377
378=== 답장과 멘션 ===
379일부 명령어는 다른 사용자의 메시지에 답장하거나 사용자를 멘션하여 대상을 지정할 수 있다.
380
381예시는 다음과 같다.
382
383{{{#!wiki style="border-left:4px solid #FEE0D6; padding:8px 12px;"
384%teto @사용자
385}}}
386
387또는 조회하려는 사용자의 메시지에 답장하면서 `%teto`를 입력할 수 있다.
388
389외부 계정 연결이 없는 사용자는 멘션만으로 닉네임을 찾을 수 없다.
390
391=== 첨부 파일 ===
392체스판 이미지 분석, AI 이미지 분석과 TETR.IO 리플레이 분석은 메시지에 파일을 첨부해야 한다.
393
394지원하지 않는 확장자, 손상된 파일, 지나치게 큰 파일은 거부될 수 있다.
395
396=== 도움말 ===
397현재 사용 가능한 명령어 목록은 다음 중 하나를 입력하여 확인할 수 있다.
398
399 * `/도움말`
400 * `%도움말`
401 * `%help`
402
403기능 추가와 수정이 잦아 위키 문서의 명령어 목록이 실제 봇보다 늦게 갱신될 수 있으므로, 가장 정확한 목록은 봇의 도움말을 확인하는 것이 좋다.
404
405== 출력 방식 ==
406깐냥은 가능한 경우 조회 결과를 이미지 카드로 출력한다.
407
408텍스트 메시지만 사용하는 것보다 여러 수치와 정보를 한 화면에 배치하기 쉽고, Discord 모바일 환경에서도 결과를 확인하기 편리하기 때문이다.
409
410주요 이미지 카드에는 다음이 포함된다.
411
412 * TETR.IO 프로필 카드
413 * TETR.IO 스탯 카드
414 * 플레이스타일 그래프
415 * 유저 비교 그래프
416 * TETRA LEAGUE 최근 전적 카드
417 * QUICK PLAY 고도 카드
418 * 40 LINES 시간 카드
419 * BLITZ 점수 카드
420 * TETR.IO 업적 카드
421 * 2700chess 라이브레이팅 카드
422 * V-ARCHIVE 티어 및 성과 카드
423 * 체스 퍼즐판과 순위표
424
425이미지 렌더링 과정에서 외부 이미지를 불러오지 못하거나 한글 글꼴이 정상적으로 설치되지 않은 경우 일부 카드의 이미지나 문자가 다르게 표시될 수 있다.
426
427== 기술적 구성 ==
428깐냥은 Node.js와 `discord.js`를 기반으로 개발되었다.
429
430주요 구성은 다음과 같다.
431
432 * '''discord.js''' — Discord Gateway 연결, 메시지와 슬래시 명령어 처리
433 * '''sharp''' — TETR.IO와 각종 기록 이미지 렌더링
434 * '''Stockfish WASM''' — 체스 포지션 분석
435 * '''Python 및 chessimg2pos''' — 체스판 이미지에서 말의 위치 인식
436 * '''Gemini 계열 API''' — AI 대화와 이미지 분석
437 * '''웹 검색 모듈''' — 최신 정보 검색과 결과 정리
438 * '''JSON 데이터 파일''' — 사용자 설정, AI 기억과 일부 게임 데이터 저장
439 * '''PM2''' — 운영 서버에서 프로세스 실행과 재시작 관리
440
441운영 환경에서는 Ubuntu 기반 가상 머신에서 실행된다. 봇 프로세스와 데이터 디렉터리를 분리하여 코드가 새 버전으로 교체되더라도 사용자 설정과 기록이 유지되도록 구성되어 있다.
442
443슬래시 명령어를 추가하거나 선택지를 변경한 경우에는 봇을 재시작하는 것과 별개로 Discord API에 명령어를 다시 등록해야 한다.
444
445== 외부 서비스 ==
446깐냥의 일부 기능은 외부 서비스와 API에 의존한다.
447
448대표적으로 다음 서비스가 사용된다.
449
450 * Discord
451 * TETR.IO
452 * Chess.com
453 * Lichess
454 * 2700chess
455 * V-ARCHIVE
456 * Google Gemini
457 * 웹 검색 서비스
458
459외부 사이트가 점검 중이거나 API 형식을 변경하면 관련 기능이 일시적으로 작동하지 않을 수 있다. 깐냥 자체가 정상적으로 온라인이어도 특정 기능만 실패할 수 있다.
460
461== 운영 및 제한 사항 ==
462=== 이용 제한 ===
463명령어 남용이나 외부 API의 사용량 초과를 방지하기 위해 일부 기능에는 재사용 대기 시간과 요청 제한이 적용될 수 있다.
464
465AI 대화와 이미지 분석은 외부 모델의 사용량 제한에 영향을 받는다. 기본 모델 호출이 실패하면 예비 모델을 시도하지만, 모든 모델의 요청이 실패하면 답변을 생성하지 못한다.
466
467=== 개인정보와 기억 ===
468깐냥은 기능 제공을 위해 Discord 사용자 ID, 외부 서비스 닉네임, 서버별 설정과 AI 기억을 저장할 수 있다.
469
470영구 기억 기능에 입력한 내용은 자동으로 삭제되지 않을 수 있으므로 비밀번호, 주소, 전화번호와 같은 민감한 개인정보를 저장해서는 안 된다.
471
472=== 분석 결과의 한계 ===
473체스판 이미지 인식은 이미지 품질과 판 디자인에 따라 잘못된 FEN을 만들 수 있다.
474
475AI 답변과 웹 검색 결과도 항상 정확한 것은 아니며, 최신 정보나 중요한 판단이 필요한 내용은 원문을 별도로 확인해야 한다.
476
477TETR.IO와 V-ARCHIVE의 기록은 외부 서비스에서 제공하는 값을 바탕으로 하므로, 해당 서비스의 데이터 갱신이 늦으면 깐냥의 결과도 이전 상태로 표시될 수 있다.
478
479=== 기능 변경 ===
480깐냥은 기능 추가와 수정이 자주 이루어진다.
481
482명령어 이름, 출력 형식, 지원 모드와 계산 방식이 변경될 수 있으며, 오래된 이미지나 설명과 현재 출력 결과가 다를 수 있다.
r4
483
484== 특징 ==
r5
485=== 다양한 기능의 통합 ===
486일반적으로 TETR.IO, 체스, AI와 리듬게임 봇은 각각 별도로 운영되는 경우가 많지만, 깐냥은 이 기능들을 하나의 Discord 봇에 통합하였다.
487
488따라서 사용자는 여러 봇을 각각 초대하지 않고도 한 봇으로 다양한 기능을 사용할 수 있다.
489
490=== 이미지 카드 중심 ===
491단순한 텍스트 목록보다 이미지 카드와 그래프를 적극적으로 사용한다.
492
493특히 TETR.IO와 V-ARCHIVE 관련 기능은 원본 서비스의 디자인을 일부 참고하면서도 깐냥만의 배치와 스타일을 사용한다.
494
495=== 짧은 명령어 ===
496자주 사용하는 기능은 `%teto`, `%ts`, `%qp`처럼 짧은 접두사 명령어를 제공한다.
497
498슬래시 명령어도 함께 지원하므로 사용자는 입력 속도와 편의성에 따라 원하는 방식을 선택할 수 있다.
499
500=== 지속적인 기능 추가 ===
501처음에는 TETR.IO 전용에 가까웠지만, 제작자가 필요하다고 생각한 기능이 계속 통합되면서 현재의 형태가 되었다.
502
503기능 범위가 넓다는 장점이 있지만, 코드와 데이터의 규모가 커지고 각 기능을 관리하기 복잡해졌다는 단점도 있다.
504
505== 역사 ==
506=== 2026년 ===
507 * '''5월 22일''' — 파이호크섭에 최초로 참가하였다.
508 * TETR.IO 프로필 및 스탯 카드 기능을 중심으로 운영되기 시작하였다.
509 * TETRA LEAGUE 전적과 QUICK PLAY, 40 LINES, BLITZ 기록 조회가 추가되었다.
510 * 체스 레이팅 조회와 체스판 이미지 분석 기능이 추가되었다.
511 * AI 대화, 이미지 분석과 웹 검색 기능이 추가되었다.
512 * 서버별 임시 기억과 영구 기억 기능이 도입되었다.
513 * V-ARCHIVE 기록 조회와 스타포스 시뮬레이터가 추가되었다.
514 * 체스 퍼즐, 퍼즐 러시와 봇 대국 기능이 확장되었다.
515 * TETR.IO 업적 카드와 각종 이미지 카드의 디자인 개선이 진행되었다.
r4
516
517== 여담 ==
r5
518 * 이름과 외형은 고양이를 모티브로 한다.
519 * 이름은 고양이 울음소리를 변형한 표현에서 유래하였다.
520 * 고양이 캐릭터를 사용하지만 모든 문장에 반드시 `냥`을 붙이지는 않는다.
521 * 초기에는 TETR.IO 관련 기능만 지원했기 때문에 저장소의 설명에도 TETR.IO와 체스 봇이라는 흔적이 남아 있다.
522 * 새로운 기능을 별도 봇으로 분리하기보다 깐냥에 통합하는 경우가 많아 기능 수가 지속적으로 증가하고 있다.
523 * 기능이 많아지면서 제작자도 전체 명령어를 한 번에 기억하지 못하는 경우가 있다.
524 * 특정 기능을 수정하다가 관련 없는 이미지 카드의 디자인까지 함께 수정되는 일이 종종 있다.
525 * 로컬 테스트 화면과 실제 운영 봇의 렌더링 결과가 다르게 나타난 적이 있다.
526 * 봇의 기능보다 이미지 카드의 간격이나 글자 위치를 수정하는 데 더 많은 시간이 사용되기도 한다.
527
528== 관련 문서 ==
529 * [[칸나]]
530 * [[파이호크섭]]
531 * [[푝무위키]]
532 * [[TETR.IO]]
533 * [[Discord]]
534 * [[DJMAX RESPECT V]]
r4
535
536[[분류:디스코드 봇]]
537[[분류:파이호크섭]]