mirror of https://github.com/sgoudham/Enso-Bot.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
5 years ago
|
"""
|
||
|
Cathy AI Discord Chat Bot
|
||
|
|
||
|
Written in Python 3 using AIML chat library.
|
||
|
"""
|
||
|
import discord
|
||
|
import os
|
||
|
import random
|
||
|
import pkg_resources
|
||
|
from discord.ext import commands
|
||
|
import asyncio
|
||
|
import aiml
|
||
|
|
||
|
|
||
|
STARTUP_FILE = "std-startup.xml"
|
||
|
BOT_PREFIX = ('?', '!')
|
||
|
|
||
|
|
||
|
class ChattyCathy:
|
||
|
"""
|
||
|
Class that contains all of the bot logic
|
||
|
"""
|
||
|
|
||
|
def __init__(self, channel_name, bot_token):
|
||
|
"""
|
||
|
Initialize the bot using the Discord token and channel name to chat in.
|
||
|
|
||
|
:param channel_name: Only chats in this channel. No hashtag included.
|
||
|
:param bot_token: Full secret bot token
|
||
|
"""
|
||
|
self.channel_name = channel_name
|
||
|
self.token = bot_token
|
||
|
|
||
|
# Load AIML kernel
|
||
|
self.aiml_kernel = aiml.Kernel()
|
||
|
initial_dir = os.getcwd()
|
||
|
os.chdir(pkg_resources.resource_filename(__name__, '')) # Change directories to load AIML files properly
|
||
|
startup_filename = pkg_resources.resource_filename(__name__, STARTUP_FILE)
|
||
|
self.aiml_kernel.learn(startup_filename)
|
||
|
self.aiml_kernel.respond("LOAD AIML B")
|
||
|
os.chdir(initial_dir)
|
||
|
|
||
|
# Set up Discord client
|
||
|
self.discord_client = commands.Bot(command_prefix=BOT_PREFIX)
|
||
|
self.setup()
|
||
|
|
||
|
def setup(self):
|
||
|
|
||
|
@self.discord_client.event
|
||
|
@asyncio.coroutine
|
||
|
def on_ready():
|
||
|
print("Bot Online!")
|
||
|
print("Name: {}".format(self.discord_client.user.name))
|
||
|
print("ID: {}".format(self.discord_client.user.id))
|
||
|
yield from self.discord_client.change_presence(game=discord.Game(name='Chatting with Humans'))
|
||
|
|
||
|
@self.discord_client.event
|
||
|
@asyncio.coroutine
|
||
|
def on_message(message):
|
||
|
if message.author.bot or str(message.channel) != self.channel_name:
|
||
|
return
|
||
|
|
||
|
if message.content is None:
|
||
|
print("Empty message received.")
|
||
|
return
|
||
|
|
||
|
print("Message: " + str(message.content))
|
||
|
|
||
|
if message.content.startswith(BOT_PREFIX):
|
||
|
# Pass on to rest of the client commands
|
||
|
yield from self.discord_client.process_commands(message)
|
||
|
else:
|
||
|
aiml_response = self.aiml_kernel.respond(message.content)
|
||
|
yield from self.discord_client.send_typing(message.channel)
|
||
|
yield from asyncio.sleep(random.randint(1,3))
|
||
|
yield from self.discord_client.send_message(message.channel, aiml_response)
|
||
|
|
||
|
def run(self):
|
||
|
self.discord_client.run(self.token)
|