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 서버에 생명을 불어넣는 것입니다!



살아있을 시간이야!

좋은 웹페이지 즐겨찾기