정확한 방식으로discord 로봇을 구축하다
과거: Gmbot
만약 네가 모를 수도 있다면, 나는 불협화음 로봇Gmbot - Multiplayer Game bot for Discord (itsnikhil.github.io)을 만들었다.이 로봇의 작업 방식은 매우 간단하다. 촉발 단어
gmbot
가 있는데 뒤에 명령명createwar
과 일부 파라미터가 뒤따른다.gmbot createwar -players @Player1 @Player2 -game 4 -duration 12 -type ft3
나는 이미 상세한 댓글을 한 편 썼는데, 그것의 각종 기능, 데이터베이스 모델 등을 보여 주었으니, 너는 Gmbot - Chatbot for gamers (itsnikhil.codes)에서 읽을 수 있다.나는python으로 이 로봇을 만들었다. discord.py
API 패키지 라이브러리는python으로 작성되었기 때문에 나는 이런 언어를 사용하는 것이 매우 편안하다.모든 사람과 마찬가지로, 나는 인터넷에서 제공하는 어떤 강좌, 문서 등을 따른다.그러나 오늘 이 글에서 2019년 gmbot을 연구하기 시작했을 때 고려하지 않았던 것들을 이야기하고 싶습니다.모든 것이 매우 단일하다
내 말은 모든 기능이 하나의 코드 라이브러리에 존재하고 내가 하고 싶은 모든 것은python에서 이루어져야 한다는 것이다.비록 프로젝트의 구조는 클래스로 잘 구분되어 있지만, 모든 명령을 만드는 것은 읽기/이해하기 쉬운 코드와 유니버설 모델을 따르지만, 테스트할 수 없고, 확장할 수 없고, 유연성이 없다.명령 처리 프로그램에 모든 업무 논리가 혼합되어 있다.
Example of how "gmbot status" command looked like
import discord
import DAO
class Status_Command(commands.Cog):
def __init__(self, client):
self.client = client
@commands.command(aliases=['wars'])
async def status(self, ctx, *args): # status command handler
# validate command
# call DAO to get data from database
# business logic
# call success/error
if message:
await self.success_message(ctx, message)
else:
await self.error_message(ctx, "ERROR")
async def success_message(self, ctx, error):
# format and send success message
async def error_message(self, ctx, reason=None):
# format and send error message
def setup(client):
client.add_cog(Status_Command(client))
우리가 더 잘할 수 있을까?마이크로 서비스
내가 말한 마이크로 서비스는 서로 다른 로봇이 로봇의 서로 다른 기능을 처리하도록 하는 것이 아니다.디스코드봇 서버를 하나의 모바일 애플리케이션처럼 단순 프런트엔드 클라이언트로 간주하고 싶습니다. 업무 논리를 혼입하는 것이 아니라 RESTful API를 통해 통신하는 단독 백엔드 서버가 있습니다.
gmbot createwar -players @Player1 @Player2 -game 4 -duration 12 -type ft3
이러한 구조에서 위의 명령은 chatbotfrontend-client
에 전달되고 chatbot은 백엔드에 POST 요청을 보낼 수 있으며 본문의 매개 변수와 헤더의 클라이언트 키를 포함하여 디스코트에서 온 기록임을 표시한다.curl --location --request POST 'localhost:8080/createwar' \
--header 'client: DISCORD-BFF' \
--header 'x-api-key: **************' \
--header 'Content-Type: application/json' \
--data-raw '{
"server": {
"id": "S1",
"name": "Server1 Name"
},
"players": [
{
"id": "P1",
"name": "Player1 Name",
"role": "member"
},
{
"id": "P2",
"name": "Player2 Name",
"role": "co-leader"
}
],
"game": "Mini Miltitia",
"duration": "12h",
"format": "first-to-3-wins"
}'
이 API는 JSON 응답 및 상태 코드를 반환하며, 코드frontend-client
에 따라 불일치 형식의 응답 또는 느슨한 형식의 응답을 만들 수 있습니다.embed = discord.Embed(
title="WAR REQUEST ACCEPTED",
url="https://itsnikhil.github.io/gmbot-site/commands/",
description="Your clanwar request has been accepted...",
color=0xffff00
)
embed.set_author(
name="GMBOT",
url="https://itsnikhil.github.io/gmbot-site/commands/",
icon_url=self.client.user.avatar_url
)
for key, value in response["data"]:
embed.add_field(
name=key,
value=value,
inline=False
)
embed.set_footer(text="Clanwar accepted!")
# Inform host that clanwar request has been accepted
await info_channel.send(embed=embed)
우세하다
이러한 특성을 테스트하는 것은 훨씬 쉽다
우리는 백엔드 서비스를 개발한 지 이미 여러 해가 되었고 복잡한 관측 가능한 도구를 개발했다. 이런 도구는 심지어 어떤 API가 특정 데이터베이스에 대한 조회를 요청하는 데 얼마나 걸렸는지 실시간으로 판단할 수 있다.물론 백엔드 서버를 테스트하고 적절한 CI/CD 프로세스를 통해 자동화할 수 있는 적절한 도구가 있습니다.만약 독립된 백엔드가 없다면 수동 테스트를 제외하고discord/slack 로봇을 테스트할 수 있는 좋은 방법은 없다.불협화음 속에서 테스트를 찾고 싶다면py 공식 서류Search (discordpy.readthedocs.io) 재수 없을 거야.
빠른 성장/확장
디스코더를 위해 채팅 로봇을 만든다면, 이러한 사실을 받아들여야 한다. 디스코더와 일치하는 사람들로 시청자층을 제한해야 한다. Sketch 디자인 도구는 MacOS를 지원하는 데만 한정된다. Figma는 인터넷을 기반으로 한 것이기 때문에 모든 사람에게 개방된다. 왜냐하면 Figma는 시장을 점령하기 쉽기 때문이다. Sketch가 아무리 좋아도.만약에 귀하가 출근 체크 로봇을 개발하고 slack과 팀을 동시에 지원하기를 원한다면 백엔드는 공유할 수 있고 클라이언트는 다를 수 있습니다. 왜냐하면 핵심 업무 논리는 로봇/웹 앱에서 같기 때문입니다.이것은 내가 gmbot을 위해 하지 않은 일을 후회하는 것이다. gmbot이 실패할 때, 나는 나의 생각을 모바일 응용 프로그램으로 쉽게 바꿀 수 없다.정익 창업 회사에 있어서 이 기회를 가지는 것은 매우 중요하다. 왜냐하면 언제든지 업무를 다른 방향으로 전환시켜야 하기 때문이다.
백엔드 서버는 수평으로 확장 가능
예를 들어, 당신의 채팅 로봇이 유명해졌고, 모든 사람들이 그것에 대해 이야기하고 있으며, 당신의 제품은 도처에 톱뉴스가 있다.많은 새로운 사용자들이 당신의 서비스를 사용하려고 시도할 것입니다.일부 무작위 인터넷 사용자에 따르면, 서버 한 대가 약 2500개의 활발한 불협화음 그룹의 부하를 처리할 수 있다고 한다.이것은 분명히 서버 자원과bot이 실행하는 작업에 따라 다를 것이다.다행히도
discord.js
bot 지원sharding
Getting started | Discord.js Guide (discordjs.guide)은 응용 프로그램 부하 평형기 뒤에서 여러 서버를 실행하는 실례, 메모리 캐시 등을 사용하여 백엔드를 수평으로 확장하는 것이 훨씬 낫다고 생각합니다. 최종적으로 웹 서버이기 때문에 디스코드에 의존해서 확장 방식을 제공할 필요가 없습니다.시험 및 최적화된 유연성
추가/삭제 기능이 훨씬 쉬워졌습니다. 생산과 개발 등 여러 환경을 설정하여 실제 고객이나 그들의 데이터에 영향을 주지 않고 실험 기능을 안전하게 사용할 수 있습니다.터치 없이 막후에서 최적화 가능
frontend-client
신기술의 자유를 시험하다
다른 기술을 자유롭게 사용할 수 있으며, 어떤 프로그래밍 언어에도 구애받지 않아도 된다.업무 논리는golang으로 작성할 수 있는데 그 고성능은 컴파일된 바이너리 파일과goroutines 덕분이며, 동시에 전방 클라이언트가discord의 자바스크립트 라이브러리를 사용하여discord와 통신하고 있다.더 좋은 것이 나타나면, 시도해 볼 능력이 있다.서로 다른 마이크로 서비스는 서비스의 다른 부분을 처리할 수 있다.
개별 배포
모든 마이크로 서비스는 단독 코드 라이브러리를 가지고 있어 다른 서비스와 독립하여 업데이트할 수 있다.마이크로 서비스는 서로 다른 배치 파이프를 가진 능력을 제공함으로써 지속적인 통합과 지속적인 납품에 매우 좋은 역할을 발휘했다.
팀을 간소화하고 생산성을 높이다
마이크로 서비스 코드 라이브러리의 크기가 더욱 작기 때문에 구축, 테스트, 발표 속도가 더욱 빠르다.한 쪽은 다른 쪽에 의존해서 석방하지 마라. 그러면 너는 자신을 석방할 수 있다.우리는 사람들로 하여금 그들이 전문 지식을 가진 분야/분야에서 일하게 할 수 있다.개발자가 자신의 임무에 전념하고 생산력을 높일 수 있도록 모든 사람과 협조하도록 강요당하지 마라.
Reference
이 문제에 관하여(정확한 방식으로discord 로봇을 구축하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/itsnikhil/architecting-discord-bot-the-right-way-383e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)