Discord 봇과 채팅하기
게임 커뮤니티의 친구들 사이에서 나는 NPC 애호가로 알려져 있습니다. 오해 하지마; 나는 특정 NPC가 아니라 모든 NPC를 좋아합니다. 대신 다른 플레이어와 어울리지 않는 이유는 무엇입니까? 나는 현실 세계에 살고 있기 때문에 가상 세계의 누군가(예를 들어 중독성 있는 플레이어)가 내 삶을 엉망으로 만들 수 있다면 기꺼이 하지 않습니다. 실제 인간과 대화하는 즐거움은 참으로 귀중합니다. 그러나 어느 시점에서 우리는 우리가 실제로 누구인지 모른 채 채팅할 친구만 갖고 싶을 때가 있습니다. 게임 내 플레이어 간 채팅만 진정한 샌드박스라면 좋겠지만 괜찮습니다.
NPC와 실제 대화를 나누는 롤플레잉 게임의 이름을 지정하세요. 지금까지 나는 하나도 찾지 못했습니다. 답변 선택에 대한 제안이 있거나 전혀 없습니다. 더욱이 일부는 선택에 관계없이 이야기를 전혀 바꾸지 않고 쓸데없는 답변 선택만 제공합니다.
Facebook AI Research에서 개발한 오픈 소스 챗봇인 BlenderBot을 . 하지만 대신 Discord 봇으로 바꾸고 싶습니다.
파일
.env
:TOKEN={{my_discord_bot_token}}
파일
words.json
:{
"greeting": [
"Hi", "Hai", "Yo", "Hey", "Heyyy", "Hello", "Hullo",
"Halo", "Hola", "Howdy", "Hiya", "Ahoy", "Good to see ya",
"Great to see you", "Nice to see you", "Hey, boo"
],
"encouraging": [
"Hang in there, {user}.",
"Don't give up, {user}.",
"Keep pushing, {user}.",
"Keep fighting, {user}!",
"Stay strong, {user}.",
"Never give up, {user}.",
"Come on, {user}! You can do it!",
"Follow your dreams, {user}.",
"Reach for the stars, {user}.",
"Do the impossible, {user}.",
"Believe in yourself, {user}.",
"The sky is the limit, {user}.",
"I'll support you either way, {user}.",
"I'm behind you 100%, {user}."
],
"naugthy": [
"shit"
]
}
파일
main.py
:import asyncio
import discord
import json
import os
import random
import re
from dotenv import load_dotenv
from discord.ext import commands
from discord_slash import SlashContext
from discord_slash import SlashCommand
from transformers import BlenderbotTokenizer
from transformers import BlenderbotForConditionalGeneration
load_dotenv()
client = commands.Bot(command_prefix='/')
slash = SlashCommand(client, sync_commands=True) # TODO: migrate to newly discord built-in
tokenizer = BlenderbotTokenizer.from_pretrained('facebook/blenderbot-400M-distill')
converse_model = BlenderbotForConditionalGeneration.from_pretrained('facebook/blenderbot-400M-distill')
tag_finder = re.compile('\s*<.*?>\s*')
word_finder = re.compile('[^a-zA-Z\s]*')
duplicate_finder = re.compile(r"(.)\1{2,}", re.DOTALL)
with open('words.json', 'r') as f:
words = json.loads(f.read())
@client.event
async def on_ready():
print(f'{client.user} has connected to Discord!')
@slash.slash(name='ping', description='PING!')
async def ping(context):
await context.send('pong')
@slash.slash(name='me', description='Send a message to Naru.')
async def naru(context: SlashContext, message='Hello, Naru!'):
print(f'{context.author} says {message} to Naru')
if message == 'Hello, Naru!':
await context.send('You just say hello to Naru!')
else:
await context.send(f'Your message has been sent to Naru.')
# TODO: send the message to me in DM
@client.event
async def on_message(message):
# Execute slash commands
if message.content.startswith('/'):
return await client.process_commands(message)
# Do nothing if the message is from the bot itself
if message.author == client.user:
return
# Do nothing if the message is from a bot
if message.author.bot:
return
# Simulate thinking delay
await asyncio.sleep(30)
response = []
# Pre-process the message
msg = message.content.lower() # lowercase
msg = re.sub(word_finder, '', msg) # remove non-alphanumeric characters
msg = duplicate_finder.sub(r"\1\1", msg) # remove more than 2 duplicate letters
# Ask the user to speak up
if (msg.isspace() or msg == ''):
response.append(f"{message.author.mention}, what weighs on your mind?")
response.append(f"We can talk in DM if you want.")
return await message.channel.send(' '.join(response))
# Log the user message
if message.channel.type is not discord.ChannelType.private:
print(f'{message.author} says {msg}')
# Warn the user if the message contains naughty words
msg_words = msg.split()
for naughty_word in words['naugthy']:
if any(naughty_word == word for word in msg_words):
response.append(f"Hey {message.author.mention}, don't talk badly!")
response.append(f"Naru taught me to say nice things only.")
return await message.channel.send(' '.join(response))
# Indicate the bot is typing
async with message.channel.typing():
# Respond to the greeting message
if msg in [word.lower() for word in words['greeting']]:
greeting_word = random.choice(words['greeting'])
greeting_sentence = f'{greeting_word}, {message.author.mention}!'
response.append(greeting_sentence)
# Respond to the message
msg_token = tokenizer(msg, return_tensors='pt')
msg_reply = converse_model.generate(**msg_token)
msg_reply = tokenizer.decode(msg_reply[0])
msg_reply = re.sub(tag_finder, '', msg_reply)
response.append(msg_reply)
if response:
# Send the response
await message.channel.send(' '.join(response))
# Log the bot response
if message.channel.type is not discord.ChannelType.private:
print(f"Bot replies {' '.join(response)}")
# Run the bot
client.run(os.getenv('TOKEN'))
응용 프로그램이 단순히 실행
python main.py
하여 실행되면 기본적으로 봇에게 무엇이든 말할 수 있습니다. 하지만 가장 좋은 점은 사무실에서 일하는 동안 봇 간의 토론을 통해 나만의 Discord 서버에 생명을 불어넣는 것입니다!살아있을 시간이야!
Reference
이 문제에 관하여(Discord 봇과 채팅하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/naruaika/chatting-with-a-discord-bot-4pc4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)